/* =========================================================================
   Plataforma Digital — Programa PESA · PAE
   styles.css — sistema visual portado del prototipo (dirección burdeos editorial).
   Mobile-first. Colores verificados WCAG 2.1 AA. Foco visible. Reduce-motion. Print.
   ========================================================================= */

/* ---------- Tokens ---------- */
:root {
  /* Paleta burdeos (tema "Burdeos clásico" del prototipo) */
  --accent: #6e2536;
  --accent-deep: #48141f;
  --accent-soft: #f7eef0;
  --berry-panel: #5d1f2e;  /* berry profundo intermedio (ya en uso como hover del CTA) — tarjeta de riesgo y botón de cierre de consulta/inicial */
  --hl: #c1853f;            /* dorado — uso decorativo / sobre fondo oscuro */
  /*
   * DORADO CLARO — el mismo tono y la misma saturación que --hl (32,3° · 51 %), sólo más claro.
   * Existe porque --hl NO alcanza AA cuando lleva TEXTO sobre el berry del botón de finalizar
   * estudio: medido, 3,38:1 contra --accent, y AA pide 4,5. El primero de la familia que pasa es
   * #d0a26d con 4,58:1, y ese margen de 0,08 se lo come el degradé del botón, que aclara. Éste da
   * 5,06:1 contra el stop claro y 5,89:1 contra el hondo.
   * Se descartó --band-1 (#d3a417, 4,59:1): pasa, pero es un token CLÍNICO —la banda «Leve» de
   * HEARTS-OPS— y teñir un botón con el color de una categoría de riesgo es exactamente la
   * confusión que la paleta de este proyecto evita.
   */
  --hl-claro: #d5ac7c;

  /* Verde de ACCIÓN (avanzar/continuar) — familia propia del CTA de avance. El hue es vecino del
     verde clínico --band-0 #277a4c (Δ≈6°): la distinción NO es cromática sino de profundidad,
     saturación y sobre todo de FORMA/CONTEXTO (botón con degradé y sombra vs dot de 12px en una
     tabla). Consigna del director: "más saturado o más profundo" — cumplida por esa vía. */
  --action: #0e7245;        /* base — blanco encima 5.97:1 (AA) */
  --action-hi: #117347;     /* stop claro del radial — medido: blanco ≥4.9:1 aun con brightness(1.08) */
  --action-mid: #0b5c38;    /* stop medio de los degradés */
  --action-deep: #06331f;   /* stop profundo / sombras */

  --bg: #fbf7f6;
  --surface: #ffffff;
  --ink: #2a1a1e;          /* texto principal — AA sobre claro */
  /* CREMA institucional (bordó / crema / blanco). Tres pasos para el mismo degradé que el
     resto de los CTA; el texto y el ícono van en --ink, que sobre estos tres da >11:1. */
  --crema: #f6ebd8;
  --crema-mid: #efdfc4;
  --crema-deep: #e3cda6;
  --crema-line: #c9ad7e;   /* borde/filo sobre crema — para piezas sobre fondo OSCURO (berry) */
  /* CONTORNO de un componente crema sobre fondo CLARO. El verde de acción se recortaba solo
     contra el fondo de página; una pieza crema sobre #fbf7f6 no, y --crema-line se queda en
     2,03:1 — por debajo del 3:1 que WCAG 2.2 §1.4.11 pide para el límite de un control. Misma
     familia (h 37°, s 41%), sólo más profundo: medido 4,08:1 atenuado y 3,51:1 pleno. */
  --crema-edge: #97753f;
  --muted: #6b5a5e;        /* texto secundario — AA sobre blanco (6.46:1) */
  --muted-2: #736266;      /* labels/uppercase pequeños — AA (5.73:1) */

  --line: rgba(42, 26, 30, .10);
  --line-strong: rgba(42, 26, 30, .16);

  /* Bandas de riesgo HEARTS-OPS por índice (espejo de clinica.CATEGORIAS) — AA verificadas.
     OJO: #kpis-root las RE-DECLARA avivadas (más saturación, mismo hue) solo para el reporte. */
  --band-0: #277a4c;  /* Bajo · <5% */
  --band-1: #caa12a;  /* Leve · 5-<10% (texto oscuro) */
  --band-2: #b05a26;  /* Moderado · 10-<20% */
  --band-3: #b23a30;  /* Alto · 20-<30% */
  --band-4: #7d1f2b;  /* Muy alto · ≥30% */

  /* Escala de estratificación con TEXTO BLANCO (pills de banda, celdas HTA). Semáforo extendido,
     los 5 con ratio de blanco ≥ 4,5:1 (AA). Reusan --band-* salvo Leve, que necesita un ámbar más
     oscuro (#caa12a daba 2,43). Ratios vs blanco: Bajo 5,28 · Leve 5,02 · Moderado 4,84 · Alto 5,93
     · Muy alto 9,99. Es la escala de la BANDA de riesgo; el NIVEL de metas sigue en su escala de 2. */
  --strat-0: #127f45;  /* Bajo — verde vivo (blanco 5,06; ITER4: +croma, no se puede aclarar sin romper AA) */
  --strat-1: #8c6a08;  /* Leve — ámbar/dorado (blanco 5,02; ≠ naranja Moderado) */
  --strat-2: #b85519;  /* Moderado — naranja marcado (blanco 4,83; ITER4: +croma) */
  --strat-3: #b23a30;  /* Alto — rojo (blanco 5,93) */
  --strat-4: #7d1f2b;  /* Muy alto — bordó (blanco 9,99) */
  /* Encabezados de la matriz HTA: rampa de GRISES de severidad creciente (ITER4: sale de la rampa
     berry para no competir con el semáforo de estratificación). Texto blanco AA en los tres
     (limítrofe 5,77 · nivel 1 8,48 · nivel 2 12,18). */
  --hta-h1: #6b6466;  --hta-h2: #524b4e;  --hta-h3: #3a3436;

  --ok-bg: #e6f3ec;  --ok-fg: #176039;  --ok-line: #bfe3cd;
  --warn-bg: #fbeceb; --warn-fg: #a8392f; --warn-line: #efc9c6;
  --neutral-bg: #f3eef0; --neutral-fg: #736266; --neutral-line: rgba(42,26,30,.10);

  /* SIN CRITERIO PARA PARTICIPAR (ELEG-1). Arena/ámbar: no es un error —la ficha está bien, la
     persona no entra al circuito— así que no puede leerse como el rojo de --warn, ni como el
     verde de --ok, ni como el bordó institucional. Hue 41°, lejos del verde (150°) y del rojo (8°).
     Contraste MEDIDO sobre #f5e2b8: leyenda 6,76:1 · --ink 13,01:1 · --muted 5,06:1 — los tres AA.
     Y 1,28:1 contra --surface, que es lo que hace que la fila se despegue del blanco.
     El color NO es la única señal (WCAG 1.4.1): la fila dice el motivo con todas las letras. */
  --sincriterio-bg: #f5e2b8; --sincriterio-fg: #6b430c; --sincriterio-line: #d9bc78;
  /* El arena SUAVE (PART-2 · B8): la misma familia, para la fila de la tabla de participantes —
     donde el arena pleno pesaba más que las 28 filas en circuito. Mezcla 60% del arena sobre
     blanco. Contraste MEDIDO (WCAG 2.2): leyenda #6b430c 7,48:1 (sube desde 6,76) · --ink
     14,39:1. Contra blanco es 1,15:1: el color ya NO es señal confiable por sí solo, y por eso
     la fila conserva OBLIGATORIAMENTE el filete lateral y la leyenda con todas las letras.
     Analítica y los buscadores conservan el arena pleno: allí la marca es UNA fila en una lista
     blanca y necesita despegue, no convivencia con una grilla entera. */
  --sincriterio-bg-suave: #f9eed4;

  /* Tipografía */
  --serif: 'Source Serif 4', Georgia, 'Times New Roman', serif;
  --sans: 'Hanken Grotesk', system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
  --mono: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;

  /* Escala tipográfica consolidada (aplicada en consulta/inicial; extensible al resto).
     Familias: serif = títulos + valores clínicos protagonistas · sans = texto funcional ·
     mono = SOLO cifras/datos numéricos (nunca texto corrido). */
  --fs-display: clamp(28px, 2.7vw, 38px);  /* título de vista — serif, lh 1.1 */
  --fs-hero: 28px;                         /* valor clínico protagonista — serif */
  --fs-h2: 21px;                           /* título de card / identidad — serif */
  --fs-h3: 15px;                           /* nombre de factor / grupo — sans 600 */
  --fs-body: 14px;                         /* cuerpo (opciones, descripciones) — sans 400, lh 1.55 */
  --fs-label: 13px;                        /* labels — sans 500 */
  --fs-caption: 11px;                      /* eyebrows/rótulos uppercase — sans 600 */
  --fs-num: 13px;                          /* cifra inline — mono 600 */
  --ls-caption: .12em;

  /*
   * ══ ESCALA DE ENCABEZADO DE SEGMENTO (PRACTICA-1 · D) ═══════════════════════════════
   *
   * Los tres segmentos del Consultorio —Práctica de Enfermería, Ecografía Doppler Vascular y
   * Consulta Médica y Tratamiento— están al MISMO nivel de la jerarquía y hasta este lote se
   * leían en tres cuerpos distintos: 23 px el primero, 44 el segundo y 12 el tercero. Eso es
   * lo que hacía ver el Consultorio desprolijo, y no se arregla campo por campo: hace falta
   * UNA escala, con tres voces y un solo lugar donde se definen.
   *
   * LA REFERENCIA ES EL DOPPLER, que era el que estaba bien. Los otros dos SUBEN hasta ahí;
   * ninguno baja.
   *
   *   --fs-segmento       el NOMBRE del segmento. Voz dominante, serif, berry.
   *   --fs-segmento-paso  el paso DENTRO del segmento («Estratificación de Riesgo»).
   *                       Subordinado a propósito: es el destino, no la identidad.
   *   --fs-segmento-meta  participante y DNI. METADATO. Hasta este lote compartían cuerpo con
   *                       el título del segmento, así que el nombre de la persona competía de
   *                       igual a igual con el nombre del acto clínico.
   */
  --fs-segmento: clamp(28px, 3.1vw, 44px);
  --fs-segmento-paso: clamp(21px, 2.1vw, 30px);
  --fs-segmento-meta: clamp(15px, 1.2vw, 18px);

  /* Forma */
  --r-sm: 9px; --r-md: 14px; --r-lg: 20px; --r-pill: 999px;
  --shadow-sm: 0 10px 30px rgba(42, 26, 30, .06);
  --shadow-md: 0 18px 50px rgba(42, 26, 30, .12);
  --shadow-accent: 0 12px 30px rgba(110, 37, 54, .22);

  --nav-h: 66px;
  --maxw: 1180px;
  --clinical-search-width: clamp(360px, 30vw, 480px);
  --clinical-control-height: 50px;
  --focus: 3px solid var(--accent);
}

/* ---------- Reset / base ---------- */
* { box-sizing: border-box; }
[hidden] { display: none !important; } /* el atributo hidden gana a display de clases */
html { scroll-behavior: smooth; }
body {
  margin: 0;
  background: var(--bg);
  color: var(--ink);
  font-family: var(--sans);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
  line-height: 1.5;
}
::selection { background: rgba(110, 37, 54, .16); }
img, svg { max-width: 100%; }
button { font: inherit; cursor: pointer; border: none; background: none; color: inherit; }
input, select, textarea { font: inherit; color: inherit; }
a { color: var(--accent); -webkit-tap-highlight-color: transparent; }
h1, h2, h3, h4 { font-family: var(--serif); font-weight: 600; letter-spacing: -.02em; color: var(--ink); }
p { margin: 0; }

/* ---------- Accesibilidad ---------- */
.skip-link {
  position: absolute; left: 8px; top: -60px; z-index: 200;
  background: var(--accent); color: #fff; padding: 10px 16px;
  border-radius: var(--r-sm); font-weight: 700; text-decoration: none;
  transition: top .15s ease;
}
.skip-link:focus { top: 8px; }

.visually-hidden {
  position: absolute !important; width: 1px; height: 1px;
  padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0);
  white-space: nowrap; border: 0;
}

:focus-visible { outline: var(--focus); outline-offset: 2px; border-radius: 3px; }
.on-dark :focus-visible,
.hero :focus-visible,
.kpi-masthead :focus-visible,
footer :focus-visible { outline-color: #fff; }
/* Encabezado de vista/sub-flujo: recibe foco programático al entrar (anuncio SR), no es
   tabulable (tabindex="-1"); se suprime su anillo de foco para que no dibuje un recuadro. */
[data-view-heading]:focus, [data-view-heading]:focus-visible,
[data-subflow-heading]:focus, [data-subflow-heading]:focus-visible { outline: none; }

/* ---------- Layout ---------- */
.container { width: 100%; max-width: var(--maxw); margin: 0 auto; }
section { scroll-margin-top: 80px; padding: clamp(60px, 9vw, 120px) clamp(20px, 6vw, 80px); }
.sec-light { background: var(--surface); }
.sec-tint { background: var(--bg); }
.sec-soft { background: var(--accent-soft); }
.sec-dark { background: var(--accent-deep); color: #fff; }
.sec-accent { background: var(--accent); color: #fff; }

.eyebrow {
  font: 600 12px var(--sans); letter-spacing: .18em; text-transform: uppercase;
  color: var(--accent); margin: 0 0 16px;
}
.sec-dark .eyebrow, .on-dark .eyebrow { color: rgba(255, 255, 255, .72); }
.step-tag {
  display: inline-flex; align-items: center; gap: 9px;
  font: 600 12px var(--sans); letter-spacing: .16em; text-transform: uppercase;
  color: var(--accent); margin-bottom: 16px;
}
.step-tag > span { background: var(--accent-soft); padding: 5px 11px; border-radius: var(--r-pill); }

.h2 { font: 600 clamp(30px, 4.6vw, 52px)/1.04 var(--serif); margin: 0 0 16px; text-wrap: balance; }
.lead { font: 400 17px/1.6 var(--sans); color: var(--muted); margin: 0; }
.sec-dark .lead, .on-dark .lead { color: rgba(255, 255, 255, .82); }
.sec-head { max-width: 760px; margin-bottom: clamp(30px, 4vw, 46px); }

.grid { display: grid; gap: clamp(18px, 2.4vw, 30px); }
.grid-auto { grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); }
.grid-2 { grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); }
.grid-clin { grid-template-columns: repeat(auto-fit, minmax(310px, 1fr)); align-items: start; }
/* Grid "El desafío": 4 tarjetas parejas — 4 en fila (desktop), 2x2 (intermedio), 1 col (mobile). */
.grid-desafio { grid-template-columns: repeat(4, minmax(0, 1fr)); }
@media (max-width: 1024px) { .grid-desafio { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 520px) { .grid-desafio { grid-template-columns: 1fr; } }

/* ---------- Cards ---------- */
.card {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-lg); padding: clamp(24px, 2.8vw, 34px);
}
.card-soft { background: var(--bg); }
.card-pad-sm { padding: clamp(20px, 2.4vw, 30px); }
.card-dark { background: var(--accent-deep); color: #fff; border: none; }
.card-accent { background: var(--accent); color: #fff; border: none; }
/* "La oportunidad": título dominante + cita que acompaña (menor); columnas alineadas al tope. */
.op-grid { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(24px, 3vw, 36px); }
.op-grid .op-title { margin: 0; font: 500 clamp(26px, 3vw, 34px)/1.15 var(--serif); color: #fff; }
.op-grid .op-quote { margin: 0; font: 400 italic clamp(15px, 1.5vw, 18px)/1.55 var(--serif); color: rgba(255, 255, 255, .8); }
.op-cita { border-left: 2px solid rgba(255, 255, 255, .25); padding-left: 18px; }
@media (max-width: 600px) {
  .op-grid { grid-template-columns: 1fr; gap: 16px; }
  .op-br { display: none; }
  .op-cita { border-left: none; padding-left: 0; border-top: 2px solid rgba(255, 255, 255, .25); padding-top: 16px; }
}
.icon-badge {
  width: 46px; height: 46px; border-radius: 50%;
  background: var(--accent-soft); display: flex; align-items: center; justify-content: center;
  margin-bottom: 20px; color: var(--accent);
}
.card h3 { font: 700 18px var(--sans); margin: 0 0 8px; }
.card p { font: 400 14.5px/1.6 var(--sans); color: var(--muted); }
.card-dark h3, .card-accent h3 { color: #fff; }
.card-dark p { color: rgba(255, 255, 255, .7); }

/* Remate de "Lo que demostró PESA": callout serif con punto de acento (no pastilla). */
.hallazgo-remate { display: flex; gap: 12px; align-items: flex-start; margin-top: clamp(26px, 3.5vw, 38px); max-width: 52ch; }
.hallazgo-remate__dot { flex-shrink: 0; width: 8px; height: 8px; border-radius: 50%; background: var(--hl); margin-top: .5em; }
.hallazgo-remate p { margin: 0; font: 400 14px/1.5 var(--sans); color: rgba(255, 255, 255, .7); }
/* Salvedad de no-extrapolación (documento §3.4): pie del bloque, un escalón por debajo del
   remate — misma familia, menor peso, para que lea como nota al pie y no como hallazgo.
   padding-left iguala el eje óptico del texto del remate (punto 8px + gap 12px). */
.hallazgo-nota { margin: clamp(16px, 2vw, 22px) 0 0; padding-left: 20px; max-width: 52ch; font: 400 var(--fs-label)/1.55 var(--sans); color: rgba(255, 255, 255, .6); }

.label-mini {
  font: 600 11px var(--sans); letter-spacing: .14em; text-transform: uppercase;
  color: var(--muted-2); margin-bottom: 18px;
}
.sec-dark .label-mini, .card-dark .label-mini, .on-dark .label-mini { color: rgba(255, 255, 255, .55); }

/* ---------- Botones ---------- */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 9px;
  font: 700 15px var(--sans); border-radius: var(--r-pill);
  padding: 14px 24px; text-decoration: none; transition: transform .12s ease, background .15s ease;
}
.btn:active { transform: translateY(1px); }
.btn-primary { background: var(--accent); color: #fff; box-shadow: var(--shadow-accent); }
.btn-primary:hover { background: #5d1f2e; }
.btn-on-accent { background: #fff; color: var(--accent); box-shadow: 0 12px 30px rgba(0, 0, 0, .22); }
.btn-ghost { background: rgba(255, 255, 255, .12); color: #fff; border: 1px solid rgba(255, 255, 255, .32); }
.btn-outline { background: var(--surface); color: var(--accent); border: 1px solid rgba(110, 37, 54, .22); font-size: 14.5px; }
.btn-block { width: 100%; }

/* ---------- Nav ---------- */
.nav {
  position: fixed; top: 0; left: 0; right: 0; z-index: 60; height: var(--nav-h);
  display: flex; align-items: center; justify-content: space-between;
  padding: 0 clamp(16px, 5vw, 48px);
  background: rgba(251, 247, 246, .85);
  backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);
  border-bottom: 1px solid var(--line);
}
.brand { display: flex; align-items: center; gap: 11px; text-decoration: none; }
.brand-mark {
  width: 34px; height: 34px; border-radius: 50%; background: var(--accent);
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 4px 14px rgba(110, 37, 54, .3); flex-shrink: 0;
}
.brand-name { font: 800 16px var(--sans); letter-spacing: .04em; color: var(--ink); line-height: 1; }
.brand-sub { font: 500 9px var(--sans); letter-spacing: .15em; text-transform: uppercase; color: var(--accent); margin-top: 3px; }
/* margin-left auto (AUTH-2): corre el nav hacia la derecha junto al segmento de usuario,
   dejando el extremo derecho para éste. Sin excepciones: la que había —el Doppler lo anulaba para
   centrar los logos que llevaba en la barra— se fue con los logos (DOP-UI · 1), y con ella la
   última razón por la que el nav se comportaba distinto en un segmento. */
.nav-links { display: flex; align-items: center; gap: 22px; margin-left: auto; }
.nav-links a { font: 600 13.5px var(--sans); color: #4a3a3e; text-decoration: none; }
.nav-links a:hover { color: var(--accent); }
.nav-cta { font: 700 13.5px var(--sans); color: #fff; background: var(--accent); padding: 10px 18px; border-radius: var(--r-pill); text-decoration: none; }
.burger {
  display: none; width: 42px; height: 42px; border-radius: 10px;
  align-items: center; justify-content: center; background: rgba(110, 37, 54, .08);
}
.nav-panel {
  position: fixed; top: var(--nav-h); left: 0; right: 0; z-index: 55;
  background: rgba(251, 247, 246, .98); backdrop-filter: blur(14px);
  border-bottom: 1px solid var(--line); padding: 14px clamp(16px, 5vw, 48px);
  display: flex; flex-direction: column; gap: 2px; box-shadow: var(--shadow-md);
}
.nav-panel[hidden] { display: none; }
.nav-panel a { font: 600 16px var(--sans); color: #3a2a2e; text-decoration: none; padding: 12px 6px; border-bottom: 1px solid var(--line); }

/* ---------- Hero ---------- */
.hero {
  position: relative; overflow: hidden; min-height: 100vh;
  display: flex; flex-direction: column; justify-content: center;
  padding: clamp(84px, 10vh, 120px) clamp(20px, 6vw, 80px) clamp(48px, 8vh, 96px);
  background: radial-gradient(135% 125% at 84% -12%, var(--accent) 0%, var(--accent-deep) 73%);
  color: #fff;
}
.hero-ring { position: absolute; top: -180px; right: -160px; width: 620px; height: 620px; border-radius: 50%; border: 1px solid rgba(255, 255, 255, .14); pointer-events: none; }
.hero-ring-2 { position: absolute; top: 8%; right: 14%; width: 360px; height: 360px; border-radius: 50%; border: 1px solid rgba(255, 255, 255, .07); pointer-events: none; animation: spinslow 90s linear infinite; }
.hero-ecg { position: relative; width: 100vw; height: 44px; margin: auto calc(50% - 50vw) 0; overflow: hidden; pointer-events: none; opacity: .5; }
.hero-ecg svg { display: block; max-width: none; width: calc(100% + 165px); height: 100%; animation: ecgflow 4s linear infinite; }
/* Columna a alto completo: el aire sobrante se reparte en partes iguales entre
   texto→ECG y ECG→botones (doble margin-top:auto), y los botones asientan
   contra el pie del hero en cualquier alto de pantalla. */
.hero-inner { position: relative; z-index: 3; width: 100%; max-width: var(--maxw); margin: 0 auto; display: flex; flex-direction: column; flex: 1; }
.hero-kicker { display: inline-flex; align-items: center; gap: 10px; font: 600 12px var(--sans); letter-spacing: .18em; text-transform: uppercase; color: rgba(255, 255, 255, .78); margin-bottom: 26px; }
.hero-dot { width: 8px; height: 8px; border-radius: 50%; background: #fff; animation: pulse 2.4s ease-in-out infinite; }
.hero h1 { font: 600 clamp(40px, 7vw, 82px)/1.0 var(--serif); margin: 0 0 24px; max-width: 15ch; color: #fff; }
.hero-sub { margin: 0 0 14px; max-width: none; } /* sin tope: subtítulo y bajada en una sola fila a 1440 */
.hero-sub-1 { margin: 0 0 7px; font: 500 clamp(17px, 1.85vw, 21px)/1.4 var(--sans); color: rgba(255, 255, 255, .92); }
.hero-sub-1 strong { font-weight: 700; }
.hero-sub-2 { margin: 0; font: 400 clamp(15px, 1.5vw, 17px)/1.5 var(--sans); color: rgba(255, 255, 255, .72); }
.hero-actions { display: flex; flex-wrap: wrap; gap: 16px; margin-top: auto; }
.hero-actions .btn {
  padding: 17px 40px; font-size: 15.5px;
  transition: transform .15s ease, background .15s ease, box-shadow .15s ease, border-color .15s ease;
}
.hero-actions .btn-on-accent { box-shadow: 0 10px 28px rgba(0, 0, 0, .28), 0 2px 6px rgba(0, 0, 0, .18); }
.hero-actions .btn-on-accent:hover { transform: translateY(-2px); box-shadow: 0 16px 38px rgba(0, 0, 0, .32), 0 3px 8px rgba(0, 0, 0, .2); }
.hero-actions .btn-ghost {
  background: rgba(255, 255, 255, .08); border: 1px solid rgba(255, 255, 255, .45);
  backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
}
.hero-actions .btn-ghost:hover { background: rgba(255, 255, 255, .16); border-color: rgba(255, 255, 255, .62); }
/* Fila de logos institucionales en la parte superior del bloque del hero (PNG blancos
   sobre fondo berry). Flex con wrap para que no se desborden en mobile. */
.hero-logos { display: flex; align-items: center; flex-wrap: wrap; gap: clamp(18px, 3vw, 34px); margin-bottom: clamp(38px, 6vh, 56px); }
.hero-logos img { height: 44px; width: auto; }
@media (max-width: 480px) { .hero-logos { flex-wrap: nowrap; gap: 14px; } .hero-logos img { height: 29px; } }
/* El encabezado del hero recibe foco programático al entrar a la vista (anuncio para
   lector de pantalla) y no es tabulable; se suprime su anillo de foco para que no
   dibuje un recuadro alrededor del título. */
.hero h1:focus, .hero h1:focus-visible { outline: none; }

/* ---------- Banda de riesgo ---------- */
.risk-panel { background: var(--accent-soft); border: 1px solid rgba(110, 37, 54, .12); border-radius: var(--r-lg); padding: clamp(24px, 2.8vw, 34px); }
.risk-head { display: flex; align-items: flex-end; justify-content: space-between; flex-wrap: wrap; gap: 14px; margin-bottom: 26px; }
.risk-figure { font: 500 clamp(40px, 7vw, 72px)/.95 var(--serif); color: var(--accent); }
.risk-figure .pending { font: 600 clamp(18px, 2.4vw, 24px)/1.2 var(--sans); color: var(--accent); display: block; max-width: 16ch; }
.risk-cat { display: inline-flex; align-items: center; gap: 9px; color: #fff; border-radius: var(--r-pill); padding: 9px 16px; font: 700 15px var(--sans); }
.risk-cat .rango { font: 500 12px var(--mono); opacity: .9; }
.band-bar { display: flex; gap: 6px; }
.band {
  flex: 1; border-radius: 10px; padding: 12px 6px; text-align: center;
  transition: transform .35s cubic-bezier(.2,.7,.2,1), opacity .35s; opacity: .55;
}
.band[data-active="true"] { opacity: 1; transform: translateY(-4px) scale(1.03); box-shadow: 0 12px 26px rgba(0,0,0,.20); }
.band .nm { display: block; font: 700 12.5px var(--sans); line-height: 1.15; }
.band .rg { display: block; font: 500 10px var(--mono); opacity: .9; margin-top: 3px; white-space: nowrap; }
/* Bandas inactivas: chips neutros del sistema (crema + borde) con una MINI-BARRA del
   color semántico de banda — integra la escala a la paleta del proyecto y deja la tinta
   plena (AA holgado) en vez de texto sobre pastel. La banda activa conserva su color
   pleno con mini-barra blanca. */
.band[data-active="false"] { opacity: 1; color: var(--ink); background: var(--bg); border: 1px solid var(--line); }
.band::before { content: ""; display: block; width: 24px; height: 4px; border-radius: 2px; margin: 0 auto 7px; background: rgba(255, 255, 255, .85); }
.band-0[data-active="false"]::before { background: var(--band-0); }
.band-1[data-active="false"]::before { background: var(--band-1); }
.band-2[data-active="false"]::before { background: var(--band-2); }
.band-3[data-active="false"]::before { background: var(--band-3); }
.band-4[data-active="false"]::before { background: var(--band-4); }
.band-1[data-active="true"]::before { background: rgba(42, 26, 30, .55); }
/* Nota de escala bajo la banda (inyectada por estratificacion.js) */
.estrat-escala { font: 600 10.5px var(--sans); letter-spacing: .08em; text-transform: uppercase; color: var(--muted-2); margin: 9px 0 0; }
@media (max-width: 560px) {
  /* "Muy alto"/"Moderado" deben entrar en UNA línea con aire (no al límite del chip). */
  .band-bar { gap: 4px; }
  .band { padding: 10px 2px; }
  .band .nm { font-size: 9.5px; white-space: nowrap; letter-spacing: -.02em; }
  .band .rg { font-size: 9px; }
}
.band-0 { background: var(--band-0); color: #fff; }
.band-1 { background: var(--band-1); color: var(--ink); }
.band-2 { background: var(--band-2); color: #fff; }
.band-3 { background: var(--band-3); color: #fff; }
.band-4 { background: var(--band-4); color: #fff; }
.risk-axis { display: flex; align-items: center; gap: 8px; color: var(--muted-2); margin: 14px 0 22px; }
.risk-axis .line { flex: 1; height: 1px; background: linear-gradient(90deg, rgba(154,138,142,.2), rgba(154,138,142,.5)); }
.risk-axis span { font: 500 11.5px var(--sans); }
.note-box { display: flex; gap: 11px; align-items: flex-start; background: rgba(255, 255, 255, .6); border-radius: var(--r-md); padding: 15px 16px; }
.note-box p { font: 400 12.5px/1.55 var(--sans); color: var(--muted); margin: 0; }
.note-box svg { flex-shrink: 0; margin-top: 1px; color: var(--accent); }

/* Estado pendiente / aviso del motor */
.estado-pill { display: inline-flex; align-items: center; gap: 8px; font: 700 12.5px var(--sans); padding: 7px 13px; border-radius: var(--r-pill); border: 1px solid; }
.estado-pendiente { background: var(--neutral-bg); color: var(--neutral-fg); border-color: var(--neutral-line); }

/* ---------- Formularios ---------- */
.field { margin-bottom: 22px; }
.field-label { display: block; font: 600 13.5px var(--sans); color: #3a2a2e; margin-bottom: 10px; }
.field-row { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 12px; }
.field-val { font: 600 18px var(--mono); color: var(--accent); }
.field-val small { font: 500 11px var(--sans); color: var(--muted-2); margin-left: 4px; }
.seg { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.seg-btn, .toggle-btn {
  padding: 12px; border: 1.5px solid var(--line-strong); border-radius: 11px;
  font: 600 14px var(--sans); transition: all .15s; background: var(--surface); color: var(--muted);
}
.seg-btn[aria-pressed="true"], .toggle-btn[aria-pressed="true"] {
  background: var(--accent); color: #fff; border-color: var(--accent);
}
.toggle-btn { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 13px 16px; width: 100%; }
.toggle-btn .state { font: 700 12px var(--mono); opacity: .85; }
.text-input, .select {
  width: 100%; padding: 12px 14px; border: 1px solid var(--line-strong);
  border-radius: 10px; font: 500 15px var(--sans); background: var(--surface); color: var(--ink);
}
.select { font-size: 13.5px; padding: 10px 12px; }
.num-input { font: 600 15px var(--mono); color: var(--accent); }

/* Sliders accesibles */
input[type=range] {
  -webkit-appearance: none; appearance: none; width: 100%; height: 8px;
  border-radius: var(--r-pill); background: rgba(42, 26, 30, .14); outline-offset: 6px; margin: 6px 0;
}
input[type=range]::-webkit-slider-thumb {
  -webkit-appearance: none; appearance: none; width: 22px; height: 22px; border-radius: 50%;
  background: var(--accent); border: 3px solid #fff; box-shadow: 0 2px 9px rgba(110, 37, 54, .45); cursor: pointer;
}
input[type=range]::-moz-range-thumb {
  width: 22px; height: 22px; border-radius: 50%; background: var(--accent);
  border: 3px solid #fff; box-shadow: 0 2px 9px rgba(110, 37, 54, .45); cursor: pointer;
}
input[type=range]:focus-visible { outline: var(--focus); }

/* ---------- Doppler ---------- */
.tree-grid { display: grid; grid-template-columns: auto 1fr; gap: 10px; align-items: center; }
.tree-svg { width: 170px; height: auto; }
.tree-region { cursor: pointer; }
.tree-vessel { stroke: #d6a0a6; transition: stroke .2s; }
.tree-region[aria-pressed="true"] .tree-vessel { stroke: var(--band-3); }
.tree-legend { display: flex; flex-direction: column; gap: 12px; padding-left: 4px; }
.tree-legend .ttl { font: 700 13.5px var(--sans); color: var(--ink); }
.tree-legend .sub { font: 500 12px var(--sans); color: var(--muted-2); }
.region-card { border: 1.5px solid var(--line); border-radius: var(--r-md); padding: 16px; margin-bottom: 14px; transition: all .2s; }
.region-card[data-on="true"] { background: #fbeceb; border-color: #e7b6b2; }
.region-head { display: flex; align-items: center; justify-content: space-between; width: 100%; margin-bottom: 13px; }
.region-head .nm { font: 700 15px var(--sans); color: var(--ink); }
.region-state { display: inline-flex; align-items: center; gap: 7px; font: 700 12.5px var(--sans); color: var(--muted-2); }
.region-card[data-on="true"] .region-state { color: var(--band-3); }
.region-state .dot { width: 10px; height: 10px; border-radius: 50%; background: currentColor; }

/* ---------- Reclasificación / flujo ---------- */
.flow-step { display: flex; align-items: center; gap: 15px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-md); padding: 18px 20px; }
.flow-arrow { display: flex; justify-content: center; padding: 8px 0; color: #c79aa0; }
.recap { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 18px; }
.recap-col { display: flex; flex-direction: column; gap: 5px; }
.recap-col .k { font: 500 10.5px var(--sans); letter-spacing: .08em; text-transform: uppercase; color: rgba(255,255,255,.6); }
.recap-chip { display: inline-flex; align-items: center; gap: 7px; border-radius: var(--r-pill); padding: 7px 14px; font: 700 13px var(--sans); }
.recap-chip.basal { background: rgba(255,255,255,.12); color: #fff; }

/* ---------- Metas ---------- */
.meta-row { display: flex; align-items: center; justify-content: space-between; gap: 14px; border: 1.5px solid transparent; border-radius: 13px; padding: 14px 18px; transition: all .25s; background: rgba(255,255,255,.5); }
.meta-row[data-active="true"] { background: var(--surface); box-shadow: var(--shadow-sm); }
.meta-row .nm { font: 700 15px var(--sans); color: var(--ink); }
.meta-row .sub { font: 500 12px var(--sans); color: var(--muted-2); margin-left: 7px; }
.meta-row .val { font: 600 16px var(--mono); }
.status-box { border: 1.5px solid; border-radius: var(--r-md); padding: 16px 18px; transition: all .25s; }
.status-ok { background: var(--ok-bg); color: var(--ok-fg); border-color: var(--ok-line); }
.status-warn { background: var(--warn-bg); color: var(--warn-fg); border-color: var(--warn-line); }
.status-neutral { background: var(--neutral-bg); color: var(--neutral-fg); border-color: var(--neutral-line); }

/* ---------- Derivación banner ---------- */
.deriv-banner { display: flex; align-items: flex-start; gap: 12px; border-radius: 13px; padding: 16px 18px; border: 1px solid; }
.deriv-banner.is-deriva { background: var(--warn-bg); color: var(--warn-fg); border-color: var(--warn-line); }
.deriv-banner.no-deriva { background: var(--ok-bg); color: var(--ok-fg); border-color: var(--ok-line); }

/* ---------- Ficha viva (aside fijo) ---------- */
.ficha {
  position: fixed; right: 20px; bottom: 20px; z-index: 45; width: 300px;
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-md);
  box-shadow: var(--shadow-md); overflow: hidden;
}
.ficha-toggle { width: 100%; display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 13px 16px; background: var(--accent); color: #fff; }
.ficha-toggle .ttl { display: flex; align-items: center; gap: 9px; font: 700 13px var(--sans); }
.ficha-live-dot { width: 8px; height: 8px; border-radius: 50%; background: #9be7b6; animation: blink 1.8s ease-in-out infinite; }
.ficha-body { padding: 16px; }
.ficha-body[hidden] { display: none; }
.ficha-figure { font: 400 30px var(--serif); color: var(--ink); line-height: 1; }
.ficha-figure small { font: 500 14px var(--sans); color: var(--muted-2); }
.ficha-figure .pending { font: 600 14px var(--sans); color: var(--accent); }
.ficha-cells { display: flex; gap: 8px; margin: 12px 0; }
.ficha-cell { flex: 1; background: var(--accent-soft); border-radius: var(--r-sm); padding: 9px 11px; }
.ficha-cell .k { font: 500 9.5px var(--sans); letter-spacing: .06em; text-transform: uppercase; color: var(--muted-2); }
.ficha-cell .v { font: 600 16px var(--mono); color: var(--accent); }

/* ---------- Footer ----------
   BORDÓ INSTITUCIONAL, GLOBAL (PART-2 · C11, decisión declarada): el footer es compartido por
   toda la SPA y era el único chrome BLANCO al pie — la página terminaba más clara que su
   contenido, un escalón de valor invertido. Cierra con el bordó profundo de la casa (el mismo
   en que terminan los heros) y el crédito en el beige de la paleta: #f5e2b8 sobre #48141f mide
   11,79:1 (AAA, fórmula WCAG 2.2). De paso vuelve coherente la regla global que ya pintaba el
   focus-visible del footer en blanco presumiendo fondo oscuro. */
footer { background: var(--accent-deep); padding: 20px clamp(20px, 6vw, 80px); text-align: center; }
.footer-credit { margin: 0; font: 500 13px var(--sans); color: var(--sincriterio-bg); }
.footer-credit strong { font-weight: 700; color: var(--sincriterio-bg); }
.footer-ecg { position: absolute; left: 0; right: 0; bottom: 24px; height: 44px; overflow: hidden; pointer-events: none; opacity: .22; }
.footer-ecg svg { display: block; max-width: none; width: calc(100% + 165px); height: 100%; animation: ecgflow 2.8s linear infinite; }
.paho-link { display: inline-flex; align-items: center; gap: 8px; font: 700 13px var(--sans); text-decoration: underline; text-underline-offset: 3px; }

/* ---------- Indicadores (sec-dark) ---------- */
.kpi { background: rgba(255, 255, 255, .06); border: 1px solid rgba(255, 255, 255, .12); border-radius: var(--r-md); padding: 24px; }
.kpi .ic { width: 42px; height: 42px; border-radius: 11px; background: rgba(255, 255, 255, .1); display: flex; align-items: center; justify-content: center; margin-bottom: 16px; color: var(--hl); }
.kpi h3 { font: 700 17px var(--sans); margin: 0 0 6px; color: #fff; }
.kpi p { font: 400 13px/1.5 var(--sans); margin: 0; color: rgba(255, 255, 255, .7); }

/* ---------- Animaciones ---------- */
@keyframes ecgflow { from { transform: translateX(0); } to { transform: translateX(-165px); } }
@keyframes pulse { 0%,100% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.16); opacity: .65; } }
@keyframes floaty { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-18px); } }
@keyframes spinslow { to { transform: rotate(360deg); } }
@keyframes blink { 0%,100% { opacity: 1; } 50% { opacity: .2; } }

[data-reveal] { opacity: 0; transform: translateY(22px); transition: opacity .7s ease, transform .7s cubic-bezier(.2,.7,.2,1); }
[data-reveal][data-in] { opacity: 1; transform: none; }

/* ---------- Responsive ---------- */
@media (max-width: 920px) {
  .nav-links { display: none; }
  .burger { display: inline-flex; }
}
@media (max-width: 1180px) {
  .ficha { right: 12px; bottom: 12px; width: auto; max-width: 330px; }
}
@media (max-width: 560px) {
  .ficha { left: 10px; right: 10px; max-width: none; }
  .seg { grid-template-columns: 1fr; }
}

/* ---------- Reduce motion ---------- */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: .001ms !important; animation-iteration-count: 1 !important; transition-duration: .001ms !important; scroll-behavior: auto !important; }
  [data-reveal] { opacity: 1 !important; transform: none !important; }
}

/* ---------- Print (la vista/sub-flujo activo de consulta) ---------- */
@media print {
  .app-header, .burger, .nav-panel, .logo-band, [data-noprint], footer, .hero, .skip-link, .back-link { display: none !important; }
  [data-reveal] { opacity: 1 !important; transform: none !important; }
  body { background: #fff; }
  .view section { padding-top: 16px !important; }
  /* Tarjetas oscuras -> legibles en papel, conservando los colores semánticos de banda */
  .card-dark, .on-dark { background: #fff !important; color: #1a1a1a !important; box-shadow: none !important; border: 1px solid #ccc !important; }
  .card-dark .label-mini, .on-dark .label-mini, .card-dark p, .on-dark p, .card-dark span, .on-dark span { color: #2a1a1e !important; }
  .estrat-pill, .recap-chip, .band[data-active="true"], .meta-row span[style*="color"] { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
}

/* =========================================================================
   Reestructuración a vistas (router) — header, vistas, consulta, estratificación
   ========================================================================= */

/* ---------- Header de la app (fijo) ---------- */
.app-header {
  position: fixed; top: 0; left: 0; right: 0; z-index: 60; height: var(--nav-h);
  display: flex; align-items: center; justify-content: space-between;
  padding: 0 clamp(16px, 5vw, 48px);
  background: rgba(251, 247, 246, .9);
  backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);
  border-bottom: 1px solid var(--line);
}
.nav-links a[aria-current="page"] { color: var(--accent); font-weight: 700; }
.nav-links a[aria-current="page"]::after {
  content: ""; display: block; height: 2px; border-radius: 2px;
  background: var(--accent); margin-top: 3px;
}
.nav-panel a[aria-current="page"] { color: var(--accent); font-weight: 700; }

/* ---------- Banda institucional global (en flujo, bajo el header fijo) ---------- */
.logo-band {
  margin-top: var(--nav-h);
  display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 18px;
  padding: 12px clamp(16px, 5vw, 48px);
  background: var(--bg);
  border-bottom: 1px solid var(--line);
}
.logo-band img {
  height: 30px; width: auto; display: block;
  /* PNG blanco → berry #6e2536 exacto (cadena calibrada por canvas, ΔRGB = 0) */
  filter: brightness(0) saturate(100%) invert(14%) sepia(35%) saturate(3552%) hue-rotate(-40deg) brightness(96.3%) contrast(85.2%);
}
.logo-band img:nth-child(1) { justify-self: start; }
.logo-band img:nth-child(2) { justify-self: center; }
.logo-band img:nth-child(3) { justify-self: end; }
/* En #estudio la banda se oculta: el hero ya lleva sus propios logos (.hero-logos) */
body:has(#view-estudio:not([hidden])) .logo-band { display: none; }
/* En #kpis ídem (KPI-HEADER): el masthead del dashboard lleva sus propios logos */
body:has(#view-kpis:not([hidden])) .logo-band { display: none; }

/* ══════════════════════════════════════════════════════════════════════════════════════════
   LOS TRES LOGOS SE FUERON DE LA BARRA DEL DOPPLER (DOP-UI · 1)

   ══ QUÉ HABÍA ══════════════════════════════════════════════════════════════════════════

   Un `.dop-header-logos` metía los tres logos institucionales DENTRO de `.app-header`, sólo en
   #consulta/doppler y sólo arriba de 701 px, y apagaba la `.logo-band` global para compensar.

   ══ POR QUÉ SE VA — MEDIDO, NO OPINADO ═════════════════════════════════════════════════

   No comprimía el nav: CHOCABA con él. Medición en el navegador (DSF 1, carga fresca), en 22
   anchos, comparando cada uno contra el MISMO documento con los logos en `display:none`:

     ancho    CON logos                                          SIN logos
     701      Brisa pisa el SWITCH DEMO por 46 px                sin choques
     921      4 choques a la vez (hasta 61 px)                   sin choques
     1000     4 choques (hasta 72 px)                            sin choques
     1100     2 choques · 3 links en dos renglones               0 renglones partidos
     1200     2 choques (50 y 20 px)                             sin choques
     1300     Brisa pisa «Estudio PESA» por 54 px                sin choques
     1440     Brisa pisa «Estudio PESA» por 56 px                sin choques
     1600     Brisa pisa «Estudio PESA» por 14 px                sin choques
     1920+    sin choques                                        sin choques

   Diez de los veintidós anchos con superposición REAL de cajas, y el nav perdía hasta 163 px de
   ancho útil (521 contra 684 a 1301 px). Los tres links largos —«Estudio PESA», «Circuito
   Operativo», «Analítica de Laboratorio»— caían en dos renglones en TODA la franja 921–1600,
   contra ninguno sin los logos arriba de 1100.

   ══ LA CAUSA RAÍZ, CON FECHA ═══════════════════════════════════════════════════════════

   `git log -S` lo fecha en a7325c2 (3/7/2026, "feat(doppler): eco doppler vascular + landing
   consulta + banda institucional"). Ese día la barra tenía marca + CINCO links. Hoy tiene marca +
   SIETE links + el switch de modo demostración (UI-1) + el segmento de usuario (AUTH-2). Cuatro
   ocupantes nuevos entraron después y nadie volvió a medir el ancho. Los logos no dejaron de
   entrar por un cambio de estilo: dejaron de entrar porque la barra se llenó.

   ══ QUÉ QUEDA ═════════════════════════════════════════════════════════════════════════

   Nada especial. El Doppler pasa a usar la `.logo-band` de arriba, que es la franja institucional
   de TODOS los segmentos y que este segmento YA mostraba abajo de 701 px — no se agrega ninguna
   pieza, se saca el override que la apagaba. Con la banda de vuelta, la compensación de
   `padding-top` que existía por su ausencia también se va: dejarla sumaría un `--nav-h` de aire
   arriba del contenido, que es el defecto contrario.
   ══════════════════════════════════════════════════════════════════════════════════════════ */
@media (max-width: 700px) {
  .logo-band { padding: 9px 16px; gap: 12px; }
  .logo-band img { height: 21px; }
}

/* ---------- Sistema de vistas ---------- */
/* Columna flexible a viewport completo: el main absorbe el alto sobrante y el
   footer asienta siempre contra el borde inferior, sin franja blanca. */
body { display: flex; flex-direction: column; min-height: 100vh; }
main { flex: 1 0 auto; display: flex; flex-direction: column; }
main > .view { flex: 1 0 auto; }
.view { display: block; }
.view[hidden] { display: none !important; }
/* Con la banda institucional en flujo, las vistas ya no despejan el header fijo
   con padding: solo aire editorial respecto de la banda. */
.view:not(#view-estudio) section { padding-top: clamp(34px, 4.5vw, 56px); }
.view-enter { animation: viewIn .32s cubic-bezier(.2, .7, .2, 1); }
@keyframes viewIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }

/* ---------- Circuito: la vista LLENA el alto disponible ----------
   main > .view ya es flex:1, pero la cadena moría ahí: la sección no se estiraba y quedaban
   ~134px muertos bajo la grilla a 1440×900 (medido), con el conjunto "flotando" arriba.
   Se propaga el flex hasta la grilla: la lista reparte sus 6 botones en el alto disponible y
   la card de detalle acompaña (align-items:stretch del grid). En viewports bajos o apilados
   el contenido manda: min-height en los botones y nada se comprime por debajo de su contenido. */
#view-circuito { display: flex; flex-direction: column; }
#view-circuito.view section { padding-top: 24px; padding-bottom: 44px; flex: 1; display: flex; }
#view-circuito.view section > .container { display: flex; flex-direction: column; width: 100%; }
#view-circuito .etapas-grid { flex: 1; }
#etapas-list button { flex: 1; min-height: 64px; }
/* Apilado (móvil): el botón se dimensiona por su CONTENIDO. Con flex:1 (basis 0) y el título
   largo de la etapa 6 a 3 líneas, el padding de 15px colapsaba y el texto quedaba a 0,4px del
   borde (los hermanos, a 19,7px) — medido a 375 y 414. Sólo rige donde la lista apila; en dos
   columnas la card de detalle da altura de sobra y flex:1 reparte con aire. */
@media (max-width: 700px) { #etapas-list button { flex: 0 0 auto; } }
/* Elevación en la escala YA unificada (#metas / 3 pasos): la card de detalle es la pieza
   destacada de la vista → --shadow-md, el mismo escalón que .rcl-strat. */
#etapa-detalle { box-shadow: var(--shadow-md); }
/* max-width liberado: la bajada entra en una sola fila a 1440 */
#view-circuito .sec-head { margin-bottom: 16px; max-width: none; }
#view-circuito .sec-head h1.h2 { font: 600 clamp(30px, 3.6vw, 44px)/1.06 var(--serif); margin: 0 0 8px; }
#view-circuito .lead { font-size: 15px; line-height: 1.5; }
#etapas-list button > span:first-child { width: 32px !important; height: 32px !important; font-size: 14px !important; }
/* Tarjeta de detalle: pill anclada arriba y bloque de texto centrado en el espacio restante
   (elimina el aire muerto entre pill y texto; la altura sigue igualada a la lista). */
#etapa-detalle { justify-content: flex-start; }
#etapa-detalle .etapa-pill { margin-bottom: 18px !important; }
#etapa-detalle .etapa-body { margin: auto 0 !important; }
/* Marca de agua UNIFICADA: icono + número como un solo lockup (el icono, oblicuo, corona al
   número sobre el mismo eje vertical), centrado a la derecha y SIEMPRE entero dentro de la
   tarjeta (recorte consistente en las 6 etapas). El número manda; el icono susurra
   (menor tamaño relativo y opacidad .07 vs .10 del número). */
#etapa-detalle .etapa-marca { position: absolute; top: 50%; right: clamp(18px, 3vw, 36px); transform: translateY(-50%); display: flex; flex-direction: column; align-items: center; gap: clamp(2px, .8vw, 10px); pointer-events: none; }
#etapa-detalle .etapa-marca-icono { display: block; width: clamp(48px, 6.5vw, 88px); height: clamp(48px, 6.5vw, 88px); color: rgba(255, 255, 255, .07); transform: rotate(-15deg); }
#etapa-detalle .etapa-marca-num { font: 500 clamp(150px, 24vw, 290px)/.8 var(--serif); color: rgba(255, 255, 255, .10); }
/* Progreso del circuito al pie de la tarjeta (llena el pie con propósito: "recorrido
   trazable"). Decorativo (aria-hidden: el dato lo da "Etapa N de 6"); la etapa activa se
   distingue por grosor y anillo además del color de su fase. */
#etapa-detalle .etapa-progreso { position: relative; display: flex; align-items: center; gap: 6px; height: 6px; margin-top: 22px; flex-shrink: 0; }
#etapa-detalle .etapa-progreso span { flex: 1; height: 3px; border-radius: 3px; background: rgba(255, 255, 255, .14); }
#etapa-detalle .etapa-progreso span.pasada { background: rgba(255, 255, 255, .34); }
#etapa-detalle .etapa-progreso span.activa { height: 6px; box-shadow: 0 0 0 2px rgba(255, 255, 255, .85); }
@media (max-width: 700px) {
  #view-circuito.view section { padding-top: 30px; padding-bottom: clamp(40px, 8vw, 60px); }
  /* Holgura de seguridad: separa el pie del numeral del anillo del progreso en tarjetas bajas. */
  #etapa-detalle .etapa-marca { top: calc(50% - 2px); }
}

.grid-3 { display: grid; gap: clamp(16px, 2vw, 24px); grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); }

/* ---------- Tarjetas bordó de Consulta (marca de agua editorial) ---------- */
.consulta-cards { align-items: stretch; }
.consulta-card {
  /* Tamaño de la marca de agua por tarjeta: calibrado por getBBox para igualar la
     TINTA óptica (~74px de render) — el trazo de cada ícono llena distinto su viewBox
     24 (transductor 18.8 · estetoscopio 19.4 · clipboard 18.0). */
  --wm-size: 94px;
  position: relative; overflow: hidden;
  display: flex; flex-direction: column;
  min-height: 316px;
  text-decoration: none;
  /* Degradé berry diagonal (accent → panel → deep, tokens de la casa) para dar
     profundidad; el hover ya no cambia el fondo: solo eleva (criterio Apple). */
  background: linear-gradient(145deg, var(--accent) 0%, var(--berry-panel) 72%, var(--accent-deep) 125%);
  color: #fff;
  border: 1px solid rgba(255, 255, 255, .10);
  border-radius: var(--r-lg); padding: clamp(24px, 2.3vw, 30px) clamp(24px, 2.3vw, 30px) 78px;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .12), 0 24px 48px rgba(72, 20, 31, .26), 0 10px 22px rgba(110, 37, 54, .22), 0 2px 6px rgba(72, 20, 31, .14);
  transition: transform .15s ease, box-shadow .15s ease;
}
/*
 * EL TAMAÑO SIGUE AL ÍCONO, NO A LA POSICIÓN (ORG-1).
 *
 * Estas dos reglas eran `:nth-child(2)` y `:nth-child(3)`. El tamaño está calibrado por la TINTA
 * óptica de cada glifo —cada ícono llena distinto su viewBox—, así que pertenece a la tarjeta y no
 * al lugar donde cae. Con el selector posicional, reordenar la portada le cambiaba el tamaño del
 * glifo a dos tarjetas sin que nadie lo pidiera; ORG-1 reordenó, y esto habría sido el defecto
 * silencioso del lote. El `href` es la identidad estable de cada tarjeta —es identificador de ruta
 * y no cambia—, así que anclarlo ahí lo deja resuelto para siempre.
 */
.consulta-cards .consulta-card[href="#consulta/inicial"] { --wm-size: 92px; }         /* estetoscopio */
.consulta-cards .consulta-card[href="#consulta/reclasificacion"] { --wm-size: 99px; } /* clipboard   */
.consulta-card:hover { transform: translateY(-3px); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .14), 0 32px 64px rgba(72, 20, 31, .32), 0 14px 30px rgba(110, 37, 54, .26), 0 3px 8px rgba(72, 20, 31, .16); }
.consulta-card:hover .cc-wm { color: rgba(255, 255, 255, .16); }
.consulta-card:hover .cc-arrow { transform: translateX(4px); }
.consulta-card:focus-visible { outline: 3px solid var(--ink); outline-offset: 3px; }
/* Pulso ECG de la casa (mismo patrón del hero y del botón Finalizar) escalado ×1.33
   (período 220px) y a ritmo calmo, corriendo entero al pie de cada tarjeta. */
.cc-ecg {
  position: absolute; left: -6px; right: -6px; bottom: 8px; height: 59px;
  overflow: hidden; opacity: .45; pointer-events: none;
}
.cc-ecg svg { display: block; max-width: none; width: calc(100% + 220px); height: 100%; animation: ecgflow-cc 5s linear infinite; }
@keyframes ecgflow-cc { from { transform: translateX(0); } to { transform: translateX(-220px); } }
/* Marca de agua ENTERA dentro de la card (antes offsets negativos + overflow:hidden
   la recortaban): offsets positivos y tamaño --wm-size por tarjeta; la rotación −12°
   expande el bbox ~9px por lado, los 22px de margen la contienen con aire. El
   overflow:hidden se conserva (recorta el ECG del pie y respeta el radio). */
.cc-wm {
  position: absolute; top: 22px; right: 22px; width: var(--wm-size); height: var(--wm-size);
  color: rgba(255, 255, 255, .11); transform: rotate(-12deg);
  pointer-events: none; transition: color .15s ease;
}
/* Ritmo vertical: kicker anclado arriba como marcador de índice; el lockup
   título+flecha+subtítulo se centra en la zona libre (doble margen auto);
   el pie queda reservado para el ECG por el padding inferior de la card. */
.cc-kicker { position: relative; font: 800 15px/1 var(--sans); letter-spacing: var(--ls-caption); text-transform: uppercase; color: var(--hl); margin-bottom: auto; }
.cc-titlerow { position: relative; display: flex; align-items: center; gap: 12px; margin-top: 18px; }
.cc-title { font: 700 var(--fs-hero)/1.15 var(--serif); }
.cc-sub { position: relative; font: 400 15px/1.5 var(--sans); color: rgba(255, 255, 255, .78); margin: 10px 0 auto; }
.cc-arrow { flex-shrink: 0; color: rgba(255, 255, 255, .7); transition: transform .15s ease; }
@media (max-width: 899px) {
  .consulta-card { min-height: 244px; padding-bottom: 70px; }
  .cc-title { font-size: 25px; }
  .cc-kicker { font-size: 14px; }
  /* Misma proporción óptica que desktop (×.76), también entera dentro de la card. */
  .cc-wm { width: calc(var(--wm-size) * .76); height: calc(var(--wm-size) * .76); top: 16px; right: 16px; color: rgba(255, 255, 255, .08); }
}

/* ---------- Consulta (landing): la vista es columna flex y la landing llena el
   espacio disponible (flex: 1) — el centrado interno distribuye el contenido y el
   footer queda asentado exacto, sin calibrar alturas a mano. ---------- */
#view-consulta { display: flex; flex-direction: column; }
#view-consulta section[data-subflow="landing"] {
  flex: 1 0 auto;
  display: flex; flex-direction: column; justify-content: center;
  padding-top: 26px; padding-bottom: 44px;
}

/* ---------- Dashboard de KPIs (KPI-A3): REPORTE EJECUTIVO COMPACTO ----------
   Paradigma one-pager (apto A4): 3 niveles — HERO de hallazgos-titular ·
   PANELES de distribución (barras apiladas horizontales UNIFORMES, sin donuts
   repetidos con "TOTAL") · TABLAS densas de apoyo. Grilla 12-col con clases
   estables (kpi-q=3 · kpi-card=4 · kpi-wide=6 · kpi-full=12). El fill de TODA
   barra es display:block / flex-item (evita el bug de KPI-A2: span inline con
   width:0). El denominador se declara UNA vez (faja de cohorte / base de nivel). */
/* Costura masthead→contenido: aire mayor que el 16px del one-pager viejo — la franja
   berry full-bleed pide respiro antes del banner demo (en print vuelve a 16px vía la
   regla global .view section). */
#view-kpis.view > section { padding-top: clamp(22px, 3vw, 28px); padding-bottom: 24px; }
/* Separación figura-fondo (KPI-A4): el lienzo del reporte baja medio punto de luminosidad
   respecto de --bg (gris-berry frío) para que las cards blancas despeguen con la sombra
   difusa. Sólo esta vista; en print vuelve a blanco. */
#view-kpis > section.sec-tint { background: #f3eeef; }
/* Masthead estilo portada (KPI-HEADER): franja berry full-bleed que hereda el lenguaje
   del hero de #estudio (mismo gradiente, logos blancos, serif display, strip ECG) en
   versión COMPACTA de dashboard (~320px content-driven, sin 100vh ni los clamps del
   hero, calibrados para pantalla completa). Grid con áreas: en mobile el botón PDF
   cae al FINAL de la franja (nunca entre logos y título). Base del A4 de KPI-B.
   Ritmo interno: logos→h1 clamp(18,2.5vh,26) · h1→meta 10px · meta→ECG clamp(16,2.5vh,24).
   --kpi-mast-gap sobrevive al masthead viejo: lo consume el marco del reporte (banner→faja). */
#view-kpis { --kpi-mast-gap: 10px; }
.kpi-masthead {
  position: relative; overflow: hidden;
  padding: calc(var(--nav-h) + clamp(22px, 3.5vh, 32px)) clamp(20px, 6vw, 80px) 0;
  background: radial-gradient(135% 125% at 84% -12%, var(--accent) 0%, var(--accent-deep) 73%);
  color: #fff;
}
.kpi-masthead-inner {
  max-width: var(--maxw); margin: 0 auto;
  display: grid; grid-template-columns: 1fr auto; align-items: start;
  grid-template-areas: 'logos btn' 'title title' 'meta meta';
}
.kpi-masthead-logos { grid-area: logos; display: flex; align-items: center; flex-wrap: wrap; gap: clamp(18px, 3vw, 34px); margin-bottom: clamp(18px, 2.5vh, 26px); }
.kpi-masthead-logos img { height: 44px; width: auto; }
/* 46px máx = una línea holgada a 1440 (título medido: 870px vs 1180 útiles) y jerarquía
   clara bajo el hero de portada (82px); excepción consciente a --fs-display (38px). */
.kpi-masthead h1 { grid-area: title; font: 600 clamp(28px, 3.2vw, 46px)/1.08 var(--serif); letter-spacing: -.01em; margin: 0 0 10px; color: #fff; }
.kpi-masthead-meta { grid-area: meta; display: flex; justify-content: space-between; align-items: baseline; flex-wrap: wrap; gap: 6px 20px; }
.kpi-masthead-sub { margin: 0; font: 500 clamp(15px, 1.7vw, 17.5px)/1.45 var(--sans); color: rgba(255, 255, 255, .92); }
.kpi-masthead-corte { margin: 0; font: 600 12px var(--mono); letter-spacing: .08em; text-transform: uppercase; color: rgba(255, 255, 255, .72); font-variant-numeric: tabular-nums; }
/* Botón de descarga (operativo desde KPI-B): ghost sobre berry, ahora con afford pleno
   (borde .45 + hover/active) porque la acción existe: dispara window.print() → "Guardar
   como PDF". La transición sobria respeta el lenguaje del hero. */
#view-kpis .kpi-pdf-btn {
  grid-area: btn; justify-self: end;
  display: inline-flex; align-items: center; gap: 8px;
  font: 700 13.5px var(--sans); color: #fff;
  background: rgba(255, 255, 255, .1); border: 1px solid rgba(255, 255, 255, .45);
  border-radius: var(--r-pill); padding: 10px 18px;
  transition: background .15s ease, border-color .15s ease;
}
#view-kpis .kpi-pdf-btn:hover { background: rgba(255, 255, 255, .18); border-color: rgba(255, 255, 255, .7); }
#view-kpis .kpi-pdf-btn:active { background: rgba(255, 255, 255, .12); }
#view-kpis .kpi-pdf-btn svg { flex-shrink: 0; }
#view-kpis .kpi-pdf-btn[disabled] { cursor: not-allowed; }
/* Strip ECG al pie de la franja: reusa .hero-ecg (full-bleed + ecgflow); compacto y más
   sutil que en portada. El margin-top explícito reemplaza el auto del hero (columna flex). */
.kpi-masthead .hero-ecg { height: 36px; margin: clamp(16px, 2.5vh, 24px) calc(50% - 50vw) clamp(14px, 2.2vh, 22px); opacity: .4; } /* margen inferior (AUTH-2): el ECG ya no toca el borde */
@media (max-width: 680px) {
  .kpi-masthead-inner { grid-template-columns: 1fr; grid-template-areas: 'logos' 'title' 'meta' 'btn'; }
  #view-kpis .kpi-pdf-btn { justify-self: stretch; justify-content: center; margin-top: 14px; }
}
@media (max-width: 480px) {
  .kpi-masthead-logos { flex-wrap: nowrap; gap: 14px; }
  .kpi-masthead-logos img { height: 29px; }
}

/* === Sistema de diseño (KPI-A3/A4) — un valor por rol; escala de KPI-A2 bajada
   levemente para densificar el one-pager (section 28→25 · ctitle 17→15 ·
   cdesc 13→12 · datanum 32→30 · gap 20→16 · pad 20→16 · radius 16→14). === */
#kpis-root {
  --kpi-fs-section: 25px;   /* título de nivel (serif 600, peso real cargado) — domina sobre ctitle */
  --kpi-fs-ctitle: 15px;    /* título de panel (serif 600) */
  --kpi-fs-cdesc: 12px;     /* descripción de panel (sans 400 muted) */
  --kpi-fs-datanum: 30px;   /* número de dato (serif 600) */
  --kpi-fs-titular: 40px;   /* hallazgo-titular del hero (serif 600) */
  --kpi-fs-cval: 13px;      /* valores %/n (sans 500) */
  --kpi-fs-axis: 11px;      /* ejes/leyendas (sans 600 uppercase) */
  --kpi-fs-base: 11px;      /* nota de base (sans 500 muted) */
  --kpi-fs-kick: 13px;      /* kicker de nivel 01/02/03 (mono 600) */
  --kpi-fs-cohv: 15px;      /* valor de la faja de cohorte (mono 600) */
  --kpi-fs-gnum: 15px;      /* valor al centro de gauge/muescas (mono 600) */
  --kpi-fs-unit: 14px;      /* unidad junto a k-datanum (sans 600 muted) */
  --kpi-gap: 16px;          /* gap de grilla */
  --kpi-pad: 16px;          /* padding de panel */
  --kpi-radius: var(--r-md);  /* radio de panel/hero (deriva del token global, no lo duplica) */
  --kpi-radius-inner: 10px;   /* superficie interna: banner · tile · cohorte (10 y no --r-sm 9: óptico anidado en 14) */
  --kpi-hole: var(--surface);  /* "agujero" de semi-donut/gauge = superficie portante (los tiles lo re-declaran) */
  --kpi-radius-bar: 5px;      /* tracks y fills de barra */
  --kpi-radius-chip: 3px;     /* chips de leyenda */
  --kpi-shadow: 0 1px 2px rgba(42, 26, 30, .04), 0 8px 24px rgba(42, 26, 30, .07);  /* elevación macOS: contacto + difusa, sin borde duro */
  --kpi-shadow-hero: 0 2px 4px rgba(42, 26, 30, .05), 0 14px 34px rgba(110, 37, 54, .13);  /* hero: un punto más de elevación */
  --kpi-track: rgba(42, 26, 30, .15);  /* pista de barras/gauges — perceptible como escala (antes .09 ≈ invisible) */
  --kpi-demo-accent: #c9a227;  /* dorado del banner demo (borde) */
  --kpi-demo-ink: #8a6d00;     /* dorado profundo del ícono del banner */
  --kpi-divider: rgba(110, 37, 54, .3);  /* divisor interno bordó tenue (metas C-LDL | PA) — .18 de A5 renderizaba pero era imperceptible sobre la card blanca (KPI-A6) */
  --muted-2: #6d5c60;  /* re-tune scoped: recupera margen AA (≥5.2:1) sobre el lienzo #f3eeef */
  /* Bandas AVIVADAS scoped al reporte (KPI-A4): MISMO hue clínico que las --band-* globales
     (motor y resto del sitio intactos); sólo +saturación para que los charts pinten con
     presencia. band-1 (ámbar) es segmento gráfico, nunca portador de texto. */
  --band-0: #1b8d4e;  /* verde   · global #277a4c · hsl(147) S 52→68 */
  --band-1: #d3a417;  /* ámbar   · global #caa12a · hsl(45)  S 66→80 */
  --band-2: #c85c19;  /* naranja · global #b05a26 · hsl(23)  S 64→78 */
  --band-3: #be3127;  /* rojo    · global #b23a30 · hsl(5→4) S 58→66 */
  --band-4: #8c1d2b;  /* bordó   · global #7d1f2b · hsl(352) S 60→66 */
}
/* Serif del sitio a peso REAL: Source Serif 4 se carga 400/500/600 (index.html) — el 700
   anterior era bold sintético (trazo empastado). 600 = mismo peso que los h1–h4 del sitio. */
#kpis-root .k-sec { font: 600 var(--kpi-fs-section)/1.12 var(--serif); letter-spacing: -.02em; color: var(--ink); margin: 0; }
#kpis-root .k-ctitle { font: 600 var(--kpi-fs-ctitle)/1.25 var(--serif); letter-spacing: -.01em; color: var(--ink); margin: 0; }
#kpis-root .k-cdesc { font: 400 var(--kpi-fs-cdesc)/1.4 var(--sans); color: var(--muted-2); margin: 2px 0 0; }
#kpis-root .k-base { font: 500 var(--kpi-fs-base)/1.35 var(--sans); color: var(--muted-2); margin: 0; }
#kpis-root .k-base b { font-weight: 700; color: var(--muted); }
#kpis-root .k-val { font: 500 var(--kpi-fs-cval)/1.15 var(--sans); color: var(--ink); font-variant-numeric: tabular-nums; }
#kpis-root .k-num { font: 600 var(--kpi-fs-cval)/1.15 var(--mono); color: var(--ink); font-variant-numeric: tabular-nums; }
#kpis-root .k-axis { font: 600 var(--kpi-fs-axis)/1.3 var(--sans); color: var(--muted-2); letter-spacing: .03em; }
#kpis-root .k-datanum { font: 600 var(--kpi-fs-datanum)/1 var(--serif); color: var(--accent); font-variant-numeric: tabular-nums; }
#kpis-root .k-titular { font: 600 var(--kpi-fs-titular)/.95 var(--serif); letter-spacing: -.01em; color: var(--accent); font-variant-numeric: tabular-nums; }
#kpis-root .k-chip { width: 12px; height: 12px; border-radius: var(--kpi-radius-chip); flex-shrink: 0; }

/* Banner demo (la meta-line vieja murió con el masthead KPI-HEADER: el programa vive en el
   h1 de la franja y el corte en su slot [data-kpi-corte]) */
#kpis-root .kpi-banner { display: flex; align-items: center; gap: 9px; background: var(--accent-soft); border: 1px solid var(--line); border-left: 3px solid var(--kpi-demo-accent); border-radius: var(--kpi-radius-inner); padding: 7px 12px; margin: 0 0 var(--kpi-mast-gap); }
#kpis-root .kpi-banner svg { flex-shrink: 0; color: var(--kpi-demo-ink); }
#kpis-root .kpi-banner .k-val { color: var(--muted); }

/* Faja de cohorte — declara los denominadores UNA vez */
#kpis-root .kpi-cohort { display: flex; align-items: center; flex-wrap: wrap; gap: 12px 22px; padding: 11px 16px; border: 1px solid var(--line); border-radius: var(--kpi-radius-inner); background: var(--surface); box-shadow: var(--kpi-shadow); }
#kpis-root .kpi-coh-kick { flex-shrink: 0; text-transform: uppercase; }
#kpis-root .kpi-coh-group { display: flex; flex-wrap: wrap; gap: 12px 22px; }  /* 22 = mismo intervalo que la canaleta de los separadores (KPI-A6: item-item medía 20 y desbalanceaba 2px) */
/* Desktop: la faja ocupa TODO el ancho — los grupos crecen y reparten sus stats
   (space-between; el gap 22 pasa a ser el mínimo entre items). Sólo cuando el
   contenido entra en UNA fila (medido: ≥961 el ancho útil ≥ los 797px naturales);
   más angosto vuelve al flujo compacto con wrap — estirado + wrap dejaba el
   separador huérfano pegado al borde (KPI-A6b). */
@media (min-width: 961px) {
  #kpis-root .kpi-coh-group { flex: 1 1 auto; justify-content: space-between; }
}
#kpis-root .kpi-coh-item { display: flex; flex-direction: column; gap: 1px; }
#kpis-root .kpi-coh-v { font: 600 var(--kpi-fs-cohv)/1.1 var(--mono); color: var(--ink); font-variant-numeric: tabular-nums; }
#kpis-root .kpi-coh-l { font: 600 var(--kpi-fs-axis)/1.2 var(--sans); color: var(--muted-2); letter-spacing: .03em; }
#kpis-root .kpi-coh-u { font: 600 var(--kpi-fs-axis) var(--sans); color: var(--muted-2); }
#kpis-root .kpi-coh-pct { color: var(--accent); }
#kpis-root .kpi-coh-sep { width: 1px; align-self: stretch; background: var(--line-strong); }

/* Encabezado de nivel */
#kpis-root .kpi-lvlhead { display: flex; align-items: baseline; gap: 10px; margin: 16px 0 8px; padding-bottom: 6px; border-bottom: 1px solid var(--line-strong); flex-wrap: wrap; }
#kpis-root .kpi-lvlkick { font: 600 var(--kpi-fs-kick)/1 var(--mono); color: var(--accent); letter-spacing: .04em; font-variant-numeric: tabular-nums; }
#kpis-root .kpi-lvlbase { margin-left: auto; }

/* NIVEL 1 — HERO */
#kpis-root .kpi-hero { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--kpi-gap); }
#kpis-root .kpi-herocell { display: flex; align-items: center; gap: 16px; padding: 15px 17px; border: 1px solid var(--line); border-left: 3px solid var(--accent); border-radius: var(--kpi-radius); background: linear-gradient(180deg, var(--accent-soft), var(--surface)); box-shadow: var(--kpi-shadow-hero); break-inside: avoid; }
#kpis-root .kpi-herocell .k-titular { flex-shrink: 0; }
#kpis-root .kpi-herotxt { min-width: 0; }
#kpis-root .kpi-herotxt .k-base { margin-top: 6px; }
/* Hero protagonista (KPI-A4): el hallazgo central de PESA (celda 1) manda en berry profundo
   con acento dorado — dominancia por MATERIAL, no por otro tamaño (la escala sigue única).
   Contraste: titular/título #fff ≥12:1 · cdesc .8 ≥8:1 · base .68 ≥5.5:1 (verificado en DOM). */
#kpis-root .kpi-herocell-lead { background: linear-gradient(135deg, var(--accent-deep), var(--berry-panel)); border-color: var(--accent-deep); border-left-color: var(--hl); }
#kpis-root .kpi-herocell-lead .k-titular, #kpis-root .kpi-herocell-lead .k-ctitle { color: #fff; }
#kpis-root .kpi-herocell-lead .k-cdesc { color: rgba(255, 255, 255, .8); }
#kpis-root .kpi-herocell-lead .k-base { color: rgba(255, 255, 255, .68); }
#kpis-root .kpi-herocell-lead .k-base b { color: rgba(255, 255, 255, .88); }
/* ≤940: el min-content de una herocell (titular 40px no-comprimible + gap + palabra más
   larga del título) ronda 255px — con 3 columnas el grid desbordaba en 761–940 (blowout
   medido a 768: scrollW 845). Cazado en KPI-A5; antes el corte estaba en 760. */
@media (max-width: 940px) { #kpis-root .kpi-hero { grid-template-columns: 1fr; } }

/* GRILLA 12-col — align-items:stretch (altura pareja por fila, sin bordes escalonados);
   las cards se ordenan por altura de contenido (fila de 5 bandas junta) y el sobrante de
   las más cortas respira SIMÉTRICO vía .kpi-cbody{justify-content:center} (KPI-A4). */
#kpis-root .kpi-grid { display: grid; gap: var(--kpi-gap); grid-template-columns: repeat(12, 1fr); align-items: stretch; }
#kpis-root .kpi-grid > .kpi-card { grid-column: span 4; }   /* default */
#kpis-root .kpi-grid > .kpi-q { grid-column: span 3; }      /* DESPUÉS de kpi-card: gana en la cascada (misma especificidad) */
#kpis-root .kpi-grid > .kpi-wide { grid-column: span 6; }
#kpis-root .kpi-grid > .kpi-full { grid-column: 1 / -1; }
@media (max-width: 1040px) {
  #kpis-root .kpi-grid > .kpi-q { grid-column: span 6; }
  #kpis-root .kpi-grid > .kpi-card { grid-column: span 6; }
  #kpis-root .kpi-grid > .kpi-wide { grid-column: 1 / -1; }
  /* kpi-full DEBE re-declararse: las cards llevan "kpi-card kpi-full" y el span 6 de arriba
     (posterior en el archivo) le ganaba al 1/-1 de la base → Metas quedaba a MEDIA fila
     en 681–1040 (columnas de ~140px, valores tachando el divisor). Cazado en KPI-A5. */
  #kpis-root .kpi-grid > .kpi-full { grid-column: 1 / -1; }
}
@media (max-width: 680px) {
  #kpis-root .kpi-grid > .kpi-q,
  #kpis-root .kpi-grid > .kpi-card,
  #kpis-root .kpi-grid > .kpi-wide,
  #kpis-root .kpi-grid > .kpi-full { grid-column: 1 / -1; }
}

/* PANEL uniforme */
#kpis-root .kpi-card { display: flex; flex-direction: column; min-width: 0; background: var(--surface); border: 1px solid var(--line); border-radius: var(--kpi-radius); padding: var(--kpi-pad); box-shadow: var(--kpi-shadow); break-inside: avoid; page-break-inside: avoid; }
/* Los .kpi-card son <section>: el override global .view:not(#view-estudio) section (1,1,1)
   les pisaba el padding-top con 56px (aire muerto sobre TODOS los títulos). Se empata la
   especificidad con id — mismo idioma que #view-consulta section.rcl-card. */
#view-kpis section.kpi-card { padding: var(--kpi-pad); }
#kpis-root .kpi-chead { display: flex; flex-direction: column; gap: 2px; }
/* Respiración simétrica (KPI-A4): dentro de una fila pareja (stretch), el sobrante de las
   cards más cortas se reparte arriba/abajo del contenido — sin pozos al pie (la nota de
   base sigue anclada abajo porque es hermana del cbody, no hija). */
#kpis-root .kpi-cbody { flex: 1; display: flex; flex-direction: column; justify-content: center; margin-top: 12px; }
#kpis-root .kpi-card > .k-base { margin-top: 12px; }

/* BARRA APILADA horizontal (sBar) + leyenda. Junta blanca de 1px entre segmentos
   contiguos (WCAG 1.4.11: pares equiluminantes como band-3/muted-2 dan 1.0:1 — la
   frontera la traza la junta física, no el color). Ídem hairline en chips y puntos. */
#kpis-root .k-sbar { display: flex; flex-direction: column; gap: 11px; }
#kpis-root .k-strack { display: flex; height: 18px; border-radius: var(--kpi-radius-bar); overflow: hidden; background: var(--kpi-track); }
#kpis-root .k-sseg { min-width: 2px; }
#kpis-root .k-sseg + .k-sseg { box-shadow: -1px 0 0 var(--surface); }
#kpis-root .k-chip:not(.k-chip-none), #kpis-root .k-ddot-b { box-shadow: inset 0 0 0 1px rgba(42, 26, 30, .18); }
#kpis-root .k-sleg { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 5px; }
#kpis-root .k-sli { display: grid; grid-template-columns: 12px 1fr auto auto; align-items: center; gap: 8px; }
#kpis-root .k-slbl { font: 500 var(--kpi-fs-cval)/1.2 var(--sans); color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
#kpis-root .k-spct { text-align: right; }
#kpis-root .k-sn { text-align: right; min-width: 40px; }

/* DUMBBELL basal→final (reclasificación · KPI-A4): por banda, línea que conecta el punto
   basal (aro) con el final (sólido) sobre una pista común 0→max — comunica magnitud y
   DIRECCIÓN del movimiento mejor que dos apiladas. Valores n→n en mono a la derecha. */
#kpis-root .k-dumb { list-style: none; margin: 0; padding: 0; }
#kpis-root .k-drow { display: grid; grid-template-columns: 12px minmax(70px, auto) 1fr auto; align-items: center; gap: 9px; min-height: 30px; border-top: 1px solid var(--line); }
#kpis-root .k-dumb > li:first-child { border-top: 0; }
#kpis-root .k-dtrack { position: relative; height: 18px; margin: 0 7px; }
#kpis-root .k-dtrack::before { content: ""; position: absolute; left: -7px; right: -7px; top: 50%; height: 2px; margin-top: -1px; border-radius: 1px; background: var(--kpi-track); }
#kpis-root .k-dline { position: absolute; top: 50%; height: 3px; margin-top: -1.5px; border-radius: 2px; opacity: .4; }
#kpis-root .k-ddot { position: absolute; top: 50%; width: 11px; height: 11px; margin: -5.5px 0 0 -5.5px; border-radius: 50%; }
#kpis-root .k-ddot-a { background: var(--surface); border: 2.5px solid; }  /* basal: aro */
#kpis-root .k-ddot-b { border: 0; }                                        /* final: sólido */
#kpis-root .kpi-rec-note { margin: 10px 0 0; }
#kpis-root .kpi-rec-key { display: flex; align-items: center; gap: 6px; }
#kpis-root .kpi-rec-key .k-ddot { position: static; margin: 0; flex-shrink: 0; }
/* Cabecera de leyenda del dumbbell: clave basal/final a la derecha de la primera fila */
#kpis-root .kpi-rec-head { display: flex; justify-content: flex-end; margin-bottom: 2px; }

/* TABLA densa (barTable): label · barra fina · valor */
#kpis-root .k-tbl { list-style: none; margin: 0; padding: 0; }
#kpis-root .k-trow { display: grid; grid-template-columns: minmax(110px, 42%) 1fr auto; align-items: center; gap: 12px; min-height: 30px; border-top: 1px solid var(--line); }
#kpis-root .k-tbl > li:first-child { border-top: 0; }
#kpis-root .k-tlbl { font: 500 var(--kpi-fs-cval)/1.2 var(--sans); color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
#kpis-root .k-tbar { height: 7px; border-radius: var(--kpi-radius-bar); overflow: hidden; background: var(--kpi-track); }
#kpis-root .k-tfill { display: block; height: 100%; border-radius: var(--kpi-radius-bar); }
#kpis-root .k-tval { text-align: right; white-space: nowrap; }
#kpis-root .k-tgroup { font: 600 var(--kpi-fs-axis)/1 var(--sans); letter-spacing: .06em; text-transform: uppercase; color: var(--muted-2); padding: 9px 0 3px; border-top: 1px solid var(--line-strong); }
#kpis-root .k-tbl > .k-tgroup:first-child { border-top: 0; }

/* STATS compactos (chip · label · % · n) */
#kpis-root .k-stats { list-style: none; margin: 0; padding: 0; }
#kpis-root .k-statrow { display: grid; grid-template-columns: 12px 1fr auto auto; align-items: center; gap: 9px; min-height: 30px; border-top: 1px solid var(--line); }
#kpis-root .k-stats > li:first-child { border-top: 0; }
#kpis-root .k-chip-none { background: transparent; }

/* TILES de dato (carga y cobertura) — matriz 2×2 PAREJA: filas iguales (auto-rows 1fr)
   y cada tile centra su contenido; gauge, muescas y stat-numbers quedan en celdas del
   mismo alto (sin 2×2 cabezón) y la card no infla su fila. */
#kpis-root .k-tiles { display: grid; grid-template-columns: repeat(2, 1fr); grid-auto-rows: 1fr; gap: 10px; }
#kpis-root .k-tile { display: flex; flex-direction: column; justify-content: center; text-align: center; padding: 10px 8px; background: var(--accent-soft); border-radius: var(--kpi-radius-inner); }
#kpis-root .k-tile { --kpi-hole: var(--accent-soft); }  /* el agujero de un anillo montado en tile hereda la superficie del tile */
#kpis-root .k-tile .k-unit { font: 600 var(--kpi-fs-unit) var(--sans); color: var(--muted-2); }
#kpis-root .k-tile .k-tilelbl { margin-top: 5px; display: block; }
#kpis-root .k-tile .k-tsub { margin-top: 1px; display: block; }

/* SEMI-DONUT (extensión PESA · KPI-A4): proporción del todo en arco de 180° — conic-gradient
   del motor propio; el agujero es un disco a --kpi-hole (sin mask: imprime fiel) y ALOJA el
   dato-resumen (% con placa) como los gauges — misma convención en la familia de anillos.
   Leyenda estándar debajo (chip · label · % · n). Un solo ejemplar: variedad sin ruido. */
#kpis-root .k-sdon { display: flex; flex-direction: column; gap: 10px; }
#kpis-root .k-semi { position: relative; width: 160px; height: 80px; margin: 0 auto; overflow: hidden; }
#kpis-root .k-semi-ring { position: absolute; left: 0; top: 0; width: 160px; height: 160px; border-radius: 50%; }
#kpis-root .k-semi-hole { position: absolute; left: 50%; bottom: -53px; transform: translateX(-50%); width: 106px; height: 106px; border-radius: 50%; background: var(--kpi-hole); display: flex; flex-direction: column; align-items: center; justify-content: flex-start; padding-top: 15px; gap: 1px; }

/* GAUGE radial chico (carga/cobertura · KPI-A4): anillo de progreso conic-gradient con el
   valor al CENTRO en tinta (el color sólo codifica avance); remanente en --kpi-track (.15,
   legible como escala). Solo para el dato de completitud; 214 y 2,3 mm siguen stat-number. */
#kpis-root .k-gauge { position: relative; width: 62px; height: 62px; margin: 0 auto; border-radius: 50%; display: block; }
#kpis-root .k-gauge-hole { position: absolute; inset: 6px; border-radius: 50%; background: var(--kpi-hole); display: flex; align-items: center; justify-content: center; }
#kpis-root .k-gnum { font: 600 var(--kpi-fs-gnum)/1 var(--mono); color: var(--ink); font-variant-numeric: tabular-nums; }
#kpis-root .k-gnum .k-unit { font: 600 var(--kpi-fs-axis) var(--sans); color: var(--muted-2); }
#kpis-root .k-tile-g .k-tilelbl { margin-top: 7px; }

/* MUESCAS 5/5 (territorios · KPI-A4): indicador DISCRETO para una media sobre 5 —
   4 llenas + 1 parcial es geometría honesta con el dato (un anillo al 92% no lo es). */
#kpis-root .k-notches { display: flex; gap: 3px; width: 84px; margin: 5px auto 0; }
#kpis-root .k-notch { flex: 1; height: 9px; border-radius: 3px; background: var(--kpi-track); }

/* Pila de dos sub-bloques dentro de un panel (BEWAT basal + reestratificación):
   mismo eje clínico, un solo chrome de card; sub-headers en k-axis (como Metas). */
#kpis-root .kpi-stack2 { display: flex; flex-direction: column; gap: 15px; }

/* METAS dual (C-LDL + PA) en un panel — cada columna es una barTable densa
   (label · barra que llena · valor), sin pasillos label→valor del panel full.
   DIVISOR (KPI-A5): línea bordó tenue CENTRADA en el pasillo de 28px (margen negativo de
   media canaleta + padding que la devuelve): sub-bloques diferenciados, márgenes parejos. */
#kpis-root .kpi-metas2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px 28px; }
#kpis-root .kpi-metas-col { min-width: 0; }
#kpis-root .kpi-metas-col + .kpi-metas-col { border-left: 1px solid var(--kpi-divider); margin-left: -14px; padding-left: 13px; }
#kpis-root .kpi-metas-col .k-trow { grid-template-columns: minmax(88px, 32%) 1fr auto; }  /* piso 88px: "Individualizar" entra completo (categoría clínica, no se elipsa) */
#kpis-root .kpi-metas-h { display: block; margin-bottom: 8px; }
@media (max-width: 680px) {
  #kpis-root .kpi-metas2 { grid-template-columns: 1fr; }
  /* Apilado: el divisor pasa de vertical a horizontal entre los dos sub-bloques. */
  #kpis-root .kpi-metas-col + .kpi-metas-col { border-left: 0; margin-left: 0; padding-left: 0; border-top: 1px solid var(--kpi-divider); padding-top: 14px; }
}

/* FOOTER metodológico — colofón editorial (KPI-A5): label FUENTE diferenciado (uppercase
   bordó) + texto a la izquierda. KPI-FUENTE: el texto usa TODO el ancho de la columna 1fr
   (acotado por el container 1180px del layout) — la medida de lectura acotada (70ch) dejaba
   la mitad derecha vacía y el renglón normativo envolvía en ~3-4 líneas; a ancho completo
   baja a 1-2 líneas y reduce el alto del bloque. Medida amplia propia de fine-print/colofón.
   OJO cascada: el <footer> hereda la regla global `footer` (bg BORDÓ --accent-deep desde
   PART-2, text-align center, padding ancho) — acá se neutraliza explícito para que asiente
   sobre el lienzo del reporte. */
#kpis-root .kpi-footer { display: grid; grid-template-columns: auto 1fr; gap: 3px 18px; align-items: baseline; margin-top: 16px; padding: 12px 0 0; border-top: 1px solid var(--line-strong); background: transparent; text-align: left; }
#kpis-root .kpi-src-label { color: var(--accent); letter-spacing: .08em; text-transform: uppercase; }
#kpis-root .kpi-src-txt { min-width: 0; display: flex; flex-direction: column; gap: 3px; }
#kpis-root .kpi-footer .k-base { max-width: none; line-height: 1.6; }
@media (max-width: 680px) { #kpis-root .kpi-footer { grid-template-columns: 1fr; gap: 5px; } }

/* Móvil: subir el piso tipográfico (11→12) sólo en angosto; ocultar el separador
   vertical de la faja (queda huérfano al apilarse los grupos en columna). */
@media (max-width: 680px) {
  #kpis-root { --kpi-fs-axis: 12px; --kpi-fs-base: 12px; }
  #kpis-root .kpi-coh-sep { display: none; }
}

/* Print-aware (destino A4 = KPI-B): forzar el color semántico de banda/segmento/
   chip/fill al imprimir (los navegadores descartan background-color por defecto).
   En papel el lienzo vuelve a blanco y las sombras se apagan (tinta limpia). */
/* KPI-B: hoja A4 del reporte. @page es global al documento (no se puede scopear a una
   vista); A4 + 12mm es un margen prolijo y un default sano también para el resto de las
   vistas al imprimir. Los paddings horizontales de pantalla se anulan en print para no
   duplicar la sangría con este margen (ver bloque de #view-kpis más abajo).
   NOTA (KPI-B): se probó `size: A4 landscape` (opción B) y resultó PEOR — 6 hojas vs 4 en
   portrait, más aire muerto al pie (hojas más bajas + break-inside), y la grilla queda
   igual 2-up (las cards son anchas: landscape no la densifica). Se conserva portrait. */
@page { size: A4; margin: 12mm; }

@media print {
  #kpis-root, #kpis-root * { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
  #view-kpis > section.sec-tint { background: #fff; }
  /* El @page ya provee el margen: se anula el padding horizontal de la sección de la vista
     (base `section` = clamp 20–80px) para aprovechar el ancho útil del A4 sin doble sangría. */
  #view-kpis.view > section { padding-left: 0 !important; padding-right: 0 !important; }
  /* Masthead (KPI-HEADER) en papel: la franja berry plena degrada a TÍTULO BORDÓ SOBRE
     BLANCO (tinta A4 razonable). El padding-top de pantalla compensaba el header fijo
     (oculto en print) — se resetea; el horizontal también (lo da @page). Logos blancos →
     berry con el filter calibrado de .logo-band; el trazo del ECG pasa a bordó. */
  .kpi-masthead { background: none; color: var(--ink); padding: 0 0 8px; }
  .kpi-masthead h1 { color: var(--accent); }
  .kpi-masthead-sub { color: var(--ink); }
  .kpi-masthead-corte { color: var(--muted-2); }
  .kpi-masthead-logos img { filter: brightness(0) saturate(100%) invert(14%) sepia(35%) saturate(3552%) hue-rotate(-40deg) brightness(96.3%) contrast(85.2%); }
  .kpi-masthead .hero-ecg { opacity: .35; }
  .kpi-masthead .hero-ecg path { stroke: var(--accent); }
  #kpis-root .kpi-card, #kpis-root .kpi-herocell, #kpis-root .kpi-cohort { box-shadow: none; }
  /* El print global `.view section{padding-top:16px !important}` pisaba el padding de las
     cards-<section>; hoy coincide con --kpi-pad de casualidad — se fija explícito. */
  #view-kpis section.kpi-card { padding-top: var(--kpi-pad) !important; }
  /* La junta 1.4.11 entre segmentos equiluminantes vive en box-shadow, que varios motores
     descartan al imprimir: en papel pasa a borde real (sí sobrevive). */
  #kpis-root .k-sseg + .k-sseg { border-left: 1px solid #fff; box-shadow: none; }
  /* El colofón FUENTE es un <footer>: la regla global de print oculta todo footer del sitio —
     acá se restaura (la nota metodológica/normativa DEBE imprimirse en el A4). */
  #kpis-root .kpi-footer { display: grid !important; }
  /* Los encabezados de nivel 01/02/03 no deben quedar huérfanos al pie de una hoja:
     se mantienen pegados al contenido que anuncian. */
  #kpis-root .kpi-lvlhead { break-after: avoid; page-break-after: avoid; break-inside: avoid; }
  /* El banner de cohorte demo y la faja de cohorte tampoco se parten entre hojas. */
  #kpis-root .kpi-banner, #kpis-root .kpi-cohort { break-inside: avoid; page-break-inside: avoid; }
  /* Hero berry en papel: vuelve a tarjeta clara (tinta razonable en A4), titular en accent. */
  #kpis-root .kpi-herocell-lead { background: #fff; border-left-color: var(--accent); }
  #kpis-root .kpi-herocell-lead .k-titular { color: var(--accent); }
  #kpis-root .kpi-herocell-lead .k-ctitle { color: var(--ink); }
  #kpis-root .kpi-herocell-lead .k-cdesc, #kpis-root .kpi-herocell-lead .k-base,
  #kpis-root .kpi-herocell-lead .k-base b { color: var(--muted-2); }
}

/* ====================================================================
   Vista METAS — sistema visual único (rediseño integral).
   Una sola familia de cards claras (surface, hairline, radio 12px). El
   bordó es acento (chips, bordes, números), no relleno de bloques.
   Tres capas: 1) resumen del paciente + leyenda · 2) tabla unificada ·
   3) referencia plegada en acordeones.
   ==================================================================== */

/* Head aligerado: título más chico, lead corto */
.metas-head { max-width: 900px; margin-bottom: clamp(20px, 2.6vw, 30px); }
/* Tamaño explícito y responsive (el título usa .h3, que solo fija color): no depender del 2em
   del user-agent para un <h1> anidado en <section>. */
.metas-head .h3 { margin: 4px 0 6px; font: 600 clamp(24px, 3vw, 34px)/1.1 var(--serif); letter-spacing: -.015em; color: var(--ink); }
.metas-lead { max-width: 640px; margin: 0; font: 400 14px/1.55 var(--sans); color: var(--muted); }

/* Card base del sistema (una sola familia). Item 12: una única escala de sombra suave (elevación
   sutil, no dura), coherente en todo el segmento — resumen, leyenda, tabla y acordeones. */
.metas-card, .metas-resumen, .metas-leyenda, .metas-grafica, .metas-acc {
  background: var(--surface); border: 1px solid var(--line-strong); border-radius: var(--r-md);
  box-shadow: 0 1px 2px rgba(42, 26, 30, .04), 0 8px 22px rgba(42, 26, 30, .05);
}
.metas-card { padding: clamp(16px, 1.9vw, 22px); }
/* Item 7: la etiqueta "Referencia" deja de flotar en la esquina y baja como bajada del título,
   con menor peso visual. A3: regla de sección (acento bordó) bajo el título de la card. */
.metas-card-head { margin-bottom: 14px; }
.metas-card-t { font: 600 clamp(17px, 1.7vw, 19px) var(--serif); letter-spacing: -.01em; color: var(--ink); margin: 0; }
.metas-card-head .metas-card-t { display: inline-block; padding-bottom: 6px; border-bottom: 2px solid var(--accent); }
.metas-card-sub { font: 500 12.5px/1.4 var(--sans); color: var(--muted); margin: 7px 0 0; }
.metas-sec-sub { font: 400 13px/1.5 var(--sans); color: var(--muted); margin: 0 0 12px; }
.metas-note { font: 400 12px/1.5 var(--sans); color: var(--muted-2); margin: 10px 0 0; }
.metas-link { margin: 14px 0 0; }
/* Jerarquía del protocolo HTA (priorizar lo importante): las Salvedades (seguridad —
   contraindicaciones) se elevan con un tratamiento de precaución sutil; la nota de Sustitución
   (política de adaptación) baja a letra chica para no competir con lo clínico. */
.metas-salvedad { margin-top: 14px; padding: 11px 14px; border-radius: var(--r-sm); background: var(--warn-bg); border-left: 3px solid var(--warn-fg); color: var(--ink); }
.metas-salvedad strong { color: var(--warn-fg); }
.metas-fineprint { font-size: 11px; line-height: 1.5; color: var(--muted-2); }
/* Item 13: la nota-definición de no-HDL se separa del escalonado con un filete tenue (aside). */
.metas-nohdl { margin-top: 12px; padding-top: 10px; border-top: 1px dashed var(--line); }
/* A3/A5: rótulo de sub-bloque dentro de los acordeones — regla de sección bajo el título. */
.metas-blk-lbl { font: 700 10.5px var(--sans); letter-spacing: .09em; text-transform: uppercase; color: var(--accent); margin: 20px 0 10px; padding-bottom: 5px; border-bottom: 1px solid var(--line); }
.metas-acc-body > .metas-blk-lbl:first-child { margin-top: 0; }

/* Chip de nivel (componente único; también en la leyenda, la tabla y el Paso 3). Escala de 2
   colores (verde = no alto, bordó = alto), chip CLARO con texto oscuro: se distingue de los pills
   de banda, que son sólidos con texto blanco. */
.nivel-chip { display: inline-block; font: 700 9.5px var(--sans); letter-spacing: .04em; text-transform: uppercase; border-radius: var(--r-pill); padding: 2px 8px; white-space: nowrap; vertical-align: 1px; }
.nivel-chip[data-nivel="noAlto"] { background: var(--ok-bg); color: var(--ok-fg); border: 1px solid var(--ok-line); }
.nivel-chip[data-nivel="alto"] { background: var(--accent-soft); color: var(--accent); border: 1px solid rgba(110, 37, 54, .25); }
.perfil-chip { display: inline-block; font: 700 9.5px var(--sans); letter-spacing: .04em; text-transform: uppercase; border-radius: var(--r-pill); padding: 3px 8px; white-space: nowrap; }
.perfil-chip[data-perfil="noAlto"] { background: var(--ok-bg); color: var(--ok-fg); border: 1px solid var(--ok-line); }
.perfil-chip[data-perfil="alto"] { background: var(--accent-soft); color: var(--accent); border: 1px solid rgba(110, 37, 54, .25); }
.perfil-chip[data-perfil="intensivo"] { background: var(--strat-4); color: #fff; border: 1px solid var(--strat-4); }

/* Pill de BANDA de riesgo (tabla de metas y tabla de score): ancho uniforme, fondo sólido con el
   color de estratificación (escala de 5), texto BLANCO centrado, sin dot. El color lo fija el
   índice de banda del motor (data-strat = c.i / repIdx). */
.banda-pill { display: inline-flex; align-items: center; justify-content: center; min-width: 96px; padding: 4px 12px; border-radius: var(--r-pill); font: 700 12px var(--sans); color: #fff; text-align: center; letter-spacing: .01em; }
.banda-pill[data-strat="0"] { background: var(--strat-0); }
.banda-pill[data-strat="1"] { background: var(--strat-1); }
.banda-pill[data-strat="2"] { background: var(--strat-2); }
.banda-pill[data-strat="3"] { background: var(--strat-3); }
.banda-pill[data-strat="4"] { background: var(--strat-4); }

/* ---------- CAPA 1 · Resumen del paciente ---------- */
.metas-resumen { border-left: 4px solid var(--accent); padding: clamp(16px, 2vw, 22px); margin-bottom: 16px; }
.metas-res-head { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 14px; margin-bottom: 12px; }
.metas-res-flags { display: flex; flex-wrap: wrap; gap: 6px; }
.flag-chip { display: inline-block; font: 700 10px var(--sans); letter-spacing: .05em; text-transform: uppercase; border-radius: var(--r-pill); padding: 3px 9px; background: var(--accent-soft); color: var(--accent); border: 1px solid rgba(110, 37, 54, .25); }
.metas-res-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 10px 16px; margin-bottom: 14px; }
.metas-res-item { min-width: 0; }
.metas-res-k { display: block; font: 600 11px var(--sans); letter-spacing: .08em; text-transform: uppercase; color: var(--muted-2); margin-bottom: 3px; }
.metas-res-v { display: block; font: 700 15px/1.35 var(--sans); color: var(--ink); }
.metas-res-m { display: block; font: 500 12px/1.5 var(--sans); color: var(--muted); margin-top: 2px; }

/* Caja C-LDL del paciente (brecha respecto del valor actual) */
.lip-paciente { margin-top: 4px; padding: 13px 15px; border-radius: var(--r-sm); background: var(--neutral-bg); border: 1px solid var(--line); }
.lip-paciente.status-ok { background: var(--ok-bg); border-color: var(--ok-line); }
.lip-paciente.status-warn { background: var(--warn-bg); border-color: var(--warn-line); }
.lip-paciente .lp-flex { display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap; }
.lip-paciente .lp-big { font: 700 22px var(--mono); margin-top: 3px; color: var(--ink); }
.lip-paciente .lp-meta { font: 500 12px var(--sans); opacity: .82; margin-left: 5px; }
.lip-paciente .lp-status { font: 800 14px var(--sans); text-align: right; }

/* ---------- CAPA 1 · Leyenda de dos ejes (franja compacta) ---------- */
.metas-leyenda { background: var(--accent-soft); border-color: var(--line); padding: 12px 16px; margin-bottom: clamp(20px, 3vw, 30px); }
.metas-ley-ejes { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 14px; }
.metas-ley-eje { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 8px; }
.metas-ley-k { font: 700 11px var(--sans); letter-spacing: .07em; text-transform: uppercase; color: var(--ink); }
.metas-ley-chips { display: inline-flex; align-items: center; flex-wrap: wrap; gap: 4px; }
.metas-ley-dot { width: 10px; height: 10px; border-radius: 50%; display: inline-block; }
.metas-ley-txt { font: 500 11.5px var(--sans); color: var(--muted); margin-left: 4px; }
.metas-ley-arrow { font: 700 15px var(--sans); color: var(--accent); }
.metas-ley-regla { margin: 8px 0 0; font: 500 12.5px/1.55 var(--sans); color: var(--ink); }

/* Gráfica accesible de bandas y perfiles: HTML real, colores sólidos y rótulos redundantes. */
.metas-grafica { padding: clamp(16px, 1.9vw, 22px); margin-bottom: clamp(20px, 3vw, 30px); }
.metas-grafica-bandas { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 6px; }
.metas-grafica-banda { min-width: 0; min-height: 68px; display: flex; flex-direction: column; justify-content: center; gap: 3px; padding: 11px 12px; border-radius: var(--r-sm); background: var(--metas-band); color: var(--metas-band-text); text-align: center; }
.metas-grafica-banda strong { font: 700 13px/1.2 var(--sans); }
.metas-grafica-banda span { font: 600 11.5px/1.25 var(--sans); font-variant-numeric: tabular-nums; }
.metas-grafica-perfiles { margin-top: 8px; display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 6px; }
.metas-grafica-perfil { grid-column: span var(--metas-profile-span); min-width: 0; display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px; padding: 11px 13px; border: 1px solid var(--line-strong); border-radius: var(--r-sm); background: var(--neutral-bg); }
.metas-grafica-perfil::before { content: ""; align-self: stretch; width: 3px; border-radius: var(--r-pill); background: var(--accent); }
.metas-grafica-perfil[data-perfil="noAlto"]::before { background: var(--strat-0); }
.metas-grafica-perfil[data-perfil="intensivo"]::before { background: var(--strat-4); }
.metas-grafica-perfil strong { width: calc(100% - 13px); font: 700 11px var(--sans); letter-spacing: .04em; text-transform: uppercase; color: var(--ink); }
.metas-grafica-perfil span { font: 650 11.5px/1.35 var(--sans); color: var(--ink); font-variant-numeric: tabular-nums; }
.metas-grafica-perfil small { width: 100%; padding-left: 13px; font: 500 10.5px/1.35 var(--sans); color: var(--muted-2); }
@media (max-width: 700px) {
  .metas-grafica-bandas, .metas-grafica-perfiles { grid-template-columns: 1fr; }
  .metas-grafica-banda { min-height: 0; flex-direction: row; justify-content: space-between; text-align: left; }
  .metas-grafica-perfil { grid-column: auto; }
}

/* ---------- CAPA 2 · Tabla unificada de metas ---------- */
/* Item 6: la sección hereda el padding horizontal global de <section> (hasta 80px) y quedaba más
   angosta que la leyenda (<aside>) y la referencia (<div>). Se neutraliza: un solo ancho para
   todo el segmento (el gutter lo da el .container exterior). */
.metas-tabla-sec { padding: 0; margin-bottom: clamp(24px, 3.2vw, 36px); }
.mtab { width: 100%; border-collapse: separate; border-spacing: 0; table-layout: fixed; }
.mtab th, .mtab td { padding: 13px 10px; text-align: left; vertical-align: middle; border-top: 1px solid var(--line); }
.mtab thead th { background: var(--neutral-bg); border-top: 0; border-bottom: 1px solid var(--line-strong); font: 700 9.5px/1.3 var(--sans); letter-spacing: .045em; text-transform: uppercase; color: var(--muted-2); vertical-align: top; }
.mtab thead th:first-child { width: 13%; border-radius: var(--r-sm) 0 0; }
.mtab thead th:nth-child(2) { width: 11%; }
.mtab thead th:nth-child(3) { width: 13%; }
.mtab thead th:nth-child(4), .mtab thead th:nth-child(5) { width: 10%; }
.mtab thead th:nth-child(6) { width: 14%; }
.mtab thead th:last-child { width: 29%; border-radius: 0 var(--r-sm) 0 0; }
/* ITER4 punto 1: atribución del marco (HEARTS-OPS / HEARTS 2.0) como sub-línea, sin engordar la celda. */
.mtab-h-sub { display: block; margin-top: 2px; font: 700 8.5px var(--sans); letter-spacing: .05em; color: var(--accent); }
/* A3: la fila del paciente se ancla con barra lateral bordó + fondo accent tenue. */
.mtab-row[data-active="true"] { background: var(--accent-soft); }
.mtab-row[data-active="true"] > :first-child { box-shadow: inset 3px 0 var(--accent); }
.mtab-banda { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; font: 700 13.5px var(--sans); color: var(--ink); }
.lip-badge { display: inline-block; font: 700 9px var(--sans); letter-spacing: .04em; text-transform: uppercase; color: #fff; background: var(--accent); border-radius: var(--r-pill); padding: 2px 8px; }
/* A2: escala tipográfica — la cifra de meta manda; la unidad y el matiz van chicos y tenues. */
.mtab-num { font: 700 17px var(--sans); color: var(--ink); font-variant-numeric: tabular-nums; letter-spacing: -.01em; }
.mtab-riesgo { font: 650 13px var(--sans); color: var(--ink); font-variant-numeric: tabular-nums; }
.mtab-perfil { font: 600 12px var(--sans); }
.mtab-u { font: 500 10.5px var(--sans); color: var(--muted-2); }
.mtab-red50 { display: block; margin-top: 2px; font: 600 10.5px/1.35 var(--sans); color: var(--accent); }
.mtab-pa-opt { display: block; font: 500 10.5px var(--sans); color: var(--muted-2); }
.mtab-cond { font: 400 12px/1.4 var(--sans); color: var(--muted); }
.metas-tabla-nota { margin-top: 14px; }
@media (max-width: 1080px) {
  .mtab, .mtab tbody, .mtab tr, .mtab th, .mtab td { display: block; }
  .mtab thead { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
  .mtab tbody { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
  .mtab-row { min-width: 0; padding: 14px; border: 1px solid var(--line); border-left: 3px solid var(--line); border-radius: var(--r-sm); background: var(--surface); }
  .mtab-row[data-active="true"] { border-left-color: var(--accent); }
  .mtab-row[data-active="true"] > :first-child { box-shadow: none; }
  .mtab th, .mtab td { padding: 6px 0; border: 0; }
  .mtab-banda { margin-bottom: 4px; font-size: 15px; }
  .mtab td { display: grid; grid-template-columns: minmax(118px, 42%) minmax(0, 1fr); gap: 10px; align-items: baseline; }
  .mtab td::before { content: attr(data-label); font: 700 9px/1.35 var(--sans); letter-spacing: .05em; text-transform: uppercase; color: var(--muted-2); }
  .mtab-cond { padding-top: 9px !important; border-top: 1px dashed var(--line) !important; }
}
@media (max-width: 700px) {
  .mtab tbody { grid-template-columns: 1fr; }
}
@media (max-width: 430px) {
  .mtab td { grid-template-columns: 1fr; gap: 3px; }
}

/* ---------- CAPA 3 · Referencia plegada (acordeones exclusivos) ---------- */
.metas-ref { display: flex; flex-direction: column; gap: 8px; }
.metas-ref-lbl { font: 700 11px var(--sans); letter-spacing: .1em; text-transform: uppercase; color: var(--muted-2); margin: 8px 0 2px; }
.metas-acc { overflow: hidden; }
.metas-acc > summary { list-style: none; cursor: pointer; display: flex; align-items: center; gap: 12px; padding: 14px 18px; font: 600 14.5px var(--sans); color: var(--ink); }
.metas-acc > summary::-webkit-details-marker { display: none; }
.metas-acc > summary:hover { background: rgba(110, 37, 54, .03); }
.metas-acc > summary:focus-visible { outline: var(--focus); outline-offset: -3px; border-radius: var(--r-md); }
/* A3: marca numerada bordó por acordeón (ancla de acento, con moderación). */
.metas-acc-n { flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; border-radius: 50%; background: var(--accent-soft); color: var(--accent); border: 1px solid rgba(110, 37, 54, .25); font: 700 11px var(--sans); font-variant-numeric: tabular-nums; }
.metas-acc-t { font-weight: 600; color: var(--ink); }
.metas-acc-chev { flex-shrink: 0; margin-left: auto; color: var(--accent); transition: transform .22s ease; }
.metas-acc[open] > summary .metas-acc-chev { transform: rotate(180deg); }
/* A1: al abrir, la cabecera pasa a superficie tintada (nivel 3) y la marca se invierte. */
.metas-acc[open] > summary { background: var(--accent-soft); border-bottom: 1px solid var(--line); }
.metas-acc[open] > summary .metas-acc-n { background: var(--accent); color: #fff; border-color: var(--accent); }
.metas-acc-body { padding: 16px 18px 20px; }
.metas-acc-body > *:first-child { margin-top: 0; }
@media (prefers-reduced-motion: reduce) { .metas-acc-chev { transition: none; } }

/* Referencia interna reutilizada dentro de los acordeones */
.score-tabla { width: 100%; margin-top: 4px; border-collapse: separate; border-spacing: 0; table-layout: fixed; }
.score-tabla th, .score-tabla td { padding: 11px 10px; text-align: left; vertical-align: middle; border-bottom: 1px solid var(--line); }
.score-tabla thead th { background: var(--neutral-bg); border-bottom-color: var(--line-strong); font: 700 9.5px/1.3 var(--sans); letter-spacing: .04em; text-transform: uppercase; color: var(--muted-2); vertical-align: top; }
.score-tabla thead th:first-child { width: 14%; border-radius: var(--r-sm) 0 0; }
.score-tabla thead th:nth-child(2) { width: 24%; }
.score-tabla thead th:nth-child(3) { width: 18%; }
.score-tabla thead th:last-child { width: 44%; border-radius: 0 var(--r-sm) 0 0; }
#score-bandas .score-row:last-child > * { border-bottom: 0; }
.score-rango { font: 600 13.5px var(--sans); color: var(--ink); font-variant-numeric: tabular-nums; letter-spacing: -.01em; }
/* Estratificación = solo el pill de banda; el nivel vive en su propia columna. */
.score-cat, .score-nivel { min-width: 0; }
.score-interp { font: 400 12.5px/1.45 var(--sans); color: var(--muted); }
@media (max-width: 760px) {
  .score-tabla, .score-tabla tbody, .score-tabla tr, .score-tabla th, .score-tabla td { display: block; }
  .score-tabla thead { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
  .score-row { padding: 12px; border: 1px solid var(--line); border-radius: var(--r-sm); margin-bottom: 8px; }
  .score-tabla th, .score-tabla td { padding: 5px 0; border: 0; }
  .score-cat { margin-bottom: 3px; }
  .score-tabla td { display: grid; grid-template-columns: 118px minmax(0, 1fr); gap: 10px; align-items: baseline; }
  .score-tabla td::before { content: attr(data-label); font: 700 9px/1.35 var(--sans); letter-spacing: .05em; text-transform: uppercase; color: var(--muted-2); }
  .score-interp { padding-top: 8px !important; border-top: 1px dashed var(--line) !important; }
}
/* A5: variables del score como chips (bloque "qué mide y con qué se calcula"). */
.var-list { list-style: none; margin: 0 0 4px; padding: 0; display: flex; flex-wrap: wrap; gap: 7px; }
.var-list li { font: 600 12px var(--sans); color: var(--ink); background: var(--neutral-bg); border: 1px solid var(--line); border-radius: var(--r-pill); padding: 4px 12px; }
/* ITER4 punto 4: salvedades como bloque propio y ordenado — 2 columnas con aire, no 4 apretadas. */
.ind-list { list-style: none; margin: 4px 0 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(360px, 1fr)); gap: 10px 24px; }
.ind-list li { position: relative; padding-left: 20px; font: 400 12.5px/1.5 var(--sans); color: var(--ink); }
.ind-list li::before { content: ""; position: absolute; left: 3px; top: .55em; width: 6px; height: 6px; border-radius: 50%; background: var(--accent); }
@media (max-width: 760px) { .ind-list { grid-template-columns: 1fr; } }

/* Matriz HTA (referencia local, dentro del acordeón) */
.hta-scroll { margin-top: 12px; overflow-x: auto; -webkit-overflow-scrolling: touch; }
.hta-matrix { border-collapse: separate; border-spacing: 5px; width: 100%; min-width: 460px; }
.hta-matrix th, .hta-matrix td { padding: 8px 9px; text-align: center; border-radius: var(--r-sm); }
.hta-matrix thead th { font: 700 12px var(--sans); color: var(--ink); }
.hta-matrix thead th span { display: block; font: 500 9.5px var(--sans); color: var(--muted-2); margin-top: 2px; }
.hta-corner { background: transparent !important; }
/* Item 9 (ITER3): la columna de factores va con BORDE y fondo TRANSPARENTE (sin relleno). */
.hta-matrix tbody th { font: 700 12px/1.3 var(--sans); color: var(--ink); text-align: left; background: transparent; border: 1px solid var(--line-strong); }
/* Encabezados de columna (PA limítrofe / HTA 1 / HTA 2): tinte berry de severidad creciente, texto
   blanco centrado, sin dot. Ratios de blanco: h1 5,7 · h2 10,6 · h3 15,05. */
.hta-matrix thead th:nth-child(2) { background: var(--hta-h1); color: #fff; }
.hta-matrix thead th:nth-child(3) { background: var(--hta-h2); color: #fff; }
.hta-matrix thead th:nth-child(4) { background: var(--hta-h3); color: #fff; }
.hta-matrix thead th:not(.hta-corner) span { color: rgba(255, 255, 255, .85); }
/* Item 9 (ITER3): celdas de nivel RELLENAS con el color de estratificación, texto blanco centrado,
   sin dot. Ratios de blanco: Bajo 5,28 · Moderado 4,84 · Alto 5,93 · Muy alto 9,99. */
.hta-c { font: 700 12.5px var(--sans); color: #fff; text-align: center; border: 0; }
.hta-bajo { background: var(--strat-0); }
.hta-moderado { background: var(--strat-2); }
.hta-alto { background: var(--strat-3); }
.hta-muyalto { background: var(--strat-4); }
/* Hover de fila completa (compatible con celdas rellenas): leve realce que vincula factores↔niveles. */
.hta-matrix tbody tr:hover td { filter: brightness(1.06); }
.hta-matrix tbody tr:hover th { background: var(--accent-soft); }
/* Item 16: leyenda de siglas al pie de la matriz (definiciones tomadas del bloque de abreviaturas). */
.metas-siglas { margin-top: 12px; padding-top: 10px; border-top: 1px dashed var(--line-strong); }
/* Items 17/18: algoritmo y escalón como pasos numerados (badge de número + texto). */
.step-list { list-style: none; margin: 4px 0 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.step-list li { display: flex; align-items: flex-start; gap: 11px; }
.step-n { flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; border-radius: 50%; background: var(--accent); color: #fff; font: 700 11px var(--sans); font-variant-numeric: tabular-nums; margin-top: 1px; }
.step-tx { font: 400 12.5px/1.5 var(--sans); color: var(--ink); padding-top: 2px; }
.step-tx strong { color: var(--ink); font-weight: 700; }
.step-esc .step-n { background: var(--accent-soft); color: var(--accent); border: 1px solid rgba(110, 37, 54, .25); }

/* ITER4 punto 2: criterios de indicación de estatinas agrupados en tarjetas (condición vs laboratorio). */
.crit-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-top: 4px; }
.crit-card { background: var(--neutral-bg); border: 1px solid var(--line); border-radius: var(--r-sm); padding: 12px 14px; }
.crit-k { font: 700 10px var(--sans); letter-spacing: .05em; text-transform: uppercase; color: var(--muted-2); margin: 0 0 8px; }
.crit-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.crit-list li { position: relative; padding-left: 16px; font: 400 12.5px/1.4 var(--sans); color: var(--ink); }
.crit-list li::before { content: ""; position: absolute; left: 2px; top: .52em; width: 5px; height: 5px; border-radius: 50%; background: var(--accent); }
@media (max-width: 640px) { .crit-grid { grid-template-columns: 1fr; } }

/* Item 19: objetivos cardio-reno-metabólicos como tabla parámetro → objetivo, cifra jerarquizada. */
.obj-tabla { margin-top: 4px; display: grid; }
/* ITER4 punto 4: más aire por fila para que la tabla respire. */
.obj-row { display: grid; grid-template-columns: 1fr auto; gap: 14px; align-items: baseline; padding: 12px 12px; border-bottom: 1px solid var(--line); }
.obj-row:last-child { border-bottom: 0; }
.obj-head { background: var(--neutral-bg); border-radius: var(--r-sm); border-bottom: 0; font: 700 10px var(--sans); letter-spacing: .05em; text-transform: uppercase; color: var(--muted-2); }
.obj-head span { align-self: center; }
.obj-k { font: 500 13px var(--sans); color: var(--ink); }
.obj-v { font: 700 15px var(--sans); color: var(--ink); font-variant-numeric: tabular-nums; text-align: right; letter-spacing: -.01em; }
.obj-u { font: 500 11px var(--sans); color: var(--muted-2); }

/* Pie de fuentes (dentro del último acordeón) */
.metas-fuentes p { font: 400 11.5px/1.55 var(--sans); color: var(--muted-2); margin: 0 0 12px; }
.metas-fuentes p:last-child { margin-bottom: 0; }
.metas-fuentes strong { color: var(--accent); font-weight: 700; }
.metas-abrev { color: var(--muted-2); }

.back-link {
  display: inline-flex; align-items: center; gap: 8px; text-decoration: none;
  font: 600 13.5px var(--sans); color: var(--accent); margin-bottom: 18px;
}
.back-link:hover { text-decoration: underline; }

/* ---------- Tarjeta de estratificación (reutilizable) ---------- */
.estrat-card {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-lg); padding: clamp(22px, 2.6vw, 30px);
  box-shadow: var(--shadow-sm); align-self: start;
}
.estrat-head {
  display: flex; align-items: center; gap: 9px;
  font: 700 13px var(--sans); letter-spacing: .14em; text-transform: uppercase;
  color: var(--muted-2); margin-bottom: 14px;
}
.estrat-live { width: 8px; height: 8px; border-radius: 50%; background: #9be7b6; animation: blink 1.8s ease-in-out infinite; }
.estrat-fig { display: flex; align-items: baseline; gap: 14px; flex-wrap: wrap; margin-bottom: 16px; }
.estrat-pct { font: 500 clamp(40px, 7vw, 64px)/.9 var(--serif); color: var(--accent); }
.estrat-pct--na { font-size: clamp(26px, 4vw, 34px); color: var(--muted-2); }
.estrat-band { display: flex; flex-direction: column; gap: 4px; }
.estrat-pill { display: inline-flex; align-items: center; padding: 6px 14px; border-radius: var(--r-pill); font: 700 14px var(--sans); width: fit-content; }
.estrat-rango { font: 500 12px var(--mono); color: var(--muted-2); }
.estrat-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; border-bottom: 1px solid var(--line); padding: 8px 0; font: 600 13px var(--sans); color: var(--ink); }
.estrat-row span:last-child { font-weight: 500; color: var(--muted); text-align: right; }
.estrat-chip { display: flex; align-items: center; justify-content: space-between; gap: 10px; background: var(--accent-soft); border-radius: var(--r-md); padding: 12px 14px; margin-top: 14px; }
.estrat-disc { font: 400 11.5px/1.5 var(--sans); color: var(--muted-2); margin: 16px 0 0; }

/* ---------- IMC ---------- */
.imc-box { display: flex; align-items: center; justify-content: space-between; gap: 10px; background: var(--accent-soft); border-radius: var(--r-md); padding: 12px 16px; margin-bottom: 6px; }
.imc-box[data-empty="true"] { background: var(--neutral-bg); }

/* ---------- Encabezado h3 de secciones internas ---------- */
.h3 { color: var(--ink); }

/* =========================================================================
   Módulo Fuster-BEWAT + tarjeta de riesgo CV (consulta/inicial) — bewat.js
   ========================================================================= */
/* Encabezado del segmento COMPACTO: título en una línea a 1440 (font reducida),
   bajada mínima de una línea, poco aire vertical. El buscador queda debajo. */
/* padding-bottom alto: reserva para la barra fija inferior del CTA (se reduce en ≥1400,
   donde el CTA pasa a flotante lateral). */
#view-consulta section[data-subflow="inicial"] { padding-top: 36px; padding-bottom: 150px; }
#view-consulta section[data-subflow="inicial"] .container { max-width: 1180px; }
/* Encabezado como FILA de secuencia alineada a la IZQUIERDA: círculo de paso "1" +
   "Consulta inicial" (contexto, grande) → flecha → "Estratificación de riesgo" (dominante). */
.bw-sechead { max-width: none; margin-bottom: clamp(22px, 2.8vw, 32px); display: flex; align-items: center; gap: 10px; flex-wrap: wrap; row-gap: 8px; }
.bw-paso-num { flex-shrink: 0; width: 46px; height: 46px; border-radius: 50%; background: var(--accent); color: #fff; display: flex; align-items: center; justify-content: center; font: 500 22px var(--serif); box-shadow: 0 4px 14px rgba(110, 37, 54, .3); }
/* "Consulta inicial" al MISMO cuerpo que el título (pedido del director): co-título serif
   diferenciado por color (berry) y peso 500 para que la secuencia no compita en igualdad. */
.bw-sechead .step-tag { margin: 0; font: 500 var(--fs-segmento)/1.05 var(--serif); letter-spacing: -.025em; text-transform: none; color: var(--accent); }
/* Agrupación por proximidad: par [1 Consulta inicial] junto (gap 10) y flecha con aire
   propio (18px efectivos) marcando la secuencia hacia el título. */
.bw-sec-arrow { flex-shrink: 0; display: inline-flex; color: var(--muted); margin: 0 8px; }
.bw-sec-arrow svg { width: 34px; height: 34px; }   /* tinta ≈22px: ~60% de la cap de 31px de los co-títulos */
/* El PASO, subordinado al nombre del segmento. Antes compartían cuerpo exacto y la fila se
   leía como dos títulos peleando; ahora la flecha separa una identidad de su destino. */
.bw-sechead .h2 { font-size: var(--fs-segmento-paso); line-height: 1.1; letter-spacing: -.02em; margin: 0; color: var(--accent); }
/* Nivel 2 del header: → identidad del participante (o buscador). El salto es deliberado
   (unidad de dos líneas); la flecha 2, menor, arranca alineada bajo "Consulta inicial". */
.bw-sechead-brk { flex-basis: 100%; height: 0; }
.bw-sec-arrow2 { margin-left: 56px; }
.bw-sec-arrow2 svg { width: 24px; height: 24px; }
.bw-sechead .bw-buscar { margin: 0; flex: 1 1 300px; min-width: 260px; max-width: 420px; }
/* Identidad en el header: sin cajón — MISMA voz serif que los co-títulos, en tinta
   (dato del paciente), con el DNI en línea al lado del nombre. */
.bw-sechead .bw-part-id { display: flex; align-items: center; gap: 12px; width: auto; min-width: 0; margin: 0; padding: 0; text-align: left; background: none; border: 0; border-radius: 0; box-shadow: none; }
.bw-sechead .bw-part-id-txt { min-width: 0; display: flex; align-items: baseline; flex-wrap: wrap; gap: 2px 10px; }
/* METADATO, no co-título (D.2). Compartía cuerpo con el nombre del segmento: el nombre de la
   participante pesaba lo mismo que el acto clínico que se está haciendo. Sigue en serif y en
   tinta —es dato de la persona, no del sistema— pero en su lugar de la jerarquía. */
.bw-sechead .bw-part-id-n { font: 600 var(--fs-segmento-meta)/1.25 var(--serif); letter-spacing: -.01em; color: var(--ink); margin: 0; }
.bw-sechead .bw-part-id-dni { justify-content: flex-start; }
.bw-sechead .bw-part-id-dni::before { content: "·"; margin-right: 8px; color: var(--muted-2); }
.bw-sechead .bw-part-id > .bw-demo-tag { position: static; top: auto; left: auto; transform: none; order: 2; }
/*
 * Y EL CHIP DE VERSIÓN, IGUAL (PRACTICA-2 · C). En la ficha suelta va absoluto a la derecha,
 * anclado al cajón; en el ENCABEZADO ese cajón no existe —la identidad es una fila de piezas—
 * así que el chip caía encima del DNI. Visible a 1440 con el recorrido en una sola fila:
 * «DNI 30.111 V1 2», con el V1 tapando los dígitos del medio. Se lo trata como al chip demo,
 * que es su hermano y ya estaba resuelto: pieza más de la fila, sin posición propia.
 */
.bw-sechead .bw-part-id > .bw-ver-tag { position: static; top: auto; right: auto; transform: none; order: 2; }
/* `relative`, no `static`: el área táctil de la base es un pseudo absoluto
   (.bw-part-x::after, inset -8px → 46px). Con el botón estático ese pseudo se anclaba al ancestro
   posicionado más cercano —.bw-part-id, que conserva el `position: relative` de la base porque la
   regla de arriba no lo anula— y tapaba el chip de identidad entero: el hit-test sobre el NOMBRE y
   sobre el DNI devolvía este botón, así que clickear el nombre quitaba al participante en plena
   carga. Medido antes del fix: caja de hit 313,5 × 57,1 px sobre un botón visual de 23,7 × 30.
   Mismo caso y misma corrección que en el Paso 1 (c2169fa). `order: 3` no depende del position.
   Va además `flex-shrink: 0`: el flex del encabezado comprimía el botón de 30 a 23,7 px de ancho y
   dejaba el área efectiva en 39,7 × 46, por debajo del mínimo de 40. */
.bw-sechead .bw-part-x { position: relative; top: auto; right: auto; transform: none; order: 3; flex-shrink: 0; }
#view-consulta section[data-subflow="inicial"] .back-link { margin-bottom: 14px; }
@media (max-width: 560px) {
  .bw-sechead { gap: 11px; }
  .bw-paso-num { width: 36px; height: 36px; font-size: 17px; }
  .bw-sec-arrow { display: none; }        /* el título envuelve: la flecha horizontal pierde sentido */
  .bw-sechead .h2 { flex-basis: 100%; }   /* el título baja a su propia línea, mismo eje izquierdo */
}
/* Identidad del participante: CAJÓN protagonista que reemplaza al buscador. El ancho se
   ADAPTA al nombre (fit-content centrado, piso con masa escénica); contenido centrado con
   padding horizontal simétrico. La × es glifo liviano (disco solo en hover) con área táctil
   ampliada; el tag demo vive en la esquina opuesta y balancea el flanco de la ×. */
.bw-part-id { position: relative; width: fit-content; min-width: min(420px, 100%); max-width: 100%; margin: 0 auto; text-align: center; background: var(--surface); border: 1px solid var(--line-strong); border-radius: var(--r-lg); padding: 20px 74px; box-shadow: var(--shadow-md); }  /* 74px reserva el tag demo (izq) y la × (der) sin roce con nombres largos */
.bw-part-id-n { font: 600 clamp(var(--fs-h2), 1.9vw, 24px)/1.2 var(--serif); letter-spacing: -.01em; color: var(--ink); margin: 0 0 4px; overflow-wrap: break-word; }
.bw-part-id-dni { display: flex; align-items: center; justify-content: center; gap: 8px; font: 600 var(--fs-num) var(--mono); color: var(--muted-2); margin: 0; font-variant-numeric: tabular-nums; }
/* Tag demo: marca de muestra en la franja izquierda (espejo de la ×), fuera del flujo —
   no altera la alineación centrada del nombre/DNI. */
.bw-part-id > .bw-demo-tag { position: absolute; top: 50%; left: 10px; transform: translateY(-50%); }
.bw-part-x { position: absolute; top: 50%; right: 13px; transform: translateY(-50%); width: 30px; height: 30px; border-radius: 50%; background: none; color: var(--muted); font: 400 20px/1 var(--sans); display: inline-flex; align-items: center; justify-content: center; transition: background .15s ease, color .15s ease; }
.bw-part-x::after { content: ""; position: absolute; inset: -8px; border-radius: 50%; }  /* área táctil 46px */
.bw-part-x:hover { background: var(--accent-soft); color: var(--accent); }
@media (max-width: 560px) {
  .bw-part-id { padding: 16px 60px; min-width: 100%; }
  /* Sin hover en touch: la × lleva disco neutro permanente para ser descubrible */
  .bw-part-x { background: var(--neutral-bg); }
}

/* Lienzo del segmento: 3 COLUMNAS centradas y equilibradas (Fuster · HEARTS · tarjeta de
   riesgo). El CTA de cierre YA NO es una columna: vive flotante fuera del flujo.
   align-items:start es requisito del sticky de la tarjeta (no estirar). */
.bw-layout { display: grid; grid-template-columns: minmax(0, 2.07fr) minmax(280px, 1fr); gap: clamp(14px, 1.6vw, 22px); align-items: start; }
.bw-main { grid-column: 1; grid-row: 1; display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: clamp(14px, 1.6vw, 22px); align-items: stretch; }
.bw-rail-der { grid-column: 2; grid-row: 1; position: sticky; top: 72px; }

/* CTA de cierre — patrón por defecto (hasta 1399px, incluye mobile): BARRA FIJA inferior
   con material translúcido del sistema; no tapa contenido (la sección reserva el alto). */
.bw-rail-izq { position: fixed; left: 0; right: 0; bottom: 0; z-index: 50; display: flex; flex-direction: column-reverse; align-items: center; gap: 8px; padding: 10px clamp(16px, 4vw, 24px) calc(12px + env(safe-area-inset-bottom)); background: rgba(251, 247, 246, .9); backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px); border-top: 1px solid var(--line); }
.bw-rail-izq .bw-final-aviso { margin: 0; width: min(640px, 100%); }
/* CTA flotante lateral (≥1420): CÍRCULO flat pegado al borde izquierdo del viewport
   (24px), centrado vertical. La sección reserva la franja izquierda para que las 3
   columnas anchas no queden nunca debajo del círculo.
   top por calc, NO por transform: [data-reveal][data-in] pisa transform con (0,2,0). */
@media (min-width: 1420px) {
  .bw-rail-izq { left: 24px; right: auto; bottom: auto; top: calc(50% - 47px); width: 160px; display: block; padding: 0; background: none; backdrop-filter: none; -webkit-backdrop-filter: none; border-top: 0; }  /* mismo centro del área útil que la tarjeta */
  .bw-rail-izq .bw-final-aviso { margin-top: 12px; width: auto; }
  /*
   * ANCLADA CON TOPE, Y EN SU PROPIA COLUMNA. `sticky` no puede subir por encima de su posición
   * natural —que es lo que hacía la versión `fixed` y centrada—, pero a diferencia de `fixed`
   * VIVE EN EL FLUJO: ocupa una columna de la grilla. Las tres reglas de abajo son las que
   * pagaban el ancho del rail dos veces cuando estaba fuera del flujo, y hay que soltarlas:
   *
   *   · La grilla NO se pisa a una sola columna. Con una explícita y `.bw-rail-der` en
   *     `grid-area: 1 / 2`, el rail caía en una columna IMPLÍCITA (`auto`), y el `1fr` de la
   *     explícita se repartía lo que sobraba: `.bw-main` bajaba a 489 px, menos que los 582 que
   *     pide su `auto-fit` de dos columnas de 280, y Registro Fuster-BEWAT y Calculadora de
   *     Riesgo HEARTS-OPS se apilaban. Las tres tarjetas tienen que quedar EN PARALELO.
   *   · El `padding-right` deja de reservar los 386 px del rail: ese hueco ya lo ocupa el rail
   *     mismo dentro del contenedor.
   *   · Y el contenedor recupera su ancho, porque ahora tiene que albergar las TRES columnas y
   *     no dos.
   */
  .bw-rail-der { top: 72px; max-height: calc(100vh - 92px); overflow-y: auto; border-radius: var(--r-lg); }
  /*
   * ══ EL LIENZO OCUPA EL HUECO REAL (PRACTICA-1 · E.1 · E.2) ══════════════════════════
   *
   * La franja izquierda sigue reservada para el círculo del CTA: 24 (gutter) + 160 (diámetro)
   * + 32 (aire) = 216. Ese 32 NO es decorativo — es la mitad del criterio de centrado, ver
   * abajo.
   *
   * A la derecha el gutter pasa de 24 a 26 px, que es el que le queda al encabezado una vez
   * que los dos cierran en el mismo eje. Y el contenedor deja de toparse en 1180: adentro del
   * área ya recortada por los dos gutters, limitarlo otra vez dejaba 10 px muertos de cada
   * lado y desalineaba la tarjeta bordó del encabezado. El tope de medida de línea no lo pone
   * este contenedor sino el ancho de cada tarjeta, que sigue acotado por la grilla.
   */
  #view-consulta section[data-subflow="inicial"] { padding-bottom: 56px; padding-left: 216px; padding-right: 26px; }
  #view-consulta section[data-subflow="inicial"] .container { max-width: none; }
  /*
   * CENTRADO ÓPTICO EN EL HUECO, NO EN EL VIEWPORT (E.2). El hueco real es el que queda entre
   * el borde derecho del botón flotante y el borde izquierdo de la tarjeta bordó. Para que las
   * dos calculadoras queden centradas ahí, el aire a su izquierda (216 - 184 = 32 px, el que
   * las separa del botón) tiene que ser IGUAL al aire a su derecha (el gap de la grilla). Por
   * eso el gap del lienzo pasa a 32 px: no es un espaciado elegido por gusto, es la condición
   * de centrado escrita como regla. Medido a 1440: 32 de un lado y 32 del otro, desviación 0.
   *
   * Y LAS CALCULADORAS SE ENSANCHAN. La proporción pasa de 2.07fr a 2.7fr: el rail de la
   * derecha cede lo que las dos tarjetas de trabajo ganan. Medido a 1440: 379,4 -> 414,4 px
   * por tarjeta (+9,2 %, dentro del 8-12 % pedido), y la tarjeta bordó baja de 377,2 a 315,6 —
   * más angosta que antes pero por encima de los 300 px de piso, y por encima de los 330 con
   * los que ya se renderiza sin romperse en un teléfono.
   */
  .bw-layout { gap: 32px; grid-template-columns: minmax(0, 2.7fr) minmax(300px, 1fr); }
  /*
   * ══ EL HEADER YA NO SE APRIETA EN UNA LÍNEA (PRACTICA-1 · D) ═════════════════════════
   *
   * Acá estaba la causa exacta de que la Práctica de Enfermería se leyera más chica que el
   * Doppler. Para que el recorrido entero —[1] Práctica de Enfermería → Estratificación de
   * Riesgo → participante · DNI · ✕ · versión— entrara en UN renglón, este bloque bajaba las
   * tres voces serif a `font-size: 23px`, o sea a la MITAD del título del Doppler, y encima
   * escondía el separador de renglón (`.bw-sechead-brk`) y achicaba el numeral y las flechas.
   * Y lo hacía sólo a partir de 1420 px: en el ancho en que se mira la aplicación en la
   * consulta, el segmento se veía degradado; en un monitor más chico, no.
   *
   * SE SUELTA LA LÍNEA. El header vuelve a la estructura de DOS renglones que el propio diseño
   * ya tenía escrita en la base (`.bw-sechead-brk` con `flex-basis: 100%` y la flecha 2 con su
   * sangría de 56 px): identidad del segmento arriba, participante abajo. Es el punto de
   * quiebre pedido en D.2, y no hay que inventarlo — estaba, lo tapaba el `display: none`.
   * Con eso las tres voces recuperan la escala de segmento y la jerarquía interna queda:
   * segmento 44 · paso 30 · participante 18 · DNI 11,5.
   *
   * Se conserva el corrimiento de -168px, que es lo que alinea el header con la franja
   * izquierda reservada para el CTA flotante.
   */
  /*
   * EL HEADER TERMINA DONDE TERMINA LA TARJETA BORDÓ (PRACTICA-1 · E.1/E.4). Antes se
   * extendía 8 px MÁS a la derecha que el contenedor (`100% + 176` contra un corrimiento de
   * -168), así que el borde derecho del encabezado y el de la columna de estratificación caían
   * en dos ejes distintos por una diferencia demasiado chica para leerse como intención y
   * demasiado grande para leerse como alineación. Ahora los dos cierran en el mismo eje.
   */
  .bw-sechead { gap: 10px; width: calc(100% + 168px); margin-left: -168px; }
  #view-consulta section[data-subflow="inicial"] .back-link { margin-left: -168px; }
  .bw-sechead .bw-part-id { gap: 10px; min-width: 0; flex-shrink: 1; }
  .bw-sechead .bw-part-id-dni { font-size: 11.5px; }
}

/*
 * ══ EL RECORRIDO ENTRA EN UNA FILA DESDE 1280 (PRACTICA-2 · C) ═════════════════════════
 *
 * QUÉ LO PARTÍA, medido a 1280 con la identidad visible:
 *   fin del primer renglón   x = 856
 *   borde derecho del header x = 1203
 *   ESPACIO LIBRE            347 px
 *   identidad, contenido real  271 px con un nombre corto · 432 px con uno largo
 *
 * O sea que con 347 px libres el nombre bajaba igual, y no por falta de lugar. Lo bajaban
 * DOS cosas, las dos de la etapa en que el header se diseñó a dos niveles:
 *
 *   1. `.bw-sechead-brk`, un separador con `flex-basis: 100%` que fuerza el corte SIEMPRE,
 *      entre o no entre.
 *   2. `.bw-sechead .bw-buscar`, con `flex: 1 1 300px` y `max-width: 420px`: el contenedor de
 *      la identidad pedía 300 px de base y crecía a 420 aunque el contenido midiera 271.
 *
 * Se sueltan las dos y se recupera el ancho que la flecha de segundo nivel gastaba en su
 * sangría (56 px + una flecha más chica), que era otra marca de la estructura de dos niveles.
 *
 * PUNTO DE QUIEBRE (C.2): por debajo de 1280 vuelve el comportamiento a dos renglones, que es
 * el que ya estaba y funciona. Por ARRIBA de 1280 el header envuelve SOLO SI NO ENTRA — un
 * nombre muy largo baja porque no cabe, no porque un separador lo mande. El corte deja de ser
 * una decisión de layout y pasa a ser una consecuencia de la medida, que es lo que se pedía.
 *
 * NO SE BAJA EL TAMAÑO DEL SEGMENTO: `--fs-segmento` queda como está. Lo que se recupera es
 * espacio que se estaba gastando en estructura, no en texto.
 */
@media (min-width: 1280px) {
  .bw-sechead-brk { display: none; }
  /* La flecha 2 deja de marcar un segundo nivel y pasa a ser un separador igual que la primera. */
  .bw-sec-arrow2 { margin-left: 0; }
  .bw-sec-arrow2 svg { width: 34px; height: 34px; }
  /* La identidad ocupa lo que mide, no un ancho reservado. */
  .bw-sechead .bw-buscar { flex: 0 1 auto; min-width: 0; max-width: none; }
  /* El INPUT de búsqueda sí conserva un ancho cómodo: sin participante, es el protagonista. */
  .bw-sechead .bw-buscar-row { width: 420px; max-width: 100%; }
}

/*
 * ══ 1280–1419: DONDE FALTAN LOS ÚLTIMOS 60 PX ══════════════════════════════════════════
 *
 * A partir de 1420 el header gana 168 px por el corrimiento que lo alinea con la franja del
 * CTA flotante, y ahí entra todo con holgura: medido a 1440, un nombre largo —«Rodríguez
 * Fernández, María Elena»— cierra en 1398 contra un borde de 1414.
 *
 * Entre 1280 y 1419 ese ensanche todavía no existe, y la cuenta quedaba 60 px corta: el
 * recorrido cerraba en 900 y la identidad pedía 353 sobre un borde de 1203. Los 60 px salen de
 * donde sobran, que son los SEPARADORES y no el texto:
 *   · las dos flechas bajan de 34 a 26 px y sus márgenes de 8 a 2  →  40 px
 *   · el DNI toma el mismo cuerpo que ya usa arriba de 1420        →  ~10 px
 *   · la identidad junta sus piezas de 12 a 8 de separación        →  ~12 px
 *
 * El tamaño del SEGMENTO no se toca, que es la condición del pedido: `--fs-segmento` queda
 * igual y lo que cede es la estructura alrededor.
 */
@media (min-width: 1280px) and (max-width: 1419.98px) {
  .bw-sechead { column-gap: 6px; }
  .bw-paso-num { width: 40px; height: 40px; font-size: 19px; }
  .bw-sec-arrow { margin: 0 2px; }
  .bw-sec-arrow svg,
  .bw-sec-arrow2 svg { width: 26px; height: 26px; }
  .bw-sechead .bw-part-id { gap: 8px; }
  .bw-sechead .bw-part-id-dni { font-size: 11.5px; }
}
/* Con la barra fija activa, el footer necesita despeje para no quedar tapado */
@media (max-width: 1419.98px) {
  main:has(section[data-subflow="inicial"]:not([hidden])) + footer,
  body:has(section[data-subflow="inicial"]:not([hidden])) footer { padding-bottom: 116px; }
}
/* 01 y 02 terminan a la MISMA altura: tarjetas estiradas y bloques internos distribuidos
   (la columna más corta reparte su sobrante entre bloques — espacios equilibrados). */
.bw-main .bw-sec { display: flex; flex-direction: column; justify-content: space-between; }
/* Columnas centrales angostas por los rails: el botón de referencia baja a su propia fila
   (título en una línea) y el laboratorio pasa a bloques apilados de ancho completo. */
.bw-main .bw-head .bw-ref-btn { justify-self: start; }
.bw-main .bw-lab-grid { grid-template-columns: 1fr; }
/* Headers 01/02 jerarquizados y PAREJOS: título un punto arriba (el espacio del numeral
   eliminado lo absorbe el texto) y botones de referencia anclados al pie, misma altura. */
/*
 * D.4 — LAS DOS TARJETAS SE LEEN COMO PAR, Y MÁS FUERTE. Registro Fuster-BEWAT y Calculadora
 * de Riesgo HEARTS-OPS son hermanas: misma regla para las dos, sin excepciones por tarjeta.
 * El título sube de 23 px fijos a una escala fluida, y el subtítulo lo acompaña.
 * EL SALTO SE MANTIENE JERÁRQUICO: 27/15,5 = 1,74 en el tope y 23/14 = 1,64 en el piso — el
 * subtítulo crece MENOS que el título a propósito, porque si crecen igual la relación se
 * aplana y las dos líneas empiezan a competir.
 */
.bw-main .bw-title { font-size: clamp(23px, 1.9vw, 27px); }
.bw-title .bw-ast { font-size: .6em; vertical-align: super; }   /* marcador de nota, no co-título */
/* G-11 · Los del CUERPO (PAS, colesterol, diabetes, tabaquismo) quedaban a 13 px sobre la
   linea de base, compitiendo con el rotulo en vez de remitir a la nota al pie. Son
   aria-hidden, asi que AA no los alcanza: es jerarquia, no accesibilidad. */
.bw-sec .field-label .bw-ast,
.bw-sec .binary-field-row__label .bw-ast { font-size: .68em; vertical-align: super; }
@media (min-width: 1181px) {
  .bw-main .bw-head { grid-template-rows: 1fr auto; min-height: 178px; }
  .bw-main .bw-head .bw-ref-btn { align-self: end; }
}

/* Despegue figura-fondo: la sección es sec-soft (--accent-soft) y las tarjetas blancas
   llevan borde firme + sombra del sistema. */
.bw-sec { border-color: var(--line-strong); box-shadow: var(--shadow-sm); }

/* Bloques con peso propio para cada factor/campo (no filas sueltas). */
.bw-bloque { background: var(--bg); border: 1px solid var(--line); border-radius: var(--r-md); padding: 14px 16px; }
.bw-clinical-card { display: flex; flex-direction: column; gap: 12px; }
.clinical-card__title {
  margin: 0; font: 700 var(--fs-body)/1.3 var(--sans); color: var(--accent);
  letter-spacing: -.005em;
}
.diabetes-binary-grid {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px;
}
.binary-clinical-cell {
  min-width: 0; min-height: 102px; display: flex; flex-direction: column;
  align-items: flex-start; justify-content: space-between; gap: 10px;
  padding: 11px; border: 1px solid var(--line); border-radius: var(--r-sm);
  background: var(--surface);
}
.conditions-binary-list { display: flex; flex-direction: column; }
.conditions-binary-list .binary-field-row { margin: 0; padding: 9px 0; }
.conditions-binary-list .binary-field-row + .binary-field-row { border-top: 1px solid var(--line); }
.clinical-provenance-slot:empty { display: none; }
.clinical-card-divider { height: 1px; margin: 11px 0 12px; background: var(--line); }
.bw-lipid-card .binary-field-row { margin-bottom: 0; }

/* Encabezado de sección: BANDA bordó con degradado oblicuo (claro → oscuro), texto blanco.
   Título y subtítulo en negrita; botón de referencia en versión ghost sobre el bordó. */
.bw-head { display: grid; grid-template-columns: 1fr; align-items: start; row-gap: 12px; margin-bottom: 20px; background: linear-gradient(135deg, var(--accent) 0%, var(--berry-panel) 55%, var(--accent-deep) 100%); border-radius: var(--r-md); padding: 18px 18px 16px; box-shadow: inset 0 1px 0 rgba(255, 255, 255, .12), var(--shadow-sm); }
.bw-head .bw-title { color: #fff; font-weight: 700; }
.bw-head .bw-ast { color: rgba(255, 255, 255, .9); }
.bw-title { font: 600 var(--fs-h2)/1.15 var(--serif); letter-spacing: -.01em; color: var(--ink); margin: 2px 0 0; }
/* Prefijo .bw-head-txt: gana al `.card p` global (0,1,1) que pisaba estos font */
.bw-head-txt .bw-sub { font: 600 clamp(14px, 1.05vw, 15.5px)/1.5 var(--sans); color: rgba(255, 255, 255, .88); margin: 7px 0 0; }
.bw-ast { color: var(--accent); font-weight: 700; }
.bw-ref-btn { display: inline-flex; align-items: center; gap: 7px; font: 600 var(--fs-label) var(--sans); color: var(--accent); background: var(--surface); border: 1px solid rgba(110, 37, 54, .25); border-radius: var(--r-pill); padding: 8px 13px; white-space: nowrap; transition: background .15s ease; }
.bw-ref-btn:hover { background: var(--accent-soft); }
/* Versión ghost del botón de referencia sobre la banda bordó del header */
.bw-head .bw-ref-btn { background: rgba(255, 255, 255, .12); border-color: rgba(255, 255, 255, .38); color: #fff; }
.bw-head .bw-ref-btn:hover { background: rgba(255, 255, 255, .24); }
.bw-head :focus-visible { outline-color: #fff; }   /* el anillo berry global es invisible sobre la banda */

/* Factores B·E·W·A·T: cada uno como BLOQUE contenido con peso propio. */
.bw-factor { background: var(--bg); border: 1px solid var(--line); border-radius: var(--r-md); padding: 14px 16px 12px; margin-bottom: 12px; }
.bw-factor:last-of-type { margin-bottom: 0; }
.bw-factor-head { display: flex; align-items: center; gap: 11px; margin-bottom: 11px; }
.bw-chip { flex-shrink: 0; width: 30px; height: 30px; border-radius: 9px; background: var(--accent); color: #fff; display: flex; align-items: center; justify-content: center; font: 700 14px var(--sans); }
.bw-factor-titulo { flex: 1; font: 600 var(--fs-h3) var(--sans); color: var(--accent); letter-spacing: -.01em; }
/* Labels y select del segmento sobre la escala consolidada */
.bw-sec .field-label { font: 500 var(--fs-label) var(--sans); }
.bw-select { font: 400 var(--fs-body)/1.5 var(--sans); }
/* Campos HEARTS con el mismo peso de bloque que los factores. */
.bw-sec > .field:not(.bw-lab-grid) { background: var(--bg); border: 1px solid var(--line); border-radius: var(--r-md); padding: 14px 16px; margin-bottom: 12px; }
.bw-sec .bw-lab-grid { margin-bottom: 12px; }
.bw-sec .bw-lab { background: var(--surface); }
.bw-sec .bw-lab-score { background: var(--accent-soft); }
.bw-badge { flex-shrink: 0; font: 600 var(--fs-num) var(--mono); padding: 5px 11px; border-radius: var(--r-pill); background: var(--band-0); color: #fff; min-width: 52px; text-align: center; font-variant-numeric: tabular-nums; }
.bw-select { margin-bottom: 4px; padding-right: 28px; }

/* ══ CONTROL BINARIO COMPARTIDO · No / Sí ═══════════════════════════════════════════════
   El grupo conserva el estado histórico ausente sin fabricar un No: `data-value="unset"`
   mantiene ambas palabras visibles y ninguna activa. Los tres tratamientos nacen en false;
   diagnóstico, ERC y ECV pueden seguir ausentes hasta que se respondan. */
.binary-field-row {
  display: flex; align-items: center; justify-content: space-between; gap: 14px;
  min-width: 0; margin-bottom: 10px;
}
.binary-field-row:last-child { margin-bottom: 0; }
.binary-field-row__label {
  min-width: 0; font: 500 var(--fs-label)/1.4 var(--sans); color: #3a2a2e;
}
.binary-switch {
  width: 116px; height: 38px; flex: 0 0 auto; display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 2px; padding: 3px;
  border: 1px solid var(--line-strong); border-radius: 999px;
  background: #f2eeee;
}
.binary-switch__option {
  min-width: 0; border: 0; border-radius: 999px; padding: 0 8px;
  background: transparent; color: var(--muted-2); cursor: pointer;
  font: 700 12px/1 var(--sans); text-align: center;
  transition: background-color .16s ease, color .16s ease, box-shadow .16s ease;
}
.binary-switch[data-value="false"] .binary-switch__option--no {
  background: #74666a; color: #fff; box-shadow: 0 1px 2px rgba(42, 26, 30, .16);
}
.binary-switch[data-value="true"] .binary-switch__option--yes {
  background: var(--accent); color: #fff; box-shadow: 0 1px 2px rgba(42, 26, 30, .2);
}
.binary-switch[data-value="unset"] { border-style: dashed; background: var(--neutral-bg); }
.binary-switch[data-value="unset"] .binary-switch__option { color: var(--neutral-fg); }
.binary-switch__option:focus-visible { outline: var(--focus); outline-offset: 3px; }
.binary-switch[aria-disabled="true"] { opacity: .62; }
.binary-switch__option:disabled { cursor: not-allowed; }
@media (prefers-reduced-motion: reduce) {
  .binary-switch__option { transition: none; }
}

/* ══ PARÁMETRO DERIVADO (A.1) ═══════════════════════════════════════════════════════════
   Tabaquismo entra a la carta OMS pero NO se edita en la calculadora: se captura y se corrige
   en el ítem T del Fuster-BEWAT. Tiene que verse como lo que es —un valor traído— y no puede
   prometer una edición que no existe.
   Cómo lo dice el diseño, sin depender del color solo:
     · superficie más apagada que la de un campo editable (--neutral-bg contra --bg),
     · filo bordó a la izquierda: marca de "esto viene de otro lado", el mismo gesto que ya
       usan las notas de procedencia del segmento,
     · el valor en sans y NO en la mono berry de .field-val, que en esta pantalla significa
       "cifra que estás manejando vos" (edad, PAS),
     · y una leyenda que dice de dónde sale y cuál es la regla.
   No lleva cursor de texto ni área clicable: no hay nada que tocar acá. */
.bw-sec > .field.bw-derivado { background: var(--neutral-bg); border-left: 3px solid var(--accent); }
.bw-derivado .field-row { margin-bottom: 0; align-items: center; gap: 12px; }
.bw-derivado .field-label { margin-bottom: 0; }
.bw-derivado-v {
  font: 600 var(--fs-h3) var(--sans); color: var(--accent); letter-spacing: -.01em;
  text-align: right; white-space: nowrap;
}
/* Sin dato: el mismo apagado que cualquier parámetro faltante. No se lee como "No". */
.bw-derivado-v[data-estado="pendiente"] { color: var(--muted-2); font-weight: 500; }
.bw-derivado .bw-derivado-nota {
  margin-top: 8px; font: 400 var(--fs-caption)/1.5 var(--sans); color: var(--muted);
  letter-spacing: 0; text-transform: none;
}

/*
 * ══ TOPE DE MEDIDA DE LÍNEA (PRACTICA-1 · E.2) ══════════════════════════════════════════
 *
 * Al soltar el ancho del lienzo, las dos tarjetas crecen con la pantalla: medido, 414,4 px por
 * tarjeta a 1440 y 589,6 a 1920. Para los CONTROLES eso está bien —un select más ancho se lee
 * igual—, pero la PROSA de la tarjeta se estiraría a ~85 caracteres por renglón, que está muy
 * por encima de los 45-75 que se leen cómodos, y el ojo se pierde al volver al margen.
 *
 * Se acota el texto, no el layout: así no aparece espacio muerto en pantallas grandes y el
 * único elemento que deja de crecer es el que no tenía por qué crecer.
 */
.bw-derivado-nota,
.bw-def p,
.bw-fuente { max-width: 62ch; }
.bw-derivado-nota strong { font-weight: 600; color: var(--muted-2); }

/* Aviso de tope B (mismo par ámbar AA de los avisos del sitio) */
.bw-factor .bw-efecto { margin: 4px 0 2px; padding: 8px 12px; border-radius: var(--r-sm); background: #fff8e6; border: 1px solid #e6c200; color: #6b4e00; font: 500 var(--fs-label)/1.5 var(--sans); }

/* Tooltip desplegable de definición */
.bw-def { margin-top: 4px; }
.bw-def summary { cursor: pointer; font: 600 var(--fs-caption) var(--sans); letter-spacing: var(--ls-caption); text-transform: uppercase; color: var(--muted-2); text-decoration: underline dotted; text-underline-offset: 3px; list-style: none; width: fit-content; }
.bw-def summary::-webkit-details-marker { display: none; }
.bw-def[open] summary { color: var(--accent); }
.bw-def p { margin: 7px 0 0; padding: 10px 12px; background: var(--accent-soft); border-radius: var(--r-sm); font: 400 var(--fs-body)/1.55 var(--sans); color: var(--ink); }

/* Laboratorio: colesterol total (entra al score) + C-LDL (meta), diferenciados lado a lado */
.bw-lab-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
/* G-04 · EJE DE TEXTO UNICO. El eje de un bloque es borde-izq + padding-izq, y en esta
   tarjeta daba 19 (factores), 17 (colesterol), 15 (C-LDL) y 16 (casillas): cuatro margenes
   distintos en una columna de 414 px. Se igualan en 19. El C-LDL no tiene barra de estado
   —no es campo obligatorio— asi que compensa el pixel que le falta con aire. */
.bw-lab { border: 1px solid var(--line); border-radius: var(--r-md); padding: 12px 16px 10px; }
.bw-sec .bw-lab:not([data-campo]) { padding-left: 18px; }
.bw-lab-score { background: var(--accent-soft); border-color: rgba(110, 37, 54, .22); }
.bw-lab .bw-lab-nota { margin: 6px 0 0; font: 600 var(--fs-caption) var(--sans); letter-spacing: var(--ls-caption); text-transform: uppercase; color: var(--muted-2); }
/* G-12 · "Entra al score de riesgo" iba en bordo dentro de un bloque que YA tiene superficie
   --accent-soft, borde bordo y asterisco bordo: cuatro marcas para una sola idea. La nota
   hereda --muted-2, igual que su hermana del C-LDL, y las dos quedan como par tipografico.
   Contraste sobre --accent-soft: 9,31 -> 5,03:1, AA con margen. */

/* ---------- Tarjeta de riesgo del participante (berry, panel vertical de rail) ----------
   De arriba a abajo: participante · Fuster-BEWAT con parámetros · HEARTS-OPS con parámetros. */
/* Borde superior CREMA: la misma pieza de color que el botón de avanzar, para que la paleta
   institucional se lea como un sistema y no como dos decisiones sueltas. */
.rcv-card { background: var(--berry-panel); color: #fff; border-radius: var(--r-lg); padding: clamp(19px, 1.5vw, 20px); box-shadow: var(--shadow-accent); border-top: 4px solid var(--crema); }
/* Divisor de sección MARCADO: la estructura nombre / BEWAT / HEARTS se lee de un vistazo */
.rcv-part { border-bottom: 2px solid rgba(255, 255, 255, .32); padding-bottom: 10px; margin-bottom: 11px; }
/* Encabezado en UNA línea que llena el ancho de la tarjeta (tracking calibrado + nowrap) */
.rcv-part-k { font: 600 13px var(--sans); letter-spacing: .155em; text-transform: uppercase; color: rgba(255, 255, 255, .62); margin: 0 0 5px; white-space: nowrap; }
/* El nombre es el texto MÁS GRANDE de la tarjeta (por encima de las pills de 23px). */
.rcv-part-n { min-width: 0; font: 600 24px/1.2 var(--serif); letter-spacing: -.015em; color: #fff; margin: 0; }
.rcv-bloque { min-width: 0; }
/* Separación clara entre el bloque BEWAT y el bloque HEARTS: más aire + divisor firme. */
.rcv-bloque + .rcv-bloque { margin-top: 13px; padding-top: 13px; border-top: 2px solid rgba(255, 255, 255, .32); }
/* Jerarquía en 3 niveles: TÍTULO DE BLOQUE (sistema comparado, blanco pleno) >
   métrica + VALOR EN PILL SEMÁNTICA (color de la banda del motor) > lista de parámetros. */
.rcv-brand { font: 700 19px var(--sans); letter-spacing: -.01em; color: #fff; margin: 0 0 6px; }
/* Rótulo de métrica con más presencia (mismo cuerpo en ambos bloques) */
.rcv-etq { font: 600 16px var(--sans); color: rgba(255, 255, 255, .85); margin: 0 0 6px; }
/* Valor protagonista como PILL con el color de su categoría (bewat.js setea bg/fg con
   las bandas ratificadas del motor; pendiente = gris neutro). */
.rcv-valor { display: inline-flex; align-items: center; font: 500 23px/1.2 var(--serif); letter-spacing: -.01em; margin: 0 0 5px; padding: 4px 17px 5px; border-radius: var(--r-pill); background: rgba(255, 255, 255, .14); color: rgba(255, 255, 255, .8); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .12); }
.rcv-sop { font: 500 var(--fs-label) var(--sans); color: rgba(255, 255, 255, .72); margin: 0; font-variant-numeric: tabular-nums; }
/* Listas de parámetros: claramente secundarias — label sans + cifra mono tabular a la derecha. */
.rcv-params { list-style: none; margin: 7px 0 0; padding: 0; }
.rcv-params li { display: flex; align-items: baseline; gap: 8px; padding: 3.5px 0; border-bottom: 1px solid rgba(255, 255, 255, .10); }
.rcv-params li:last-child { border-bottom: 0; padding-bottom: 0; }
.rcv-p-dot { flex-shrink: 0; align-self: center; width: 8px; height: 8px; border-radius: 50%; }
.rcv-p-n { flex: 1; min-width: 0; font: 500 var(--fs-label) var(--sans); color: rgba(255, 255, 255, .6); }
.rcv-p-v { font: 600 var(--fs-num) var(--mono); color: rgba(255, 255, 255, .85); white-space: nowrap; text-align: right; font-variant-numeric: tabular-nums; }
.rcv-p-v .rcv-u { display: inline-block; width: 24px; text-align: left; margin-left: 5px; }
.rcv-trat { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 12px; }
.rcv-trat-k { font: 600 var(--fs-caption) var(--sans); letter-spacing: var(--ls-caption); text-transform: uppercase; color: rgba(255, 255, 255, .62); }
.rcv-chips { display: inline-flex; gap: 7px; flex-wrap: wrap; }
.rcv-chip { font: 700 12px var(--sans); padding: 5px 12px; border-radius: var(--r-pill); background: rgba(255, 255, 255, .14); color: #fff; }

/* ---------- Emergentes de referencia (overlay: no desplazan el contenido) ---------- */
.bw-backdrop { position: fixed; inset: 0; z-index: 90; background: rgba(42, 26, 30, .45); backdrop-filter: blur(2px); }
.bw-modal { position: fixed; z-index: 95; top: 50%; left: 50%; transform: translate(-50%, -50%); width: min(92vw, 660px); max-height: 84vh; overflow: auto; background: var(--surface); border: 1px solid var(--accent); border-radius: var(--r-lg); box-shadow: var(--shadow-md); }
.bw-modal-head { position: sticky; top: 0; display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 16px 20px; background: var(--accent); color: #fff; }
.bw-modal-head h3 { font: 600 17px var(--serif); color: #fff; margin: 0; letter-spacing: 0; }
.bw-x { flex-shrink: 0; width: 32px; height: 32px; border-radius: 50%; background: rgba(255, 255, 255, .14); color: #fff; font: 400 20px/1 var(--sans); display: flex; align-items: center; justify-content: center; }
/*
 * G-07 — LA × DEL EMERGENTE TENÍA FOCO INVISIBLE. El encabezado del modal es `--accent` y el
 * anillo global también: bordó sobre bordó, 1,00:1. Y es el PRIMER foco del emergente, porque
 * al abrirlo el módulo manda el foco ahí. Mismo criterio que ya aplica `.bw-head :focus-visible`
 * unas líneas más arriba para la otra banda bordó del segmento.
 */
.bw-modal-head :focus-visible { outline-color: #fff; }
.bw-x:hover { background: rgba(255, 255, 255, .26); }
.bw-modal-body { padding: 18px 20px 20px; }
.bw-tabla { width: 100%; border-collapse: collapse; }
.bw-tabla th, .bw-tabla td { padding: 9px 10px; text-align: left; font: 400 12.5px/1.4 var(--sans); color: var(--ink); border-bottom: 1px solid var(--line); }
.bw-tabla thead th { font: 700 11px var(--sans); letter-spacing: .06em; text-transform: uppercase; color: var(--muted-2); white-space: nowrap; }
.bw-tabla tbody th { font: 700 12.5px var(--sans); color: var(--accent); }
.bw-tabla .bw-na { color: var(--muted-2); }
.bw-dot { display: inline-block; width: 10px; height: 10px; border-radius: 50%; margin-right: 6px; vertical-align: middle; }
.bw-p3 { background: var(--band-0); } .bw-p2 { background: var(--band-1); } .bw-p1 { background: var(--band-2); } .bw-p0 { background: var(--band-3); }
.bw-bandas { list-style: none; margin: 0 0 14px; padding: 0; }
.bw-bandas li { display: flex; align-items: center; gap: 10px; padding: 10px 2px; border-bottom: 1px solid var(--line); font: 600 14px var(--sans); color: var(--ink); }
.bw-bandas li:last-child { border-bottom: 0; }
.bw-banda-rango { margin-left: auto; font: 600 13px var(--mono); color: var(--muted-2); }
.bw-fuente, .card .bw-fuente { margin: 12px 0 0; font: 400 var(--fs-caption)/1.55 var(--sans); color: var(--muted-2); }
/* G-05 · La nota de los asteriscos tenia 12 px arriba y 0 abajo, asi que por proximidad se
   leia como bajada del bloque siguiente —"Antecedentes de alto riesgo"—, que es justamente
   el unico que NO lleva asterisco porque no entra al score. Se invierte el aire: pegada a
   lo que anota, separada de lo que no. */
.bw-sec > .bw-fuente { margin: 4px 0 16px; }

/* ---------- Buscador de participantes (demo) ---------- */
/* Primera acción del médico: campo protagonista, CENTRADO en el eje de la página. */
.bw-buscar { position: relative; max-width: 620px; margin: 0 auto clamp(24px, 3vw, 36px); }
.bw-buscar-row { display: flex; align-items: center; gap: 11px; background: var(--surface); border: 1px solid var(--line-strong); border-radius: var(--r-pill); padding: 14px 20px; box-shadow: var(--shadow-md); }
.bw-buscar-ic { flex-shrink: 0; color: var(--accent); display: inline-flex; }
.bw-buscar-input { flex: 1; border: none; outline: none; background: none; font: 400 15px var(--sans); color: var(--ink); min-width: 0; }
.bw-buscar-input::placeholder { color: var(--muted-2); }
.bw-demo-tag { flex-shrink: 0; font: 600 var(--fs-caption) var(--sans); letter-spacing: var(--ls-caption); text-transform: uppercase; color: var(--muted-2); background: var(--neutral-bg); border: 1px solid var(--neutral-line); border-radius: var(--r-pill); padding: 2px 8px; }
/*
 * CHIP DE VERSIÓN (UX-2R · C). Hereda TODO de `.bw-demo-tag` —la pastilla neutra más discreta del
 * sistema— y sólo cambia lo que tiene que distinguirlo: la caja monoespaciada, porque lo que dice
 * es un número y un «V11» al lado de un «V2» tiene que alinear. Cero colores nuevos y cero tokens
 * nuevos: un chip de versión no es una alarma ni un estado clínico, y darle color propio lo
 * pondría a competir con los que sí lo son.
 */
.bw-ver-tag { flex-shrink: 0; font: 600 var(--fs-caption) var(--mono); letter-spacing: 0; text-transform: none; color: var(--muted-2); background: var(--neutral-bg); border: 1px solid var(--neutral-line); border-radius: var(--r-pill); padding: 2px 7px; }
.bw-part-id > .bw-ver-tag { position: absolute; top: 50%; right: 46px; transform: translateY(-50%); }
.lab-tarjeta-k .bw-ver-tag { vertical-align: middle; margin-left: 6px; }
.bw-buscar-res { position: absolute; top: calc(100% + 6px); left: 0; right: 0; z-index: 40; background: var(--surface); border: 1px solid var(--line-strong); border-radius: var(--r-md); box-shadow: var(--shadow-md); overflow: hidden; }
.bw-buscar-item { display: flex; flex-direction: column; gap: 2px; width: 100%; text-align: left; padding: 11px 16px; border-bottom: 1px solid var(--line); }
.bw-buscar-item:last-child { border-bottom: 0; }
/*
 * ══ FOCO DE TECLADO EN EL BUSCADOR (PRACTICA-1 · G) ════════════════════════════════════
 *
 * G-06 — El input traía `outline: none` con la MISMA especificidad que la regla global de
 * `:focus-visible` y 1.600 líneas más abajo, así que ganaba siempre: el primer control del
 * segmento, y la única vía de teclado para elegir participante, no dibujaba foco. Es WCAG
 * 2.4.7, nivel A. El anillo va en la FILA y no en el input, que es lo que se ve como campo.
 * Scopeado a `.bw-sechead` a propósito: sin prefijo se lleva puesto el buscador del Paso 2,
 * que es otro segmento y no es de este lote.
 *
 * G-08 — Y la lista de resultados lo dibujaba recortado: `.bw-buscar-res` tiene
 * `overflow: hidden` y los ítems ocupan el 100 % del ancho, así que con el `outline-offset: 2px`
 * global los cantos laterales caían fuera de la caja. Se invierte el offset, que es lo que ya
 * hace `.dop-segbtn:focus-visible` en el Doppler por el mismo motivo.
 */
.bw-sechead .bw-buscar-row:focus-within { outline: 2px solid var(--accent); outline-offset: 2px; }
.bw-buscar-item:focus-visible { outline: var(--focus); outline-offset: -3px; }
.bw-buscar-item:hover { background: var(--accent-soft); }
.bw-buscar-item strong { font: 700 var(--fs-body) var(--sans); color: var(--ink); }
.bw-buscar-item span { font: 500 var(--fs-label) var(--sans); color: var(--muted-2); }

/* ---------- Estados del buscador y PROCEDENCIA POR CAMPO (capa de lectura) ----------
   El aviso NO es un botón: no se selecciona, no se hovera y se distingue del resultado.
   El tono de error usa la banda de alerta del sistema, no un rojo nuevo. */
.bw-buscar-item[data-aviso] { cursor: default; color: var(--muted-2); font: 500 var(--fs-label) var(--sans); }
.bw-buscar-item[data-aviso]:hover { background: transparent; }
.bw-buscar-item[data-aviso="error"] { background: var(--warn-bg); color: var(--ink); border-left: 3px solid var(--band-3); }
.bw-buscar-item[data-aviso="demo"] { background: var(--neutral-bg); color: var(--neutral-fg); }
.ent-origen { margin: 8px 0 0; font: 600 var(--fs-label) var(--sans); color: var(--band-3); }
/* ---------- PROCEDENCIA POR CAMPO, dentro del bloque del campo ----------
   Los cuatro estados se distinguen de un vistazo, que es lo que separa "el participante dijo
   47" de "el médico consignó 47". DECLARADO es el único accionable: se toca y se confirma. */
.ent-marca {
  display: block; width: 100%; margin: 6px 0 0; padding: 5px 9px; text-align: left;
  border: 1px solid var(--line); border-radius: 6px; background: transparent;
  font: 600 var(--fs-label) var(--sans); color: var(--muted-2); cursor: default;
}
.ent-marca[data-proc="declarado"] {
  border-color: var(--band-2); background: var(--warn-bg); color: var(--ink); cursor: pointer;
}
.ent-marca[data-proc="declarado"]::before { content: "◇ "; color: var(--warn-fg); }
.ent-marca[data-proc="declarado"]:hover { background: var(--accent-soft); border-color: var(--accent); }
/* CONFIRMADO se distingue de DECLARADO de un vistazo: cambia el fondo, no sólo el ícono. */
.ent-marca[data-proc="confirmado"] { border-color: var(--band-0); color: var(--ok-fg, var(--ink)); background: var(--ok-bg, transparent); font-weight: 700; }
.ent-marca[data-proc="confirmado"]::before { content: "✓ "; }
.ent-marca[data-proc="consignado"] { border-color: var(--accent); color: var(--accent); }
.ent-marca[data-proc="consignado"]::before { content: "✎ "; }
/* Lo declarado que NO puntúa (factor E): es un apunte, no una acción. Sin cursor ni hover. */
.ent-marca[data-proc="declarado-nota"] { border-style: dashed; cursor: default; }
.ent-marca[data-proc="declarado-nota"]::before { content: "◇ "; color: var(--warn-fg); }
/* El borde izquierdo del bloque ya señala completitud; el tono de procedencia lo matiza sin
   competir con él: declarado NO es "ok", aunque tenga valor. */
[data-campo][data-proc="declarado"] { border-left-color: var(--band-2); }

/* ---------- Señal de completitud por campo (pendiente / cargado / falta) ----------
   El pendiente es GRIS NEUTRO pero plenamente interactivo (no deshabilitado): borde
   de acento lateral + dot del label + chip de factor en neutro. Cargado = berry vivo. */
[data-campo] { border-left: 3px solid var(--line-strong); transition: border-color .2s ease; }
[data-campo][data-estado="ok"] { border-left-color: var(--accent); }
[data-campo][data-estado="falta"] { border-left-color: var(--band-3); }
[data-campo][data-estado="falta"] { background: var(--warn-bg); }

/*
 * ══ G-02 · LA SEÑAL DE COMPLETITUD NO LLEGABA A SEXO, EDAD NI PAS ══════════════════════
 *
 * Las tres reglas de arriba son (0,2,0) y `.bw-sec > .field:not(.bw-lab-grid)` es (0,3,0):
 * le ganaba. Medido en el navegador, con los otros bloques al lado para comparar:
 *
 *   factor B · Colesterol · Diabetes   borde 3px rgba(42,26,30,.16)   ← la señal
 *   Sexo · Edad · PAS                  borde 1px rgba(42,26,30,.10)   ← inerte, en LOS TRES
 *                                                                       estados
 *
 * O sea que en esos tres campos sobrevivía sólo el punto de 8 px del rótulo, y el estado
 * `falta` —el que bloquea la finalización— no pintaba ni el filo ni el fondo. Es el estado más
 * caro de la pantalla y era el que menos se veía, justo en tres de los seis ejes de la carta.
 *
 * No se cambia ningún color ni ningún criterio: se le devuelve a esos tres campos la señal que
 * el sistema ya tenía escrita para todos.
 */
.bw-sec > .field[data-campo] { border-left-width: 3px; border-left-color: var(--line-strong); }
.bw-sec > .field[data-campo][data-estado="ok"] { border-left-color: var(--accent); }
.bw-sec > .field[data-campo][data-estado="falta"] { border-left-color: var(--band-3); background: var(--warn-bg); }

/*
 * G-17 — Y LA MARCA DECLARADA PERDÍA SU CAJA justo en el campo en falta: la marca usa
 * `--warn-bg` de fondo y el bloque en falta también, así que quedaba superficie contra
 * superficie (1,00:1). Es un estado alcanzable —un factor declarado con puntaje pero todavía
 * no tocado queda `falta` + `declarado` en la misma pasada— y es el único estado accionable
 * de la marca: es la que dice «tocá para confirmar».
 */
[data-campo][data-estado="falta"] .ent-marca[data-proc="declarado"] { background: var(--surface); }
.bw-factor[data-estado="pendiente"] .bw-chip { background: var(--neutral-fg); }
.bw-factor[data-estado="falta"] .bw-chip { background: var(--band-3); }
[data-campo] .field-label::before, .bw-lab[data-campo] .field-label::before {
  content: ""; display: inline-block; width: 8px; height: 8px; border-radius: 50%;
  margin-right: 7px; background: var(--neutral-fg); vertical-align: baseline; transition: background .2s ease;
}
[data-campo][data-estado="ok"] .field-label::before { background: var(--accent); }
[data-campo][data-estado="falta"] .field-label::before { background: var(--band-3); }
.bw-clinical-card[data-campo] { padding-left: 14px; }   /* G-04: 3 + 14 + 2 = 19 */

/* ---------- Cierre de la entrevista: botón corporativo con volumen (rail izquierdo) ----------
   Rectángulo de bordes romos con luz cenital, brillo interior superior y sombra de apoyo:
   encuadre 3D sobrio. Sin icono ni subtextos. */
/*
 * ══ EL CONTROL DE CIERRE ES BORDÓ EN LOS DOS SEGMENTOS (PRACTICA-1 · F.1) ══════════════
 *
 * GRAMÁTICA QUE ESTO PRESERVA: en cada segmento, el control que CIERRA el acto es el elemento
 * de mayor contraste contra su fondo inmediato. En el Doppler eso resolvió en botón crema
 * sobre un rectángulo bordó; acá, sobre el fondo claro de la página, resuelve al revés — bordó
 * sobre claro. Es el mismo gesto leído en dos fondos distintos, no dos criterios.
 *
 * Y ADEMÁS CIERRA UNA INCOHERENCIA QUE YA ESTABA: el sistema tenía escrito «bordó = finalizar»
 * —el FAB del Paso 3, «Finalizar Consulta Médica», ya era bordó— y sin embargo el botón que
 * finaliza la práctica de enfermería era crema. Dos actos de cierre, dos colores.
 *
 * POR ESO EL BORDÓ VIVE ACÁ, EN LA BASE, Y NO EN UN OVERRIDE. Los dos botones comparten esta
 * clase; hasta este lote `.rcl-fab .bw-fin-btn` tenía que repintar el berry encima porque la
 * base era crema. Ahora la base ES el gesto, y el Paso 3 no necesita decir nada: si mañana
 * alguien cambia el color de cierre, lo cambia en UN lugar y los dos segmentos lo siguen.
 *
 * CONTRASTE MEDIDO (no elegido y después medido): crema #f6ebd8 sobre el peor stop del degradé
 * —#48141f en la barra, #3a1220 en el círculo—, y medido sobre el color RENDERIZADO, es decir
 * con los `filter` aplicados en los DOS estados (listo: brightness 1.08; pendiente:
 * saturate .68). Ver la tabla del reporte. Mínimo obtenido 8,1:1 contra el 4,5:1 que pide AA.
 */
.bw-fin-btn {
  display: flex; align-items: center; justify-content: center; gap: 6px;
  width: min(460px, 100%); padding: 15px 22px; border-radius: var(--r-md);
  background: linear-gradient(160deg, var(--accent) 0%, var(--berry-panel) 48%, var(--accent-deep) 100%);
  /* Sobre fondo claro el botón se recorta solo: el propio bordó ya da muy por encima de los
     3:1 que WCAG 2.2 §1.4.11 pide para el límite de un control, así que el borde deja de ser
     un contorno de rescate y pasa a ser el filo de luz del volumen. */
  border: 1px solid rgba(255, 255, 255, .14);
  color: var(--crema); text-align: center;
  box-shadow: 0 10px 30px rgba(72, 20, 31, .22), 0 2px 8px rgba(72, 20, 31, .16), inset 0 1px 0 rgba(255, 255, 255, .14);
  transition: transform .15s ease, filter .15s ease, box-shadow .15s ease;
}
/* Barra (por defecto): palabras en fila, ECG oculto. El ESTADO ya no se muestra: lo
   comunica la intensidad del botón (pendiente atenuado / listo pleno); el texto queda
   solo para lectores de pantalla. */
.bw-fin-w { display: inline-block; font: 700 15px/1.3 var(--sans); letter-spacing: -.01em; color: var(--crema); }
.bw-fin-ecg { display: none; }
.bw-fin-estado { position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
.bw-fin-btn[data-fin-estado="pendiente"] { filter: saturate(.68) brightness(1); }
.bw-fin-btn[data-fin-estado="pendiente"]:hover { filter: saturate(.68) brightness(.86); }
/* Flotante lateral (≥1420): CÍRCULO como pieza de diseño — luz radial verde de acción, anillo halo,
   filo de luz y un pulso ECG tenue al pie (marca de la casa), sin restar legibilidad. */
@media (min-width: 1420px) {
  .bw-fin-btn {
    position: relative; overflow: hidden;
    flex-direction: column; gap: 2px; width: 160px; height: 160px; border-radius: 50%; padding: 18px;
    /*
     * "Aurora" EN BORDÓ. Misma composición radial y misma forma que siempre; cambia la familia
     * de color y con ella el filo (vuelve el de luz blanco, que sobre crema no existía) y las
     * luces interiores, que pasan de blanco pleno a un velo tenue: sobre oscuro un inset
     * blanco al 50 % lavaba el degradé y le comía contraste al texto.
     * El anillo halo se conserva porque es lo que despega el círculo del fondo claro.
     */
    background: radial-gradient(circle at 32% 26%, #7d2c40 0%, var(--berry-panel) 48%, var(--accent-deep) 100%);
    border: 1px solid rgba(255, 255, 255, .16);
    box-shadow: 0 0 0 7px rgba(110, 37, 54, .12), 0 14px 34px rgba(72, 20, 31, .3),
                inset 0 10px 22px rgba(255, 255, 255, .07), inset 0 1px 0 rgba(255, 255, 255, .16),
                inset 0 -14px 28px rgba(0, 0, 0, .16);
  }
  /* ECG del hero de #estudio, reutilizado: mismo patrón (período 165px) y misma
     animación ecgflow; recortado por el círculo, sutil bajo el texto */
  .bw-fin-ecg { display: block; position: absolute; left: -6px; right: -6px; bottom: 4px; height: 44px; overflow: hidden; opacity: .3; pointer-events: none; }
  .bw-fin-ecg svg { display: block; max-width: none; width: calc(100% + 165px); height: 44px; animation: ecgflow 2.4s linear infinite; }
  /*
   * F.2 — EL TRAZADO VUELVE A SER CLARO. El SVG lleva el trazo en blanco al 55 % HARDCODEADO en
   * el HTML, que es lo correcto sobre fondo oscuro; mientras el botón fue crema hubo que pisarlo
   * acá con un bordó al 50 % para que se viera. Con el botón en bordó ese override sobra y se
   * va: el trazo blanco del SVG es el que corresponde, y vuelve a ser el MISMO en los dos
   * segmentos —Paso 1 y FAB del Paso 3— en vez de tener cada uno el suyo.
   *
   * SUBORDINADO, NO INFORMACIÓN. El contenedor va al 22 % de opacidad (antes 30 sobre crema):
   * es atmósfera y no puede competir con el texto ni bajarle el contraste.
   *
   * MEDIDO EN EL PEOR CASO, que es el que hay que medir: texto crema justo encima de una cresta
   * del trazo, sobre el stop MÁS CLARO del degradé (#7d2c40) y además con el hover aplicado
   * (brightness 1,12) — la combinación en que el fondo más se acerca al texto. El trazo blanco
   * al 55 % dentro de un contenedor al 22 % da un alfa efectivo de 0,121, así que bajo la cresta
   * el fondo sube de #8c3148 a #9a4a5e.
   *   texto sobre fondo liso  6,72:1
   *   texto sobre el TRAZO    5,06:1   ← el que cuenta
   * El trazo cuesta 1,66 puntos de contraste y el resultado sigue por encima del 4,5:1 que AA
   * exige (bold 15-16px no califica como texto grande, así que el umbral es 4,5 y no 3).
   */
  .bw-fin-ecg { opacity: .22; }
  .bw-fin-btn:hover { box-shadow: 0 0 0 7px rgba(110, 37, 54, .16), 0 18px 40px rgba(110, 37, 54, .3), 0 3px 9px rgba(110, 37, 54, .18), inset 0 1px 0 rgba(255, 255, 255, .6); }
  /* Un span por RENGLÓN —«Finalizar / Práctica de / Enfermería»—, los tres al mismo cuerpo:
     la jerarquía la da el peso, no el tamaño. El corte lo fija el markup y no el ancho del
     círculo, así que ninguna palabra queda colgando. Medido a 1440: el renglón más ancho es
     81,2 px contra una cuerda útil de 145,6 px al alto del texto — entra sin tocar cuerpo,
     interlineado ni diámetro. */
  .bw-fin-w { display: block; font: 600 16px/1.3 var(--sans); letter-spacing: 0; color: var(--crema); }
  .bw-fin-w1 { font: 700 16px/1.3 var(--sans); letter-spacing: -.01em; color: var(--crema); }
}
/* Hover: se profundiza al pasar el mouse. Con el botón en bordó el reposo ya no se aclara —un
   brightness(1.08) sobre oscuro lava el degradé— así que el estado base queda pleno y el hover
   baja. La dirección del gesto es la misma que tenía: al apuntarlo, se hunde. */
.bw-fin-btn:hover { filter: brightness(1.12); box-shadow: 0 14px 36px rgba(72, 20, 31, .3), 0 3px 9px rgba(72, 20, 31, .2), inset 0 1px 0 rgba(255, 255, 255, .16); }
.bw-fin-btn:active { transform: scale(.98); filter: brightness(.9); }

/*
 * ══ F.4 · ESTADOS, Y UN FOCO QUE SE VEA ════════════════════════════════════════════════
 *
 * EL ANILLO GLOBAL ES BORDÓ (`--focus: 3px solid var(--accent)`), así que sobre un botón bordó
 * era literalmente invisible: un botón sin foco. El proyecto ya tenía el patrón para esto
 * —`.on-dark :focus-visible`, `footer :focus-visible` pasan el anillo a blanco— y acá se usa
 * ese mismo, no uno nuevo.
 *
 * Va en DOS capas para que se vea contra el bordó del botón Y contra el fondo claro de la
 * página: anillo crema pegado al borde + halo bordó por fuera. Medido: crema sobre el bordó
 * del botón 8,1:1 y bordó sobre el fondo de página 6,9:1 — los dos por encima del 3:1 que
 * WCAG 2.2 §1.4.11 pide para un indicador no textual.
 */
.bw-fin-btn:focus-visible {
  outline: 3px solid var(--crema);
  outline-offset: -4px;
  box-shadow: 0 0 0 3px var(--accent), 0 14px 34px rgba(72, 20, 31, .3);
}
/*
 * DISABLED. Se usa `aria-disabled`, no el atributo nativo: el FAB conserva el foco y el clic
 * accesible para llevar al aviso que explica qué falta, pero jamás abre el resumen mientras el
 * gate esté bloqueado. Sin `pointer-events:none`: el estado y su salida tienen que ser alcanzables.
 */
.bw-fin-btn:disabled,
.bw-fin-btn[aria-disabled="true"] { filter: saturate(.35) brightness(.72); cursor: not-allowed; }
.bw-fin-btn[data-fin-estado="procesando"] { filter: saturate(.55) brightness(.82); cursor: progress; }
.bw-fin-btn[data-fin-estado="finalizado"] { filter: saturate(.45) brightness(.76); cursor: default; }
.bw-fin-btn[data-fin-estado="error"] { box-shadow: 0 0 0 3px var(--band-3), 0 14px 34px rgba(72, 20, 31, .24); }
.bw-final-aviso { margin-top: 12px; font: 500 var(--fs-label)/1.55 var(--sans); padding: 12px 13px; }

/*
 * ══ EL OVERRIDE DEL FAB DEL PASO 3 SE FUE, Y ESO ES EL PUNTO (PRACTICA-1 · F.1) ════════
 *
 * Acá vivía un bloque que repintaba el berry sobre `.bw-fin-btn` para el FAB «Finalizar
 * Consulta Médica»: existía porque la base era crema y, sin él, el Paso 3 heredaba el color
 * del Paso 1. Ahora la base ES bordó, así que el override no tiene nada que corregir.
 *
 * NO ES LIMPIEZA: es la verificación de F.1. Que los dos controles de cierre del Consultorio
 * queden idénticos SIN que ninguno declare su color por separado es la prueba de que se leen
 * como el mismo gesto de diseño y no como dos criterios que casualmente coinciden. Si mañana
 * cambia el color de cierre, cambia en un lugar y los dos segmentos lo siguen.
 *
 * (El FAB del Paso 3 conserva su posición y su tamaño propios: lo único compartido es la
 * identidad visual del control, que es justamente lo que tiene que estar compartido.)
 */

/* ---------- Mini-calculadora de IMC (factor W): panel visible arriba del select ---------- */
.bw-imc { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px; align-items: end; margin-bottom: 9px; padding: 10px 11px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-sm); }
.bw-imc-lbl { display: block; font: 600 var(--fs-caption) var(--sans); letter-spacing: var(--ls-caption); text-transform: uppercase; color: var(--muted-2); margin-bottom: 4px; white-space: nowrap; }
.bw-imc-input { min-width: 0; width: 100%; padding: 8px 9px; font-size: var(--fs-body); border-radius: var(--r-sm); }
/* Sin spinners nativos: los inputs de la calculadora son angostos */
.bw-imc-input::-webkit-inner-spin-button, .bw-imc-input::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }
.bw-imc-input[type="number"] { -moz-appearance: textfield; appearance: textfield; }
.bw-imc-res { display: block; grid-column: 1 / -1; text-align: center; font: 600 14px var(--mono); color: var(--accent); background: var(--accent-soft); border: 1px solid rgba(110, 37, 54, .14); border-radius: var(--r-sm); padding: 8px 10px; white-space: nowrap; font-variant-numeric: tabular-nums; }

/* ---------- Modal de cierre (riesgo del participante) ---------- */
.bwf-participante { font: 600 clamp(20px, 2.4vw, 26px) var(--serif); color: var(--ink); margin: 2px 0 16px; letter-spacing: -.01em; }
.bwf-cols { display: grid; grid-template-columns: 1fr auto 1fr; gap: clamp(14px, 2vw, 24px); align-items: start; background: var(--bg); border: 1px solid var(--line); border-radius: var(--r-md); padding: 16px 18px; }
.bwf-div { width: 1px; align-self: stretch; background: var(--line-strong); }
.bwf-col { min-width: 0; }
.bwf-brand { font: 800 14px var(--sans); color: var(--ink); margin: 0 0 6px; }
.bwf-etq { font: 700 10px var(--sans); letter-spacing: .1em; text-transform: uppercase; color: var(--muted-2); margin: 0 0 8px; }
.bwf-bar { display: block; width: 30px; height: 5px; border-radius: 3px; background: var(--neutral-fg); margin-bottom: 7px; }
.bwf-valor { font: 500 clamp(24px, 2.8vw, 32px)/1.05 var(--serif); color: var(--ink); margin: 0 0 6px; }
.bwf-sop { font: 500 12px var(--sans); color: var(--muted-2); margin: 0; font-variant-numeric: tabular-nums; }
.bwf-resumen { list-style: none; margin: 0; padding: 0; }
.bwf-resumen li { display: flex; align-items: baseline; justify-content: space-between; gap: 14px; padding: 8px 0; border-bottom: 1px solid var(--line); }
.bwf-resumen li:last-child { border-bottom: 0; }
.bwf-resumen li span { font: 500 13px var(--sans); color: var(--muted); }
/* Puntajes en COLUMNA real: número alineado a la derecha contra una caja de unidad
   fija (pt/pts) — los números comparten columna, la unidad también. */
.bwf-resumen li strong { font: 600 13px var(--mono); color: var(--ink); text-align: right; min-width: 64px; flex-shrink: 0; font-variant-numeric: tabular-nums; }
.bwf-resumen li strong .bwf-u { display: inline-block; width: 27px; text-align: left; margin-left: 6px; }
.bwf-acciones { display: flex; gap: 12px; justify-content: flex-end; margin-top: 18px; flex-wrap: wrap; }
/* Placeholder "Descargar documento": presente y coherente, sin acción todavía */
.bwf-acciones .btn[disabled] { opacity: .55; pointer-events: none; box-shadow: none; }

/* Impresión del modal de cierre: sólo el modal abierto, estático y limpio. */
@media print {
  body.bw-modal-open .view section > .container > *:not(.bw-modal) { display: none !important; }
  body.bw-modal-open .bw-backdrop { display: none !important; }
  body.bw-modal-open .bw-modal:not([hidden]) { position: static; transform: none; width: 100%; max-height: none; border: 1px solid #ccc; box-shadow: none; }
  body.bw-modal-open .bw-modal-head { position: static; background: #fff; color: #1a1a1a; border-bottom: 1px solid #ccc; }
  body.bw-modal-open .bw-modal-head h3 { color: #1a1a1a; }
  body.bw-modal-open .bw-x { display: none !important; }
}

/* Responsive del módulo */
/* Colapso del lienzo: los rails salen del sticky y pasan al flujo (01/02 → riesgo → cierre). */
@media (max-width: 1180px) {
  .bw-layout { display: block; }
  .bw-rail-der { position: static; margin-top: clamp(16px, 2.4vw, 24px); }
}
@media (max-width: 1024px) {
  .diabetes-binary-grid { grid-template-columns: 1fr; }
  .binary-clinical-cell { min-height: 0; flex-direction: row; align-items: center; }
}
@media (max-width: 560px) {
  .bw-head { padding: 15px 15px 14px; }
  .bw-head .bw-ref-btn { justify-self: start; margin-top: 2px; }
  .bw-lab-grid { grid-template-columns: 1fr; }
  .binary-clinical-cell { align-items: flex-start; }
  .conditions-binary-list .binary-field-row { gap: 10px; }
  /* Bloques más compactos a 375 */
  .bw-factor { padding: 12px 12px 10px; }
  .bw-sec > .field:not(.bw-lab-grid) { padding: 12px; }
}

/* =========================================================================
   Doppler multiterritorial (paso 2) — estación de trabajo (doppler.js)
   ========================================================================= */
.dop-bajada-row { display: flex; align-items: center; justify-content: flex-end; gap: 18px; margin: -18px 0 4px; }
.dop-bajada { margin: 0; font-size: 15px; max-width: none; }
.dop-fichabtn {
  flex-shrink: 0; display: inline-flex; align-items: center; gap: 8px; cursor: pointer;
  font: 700 13px var(--sans); color: var(--accent);
  background: var(--surface); border: 1px solid rgba(110, 37, 54, .3); border-radius: var(--r-pill);
  padding: 9px 16px; transition: background .15s ease, border-color .15s ease;
}
.dop-fichabtn:hover, .dop-fichabtn[aria-expanded="true"] { background: var(--accent-soft); border-color: var(--accent); }
.dop-fichabtn:focus-visible { outline: var(--focus); outline-offset: 2px; }

/* Navegación vertical de territorios/segmentos (columnas izquierda).
   min-height fija a 6 ítems (iliofemoral, el más alto): territorios y segmentos
   quedan parejos y el layout no salta al cambiar de territorio. */
.dop-tabs { display: flex; flex-direction: column; gap: 5px; margin-top: 10px; min-height: 266px; }
.dop-tab {
  display: flex; align-items: center; gap: 9px; width: 100%; cursor: pointer; text-align: left;
  font: 600 13px var(--sans); color: var(--ink);
  background: transparent; border: 1px solid transparent; border-radius: var(--r-md);
  padding: 9px 11px; transition: background .15s ease, border-color .15s ease, color .15s ease;
}
.dop-tab:hover { background: var(--accent-soft); }
.dop-tab[aria-selected="true"] { background: var(--accent); border-color: var(--accent); color: #fff; }
.dop-tab:focus-visible { outline: var(--focus); outline-offset: 2px; }
.dop-tab-dot { flex-shrink: 0; width: 8px; height: 8px; border-radius: 50%; background: rgba(42, 26, 30, .22); }
.dop-tab[aria-selected="true"] .dop-tab-dot { box-shadow: 0 0 0 2px rgba(255, 255, 255, .35); }
/* Color del dot: segmentos llevan data-st en el propio botón; territorios en el wrapper */
.dop-tab[data-st="ok"] .dop-tab-dot, .dop-terr[data-st="ok"] .dop-tab-dot { background: var(--band-0); }
.dop-tab[data-st="placa"] .dop-tab-dot, .dop-terr[data-st="placa"] .dop-tab-dot { background: var(--band-3); }

/* Fila de territorio: botón (selección) + casilla "evaluado" a la derecha */
.dop-terr { display: flex; align-items: center; gap: 2px; }
.dop-terr .dop-tab { flex: 1 1 auto; width: auto; }
.dop-check { flex-shrink: 0; display: inline-flex; align-items: center; padding: 6px 6px 6px 2px; cursor: pointer; }
.dop-check-in { position: absolute; width: 1px; height: 1px; opacity: 0; margin: 0; pointer-events: none; }
.dop-check-ui {
  width: 18px; height: 18px; border-radius: 6px; border: 1.5px solid var(--line-strong); background: #fff;
  display: inline-flex; align-items: center; justify-content: center; color: #fff; transition: background .15s ease, border-color .15s ease;
}
.dop-check-ui svg { width: 12px; height: 12px; opacity: 0; transition: opacity .12s ease; }
.dop-check-in:checked + .dop-check-ui { background: var(--band-0); border-color: var(--band-0); }
.dop-check-in:checked + .dop-check-ui svg { opacity: 1; }
.dop-check-in:disabled + .dop-check-ui { opacity: .58; }        /* con hallazgo: evaluado implícito */
.dop-check:hover .dop-check-in:not(:disabled) + .dop-check-ui { border-color: var(--accent); }
.dop-check-in:focus-visible + .dop-check-ui { outline: var(--focus); outline-offset: 2px; }

/* Lienzo a ancho completo del desktop: sin cap de container; solo el padding lateral
   de la sección. La ficha (protagonista) crece con la pantalla; el esquema mantiene un
   ancho prolijo de referencia. */
#view-consulta section[data-subflow="doppler"] { padding-left: clamp(20px, 3.5vw, 60px); padding-right: clamp(20px, 3.5vw, 60px); padding-bottom: 24px; }
[data-subflow="doppler"] > .container { max-width: none; }
#view-consulta section[data-subflow="doppler"] .back-link { margin-bottom: 10px; }

/* Grilla: territorios · segmentos (navegación en dos niveles) · registro · esquema;
   el estado del estudio queda bajo las dos listas de navegación. */
.dop-grid {
  display: grid; grid-template-columns: 204px 204px minmax(0, 1fr) 360px;
  grid-template-areas: "nav segs ficha esq" "fin fin ficha esq" "carga carga ficha esq";
  grid-template-rows: auto auto 1fr;
  gap: 14px; align-items: start;
}
/* Padding en dos escalones deliberados: 14px en las dos cards de NAVEGACIÓN (listas de tabs) y 20px
   en las de CONTENIDO (.dop-col, .dop-hallazgos, .dop-estado). Antes había un tercer valor de 15px
   sin motivo. Al colapsar el grid a una columna las de navegación dejan de ser angostas, así que
   abajo de 700px se igualan a 20px (ver media query). */
.dop-nav { grid-area: nav; padding: 14px; }
.dop-segnav-card { grid-area: segs; padding: 14px; }
.dop-ficha-card { grid-area: ficha; }
.dop-esquema { grid-area: esq; }
/* Columna derecha: wrapper esquema + hallazgos (ocupa el área esq; apila con flex) */
.dop-der { grid-area: esq; display: flex; flex-direction: column; gap: 14px; min-width: 0; }
.dop-der .dop-esquema { grid-area: auto; }
.dop-hallazgos { padding: 20px; }
/* Elevación: el MISMO token que el Paso 3 (.rcl-card usa --shadow-sm; --shadow-md queda para la card
   destacada .rcl-strat). #metas NO usa el token: lleva su propia sombra literal de dos capas, sin
   unificar con la familia. Las cards del Paso 1 no tenían ninguna. */
.dop-grid .card { box-shadow: var(--shadow-sm); }
/* La ficha contiene .dop-sec, que ya trae --shadow-sm propio: al elevar el contenedor, padre e hijo
   cerrado quedaban al mismo nivel y se perdía el escalón que señala la sección abierta (--shadow-md).
   La .dop-sec cerrada se apoya en su borde; la abierta conserva su elevación. */
.dop-grid .card .dop-sec { box-shadow: none; }
.dop-grid .card .dop-sec.open { box-shadow: var(--shadow-md); border-color: var(--accent); }
.dop-estado { grid-area: carga; align-self: start; }
.dop-fin-wrap { grid-area: fin; align-self: start; display: flex; flex-direction: column; }
.dop-col { padding: 20px; }
.dop-col-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 12px; }
.dop-col-titulo { margin: 0; font: 700 19px/1.2 var(--serif); color: var(--ink); }
.dop-eval {
  display: inline-flex; align-items: center; gap: 8px; cursor: pointer;
  font: 700 11.5px var(--sans); letter-spacing: .05em; text-transform: uppercase; color: var(--muted-2);
  background: var(--surface); border: 1px solid var(--line-strong); border-radius: var(--r-pill); padding: 7px 13px;
  transition: all .15s ease;
}
.dop-eval .dop-eval-dot { width: 8px; height: 8px; border-radius: 50%; background: rgba(42, 26, 30, .22); }
.dop-eval[aria-pressed="true"] { background: var(--ok-bg); border-color: var(--ok-line); color: var(--ok-fg); }
.dop-eval[aria-pressed="true"] .dop-eval-dot { background: var(--band-0); }
.dop-eval:disabled { cursor: default; opacity: .9; }
.dop-eval:focus-visible { outline: var(--focus); outline-offset: 2px; }

/* Esquema SVG interactivo */
.dop-svg-wrap { display: flex; justify-content: center; }
/* SVG vascular realista del módulo esquemas-vasculares.js (trae sus estilos internos). */
#dop-svg > svg { width: 100%; max-width: 300px; height: auto; display: block; margin: 0 auto; }
.dop-svg-wrap .ref { cursor: default; }
/* Tooltip de las referencias (pills): div HTML único, position fixed, clamp a viewport. */
.dop-tip {
  position: fixed; z-index: 200; pointer-events: none; left: 0; top: 0;
  max-width: 240px; padding: 6px 10px;
  background: var(--ink); color: var(--accent-soft);
  border: 1px solid rgba(255, 255, 255, .14); border-radius: 8px;
  box-shadow: 0 8px 24px rgba(42, 26, 30, .28);
  font: 500 12px/1.35 var(--sans); white-space: nowrap;
  opacity: 0; visibility: hidden; transform: translateY(3px);
  transition: opacity .12s ease, transform .12s ease, visibility .12s;
}
.dop-tip[data-show="true"] { opacity: 1; visibility: visible; transform: none; }
.dop-leyenda { display: flex; gap: 16px; justify-content: center; margin-top: 10px; font: 500 11.5px var(--sans); color: var(--muted); }
.dop-leyenda span { display: inline-flex; align-items: center; gap: 6px; }
.dop-ley { display: inline-block; width: 18px; height: 8px; border-radius: 3px; }
.dop-ley-placa { background: #d8c6a0; border: 1px solid #7d6b43; }   /* ateroma beige del módulo */
.dop-ley-sel { background: var(--accent); }

/* Ficha del segmento */
.dop-ficha-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; margin-bottom: 4px; }
/* Títulos de zona (.card prefijo: gana al `.card p` global 0,1,1 que pisaba estos font) */
.card .dop-ficha-kicker { margin: 0 0 4px; font: 700 12px var(--sans); letter-spacing: .12em; text-transform: uppercase; color: var(--accent); }
.dop-ficha-titulo { margin: 0; font: 700 19px/1.2 var(--serif); color: var(--ink); }
.dop-chip { flex-shrink: 0; font: 700 11.5px var(--sans); letter-spacing: .05em; text-transform: uppercase; border-radius: var(--r-pill); padding: 6px 12px; border: 1px solid; }
.dop-chip[data-placa="false"] { background: var(--ok-bg); color: var(--ok-fg); border-color: var(--ok-line); }
.dop-chip[data-placa="true"] { background: var(--warn-bg); color: var(--warn-fg); border-color: var(--warn-line); }
/* Bloque de aorta: eje calibre/aneurisma (convive con el de placa) */
.dop-aorta { margin: 14px 0; padding: 14px; border: 1px solid var(--line-strong); border-radius: var(--r-md); background: var(--surface); }
.dop-aorta-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 12px; }
.dop-aorta .dop-form { margin-bottom: 0; }
.dop-aorta .dop-form + .dop-form, .dop-aorta .dop-sug + .dop-form { margin-top: 12px; }
.dop-chip-cal { flex-shrink: 0; font: 700 11.5px var(--sans); letter-spacing: .04em; text-transform: uppercase; border-radius: var(--r-pill); padding: 6px 12px; border: 1px solid; }
.dop-chip-cal[data-cal="normal"] { background: var(--ok-bg); color: var(--ok-fg); border-color: var(--ok-line); }
.dop-chip-cal[data-cal="ectasia"] { background: #fbeecb; color: #8a5a10; border-color: #ecd39a; }
.dop-chip-cal[data-cal="aneurisma"] { background: var(--warn-bg); color: var(--warn-fg); border-color: var(--warn-line); }
.dop-aviso { display: flex; align-items: center; gap: 8px; margin-top: 12px; padding: 10px 12px; background: var(--warn-bg); color: var(--warn-fg); border: 1px solid var(--warn-line); border-radius: var(--r-sm); font: 600 12.5px/1.4 var(--sans); }
.dop-aviso svg { flex-shrink: 0; }
.dop-aviso-estado { margin-top: 12px; }

.dop-placa-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin: 14px 0; padding: 12px 14px; background: var(--accent-soft); border-radius: var(--r-md); }
.dop-flabel-strong { display: inline-flex; align-items: center; gap: 6px; font: 700 14px var(--sans); color: var(--ink); }
.dop-segbtns { display: inline-flex; border: 1px solid var(--line-strong); border-radius: var(--r-pill); overflow: hidden; background: #fff; }
.dop-segbtn { border: none; cursor: pointer; background: transparent; padding: 8px 20px; font: 700 13px var(--sans); color: var(--muted); transition: background .15s ease, color .15s ease; }
.dop-segbtn[aria-pressed="true"] { background: var(--accent); color: #fff; }
.dop-segbtn:focus-visible { outline: var(--focus); outline-offset: -3px; }

.dop-form { display: grid; grid-template-columns: 1fr 1fr; gap: 12px 14px; }
.dop-span2 { grid-column: 1 / -1; }
.dop-field { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.dop-flabel { display: inline-flex; align-items: center; gap: 5px; margin: 0; }
.dop-in {
  width: 100%; border: 1px solid var(--line-strong); border-radius: var(--r-sm);
  padding: 9px 10px; font: 600 13.5px var(--mono); color: var(--ink); background: #fff;
}
.dop-in:focus-visible { outline: var(--focus); outline-offset: 1px; }
.dop-in-txt { font: 400 14px var(--sans); }
.dop-inwrap { display: flex; align-items: center; gap: 7px; }
.dop-inwrap small { flex-shrink: 0; font: 600 12px var(--sans); color: var(--muted-2); }
.dop-sel { width: 100%; }
.dop-nota { margin: 12px 0 0; font: 400 12.5px/1.5 var(--sans); color: var(--muted); }
.dop-vel { margin-top: 16px; border-top: 1px solid var(--line); padding-top: 12px; }
.dop-vel-titulo { margin: 0 0 10px; font: 600 var(--fs-caption) var(--sans); letter-spacing: var(--ls-caption); text-transform: uppercase; color: var(--muted-2); }

/* — Redesign: form del segmento en 4 secciones desplegables single-open (accordion) — */
/* Pill de estado del segmento (derivado) en el header de la ficha */
.dop-segstate { flex: 0 0 auto; font: 600 12px var(--sans); padding: 4px 12px; border-radius: var(--r-pill); background: var(--neutral-bg); color: var(--neutral-fg); border: 1px solid var(--neutral-line); }
.dop-segstate[data-estado="normal"] { background: var(--ok-bg); color: var(--ok-fg); border-color: var(--ok-line); }
.dop-segstate[data-estado="con-hallazgo"] { background: var(--warn-bg); color: var(--warn-fg); border-color: var(--warn-line); }
/* Fila superior siempre visible: calidad (+motivoNE) | toggle placa */
.dop-top { display: grid; grid-template-columns: 1fr auto; gap: 14px 20px; align-items: end; margin: 14px 0 4px; padding: 13px 14px; border: 1px solid var(--line-strong); border-radius: var(--r-md); background: var(--accent-soft); }
/* Cuando "Calidad técnica" va sola, .dop-form la ubica en una grilla de 2 columnas y queda una
   columna fantasma: el select medía 100px contra los 221,6px del resto de los campos de la card, con
   ~135px de aire muerto antes de "Placa". Se acota el CAMPO, no el contenedor, por dos razones:
   (1) doppler.js suma un segundo campo ("Motivo no evaluable") cuando calidad === 'no-evaluable', y
   tocando el contenedor esos dos se apilarían en vez de ir lado a lado; (2) .dop-top es `1fr auto`,
   así que un track sin techo estiraba el select al doble que los demás campos entre 481 y 1120 px,
   donde la ficha pasa a ancho completo. Con :only-child ocupa las dos columnas, capado en 240px. */
.dop-top-cal { align-self: end; }
.dop-top-cal .dop-field:only-child { grid-column: 1 / -1; max-width: 240px; }
.dop-top-placa { display: flex; flex-direction: column; gap: 8px; align-self: end; }
/* Tarjetas de sección (sombra/borde estilo Apple; la abierta se distingue) */
.dop-sec { margin-top: 10px; border: 1px solid var(--line); border-radius: var(--r-md); background: var(--surface); box-shadow: var(--shadow-sm); overflow: clip; transition: box-shadow .18s ease, border-color .18s ease; }
.dop-sec.open { box-shadow: var(--shadow-md); border-color: var(--accent); }   /* editando → borde acento berry + elevación */
.dop-sec-head { display: flex; align-items: center; gap: 10px; width: 100%; padding: 12px 14px; background: none; text-align: left; cursor: pointer; transition: background .15s ease; }
.dop-sec-head:hover { background: var(--accent-soft); }
.dop-sec-head:focus-visible { outline: var(--focus); outline-offset: -3px; border-radius: var(--r-md); }
.dop-sec-dot { flex: 0 0 auto; width: 7px; height: 7px; border-radius: 50%; background: var(--line-strong); transition: background .18s ease; }
.dop-sec-dot.normal { background: var(--ok-fg); }   /* verde tenue: sección en su normal */
.dop-sec-dot.on { background: var(--accent); }       /* berry: sección con hallazgo */
.dop-sec-title { flex: 0 0 auto; font: 600 var(--fs-caption) var(--sans); letter-spacing: var(--ls-caption); text-transform: uppercase; color: var(--muted-2); }
.dop-sec.open .dop-sec-title { color: var(--accent); }
.dop-sec-sum { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: right; font: 500 12px var(--sans); color: var(--muted); }
.dop-sec-sum.is-normal { color: var(--ok-fg); }       /* "Normal" en verde tenue */
.dop-sec.open .dop-sec-sum { display: none; }
.dop-sec-caret { flex: 0 0 auto; width: 7px; height: 7px; border-right: 1.7px solid var(--muted-2); border-bottom: 1.7px solid var(--muted-2); transform: rotate(45deg); transition: transform .2s ease, border-color .18s ease; }
.dop-sec.open .dop-sec-caret { transform: rotate(225deg); border-color: var(--accent); }
.dop-sec-body { overflow: hidden; max-height: 0; transition: max-height .24s ease; }
.dop-sec.open .dop-sec-body { max-height: 1600px; }
.dop-sec-inner { padding: 2px 14px 14px; }
.dop-sec-inner .dop-form + .dop-form, .dop-sec-inner .dop-sug + .dop-form, .dop-sec-inner .dop-form + .dop-sug, .dop-sec-inner .dop-aorta-head + .dop-form { margin-top: 12px; }
/* Grid denso de la sección Placa (auto-fit, compacto) */
.dop-dense { display: grid; grid-template-columns: repeat(auto-fit, minmax(148px, 1fr)); gap: 12px 14px; }
.dop-span-all { grid-column: 1 / -1; }
.dop-ro { display: inline-flex; align-items: center; min-height: 40px; font: 600 13.5px var(--sans); color: var(--ink); }
/* Focus ring berry sutil en los controles del form del segmento */
.dop-sel:focus-visible, .dop-in:focus-visible { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
@media (max-width: 640px) {
  .dop-top { grid-template-columns: 1fr; }
  .dop-dense { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 460px) { .dop-dense { grid-template-columns: 1fr; } }
.dop-sug { margin: 12px 0 2px; padding: 10px 12px; background: var(--accent-soft); border-radius: var(--r-sm); font: 400 13px/1.55 var(--sans); color: var(--ink); }
.dop-sug strong { font-weight: 700; }
.dop-aplicar { margin-left: 8px; border: none; cursor: pointer; background: var(--accent); color: #fff; border-radius: var(--r-pill); padding: 4px 13px; font: 700 11.5px var(--sans); }
.dop-aplicar:hover { background: var(--berry-panel); }

/* Tooltips (i) — popover breve sobre el término */
.dop-info {
  display: inline-flex; align-items: center; justify-content: center; vertical-align: middle;
  padding: 0; margin: 0; border: none; background: none; cursor: pointer; color: var(--muted-2);
  line-height: 0; transition: color .15s ease;
}
.dop-info:hover, .dop-info[aria-expanded="true"] { color: var(--accent); }
.dop-info:focus-visible { outline: var(--focus); outline-offset: 2px; border-radius: 50%; }
/* Panel del tooltip (i): div HTML único, position fixed, clamp a viewport (como #dop-tip, multilínea). */
.dop-infotip {
  position: fixed; z-index: 210; pointer-events: none; left: 0; top: 0;
  width: 240px; max-width: min(240px, 90vw); padding: 10px 12px;
  background: var(--ink); color: #fff; font: 400 12px/1.55 var(--sans);
  border: 1px solid rgba(255, 255, 255, .14); border-radius: var(--r-sm);
  box-shadow: var(--shadow-md); text-transform: none; letter-spacing: 0;
  opacity: 0; visibility: hidden; transform: translateY(3px);
  transition: opacity .12s ease, transform .12s ease, visibility .12s;
}
.dop-infotip[data-show="true"] { opacity: 1; visibility: visible; transform: none; }
.dop-infotip strong { font-weight: 700; }

/* Estado acumulado del estudio */
.dop-estado { padding: 20px; }
.card .dop-estado-kicker { margin: 0 0 4px; font: 700 12px var(--sans); letter-spacing: .12em; text-transform: uppercase; color: var(--accent); }
.dop-estado-list { list-style: none; margin: 0; padding: 0; }
.dop-estado-list li { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; padding: 7px 0; border-bottom: 1px solid var(--line); }
.dop-estado-list li span { font: 400 13px var(--sans); color: var(--muted); }
.dop-estado-list li strong { font: 700 13.5px var(--sans); color: var(--ink); text-align: right; }
.dop-mono { font: 600 14px var(--mono) !important; }
/* Llamado segmento vs territorio (card Estado del estudio): principal destacado + explicativo muted */
.dop-terr-note { margin: 0 0 10px; font: 400 12px/1.5 var(--sans); color: var(--muted); }
.dop-terr-note strong { display: block; margin-bottom: 3px; font-weight: 700; color: var(--ink); }
.dop-reclas { margin: 10px 0 0; padding: 9px 11px; background: var(--accent-soft); border-radius: var(--r-sm); font: 400 12.5px/1.5 var(--sans); color: var(--ink); }
.dop-vuln { width: 100%; margin-top: 10px; border-radius: var(--r-md); }
/* CTA "Finalizar estudio": vidrio esmerilado berry (estética Apple/macOS) sobre la card de estado */
/*
 * ══ EL CIERRE DEL ESTUDIO PESA MÁS (UX-1) ═════════════════════════════════════════════
 *
 * Es el acto que SELLA el estudio Doppler con la firma del ecografista, y tenía la altura de un
 * botón secundario. Ahora tiene cuerpo, el pulso ECG de la casa —el mismo motivo que corre en el
 * CTA de la práctica— y el texto en el dorado institucional.
 * `position: relative` + `overflow: hidden` son para el ECG: lo recortan al radio del botón.
 */
.dop-fin {
  position: relative; overflow: hidden;
  width: 100%; margin: 0; padding: 22px 20px; min-height: 64px; border-radius: var(--r-md);
  font: 700 16px var(--sans); color: var(--hl-claro); cursor: pointer;
  background: linear-gradient(180deg, rgba(110, 37, 54, .90), rgba(93, 31, 46, .95));
  -webkit-backdrop-filter: blur(14px) saturate(150%); backdrop-filter: blur(14px) saturate(150%);
  border: 1px solid rgba(255, 255, 255, .18);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .14), 0 10px 26px rgba(110, 37, 54, .26), 0 2px 6px rgba(42, 26, 30, .12);
  transition: transform .12s ease, box-shadow .18s ease, background .18s ease;
}
.dop-fin:hover { background: linear-gradient(180deg, rgba(93, 31, 46, .95), rgba(72, 20, 31, .97)); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .16), 0 14px 34px rgba(110, 37, 54, .32), 0 2px 6px rgba(42, 26, 30, .14); }
.dop-fin:active { transform: translateY(1px); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .10), 0 6px 16px rgba(110, 37, 54, .24); }
.dop-fin:focus-visible { outline: var(--focus); outline-offset: 2px; }
/* Fallback sin backdrop-filter: fondo sólido berry, texto blanco AA legible */
@supports not ((backdrop-filter: blur(2px)) or (-webkit-backdrop-filter: blur(2px))) {
  .dop-fin { background: linear-gradient(180deg, var(--accent), var(--berry-panel)); }
}
/*
 * ══ LA PÍLDORA CREMA CON TEXTO BORDÓ (DOP-2 · 5b, decisión de Hernán) ══════════════════
 *
 * El rectángulo bordó con el ECG animado se conserva entero: lo que cambia es que el texto deja
 * de flotar suelto sobre el degradé y pasa a vivir en una pastilla crema, que es el par inverso
 * del botón de estudios de arriba —bordó con texto claro— y cierra la pantalla con las dos caras
 * del mismo color institucional.
 *
 * CONTRASTE MEDIDO con la fórmula de luminancia relativa de WCAG 2.2, sobre los tokens resueltos:
 *     --accent #6e2536 sobre --crema #f6ebd8 .... 8,98:1  AAA
 * No hizo falta ningún ajuste de familia: el par que pidió Hernán pasa AAA de entrada. Para el
 * estado sellado se usa `--demo-ink` #48141f sobre la misma crema, que mide 12,75:1 — más tinta
 * para un rótulo que ya no invita a apretar.
 *
 * `pointer-events: none`: el control es el botón entero, no la pastilla. Sin esto, el clic sobre
 * el texto tendría un target distinto al del resto del rectángulo.
 */
/*
 * ══ LAS DOS PÍLDORAS DICEN COSAS DISTINTAS (DOP-3 · 1) ═════════════════════════════════
 *
 * Eran la misma pastilla crema en los dos estados: «Finalizar Estudio» y «Estudio Finalizado» se
 * veían igual, así que el color no ayudaba a distinguir una ACCIÓN de un ESTADO — la palabra
 * cargaba sola con toda la diferencia.
 *
 *   ACCIÓN     crema plena, tinta bordó. Se ve como algo que se aprieta.
 *   ESTADO     bordó ACLARADO y semi-transparente sobre el mismo rectángulo. Se lee como una
 *              etiqueta puesta encima, no como un botón.
 *
 * EL ACLARADO SE HACE CON LA CREMA DE LA CASA, no con un bordó nuevo: `rgba(246,235,216,.15)`
 * sobre el rectángulo da un bordó más claro sin estrenar un solo hex.
 *
 * ══ MEDIDO, con la fórmula de luminancia relativa de WCAG 2.2 ═══════════════════════════
 *
 * El rectángulo es un degradé semi-transparente, así que primero se compone sobre `--bg` y recién
 * después se mide — medir contra el rgba crudo daría un número que nadie ve:
 *
 *     rectángulo compuesto ......... #7c3a49 (arriba) → #652a38 (abajo)
 *     píldora de ESTADO ............ #8e555e (arriba) → #7b4750 (abajo)
 *     texto --crema sobre ella ..... 4,93:1 en el PEOR punto del degradé   AA
 *     texto --accent sobre crema ... 8,98:1                                AAA
 *     las dos píldoras entre sí .... 6,22:1  — no se pueden confundir
 *
 * EL BORDE, EN LAS DOS. Fino y de la familia: crema al 45 % sobre el estado —que sobre un fondo
 * bordó es la línea que la casa ya usa— y bordó al 28 % sobre la crema. Es lo que le da canto a
 * una pastilla que, sin él, flota sobre el degradé.
 */
.dop-fin-pill {
  display: inline-block; padding: 11px 26px; border-radius: var(--r-pill);
  background: var(--crema); color: var(--accent);
  border: 1px solid rgba(110, 37, 54, .28);
  font: 700 16px var(--sans); letter-spacing: -.005em;
  box-shadow: 0 2px 10px rgba(42, 26, 30, .18);
  pointer-events: none;
  transition: background .18s ease, color .18s ease, border-color .18s ease;
}
/*
 * HOVER SÓLO DONDE HAY ACCIÓN. La píldora de estado no reacciona al puntero porque el clic no
 * hace nada: un realce sobre algo inerte es una promesa que el control no cumple.
 */
.dop-fin[data-fin="no"]:hover .dop-fin-pill { border-color: rgba(110, 37, 54, .45); }
/*
 * ESTADO SELLADO. El rectángulo se apaga —menos saturación, sin sombra de llamada— y la pastilla
 * baja el tono: deja de pedir el clic, porque el clic ya no hace nada. Es la contracara visual de
 * que «Estudio Finalizado» sea un estado y no un botón.
 */
.dop-fin[data-fin="si"] { cursor: default; box-shadow: inset 0 1px 0 rgba(255, 255, 255, .10), 0 4px 14px rgba(110, 37, 54, .16); }
.dop-fin[data-fin="si"]:hover { background: linear-gradient(180deg, rgba(110, 37, 54, .90), rgba(93, 31, 46, .95)); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .10), 0 4px 14px rgba(110, 37, 54, .16); }
.dop-fin[data-fin="si"]:active { transform: none; }
/* ESTADO: bordó aclarado y semi-transparente, tinta crema, borde crema fino. Sin sombra: no está
   levantada sobre el rectángulo, está APOYADA en él. */
.dop-fin[data-fin="si"] .dop-fin-pill {
  background: rgba(246, 235, 216, .15);
  color: var(--crema);
  border-color: rgba(246, 235, 216, .45);
  box-shadow: none;
}

/*
 * REABRIR PARA CORREGIR. Va DEBAJO del rótulo de estado y no adentro del rectángulo: es otra
 * acción, con otra consecuencia, y meterla en la misma caja que el estado invitaría a confundirlas.
 * Peso de control secundario: reabrir un estudio sellado no es lo que se hace todos los días.
 */
.dop-fin-editar {
  align-self: flex-start; margin: 10px 0 0; padding: 8px 16px;
  background: var(--surface); color: var(--accent);
  border: 1px solid rgba(110, 37, 54, .22); border-radius: var(--r-pill);
  font: 600 13.5px var(--sans); cursor: pointer;
  transition: background .15s ease, border-color .15s ease;
}
.dop-fin-editar:hover { background: var(--accent-soft); border-color: var(--accent); }
.dop-fin-editar:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

.dop-fin-rotulo { margin: 12px 0 0; padding: 10px 12px; background: var(--ok-bg); color: var(--ok-fg); border: 1px solid var(--ok-line); border-radius: var(--r-sm); font: 600 13px/1.5 var(--sans); }
.dop-marco { margin: 12px 0 0; font: 400 11.5px/1.55 var(--sans); color: var(--muted-2); }

/* Header del doppler: eyebrow chico + título e identidad como unidad protagonista */
/* Respiro del encabezado: .sec-head trae clamp(30px,4vw,46px) y acá estaba anulado en 0, así que el
   grid arrancaba pegado al título (medido: gap 0, y −6,7px contra la base del texto — el contenido
   invadía el descendente). Un solo token en el contenedor, no parches por columna.
   El techo de 38px queda POR ENCIMA de los otros encabezados (rcl-head 26 · metas-head 30 ·
   bw-sechead 32) y por debajo del .sec-head base (46): es deliberado, porque acá el título es el más
   grande de la app (44px) y abre un grid de cuatro columnas denso, que pide más aire para despegar.
   El piso de 22px nunca cae por debajo del gap de 14px del propio grid. */
.dop-sechead { max-width: none; margin-bottom: clamp(22px, 2.6vw, 38px); }
.dop-eyebrow { margin: 0 0 6px; font: 800 13px var(--sans); letter-spacing: .16em; text-transform: uppercase; color: var(--accent); }
/*
 * ══ EL ENCABEZADO NO SE MUEVE CUANDO APARECE LA LEYENDA DE DEMO (DOP-2 · 1) ═════════════
 *
 * DEFECTO MEDIDO a 1440 px, encendiendo el modo demostración sobre la misma pantalla:
 *
 *     demo OFF   headline 52 px de alto · título en y=253 · cajón en y=265   → misma fila
 *     demo ON    headline 77 px (+25)   · título en y=266 · cajón en y=265   → DESALINEADOS
 *
 * La leyenda («Buscador en MODO DEMOSTRACIÓN…») vivía EN FLUJO dentro de `.bw-buscar`, que es un
 * hijo flex de esta fila. Al aparecer, el bloque del buscador crecía 25 px de alto y 178 de ancho,
 * y como la fila alinea por `center`, el TÍTULO bajaba 13 px para recentrarse. O sea: encender la
 * demostración movía el título de la pantalla.
 *
 * SE ARREGLA SACÁNDOLA DEL FLUJO Y RESERVÁNDOLE EL LUGAR, las dos cosas. Sólo sacarla del flujo la
 * haría caer encima de la grilla de trabajo, que arranca 15 px más abajo; sólo reservar espacio no
 * evita que el ancho del bloque cambie. Con las dos, el título y el cajón quedan clavados en su
 * posición con la leyenda puesta y sin ella.
 *
 * La reserva es de 23 px —el alto de la leyenda más su aire— y está SIEMPRE, también con el modo
 * apagado. Es el precio de que la pantalla no salte: un encabezado que se reacomoda al conmutar un
 * switch es peor que un renglón de aire constante.
 */
.dop-headline { position: relative; display: flex; align-items: center; gap: 14px; flex-wrap: wrap; row-gap: 10px; padding-bottom: 24px; }
/* La REFERENCIA de la escala de segmento. El valor no cambia —era el que estaba bien—: pasa a
   nombrarse con el token para que los otros dos segmentos suban hasta acá y no al revés. */
.dop-titulo { margin: 0; font: 500 var(--fs-segmento)/1.04 var(--serif); letter-spacing: -.02em; color: var(--accent); }
.dop-head-arrow { flex-shrink: 0; display: inline-flex; color: var(--muted); }
.dop-head-arrow svg { width: clamp(20px, 2vw, 28px); height: clamp(20px, 2vw, 28px); }
/* Identidad/buscador del participante, escalados al cuerpo del título.
   Identidad sin cap (nombre + DNI en línea); el input de búsqueda sí acotado. */
.dop-headline .bw-buscar { margin: 0; flex: 0 1 auto; min-width: 260px; max-width: 100%; }
.dop-headline .bw-buscar-row { max-width: 360px; }
/*
 * LA LEYENDA, FUERA DEL FLUJO Y ANCLADA A LA FILA — no al bloque del buscador. Se ancla a
 * `.dop-headline` (que es `position: relative`) y no a `.bw-buscar`, y la diferencia importa: el
 * bloque del buscador cambia de alto según muestre el cajón o el chip de identidad, así que
 * colgarla de ahí la haría subir y bajar según hubiera participante elegido o no.
 *
 * `left` la alinea con el borde izquierdo del buscador y no con el del título: la leyenda habla
 * del BUSCADOR, y puesta debajo del título parecería calificar a la pantalla entera. El valor sale
 * de una variable que la propia fila fija, para no repetir el ancho del título en dos lados.
 *
 * `z-index` por debajo del desplegable de resultados (que lleva 40): cuando los dos coinciden, la
 * lista tapa la leyenda, que es el orden correcto — la lista es lo que el operador está mirando.
 */
.dop-headline .ent-origen {
  position: absolute; top: 100%; left: 0; margin: 5px 0 0; z-index: 1;
  max-width: 100%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.dop-headline .bw-part-id {
  position: static; display: flex; align-items: center; gap: 12px; width: auto; min-width: 0;
  max-width: 100%; margin: 0; padding: 0; text-align: left; background: none; border: 0; border-radius: 0; box-shadow: none;
}
.dop-headline .bw-part-id-txt { display: flex; align-items: baseline; flex-wrap: wrap; gap: 3px 10px; min-width: 0; }
.dop-headline .bw-part-id-n { font: 600 clamp(28px, 3.1vw, 44px)/1.04 var(--serif); letter-spacing: -.02em; color: var(--ink); margin: 0; overflow-wrap: break-word; }
/* DNI en línea, a la derecha del nombre: meta mono con separador "·" */
.dop-headline .bw-part-id-dni { position: static; display: inline-flex; align-items: baseline; gap: 6px; font: 600 15px var(--mono); color: var(--muted-2); margin: 0; white-space: nowrap; }
.dop-headline .bw-part-id-dni::before { content: "·"; color: var(--muted-2); }
/* Quitar participante: el `position: static` que había acá anulaba EN SILENCIO el área táctil de la
   base (.bw-part-x::after, inset -8px → 46px): un pseudo absoluto sobre padre estático se ancla al
   ancestro posicionado, no al botón. Con `relative` vuelve a valer, sin duplicar la primitiva ni
   engordar la marca visual (sigue en 30px). margin-left despega el botón del DNI. */
.dop-headline .bw-part-x { position: relative; top: auto; right: auto; transform: none; flex-shrink: 0; margin-left: 2px; }
.dop-headline .bw-part-id > .bw-demo-tag { position: static; top: auto; left: auto; transform: none; flex-shrink: 0; }

/* Ficha flotante del participante (clon vivo de #riesgo-cv, arrastrable) */
[data-subflow="doppler"] { position: relative; }
.dop-float {
  position: absolute; z-index: 60; top: 96px; right: 12px; width: 330px; max-width: calc(100vw - 16px);
  background: var(--surface); border: 1px solid var(--line-strong);
  border-radius: var(--r-lg); box-shadow: var(--shadow-md); overflow: hidden;
}
.dop-float-head {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 10px 10px 10px 14px; cursor: grab; user-select: none; -webkit-user-select: none;
  background: var(--accent); color: #fff; touch-action: none;
}
.dop-float-head:active { cursor: grabbing; }
.dop-float-head span { font: 700 12px var(--sans); letter-spacing: .06em; text-transform: uppercase; }
.dop-float-x {
  flex-shrink: 0; width: 26px; height: 26px; border: none; border-radius: 50%; cursor: pointer;
  background: rgba(255, 255, 255, .16); color: #fff; font: 400 17px/1 var(--sans);
}
.dop-float-x:hover { background: rgba(255, 255, 255, .28); }
.dop-float-x:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }
.dop-float-body { padding: 12px; max-height: calc(100vh - 168px); overflow-y: auto; }
.dop-float-body .rcv-card { margin: 0; padding: 18px 18px 16px; }
/* Título de la ficha: un punto menor y con permiso de envolver → no roza el borde */
.dop-float-body .rcv-part-k { font-size: 12px; letter-spacing: .12em; white-space: normal; }
.dop-float-vacio { margin: 0; padding: 14px; font: 400 13px/1.55 var(--sans); color: var(--muted); }

/* Responsive: listas lado a lado → todo apilado en mobile
   (orden: territorios → segmentos → registro → esquema → estado) */
@media (max-width: 1120px) {
  .dop-grid { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); grid-template-areas: "nav segs" "ficha ficha" "esq esq" "fin fin" "carga carga"; grid-template-rows: none; }
}
@media (max-width: 700px) {
  .dop-grid { grid-template-columns: 1fr; grid-template-areas: "nav" "segs" "ficha" "esq" "fin" "carga"; }
  /* A una columna las cards de navegación dejan de ser angostas: se igualan al padding de contenido. */
  .dop-nav, .dop-segnav-card { padding: 20px; }
  /* El tope se comprime en mobile. La banda institucional despeja el header en TODOS los anchos
     desde DOP-UI · 1 —antes esto era la excepción de mobile, porque arriba de 701 px la banda
     estaba apagada y el Doppler despejaba el header con un padding propio de 74 px—. Arriba de
     700 px cae al `clamp(34px, 4.5vw, 56px)` de `.view:not(#view-estudio) section`, que es el
     mismo tope que el resto de los segmentos. */
  #view-consulta section[data-subflow="doppler"] { padding-top: clamp(20px, 4vw, 30px); }
  .dop-bajada-row { flex-direction: row; align-items: center; justify-content: flex-end; gap: 10px; }
  /* Header apilado: título arriba, identidad/buscador debajo a ancho completo */
  .dop-headline { flex-direction: column; align-items: flex-start; gap: 8px; }
  .dop-head-arrow { display: none; }
  /* flex-basis 300px es del eje horizontal; al apilar en columna se volvía altura → auto */
  .dop-headline .bw-buscar { flex: 0 0 auto; width: 100%; max-width: 100%; }
  /* Ficha flotante contenida entre márgenes en mobile */
  .dop-float { left: 8px; right: 8px; width: auto; max-width: none; }
  /* Al envolver, el DNI arranca línea: sin el "·" de separación */
  .dop-headline .bw-part-id-dni::before { content: none; }
}
@media (max-width: 480px) {
  .dop-form { grid-template-columns: 1fr; }
}

/* ===================== Modal de finalización: informe ecodoppler (paso 2) =====================
   Overlay a nivel body (ver index.html). Diverge DELIBERADAMENTE del head berry de .bw-modal:
   header claro con título serif — deferencia al documento clínico, no al chrome. Deuda
   registrada: converger .bw-modal a esta familia en un lote de limpieza. */
.dop-inf-overlay {
  position: fixed; inset: 0; z-index: 220; /* sobre nav (60), rail (50) y tooltips (200/210) */
  background: rgba(42, 26, 30, .45);
  backdrop-filter: blur(2px); -webkit-backdrop-filter: blur(2px);
  display: flex; align-items: center; justify-content: center;
  padding: clamp(10px, 3vw, 28px);
}
body.dop-inf-open { overflow: hidden; }  /* el fondo no scrollea con el modal abierto */
.dop-inf-modal {
  display: flex; flex-direction: column; overflow: hidden; outline: none;
  width: min(720px, 100%); max-height: min(86vh, 880px);
  background: var(--surface); border: 1px solid var(--line-strong);
  border-radius: var(--r-lg); box-shadow: var(--shadow-md);
}
@media (prefers-reduced-motion: no-preference) {
  .dop-inf-modal { animation: dopInfIn .18s ease-out; }
  @keyframes dopInfIn { from { opacity: 0; transform: translateY(10px) scale(.985); } }
}
.dop-inf-head {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 20px 24px 16px; border-bottom: 1px solid var(--line);
}
.dop-inf-titulo { margin: 0; font: 600 var(--fs-h2)/1.2 var(--serif); color: var(--ink); text-wrap: balance; }
.dop-inf-x {
  flex: none; display: grid; place-items: center; width: 42px; height: 42px;
  border: 0; border-radius: var(--r-pill); background: none; color: var(--muted); cursor: pointer;
  transition: background .15s ease, color .15s ease;
}
.dop-inf-x:hover { background: var(--accent-soft); color: var(--accent); }
/* Aviso de alcance: hallazgos que el generador ratificado aún no redacta */
.dop-inf-alerta {
  margin: 0; padding: 10px 24px; font: 500 var(--fs-label)/1.5 var(--sans);
  background: var(--warn-bg); color: var(--warn-fg); border-bottom: 1px solid var(--warn-line);
}
/* Bloqueo por dueño del caso: mismo tratamiento visual que el aviso del acta (.rcl-dueno-aviso),
   con la salida sin pérdida a la derecha. */
.dop-inf-dueno {
  display: flex; align-items: flex-start; flex-wrap: wrap; gap: 9px;
  margin: 0; padding: 11px 24px; font: 600 var(--fs-label)/1.45 var(--sans);
  background: var(--warn-bg); color: var(--warn-fg); border-bottom: 1px solid var(--warn-line);
}
.dop-inf-dueno svg { flex-shrink: 0; margin-top: 1px; }
.dop-inf-dueno > span { flex: 1 1 12rem; min-width: 0; }
.dop-inf-dueno-btn {
  flex-shrink: 0; padding: 6px 12px; background: var(--warn-fg); color: #fff; border: 0;
  border-radius: var(--r-sm); font: 600 12.5px/1.2 var(--sans); cursor: pointer;
}
.dop-inf-dueno-btn:hover { filter: brightness(1.15); }
.dop-inf-dueno-btn:focus-visible { outline: 2px solid var(--warn-fg); outline-offset: 2px; }
/* Documento: reporte médico corporativo formal, columna de lectura centrada (~72ch).
   Jerarquía de impacto: reportTitle (encabezado del documento, con regla berry) ≫
   studyTitle (rótulos de estudio, bordo, separados por divisor marcado) > docTitle
   (subtítulo/rótulo del tipo de estudio, subordinado) ; section = para (mismo color de
   lectura, section solo se distingue por MAYÚSCULAS + semibold). meta gris itálica;
   firma al pie con línea. */
.dop-inf-texto {
  flex: 1; min-height: 0; margin: 0; overflow: auto; overscroll-behavior: contain;
  padding: 24px max(24px, calc((100% - 72ch) / 2)) 30px;
  font: 400 15px/1.65 var(--sans); color: var(--ink);
  overflow-wrap: break-word;
}
/* Encabezado del documento: título formal (serif, --ink) + regla berry institucional debajo */
.dop-inf-reporttitle {
  display: block; font: 700 clamp(21px, 2.3vw, 26px)/1.2 var(--serif); letter-spacing: -.01em;
  color: var(--ink); margin: 0 0 10px; padding-bottom: 12px; border-bottom: 2px solid var(--accent);
}
/* Membrete: "Label:" (gris, fino, chico) + valor (destacado, --ink 600, un escalón mayor) */
.dop-inf-field { display: flex; align-items: baseline; gap: 8px; margin: 0 0 4px; }
.dop-inf-flabel { flex: none; min-width: 64px; font: 400 13px/1.4 var(--sans); color: var(--muted); } /* columna fija: alinea los valores */
.dop-inf-fvalue { font: 600 15px/1.4 var(--sans); color: var(--ink); }
/* docTitle: metadato del tipo de estudio dentro del header (gris, agrupado con el
   membrete). En gris —no bordo— para NO confundirse con los studyTitle (que sí son bordo). */
.dop-inf-doctitle { display: block; font: 600 12px/1.4 var(--sans); letter-spacing: .1em; text-transform: uppercase; color: var(--muted); margin: 10px 0 0; }
/* studyTitle/section son <h4>/<h5>: el font shorthand + letter-spacing/color explícitos
   pisan la regla global h1..h4 (serif/600/-.02em). margin completo pisa el default UA. */
.dop-inf-study { display: block; font: 700 17px/1.3 var(--sans); letter-spacing: .04em; color: var(--accent); margin: 16px 0 8px; }
.dop-inf-h { display: block; font: 600 var(--fs-label)/1.5 var(--sans); letter-spacing: .08em; color: var(--ink); margin: 14px 0 2px; }
.dop-inf-meta { display: block; font: italic 400 13px/1.5 var(--sans); color: var(--muted); margin: 0 0 2px; }
.dop-inf-para { margin: 0 0 4px; }
.dop-inf-firma {
  display: flex; flex-direction: column; align-items: flex-start; gap: 1px;
  /* margin-top generoso (~3 renglones): área de firma manuscrita antes del nombre. */
  max-width: 280px; margin: 72px 0 4px; padding-top: 10px; border-top: 1px solid var(--line-strong);
}
.dop-inf-firma strong { font: 700 14px/1.4 var(--sans); color: var(--ink); }
.dop-inf-firma span { font: 400 13px/1.4 var(--sans); color: var(--muted); }
/* Divisor entre estudios: corte marcado (línea más contrastada + aire amplio) para
   distinguir de un vistazo dónde termina un estudio y empieza el siguiente. */
.dop-inf-sep { border: 0; border-top: 2px solid rgba(42, 26, 30, .26); margin: 24px 0; }
.dop-inf-aviso { margin: 0; padding: 26px 24px 30px; font: 400 var(--fs-body)/1.55 var(--sans); color: var(--muted); }
/* Fondo PROPIO (FASE 3 de PART-2, cazado por el verificador): heredaba el blanco de la regla
   global footer, y cuando el footer paso a bordo este pie de modal claro se tiño con el. El
   patron de los otros pies de modal (--bg) ya declaraba el suyo; este era el unico colgado. */
.dop-inf-pie { background: var(--bg);
  display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 10px;
  padding: 14px 24px 22px; border-top: 1px solid var(--line);
}
.dop-inf-pie .btn { padding: 11px 20px; }
.dop-inf-pie .btn-primary { box-shadow: 0 6px 16px rgba(110, 37, 54, .20); } /* caída corta: no se recorta contra el radio del modal */
.dop-inf-pie .btn[disabled] { opacity: .55; pointer-events: none; box-shadow: none; } /* = .bwf-acciones (deuda: consolidar regla global) */
@media (max-width: 560px) {
  .dop-inf-titulo { font-size: 18px; }
  .dop-inf-head { padding: 16px 16px 12px; }
  .dop-inf-texto, .dop-inf-aviso { padding-left: 16px; padding-right: 16px; }
  .dop-inf-alerta { padding: 9px 16px; }
  .dop-inf-dueno { padding: 10px 16px; }
  .dop-inf-pie { padding: 12px 16px 16px; }
  .dop-inf-pie .btn { flex: 1 1 auto; }
}
/* Impresión: sólo el informe (espejo del patrón body.bw-modal-open de bewat) */
@media print {
  /* En papel las cards del Paso 1 van sin halo, en espejo con .rcl-card del Paso 3. */
  .dop-grid .card { box-shadow: none !important; border: 1px solid #ccc !important; }
  body.dop-inf-open { overflow: visible; } /* el scroll-lock de pantalla no rige en papel */
  body.dop-inf-open > *:not(.dop-inf-overlay) { display: none !important; }
  body.dop-inf-open .dop-inf-overlay { position: static; display: block; padding: 0; background: none; backdrop-filter: none; -webkit-backdrop-filter: none; }
  body.dop-inf-open .dop-inf-modal { width: 100%; max-height: none; border: 0; box-shadow: none; animation: none; overflow: visible; }
  body.dop-inf-open .dop-inf-texto { overflow: visible; padding: 12px 0 0; }
  body.dop-inf-open .dop-inf-head { padding: 0 0 10px; }
  body.dop-inf-open .dop-inf-x, body.dop-inf-open .dop-inf-pie, body.dop-inf-open .dop-inf-alerta,
  body.dop-inf-open .dop-inf-dueno { display: none !important; }
}

/* ================= Paso 3 · Reclasificación — layout compacto (una pantalla) ================= */
/* Identidad del participante en el header (compacto; espejo de .dop-headline) */
/* Encabezado (P3-7): fila superior [título en una línea | identidad], lead full-width debajo.
   Apila en ≤900px (título arriba, identidad abajo). */
/* max-width libre + margen inferior acotado (P3-12): reduce el gap encabezado↔primera card (era clamp 30–46 de .sec-head). */
.rcl-head { max-width: none; margin-bottom: clamp(16px, 2vw, 26px); }
/*
 * MISMA FILA HORIZONTAL QUE EL TÍTULO, igual que .dop-headline en el Paso 2.
 *
 * La fila contenía el bloque {eyebrow + título} como UN ítem, con la identidad de hermana y
 * `align-items: flex-end`. Eso iguala los bordes INFERIORES, no los centros: como el cajón es
 * más alto que el título —el nombre va en un cuerpo menor que el h1— quedaba 3 px por encima de
 * su eje. El Paso 2 no tiene el problema porque ahí el eyebrow vive FUERA de la fila y el título
 * es hermano directo de la identidad, centrados entre sí. El eyebrow se sacó de la fila (ver
 * index.html) y acá se centra: medido, 0 px de diferencia entre ejes, igual que el Paso 2.
 */
.rcl-head-row { display: flex; align-items: center; justify-content: space-between; gap: clamp(16px, 3vw, 40px); }
.rcl-head-row > .h2 { flex: 1; min-width: 0; }
/* H1 compacto: entra en UNA línea junto al chip (el .h2 a 52px envolvía en 2 líneas). */
/*
 * ══ EL TERCER SEGMENTO ENTRA EN LA MISMA ESCALA (PRACTICA-1 · D.1) ═══════════════════════
 *
 * «Consulta Médica y Tratamiento» —el NOMBRE del segmento— se dibujaba con el `.step-tag`
 * genérico: 12 px, sans, mayúsculas, interletrado de eyebrow. Contra los 44 px serif del
 * Doppler, el mismo nivel de la jerarquía se leía tres veces y medio más chico. Pasa a la voz
 * de segmento, como los otros dos.
 *
 * Y el paso —«Estratificación final e indicaciones»— baja a la voz de paso. NO es una
 * degradación: es la misma corrección que en el Paso 1. Hasta ahora el h1 era lo más grande
 * del encabezado y el nombre del segmento un rótulo diminuto encima, así que el segmento se
 * anunciaba por su destino y no por su identidad.
 *
 * La píldora «Paso 3» conserva su cuerpo de rótulo: es el numeral, no el título.
 */
.rcl-head .step-tag {
  font: 500 var(--fs-segmento)/1.05 var(--serif);
  letter-spacing: -.025em; text-transform: none; color: var(--accent);
  margin-bottom: 10px; gap: 12px;
}
.rcl-head .step-tag > span {
  font: 600 var(--fs-caption) var(--sans); letter-spacing: var(--ls-caption);
  text-transform: uppercase; align-self: center;
}
.rcl-head .h2 { font-size: var(--fs-segmento-paso); line-height: 1.1; margin: 0; }
.rcl-head .rcl-ident { margin-top: 0; flex-shrink: 0; }
.rcl-head > .rcl-lead { margin-top: 12px; }
@media (max-width: 900px) {
  .rcl-head-row { flex-direction: column; align-items: stretch; }
  .rcl-head .rcl-ident { margin-top: 16px; }
}
.rcl-ident { margin-top: clamp(16px, 2.2vw, 22px); }
/*
 * ══ EL CHIP ES FLUIDO; EL BUSCADOR NO (FLUJO-1 · 2) ═════════════════════════════════════
 *
 * DEFECTO MEDIDO: con «Rodríguez de la Fuente, María Esther» el chip quedaba en 460px y el nombre
 * y el DNI caían en DOS renglones —nombre en y=1617, DNI en y=1646—. El tope de 460px vivía en
 * `.bw-buscar`, que es el CONTENEDOR de los dos estados: el cajón de búsqueda y el chip. Un ancho
 * pensado para un campo de texto le quedaba chico al nombre de una persona.
 *
 * Los dos estados no quieren el mismo ancho y ahora no lo comparten: el cajón y su lista de
 * resultados conservan su tope propio —un campo de búsqueda de 900px se lee mal— y el chip crece
 * con lo que tiene adentro. Es el mismo reparto que la headline del Doppler ya usa.
 */
.rcl-ident .bw-buscar { margin: 0; }
.rcl-ident .bw-buscar-row { max-width: 390px; }
.rcl-ident .bw-part-id {
  position: relative; width: fit-content; min-width: 0; max-width: 100%;
  margin: 0; text-align: left; background: var(--surface); border: 1px solid var(--line-strong);
  border-radius: var(--r-pill); padding: 10px 50px 10px 16px; box-shadow: var(--shadow-sm);
  display: flex; align-items: center; gap: 12px;
}
/*
 * UNA SOLA FILA, SIEMPRE. `flex-wrap` era `wrap`: en cuanto el nombre y el DNI no entraban juntos,
 * el DNI se iba abajo y el chip pasaba a ocupar dos renglones de alto en una fila de encabezado que
 * está pensada para uno. Con `nowrap` el chip crece; si llegara a no haber lugar —un nombre
 * extremo en una pantalla angosta— lo que cede es el NOMBRE, con puntos suspensivos, y el DNI
 * queda entero: es el identificador con el que se chequea que la persona es la que se cree.
 */
.rcl-ident .bw-part-id-txt { display: flex; align-items: baseline; flex-wrap: nowrap; gap: 2px 10px; min-width: 0; }
.rcl-ident .bw-part-id-n {
  font: 600 clamp(19px, 1.7vw, 23px)/1.15 var(--serif); letter-spacing: -.01em; color: var(--ink);
  margin: 0; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.rcl-ident .bw-part-id-dni { position: static; display: inline-flex; align-items: baseline; gap: 6px; font: 600 var(--fs-num) var(--mono); color: var(--muted-2); margin: 0; white-space: nowrap; font-variant-numeric: tabular-nums; }
.rcl-ident .bw-part-id-dni::before { content: "·"; color: var(--muted-2); margin-right: 2px; }
.rcl-ident .bw-part-id > .bw-demo-tag { position: static; top: auto; left: auto; transform: none; order: 2; }
.rcl-ident .bw-part-x { position: absolute; top: 50%; right: 12px; transform: translateY(-50%); }
/* Foco visible del buscador (el input global lleva outline:none): anillo AA al enfocar */
.rcl-ident .bw-buscar-row:focus-within { outline: 2px solid var(--accent); outline-offset: 2px; }
/* El menú de resultados iguala el ancho del campo de búsqueda (no del identity, más ancho) */
.rcl-ident .bw-buscar-res { max-width: 390px; }

/* Layout del Paso 3 (rediseño): FILA 1 = Estratificación a ancho completo (el párrafo del motor deja
   de vivir en media-columna y baja de 6-7 a 2-3 renglones); FILA 2 = Meta + Doppler apilados a la
   izquierda y Terapéutica a la derecha, balanceadas. Se logra con grid-areas + display:contents en
   los wrappers (sin reestructurar el DOM). */
.rcl-core {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  grid-template-areas: "strat strat" "metat terap" "hall terap";
  gap: 18px; align-items: start; margin-bottom: clamp(16px, 2vw, 24px);
}
.rcl-col-estado, .rcl-col-accion { display: contents; }
.rcl-strat { grid-area: strat; }
.rcl-metat { grid-area: metat; }
.rcl-terap { grid-area: terap; }
.rcl-hall  { grid-area: hall; }
.rcl-card { --rcl-pad: clamp(18px, 2vw, 24px); background: var(--surface); border: 1px solid var(--line-strong); border-radius: var(--r-lg); padding: var(--rcl-pad); box-shadow: var(--shadow-sm); overflow: hidden; }
/* El padding-top de las cards NO debe heredar el de las secciones de vista (.view section = 56px):
   selector con id para empatar la especificidad (1,1,1) del override global y dejar el aire uniforme. */
#view-consulta section.rcl-card { padding: var(--rcl-pad); }
/* Header band: el título de cada card gana una banda bordó a sangre (texto blanco, AA ~10.6:1); el
   cuerpo de la card conserva su fondo. La banda asienta al tope y elimina el gap superior. */
.rcl-kicker { font: 600 var(--fs-caption) var(--sans); letter-spacing: var(--ls-caption); text-transform: uppercase; color: #fff; background: var(--accent); margin: calc(-1 * var(--rcl-pad)) calc(-1 * var(--rcl-pad)) 16px; padding: 11px var(--rcl-pad); border-radius: var(--r-lg) var(--r-lg) 0 0; text-align: center; }
/* Subtítulo del H1 en bordó (P3-6): AA 10.58:1 sobre --surface. Selector .lead.rcl-lead (0,2,0) para
   ganar por ESPECIFICIDAD y no solo por orden — inmune a un reordenamiento futuro (P3-7).
   El override opacity:1 (P3-14) se RETIRÓ: el leak `.lead{opacity:.22}` de los <style> de los SVG
   se arregló EN ORIGEN (motor_vascular.py scopea todo a .esqv y regenera esquemas-vasculares.js). */
.lead.rcl-lead { color: var(--accent); font-weight: 500; }
/* Estratificación = ANCLA visual: borde de acento + elevación; kicker/chips con más peso. */
.rcl-strat { border: 1.5px solid var(--accent); box-shadow: var(--shadow-md); }
.rcl-strat .rcl-kicker { font-size: 12px; }
.rcl-strat .rcl-bf-chip { font-size: 14px; padding: 8px 16px; }
.rcl-strat .rcl-eje-sop b { font-size: 15px; }

/* Chips de intervención (HTA / dislipemia en tratamiento) + info-callout al pie del sub-bloque HEARTS. */
.rcl-hearts-trat { display: flex; align-items: center; flex-wrap: wrap; gap: 7px; margin-top: 14px; padding-top: 13px; border-top: 1px solid var(--line); }
.rcl-hearts-trat-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 7px; }
.rcl-hearts-trat-chip { display: inline-flex; align-items: center; font: 600 10px var(--sans); letter-spacing: .05em; text-transform: uppercase; color: var(--accent); background: var(--accent-soft); border-radius: var(--r-pill); padding: 4px 11px; }

/* ===== Info-callouts accesibles (P3-6): botón (i) + popover fijo en body (escapa el overflow:hidden
   de la card). Espeja el patrón .dop-info/.dop-infotip; clases propias .rcl-info*. ===== */
.rcl-info-wrap { display: inline-flex; flex-shrink: 0; }
.rcl-info { display: inline-flex; align-items: center; justify-content: center; padding: 0; margin: 0; border: none; background: none; cursor: pointer; color: var(--muted-2); line-height: 0; transition: color .15s ease; }
.rcl-info:hover, .rcl-info[aria-expanded="true"] { color: var(--accent); }
.rcl-info:focus-visible { outline: var(--focus); outline-offset: 2px; border-radius: 50%; }
.rcl-info-src { display: none; }   /* fuente de contenido + destino de aria-describedby (se clona al popover) */
/* Popover único fijo en body, clamp a viewport (posicionado por JS). Fondo tinta, texto claro, multilínea. */
.rcl-infotip {
  position: fixed; z-index: 210; pointer-events: none; left: 0; top: 0;
  width: 270px; max-width: min(270px, 92vw); padding: 12px 14px;
  background: var(--ink); color: #fff; font: 400 12px/1.5 var(--sans);
  border: 1px solid rgba(255, 255, 255, .14); border-radius: var(--r-md);
  box-shadow: var(--shadow-md); text-transform: none; letter-spacing: 0;
  opacity: 0; visibility: hidden; transform: translateY(3px);
  transition: opacity .12s ease, transform .12s ease, visibility .12s;
}
.rcl-infotip[data-show="true"] { opacity: 1; visibility: visible; transform: none; }
.rcl-infotip strong { display: block; font: 700 12px var(--sans); margin-bottom: 7px; }
.rcl-info-bands { list-style: none; margin: 0; padding: 0; }
.rcl-info-bands li { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; padding: 3.5px 0; border-bottom: 1px solid rgba(255, 255, 255, .1); }
.rcl-info-bands li:last-child { border-bottom: 0; }
.rcl-info-bands li span { font-weight: 700; }
.rcl-info-bands li small { font: 600 11px var(--mono); color: rgba(255, 255, 255, .82); }
.rcl-info-sub { margin: 9px 0 0; font-size: 11px; color: rgba(255, 255, 255, .78); }
.rcl-info-pesa { margin: 10px 0 0; padding-top: 9px; border-top: 1px solid rgba(255, 255, 255, .14); font-size: 11.5px; line-height: 1.5; color: rgba(255, 255, 255, .9); }

/* Card única · los dos sub-bloques (Fuster-BEWAT | HEARTS-OPS) lado a lado.
   Columnas casi parejas (P3-6): BEWAT necesita ancho para su título dominante en una línea. */
.rcl-ejes2 { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.12fr); gap: clamp(16px, 2vw, 24px); }
.rcl-eje { min-width: 0; }
/* Divisor bordó (P3-6): separa claramente el eje BEWAT del eje HEARTS. */
.rcl-eje + .rcl-eje { border-left: 1.5px solid var(--accent); padding-left: clamp(16px, 2vw, 26px); }
/* Cabecera del sub-bloque: título dominante (flex) + info-callout a la derecha. */
.rcl-eje-head { display: flex; align-items: center; gap: 8px; }
.rcl-eje-t { flex: 1; min-width: 0; font: 700 16.5px var(--sans); color: var(--ink); letter-spacing: -.015em; margin: 0; }
.rcl-eje-st { font: 500 12px/1.35 var(--sans); color: var(--muted); margin: 2px 0 12px; }
.rcl-eje-sop { font: 500 12.5px var(--sans); color: var(--muted); margin: 10px 0 0; }
.rcl-eje-sop b { font: 700 var(--fs-num) var(--mono); color: var(--ink); font-variant-numeric: tabular-nums; }

/* Los 5 factores Fuster-BEWAT (siempre visibles; el <details> plegado se eliminó en P3-5). */
.rcl-bwlist { list-style: none; margin: 12px 0 0; padding: 0; }
.rcl-bwrow { display: flex; align-items: center; gap: 11px; padding: 7px 0; border-bottom: 1px solid var(--line); }
.rcl-bwrow:last-child { border-bottom: 0; padding-bottom: 0; }
.rcl-bwrow-dot { flex-shrink: 0; width: 10px; height: 10px; border-radius: 50%; }
.rcl-bwrow-k { flex: 1; min-width: 0; font: 500 var(--fs-label) var(--sans); color: var(--ink); display: flex; align-items: baseline; gap: 9px; }
.rcl-bwrow-k b { font: 700 12px var(--mono); color: var(--accent); flex-shrink: 0; width: 13px; }
.rcl-bwrow-v { flex-shrink: 0; font: 700 var(--fs-num) var(--mono); color: var(--ink); font-variant-numeric: tabular-nums; }

/* Eje HEARTS · basal → final (única aparición de la banda en la vista) */
/* P3-14 · el par basal→flecha→final NO envuelve nunca (flex-wrap:nowrap). Con banda de rango largo
   (ej. "Moderado 10-<20%") las columnas se comprimen (min-width:0) y el rango cae a su línea interna
   dentro del chip (ver .rcl-bf-chip), en vez de tirar el chip final a una segunda fila. */
.rcl-bf-row { display: flex; align-items: center; gap: 8px; flex-wrap: nowrap; }
.rcl-bf-col { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.rcl-bf-k { font: 500 10.5px var(--sans); letter-spacing: .08em; text-transform: uppercase; color: var(--muted-2); }
/* flex-wrap:wrap + min-width:0 → el rango (<small>) baja a una línea interna SÓLO cuando el chip se
   comprime (columna angosta); con espacio sobrado queda inline. row-gap:1px mantiene el chip compacto. */
.rcl-bf-chip { display: inline-flex; flex-wrap: wrap; align-items: baseline; align-content: center; column-gap: 7px; row-gap: 1px; min-width: 0; border-radius: var(--r-pill); padding: 7px 14px; font: 700 13px var(--sans); }
/* white-space:nowrap (P3-14): el rango (ej. "20-<30%") es ATÓMICO — si el chip se comprime, cae entero
   a su línea interna en vez de partirse por el guión ("20-" / "<30%"). Chip máx 2 líneas: nombre / rango. */
.rcl-bf-chip small { font: 600 10.5px var(--mono); opacity: .82; white-space: nowrap; }
.rcl-chip-neutro { background: var(--neutral-bg); color: var(--neutral-fg); }
.rcl-bf-arrow { color: var(--muted-2); flex-shrink: 0; display: inline-flex; align-items: center; margin-top: 16px; }
/* Motivo de reclasificación: con peso legible (no gris tenue) — chip berry sobre tinte suave. */
.rcl-bf-nota { font: 600 12.5px/1.5 var(--sans); color: var(--accent); margin: 7px 0 0; background: var(--accent-soft); border-radius: var(--r-sm); padding: 9px 12px; }
/* Variables clínicas que alimentan la OMS (inputsHearts→discretizar): mismo ritmo ESTRUCTURAL que
   los 5 factores BEWAT — clave a la izquierda, valor a la derecha, misma caja de fila. El paralelismo
   es de estructura, no tipográfico: la ficha va en sans porque 3 de sus 6 valores son texto
   (ver .rcl-ficha .rcl-varrow-v más abajo), mientras .rcl-bwrow-v sí va en mono porque es siempre
   cifra ("3 pts"). El var(--mono) de la base de acá no se renderiza en ninguna instancia viva. */
.rcl-varlist { list-style: none; margin: 0; padding: 0; }
.rcl-varrow { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; padding: 7px 0; border-bottom: 1px solid var(--line); }
.rcl-varrow:last-child { border-bottom: 0; padding-bottom: 0; }
.rcl-varrow-k { min-width: 0; font: 500 var(--fs-label) var(--sans); color: var(--muted); }
.rcl-varrow-v { flex-shrink: 0; font: 700 var(--fs-num) var(--mono); color: var(--ink); font-variant-numeric: tabular-nums; text-align: right; }
/* Reestratificación (párrafo del motor): salió de la media-columna del eje HEARTS a una franja
   full-width bajo los ejes → ancho de lectura cómodo (2-3 renglones en vez de 7-8), texto ink
   legible con acento lateral. Se oculta con el slot si no hay nota (:has). */
.rcl-reclas { margin-top: 16px; }
.rcl-reclas:has([data-rcl="motivo"][hidden]) { display: none; }
.rcl-reclas-lbl { font: 600 10.5px var(--sans); letter-spacing: .07em; text-transform: uppercase; color: var(--muted-2); margin: 0 0 6px; }
.rcl-reclas .rcl-bf-nota { font: 400 13px/1.6 var(--sans); color: var(--ink); background: var(--accent-soft); border-left: 3px solid var(--accent); border-radius: var(--r-sm); padding: 14px 16px; margin: 0; }
/* Reestratificación en subsecciones: rótulo en el idioma de #metas (.metas-blk-lbl: negrita, uppercase,
   acento) sobre cada bloque + su texto debajo, con divisor fino entre subsecciones. Sin cajas anidadas
   ni colores fuertes; el berry queda sólo en el rótulo y en la barra izquierda del inset. */
.rcl-reclas-seg { display: block; }
.rcl-reclas-seg + .rcl-reclas-seg { margin-top: 12px; padding-top: 12px; border-top: 1px solid rgba(110, 37, 54, .14); }
.rcl-reclas-seg-t { display: block; font: 700 10.5px var(--sans); letter-spacing: .09em; text-transform: uppercase; color: var(--accent); margin: 0 0 4px; }
.rcl-reclas-seg-x { display: block; }

/* Datos del participante: viven DENTRO del eje HEARTS-OPS porque son exactamente sus inputs
   (ver reclasificacion.js, renderHeartsVars), pegados al score que alimentan. Se presentan como
   lista clave→valor con el estilo base .rcl-varlist/.rcl-varrow; antes eran tiles en grilla en una
   franja full-width al pie de la card. NO equilibra las columnas ni "llena" el vacío: .rcl-ejes2 es
   1fr/1.12fr con stretch, así que el remanente vertical sólo cambia de lado. El motivo es la
   adyacencia input→score, no la geometría. */
/* Conflicto de dueño: bloqueo de emisión, no borrado. Rojo de alerta (no el ámbar de precaución de
   precaución): acá hay una inconsistencia que el médico debe resolver. Es role="alert" — aparece
   por un cambio de estado y debe anunciarse. El botón es la salida sin pérdida y va en la misma
   fila, alineado al final. */
.rcl-dueno-aviso { display: flex; align-items: flex-start; flex-wrap: wrap; gap: 9px; margin: 0 0 14px; padding: 11px 13px; background: var(--warn-bg); border: 1px solid var(--warn-line); border-radius: var(--r-md); font: 600 12.5px/1.45 var(--sans); color: var(--warn-fg); }
.rcl-dueno-aviso svg { flex-shrink: 0; margin-top: 1px; }
.rcl-dueno-aviso > span { flex: 1 1 12rem; min-width: 0; }
.rcl-dueno-btn { flex-shrink: 0; padding: 6px 12px; background: var(--warn-fg); color: #fff; border: 0; border-radius: var(--r-sm); font: 600 12.5px/1.2 var(--sans); cursor: pointer; }
.rcl-dueno-btn:hover { filter: brightness(1.15); }
.rcl-dueno-btn:focus-visible { outline: 2px solid var(--warn-fg); outline-offset: 2px; }
.rcl-ficha { margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--line); }
.rcl-ficha-lbl { font: 600 10.5px var(--sans); letter-spacing: .07em; text-transform: uppercase; color: var(--muted-2); margin: 0 0 6px; }
/* La base manda los valores a --mono; pero 3 de las 6 filas son texto (Masculino · Sí · No) y el
   contrato tipográfico del proyecto reserva la mono SÓLO para cifras, nunca para texto corrido.
   Se acota a la FAMILIA y nada más: peso, cuerpo, alineación y el tabular-nums de la base quedan
   intactos (la sans del proyecto ya entrega figuras tabulares, así que las cifras siguen alineando). */
.rcl-ficha .rcl-varrow-v { font-family: var(--sans); }
/* Laboratorio: misma caja de fila que la ficha (mismo ritmo), pero con separación propia y un
   rótulo que aclara que NO alimenta el score. El matiz va en la nota, no en un color de alarma:
   es una precisión de lectura, no una advertencia. */
.rcl-lab { margin-top: 12px; padding-top: 10px; border-top: 1px dashed var(--line); }
.rcl-lab-lbl { font: 600 10.5px var(--sans); letter-spacing: .07em; text-transform: uppercase; color: var(--muted-2); margin: 0 0 6px; }
.rcl-lab-nota { font-weight: 500; letter-spacing: .04em; text-transform: none; }
.rcl-lab .rcl-varrow-v { font-family: var(--sans); }

/* Hallazgos de imagen (lista simple; la meta se movió a su card propia) */
.rcl-hall-list { list-style: none; margin: 0; padding: 0; }
.rcl-hall-list li { display: flex; justify-content: space-between; gap: 14px; padding: 6.5px 0; border-bottom: 1px solid var(--line); font: 500 13px var(--sans); }
.rcl-hall-list li:last-child { border-bottom: 0; padding-bottom: 0; }
.rcl-hall-list li > span { color: var(--muted); flex-shrink: 0; }
.rcl-hall-list li > strong { font-weight: 600; color: var(--ink); text-align: right; }
.rcl-hall-list li.is-warn > strong { color: var(--warn-fg); }

/* Meta de tratamiento: C-LDL (vía estándar) + PA (regla de Metas). Dos ítems lado a lado. */
.rcl-metat-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.rcl-metat-item { display: flex; flex-direction: column; gap: 3px; background: var(--neutral-bg); color: var(--ink); border-radius: var(--r-md); padding: 13px 16px; min-width: 0; }
.rcl-metat-item[data-tone="ok"] { background: var(--ok-bg); color: var(--ok-fg); }
.rcl-metat-item[data-tone="warn"] { background: var(--warn-bg); color: var(--warn-fg); }
.rcl-metat-k { font: 600 10.5px var(--sans); letter-spacing: .07em; text-transform: uppercase; color: var(--muted-2); }
/* Sin opacity: a 10,5px el .85 dejaba el rótulo en 4,24:1 sobre --warn-bg, bajo AA. La jerarquía
   frente a la cifra ya la da el cuerpo (10,5px versal vs 23px) y no necesita apoyarse en el alfa. */
.rcl-metat-item[data-tone="ok"] .rcl-metat-k, .rcl-metat-item[data-tone="warn"] .rcl-metat-k { color: inherit; }
/* Lenguaje de #metas: cifra protagonista (grande), unidad chica, brecha clara, chip de atribución. */
.rcl-metat-v { font: 700 23px/1.2 var(--sans); color: var(--ink); font-variant-numeric: tabular-nums; letter-spacing: -.015em; margin-top: 2px; overflow-wrap: break-word; }
.rcl-metat-item[data-tone] .rcl-metat-v { color: inherit; }
.rcl-metat-v small { font: 500 12px var(--sans); color: var(--muted-2); letter-spacing: 0; }
/* La unidad hereda el fg PLENO del tono (sin opacity): con tono ok/warn el opacity bajaba el <small>
   de 12px por debajo de AA (warn 3,86:1 · ok 4,25:1). A pleno queda AA (ok 6,64 · warn 5,56). */
.rcl-metat-item[data-tone] .rcl-metat-v small { color: inherit; }
.rcl-metat-e { font: 800 13px var(--sans); margin-top: 3px; }
/* Referencia al pie de cada meta: SIN recuadro (era una pill con borde) y anclada al fondo con
   margin-top:auto, para que en "Colesterol LDL" y "Presión arterial" caiga a la MISMA altura aunque
   la caja de LDL sume la línea de brecha (los items del grid ya estiran a igual alto).
   El color NO sigue al tono: sólo la caja de C-LDL recibe data-tone, así que heredarlo pintaba el
   MISMO texto en rojo de alarma a la izquierda y en gris a la derecha —dos citas idénticas leídas
   como distintas— y además diluía el rojo, que acá significa "fuera de meta", sobre metadata
   bibliográfica. Gris fijo en los tres estados: AA sobre los tres fondos (neutral 4,99 · warn 4,99 ·
   ok 5,02). Cuerpo 10px: subordina la cita al rótulo de la caja (10,5px) y evita que "Referencia:"
   parta la línea a 1180px, que es el ancho canónico del diseño. */
.rcl-metat-src { margin-top: auto; padding-top: 10px; font: 500 10px/1.35 var(--sans); color: var(--muted-2); }
@media (max-width: 560px) { .rcl-metat-grid { grid-template-columns: 1fr; } }

/* Terapéutica · checklist del médico. CARD CLARA (tinte berry suave): baja su jerarquía
   frente a Estratificación (antes era bordo oscuro y dominaba). Acentos berry, texto AA. */
.rcl-terap { flex: 1; display: flex; flex-direction: column; background: var(--accent-soft); border-color: var(--line); }
/* La banda del kicker es bordó/blanca (regla general .rcl-kicker); el CUERPO sigue claro (accent-soft). */
.rcl-terap .rcl-terap-lead { font: 400 12.5px/1.5 var(--sans); color: var(--muted); margin: 0 0 4px; }
.rcl-terap-grupo { border: 0; margin: 14px 0 0; padding: 0; min-width: 0; }
.rcl-terap-grupo legend { font: 600 10.5px var(--sans); letter-spacing: .07em; text-transform: uppercase; color: var(--muted-2); padding: 0; margin: 0 0 6px; }
.rcl-checks { display: grid; grid-template-columns: repeat(auto-fit, minmax(185px, 1fr)); gap: 2px 10px; }
.rcl-check { position: relative; display: flex; align-items: center; gap: 10px; padding: 7px 8px; border-radius: var(--r-sm); cursor: pointer; font: 500 13px var(--sans); color: var(--ink); transition: background .12s ease; }
.rcl-check:hover { background: rgba(110, 37, 54, .07); }
.rcl-check input { position: absolute; opacity: 0; pointer-events: none; }
.rcl-check-box { flex-shrink: 0; width: 19px; height: 19px; border-radius: 6px; border: 1.5px solid var(--line-strong); background: var(--surface); position: relative; transition: background .12s ease, border-color .12s ease; }
.rcl-check-box::after { content: ""; position: absolute; left: 4px; top: 4.5px; width: 9px; height: 5px; border-left: 2.2px solid #fff; border-bottom: 2.2px solid #fff; transform: rotate(-45deg); opacity: 0; }
.rcl-check input:checked ~ .rcl-check-box { background: var(--accent); border-color: var(--accent); }
.rcl-check input:checked ~ .rcl-check-box::after { opacity: 1; }
.rcl-check input:focus-visible ~ .rcl-check-box { outline: 2px solid var(--accent); outline-offset: 2px; }
.rcl-terap .rcl-terap-ref { font: 400 11.5px/1.55 var(--sans); color: var(--muted-2); margin: 16px 0 0; border-top: 1px solid var(--line); padding-top: 12px; }
.rcl-terap .rcl-terap-ref [data-rcl="sugerido"] { color: var(--accent); font-weight: 600; }
/* P3-13 · Desktop (2 columnas con stretch): el pie de referencia se ancla al fondo de la card
   (patrón footer, margin-top:auto absorbe el aire remanente) para que el espacio sobrante quede
   intencional y no como vacío bajo el checklist. El contenido honesto de Terapéutica no llena la
   card estirada (límite estructural — no se rellena con espacio muerto). Sólo ≥981px, donde el
   núcleo es de 2 columnas; en mobile (apilado) conserva el margen natural de 16px. */
@media (min-width: 981px) { .rcl-terap .rcl-terap-ref { margin-top: auto; } }

/* Gap inferior (contenido → footer): la sección heredaba el padding-bottom base de `section`
   (clamp 60–120px). Se acota; la clearance del FAB mobile la da `.container` (no esta regla).
   Gap superior (P3-12): la sección heredaba padding-top clamp 34–56 (.view section); se baja al mínimo
   (el breadcrumb queda pegado bajo la banda de logos, que está en flujo — no hay elemento fijo que despejar). */
#view-consulta section[data-subflow="reclasificacion"] { padding-top: clamp(12px, 1.6vw, 18px); padding-bottom: clamp(38px, 4vw, 52px); }

/* Responsive: núcleo apilado en tablet/mobile; ejes apilados en mobile angosto */
@media (max-width: 980px) {
  .rcl-core { grid-template-columns: 1fr; grid-template-areas: "strat" "metat" "terap" "hall"; }
}
@media (max-width: 640px) {
  .rcl-ejes2 { grid-template-columns: 1fr; }
  .rcl-eje + .rcl-eje { border-left: 0; padding-left: 0; border-top: 1.5px solid var(--accent); padding-top: 14px; }
  .rcl-hall-grid { grid-template-columns: 1fr; }
  .rcl-ident .bw-buscar { max-width: 100%; }
}
/* Impresión: tarjetas legibles; chips/checks conservan color semántico */
@media print {
  .rcl-card { border: 1px solid #ccc !important; box-shadow: none !important; overflow: visible; }
  /* Header band → en papel: título bordó a tinta con regla inferior (no depende de imprimir fondos). */
  .rcl-kicker { background: transparent !important; color: var(--accent) !important; margin: 0 0 10px !important; padding: 0 0 7px !important; border-radius: 0 !important; border-bottom: 1.5px solid var(--accent); }
  .rcl-bf-chip, .rcl-metat-item, .rcl-check-box { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
  .rcl-check-box { border-color: #999 !important; }
  .rcl-ident .bw-part-x { display: none !important; } /* la × no es contenido */
  .rcl-info, .rcl-infotip { display: none !important; } /* callouts suplementarios: fuera de papel */
}

/* ============ P3-4 · Botón flotante "Finalizar Consulta Médica" (rail = réplica del Paso 1) ============
   El RAIL .rcl-fab clona la posición de .bw-rail-izq del Paso 1: barra inferior fija hasta 1419px,
   círculo fijo al borde IZQUIERDO centrado vertical desde 1420px. El botón usa el CSS NATIVO de
   .bw-fin-btn (barra/círculo + ECG), sin overrides. Vive dentro de la sección → el [hidden] de la
   vista lo oculta fuera del Paso 3; reclasificacion.js togglea [hidden] según paciente activo. */
.rcl-fab { position: fixed; left: 0; right: 0; bottom: 0; z-index: 45; display: flex; justify-content: center; padding: 10px clamp(16px, 4vw, 24px) calc(12px + env(safe-area-inset-bottom)); background: rgba(251, 247, 246, .9); backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px); border-top: 1px solid var(--line); }
@media (min-width: 1420px) {
  .rcl-fab { left: 24px; right: auto; bottom: auto; top: calc(var(--clinical-side-control-center-y, 50vh) - 80px); width: 160px; display: block; padding: 0; background: none; backdrop-filter: none; -webkit-backdrop-filter: none; border-top: 0; }
  /* Reserva de aire a la izquierda para que el círculo (borde der ~184px) NO tape el contenido.
     Sólo cuando el margen natural del container no alcanza (desktops angostos); box-sizing:border-box
     mantiene el container centrado, con el padding vacío donde flota el FAB. */
  [data-subflow="reclasificacion"] > .container { padding-left: max(0px, calc(198px - (100vw - var(--maxw)) / 2)); }
}
/* La barra inferior (mobile) no debe tapar el contenido del Paso 3: se reserva aire al pie. */
@media (max-width: 1419px) {
  [data-subflow="reclasificacion"] > .container { padding-bottom: 92px; }
}

/* Modal de resumen: andamiaje calcado del modal ecodoppler; clases propias .rcl-modal-* */
body.rcl-modal-open { overflow: hidden; }
.rcl-modal-overlay { position: fixed; inset: 0; z-index: 70; display: flex; align-items: center; justify-content: center; padding: clamp(12px, 3vw, 32px); background: rgba(42, 26, 30, .5); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); animation: rcl-modal-in .18s ease; }
@keyframes rcl-modal-in { from { opacity: 0; } to { opacity: 1; } }
@keyframes rcl-modal-pop { from { opacity: 0; transform: translateY(10px) scale(.985); } to { opacity: 1; transform: none; } }
.rcl-modal { width: min(680px, 100%); max-height: min(88vh, 900px); display: flex; flex-direction: column; background: var(--surface); border-radius: var(--r-lg); box-shadow: var(--shadow-md); overflow: hidden; animation: rcl-modal-pop .2s cubic-bezier(.2, .7, .3, 1); }
.rcl-modal:focus { outline: none; }
/* Encabezado del modal (P3-4): Programa (kicker) → Título del documento → Paciente → DNI · Fecha.
   Sin bloque código/fecha debajo: tope compacto. */
.rcl-modal-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; padding: clamp(18px, 2.2vw, 24px) clamp(18px, 2.4vw, 28px) 16px; border-bottom: 1px solid var(--line); }
.rcl-modal-kicker { font: 700 var(--fs-caption) var(--sans); letter-spacing: var(--ls-caption); text-transform: uppercase; color: var(--accent); margin: 0 0 4px; }
.rcl-modal-titulo { font: 600 clamp(17px, 1.9vw, 21px)/1.2 var(--serif); color: var(--ink); margin: 0; letter-spacing: -.01em; }
.rcl-modal-paciente { font: 700 16px var(--sans); color: var(--accent); margin: 10px 0 0; }
.rcl-modal-dni { font: 600 var(--fs-num) var(--mono); color: var(--muted-2); margin: 4px 0 0; display: flex; align-items: center; flex-wrap: wrap; gap: 4px 8px; font-variant-numeric: tabular-nums; }
.rcl-modal-fecha { color: var(--muted-2); font: 500 var(--fs-label) var(--sans); }
.rcl-modal-x { flex-shrink: 0; width: 38px; height: 38px; border-radius: 50%; background: var(--neutral-bg); color: var(--muted); display: inline-flex; align-items: center; justify-content: center; transition: background .15s ease, color .15s ease; }
.rcl-modal-x:hover { background: var(--accent-soft); color: var(--accent); }
.rcl-modal-body { flex: 1 1 auto; overflow-y: auto; padding: clamp(16px, 2.2vw, 24px) clamp(18px, 2.4vw, 28px); display: flex; flex-direction: column; gap: clamp(16px, 2vw, 22px); }
.rcl-modal-body:focus-visible { outline: 2px solid var(--accent); outline-offset: -3px; }
/* Reset del padding global de `section` (styles.css :section): los segmentos del modal no
   son secciones de página. Sin esto heredan ~120px de aire muerto arriba/abajo. */
.rcl-seg { padding: 0; margin: 0; }
.rcl-seg-k { display: flex; align-items: center; gap: 10px; font: 600 12px var(--sans); letter-spacing: .05em; text-transform: uppercase; color: var(--accent); margin: 0 0 10px; }
.rcl-seg-n { flex-shrink: 0; width: 22px; height: 22px; border-radius: 50%; background: var(--accent); color: #fff; font: 700 12px var(--mono); display: inline-flex; align-items: center; justify-content: center; }
.rcl-rs-row { display: flex; justify-content: space-between; gap: 16px; padding: 6.5px 0; border-bottom: 1px solid var(--line); font: 500 13px var(--sans); }
.rcl-rs-row:last-child { border-bottom: 0; }
.rcl-rs-row > span { color: var(--muted); flex-shrink: 0; }
.rcl-rs-row > strong { color: var(--ink); font-weight: 600; text-align: right; }
/* Antecedentes de alto riesgo: mismo eje óptico que los bloques con [data-campo], que llevan
   padding-left para dejar lugar a la barra de estado. Éste no es campo obligatorio (sin
   data-campo) pero debe alinear con sus hermanos. */
.bw-conditions-card { padding-left: 16px; }   /* G-04: sin barra de estado, 1 + 16 + 2 = 19 */

/* Encabezado contextual del bloque de metas (ECV documentada, §4.3): enmarca las metas como
   referencia orientativa. Un escalón por debajo de .rcl-exclusion: informa, no interrumpe. */
.rcl-metat-aviso { margin: 0 0 12px; padding: 9px 11px; background: var(--accent-soft); border-left: 3px solid var(--accent); border-radius: var(--r-sm); font: 500 12px/1.5 var(--sans); color: var(--accent); }

.rcl-seg-motivo { font: 500 12.5px/1.5 var(--sans); color: var(--accent); margin: 8px 0 2px; }
/* Aviso de DERIVACIÓN por ECV documentada (§4.3). Misma familia formal que .metas-motivo
   (acento berry, borde izquierdo), un punto más de peso porque interrumpe el circuito. */
.rcl-exclusion { margin: 14px 0 0; padding: 12px 14px; background: var(--accent-soft); border: 1px solid var(--line); border-left: 3px solid var(--accent); border-radius: var(--r-md); font: 600 13px/1.55 var(--sans); color: var(--accent); max-width: 78ch; }
.rcl-seg-nota { font: 400 11.5px/1.5 var(--sans); color: var(--muted-2); margin: 9px 0 0; }
.rcl-rs-terap { margin-top: 12px; }
.rcl-rs-terap-k { display: block; font: 600 10.5px var(--sans); letter-spacing: .06em; text-transform: uppercase; color: var(--muted-2); margin-bottom: 7px; }
.rcl-rs-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.rcl-rs-chips span { font: 600 12px var(--sans); color: var(--accent); background: var(--accent-soft); border-radius: var(--r-pill); padding: 4px 11px; }
.rcl-rs-vacio { font: 500 12.5px var(--sans); color: var(--muted-2); }
.rcl-modal-pie { display: flex; gap: 12px; justify-content: flex-end; flex-wrap: wrap; padding: 14px clamp(18px, 2.4vw, 28px); border-top: 1px solid var(--line); background: var(--bg); }
.rcl-modal-estado { flex: 1 0 100%; margin: 0; padding: 9px 11px; border-radius: var(--r-sm); background: var(--neutral-bg); color: var(--muted); font: 600 var(--fs-label)/1.45 var(--sans); }
.rcl-modal-estado[data-tono="error"] { background: var(--warn-bg); color: var(--accent-deep); }
.rcl-modal-estado[data-tono="ok"] { background: var(--ok-bg); color: var(--ok-fg); }
.rcl-modal-pie .btn[data-fin-estado="procesando"] { opacity: .72; cursor: progress; }
.rcl-modal-pie .btn[data-fin-estado="finalizado"] { opacity: .72; cursor: default; }
@media (max-width: 560px) {
  .rcl-modal-pie { justify-content: stretch; }
  .rcl-modal-pie .btn { flex: 1 1 auto; justify-content: center; }
}
@media (prefers-reduced-motion: reduce) { .rcl-modal-overlay, .rcl-modal { animation: none; } }
/* Impresión: FAB y modal fuera de papel (el PDF es la ruta de impresión). Si el usuario
   hace Ctrl+P con el modal abierto, se neutraliza el scroll-lock para no recortar la página. */
@media print {
  .rcl-fab, .rcl-modal-overlay { display: none !important; }
  body.rcl-modal-open { overflow: visible !important; }
}

/* ---------- Login / gate de sesión (AUTH-1) ---------- */
/* El gate es de VISIBILIDAD (la seguridad de los datos es server-side, lote AUTH-4).
   body sin data-auth = Firebase aún resolviendo la sesión: telón berry, sin login ni
   contenido (evita el flash de contenido protegido). js/auth.js estampa data-auth
   "in"/"out" cuando onAuthStateChanged responde. El router corre por debajo intacto. */
body:not([data-auth]) { background: var(--accent-deep); }
/* Catch-all: sin sesión NINGÚN hijo de body se muestra salvo .login — cubre también
   #sr-status (aria-live con datos clínicos), los overlays de modales y cualquier nodo
   que un módulo cuelgue de body en runtime (tooltips), sin lista que mantener. */
body:not([data-auth="in"]) > :not(.login) { display: none; }
body:not([data-auth="out"]) > .login { display: none; }

/* Pantalla de ingreso: mismo tratamiento de portada que .hero (fondo berry radial,
   logos blancos, kicker, serif display, strip ECG), en composición centrada. */
.login {
  position: relative; overflow: hidden; min-height: 100vh;
  display: flex; flex-direction: column; justify-content: center;
  /* top corto: los logos van pegados al borde superior (franja institucional);
     el centrado del bloque kicker/título/card lo gobierna el auto del kicker. */
  padding: clamp(26px, 4vh, 44px) clamp(20px, 6vw, 80px) 0;
  background: radial-gradient(135% 125% at 84% -12%, var(--accent) 0%, var(--accent-deep) 73%);
  color: #fff;
}
.login-inner {
  position: relative; z-index: 3; width: 100%; max-width: var(--maxw); margin: 0 auto;
  display: flex; flex-direction: column; align-items: center; text-align: center; flex: 1;
  justify-content: center;
}
/* Logos arriba (sin auto): franja institucional pegada al borde superior. El doble auto
   que centra vive ahora en el kicker (arriba) y el ECG (abajo): el aire sobrante se
   reparte entre logos→kicker y card/ayuda→ECG — centrado óptico del bloque de ingreso. */
.login-logos { justify-content: center; margin-bottom: clamp(24px, 3.5vh, 38px); gap: clamp(26px, 4vw, 50px); }
.login-logos img { height: 52px; } /* mayor presencia que en el hero (44px): acá son protagonistas */
.login-kicker { margin-top: auto; margin-bottom: clamp(20px, 3vh, 28px); font-size: var(--fs-label); }
/* 15ch fuerza el quiebre editorial en TRES líneas balanceadas:
   "Programa PESA / de Prevención / Cardiovascular" (13/13/14 caracteres). */
.login-title {
  font: 600 clamp(30px, 4vw, 48px)/1.08 var(--serif); letter-spacing: -.02em;
  margin: 0 0 clamp(32px, 5vh, 50px); max-width: 15ch; color: #fff; text-wrap: balance;
}

/* Card de credenciales: superficie clara del sistema sobre el berry (misma familia
   formal que las cards: --r-lg; sombra un escalón sobre --shadow-md por el fondo oscuro). */
.login-card {
  width: 100%; max-width: 420px; text-align: left; color: var(--ink);
  background: var(--surface); border-radius: var(--r-lg);
  padding: clamp(24px, 3vw, 32px);
  box-shadow: 0 16px 44px rgba(0, 0, 0, .22), 0 2px 8px rgba(0, 0, 0, .14); /* elevación macOS: difusa, sin dureza */
}
.login-label {
  display: block; font: 600 var(--fs-caption) var(--sans); letter-spacing: var(--ls-caption);
  text-transform: uppercase; color: var(--muted-2); margin: 0 0 7px;
}
.login-input {
  display: block; width: 100%; padding: 12px 14px; margin: 0 0 16px;
  font: 400 16px var(--sans); /* ≥16px: evita el auto-zoom de iOS Safari al enfocar */
  color: var(--ink); background: var(--surface);
  /* Borde bordó pleno en reposo: DECISIÓN DE PORTADA del director (lote LOGIN-POLISH).
     Objeción de auditoría registrada: sube el ruido en reposo y comparte familia con el
     rojo de error; si algún día molesta, bajar a rgba(110,37,54,.35) y accent solo en foco. */
  border: 1.5px solid var(--accent); border-radius: var(--r-sm);
  transition: border-color .15s ease;
}
/* El anillo de foco AA lo da el :focus-visible global del sistema (3px var(--accent));
   acá el borde profundiza un escalón — no se suprime el outline. */
.login-input:focus, .login-input:focus-visible { border-color: var(--accent-deep); }
/* Error como caption adosado a los campos (mínimo de tinta; el rojo AA del sistema). */
.login-error {
  margin: -6px 0 16px; font: 500 var(--fs-label)/1.5 var(--sans); color: var(--warn-fg);
}
/* CTA con relieve (macOS): gradiente berry vertical (claro → --accent → --berry-panel)
   + highlight interno 1px + borde profundo + elevación corta (menor que la de la card,
   que es la superficie que lo sostiene). hover/active redeclaran el gradiente porque el
   `background:` de .btn-primary:hover lo pisaría (shorthand resetea background-image).
   NOTA: el modal de cambio de contraseña comparte .login-btn a propósito (mismo CTA de
   cuenta sobre card blanca) — si Hernán prefiere el plano ahí, scopear a #login-form. */
.login-btn {
  --btn-grad: linear-gradient(180deg, #8a3247 0%, var(--accent) 52%, var(--berry-panel) 100%);
  margin-top: 14px; padding: 15px 24px; /* respiro propio: zona de acción, no un campo más */
  background: var(--btn-grad);
  border: 1px solid var(--accent-deep);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .22), 0 6px 16px rgba(72, 20, 31, .32), 0 2px 5px rgba(0, 0, 0, .18);
  transition: transform .12s ease, box-shadow .15s ease, filter .15s ease;
}
.login-btn:hover:not(:disabled) {
  background: var(--btn-grad);
  filter: brightness(1.07); transform: translateY(-1px);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .24), 0 9px 20px rgba(72, 20, 31, .38), 0 3px 7px rgba(0, 0, 0, .2);
}
.login-btn:active:not(:disabled) {
  background: var(--btn-grad);
  filter: brightness(.97); transform: translateY(1px);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .12), 0 3px 8px rgba(72, 20, 31, .28);
}
/* .8 (no .65): "Ingresando…" debe seguir leyéndose durante la espera de red. */
.login-btn:disabled { opacity: .8; cursor: default; transform: none; filter: none; }
/* Ayuda de acceso, bajo la card (blanca .78 sobre berry = AA holgado). El número NO se
   muestra por defecto: vive en el tooltip del ícono (hover/focus lo revelan, CSS puro)
   y en el aria-label del enlace para lectores de pantalla. El click/tap abre wa.me. */
.login-ayuda {
  display: flex; align-items: center; justify-content: center; flex-wrap: wrap;
  gap: 8px 10px; margin: 20px 0 0;
  font: 500 13.5px/1.6 var(--sans); color: rgba(255, 255, 255, .78);
}
.login-ayuda-wa {
  position: relative; display: inline-flex; align-items: center; justify-content: center;
  width: 38px; height: 38px; border-radius: 50%;
  color: #fff; background: rgba(255, 255, 255, .12); border: 1px solid rgba(255, 255, 255, .32);
  transition: background .15s ease, border-color .15s ease;
}
.login-ayuda-wa:hover, .login-ayuda-wa:focus-visible { background: rgba(255, 255, 255, .2); border-color: rgba(255, 255, 255, .58); }
/* Único focusable directo sobre el berry: el outline accent global sería 1.4:1 (invisible).
   NO generalizar a `.login :focus-visible` — pintaría blanco el anillo dentro de la card. */
.login-ayuda-wa:focus-visible { outline-color: #fff; }
/* Pill DEBAJO del círculo: arriba solaparía blanco-sobre-blanco la esquina de la card. */
.login-ayuda-num {
  position: absolute; top: calc(100% + 10px); left: 50%;
  transform: translateX(-50%) translateY(-4px);
  padding: 7px 13px; border-radius: var(--r-pill);
  background: var(--surface); color: var(--accent);
  font: 700 13px var(--sans); letter-spacing: .02em; white-space: nowrap;
  box-shadow: 0 8px 22px rgba(0, 0, 0, .28);
  opacity: 0; pointer-events: none;
  transition: opacity .15s ease, transform .15s ease;
}
.login-ayuda-wa:hover .login-ayuda-num,
.login-ayuda-wa:focus-visible .login-ayuda-num { opacity: 1; transform: translateX(-50%) translateY(0); }
/* margin-bottom (AUTH-2): despega el ECG del borde inferior — mejor proporción. */
.login .hero-ecg { margin-top: auto; margin-bottom: clamp(20px, 3.5vh, 34px); }
@media (max-width: 480px) {
  .login { padding-left: 18px; padding-right: 18px; }
  .login-logos { margin-bottom: 26px; gap: 18px; }
  .login-logos img { height: 33px; }
  .login-card { max-width: none; }
  .login-kicker { font-size: 12px; letter-spacing: .14em; } /* entra en una línea a 390 */
  /* El texto quiebra en dos líneas y el círculo WA queda AL LADO (no huérfano abajo). */
  .login-ayuda span { max-width: 30ch; }
}
/* Laptops de pantalla baja (1366×768 / 1280×720): compactar para que los autos del
   centrado conserven aire y nada desborde. */
@media (max-height: 800px) and (min-width: 481px) {
  .login-title { font-size: clamp(28px, 3.4vw, 40px); }
  .login-logos img { height: 44px; }
  .login-card { padding: 22px 26px; }
}

/* ---------- Segmento de usuario del header (AUTH-2) ---------- */
/* Vive dentro de .app-header: el gate de AUTH-1 lo oculta sin sesión junto con todo el
   header. auth.js puebla el nombre y maneja el menú (aria-expanded como fuente de verdad).
   El separador ::before + margen mayor que el gap del nav (22px) aíslan el área de cuenta
   de los links de navegación (proximidad Gestalt). */
.user-seg { position: relative; margin-left: clamp(18px, 2vw, 28px); padding-left: clamp(18px, 2vw, 28px); }
.user-seg::before {
  content: ""; position: absolute; left: 0; top: 50%; transform: translateY(-50%);
  width: 1px; height: 20px; background: var(--line-strong);
}
.user-btn {
  display: inline-flex; align-items: center; gap: 9px;
  padding: 5px 8px 5px 5px; border-radius: var(--r-pill);
  transition: background .15s ease;
}
.user-btn:hover { background: rgba(110, 37, 54, .08); }
.user-btn[aria-expanded="true"] { background: rgba(110, 37, 54, .11); }
/* Sin sombra propia: es un control de barra, no una segunda marca (la marca PESA
   conserva el único círculo berry con sombra del header). */
.user-avatar {
  width: 30px; height: 30px; border-radius: 50%; background: var(--accent);
  display: flex; align-items: center; justify-content: center; flex-shrink: 0;
}
.user-name { font: 600 13.5px var(--sans); color: var(--ink); white-space: nowrap; max-width: 18ch; overflow: hidden; text-overflow: ellipsis; }
.user-chev { color: var(--muted-2); flex-shrink: 0; transition: transform .15s ease; }
.user-btn[aria-expanded="true"] .user-chev { transform: rotate(180deg); }
/* Popover: top 14px libra el hairline del header (66px); z-index local al stacking del
   header (z-60) — los modales body-level (90+) siempre lo cubren. Sombra de popover en
   dos capas (contacto + ambiente), más tensa que --shadow-md de cards. */
.user-menu {
  position: absolute; top: calc(100% + 14px); right: 0; z-index: 5;
  min-width: 208px; padding: 6px;
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-md);
  box-shadow: 0 4px 10px rgba(42, 26, 30, .08), 0 14px 34px rgba(42, 26, 30, .12);
}
.user-menu-item {
  display: block; width: 100%; text-align: left;
  font: 600 13.5px var(--sans); color: var(--ink);
  padding: 10px 12px; border-radius: 8px; /* 14 (contenedor) - 6 (padding) */
  transition: background .12s ease, color .12s ease;
}
.user-menu-item:hover { background: var(--accent-soft); color: var(--accent); }
/* La salida de sesión se aísla del mantenimiento (patrón de menú de cuenta macOS/iOS). */
.user-menu [data-auth-logout] { border-top: 1px solid var(--line); margin-top: 4px; padding-top: 10px; border-radius: 0 0 8px 8px; }
@media (max-width: 920px) {
  /* Junto al burger va solo el avatar (el nombre vive en el menú); margin auto lo lleva
     al extremo derecho cuando el nav está oculto; padding 7px = target táctil 44px. */
  .user-name, .user-chev { display: none; }
  .user-btn { padding: 7px; }
  .user-seg { margin-left: auto; margin-right: 10px; padding-left: 0; }
  .user-seg::before { display: none; }
}
/* ACÁ HABÍA UNA COMPENSACIÓN MÁS DE LOS LOGOS EN LA BARRA (DOP-UI · 1). En 701–920 px le devolvía
   al segmento de usuario un margen fijo «para no descentrar los logos». Sin logos que centrar
   quedó sin causa — y con daño propio: le sacaba al Doppler, y sólo al Doppler, el
   `margin-left: auto` que UI-1 le puso al switch de modo demostración para que no quedara clavado
   en el centro geométrico de la barra. Se va con ellos. */

/* ---------- MODO DEMOSTRACIÓN · switch del menú + indicador global (DEMO-C) ---------- */
/*
 * ══ EL MODO DEMOSTRACIÓN ES BORDÓ INSTITUCIONAL (decisión de Hernán, LAB-COL) ══════════
 *
 * Nació índigo, con el argumento de que verde/ámbar/naranja/rojo/bordó estaban tomados por las
 * cinco bandas HEARTS-OPS y que un aviso de sistema pintado con una de esas familias se leería
 * de reojo como un nivel de riesgo. La decisión de identidad pesa más: la plataforma es bordó y
 * el modo de práctica es parte de la plataforma, no un cuerpo extraño.
 *
 * SE REUSAN LAS VARIABLES DE LA CASA, no un hex nuevo: `--accent-deep` y `--accent-soft` ya
 * existen y ya se usan (el degradé del hero termina en `--accent-deep`).
 *
 * ══ PERO LA FAJA TIENE QUE SEGUIR SIENDO INCONFUNDIBLE ════════════════════════════════
 *
 * Es una ADVERTENCIA, y una advertencia que se confunde con el marco institucional deja de
 * advertir. Tres cosas la separan, y ninguna depende de una sola:
 *
 *   (1) EL TONO MÁS PROFUNDO DE LA FAMILIA. `--accent-deep` (#48141f) contra el `--accent`
 *       (#6e2536) del hero: 1,42:1 entre sí — el mayor de los candidatos de la casa
 *       (--berry-panel da 1,16 y --band-4, 1,06). No alcanza solo, y por eso está (2).
 *   (2) EL FILO DORADO. `--hl` (#c1853f) al borde de la faja y del marco. El hero NO lo tiene:
 *       es lo que hace que la diferencia se vea de un vistazo y no por comparación.
 *   (3) LA POSICIÓN Y EL TEXTO, que ya estaban: la faja va al pie, fija, y dice MODO
 *       DEMOSTRACIÓN en versales.
 *
 * CONTRASTES MEDIDOS (fórmula WCAG de luminancia relativa, calculados sobre estos valores):
 *   · blanco sobre --accent-deep .......... 15,05:1   AAA
 *   · --accent-deep sobre --accent-soft ... 13,22:1   AAA   (switch encendido)
 *   · --hl sobre --accent-deep ............  4,80:1   AA    (el filo, que además no lleva texto)
 *
 * EL ESTADO DEL SWITCH NO DEPENDE DEL COLOR y no se toca: lo dicen la PALABRA (ON/OFF), la
 * posición del thumb y `aria-checked`. Cambiar de familia no toca ninguna de las tres.
 */
:root {
  --demo-ink: var(--accent-deep);   /* bordó profundo — fondo de la faja y del marco */
  --demo-soft: var(--accent-soft);  /* bordó muy claro — fondo del switch encendido */
  --demo-filo: var(--hl);           /* dorado — lo que separa la advertencia del marco institucional */
}

/* --- El switch EN LA BARRA (UI-1) --- */
/*
 * Vive entre el nav y el segmento de usuario. En escritorio `.nav-links` lleva `margin-left:auto`
 * y empuja al grupo entero a la derecha; en mobile el nav desaparece, así que el `auto` pasa acá
 * (ver el bloque @media de abajo) y el switch, el avatar y el burger quedan juntos a la derecha en
 * vez de dejar un hueco en el medio.
 */
/*
 * ══ EL SWITCH, MÁS FINO (UX-3) ═════════════════════════════════════════════════════════
 *
 * Era una pastilla con borde completo: en una barra que ya tiene el nav, el avatar y el menú,
 * sumaba una tercera caja y competía. Ahora es MENOS CAJA — sin borde en reposo y sin fondo—, y lo
 * que se ve es la pista del switch con su palabra al lado. El contorno aparece sólo al hover y al
 * foco, que es cuando hace falta decir «esto es un control».
 *
 * NO SE TOCA NADA DEL ESTADO. Sigue siendo `role="switch"` con `aria-checked`, y las TRES vías
 * siguen en pie: la PALABRA (ON/OFF), la POSICIÓN del thumb y el color. En ON el bordó vuelve —es
 * el estado que tiene que verse de lejos— pero como relleno de la pista, no como caja alrededor.
 */
.demo-toggle {
  display: inline-flex; align-items: center; gap: 7px; flex-shrink: 0;
  margin-left: clamp(14px, 1.8vw, 22px);
  padding: 4px 6px; border-radius: var(--r-pill);
  border: 1px solid transparent; background: transparent;
  transition: background .15s ease, border-color .15s ease, color .15s ease;
}
.demo-toggle:hover { background: rgba(110, 37, 54, .05); border-color: var(--line); }
.demo-toggle-rotulo { font: 600 12.5px var(--sans); color: var(--muted-2); }
/*
 * ══ LA PALABRA, ADENTRO DE LA PISTA (DOP-UI · 2) ═══════════════════════════════════════
 *
 * LA PALABRA ES EL ESTADO (WCAG 2.2 §1.4.1). El color y la posición del thumb acompañan; quien no
 * los distinga lee «ON» u «OFF».
 *
 * Vive DENTRO de `.demo-sw`, del lado OPUESTO al thumb: con el thumb a la izquierda («OFF») la
 * palabra va a la derecha, y al conmutar se cruzan. Es el patrón clásico, y lo que compra es que
 * el control se lea como UNA pieza: antes era una pastilla más una sigla suelta al lado, y la
 * sigla no tenía nada que la atara visualmente al switch que describía.
 *
 * ══ SE POSICIONA, NO SE MAQUETA ════════════════════════════════════════════════════════
 *
 * `position: absolute` contra la pista, con `inset` vertical completo y centrado por flex: así el
 * texto queda en el eje óptico de una pista de 17 px sin depender del `line-height` de la fuente
 * mono, que es lo que hacía bailar medio píxel el guión de otras piezas de la casa.
 *
 * NO lleva transición de posición. El thumb SÍ se desliza; la palabra CAMBIA DE TEXTO en el mismo
 * gesto, y animar el cruce de un texto que además muta se lee como un parpadeo, no como un
 * movimiento. Salta, que es lo honesto: es otra palabra, no la misma que se movió.
 *
 * ══ EL COLOR SE ELIGIÓ MIDIENDO, Y EL OBVIO NO SERVÍA ══════════════════════════════════
 *
 * `--muted-2` —el color que la palabra tenía cuando vivía afuera, sobre la barra crema— da
 * 3,45:1 sobre la pista apagada: REPRUEBA AA para texto normal. Mudarlo tal cual habría dejado el
 * estado apagado por debajo del mínimo sin que nada fallara. Medido con la fórmula de luminancia
 * relativa de WCAG 2.2, sobre los tokens resueltos:
 *
 *     OFF   --ink #2a1a1e  sobre la pista apagada #cfc7c9 ... 10,01:1  AAA
 *     ON    #ffffff        sobre --demo-ink #48141f ........ 15,05:1  AAA
 *
 * Los descartados, con su número: `--muted-2` 3,45 · `--muted` 3,90 · `--accent` 6,39 (pasa, pero
 * el bordó sobre gris compite con el bordó de la pista encendida y confunde los dos estados).
 */
.demo-toggle-estado {
  position: absolute; top: 0; bottom: 0;
  display: flex; align-items: center;
  font: 700 9px var(--mono); letter-spacing: .04em; color: var(--ink);
  pointer-events: none;
}
/* OFF: thumb a la izquierda, palabra a la derecha. */
.demo-toggle-estado { right: 5px; }
/* ON: se cruzan. El blanco sobre el bordó de la pista encendida da 15,05:1. */
.demo-toggle[aria-checked="true"] .demo-toggle-estado { right: auto; left: 6px; color: #fff; }
/* En ON el bordó se afirma, pero sin caja: fondo tenue y SIN borde, que es lo que lo separa del
   control apagado sin volver a sumar contorno a la barra. */
.demo-toggle[aria-checked="true"] {
  background: var(--demo-soft); border-color: transparent;
}
.demo-toggle[aria-checked="true"]:hover { background: var(--demo-soft); border-color: var(--demo-ink); }
/* SÓLO EL RÓTULO. La palabra de estado se fue adentro de la pista (DOP-UI · 2) y ahí el fondo es
   `--demo-ink`: pintarla del mismo color la haría desaparecer —1:1, invisible—. Su color lo fija
   la regla de arriba, medida: blanco, 15,05:1. Éste es el «Demo» de al lado, que sigue sobre
   `--demo-soft` y da 13,22:1. */
.demo-toggle[aria-checked="true"] .demo-toggle-rotulo { color: var(--demo-ink); }
/* Foco visible: es un control de barra alcanzable por Tab y tiene que verse cuál está enfocado. */
.demo-toggle:focus-visible { outline: 2px solid var(--demo-ink); outline-offset: 2px; }

/*
 * ══ EL RÓTULO SE CAE ANTES DE QUE EL NAV SE APRIETE ═════════════════════════════════════
 * MEDIDO en Chromium (DSF 1, con Hanken Grotesk cargada): el toggle con rótulo mide 126 px, y
 * `.nav-links` lleva `margin-left:auto` — así que mientras sobre espacio el auto lo absorbe y el
 * nav queda en su ancho natural, pero en cuanto el espacio libre se vuelve negativo el auto
 * colapsa y `flex-shrink` parte los links en dos renglones. Con seis links (rol con laboratorio) y
 * un nombre de 21+ caracteres eso empezaba a 1283 px; con cinco links, a 1035 px — donde SIN el
 * toggle no rompía en ningún ancho.
 *
 * Por eso el rótulo se va acá y no recién en mobile: sin él el control baja a ~75 px y el nav
 * vuelve a tener su holgura. El estado NO se pierde —siguen el thumb y la PALABRA—, y el nombre
 * del control lo dan `aria-label`, `title` y `aria-describedby`.
 */
@media (max-width: 1300px) {
  .demo-toggle-rotulo { display: none; }
  .demo-toggle { padding: 6px 9px; gap: 7px; }
}

/*
 * ══ LA FRANJA APRETADA: 921–1300 px ═════════════════════════════════════════════════════
 * Entre el ancho donde el nav todavía existe (>920) y aquel donde vuelve a sobrar lugar (>1300),
 * la barra lleva marca + seis links + switch + usuario. Sacar el rótulo del switch no alcanzaba:
 * MEDIDO contra el contrafactual (la misma página con el switch en `display:none`), el control
 * seguía costando UN RENGLÓN de nav en 921–960 y en 1130–1220.
 *
 * Se recupera ese espacio de donde sobra —el gap del nav es de 22 px y el padding del header
 * llega a 48— y sólo acá dentro: arriba de 1300 no se toca nada, porque no hace falta.
 *
 * VERIFICADO, no supuesto: con estos tres valores el nav ocupa EXACTAMENTE los mismos renglones
 * con el switch y sin él, en los ocho anchos medidos de la franja. El switch dejó de costar
 * composición. Sin desborde horizontal y sin recorte de texto en ninguno.
 */
@media (min-width: 921px) and (max-width: 1300px) {
  .nav-links { gap: 12px; }
  .demo-toggle { margin-left: 8px; }
  .app-header { padding-left: 24px; padding-right: 24px; }
  /* El nombre del usuario ya se truncaba acá (18ch contra nombres de 24 caracteres). Recortarlo un
     poco más es lo que menos cuesta: el nombre completo sigue en el menú de cuenta, y la
     alternativa era apretar el nav para todos. */
  .user-name { max-width: 12ch; }
}
/*
 * LO QUE QUEDA, MEDIDO Y DICHO. Barrido de 26 anchos (340→2000 px) comparando cada uno contra el
 * MISMO documento con el switch en `display:none`:
 *   · cero desbordes horizontales, cero texto recortado, switch visible en los 26;
 *   · en mobile el hueco entre el switch y el avatar es de 4–6 px en todos los anchos ≤920 (antes
 *     del arreglo eran ~220 px y el control caía al 53 % del ancho, huérfano en el medio);
 *   · el switch todavía cuesta un renglón en TRES anchos: 1000 y 1035 (nav en dos líneas) y 340
 *     (el subtítulo de la marca en dos, que es lo que ya hace en escritorio).
 * Perseguir esos tres pedía apretar el nav por debajo de lo razonable para todos los demás anchos.
 * Nada se pierde ni se recorta en ninguno; es composición, no función.
 */

/*
 * ══ UN SOLO `margin-left:auto` EN LA BARRA ══════════════════════════════════════════════
 * A ≤920 px el nav se oculta y quedan `.brand`, `.demo-toggle`, `.user-seg` y `.burger`. Si el
 * switch Y el segmento de usuario declaran los dos `margin-left:auto`, la spec de flexbox reparte
 * el espacio libre EN PARTES IGUALES entre los dos — y el switch queda clavado en el centro
 * geométrico de la barra, huérfano, con más de 200 px de vacío a cada lado. Medido: a 920 px los
 * dos márgenes daban 219,7 px y el control caía al 53 % del ancho.
 *
 * El `auto` pasa al switch, que es el primero del grupo, y el segmento de usuario lo pierde: así
 * hay UN solo auto y marca · [hueco] · switch avatar burger.
 */
@media (max-width: 920px) {
  .demo-toggle { margin-left: auto; margin-right: 6px; }
  .user-seg { margin-left: 0; }
}
@media (max-width: 480px) {
  /* Pantallas angostas: se recupera ancho del padding del header y del gap de la marca, que es lo
     que hacía que el subtítulo institucional se partiera en tres renglones abajo de 380 px. */
  .app-header { padding: 0 12px; }
  .demo-toggle { padding: 5px 7px; gap: 5px; margin-right: 4px; }
  .brand { gap: 8px; }
}

/* --- La pista y la bola, compartidas --- */
/* `aria-checked` del botón es la ÚNICA fuente del estado visual: no hay una clase paralela que
   pueda quedar desincronizada de lo que anuncia el lector de pantalla. */
/*
 * La pista, sin borde propio: el contraste con la barra crema lo da el relleno.
 *
 * ══ EL ANCHO SE DERIVA, NO SE ELIGE (DOP-UI · 2) ═══════════════════════════════════════
 *
 * Con la palabra adentro, el ancho es una CUENTA y conviene dejarla escrita porque el día que
 * cambie el cuerpo de la letra hay que rehacerla:
 *
 *     2 (inset izq) + 13 (thumb) + 4 (aire) + 17 («OFF» a 9 px mono) + 4 (inset der) = 40 px
 *
 * «OFF» es la palabra ANCHA y por eso manda: medida en IBM Plex Mono 700 a 9 px con el
 * `letter-spacing` de la casa da 16,9 px («ON» da 11,2). Dimensionar con «ON» dejaría el control
 * cambiando de tamaño al conmutar, empujando al avatar de al lado en cada clic.
 *
 * EL ALTO NO CRECE. Sigue en 17 px —el tamaño minimalista de UX-3— y la palabra baja a 9 px para
 * entrar: a 11 px, el cuerpo que tenía cuando vivía afuera, no entra en una pista de 17.
 *
 * Y EL CONTROL ENTERO ADELGAZA. Antes la región del switch medía 30 (pista) + 7 (gap) + 21
 * («OFF» a 11 px) = 58 px; ahora son 40. Dieciocho píxeles menos en una barra cuyo changelog
 * documenta que el switch costaba un renglón de nav en la franja 921–1300.
 */
.demo-sw {
  position: relative; flex-shrink: 0;
  width: 40px; height: 17px; border-radius: var(--r-pill);
  background: #cfc7c9; border: 0;
  transition: background .15s ease;
}
/* El thumb: 13 + 2 + 2 = 17, el alto exacto de la pista. Con los 14 de antes sobresalía un píxel
   por arriba y por abajo. */
.demo-sw-bola {
  position: absolute; top: 2px; left: 2px; width: 13px; height: 13px; border-radius: 50%;
  background: #fff; box-shadow: 0 1px 2px rgba(42, 26, 30, .3);
  transition: transform .15s ease;
  z-index: 1;   /* por encima de la palabra: al cruzarse no se pisan */
}
/*
 * SELECTORES CON DUEÑO. Eran `[aria-checked="true"] .demo-sw` a secas, sin nombrar el control:
 * hoy no rompe porque hay UN solo switch en la app, y el día que aparezca un segundo elemento con
 * `aria-checked` que contenga una pista, la pinta de más y en silencio. Se acotan a `.demo-toggle`,
 * que es de quien son.
 */
.demo-toggle[aria-checked="true"] .demo-sw { background: var(--demo-ink); }
/* 40 − 13 (thumb) − 2 (inset izq) − 2 (inset der) = 23. El número se deriva del ancho de arriba:
   copiarlo de la versión anterior (13) dejaría el thumb a mitad de camino. */
.demo-toggle[aria-checked="true"] .demo-sw-bola { transform: translateX(23px); }

/* --- El indicador global --- */
/* Las dos piezas nacen SIN OCUPAR NADA. `display:none` y no `opacity:0`: una faja transparente
   sobre el pie de página seguiría tapando lo que haya abajo, y el modo apagado tiene que ser
   indistinguible de una app que nunca tuvo modo demo. */
.demo-marco, .demo-faja { display: none; }

body[data-demo="si"] .demo-marco {
  display: block; position: fixed; inset: 0; z-index: 95;
  pointer-events: none;                       /* decoración: jamás intercepta un click */
  /*
   * EL DORADO VA AFUERA, Y ES UNA CORRECCIÓN MEDIDA (LAB-COL).
   *
   * La primera versión de este cambio dejó el bordó afuera y el filo dorado adentro. Medido en
   * Chromium sobre #estudio, eso perdía 3 de los 4 px del marco: `.hero` (:282), `.kpi-masthead`
   * (:753) y `.login` (:2760) son `radial-gradient(… var(--accent) 0%, var(--accent-deep) 73%)`, y
   * en los bordes izquierdo, derecho e inferior el degradé YA ESTÁ en `--accent-deep` — o sea
   * exactamente el mismo #48141f del marco. El borde se fundía con el fondo y quedaba 1px de filo
   * como única señal, justo en las tres superficies a sangre completa donde se trabaja.
   *
   * Medido en Chromium, el bordó contra el stop hondo del hero da 1,00:1: no es «poco contraste»,
   * es el mismo color.
   *
   * Invertido, el marco se lee en los dos mundos: sobre el hero son 3px de dorado (4,80:1 contra el
   * stop hondo y 3,38:1 contra el claro — WCAG 1.4.11 pide 3:1 y los dos pasan), y sobre el crema
   * de la app el dorado solo daría 2,95:1, pero no está solo: los 2px de bordó por dentro dan
   * 14,14:1 contra ese fondo. Ninguna de las dos capas tiene que alcanzar sola.
   */
  border: 3px solid var(--demo-filo);
  box-shadow: inset 0 0 0 2px var(--demo-ink);
  /* El hueco del pie deja respirar la faja, que se apoya justo adentro del marco. */
  border-bottom-width: 0;
}
body[data-demo="si"] .demo-faja {
  display: flex; position: fixed; left: 0; right: 0; bottom: 0; z-index: 95;
  /* CENTRADO (UX-1): el aviso corre a lo ancho de la ventana y pegado a la izquierda queda
     desbalanceado en pantallas anchas. `text-align` acompaña a `justify-content` porque en el
     ancho donde el texto pasa a dos renglones, el segundo también tiene que quedar centrado. */
  align-items: baseline; gap: 10px; flex-wrap: wrap;
  justify-content: center; text-align: center;
  padding: 9px clamp(14px, 3vw, 28px);
  background: var(--demo-ink); color: #fff;
  border-top: 2px solid var(--demo-filo);
  font: 500 12.5px/1.4 var(--sans);
}
body[data-demo="si"] .demo-faja strong {
  font: 800 11.5px var(--sans); letter-spacing: .10em; text-transform: uppercase;
}
/*
 * EL PIE NO QUEDA DEBAJO DE LA FAJA, Y LA RESERVA SE MIDE (LAB-COL).
 *
 * La reserva es del BODY y no de <main>: los modales y los popovers también se apoyan en el
 * viewport. Lo que cambió es de dónde sale el número.
 *
 * ERA `56px`, y `76px` abajo de 700. Los dos estaban calibrados a mano contra el alto de la faja, y
 * medidos en Chromium los dos estaban mal: la faja pasa a dos renglones abajo de ~1024 y a tres
 * abajo de ~400, y el alto real iba de 37,5 a 97,5 px. En la banda de 701 a 1023 —donde la reserva
 * valía 56 y la faja medía 80— la faja tapaba 24px del pie. No es un defecto que introdujo este
 * lote: ya estaba, y el filo dorado le sumó 2px más. Cualquier número fijo vuelve a romperse el día
 * que cambie el texto, la tipografía o el ancho de corte.
 *
 * Ahora la reserva ES el alto medido de la faja: `reservarPieDeFaja()` (app.js) la escribe en
 * `--demo-reserva` al pintar el modo y ante cada cambio de tamaño de la faja. El 76px de acá es el
 * piso mientras la medición no corrió todavía — el mayor de los dos valores viejos, para que el
 * instante previo nunca reserve MENOS que antes.
 */
body[data-demo="si"] { padding-bottom: var(--demo-reserva, 76px); }
/* Impresión: la faja y el marco NO se imprimen —el rótulo DEMO de un documento viaja adentro
   del PDF, que es donde sobrevive al papel—, pero el padding de reserva tampoco tiene sentido. */
@media print {
  body[data-demo="si"] { padding-bottom: 0; }
  body[data-demo="si"] .demo-marco, body[data-demo="si"] .demo-faja { display: none; }
}
@media (prefers-reduced-motion: reduce) {
  .demo-sw, .demo-sw-bola { transition: none; }
}

/* ---------- Modal cambiar contraseña (AUTH-2 + AUTH-4) ---------- */
/* A nivel body (patrón de los otros modales). Hijo de body: el gate lo cubre sin sesión.
   z-index 230: por ENCIMA de todos los modales clínicos (.dop-inf-overlay 220, .bw-modal
   95) — en modo forzado (AUTH-4) el bloqueo no puede quedar tapado por un modal que haya
   quedado abierto. */
.pw-overlay {
  position: fixed; inset: 0; z-index: 230;
  display: flex; align-items: center; justify-content: center;
  padding: 20px; background: rgba(42, 26, 30, .45);
  backdrop-filter: blur(3px); -webkit-backdrop-filter: blur(3px);
  overflow-y: auto;
}
.pw-modal {
  width: 100%; max-width: 420px; background: var(--surface);
  border-radius: var(--r-lg); box-shadow: var(--shadow-md);
  padding: clamp(24px, 3vw, 32px); /* mismo ritmo que la card de login */
  max-height: calc(100vh - 40px); max-height: calc(100dvh - 40px);
  overflow-y: auto; /* viewport bajo (teléfono apaisado): scrollea, no se recorta */
}
.pw-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; margin-bottom: 18px; }
.pw-titulo { font: 600 var(--fs-h2) var(--serif); margin: 0; }
.pw-x { color: var(--muted-2); padding: 4px; border-radius: var(--r-sm); }
.pw-x:hover { color: var(--accent); background: var(--accent-soft); }
/* Live region siempre renderizada: colapsa vacía, caja solo con contenido (:not(:empty)). */
.pw-msg { margin: 0; font: 500 var(--fs-label)/1.5 var(--sans); color: var(--warn-fg); }
.pw-msg:not(:empty) { margin: -6px 0 16px; }
.pw-msg.is-ok { color: var(--ok-fg); }
/* Salida del modo forzado (AUTH-4): link discreto bajo el CTA, no compite con "Actualizar". */
.pw-salir {
  display: block; width: 100%; margin-top: 14px; padding: 8px;
  font: 600 var(--fs-label) var(--sans); color: var(--muted-2);
  text-decoration: underline; text-underline-offset: 3px;
}
.pw-salir:hover { color: var(--accent); }
body.pw-open { overflow: hidden; }
@media print {
  /* El modal normal no se imprime. En modo FORZADO (AUTH-4) el overlay tampoco, pero
     además se oculta #main: sin esto, Cmd+P imprimiría el contenido de la vista de
     fondo salteando el bloqueo. El telón berry del gate queda como única impresión. */
  .pw-overlay { display: none !important; }
  body.pw-open { overflow: visible !important; } /* el scroll-lock no rige en papel */
  body.pw-forzado #main { display: none !important; }
}

/* ---------- Vista Admin · Gestión de usuarios (AUTH-3a) ---------- */
/* Anti-flash del guard de rol: sin body[data-rol="admin"] la vista NO se pinta aunque
   el router la muestre (URL directa de un no-admin, o perfil aún resolviendo). El guard
   JS de auth.js redirige a #estudio; esta regla elimina cualquier flash intermedio.
   ES UX, NO SEGURIDAD: la barrera real del alta es la Cloud Function crearUsuario
   (verifica rol admin del llamador contra Firestore y valida server-side). */
body:not([data-rol="admin"]) #view-admin { display: none !important; }

/* Card del formulario: misma familia formal que la card de login (r-lg, mismo padding),
   pero sobre fondo claro de vista -> borde hairline + sombra de card del sistema. */
.au-card {
  max-width: 560px;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  padding: clamp(24px, 3vw, 32px);
  box-shadow: var(--shadow-sm);
}
.au-titulo { font: 600 var(--fs-h2) var(--serif); margin: 0 0 18px; }
.au-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0 16px; }

/* Select con la misma piel que .login-input (borde bordó, radio, tipografía). */
.au-select { appearance: auto; height: 47px; } /* 47px = alto computado del input (12+16*1.5+12+3) */

/* Contraseña temporal + "Generar" al lado (decisión de Hernán: la escribe el admin,
   generar es opcional). Mono: la clave se transcribe a mano — cero ambigüedad. */
.au-pass-row { display: grid; grid-template-columns: 1fr auto; gap: 10px; align-items: stretch; }
.au-pass-row .login-input { margin-bottom: 0; font-family: var(--mono); font-size: 15px; }
.au-generar {
  padding: 0 18px; border-radius: var(--r-sm);
  background: var(--surface); color: var(--accent);
  border: 1px solid rgba(110, 37, 54, .35);
  font: 600 14px var(--sans);
  transition: background .15s ease, border-color .15s ease;
}
.au-generar:hover { background: var(--accent-soft); border-color: var(--accent); }

/* Requisitos de fortaleza en vivo: caption chips que se "encienden" al cumplirse. */
.au-reqs { list-style: none; display: flex; flex-wrap: wrap; gap: 5px 16px; margin: 9px 0 16px; padding: 0; }
.au-reqs li { font: 500 var(--fs-label) var(--sans); color: var(--muted); }
.au-reqs li::before { content: "○"; margin-right: 6px; color: var(--muted-2); }
.au-reqs li.is-ok { color: var(--ok-fg); }
.au-reqs li.is-ok::before { content: "●"; color: var(--ok-fg); }

/* #au-error y #au-exito son live regions SIEMPRE renderizadas (nunca display:none:
   inyectar texto en un nodo oculto no se anuncia fiable en VoiceOver/JAWS). Vacías
   colapsan a 0 (sin caja ni margen); el estilo de caja aplica solo con contenido. */
.au-error { margin: 0; font: 500 var(--fs-label)/1.5 var(--sans); color: var(--warn-fg); }
.au-error:not(:empty) { margin: -2px 0 14px; }

/* Éxito post-alta: la ÚNICA vez que la contraseña temporal se ve tras crear (se borra
   del DOM al ocultar, tipear, navegar o cerrar sesión — lo maneja auth.js). */
.au-exito { margin: 0; font: 500 var(--fs-body)/1.55 var(--sans); color: var(--ok-fg); }
.au-exito:not(:empty) {
  margin: 16px 0 0; padding: 14px 16px;
  background: var(--ok-bg); border: 1px solid var(--ok-line); border-radius: var(--r-sm);
}
.au-exito p { margin: 0 0 6px; }
.au-exito code {
  font: 600 14px var(--mono); color: var(--ink);
  background: var(--surface); border: 1px solid var(--ok-line); border-radius: 5px;
  padding: 2px 8px; user-select: all; /* un click selecciona toda la clave */
}
.au-exito-aviso { font-size: var(--fs-label); }
/* Borde --ok-fg (6.64:1 sobre --ok-bg): el único control del aviso debe LEERSE como
   botón (--ok-line daba 1.22:1, un fantasma). min-height 44px: target táctil HIG del
   control más crítico del flujo (el que destruye la clave). */
.au-exito-cerrar {
  margin-top: 4px; padding: 7px 16px; min-height: 44px; border-radius: var(--r-sm);
  background: var(--surface); color: var(--ok-fg); border: 1px solid var(--ok-fg);
  font: 600 13px var(--sans);
}
.au-exito-cerrar:hover { background: var(--ok-bg); }

@media (max-width: 560px) {
  .au-grid { grid-template-columns: 1fr; }
  .au-pass-row { grid-template-columns: 1fr; }
  .au-generar { padding: 12px 18px; min-height: 44px; } /* full width + target táctil HIG 44px */
}
/* El form del alta no va a papel: un Cmd+P con la contraseña temporal tipeada en el
   campo la imprimiría (el aviso de éxito ya lo cubre [data-noprint]). */
@media print {
  #view-admin .au-card { display: none !important; }
}

/* ---------- Bloqueo de primer ingreso (AUTH-4) ---------- */
/* Kicker del modo forzado del modal de contraseña: explica el porqué del bloqueo.
   Caption institucional bordó, entre el título y el formulario. */
.pw-kicker { margin: -8px 0 16px; font: 500 var(--fs-label)/1.5 var(--sans); color: var(--accent); }
/* Los chips .au-reqs (del alta) pegados al campo "Nueva contraseña" del modal:
   el input deja 16px propios; el ajuste evita doble aire antes del próximo label. */
#pw-reqs { margin: -8px 0 14px; }

/* Fallo de persistencia: el aviso NO se va solo. Lo que se perdió es una medición. */
.persistencia-aviso {
  margin: 0; padding: 12px 16px; background: var(--warn-bg); color: var(--ink);
  border-left: 4px solid var(--band-3); font: 600 var(--fs-body) var(--sans);
}

/* ══════════════════════════════════════════════════════════════════════════════════════════
   CUADRO DE PROGRESO DEL PARTICIPANTE (Etapa 1)

   Discreto por diseño: vive en una esquina, no compite con la card de estratificación y no
   usa el berry —que en este producto significa "acto clínico" (finalizar, emitir)—. Superficie
   blanca, filo fino y la sombra suave que ya usan las cards del proyecto.

   El verde del tilde es --ok-fg (#176039), el mismo del sistema de estados: 7,0:1 sobre blanco
   y 6,4:1 sobre --ok-bg, holgado sobre el AA de 4,5:1. El pendiente va en --muted-2 (5,73:1),
   que es texto secundario legible y NO rojo: un paso que todavía no se hizo no es un error.
   ══════════════════════════════════════════════════════════════════════════════════════════ */
/* En flujo por defecto para no cubrir el contenido clínico ni los CTA inferiores. Sólo en
   Enfermería y con un viewport amplio aprovecha el gutter izquierdo como posición flotante. */
.prog-caja {
  position: static;
  width: 180px;
  min-width: 0;
  max-width: 180px;
  margin: 0 max(16px, calc((100vw - var(--maxw)) / 2)) 24px auto;
  padding: 10px 11px;
  background: var(--surface);
  border: 1px solid var(--line-strong);
  border-radius: 12px;
  box-shadow: var(--shadow-sm);
}
/* Consulta Médica usa el mismo eje vertical que su finalizador. Sólo se lateraliza cuando el
   viewport permite reservar a ambos lados 16 px reales respecto del contenido central. */
#view-consulta { --clinical-side-control-center-y: 50vh; }
@media (min-width: 1500px) {
  #view-consulta:has(section[data-subflow="reclasificacion"]:not([hidden])) > .prog-caja {
    position: fixed;
    top: var(--clinical-side-control-center-y);
    right: 24px;
    left: auto;
    z-index: 60;
    max-height: calc(100vh - 32px);
    margin: 0;
    overflow: auto;
    transform: translateY(-50%);
  }
  #view-consulta section[data-subflow="reclasificacion"] > .container {
    padding-right: max(0px, calc(220px - (100vw - var(--maxw)) / 2));
  }
}
@media (min-width: 1420px) {
  #view-consulta:has(section[data-subflow="inicial"]:not([hidden])) > .prog-caja {
    position: fixed;
    left: 20px;
    right: auto;
    bottom: 24px;
    z-index: 60;
    margin: 0;
  }
}
/*
 * VIEWPORT BAJO EN ESCRITORIO. Con menos de 660 px de alto, el botón centrado y el widget al
 * pie se alcanzan. En vez de mover el widget —que es el que tiene que quedar pegado al pie—
 * se desancla el botón del centro y se lo sube a una posición fija: sigue siendo el elemento
 * más visible de la franja izquierda y deja de competir por la misma banda.
 */
@media (min-width: 1420px) and (max-height: 660px) {
  .bw-rail-izq { top: 96px; }
}
.prog-titulo {
  margin: 0 0 4px;
  font: 600 10px/1.2 var(--sans);
  letter-spacing: .06em; text-transform: uppercase;
  color: var(--muted-2);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.prog-lista { margin: 0; padding: 0; list-style: none; display: grid; gap: 4px; }
.prog-item {
  display: grid; grid-template-columns: 16px 1fr; align-items: center; gap: 5px;
  font: 500 11px/1.25 var(--sans); color: var(--ink);
}
.prog-ico { display: inline-flex; align-items: center; justify-content: center; }
.prog-item[data-ok="si"] .prog-ico { color: var(--ok-fg); }
.prog-item[data-ok="no"] .prog-ico { color: var(--muted-2); }
.prog-item[data-ok="no"] .prog-txt { color: var(--muted); }

/* En tablet y mobile la caja permanece en flujo. La reserva inferior evita que las barras de
   finalización fijas cubran su contenido sin sumar aire innecesario al final del acto. */
@media (max-width: 1419.98px) {
  .prog-caja {
    margin-right: clamp(16px, 4vw, 24px);
  }
  #view-consulta:has(section[data-subflow="inicial"]:not([hidden])) > .prog-caja {
    margin-bottom: env(safe-area-inset-bottom);
  }
  #view-consulta:has(section[data-subflow="reclasificacion"]:not([hidden])) > .prog-caja {
    margin-bottom: calc(42px + env(safe-area-inset-bottom));
  }
}
/* En pantallas chicas conserva su medida compacta y queda debajo del acto, dentro del flujo. */
@media (max-width: 720px) {
  .prog-caja { margin-right: 12px; margin-bottom: 24px; }
}
@media print { .prog-caja { display: none; } }

/* ══════════════════════════════════════════════════════════════════════════════════════════
   MODAL DE REAPERTURA DEL CASO GUARDADO (Etapa 1 · decisión 4)
   Andamiaje calcado de los otros dos modales del proyecto: overlay a nivel body, scroll-lock
   por clase, cierre por ×/Escape/backdrop. Sin estrenar un lenguaje visual nuevo.
   ══════════════════════════════════════════════════════════════════════════════════════════ */
.reap-overlay {
  position: fixed; inset: 0; z-index: 90;
  display: grid; place-items: center; padding: 20px;
  background: rgba(42, 26, 30, .46);
}
.reap-modal {
  width: min(560px, 100%); max-height: min(86vh, 720px);
  display: flex; flex-direction: column;
  background: var(--surface); border-radius: 16px;
  box-shadow: 0 24px 70px rgba(42, 26, 30, .28);
  overflow: hidden;
}
.reap-head {
  display: flex; align-items: flex-start; gap: 12px;
  padding: 18px 20px 14px; border-bottom: 1px solid var(--line);
}
.reap-kicker {
  margin: 0 0 3px; font: 600 var(--fs-caption) var(--sans);
  letter-spacing: .08em; text-transform: uppercase; color: var(--accent);
}
.reap-titulo { margin: 0; font: 600 var(--fs-h2) var(--serif); color: var(--ink); line-height: 1.2; }
.reap-x {
  margin-left: auto; flex: none; width: 34px; height: 34px;
  display: grid; place-items: center;
  background: var(--neutral-bg); color: var(--ink);
  border: 0; border-radius: 50%; cursor: pointer;
}
.reap-x:hover { background: var(--accent-soft); }
.reap-body { padding: 14px 20px; overflow: auto; display: grid; gap: 12px; }
.reap-pieza { padding: 10px 12px; background: var(--bg); border: 1px solid var(--line); border-radius: 10px; }
.reap-pieza-k {
  margin: 0 0 3px; font: 600 var(--fs-caption) var(--sans);
  letter-spacing: .05em; text-transform: uppercase; color: var(--muted-2);
}
.reap-pieza-v { margin: 0; font: 500 var(--fs-body) var(--sans); color: var(--ink); }
/* El historial sólo aparece si hubo más de una finalización: en el caso normal sería ruido. */
.reap-hist { margin-top: 7px; font: 400 var(--fs-label) var(--sans); color: var(--muted); }
.reap-hist summary { cursor: pointer; color: var(--accent); font-weight: 600; }
.reap-hist ul { margin: 6px 0 0; padding-left: 18px; display: grid; gap: 3px; }
.reap-aviso {
  margin: 0 20px 4px; padding: 10px 12px;
  background: var(--warn-bg); color: var(--warn-fg);
  border: 1px solid var(--warn-line); border-radius: 9px;
  font: 500 var(--fs-label) var(--sans); line-height: 1.45;
}
.reap-pie {
  display: flex; flex-wrap: wrap; gap: 10px; justify-content: flex-end;
  padding: 14px 20px 18px; border-top: 1px solid var(--line); background: var(--bg);
}
.reap-overlay[data-reap-contexto="enfermeria"] .reap-pie {
  justify-content: center;
  align-items: stretch;
  gap: 14px;
}
.reap-overlay[data-reap-contexto="enfermeria"] [data-reap="seguir"],
.reap-overlay[data-reap-contexto="enfermeria"] [data-reap="abrir"] {
  flex: 0 1 230px;
  min-width: 220px;
  min-height: 44px;
  text-align: center;
}
@media (max-width: 560px) {
  .reap-overlay[data-reap-contexto="enfermeria"] .reap-pie {
    flex-direction: column;
  }
  .reap-overlay[data-reap-contexto="enfermeria"] [data-reap="seguir"],
  .reap-overlay[data-reap-contexto="enfermeria"] [data-reap="abrir"] {
    width: 100%;
    min-width: 0;
    flex-basis: auto;
  }
}
body.reap-open { overflow: hidden; }
@media print { .reap-overlay { display: none; } }

/* Visor de documentos guardados: misma familia visual del modal contextual, con más ancho para
   leer un informe completo sin convertirlo en una segunda pantalla de edición. */
.reportes-overlay {
  position: fixed; inset: 0; z-index: 92;
  display: grid; place-items: center; padding: 20px;
  background: rgba(42, 26, 30, .5);
}
.reportes-modal {
  width: min(920px, 100%); max-height: min(92vh, 860px);
  display: flex; flex-direction: column;
  background: var(--surface); border-radius: 16px;
  box-shadow: 0 24px 70px rgba(42, 26, 30, .3);
  overflow: hidden;
}
.reportes-head {
  display: flex; align-items: flex-start; gap: 16px;
  padding: 18px 22px 14px; border-bottom: 1px solid var(--line);
}
.reportes-kicker {
  margin: 0 0 3px; font: 600 var(--fs-caption) var(--sans);
  letter-spacing: .08em; text-transform: uppercase; color: var(--accent);
}
.reportes-titulo { margin: 0; font: 600 var(--fs-h2) var(--serif); color: var(--ink); line-height: 1.2; }
.reportes-identidad { margin: 7px 0 0; font: 500 var(--fs-body) var(--sans); color: var(--ink); }
.reportes-fecha { margin: 2px 0 0; font: 400 var(--fs-label) var(--sans); color: var(--muted); }
.reportes-x {
  margin-left: auto; flex: none; width: 34px; height: 34px;
  display: grid; place-items: center;
  background: var(--neutral-bg); color: var(--ink);
  border: 0; border-radius: 50%; cursor: pointer;
}
.reportes-x:hover { background: var(--accent-soft); }
.reportes-tabs {
  display: flex; gap: 4px; padding: 10px 22px 0;
  border-bottom: 1px solid var(--line); background: var(--bg);
}
.reportes-tab {
  margin: 0; padding: 9px 13px 10px;
  border: 0; border-bottom: 2px solid transparent;
  background: transparent; color: var(--muted);
  font: 600 var(--fs-label) var(--sans); cursor: pointer;
}
.reportes-tab[aria-selected="true"] { color: var(--accent); border-bottom-color: var(--accent); }
.reportes-tab:disabled { cursor: not-allowed; opacity: .48; }
.reportes-no-disponible {
  margin: 10px 22px 0; padding: 9px 11px;
  border: 1px solid var(--line); border-radius: 9px;
  background: var(--neutral-bg); color: var(--muted);
  font: 500 var(--fs-label) var(--sans);
}
.reportes-body { min-height: 220px; overflow: auto; padding: 18px 22px 22px; }
.reportes-preview { max-width: 760px; margin: 0 auto; color: var(--ink); }
.reportes-preview p { margin: 0 0 7px; font: 400 var(--fs-body)/1.5 var(--sans); }
.reportes-preview__kicker {
  color: var(--accent); font-weight: 700 !important; letter-spacing: .07em; text-transform: uppercase;
}
.reportes-preview__reportTitle { margin: 0 0 16px; font: 600 var(--fs-h2)/1.22 var(--serif) !important; }
.reportes-preview__studyTitle { margin: 22px 0 9px; color: var(--accent); font: 600 var(--fs-h3)/1.25 var(--serif); }
.reportes-preview__section { margin: 14px 0 5px; font: 700 var(--fs-label)/1.3 var(--sans); text-transform: uppercase; letter-spacing: .04em; }
.reportes-preview__fila {
  padding: 7px 0; border-bottom: 1px solid var(--line);
  font-weight: 500 !important; white-space: pre-line;
}
.reportes-preview__meta { color: var(--muted); font-size: var(--fs-label) !important; font-style: italic !important; }
.reportes-estado {
  margin: 0; padding: 9px 22px; border-top: 1px solid var(--line);
  background: var(--ok-bg); color: var(--ok-fg); font: 600 var(--fs-label) var(--sans);
}
.reportes-estado[data-estado="error"] { background: var(--warn-bg); color: var(--warn-fg); }
.reportes-pie {
  display: flex; flex-wrap: wrap; align-items: center; gap: 9px;
  padding: 13px 22px 17px; border-top: 1px solid var(--line); background: var(--bg);
}
.reportes-pie-spacer { flex: 1 1 auto; }
.reportes-volver.btn-ghost { background: transparent; border-color: transparent; color: var(--accent); }
.reportes-volver.btn-ghost:hover { background: var(--accent-soft); border-color: var(--accent-soft); }
.reportes-copy-fallback { position: fixed; left: -10000px; top: 0; width: 1px; height: 1px; }
body.reportes-open { overflow: hidden; }
@media (max-width: 640px) {
  .reportes-overlay { padding: 8px; }
  .reportes-modal { max-height: calc(100vh - 16px); border-radius: 13px; }
  .reportes-head, .reportes-body { padding-left: 16px; padding-right: 16px; }
  .reportes-tabs { padding-left: 16px; padding-right: 16px; }
  .reportes-pie { padding: 12px 16px 15px; }
  .reportes-pie-spacer { display: none; }
  .reportes-pie .btn { flex: 1 1 calc(50% - 9px); }
}
@media print { .reportes-overlay { display: none; } }

/* ══════════════════════════════════════════════════════════════════════════════════════════
   RE-EMISIÓN DE DOCUMENTOS Y AVISO DE HUELLA (Etapa 1 · decisión 5)
   ══════════════════════════════════════════════════════════════════════════════════════════ */
.reap-docs { margin: 0 20px 4px; padding: 11px 13px; background: var(--accent-soft); border-radius: 10px; }
.reap-docs-k {
  margin: 0; font: 600 var(--fs-caption) var(--sans);
  letter-spacing: .05em; text-transform: uppercase; color: var(--accent);
}
.reap-docs-n { margin: 2px 0 9px; font: 400 var(--fs-label) var(--sans); color: var(--muted); }
.reap-docs-btns { display: flex; flex-wrap: wrap; gap: 8px; }
.reap-docs-btns .btn { font-size: var(--fs-label); padding: 7px 12px; }

/* El aviso de huella NO es un error: el papel salió. Por eso va en la familia neutra con filo
   de atención (--band-1, ámbar) y no en la de error (--warn-*, que en este producto significa
   "algo se bloqueó"). Texto --ink sobre --crema: 11,6:1. */
.huella-aviso {
  position: fixed; left: 50%; transform: translateX(-50%); bottom: 20px; z-index: 95;
  width: min(620px, calc(100% - 32px));
  display: flex; align-items: flex-start; gap: 12px;
  padding: 13px 14px 13px 16px;
  background: var(--crema); color: var(--ink);
  border: 1px solid var(--crema-line); border-left: 4px solid var(--band-1);
  border-radius: 12px; box-shadow: 0 16px 44px rgba(42, 26, 30, .22);
}
.huella-aviso-cuerpo { flex: 1 1 auto; }
.huella-aviso-k { margin: 0 0 3px; font: 600 var(--fs-h3) var(--sans); color: var(--ink); }
.huella-aviso-txt { margin: 0; font: 400 var(--fs-label) var(--sans); line-height: 1.5; color: var(--ink); }
.huella-aviso-x {
  flex: none; width: 30px; height: 30px; display: grid; place-items: center;
  background: transparent; color: var(--muted); border: 0; border-radius: 50%; cursor: pointer;
}
.huella-aviso-x:hover { background: rgba(42, 26, 30, .08); color: var(--ink); }
@media print { .huella-aviso { display: none; } }

/* ══ Aviso de versión nueva (v57) ══════════════════════════════════════════════════════════
   Misma familia visual que el aviso de huella —crema con filo, abajo y centrado— porque es el
   mismo tipo de mensaje: informa, no bloquea, y no es un error. El filo va en --accent (berry
   institucional) y no en --band-1: acá no hay nada que revisar, hay algo disponible.
   Texto --ink sobre --crema: 11,6:1. El botón primario ya cumple AA en su propia familia. */
.ver-aviso {
  position: fixed; left: 50%; transform: translateX(-50%); bottom: 20px; z-index: 95;
  width: min(620px, calc(100% - 32px));
  display: flex; align-items: flex-start; gap: 12px;
  padding: 13px 14px 13px 16px;
  background: var(--crema); color: var(--ink);
  border: 1px solid var(--crema-line); border-left: 4px solid var(--accent);
  border-radius: 12px; box-shadow: 0 16px 44px rgba(42, 26, 30, .22);
}
.ver-aviso-cuerpo { flex: 1 1 auto; }
.ver-aviso-k { margin: 0 0 3px; font: 600 var(--fs-h3) var(--sans); color: var(--ink); }
.ver-aviso-txt { margin: 0; font: 400 var(--fs-label) var(--sans); line-height: 1.5; color: var(--ink); }
.ver-aviso-acc { flex: none; display: flex; align-items: flex-start; gap: 6px; }
.ver-aviso-btn { font-size: var(--fs-label); padding: 7px 12px; white-space: nowrap; }
.ver-aviso-x {
  flex: none; width: 30px; height: 30px; display: grid; place-items: center;
  background: transparent; color: var(--muted); border: 0; border-radius: 50%; cursor: pointer;
}
.ver-aviso-x:hover { background: rgba(42, 26, 30, .08); color: var(--ink); }
/* 375px: el bloque de acciones no cabe al lado del texto sin comprimirlo a dos palabras por
   renglón, así que baja y el botón toma el ancho. */
@media (max-width: 520px) {
  .ver-aviso { flex-wrap: wrap; }
  .ver-aviso-cuerpo { flex: 1 1 100%; }
  .ver-aviso-acc { flex: 1 1 100%; align-items: center; justify-content: space-between; }
  .ver-aviso-btn { flex: 1 1 auto; }
}
@media print { .ver-aviso { display: none; } }

/* ══ Vista Analítica de Laboratorio (Etapa 3) ══════════════════════════════════════════════
   Anti-flash del guard de rol, mismo mecanismo que #view-admin: sin body[data-lab="si"] ni la
   vista ni su ítem de navegación se pintan, aunque el router la muestre (URL directa de un rol
   sin acceso, o perfil aún resolviendo). El guard JS de auth.js redirige a #estudio; esta regla
   elimina el flash intermedio.
   ES UX, NO SEGURIDAD: la barrera real son las dos callables —verifican el rol clínico del
   llamador contra Firestore— y las reglas, que no le abren /evaluaciones al rol de carga. */
body:not([data-lab="si"]) #view-laboratorio,
body:not([data-lab="si"]) [data-lab-nav] { display: none !important; }

/* ---- Buscador ---- */
.lab-buscar { max-width: 560px; margin: 0 0 clamp(18px, 2vw, 26px); }
.lab-buscar-row {
  display: flex; align-items: center; gap: 9px;
  background: var(--surface); border: 1px solid var(--line-strong);
  border-radius: var(--r-pill); padding: 9px 16px;
}
.lab-buscar-row:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px rgba(110, 37, 54, .12); }
.lab-buscar-ic { flex: none; color: var(--muted); display: grid; place-items: center; }
.lab-buscar-input {
  flex: 1 1 auto; border: 0; background: transparent; outline: none;
  font: 400 var(--fs-body) var(--sans); color: var(--ink); min-width: 0;
}
.lab-buscar-input::placeholder { color: var(--muted); }
.lab-estado { margin: 9px 4px 0; font: 400 var(--fs-label) var(--sans); color: var(--muted); }

/* ---- Ver todo el padrón ---- */
/* La otra puerta al padrón, al lado del buscador y no escondida: quien carga analíticas no
   busca a UNA persona, busca a quiénes les falta, y esa pregunta no se contesta tecleando. */
.lab-acciones { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 14px; margin: 14px 0 0; }
.lab-btn-todos { font-size: var(--fs-label); padding: 9px 18px; }
.lab-acciones-nota { margin: 0; font: 400 var(--fs-caption) var(--sans); color: var(--muted); line-height: 1.5; }

/* Pie de la lista paginada. El texto es tabbable (tabindex="-1" en el HTML) para poder recibir
   el foco cuando el botón "Ver más" desaparece al llegar al final. */
.lab-pag {
  display: flex; flex-wrap: wrap; align-items: center; gap: 10px 16px;
  margin: 16px 0 0; padding-top: 14px; border-top: 1px solid var(--line);
}
.lab-pag-txt { margin: 0; font: 400 var(--fs-label) var(--sans); color: var(--muted-2); }
.lab-pag-txt:focus-visible { outline: var(--focus); outline-offset: 3px; border-radius: var(--r-sm); }
.lab-pag .btn { font-size: var(--fs-label); padding: 9px 18px; }

/* ---- Filas ---- */
.lab-filas { display: flex; flex-direction: column; gap: 10px; }
.lab-fila {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-md); box-shadow: var(--shadow-sm); overflow: hidden;
}
/*
 * ══ LA FILA, EN UN SOLO RENGLÓN (UX-1) ═══════════════════════════════════════════════════
 *
 * `.lab-celda` pasó de ser la segunda línea de la fila a SER la fila entera: identidad a la
 * izquierda, traza al medio, pill de estado a la derecha, chevron al final. El grid de tres
 * columnas con `minmax(0,1fr)` en la primera es lo que permite que un apellido largo se recorte
 * en vez de empujar al pill fuera de la pantalla.
 */
/*
 * ══ LA FILA, REDISEÑADA (LAB-1 · C) ══════════════════════════════════════════════════════
 *
 * Lo reportado: filas de «laboratorio registrado» desproporcionadamente altas, con un hueco en el
 * medio y la fecha truncada en el borde («cargado el 01/08/202…»). Tres correcciones:
 *   · IDENTIDAD PRIMERO: el nombre sube a --fs-body y el DNI toma la mono tabular. Son el ancla
 *     de la fila y lo que se barre con el ojo — antes competían en tamaño con la traza.
 *   · EL HUECO SE USA: la traza pasa a dos renglones cortos (estudio · carga con autor) y la
 *     columna tiene ancho propio, así que la fecha entra ENTERA en vez de recortarse.
 *   · ALTURA PAREJA entre estados: `min-height` en la celda, no alto por contenido. Una fila
 *     cargada y una pendiente miden lo mismo y la lista deja de saltar.
 */
.lab-celda {
  display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(0, 1.3fr) auto auto;
  align-items: center; gap: 16px; min-height: 58px;
  width: 100%; margin: 0; padding: 10px 16px;
  text-align: left; cursor: pointer; border: 0; font: inherit;
  background: var(--surface); color: var(--ink);
}
.lab-celda:hover { background: var(--neutral-bg); }
.lab-fila-id { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.lab-fila-n {
  margin: 0; font: 600 var(--fs-body) var(--sans); color: var(--ink); line-height: 1.2;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.lab-fila-dni {
  margin: 0; font: 500 12px var(--mono); color: var(--muted); letter-spacing: .02em;
  font-variant-numeric: tabular-nums;
}
/* La traza en DOS renglones: qué estudio y quién lo cargó. El segundo cede primero — el primero
   es la fecha del papel, que es la que la fila vino a contestar. */
.lab-traza { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.lab-traza-p {
  font: 500 var(--fs-caption) var(--sans); color: var(--ink);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.lab-traza-s {
  font: 400 var(--fs-caption) var(--sans); color: var(--muted-2);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* En gestión: la misma retícula, la tinta de aviso de la casa en el renglón principal. */
.lab-traza-gestion .lab-traza-p { color: var(--warn-fg); font-weight: 600; }

/*
 * EL PUNTO DE «EN GESTIÓN» (LAB-1 · E14). NO es la única señal —la leyenda de al lado lo dice
 * con todas las letras y el `aria-label` de la fila lo repite—: es la marca que permite barrer
 * la lista y ver de un vistazo cuáles están gestionadas. Tinta --warn-fg, 6,38:1 sobre la
 * superficie de la fila y 5,56:1 sobre el hover (medido), con halo para que no se pierda.
 */
.lab-punto {
  display: inline-block; flex: none; width: 8px; height: 8px; margin-right: 8px;
  border-radius: 50%; vertical-align: middle;
  background: var(--warn-fg); box-shadow: 0 0 0 3px var(--warn-bg);
}
/*
 * EL PILL DICE EL ESTADO CON PALABRAS, no sólo con color (WCAG 1.4.1). Los dos tonos son los que
 * la pantalla ya usaba —verde `--ok-*` para «existe», gris `--neutral-*` para «falta»—: el color
 * codifica EXISTENCIA del dato y nunca un valor clínico, que acá no se califica.
 */
.lab-pill {
  display: inline-flex; align-items: center; gap: 6px; flex: none;
  padding: 5px 12px; border-radius: var(--r-pill);
  font: 600 var(--fs-caption) var(--sans); white-space: nowrap;
}
.lab-pill[data-estado="cargado"] {
  background: var(--ok-bg); color: var(--ok-fg); border: 1px solid var(--ok-line);
}
.lab-pill[data-estado="pendiente"] {
  background: var(--neutral-bg); color: var(--neutral-fg); border: 1px solid var(--neutral-line);
}
/*
 * ══ EL CUARTO ESTADO: TODAVÍA NO SÉ (LAB-3 · A) ═══════════════════════════════════════
 *
 * Ni verde ni gris: SIN color de estado, porque los dos que hay son afirmaciones —«existe» y
 * «falta»— y acá no se afirma nada. Queda el hueco del pill con la barra del shimmer adentro, con
 * la MISMA geometría que los otros dos (mismo alto, mismo radio) para que la columna de estado no
 * se mueva cuando llega la respuesta y el pill real ocupe su lugar.
 *
 * El texto del estado lo lleva un `.visually-hidden` adentro del pill: la barra es `aria-hidden`
 * y con `prefers-reduced-motion` queda quieta, así que el movimiento nunca es el único canal.
 */
.lab-pill[data-estado="consultando"] {
  background: transparent; border: 1px solid transparent; padding: 0;
}
/* SE PREGUNTÓ Y NO SE PUDO SABER. Neutral y quieto, con el borde punteado que lo separa a simple
   vista de un «pendiente» afirmado: no es un estado de la persona, es un estado de la consulta. */
.lab-pill[data-estado="sin-dato"] {
  background: transparent; color: var(--muted); border: 1px dashed var(--line);
}
.lab-pill-tilde { flex: none; }
/* Mientras el formulario espera la proyección completa de esa persona (fail-closed: no se
   precargan campos con media respuesta). Mismo aire que el resto de la caja. */
.lab-form-esperando { font: var(--fs-body) var(--sans); color: var(--muted); margin: 0; }
.lab-form-esperando[data-lab="error-consulta"] { color: var(--warn-fg); }
/* El chevron es el único indicio de que la fila se despliega, y es el mismo en la verde y en la
   gris. Lo ubica la última columna del grid; rota 180° cuando el formulario está abierto. */
.lab-chev {
  flex: none; display: grid; place-items: center; color: var(--muted);
  transition: transform .18s ease;
}
.lab-celda[aria-expanded="true"] .lab-chev { transform: rotate(180deg); }
.lab-celda[data-estado="cargado"] .lab-chev { color: var(--ok-fg); }
@media (prefers-reduced-motion: reduce) { .lab-chev { transition: none; } }

/* ---- Formulario de carga ---- */
.lab-form { padding: 16px; border-top: 1px solid var(--line); background: var(--bg); }
.lab-form-k {
  margin: 0 0 12px; font: 600 var(--fs-caption) var(--sans);
  letter-spacing: var(--ls-caption); text-transform: uppercase; color: var(--accent);
}
/* Sólo en EDICIÓN: de quién es la carga vigente y qué pasa al guardar. No es un aviso de error
   —no hay nada mal— sino el contrato del append-only dicho antes de tocar un valor. */
.lab-form-previo {
  margin: 0 0 12px; padding: 9px 12px; border-radius: var(--r-sm);
  background: var(--ok-bg); border: 1px solid var(--ok-line); color: var(--ok-fg);
  font: 400 var(--fs-caption) var(--sans); line-height: 1.55;
}
.lab-form-grid {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(184px, 1fr)); gap: 12px;
}
/* Con el switch de vigencia marcado la carga no aplica: los campos se ven apagados, además de
   estar deshabilitados de verdad (LAB-1 · E13). */
.lab-form-grid-off { opacity: .5; }

/*
 * ══ EL SWITCH «SIN LABORATORIO VIGENTE» (LAB-1 · E12) ═════════════════════════════════
 *
 * Caja propia, arriba del formulario y antes de los campos: es la decisión que determina si los
 * campos aplican. El compromiso se lee ANTES de marcar, no después. El control es un checkbox de
 * verdad —teclado, lector de pantalla y estado nativo— con la pastilla dibujada encima.
 */
.lab-vigencia {
  margin: 0 0 16px; padding: 12px 14px;
  border: 1px solid var(--line); border-radius: var(--r-sm); background: var(--bg);
}
.lab-vigencia-on { border-color: var(--warn-line); background: var(--warn-bg); }
.lab-switch { display: flex; align-items: center; gap: 10px; cursor: pointer; }
.lab-switch input { position: absolute; opacity: 0; width: 0; height: 0; }
.lab-switch-caja {
  flex: none; position: relative; width: 40px; height: 22px; border-radius: 999px;
  background: var(--neutral-line); transition: background .16s ease;
}
.lab-switch-caja::after {
  content: ""; position: absolute; top: 2px; left: 2px; width: 18px; height: 18px;
  border-radius: 50%; background: var(--surface); box-shadow: 0 1px 3px rgba(42, 26, 30, .28);
  transition: transform .16s ease;
}
.lab-switch input:checked + .lab-switch-caja { background: var(--warn-fg); }
.lab-switch input:checked + .lab-switch-caja::after { transform: translateX(18px); }
.lab-switch input:focus-visible + .lab-switch-caja { outline: 2px solid var(--accent); outline-offset: 2px; }
.lab-switch input:disabled + .lab-switch-caja { opacity: .6; }
.lab-switch-txt { font: 600 var(--fs-label) var(--sans); color: var(--ink); }
.lab-vigencia-nota { margin: 8px 0 0; font: 400 var(--fs-caption)/1.5 var(--sans); color: var(--muted); max-width: 62ch; }
.lab-vigencia-quien { margin: 6px 0 0; font: 600 var(--fs-caption) var(--sans); color: var(--warn-fg); }

/*
 * ══ EL ESQUELETO DE LA LISTA (LAB-1 · D10) ════════════════════════════════════════════
 * La geometría de las filas antes de que llegue el padrón. Misma altura que la fila real, así
 * que cuando la lista pinta no salta. Quieto con prefers-reduced-motion: la información es la
 * barra, no el brillo.
 */
.lab-fila-fantasma {
  display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(0, 1.3fr) auto;
  align-items: center; gap: 16px; min-height: 58px; padding: 10px 16px;
}
.lab-shimmer {
  display: block; height: 12px; border-radius: 6px;
  background: linear-gradient(90deg, var(--neutral-bg) 25%, rgba(42, 26, 30, .07) 50%, var(--neutral-bg) 75%);
  background-size: 200% 100%; animation: lab-respira 1.4s ease-in-out infinite;
}
.lab-shimmer-n { width: 62%; }
.lab-shimmer-d { width: 46%; }
.lab-shimmer-p { width: 120px; height: 22px; border-radius: 999px; }
/* La barra que ocupa el lugar del pill mientras el estado clínico se consulta (LAB-3 · A).
   VA ACÁ, con sus hermanas y DESPUÉS de `.lab-shimmer`: las dos son una sola clase, así que gana
   la última: declarada arriba, el `height: 12px` de la base la pisaba y el pill medía 14 px
   contra los 27 de los otros cuatro. MEDIDO en navegador — asentaba al llegar la respuesta. */
.lab-shimmer-pill { width: 136px; height: 25px; border-radius: var(--r-pill); }
@keyframes lab-respira { from { background-position: 200% 0; } to { background-position: -200% 0; } }
@media (prefers-reduced-motion: reduce) { .lab-shimmer { animation: none; } }
.lab-campo { display: flex; flex-direction: column; gap: 5px; }
.lab-campo-l { font: 500 var(--fs-label) var(--sans); color: var(--ink); }
.lab-campo-in {
  display: flex; align-items: center; gap: 6px;
  background: var(--surface); border: 1px solid var(--line-strong);
  border-radius: var(--r-sm); padding: 0 10px;
}
.lab-campo-in:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px rgba(110, 37, 54, .12); }
.lab-campo-in input {
  flex: 1 1 auto; border: 0; background: transparent; outline: none; min-width: 0;
  padding: 9px 0; font: 600 var(--fs-num) var(--mono); color: var(--ink);
}
.lab-campo-u { flex: none; font: 400 var(--fs-caption) var(--sans); color: var(--muted); }
.lab-campo-fecha input { font-family: var(--sans); font-weight: 500; }
.lab-form-nota { margin: 11px 0 0; font: 400 var(--fs-caption) var(--sans); color: var(--muted); line-height: 1.5; }
.lab-form-error {
  margin: 11px 0 0; padding: 9px 12px; border-radius: var(--r-sm);
  background: var(--warn-bg); border: 1px solid var(--warn-line); color: var(--warn-fg);
  font: 500 var(--fs-label) var(--sans);
}
.lab-form-acc { display: flex; flex-wrap: wrap; gap: 9px; margin-top: 14px; }
.lab-form-acc .btn { font-size: var(--fs-label); padding: 9px 16px; }

/*
 * CONFIRMACIÓN DE BORRADO (LAB-HIST). Ámbar de PRECAUCIÓN, la misma familia que `.lab-form-error`
 * —no el rojo de bloqueo, que en este producto significa «esto no se puede hacer»: acá sí se
 * puede, y por eso se pregunta—. El filo izquierdo la separa del bloque de error, que comparte
 * paleta pero no significado: aquél informa un rechazo, éste espera una respuesta.
 * Nace `hidden`, así que con `display:none` del atributo no ocupa nada hasta que hace falta.
 */
.lab-form-confirmar {
  margin: 11px 0 0; padding: 11px 14px; border-radius: var(--r-sm);
  background: var(--warn-bg); border: 1px solid var(--warn-line);
  border-left: 3px solid var(--warn-fg);
}
.lab-form-confirmar p {
  margin: 0; color: var(--ink); font: 500 var(--fs-label) var(--sans); line-height: 1.55;
}
.lab-form-confirmar .lab-form-acc { margin-top: 11px; }

.lab-aviso { padding: 11px 14px; font: 400 var(--fs-label) var(--sans); color: var(--muted); }
.lab-pie {
  margin: clamp(20px, 2.4vw, 30px) 0 0; padding-top: 14px; border-top: 1px solid var(--line);
  font: 400 var(--fs-caption) var(--sans); color: var(--muted); line-height: 1.6; max-width: 78ch;
}

/* 375px: la celda y el formulario pasan a una sola columna; el bloque de acciones ocupa el
   ancho para que los dos botones tengan área táctil cómoda. */
@media (max-width: 560px) {
  .lab-form-grid { grid-template-columns: 1fr; }
  .lab-form-acc .btn { flex: 1 1 auto; }
  /* El botón del padrón y el de "ver más" al ancho completo: son el objetivo táctil principal
     de esta pantalla en un teléfono. */
  .lab-acciones { flex-direction: column; align-items: stretch; }
  .lab-btn-todos { width: 100%; }
  .lab-pag { flex-direction: column; align-items: stretch; }
  .lab-pag .btn { width: 100%; }
}

/* ══ Tarjeta de Parámetros de Laboratorio (Etapa 3 · E2-B) ═════════════════════════════════
   SOLO LECTURA, en los dos pasos: bajo la tarjeta de Estratificación del Paso 2 y al pie del
   Paso 3. Crema institucional —la familia que el proyecto ya usa para lo que se consigna y se
   lee, no para lo que se edita— y sin un solo control adentro: lo que se edita es el campo del
   contrato, en su lugar de siempre. */
.lab-tarjeta {
  margin-top: 12px; padding: 14px 16px;
  background: var(--crema); border: 1px solid var(--crema-line);
  border-radius: var(--r-md); color: var(--ink);
}
.lab-tarjeta-k {
  margin: 0; font: 600 var(--fs-caption) var(--sans);
  letter-spacing: var(--ls-caption); text-transform: uppercase; color: var(--accent-deep);
}
.lab-tarjeta-f { margin: 4px 0 10px; font: 400 var(--fs-label) var(--sans); color: var(--ink); }
.lab-tarjeta-lista { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 5px; }
.lab-tarjeta-lista li {
  display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  padding-bottom: 5px; border-bottom: 1px solid var(--crema-mid);
}
.lab-tarjeta-lista li:last-child { border-bottom: 0; padding-bottom: 0; }
.lab-tarjeta-lista span { font: 400 var(--fs-label) var(--sans); color: var(--ink); }
.lab-tarjeta-lista strong { font: 600 var(--fs-num) var(--mono); color: var(--ink); white-space: nowrap; }
.lab-tarjeta-pie {
  margin: 10px 0 0; padding-top: 9px; border-top: 1px solid var(--crema-mid);
  font: 400 var(--fs-caption) var(--sans); color: var(--muted-2); line-height: 1.55;
}
/* Al pie del Paso 3 la tarjeta no está en un rail angosto: se le da el ancho de la columna y
   los cinco parámetros pasan a dos columnas donde entran. */
.lab-tarjeta-p3 { margin-top: clamp(18px, 2.2vw, 26px); }
@media (min-width: 620px) {
  .lab-tarjeta-p3 .lab-tarjeta-lista { display: grid; grid-template-columns: 1fr 1fr; gap: 5px 26px; }
}
@media print { .lab-tarjeta { break-inside: avoid; } }

/* ══════════════════════════════════════════════════════════════════════════════════════════
   GATE DEL SEGMENTO KPIs (E4-4)
   Andamiaje calcado del modal de reapertura: overlay a nivel body, scroll-lock por clase,
   cierre por ×/Escape/backdrop. No estrena lenguaje visual: es la misma cortina de siempre.
   ══════════════════════════════════════════════════════════════════════════════════════════ */
.kg-overlay {
  position: fixed; inset: 0; z-index: 92;
  display: grid; place-items: center; padding: 20px;
  background: rgba(42, 26, 30, .46);
}
.kg-modal {
  width: min(420px, 100%);
  background: var(--surface); border-radius: 16px;
  box-shadow: 0 24px 70px rgba(42, 26, 30, .28);
  overflow: hidden; padding-bottom: 18px;
}
.kg-head {
  display: flex; align-items: flex-start; gap: 12px;
  padding: 18px 20px 14px; border-bottom: 1px solid var(--line);
}
.kg-kicker {
  margin: 0 0 3px; font: 600 var(--fs-caption) var(--sans);
  letter-spacing: .08em; text-transform: uppercase; color: var(--accent);
}
.kg-titulo { margin: 0; font: 600 var(--fs-h2) var(--serif); color: var(--ink); line-height: 1.2; }
.kg-x {
  margin-left: auto; flex: none; width: 34px; height: 34px;
  display: grid; place-items: center;
  background: var(--neutral-bg); color: var(--ink);
  border: 0; border-radius: 50%; cursor: pointer;
}
.kg-x:hover { background: var(--accent-soft); }
.kg-lead {
  margin: 14px 20px 10px; font: 400 var(--fs-label) var(--sans);
  color: var(--muted); line-height: 1.5;
}
.kg-overlay form { padding: 0 20px; }
/* El mensaje ocupa lugar SIEMPRE: sin alto reservado, el modal salta cuando aparece el error
   y el foco del teclado se mueve debajo del dedo. */
.kg-msg {
  min-height: 1.2em; margin: 8px 0 0;
  font: 500 var(--fs-label) var(--sans); color: var(--band-3);
}
.kg-acciones { display: flex; gap: 10px; justify-content: flex-end; margin-top: 16px; }
body.kg-open { overflow: hidden; }
@media print { .kg-overlay { display: none; } }

/* ══════════════════════════════════════════════════════════════════════════════════════════
   LISTA DE PARTICIPANTES · subpágina del segmento KPIs (E4-2)
   El estado NO se codifica sólo por color (WCAG 1.4.1): la celda con dato dice «OK» y la
   fecha; la vacía dice «Pendiente». Quien no distinga el gris del blanco lee lo mismo.
   ══════════════════════════════════════════════════════════════════════════════════════════ */
/* ── Página Participantes (PART-1) ─────────────────────────────────────────────────────────
   La barra de arriba quedó para el export (el título es el h1 de la página); la franja de
   abajo ordena la salida: «Volver al tablero» al centro como acción principal, y el enlace a
   las bajas REBAJADO al extremo derecho — texto plano, sin caja, tinta secundaria. --muted
   sobre #fbf7f6 mide 6,07:1 (AA); el subrayado aparece pleno al hover y el foco visible es el
   del resto de la casa. En angosto la grilla colapsa a una columna centrada: el enlace baja
   debajo del botón, nunca encimado. */
/* LA MARCA ARENA SE FUE DE LOS SEGMENTOS CLÍNICOS (LAB-1 · A). ELEG-1 la había puesto en el
   desplegable «ver todos» y en la lista de Analítica para rotular a quien no tiene criterio;
   la regla cambió por orden expresa y esas personas ya no se listan en ninguna de las dos
   superficies. Los tokens --sincriterio-* siguen vivos, y con UN solo consumidor: la Lista de
   Participantes, que sí las muestra con su fila fusionada. */
.lab-aviso[data-aviso="error"] { background: var(--warn-bg); color: var(--ink); border-left: 3px solid var(--band-3); }

/* ══ El hero compacto de Participantes (PART-2 · C10) ═════════════════════════════════════
   Reusa la banda de la casa (.lab-hero) — cuarto uso del mismo degradé habría sido cuarta
   COPIA; acá es la misma clase con un modificador. Compacto a propósito (auditoría R1): el
   contenido es una tabla de trabajo y el hero no puede empujar la primera fila bajo el fold.
   El kicker sube un punto y abre el tracking: es el título de sección del segmento. */
.pl-hero { padding: clamp(26px, 3.8vw, 42px) clamp(20px, 6vw, 80px) 0; }
.pl-hero .lab-hero-k { font-size: 13px; letter-spacing: .22em; margin-bottom: 10px; }
.pl-hero .lab-hero-t { margin-bottom: 4px; font-size: clamp(30px, 3.6vw, 44px); }
.pl-hero .hero-ecg { height: 36px; margin: clamp(12px, 1.8vh, 18px) calc(50% - 50vw) 0; opacity: .4; }
.pl-sec { padding-top: clamp(22px, 3vw, 34px); }

/* ══ El esqueleto y la celda «consultando» (PART-2 · A) ═══════════════════════════════════
   La barra respira con la paleta neutra de la casa (la misma familia que la celda Pendiente):
   dice «acá va a haber algo» sin inventar un color nuevo ni afirmar un estado. Con
   prefers-reduced-motion queda quieta — la información es la barra, no el brillo. */
.kl-shimmer {
  display: inline-block; width: 72%; max-width: 120px; height: 12px; border-radius: 6px;
  background: linear-gradient(90deg, var(--neutral-bg) 25%, rgba(42, 26, 30, .07) 50%, var(--neutral-bg) 75%);
  background-size: 200% 100%;
  animation: kl-respira 1.4s ease-in-out infinite;
}
.kl-shimmer-chip { width: 52px; height: 22px; border-radius: 999px; }
@keyframes kl-respira { from { background-position: 200% 0; } to { background-position: -200% 0; } }
@media (prefers-reduced-motion: reduce) { .kl-shimmer { animation: none; } }
.kl-cel-esperando { background: transparent; }

/* ══ Los filtros de pendientes (PART-2 · D12) ═════════════════════════════════════════════
   Disclosure de la casa: «Todos los participantes» y «Filtrar por» como pills; el panel es una
   tarjeta con las cuatro opciones, cada una con su contador (que se afirma o no se pone). El
   estado activo se dice con el relleno bordó (blanco 10,6:1), con aria-pressed y con el chip:
   nunca sólo con color. Targets ≥24px (WCAG 2.5.8). */
.pl-filtros { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin: 0 0 16px; }
.pl-filtro-todos, .pl-filtro-boton {
  min-height: 34px; padding: 6px 16px; border-radius: var(--r-pill); cursor: pointer;
  border: 1px solid var(--line-strong); background: var(--surface); color: var(--ink);
  font: 600 var(--fs-label) var(--sans);
}
.pl-filtro-todos:hover, .pl-filtro-boton:hover { background: var(--accent-soft); }
.pl-filtro-todos[aria-pressed="true"] {
  background: var(--accent); border-color: var(--accent); color: #fff;
}
.pl-filtro-todos:focus-visible, .pl-filtro-boton:focus-visible, .pl-chip:focus-visible,
.pl-filtro-op:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.pl-filtro-menu { position: relative; }
.pl-caret { font-size: 10px; opacity: .7; margin-left: 2px; }
.pl-filtro-panel {
  position: absolute; top: calc(100% + 6px); left: 0; z-index: 30; min-width: 300px;
  background: var(--surface); border: 1px solid var(--line-strong); border-radius: var(--r-md);
  box-shadow: 0 14px 34px rgba(42, 26, 30, .14); padding: 6px; display: grid; gap: 2px;
}
.pl-filtro-op {
  display: flex; align-items: center; justify-content: space-between; gap: 14px;
  min-height: 34px; padding: 7px 12px; border: 0; border-radius: var(--r-sm); cursor: pointer;
  background: none; text-align: left; font: 500 var(--fs-label) var(--sans); color: var(--ink);
  width: 100%;
}
.pl-filtro-op:hover { background: var(--accent-soft); }
.pl-filtro-op[aria-pressed="true"] { background: var(--accent); color: #fff; }
.pl-filtro-n { font: 600 12px var(--mono); color: var(--muted-2); }
.pl-filtro-op[aria-pressed="true"] .pl-filtro-n { color: rgba(255, 255, 255, .85); }
/* El chip del filtro activo: lo dice y lo quita. Tinta bordó sobre el rosado de la casa
   (9,25:1 medido). */
.pl-chip {
  display: inline-flex; align-items: center; gap: 7px; min-height: 30px; padding: 4px 12px;
  border: 1px solid rgba(110, 37, 54, .25); border-radius: var(--r-pill); cursor: pointer;
  background: var(--accent-soft); color: var(--accent); font: 600 var(--fs-caption) var(--sans);
}
.pl-chip:hover { background: var(--accent); color: #fff; }
/* El estado vacío de un filtro: se dice, no se deja en blanco. */
.kl-vacio { text-align: center; padding: 26px 14px; color: var(--muted); font: 400 var(--fs-label) var(--sans); }

/* ══ Las acciones del pie y el Volver flotante (PART-2 · D13-D14) ═════════════════════════
   Exportar y Ver bajas PAREJOS (outline, la familia de lo secundario); el Volver es OTRA
   familia —primario lleno con sombra— y flota con position:sticky DENTRO del flujo: acompaña
   el scroll y, al llegar al final, se asienta en su lugar natural sobre el footer — nunca lo
   tapa y no hace falta compensar con padding. La zona no roba clics: pointer-events sólo en
   el pill. */
.pl-acciones { display: flex; justify-content: center; flex-wrap: wrap; gap: 12px; margin-top: 24px; }
.pl-volver-zona {
  position: sticky; bottom: 18px; z-index: 20;
  display: flex; justify-content: center; margin: 26px 0 6px;
  pointer-events: none;
}
.pl-volver-sticky {
  pointer-events: auto;
  box-shadow: 0 12px 30px rgba(72, 20, 31, .30), 0 3px 9px rgba(72, 20, 31, .22);
}
/* `.kpi-subnav-nota` se fue con el subtítulo que la usaba (UI-1). No se deja la regla huérfana:
   una clase sin consumidor invita a que alguien la reuse creyendo que hay un patrón detrás. */

.kl-head { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin-bottom: 14px; }
.kl-titulo { margin: 0; font: 600 var(--fs-h2) var(--serif); color: var(--ink); }
/* Tinta de AVISO de la casa, no la banda clinica --band-3: un error de pantalla no es un riesgo Alto. */
.kl-msg { margin: 0 0 12px; font: 500 var(--fs-label) var(--sans); color: var(--warn-fg); }
/* .kl-cargando se fue con el texto de carga: PART-2 (A) lo reemplazo por el esqueleto. Una
   regla sin consumidor invita a reusarla creyendo que hay un patron detras. */

/*
 * ══ LA TABLA, REDISEÑADA (PART-2 · B) ═══════════════════════════════════════════════════
 *
 * Scrollea DENTRO de su caja —el cuerpo de la página nunca en horizontal— y la caja es una
 * REGIÓN enfocable (tabindex en el markup): sin eso, un teclado no puede desplazarla.
 *
 * `border-collapse: separate` y no collapse: es lo que deja que el `overflow` del wrap recorte
 * las esquinas contra su radio (con collapse, los fondos de las celdas pisaban el redondeo —
 * medido en navegador). El borde por fila vive en el borde inferior de cada celda.
 *
 * EL STICKY DEL TH SE FUE: era chrome muerto — su contenedor de scroll (.kl-tabla-wrap) jamás
 * scrollea en vertical, así que prometía un comportamiento que el layout no puede cumplir.
 *
 * ZEBRA APENAS PRESENTE + hover: con ocho columnas el ojo necesita seguir el renglón; la
 * alternancia es del 2% de tinta —guía, no rayado— y el hover marca la fila activa. La fila
 * sin-criterio (arena) le gana a la zebra y al hover porque su selector la NOMBRA con la misma
 * especificidad y va después en la hoja — el verificador adversarial cazó la versión anterior,
 * donde la zebra (0,3,2) le ganaba al arena (0,2,0) y una fila sin-criterio en posición par se
 * pintaba blanca, distinta de su gemela impar.
 */
/* El MARCO sostiene el borde, el radio y las sombras de canto; el WRAP de adentro scrollea.
   Dos piezas porque las sombras tienen que quedar QUIETAS sobre los cantos mientras el
   contenido pasa por debajo — pintadas sobre el scroller, viajarían con él. */
.kl-tabla-marco { position: relative; border: 1px solid var(--line); border-radius: var(--r-md); background: var(--surface); }
.kl-tabla-wrap { overflow-x: auto; border-radius: inherit; }
.kl-tabla-wrap:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
/* Sombras de canto: la pista de que hay más columnas hacia un lado. Las enciende y apaga el
   módulo según scrollLeft (clases kl-mas-izq / kl-mas-der); tinta de la casa, nunca color nuevo. */
.kl-tabla-marco::before, .kl-tabla-marco::after {
  content: ""; position: absolute; top: 0; bottom: 0; width: 22px; z-index: 2;
  pointer-events: none; opacity: 0; transition: opacity .18s ease; border-radius: inherit;
}
.kl-tabla-marco::before { left: 0; background: linear-gradient(90deg, rgba(42, 26, 30, .14), rgba(42, 26, 30, 0)); }
.kl-tabla-marco::after { right: 0; background: linear-gradient(270deg, rgba(42, 26, 30, .14), rgba(42, 26, 30, 0)); }
.kl-tabla-marco.kl-mas-izq::before { opacity: 1; }
.kl-tabla-marco.kl-mas-der::after { opacity: 1; }
.kl-tabla { width: 100%; min-width: 880px; border-collapse: separate; border-spacing: 0; font: 400 var(--fs-label) var(--sans); }
.kl-tabla th {
  padding: 11px 14px; text-align: left; white-space: nowrap;
  background: var(--surface); color: var(--muted-2);
  font: 600 var(--fs-caption) var(--sans); letter-spacing: .06em; text-transform: uppercase;
  border-bottom: 1px solid var(--line-strong);
}
.kl-cel { padding: 10px 14px; border-bottom: 1px solid var(--line); color: var(--ink); vertical-align: middle; }
.kl-tabla tbody tr:last-child .kl-cel { border-bottom: 0; }
.kl-tabla tbody tr:nth-child(even) > .kl-cel { background: rgba(42, 26, 30, .02); }
.kl-tabla tbody tr:hover > .kl-cel { background: rgba(42, 26, 30, .045); }
/* El DNI es una cifra: la mono de la casa, tabular, para que la columna se lea como columna. */
.kl-dni { font: 500 12px var(--mono); font-variant-numeric: tabular-nums; letter-spacing: .02em; }
/* El nombre es el ancla de la fila: respira y no se parte. */
.kl-nombre { min-width: 200px; font-weight: 500; }
.kl-cel-btn { width: 1%; white-space: nowrap; text-align: right; }
.kl-ficha {
  padding: 5px 12px; border: 1px solid var(--line); border-radius: 999px;
  background: var(--surface); color: var(--accent); cursor: pointer;
  font: 600 var(--fs-caption) var(--sans);
}
.kl-ficha:hover { background: var(--accent-soft); }
.kl-ficha:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* CON dato: la marca y la fecha, en tinta plena. */
.kl-cel-si { white-space: nowrap; }
/* La pill OK habla el idioma de la Analítica (PART-2 · B): la familia --ok-* de la casa —verde
   claro con tinta verde profunda, 6,64:1 medido— y NO la banda clínica --band-0, que codifica
   riesgo Bajo de HEARTS-OPS y acá significaría otra cosa. Menos tinta que el sólido de antes:
   con cinco piezas por fila, un verde macizo repetido gritaba más que el dato. */
.kl-ok {
  display: inline-block; margin-right: 7px; padding: 1px 8px; border-radius: var(--r-pill);
  background: var(--ok-bg); color: var(--ok-fg); border: 1px solid var(--ok-line);
  font: 700 var(--fs-caption) var(--sans);
}
.kl-fecha { font-variant-numeric: tabular-nums; color: var(--ink); }
/* ══════════════════════════════════════════════════════════════════════════════════════════
   DESHACER UNA PIEZA DE UNA FICHA DE DEMOSTRACIÓN (FLUJO-1 · 3)

   Vive DENTRO de la celda en OK y sólo aparece con el modo demostración encendido, sobre fichas
   del rango 99 y para coordinación — las tres condiciones las decide piezas-demo.js, acá sólo se
   viste. Discreto en reposo y de aviso al pasar por encima: el gesto borra, y el color tiene que
   decirlo ANTES del clic. El disco crece a 44px de área táctil sin agrandarse a la vista, con el
   mismo recurso que `.fila-baja`.
   ══════════════════════════════════════════════════════════════════════════════════════════ */
.kl-quitar {
  position: relative; flex: none; width: 22px; height: 22px; margin-left: 8px;
  display: inline-grid; place-items: center; vertical-align: middle;
  background: none; border: 1px solid var(--line); border-radius: 50%;
  color: var(--muted-2); cursor: pointer;
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.kl-quitar:hover { background: var(--warn-bg); color: var(--warn-fg); border-color: var(--warn-line); }
.kl-quitar:focus-visible { outline: 2px solid var(--warn-fg); outline-offset: 2px; }
.kl-quitar::after { content: ""; position: absolute; inset: -11px; border-radius: 50%; }
/* SIN dato: fondo gris y texto en --muted-2, que el proyecto ya usa con ≥5.7:1 sobre claro.
   El gris es refuerzo del rótulo, no el rótulo. */
/* SIN dato: texto y nada más (PART-2 · B7). El panel gris se fue — en una cohorte en curso la
   mayoría de las celdas son pendientes, y pintarlas era darle más tinta a la ausencia que a la
   presencia: bloques grises dominando la tabla. La palabra ES la señal (WCAG 1.4.1) y --muted-2
   mide 5,73:1 sobre blanco. */
.kl-cel-no { background: transparent; }
.kl-pend { color: var(--muted-2); font: 500 var(--fs-caption) var(--sans); }

.kl-pie {
  display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap;
  margin-top: 12px;
}
.kl-pie-txt { font: 400 var(--fs-label) var(--sans); color: var(--muted); }

/* ── Export a Excel (E4-3 → PART-2 · D13) ───────────────────────────────────────────────
   El botón vive al pie, pareja de «Ver fichas dadas de baja» en .pl-acciones (centrados por
   el flex del contenedor). El `margin-left:auto` de E4-3 era de cuando vivía en el encabezado
   y quedó stale dos rediseños: empujaba al botón fuera del eje — se va. */
.kl-exportar[disabled] { opacity: .55; cursor: progress; }
/* Alto reservado SIEMPRE: el renglón del avance aparece y desaparece mientras el dedo está
   sobre el botón, y sin alto propio el encabezado saltaría en ese momento. */
.kl-exp {
  min-height: 1.2em; margin: 8px 0 0; text-align: center;
  font: 500 var(--fs-label) var(--sans); color: var(--muted);
  font-variant-numeric: tabular-nums;
}
/* Aviso de custodia: la nota de «sin dato clínico» va más chica que el cuerpo — informa, no
   compite con lo que sí es una advertencia. */
.kx-nota {
  margin: 0 20px; font: 500 var(--fs-caption) var(--sans); color: var(--muted-2);
}
.kx-acciones { padding: 0 20px; }

/* 480 y no 420: el breakpoint chico de la familia de la casa (hero/masthead). */
@media (max-width: 480px) {
  .kl-tabla { font-size: var(--fs-caption); }
  .kl-cel, .kl-tabla th { padding: 8px 10px; }
}

/*
 * ACUSE DE LA PORTADA DEL CONSULTORIO (ORG-1). Aparece al volver de «Finalizar Práctica de Enfermería» y es
 * también donde aterriza el error si el guardado remoto falla. Dos tonos con la paleta que la casa
 * ya usa para lo mismo: verde de confirmación y ámbar de precaución (`--warn-*`, el mismo par que
 * `.lab-form-error`). Nace `hidden`, así que no ocupa nada mientras no haga falta.
 */
.cons-aviso {
  margin: 0 0 clamp(18px, 2vw, 26px); padding: 11px 14px; border-radius: var(--r-sm);
  font: 500 var(--fs-label) var(--sans); line-height: 1.5; color: var(--ink);
  background: var(--ok-bg); border: 1px solid var(--ok-line);
  border-left: 3px solid var(--ok-fg);
}
.cons-aviso[data-tono="error"] {
  background: var(--warn-bg); border-color: var(--warn-line); border-left-color: var(--warn-fg);
}

/*
 * SIN PARTICIPANTE NO HAY CARGA CLÍNICA (BACKEND-1 · B). Mismo lenguaje visual que `.cons-aviso`
 * —el aviso que la casa ya usa— en tono de advertencia: no es un error de nadie, es el estado en
 * el que está la pantalla. Va arriba de todo del paso, donde se lee antes de tipear el primer
 * campo y no después.
 */
.sin-part {
  margin: 0 0 clamp(18px, 2vw, 26px); padding: 11px 14px; border-radius: var(--r-sm);
  font: 500 var(--fs-label) var(--sans); line-height: 1.5; color: var(--ink);
  background: var(--warn-bg); border: 1px solid var(--warn-line);
  border-left: 3px solid var(--warn-fg);
}

/*
 * FLECHA DE LA TARJETA DE DETALLE DEL CIRCUITO (UX-1). Vértice superior derecho, por encima de la
 * marca de agua —que es `pointer-events:none` y vive en el centro derecho, así que no compiten—.
 * El fondo translúcido sobre el bordó profundo de la tarjeta le da borde propio sin inventar un
 * componente: es el mismo lenguaje de las superficies claras sobre `--accent-deep` que la casa ya
 * usa. El foco visible sale del `--focus` global, que ya alcanza a todo <a>.
 */
/*
 * ══ LA FLECHA DEL CIRCUITO, REDISEÑADA (UX-3) ══════════════════════════════════════════
 *
 * Era un círculo translúcido con borde blanco al 28 %: correcto y anónimo — el mismo botón que
 * tendría cualquier app. Ahora habla el idioma de la casa, con las tres piezas que el sistema ya
 * tiene: el BORDÓ PROFUNDO de fondo, el FILO DORADO de borde y el glifo en dorado claro.
 *
 * EL DORADO ES EL ACENTO DE LA CASA sobre bordó —el mismo `--hl` del filo de la faja de
 * demostración y del pulso del cierre del estudio—, así que el botón se lee como parte del
 * sistema y no como un control importado. El glifo usa `--hl-claro`, que es el tono de la misma
 * familia que ya pasó AA sobre bordó en el botón de finalizar estudio: no se estrena ningún color.
 *
 * ASENTADO EN EL VÉRTICE. La sombra hacia abajo y el filo interior de luz le dan volumen sobre el
 * bordó plano de la tarjeta; sin ellos, un círculo bordó sobre fondo bordó flota.
 *
 * EL MOVIMIENTO ES OBLICUO, como el glifo: al hover sube y sale un pelo hacia la derecha —el
 * mismo vector que la flecha dibuja—, en vez del desplazamiento horizontal de antes.
 */
#etapa-detalle .etapa-ir {
  position: absolute; z-index: 2;
  top: clamp(14px, 1.8vw, 22px); right: clamp(14px, 1.8vw, 22px);
  display: inline-flex; align-items: center; justify-content: center;
  /* 44px: el objetivo táctil de WCAG 2.5.5, sin depender del tamaño del glifo. */
  width: 44px; height: 44px; border-radius: 50%;
  color: var(--hl-claro);
  /* CUERPO EN REPOSO. Con `--accent-deep` el fondo era EXACTAMENTE el de la tarjeta —medido,
     1,00:1— y el botón quedaba definido sólo por el aro: un anillo flotando. `--berry-panel` es
     el escalón siguiente de la misma familia y le da volumen sin estrenar color; el aro dorado
     sigue siendo lo que lo separa de un vistazo (4,80:1 contra la tarjeta). */
  background: var(--berry-panel);
  border: 1px solid var(--hl);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .10), 0 4px 12px rgba(42, 26, 30, .28);
  transition: background .18s ease, border-color .18s ease, transform .18s ease, box-shadow .18s ease;
}
#etapa-detalle .etapa-ir:hover {
  background: var(--accent);
  border-color: var(--hl-claro);
  transform: translate(2px, -2px);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .14), 0 8px 20px rgba(42, 26, 30, .34);
}
#etapa-detalle .etapa-ir:active {
  transform: translate(2px, -2px) scale(.95);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .08), 0 3px 9px rgba(42, 26, 30, .3);
}
/* El foco NO depende del hover ni del color: anillo dorado propio, que se ve sobre el bordó de la
   tarjeta —el `--focus` global es tinta y ahí se pierde—. */
#etapa-detalle .etapa-ir:focus-visible {
  outline: 3px solid var(--hl-claro); outline-offset: 3px;
}
@media (prefers-reduced-motion: reduce) {
  #etapa-detalle .etapa-ir { transition: none; }
  #etapa-detalle .etapa-ir:hover, #etapa-detalle .etapa-ir:active { transform: none; }
}

/* La faja de demostración sólo desplaza la variante flotante de Enfermería en desktop amplio. */
@media (min-width: 1420px) {
  body[data-demo="si"] #view-consulta:has(section[data-subflow="inicial"]:not([hidden])) > .prog-caja {
    bottom: calc(18px + var(--demo-reserva, 76px));
    z-index: 96;
  }
}

/* Los tres filtros del padrón (UX-1): un grupo, no tres botones sueltos. El activo se distingue
   por relleno y no sólo por borde, y `aria-pressed` es lo que lo dice sin depender del color. */
/*
 * ══ LOS TRES PILLS, EN UNA SOLA FILA (UX-3) ════════════════════════════════════════════
 *
 * Los rótulos crecieron —«Laboratorios pendientes de carga» más su contador— y con `flex-wrap:
 * wrap` el tercero se caía de renglón en anchos normales, que es justo lo que no puede pasar: los
 * tres son la misma pregunta y tienen que leerse juntos.
 * `nowrap` arriba de 900 px y `white-space: nowrap` en cada uno, para que ninguno se parta por
 * dentro. Abajo de 900 se apilan a lo ancho completo, que en un teléfono es más legible que tres
 * pastillas apretadas.
 */
.lab-filtros { display: flex; flex-wrap: nowrap; gap: 8px; }
.lab-filtros .btn { font-size: var(--fs-label); white-space: nowrap; flex: 0 0 auto; }
@media (max-width: 900px) {
  .lab-filtros { flex-wrap: wrap; }
  .lab-filtros .btn { flex: 1 1 100%; justify-content: center; }
}
.lab-filtros .btn[aria-pressed="true"] {
  background: var(--accent); color: #fff; border-color: var(--accent);
}

/* El pulso ECG del botón de finalizar estudio (UX-1): el MISMO motivo y la misma animación que el
   CTA de la práctica —`ecgflow`, 165px de paso, 2,4s lineal—, para que el gesto de "cerrar el
   acto" se lea igual en los dos pasos. Decorativo y `aria-hidden`: no compite por contraste. */
.dop-fin-ecg {
  position: absolute; left: -6px; right: -6px; bottom: 0; height: 44px;
  overflow: hidden; opacity: .28; pointer-events: none;
}
.dop-fin-ecg svg {
  display: block; max-width: none; width: calc(100% + 165px); height: 44px;
  animation: ecgflow 2.4s linear infinite;
}
/* El contenido va POR ENCIMA del pulso. */
.dop-fin > span { position: relative; z-index: 1; }
@media (prefers-reduced-motion: reduce) { .dop-fin-ecg svg { animation: none; } }

/* ═══════════════════ CRONOGRAMA (UX-3) ═══════════════════
 *
 * ESTRUCTURA CON LA ESTÉTICA DE LA CASA, sin estrenar componentes: el encabezado es el `sec-head`
 * de siempre, los chips reusan el radio y el peso de las pills del sistema, y la cabecera de cada
 * grilla es una banda bordó —el mismo `--accent-deep` de las superficies a sangre completa—.
 * Las celdas nacen vacías y se ven vacías: es una agenda sin turnos, y tiene que leerse así.
 */

/* El aviso honesto: ámbar de precaución, la misma familia que el resto de los avisos del sitio. */
.cron-aviso {
  margin: 0 0 clamp(18px, 2vw, 26px); padding: 11px 14px; border-radius: var(--r-sm);
  background: var(--warn-bg); border: 1px solid var(--warn-line); border-left: 3px solid var(--warn-fg);
  color: var(--ink); font: 500 var(--fs-label) var(--sans); line-height: 1.5;
}

.cron-leyenda {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  margin: 0 0 clamp(20px, 2.4vw, 30px);
}
.cron-leyenda-k {
  font: 600 12px var(--sans); letter-spacing: .18em; text-transform: uppercase; color: var(--muted);
  margin-right: 4px;
}
.cron-chip {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 5px 12px; border-radius: var(--r-pill);
  font: 600 var(--fs-caption) var(--sans); color: var(--ink);
  background: var(--surface); border: 1px solid var(--line);
}
/* El punto de color es el código; la PALABRA de al lado es lo que lo hace legible sin depender
   del color (WCAG 1.4.1) — por eso cada chip se nombra, no es sólo un cuadrito. */
.cron-chip::before {
  content: ''; width: 10px; height: 10px; border-radius: 50%; flex: none;
  background: var(--cron-color, var(--muted-2));
}
/* Tres tonos de la familia de la casa + el neutro de «libre». No se estrena ninguno: son el
   bordó de marca, el berry intermedio y el dorado, que es la terna que el sistema ya usa junta. */
.cron-chip[data-prof="1"] { --cron-color: var(--accent); }
.cron-chip[data-prof="2"] { --cron-color: var(--berry-panel); }
.cron-chip[data-prof="3"] { --cron-color: var(--hl); }
.cron-chip[data-prof="libre"] { --cron-color: var(--neutral-line); }

.cron-bloque { margin-bottom: clamp(28px, 3.4vw, 44px); }
.cron-bloque-head { margin-bottom: 14px; }
.cron-bloque-t { margin: 0; font: 500 clamp(21px, 2.2vw, 27px)/1.2 var(--serif); color: var(--ink); }
.cron-bloque-b { margin: 4px 0 0; font: 400 var(--fs-label) var(--sans); color: var(--muted); }

/* La grilla scrollea SOLA en pantallas angostas: el documento nunca desborda a lo ancho. */
.cron-scroll {
  overflow-x: auto; border: 1px solid var(--line); border-radius: var(--r-md);
  background: var(--surface); box-shadow: var(--shadow-sm);
}
.cron-tabla { width: 100%; border-collapse: collapse; min-width: 620px; }
.cron-tabla thead th {
  position: sticky; top: 0; z-index: 1;
  background: var(--accent-deep); color: #fff;
  font: 600 12px var(--sans); letter-spacing: .1em; text-transform: uppercase;
  padding: 11px 10px; text-align: center;
  border-bottom: 2px solid var(--hl);
}
.cron-tabla thead th.cron-h-hora { width: 72px; }
.cron-hora {
  font: 600 var(--fs-caption) var(--mono); color: var(--muted-2);
  padding: 0 10px; text-align: right; white-space: nowrap;
  background: var(--bg); border-right: 1px solid var(--line);
}
.cron-celda {
  height: 42px; border-bottom: 1px solid var(--line); border-right: 1px solid var(--line);
  background: var(--surface);
}
.cron-tabla tbody tr:last-child .cron-celda,
.cron-tabla tbody tr:last-child .cron-hora { border-bottom: 0; }
.cron-tabla tbody td:last-child { border-right: 0; }
/* Franja horaria alterna, muy tenue: da renglón sin dibujar una grilla pesada. */
.cron-tabla tbody tr:nth-child(even) .cron-celda { background: var(--bg); }

@media (max-width: 700px) {
  .cron-tabla { min-width: 560px; }
  .cron-celda { height: 38px; }
}

/* ══ HERO DE ANALÍTICA DE LABORATORIO (UX-3) ══════════════════════════════════════════
 *
 * El MISMO degradé que `.hero` de #estudio y `.kpi-masthead` de #kpis: el segmento dejó de ser el
 * único que abría sobre crema. No hay componente nuevo — hay la banda de la casa aplicada acá.
 * El `padding-top` arranca debajo del nav fijo, igual que el masthead de KPIs.
 */
.lab-hero {
  position: relative; overflow: hidden;
  padding: clamp(34px, 5vw, 56px) clamp(20px, 6vw, 80px) clamp(30px, 4.4vw, 48px);
  background: radial-gradient(135% 125% at 84% -12%, var(--accent) 0%, var(--accent-deep) 73%);
  color: #fff;
}
.lab-hero-inner { max-width: var(--maxw); margin: 0 auto; }
.lab-hero-k {
  margin: 0 0 12px; font: 600 12px var(--sans); letter-spacing: .18em; text-transform: uppercase;
  color: rgba(255, 255, 255, .72);
}
.lab-hero-t {
  margin: 0 0 14px; font: 600 clamp(30px, 4.6vw, 52px)/1.04 var(--serif); color: #fff;
  text-wrap: balance;
}
/*
 * ══ LA BAJADA, EN DOS PIEZAS Y CON JERARQUIA (LAB-TEXTO) ════════════════════════════════
 *
 * Era UN párrafo de 78ch con tres oraciones encadenadas. Ahora son dos alturas: la frase que dice
 * QUÉ es esta pantalla, y debajo la guía de tres renglones que dice CÓMO se usa.
 *
 * EL ANCHO BAJA DE 78ch A 60/62ch, y es la mitad del arreglo. 78ch sobre un hero de hasta 1240 px
 * da renglones de más de 100 caracteres: el ojo pierde el comienzo de la línea siguiente y por eso
 * el párrafo se leía como un bloque. 60ch es el rango en el que un renglón se lee de una pasada.
 *
 * ══ CONTRASTE, MEDIDO Y NO ESTIMADO ═════════════════════════════════════════════════════
 *
 * El fondo es un degradé radial de `--accent` (#6e2536) a `--accent-deep` (#48141f), así que TODO
 * se mide contra el punto MÁS CLARO —#6e2536—, que es el peor caso. Calculado con la fórmula de
 * luminancia relativa de WCAG 2.2, componiendo el alfa sobre ese fondo:
 *
 *     rgba(255,255,255,.90)  frase de arriba   8,86:1   AAA
 *     rgba(255,255,255,.82)  renglones         7,66:1   AAA
 *     #fff                   «Pill verde/gris» 10,60:1  AAA
 *     var(--crema-line)      la viñeta ·        4,93:1   AA  (y es decorativa)
 *
 * Sobre el extremo oscuro del degradé los cuatro suben (11,4 · 10,5 · 15,1 · 6,6). O sea que la
 * bajada cumple AAA en todo su recorrido, no sólo en el punto que convenía medir.
 *
 * LA VIÑETA USA `--crema-line`, que es el token que la casa ya declara para piezas sobre fondo
 * berry, y NO `--hl` (#c1853f): ése mide 3,38:1 acá y alcanza para una decoración, pero un punto
 * que marca el comienzo de un renglón conviene que se vea con el mismo margen que el renglón.
 * Cero colores nuevos.
 */
.lab-hero-b {
  margin: 0; max-width: 60ch;
  font: 400 clamp(16px, 1.55vw, 18px)/1.55 var(--sans); color: rgba(255, 255, 255, .90);
  text-wrap: pretty;
}
.lab-hero-guia {
  margin: 14px 0 0; padding: 0; list-style: none; max-width: 62ch;
  display: grid; gap: 7px;
}
/*
 * SANGRIA FRANCESA: la viñeta va absoluta y el texto lleva su propio `padding-left`, así que un
 * renglón que envuelve —y en mobile envuelven los tres— alinea bajo el TEXTO y no bajo el punto.
 * Con `list-style` esa alineación la da el navegador; acá hay que pedirla, y sin ella la segunda
 * línea de cada ítem arranca debajo de la viñeta y la lista deja de leerse como lista.
 */
.lab-hero-guia li {
  position: relative; padding-left: 17px;
  font: 400 clamp(14.5px, 1.3vw, 16px)/1.55 var(--sans); color: rgba(255, 255, 255, .82);
  text-wrap: pretty;
}
/*
 * LA VIÑETA SE CENTRA SOBRE EL PRIMER RENGLON, y el `line-height` es la unica forma de conseguirlo:
 * el `·` es un punto MEDIO, o sea que se apoya en el centro de SU caja de línea. Con `/1` esa caja
 * medía 1,4em y el punto quedaba flotando por encima del texto — se vio en pantalla antes de
 * corregirlo. `calc(1.55 / 1.4)` hace que la caja del pseudo mida exactamente 1,55em del ítem, que
 * es su interlineado: el punto cae a la misma altura que el centro de la primera línea, y sigue
 * cayendo bien cuando el renglón envuelve.
 */
.lab-hero-guia li::before {
  content: "·"; position: absolute; left: 1px; top: 0;
  font-family: var(--sans); font-weight: 700;
  font-size: 1.4em; line-height: calc(1.55 / 1.4);
  color: var(--crema-line);
}
/* Los dos términos que la guía existe para explicar. Van en blanco pleno y 600: son las dos
   palabras que el ojo tiene que encontrar al barrer, y el resto del renglón las explica. */
.lab-hero-guia strong { font-weight: 600; color: #fff; }
/* La sección de trabajo respira menos arriba: el hero ya puso el aire. */
.lab-sec { padding-top: clamp(30px, 4vw, 48px); }

/*
 * ══ EL BADGE DEL PILL (LAB-CONT) ═══════════════════════════════════════════════════════
 *
 * El número dejó el paréntesis y pasó a un círculo dentro del pill. El paréntesis se leía como
 * parte del rótulo —«Laboratorios registrados (86)»— y el número es OTRA cosa: es el dato.
 *
 * LENGUAJE DE LA CASA, SIN COLORES NUEVOS. En reposo el badge es el bordó de marca sobre el crema
 * del pill; con el pill ACTIVO —que ya es bordó lleno— se invierte a crema sobre bordó, porque un
 * badge bordó sobre un pill bordó desaparecería. Es la misma inversión que el sistema usa entre
 * `.btn-primary` y `.btn-outline`.
 *
 * CONTRASTES MEDIDOS EN CHROMIUM (ver reporte del lote): en reposo blanco sobre `--accent` da
 * 10,60:1; en el pill activo `--accent` sobre crema da lo mismo invertido. Los dos AAA.
 *
 * `min-width` en `ch` con `border-radius` de pastilla: con un dígito es un círculo, y con tres o
 * cuatro se estira sin recortar el número — un badge de ancho fijo perdería el «214».
 */
.lab-pill-txt { display: inline; }
.lab-badge {
  display: inline-flex; align-items: center; justify-content: center; flex: none;
  margin-left: 8px; padding: 0 6px;
  min-width: 1.55rem; height: 1.55rem; border-radius: var(--r-pill);
  background: var(--accent); color: #fff;
  font: 700 12px/1 var(--sans); font-variant-numeric: tabular-nums;
}
/* Pill activo: el badge se invierte para no perderse sobre el relleno bordó. */
.lab-filtros .btn[aria-pressed="true"] .lab-badge {
  background: #fff; color: var(--accent);
}

/* ══════════════════════════════════════════════════════════════════════════════════════════
   BAJA LÓGICA DEL PADRÓN (UX-2R · D)

   El tachito de las listas y su emergente de confirmación. CERO tokens nuevos: el tachito nace
   NEUTRO y sólo toma la tinta de peligro al hover/focus, que es el momento en que la persona está
   por apretarlo. Un ícono rojo permanente en cada fila de una lista de cincuenta personas convierte
   la pantalla en una alarma y compite con las señales que sí lo son —el pill de estado, el chip de
   demostración—; el color al hover dice lo mismo justo cuando hace falta.

   LOS TOKENS SON LOS DE LA CASA: `--warn-bg` / `--warn-fg` / `--warn-line`, el trío que ya usa el
   aviso de aneurisma y el error de la Analítica. No se estrena ninguno, y por eso el tachito se lee
   como los otros avisos de esta app y no como una pieza importada de otra.
   ══════════════════════════════════════════════════════════════════════════════════════════ */
.fila-baja {
  flex: none; width: 30px; height: 30px; margin-left: 6px;
  display: inline-grid; place-items: center; vertical-align: middle;
  background: none; border: 1px solid transparent; border-radius: 50%;
  color: var(--muted-2); cursor: pointer;
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.fila-baja:hover { background: var(--warn-bg); color: var(--warn-fg); border-color: var(--warn-line); }
.fila-baja:focus-visible { outline: 2px solid var(--warn-fg); outline-offset: 2px; }
/* El área táctil llega a 44px sin agrandar el disco visual: mismo recurso que `.bw-part-x`. */
.fila-baja::after { content: ""; position: absolute; inset: -7px; border-radius: 50%; }
.kl-cel-btn { white-space: nowrap; }
.kl-cel-btn .fila-baja, .lab-fila > .fila-baja { position: relative; }

/* El tachito de la Analítica es HERMANO de la celda-botón, no hijo: un <button> dentro de otro
   <button> no es marcado válido y ninguno de los dos sería operable. */
.lab-fila { position: relative; }
.lab-fila > .fila-baja { position: absolute; top: 50%; right: 10px; transform: translateY(-50%); z-index: 2; }
.lab-fila > .lab-celda { padding-right: 46px; }

/* ── El emergente. Calco de `.reap-*`, con el ancho de un diálogo de confirmación y no de una
      lista: lo que hay adentro son dos frases y un campo. ── */
.baja-overlay {
  position: fixed; inset: 0; z-index: 95;
  display: grid; place-items: center; padding: 20px;
  background: rgba(42, 26, 30, .46);
}
.baja-modal {
  width: min(440px, 100%);
  background: var(--surface); border-radius: 16px; padding: 22px 22px 18px;
  box-shadow: 0 24px 70px rgba(42, 26, 30, .28);
}
.baja-titulo { margin: 0 0 8px; font: 600 var(--fs-h3, var(--fs-h2)) var(--serif); color: var(--ink); line-height: 1.25; }
.baja-cuerpo { margin: 0 0 14px; font: 400 var(--fs-body) var(--sans); color: var(--muted); line-height: 1.5; }
.baja-lbl { display: block; margin: 0 0 5px; font: 600 var(--fs-caption) var(--sans); color: var(--ink); }
.baja-motivo {
  width: 100%; padding: 9px 12px; margin-bottom: 12px;
  border: 1px solid var(--line-strong); border-radius: var(--r-md);
  font: 400 var(--fs-body) var(--sans); color: var(--ink); background: var(--surface);
}
.baja-motivo:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.baja-error { margin: -6px 0 12px; font: 400 var(--fs-caption) var(--sans); color: var(--warn-fg); }
.baja-acc { display: flex; gap: 10px; justify-content: flex-end; flex-wrap: wrap; }
@media print { .baja-overlay { display: none; } }

/* ── La vista de bajas: la misma tabla, con la fila en gris y el motivo a la vista. ── */
.kl-bajas-cab { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin: 0 0 10px; }
.kl-bajas-txt { font: 400 var(--fs-caption) var(--sans); color: var(--muted-2); }
.kl-fila-baja > .kl-cel { color: var(--muted-2); }

/* ── Fila SIN CRITERIO para participar del programa (ELEG-1 · C2 → PART-2 · B8). La fila
   ENTERA en el arena SUAVE (7,48:1 medido con la leyenda; el pleno pesaba más que las 28 filas
   en circuito) y las cuatro celdas de progreso FUSIONADAS en un colspan: los separadores sobre
   celdas vacías leían la fila como rota. El filete lateral se conserva a propósito — con el
   arena suave, el color solo mide 1,15:1 contra blanco y dejó de ser señal suficiente. ── */
.kl-tabla tbody tr.kl-fila-sincriterio > .kl-cel { background: var(--sincriterio-bg-suave); }
.kl-tabla tbody tr.kl-fila-sincriterio > .kl-cel:first-child { box-shadow: inset 3px 0 0 var(--sincriterio-line); }
.kl-sincriterio {
  font: 600 var(--fs-caption) var(--sans); color: var(--sincriterio-fg);
  display: block; line-height: 1.35;
}
.kl-motivo { font: 400 var(--fs-caption) var(--sans); color: var(--muted-2); font-style: italic; }
.kl-restaurar {
  padding: 5px 12px; border: 1px solid var(--line); border-radius: 999px;
  background: var(--surface); color: var(--accent); cursor: pointer;
  font: 600 var(--fs-caption) var(--sans);
}
.kl-restaurar:hover { background: var(--accent-soft); }
.kl-restaurar:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* El borrado definitivo (UX-2R · E). Vive SÓLO en la vista de bajas y sólo para el admin de
   plataforma. Toma la tinta de aviso de la casa en reposo —no al hover, como el tachito—: acá el
   control ya está en una pantalla a la que hubo que entrar a propósito, sobre una ficha que ya
   salió del padrón, y lo que tiene que decir es que esto no se deshace. */
.kl-borrar {
  margin-left: 6px; padding: 5px 12px; border-radius: 999px; cursor: pointer;
  border: 1px solid var(--warn-line); background: var(--warn-bg); color: var(--warn-fg);
  font: 600 var(--fs-caption) var(--sans);
}
.kl-borrar:hover { border-color: var(--warn-fg); }
.kl-borrar:focus-visible { outline: 2px solid var(--warn-fg); outline-offset: 2px; }

/* ══════════════════════════════════════════════════════════════════════════════════════════
   ESTUDIOS DOPPLER REALIZADOS (UX-2R · B)

   El botón del encabezado del Paso 2 y su emergente. CERO tokens nuevos: el modal es un calco del
   de reapertura —`.reap-*`, que ya resuelve exactamente esta forma: lista de piezas firmadas con
   fecha, profesional y una acción por fila— y el botón usa `.btn.btn-outline`, que es el control
   secundario de la casa.

   Se usan identificadores PROPIOS (`dre-`) y no las clases `.dop-fichabtn` / `.dop-float*` que
   siguen vivas en esta hoja: su markup ya no está en index.html pero doppler.js —contrato
   cerrado— todavía busca `[data-dop="floatBtn"]`, así que reusar ese espacio de nombres reviviría
   una ficha flotante retirada.
   ══════════════════════════════════════════════════════════════════════════════════════════ */
/*
 * EL BOTÓN ES EL ÚLTIMO DE LA FILA, y el `margin-left:auto` va ACÁ y no en el buscador. Medido en
 * Chromium a 1280: con el auto-margin también en el buscador, éste se comía el espacio libre y el
 * botón quedaba a su izquierda, en el medio del encabezado. Con el botón como último hijo y el
 * único con auto-margin, el borde derecho del botón coincide con el del encabezado.
 * En el HTML va DESPUÉS del bloque del buscador por la misma razón: el orden del DOM es el orden
 * de lectura, y un control que se anuncia antes de la identidad del participante se lee fuera de
 * lugar en un lector de pantalla.
 */
/*
 * ══ EL ACCESO A LOS ESTUDIOS, CON EL PESO QUE LE CORRESPONDE (DOP-2 · 2) ════════════════
 *
 * Era `.btn-outline` —contorno sobre blanco—, el peso que la casa usa para lo secundario. Es el
 * acceso principal del ecografista: la puerta a todo lo que ya se hizo. Pasa a `.btn-primary`,
 * que es el bordó institucional de la casa, con su sombra de acento.
 *
 * CONTRASTE MEDIDO con la fórmula de luminancia relativa de WCAG 2.2:
 *     #ffffff sobre --accent #6e2536 .... 10,60:1  AAA
 *     #ffffff sobre el hover #5d1f2e .... 12,35:1  AAA
 *
 * El texto completo —«Total de estudios Doppler realizados»— es más largo que el anterior, así que
 * el botón deja de ser `nowrap` incondicional abajo de 900 px: forzarlo ahí empujaba el título a
 * dos renglones. Arriba, sigue en una línea.
 */
.dop-headline > .dop-realizados { flex: none; margin-left: auto; white-space: nowrap; padding: 12px 20px; font-size: 14.5px; }
.dop-headline > .dop-realizados svg { flex: none; }
@media (max-width: 900px) { .dop-headline > .dop-realizados { white-space: normal; text-align: left; } }
/* Al apilarse —el encabezado envuelve abajo de ~720— el auto-margin dejaría el botón solo contra el
   borde derecho, separado de todo. Ahí vuelve al flujo, alineado con el resto. */
@media (max-width: 720px) { .dop-headline > .dop-realizados { margin-left: 0; } }

.dre-overlay {
  position: fixed; inset: 0; z-index: 92;
  display: grid; place-items: center; padding: 20px;
  background: rgba(42, 26, 30, .46);
}
.dre-modal {
  /*
   * 820 px y no 680 (DOP-3 · 3). Con cinco columnas —tres de datos y dos de acción— el emergente
   * de 680 dejaba 74 px para «Descargar informe», que a ese ancho parte en TRES renglones y corta
   * la palabra: «DESCAR-GAR». El título de una columna no puede partirse: es lo que explica qué
   * hace el control de abajo.
   */
  width: min(820px, 100%); max-height: min(86vh, 760px);
  display: flex; flex-direction: column;
  background: var(--surface); border-radius: 16px;
  box-shadow: 0 24px 70px rgba(42, 26, 30, .28);
  overflow: hidden;
}
.dre-head {
  display: flex; align-items: flex-start; gap: 12px;
  padding: 18px 20px 12px; border-bottom: 1px solid var(--line);
}
.dre-kicker {
  margin: 0 0 3px; font: 600 var(--fs-caption) var(--sans);
  letter-spacing: .08em; text-transform: uppercase; color: var(--accent);
}
.dre-titulo { margin: 0; font: 600 var(--fs-h2) var(--serif); color: var(--ink); line-height: 1.2; }
.dre-x {
  margin-left: auto; flex: none; width: 34px; height: 34px;
  display: grid; place-items: center;
  background: var(--neutral-bg); color: var(--ink);
  border: 0; border-radius: 50%; cursor: pointer; font: 400 20px/1 var(--sans);
}
.dre-x:hover { background: var(--accent-soft); color: var(--accent); }
.dre-x:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.dre-sub {
  margin: 0; padding: 12px 20px; background: var(--neutral-bg);
  font: 400 var(--fs-caption) var(--sans); color: var(--muted); line-height: 1.5;
}
/*
 * ══ LA BANDA PEGAJOSA, EN UNA SOLA PIEZA (DOP-2 · 3a) ══════════════════════════════════
 *
 * La leyenda de sólo lectura, el selector de ecografista y los títulos de columna viven en el
 * MISMO bloque `sticky`. Eran dos franjas sueltas que al scrollear se pisaban entre sí; ahora
 * suben y bajan juntas y el borde inferior cierra la banda entera, no cada pieza.
 *
 * `top: 0` contra `.dre-cuerpo`, que es el que scrollea: pegarla al modal la habría dejado quieta
 * mientras la lista pasaba por debajo del selector.
 */
.dre-banda {
  position: sticky; top: 0; z-index: 3;
  background: var(--surface); border-bottom: 1px solid var(--line-strong);
  padding: 0 20px 8px;
}
/*
 * LA BARRA LLEVA DOS SELECTORES (DOP-3 · 5). Ecografista y orden viven en la MISMA fila, que es
 * donde antes sobraba espacio a la derecha del primero. `column-gap` amplio para que se lean como
 * dos controles y no como uno partido; la nota de lista incompleta empuja al final y envuelve.
 */
.dre-barra { display: flex; align-items: center; gap: 8px 18px; flex-wrap: wrap; padding: 2px 0 8px; }
.dre-filtro { display: inline-flex; align-items: center; gap: 8px; }
.dre-filtro-rot { font: 600 var(--fs-caption) var(--sans); letter-spacing: var(--ls-caption); text-transform: uppercase; color: var(--muted-2); }
.dre-select {
  font: 500 var(--fs-body) var(--sans); color: var(--ink);
  background: var(--surface); border: 1px solid var(--line-strong); border-radius: var(--r-md);
  padding: 7px 10px; max-width: 260px;
}
.dre-select:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
/* La nota que dice que la lista todavía no está completa. No es un aviso de error: es el dato que
   hace honesto al desplegable, así que va en la tinta secundaria y no en la de alarma. */
.dre-filtro-nota { font: 400 var(--fs-caption) var(--sans); color: var(--muted-2); flex: 1 1 200px; min-width: 0; }

/*
 * LOS TÍTULOS DE COLUMNA. Misma grilla que las filas —se declara una vez y las dos la heredan—,
 * así que no pueden desalinearse. Las dos últimas son de acción: ancho fijo, centradas.
 */
.dre-thead, .dre-fila {
  display: grid;
  /*
   * EL ANCHO DE LAS DOS ÚLTIMAS LO MANDA EL TÍTULO, no el icono: el icono entra en 34 px y
   * «Descargar informe» necesita 96 para caer en DOS renglones sin cortar palabra. Y quien cede es
   * PARTICIPANTE (de 2fr a 1.7fr), que es la columna con más aire: un apellido largo envuelve, y
   * envolver un nombre no rompe nada — cortar un título sí.
   */
  grid-template-columns: minmax(0, 1.7fr) minmax(0, 1.25fr) minmax(0, 1.45fr) 96px 96px;
  align-items: center; gap: 12px;
}
.dre-thead { padding: 6px 0 7px; }
.dre-th { font: 600 var(--fs-caption) var(--sans); letter-spacing: var(--ls-caption); text-transform: uppercase; color: var(--muted-2); }
/* SIN `hyphens` Y SIN `break-word`: los dos son la licencia para partir una palabra, que es
   justamente lo que se vino a arreglar. El título envuelve entre palabras o no envuelve. */
.dre-th-acc { text-align: center; overflow-wrap: normal; word-break: keep-all; hyphens: none; }
.dre-cel { min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.dre-acc { align-items: center; }

/*
 * EL ICONO ES EL CONTROL, y el rótulo de la columna dice qué hace. Repetir «Ver estudio» en
 * cincuenta filas es ruido; lo que NO se puede perder es el nombre accesible, que va completo en
 * el `aria-label` de cada botón —con el acto y la persona— porque cincuenta botones que dicen
 * «Ver» son cincuenta botones iguales para un lector de pantalla.
 *
 * ÁREA TÁCTIL DE 44px sin agrandar el disco a la vista: el `::after` la extiende, mismo recurso
 * que `.bw-part-x` y `.kl-quitar` ya usan en la casa.
 */
.dre-ico {
  position: relative; width: 34px; height: 34px; margin: 0 auto;
  display: inline-grid; place-items: center;
  background: none; border: 1px solid var(--line); border-radius: 50%;
  color: var(--accent); cursor: pointer;
  transition: background .15s ease, border-color .15s ease;
}
.dre-ico::after { content: ""; position: absolute; inset: -5px; border-radius: 50%; }
.dre-ico:hover { background: var(--accent-soft); border-color: var(--accent); }
.dre-ico:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.dre-ico[disabled] { opacity: .5; cursor: default; }

/* A una columna, la grilla se apila y los dos iconos comparten renglón. */
@media (max-width: 620px) {
  .dre-thead { display: none; }
  .dre-fila { grid-template-columns: 1fr auto auto; row-gap: 4px; }
  .dre-fila > .dre-id { grid-column: 1 / -1; }
  .dre-fila > .dre-quien-cel { grid-column: 1 / 2; }
}

.dre-cuerpo { flex: 1 1 auto; overflow-y: auto; padding: 0 20px 12px; }
/* La fila ya es grilla (arriba, junto a los títulos, para que compartan las columnas). Acá queda
   sólo su separación: declarar `display:flex` de nuevo pisaría la grilla y desalinearía las
   celdas de sus encabezados — que es exactamente lo que este lote vino a arreglar. */
.dre-fila { padding: 12px 0; border-bottom: 1px solid var(--line); }
.dre-fila:last-child { border-bottom: 0; }
.dre-id { min-width: 0; }
.dre-n { font: 600 var(--fs-body) var(--sans); color: var(--ink); }
.dre-dni { font: 400 var(--fs-caption) var(--sans); color: var(--muted-2); }
.dre-fecha { font: 600 var(--fs-caption) var(--mono); color: var(--ink); }
.dre-quien, .dre-refirmas { font: 400 var(--fs-caption) var(--sans); color: var(--muted-2); }
.dre-vacio, .dre-msg { margin: 14px 0; font: 400 var(--fs-body) var(--sans); color: var(--muted); }
.dre-msg { color: var(--warn-fg); }
.dre-pie {
  display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap;
  padding: 12px 20px; border-top: 1px solid var(--line); background: var(--neutral-bg);
}
.dre-pie-txt { font: 400 var(--fs-caption) var(--sans); color: var(--muted-2); }
@media print { .dre-overlay { display: none; } }

/* =========================================================================
   Encabezados clínicos compartidos · Enfermería, Doppler y Consulta Médica
   ========================================================================= */

/* Un único slot evita saltos al alternar buscador, identidad y resultados. */
.clinical-header .clinical-search {
  position: relative;
  width: var(--clinical-search-width);
  max-width: 100%;
  min-width: 0;
  margin: 0;
  flex: 0 0 var(--clinical-search-width);
}
.clinical-header .clinical-search > .bw-buscar-row,
.clinical-header .clinical-search > .bw-part-id,
.clinical-header .clinical-search > .bw-buscar-res {
  width: 100%;
  max-width: none;
  min-width: 0;
  margin: 0;
}
.clinical-header .clinical-search > .bw-buscar-row,
.clinical-header .clinical-search > .bw-part-id {
  height: var(--clinical-control-height);
  min-height: var(--clinical-control-height);
}
.clinical-header .clinical-search > .bw-part-id {
  position: relative;
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 9px 50px 9px 16px;
  text-align: left;
  background: var(--surface);
  border: 1px solid var(--line-strong);
  border-radius: var(--r-pill);
  box-shadow: var(--shadow-sm);
}
.clinical-header .clinical-search .bw-part-id-txt {
  display: flex;
  flex: 1 1 auto;
  align-items: baseline;
  flex-wrap: nowrap;
  gap: 2px 10px;
  min-width: 0;
}
.clinical-header .clinical-search .bw-part-id-n {
  min-width: 0;
  margin: 0;
  overflow: hidden;
  color: var(--ink);
  font: 600 var(--fs-segmento-meta)/1.25 var(--serif);
  letter-spacing: -.01em;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.clinical-header .clinical-search .bw-part-id-dni {
  position: static;
  display: inline-flex;
  flex: 0 0 auto;
  align-items: baseline;
  justify-content: flex-start;
  gap: 6px;
  margin: 0;
  color: var(--muted-2);
  font: 600 var(--fs-num) var(--mono);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.clinical-header .clinical-search .bw-part-id-dni::before {
  content: "·";
  margin-right: 2px;
  color: var(--muted-2);
}
.clinical-header .clinical-search .bw-part-id > .bw-demo-tag,
.clinical-header .clinical-search .bw-part-id > .bw-ver-tag {
  position: static;
  flex: 0 0 auto;
  order: 2;
  transform: none;
}
.clinical-header .clinical-search .bw-part-x {
  position: absolute;
  top: 50%;
  right: 12px;
  flex-shrink: 0;
  margin: 0;
  transform: translateY(-50%);
}

/* Señal contextual: flecha sólida, editorial y no interactiva, anclada al centro del buscador. */
.clinical-search-cue {
  position: absolute;
  top: calc(var(--clinical-control-height) + 9.5px);
  left: 50%;
  z-index: 2;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  background: transparent;
  border: 0;
  box-shadow: none;
  opacity: 0;
  pointer-events: none;
  transform: translate(-50%, 7px) scale(.96);
  transform-origin: center;
  animation: clinical-search-cue-invite 3s ease-in-out infinite;
}
.clinical-search-cue__svg {
  display: block;
  width: 40px;
  height: 40px;
  overflow: visible;
  background: transparent;
  filter: drop-shadow(0 3px 4px rgba(72, 20, 31, .16));
}
.clinical-search-cue__shape {
  stroke: var(--accent-deep);
  stroke-width: 1.2;
  stroke-linejoin: round;
  vector-effect: non-scaling-stroke;
}
.clinical-search-cue__highlight {
  fill: #fff;
  opacity: .23;
}
body:not([data-contexto-participante="vacio"]) .clinical-search-cue,
.clinical-search:focus-within .clinical-search-cue,
.clinical-search:has(> .bw-part-id:not([hidden])) .clinical-search-cue,
.clinical-search:has(> .bw-buscar-res:not([hidden])) .clinical-search-cue,
.clinical-search:has(> .ent-origen:not([hidden])) .clinical-search-cue {
  display: none;
}
@keyframes clinical-search-cue-invite {
  0% { opacity: 0; transform: translate(-50%, 7px) scale(.96); }
  15% { opacity: .85; transform: translate(-50%, 4px) scale(.98); }
  35% { opacity: 1; transform: translate(-50%, 2px) scale(1); }
  60% { opacity: 1; transform: translate(-50%, 0) scale(1); }
  82% { opacity: .35; transform: translate(-50%, -4px) scale(1.01); }
  100% { opacity: 0; transform: translate(-50%, -6px) scale(1.01); }
}

/* Los dos destinos del flujo comparten exactamente voz tipográfica. */
.clinical-flow-title {
  margin: 0;
  color: var(--accent);
  font: 500 clamp(1.85rem, 2.15vw, 2.45rem)/1.08 var(--serif);
  letter-spacing: -.024em;
  text-transform: none;
}
.clinical-flow-arrow {
  display: inline-flex;
  flex: 0 0 auto;
  align-items: center;
  justify-content: center;
  margin: 0;
  color: var(--muted);
}
.clinical-flow-arrow svg {
  width: 30px;
  height: 30px;
}

/* Paso 1: una secuencia continua en desktop. */
.clinical-header--nursing {
  display: flex;
  align-items: center;
  flex-wrap: nowrap;
  gap: clamp(8px, 1vw, 13px);
}
.clinical-header--nursing .step-tag,
.clinical-header--nursing .h2 {
  flex: 0 1 auto;
  margin: 0;
  color: var(--accent);
  font: 500 clamp(1.85rem, 2.15vw, 2.45rem)/1.08 var(--serif);
  letter-spacing: -.024em;
  white-space: nowrap;
}
.clinical-header--nursing .bw-sec-arrow,
.clinical-header--nursing .bw-sec-arrow2 {
  margin: 0;
}
.clinical-header--nursing .bw-sec-arrow svg,
.clinical-header--nursing .bw-sec-arrow2 svg {
  width: 30px;
  height: 30px;
}

/* Paso 2: fallback de dos filas; en desktop amplio los tres controles comparten una sola línea. */
.clinical-header-grid--doppler {
  --doppler-search-optical-shift: 0px;
  position: relative;
  display: grid;
  grid-template-columns: minmax(400px, 1fr) var(--clinical-search-width);
  align-items: center;
  gap: 24px clamp(20px, 2vw, 28px);
  padding-bottom: 24px;
}
.clinical-header-grid--doppler > .dop-titulo {
  grid-column: 1;
  grid-row: 1;
  min-width: 0;
  justify-self: start;
}
.clinical-header-grid--doppler > .clinical-search {
  grid-column: 1 / -1;
  grid-row: 2;
  width: var(--clinical-search-width);
  justify-self: center;
}
.clinical-header-grid--doppler > .dop-realizados {
  grid-column: 2;
  grid-row: 1;
  width: var(--clinical-search-width);
  height: var(--clinical-control-height);
  min-height: var(--clinical-control-height);
  padding: 8px 16px;
  justify-self: center;
  justify-content: center;
  margin-left: 0;
  border-radius: var(--r-pill);
  line-height: 1.2;
}
@media (min-width: 1320px) {
  .clinical-header-grid--doppler {
    grid-template-columns: minmax(400px, 1fr) var(--clinical-search-width) var(--clinical-search-width);
  }
  body[data-contexto-participante="vacio"] .clinical-header-grid--doppler {
    grid-template-columns: minmax(400px, 1fr) var(--clinical-search-width) minmax(var(--clinical-search-width), 1fr);
  }
  .clinical-header-grid--doppler > .dop-titulo { grid-column: 1; grid-row: 1; }
  .clinical-header-grid--doppler > .clinical-search {
    grid-column: 2;
    grid-row: 1;
    justify-self: center;
  }
  .clinical-header-grid--doppler > .dop-realizados {
    grid-column: 3;
    grid-row: 1;
    justify-self: end;
  }
}
@media (min-width: 1280px) {
  body[data-contexto-participante="vacio"] .clinical-header-grid--doppler {
    --doppler-search-optical-shift: -17px;
  }
  body[data-contexto-participante="vacio"] .clinical-header-grid--doppler > .clinical-search {
    transform: translateX(var(--doppler-search-optical-shift));
  }
}
@media (min-width: 1440px) {
  body[data-contexto-participante="vacio"] .clinical-header-grid--doppler {
    --doppler-search-optical-shift: -29px;
  }
}

/* Paso 3: paso, título+identidad, subtítulo y lead en cuatro filas compactas. */
.clinical-kicker,
.rcl-eyebrow {
  margin: 0;
  color: var(--accent);
  font: 800 13px var(--sans);
  letter-spacing: .16em;
  text-transform: uppercase;
}
.rcl-heading-top {
  min-width: 0;
}
.rcl-heading-main {
  display: grid;
  grid-template-columns: minmax(0, 1fr) var(--clinical-search-width);
  align-items: center;
  gap: clamp(22px, 3vw, 44px);
  min-width: 0;
  margin-top: 4px;
}
.rcl-heading-main .rcl-segment-title {
  min-width: 0;
  margin: 0;
  color: var(--accent);
  font: 500 clamp(2rem, 2.45vw, 2.8rem)/1.05 var(--serif);
  letter-spacing: -.025em;
}
.rcl-heading-secondary { min-width: 0; margin-top: 8px; }
.rcl-head .rcl-heading-title {
  margin: 0;
  color: var(--ink);
  font: 500 clamp(2rem, 2.45vw, 2.8rem)/1.05 var(--serif);
  letter-spacing: -.025em;
  overflow-wrap: break-word;
}
.rcl-heading-lead { min-width: 0; margin-top: 5px; }
.rcl-heading-lead .rcl-lead {
  max-width: 68ch;
  margin: 0;
}
.clinical-header--medical .rcl-ident {
  width: var(--clinical-search-width);
  min-width: 0;
  margin: 0;
  justify-self: end;
}

/* El escenario ocupa el alto útil; la tarjeta es una pieza compartida e independiente de rails. */
.clinical-empty-stage {
  grid-column: 1 / -1;
  width: 100%;
  min-height: clamp(340px, calc(100svh - 390px), 560px);
  margin: 0;
  padding-block: clamp(10px, 2vh, 20px);
  display: grid;
  place-items: center;
}
.clinical-empty-card {
  display: grid;
  grid-template-rows: minmax(158px, 1fr) auto;
  width: min(820px, 100%);
  min-height: clamp(280px, 32vh, 310px);
  margin-inline: auto;
  padding: 0;
  overflow: hidden;
  text-align: center;
  background: var(--surface);
  border: 1px solid rgba(110, 37, 54, .18);
  border-top: 4px solid var(--accent);
  border-radius: 22px;
  box-shadow: 0 22px 54px rgba(110, 37, 54, .11);
}
.clinical-empty-ecg-bottom {
  width: 100%;
  height: 68px;
  margin: 0 0 22px;
  color: var(--accent);
  opacity: 1;
  pointer-events: none;
}
.clinical-empty-ecg-bottom > svg {
  display: block;
  width: 100%;
  max-width: none;
  height: 68px;
  overflow: hidden;
}
.clinical-ecg-track {
  transform-box: fill-box;
  transform-origin: left center;
  animation: clinical-ecg-scroll 18s linear infinite;
}
.clinical-ecg-wave {
  fill: none;
  stroke: currentColor;
  stroke-width: 1.65;
  stroke-linecap: round;
  stroke-linejoin: round;
  vector-effect: non-scaling-stroke;
  opacity: 1;
}
@keyframes clinical-ecg-scroll {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); }
}
.clinical-empty-copy {
  min-height: 0;
  padding: clamp(34px, 4vw, 46px) clamp(24px, 5vw, 58px) 18px;
  display: grid;
  place-items: center;
  align-content: center;
  gap: 12px;
}
.clinical-empty-title {
  margin: 0;
  color: var(--accent-deep);
  font: 600 clamp(22px, 2.2vw, 28px)/1.15 var(--serif);
}
.clinical-empty-description {
  max-width: none;
  margin: 0;
  color: var(--muted);
  font: 400 clamp(14px, 1.2vw, 16px)/1.55 var(--sans);
}
.clinical-empty-hook { display: none !important; }
.clinical-practica-status {
  width: min(620px, 100%);
  margin: clamp(54px, 8vh, 96px) auto 0;
  padding: 18px 22px;
  border: 1px solid var(--line);
  border-radius: 14px;
  background: var(--surface);
  box-shadow: 0 16px 38px rgba(71, 38, 47, .08);
  color: var(--ink);
  font: 500 var(--fs-body) var(--sans);
  text-align: center;
}
body[data-practica-registrada-estado="error"] .clinical-practica-status {
  color: var(--danger, #8d2f42);
  border-color: rgba(141, 47, 66, .22);
}
body[data-contexto-participante="activo"] .clinical-empty-stage,
body[data-contexto-participante="cargando"] .clinical-empty-stage,
body[data-practica-registrada-estado="cargando"] .clinical-empty-stage,
body[data-practica-registrada-estado="error"] .clinical-empty-stage {
  display: none;
}
body:not([data-contexto-participante="activo"]) [data-clinical-content] {
  display: none !important;
}

/* Sin participante no existen los CTA flotantes: sus reservas no deben desplazar la tarjeta ni el pie. */
body[data-contexto-participante="vacio"] #view-consulta section[data-subflow="inicial"] {
  padding-bottom: clamp(36px, 4vw, 56px);
}
body[data-contexto-participante="vacio"] [data-subflow="reclasificacion"] > .container {
  padding-bottom: 0;
}
@media (min-width: 1420px) {
  #view-consulta section[data-subflow="inicial"] > .container > .clinical-empty-stage {
    width: calc(100% + 190px);
    margin-left: -190px;
  }
  [data-subflow="reclasificacion"] > .container > .clinical-empty-stage {
    --clinical-stage-reserve: max(0px, calc(198px - (100vw - var(--maxw)) / 2));
    width: calc(100% + var(--clinical-stage-reserve));
    margin-left: calc(0px - var(--clinical-stage-reserve));
  }
}
@media (max-width: 1419.98px) {
  body[data-contexto-participante="vacio"]:has(section[data-subflow="inicial"]:not([hidden])) footer {
    padding-bottom: clamp(24px, 4vw, 48px);
  }
}

/* Tablet: el slot común pasa a una segunda fila, sin cambiar de medida al ser chip. */
@media (max-width: 1199px) {
  .clinical-search-cue,
  .clinical-search-cue__svg {
    width: 35px;
    height: 36px;
  }
  .clinical-header .clinical-search {
    width: 100%;
    max-width: 100%;
    flex: 1 1 100%;
  }
  .clinical-header--nursing { flex-wrap: wrap; }
  .clinical-header--nursing .bw-sec-arrow2 { display: none; }
  .clinical-header--nursing .clinical-search { margin-top: 6px; }

  .clinical-header-grid--doppler {
    grid-template-columns: repeat(2, minmax(0, var(--clinical-search-width)));
    justify-content: center;
  }
  .clinical-header-grid--doppler > .dop-titulo { grid-column: 1 / -1; grid-row: 1; }
  .clinical-header-grid--doppler > .clinical-search {
    grid-column: 1;
    grid-row: 2;
    width: min(100%, var(--clinical-search-width));
  }
  .clinical-header-grid--doppler > .dop-realizados {
    grid-column: 2;
    grid-row: 2;
    width: min(100%, var(--clinical-search-width));
    justify-self: center;
  }

  .rcl-heading-main {
    grid-template-columns: minmax(0, 1fr);
  }
  .clinical-header--medical .rcl-ident {
    width: 100%;
    margin: 0;
    justify-self: stretch;
  }
  body[data-contexto-participante="vacio"] .clinical-header--medical .rcl-heading-secondary {
    margin-top: 60px;
  }
}

@media (max-width: 980px) {
  .clinical-header-grid--doppler { grid-template-columns: minmax(0, 1fr); }
  .clinical-header-grid--doppler > .dop-titulo,
  .clinical-header-grid--doppler > .clinical-search,
  .clinical-header-grid--doppler > .dop-realizados { grid-column: 1; }
  .clinical-header-grid--doppler > .dop-titulo { grid-row: 1; }
  .clinical-header-grid--doppler > .clinical-search { grid-row: 2; }
  .clinical-header-grid--doppler > .dop-realizados { grid-row: 3; }
  body[data-contexto-participante="vacio"] .clinical-header-grid--doppler > .dop-realizados {
    margin-top: 34px;
  }
}

@media (min-width: 1200px) and (max-width: 1419.98px) {
  .clinical-header--nursing .bw-sec-arrow svg,
  .clinical-header--nursing .bw-sec-arrow2 svg {
    width: 26px;
    height: 26px;
  }
}

/* Mobile: títulos con wrap deliberado; controles y acciones ocupan el ancho útil. */
@media (max-width: 700px) {
  .clinical-header-grid--doppler { grid-template-columns: minmax(0, 1fr); }
  .clinical-header-grid--doppler > .dop-titulo,
  .clinical-header-grid--doppler > .clinical-search,
  .clinical-header-grid--doppler > .dop-realizados {
    grid-column: 1;
  }
  .clinical-header-grid--doppler > .dop-titulo { grid-row: 1; }
  .clinical-header-grid--doppler > .clinical-search {
    grid-row: 2;
    width: 100%;
    justify-self: stretch;
  }
  .clinical-header-grid--doppler > .dop-realizados {
    grid-row: 3;
    width: 100%;
    justify-self: stretch;
    justify-content: center;
    margin-left: 0;
    white-space: normal;
  }
  .clinical-search-cue,
  .clinical-search-cue__svg { width: 31px; height: 32px; }
}
@media (max-width: 640px) {
  .clinical-header--nursing .clinical-flow-arrow { display: none; }
  .clinical-header--nursing .step-tag,
  .clinical-header--nursing .h2 {
    flex-basis: 100%;
    white-space: normal;
  }
  .rcl-heading-main { margin-top: 4px; gap: 12px; }
  .rcl-heading-secondary { margin-top: 10px; }
  .rcl-heading-lead { margin-top: 5px; }
  .clinical-empty-stage {
    min-height: clamp(320px, calc(100svh - 430px), 460px);
    padding-block: 8px;
  }
  .clinical-empty-card {
    min-height: 260px;
  }
  .clinical-empty-copy {
    min-height: 0;
    padding: 30px 20px 18px;
  }
  .clinical-empty-ecg-bottom { margin-bottom: 20px; }
}

@media (prefers-reduced-motion: reduce) {
  .clinical-search-cue {
    animation: none !important;
    opacity: .8;
    transform: translate(-50%, 0) scale(1);
  }
  .clinical-ecg-track {
    animation: none !important;
    transform: none !important;
  }
  .clinical-ecg-wave--b { display: none; }
}

@media print {
  .clinical-empty-stage { display: none !important; }
}
