/* ============================================================================
   informe.css — Informe técnico de campo (2026-08-14).

   Hoja propia y ADITIVA, mismo motivo que `licitaciones.css`, `cooperacion.css`
   y `marca.css`: `app.css` no tiene dueño y varios hilos lo tocan a la vez —
   dos agentes en el mismo archivo se pisan. Aquí solo hay clases NUEVAS, todas
   con el prefijo `nv-inf-` y todas scopeadas bajo `.nv-inf`, incluidas las que
   suenan genéricas. Con eso, esta hoja no puede afectar a ninguna otra pantalla.

   🔴 LA REGLA QUE GOBIERNA ESTE ARCHIVO ENTERO: hay DOS mundos aquí y usan
   colores distintos a propósito.

     · EL MARCO (formulario, pestañas, lista, avisos) vive en el tema de la app
       y usa las variables: `--nv-tenue`, `--nv-texto`, `--nv-superficie`,
       `--nv-linea`, `--nv-acento`.

     · LA HOJA (`.nv-inf-hoja`, que es `.nv-mk-membrete` de `marca.css`) IMITA UN
       IMPRESO: fondo claro y texto oscuro SIEMPRE, aunque la app esté en
       oscuro. Un informe se entrega en papel o en PDF. Por eso TODO lo que vive
       dentro de la hoja lleva el color escrito a mano y NO usa las variables
       del tema: en modo oscuro, `--nv-texto` es claro y sobre blanco no se
       leería nada. Es el mismo motivo que explica la cabecera de `marca.css`, y
       es la única parte de la app donde escribir el color a mano es lo correcto.

   Las clases del membrete (`.nv-mk-membrete`, `.nv-mk-mtop`, `.nv-mk-mlogo`,
   `.nv-mk-mquien`, `.nv-mk-mfirma`, `.nv-mk-mpie`) se REUSAN de `marca.css`, no
   se redefinen: esa hoja ya está maquetada exactamente para esto.

   Una sola columna hasta 620 px, el mismo quiebre que ya usan `.nv-lic-grid`,
   `.nv-sb-grid` y `.nv-coop-body`. Y `overflow-wrap: anywhere` en los títulos y
   en las entradas de bibliografía: traen DOIs y títulos de papers larguísimos
   sin un solo espacio, que se salen de la tarjeta a 360 px.
   ========================================================================== */
.nv-inf { display: flex; flex-direction: column; gap: 14px; }
.nv-inf .nv-mod-h { display: flex; flex-direction: column; gap: 4px; }
.nv-inf .nv-mod-h h2 { margin: 0; font-size: 19px; display: flex; align-items: center; gap: 8px; }
.nv-inf .nv-dim { color: var(--nv-tenue); font-size: 13px; line-height: 1.5; margin: 0; }
.nv-inf .nv-inf-i { display: inline-flex; flex: none; }
.nv-inf .nv-inf-loading { padding: 18px 4px; color: var(--nv-tenue); font-size: 13.5px; }

/* --- pestañas: mismo patrón que cooperación --- */
.nv-inf .nv-inf-tabs { display: flex; gap: 6px; border-bottom: 1px solid var(--nv-linea); }
.nv-inf .nv-inf-tab { background: none; border: 0; border-bottom: 2px solid transparent;
  padding: 9px 12px; font: inherit; font-size: 13.5px; color: var(--nv-tenue);
  cursor: pointer; min-width: 0; }
.nv-inf .nv-inf-tab.is-on { color: var(--nv-texto); border-bottom-color: var(--nv-acento); font-weight: 700; }

.nv-inf .nv-inf-body { display: flex; flex-direction: column; gap: 14px; min-width: 0; }

/* ── EL MARCO: formulario ────────────────────────────────────────────────── */
.nv-inf .nv-inf-form { display: flex; flex-direction: column; gap: 18px; }
.nv-inf .nv-inf-campo { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.nv-inf .nv-inf-lb { font-size: 13.5px; font-weight: 700; color: var(--nv-texto); }
.nv-inf .nv-inf-nota { font-size: 12.5px; }

/* Los tres modos: una columna en el móvil. En pantalla ancha caben los tres al
   lado, pero NO se fuerzan a tres columnas fijas — la descripción de cada modo
   es de largo distinto y `auto-fit` deja que respiren. */
.nv-inf .nv-inf-modos { display: grid; grid-template-columns: minmax(0, 1fr); gap: 8px; }
@media (min-width: 620px) { .nv-inf .nv-inf-modos { grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); } }
.nv-inf .nv-inf-modo { display: flex; flex-direction: column; gap: 4px; text-align: left;
  background: var(--nv-superficie); border: 1px solid var(--nv-linea);
  border-radius: var(--nv-r-sm, 14px); padding: 11px 12px; font: inherit;
  color: var(--nv-texto); cursor: pointer; min-width: 0; }
.nv-inf .nv-inf-modo.is-on { border-color: var(--nv-acento); box-shadow: inset 0 0 0 1px var(--nv-acento); }
.nv-inf .nv-inf-modo-n { font-size: 14px; font-weight: 700; }
.nv-inf .nv-inf-modo-d { font-size: 12px; line-height: 1.45; color: var(--nv-tenue); overflow-wrap: anywhere; }
/* El precio en su propia línea y destacado: es el dato por el que se elige, y
   se lee del backend — nunca está escrito en la pantalla. */
.nv-inf .nv-inf-modo-p { font-size: 13px; font-weight: 700; color: var(--nv-acento); margin-top: 2px; }

.nv-inf .nv-inf-sel { width: 100%; box-sizing: border-box; padding: 10px 12px;
  font: inherit; font-size: 14px; background: var(--nv-superficie); color: var(--nv-texto);
  border: 1px solid var(--nv-linea); border-radius: var(--nv-r-sm, 14px); }
/* Desactivado NO quiere decir invisible: en modo productor la norma de cita no
   se aplica, y el selector se queda a la vista, apagado, con su explicación
   debajo. Esconderlo haría parecer que se perdió una opción. */
.nv-inf .nv-inf-sel:disabled { opacity: .5; cursor: not-allowed; }

.nv-inf .nv-inf-ta { width: 100%; box-sizing: border-box; padding: 10px 12px;
  font: inherit; font-size: 14px; line-height: 1.5; background: var(--nv-superficie);
  color: var(--nv-texto); border: 1px solid var(--nv-linea);
  border-radius: var(--nv-r-sm, 14px); resize: vertical; min-height: 88px; }
.nv-inf .nv-inf-cont { font-size: 12px; color: var(--nv-tenue); }
/* Ámbar y no rojo mientras faltan caracteres: no ha fallado nada todavía — es
   que aún no está listo para mandar. */
.nv-inf .nv-inf-cont.is-corto { color: #c98a00; }

/* --- parcela de la visita (opcional) ---
   Ámbar y no rojo para el aviso de parcela de ejemplo, mismo criterio que el
   resto del repo: no ha fallado nada, es que ese dato no es real. Rojo diría
   «algo se rompió» y aquí lo que hay es una advertencia de honestidad. */
.nv-inf .nv-inf-plot-aviso { margin: 2px 0 0; font-size: 12.5px; line-height: 1.45;
  color: #c98a00; padding: 8px 10px; border: 1px solid #c98a00; border-radius: 12px; }
/* La caja de contexto enseña lo que se le va a contar al modelo. Va con el
   borde del acento porque es información, no advertencia. */
.nv-inf .nv-inf-plot-ctx:empty { display: none; }
.nv-inf .nv-inf-plot-ctx { margin-top: 8px; padding: 9px 11px; border-radius: 12px;
  border: 1px solid var(--nv-linea); background: var(--nv-superficie); }
.nv-inf .nv-inf-plot-ctx-h { font-size: 12px; font-weight: 700; color: var(--nv-tenue);
  margin-bottom: 5px; }
.nv-inf .nv-inf-plot-datos { margin: 0 0 6px; padding: 0; list-style: none;
  display: flex; flex-direction: column; gap: 3px; }
.nv-inf .nv-inf-plot-datos li { font-size: 13px; line-height: 1.45; overflow-wrap: anywhere; }
.nv-inf .nv-inf-plot-k { color: var(--nv-tenue); }

.nv-inf .nv-inf-acciones { display: flex; flex-wrap: wrap; gap: 8px; }
.nv-inf .nv-inf-btn { align-self: flex-start; background: var(--nv-superficie);
  border: 1px solid var(--nv-linea); border-radius: 999px; padding: 10px 18px;
  font: inherit; font-size: 14px; color: var(--nv-texto); cursor: pointer; }
.nv-inf .nv-inf-btn.is-fuerte { background: var(--nv-acento); border-color: var(--nv-acento);
  color: #06231c; font-weight: 700; }
.nv-inf .nv-inf-btn:disabled { opacity: .5; cursor: not-allowed; }
.nv-inf .nv-inf-salida:empty { display: none; }

/* ── EL MARCO: generando ─────────────────────────────────────────────────── */
.nv-inf .nv-inf-gen { display: flex; flex-direction: column; gap: 10px; align-items: flex-start;
  padding: 20px 16px; background: var(--nv-superficie); border: 1px solid var(--nv-linea);
  border-radius: var(--nv-r-sm, 14px); }
.nv-inf .nv-inf-gen-h { font-size: 16px; font-weight: 700; }
.nv-inf .nv-inf-gen-t { margin: 0; font-size: 13.5px; color: var(--nv-texto); }
/* La barra es una CUENTA ATRÁS sobre el estimado del backend, no una medida
   real del avance —el backend no publica progreso—, y por eso se topa en el 97%
   y nunca llega al 100: llegar al 100 y seguir esperando es peor que no tener
   barra. Lo que informa de verdad es el texto de arriba. */
.nv-inf .nv-inf-barra { width: 100%; height: 6px; border-radius: 999px;
  background: var(--nv-linea); overflow: hidden; }
.nv-inf .nv-inf-barra-in { height: 100%; background: var(--nv-acento);
  border-radius: 999px; transition: width .4s linear; }

/* ── EL MARCO: el informe que falló ──────────────────────────────────────── */
.nv-inf .nv-inf-caido { display: flex; flex-direction: column; gap: 9px; align-items: flex-start;
  padding: 16px; border-radius: var(--nv-r-sm, 14px); border: 1px solid #b3403a; }
.nv-inf .nv-inf-caido-h { font-size: 15px; font-weight: 700; color: #d9534f; }
.nv-inf .nv-inf-caido-t { margin: 0; font-size: 13.5px; line-height: 1.5; overflow-wrap: anywhere; }
/* Verde y bien visible: «no se te cobró» es la frase que evita que alguien
   crea que perdió la plata. No puede quedarse como una nota gris al pie. */
.nv-inf .nv-inf-devueltos { margin: 0; font-size: 13.5px; font-weight: 700; color: var(--nv-acento); }

.nv-inf .nv-inf-err { padding: 14px; border: 1px solid #b3403a; border-radius: var(--nv-r-sm, 14px); }
.nv-inf .nv-inf-err-h { font-size: 13.5px; font-weight: 700; }

/* ── EL MARCO: acciones sobre el informe ─────────────────────────────────── */
.nv-inf .nv-inf-vista { display: flex; flex-direction: column; gap: 14px; min-width: 0; }
.nv-inf .nv-inf-barra-acc { display: flex; flex-wrap: wrap; gap: 8px;
  align-items: center; justify-content: space-between; }
.nv-inf .nv-inf-swi { display: inline-flex; border: 1px solid var(--nv-linea);
  border-radius: 999px; overflow: hidden; }
.nv-inf .nv-inf-swi-b { background: none; border: 0; padding: 8px 14px; font: inherit;
  font-size: 13px; color: var(--nv-tenue); cursor: pointer; }
.nv-inf .nv-inf-swi-b.is-on { background: var(--nv-acento); color: #06231c; font-weight: 700; }

/* ══ LA HOJA ═════════════════════════════════════════════════════════════════
   Desde aquí abajo, TODOS los colores van a mano. Ver la cabecera del archivo:
   dentro de la hoja, `--nv-texto` sería claro en modo oscuro y no se leería
   sobre el blanco del papel. */
.nv-inf .nv-inf-hoja { margin: 0; }
/* `.nv-dim` dentro del membrete ya lo baja `marca.css` a #5b5b5b, pero mi regla
   `.nv-inf .nv-dim` tiene la MISMA especificidad (0,2,0): si `informe.css`
   cargara después de `marca.css`, el gris del tema ganaría por orden de fuente
   y los datos del profesional desaparecerían sobre el blanco. Se sube a (0,3,0)
   para que el resultado no dependa del orden de las hojas en el `index.html`.
   No es redefinir el membrete: es blindar el valor que `marca.css` ya decidió. */
.nv-inf .nv-mk-membrete .nv-dim { color: #5b5b5b; font-size: 11.5px; overflow-wrap: anywhere; }

.nv-inf .nv-inf-titulo { margin: 0; font-size: 17px; line-height: 1.3; font-weight: 800;
  color: #1A1A1A; overflow-wrap: anywhere; }
/* EL NOMBRE DE LA FINCA, DENTRO DEL MEMBRETE Y CON LA PERSONA. Estaba bajo el
   título (`.nv-inf-finca`, retirada el 2026-08-15) y el dueño corrigió el sitio:
   *«ponerle el nombre de la finca EN DONDE ESTÁ LA PERSONA»*.

   🔴 LA RAYA DE ARRIBA NO ES DECORACIÓN. En el membrete la finca cae justo
   debajo de la organización del profesional, y sin separar se lee como una
   credencial más —como si la agrónoma trabajara en esa finca— cuando es lo
   contrario: es el sujeto del informe. La raya y el color oscuro lo separan SIN
   UNA PALABRA, que es lo que hacía falta: una etiqueta traducida («Finca:»)
   saldría en el idioma de la interfaz dentro de un documento redactado en otro.
   Color a mano, como todo lo de dentro de la hoja: `--nv-tenue` sería claro
   sobre papel blanco. */
.nv-inf .nv-inf-mk-finca { display: block; margin-top: 7px; padding-top: 6px;
  border-top: 1px solid #e2e2e2; font-size: 12.5px; font-weight: 700;
  letter-spacing: .01em; color: #2b2b2b; overflow-wrap: anywhere; }
.nv-inf .nv-inf-hoja-cuerpo { display: flex; flex-direction: column; gap: 4px;
  border-top: 1px solid #ececec; padding-top: 12px; color: #1A1A1A; }
.nv-inf .nv-inf-h4 { margin: 12px 0 2px; font-size: 12px; font-weight: 800;
  letter-spacing: .06em; text-transform: uppercase; color: #6b6b6b; }
.nv-inf .nv-inf-p { margin: 0 0 6px; font-size: 13.5px; line-height: 1.62;
  color: #1A1A1A; overflow-wrap: anywhere; }

/* La marca de cita. Es un botón porque salta a la entrada de la bibliografía
   —una acción dentro de la página—, y así funciona con teclado. Se le quita
   toda la pinta de botón para que el texto se siga leyendo como `[1, 3]`. */
.nv-inf .nv-inf-cita { background: none; border: 0; padding: 0 1px; margin: 0;
  font: inherit; font-size: inherit; color: #1a6b57; font-weight: 700;
  cursor: pointer; text-decoration: underline; }
.nv-inf .nv-inf-cita:hover { color: #0f4d3e; }

.nv-inf .nv-inf-pasos { margin: 4px 0 6px; padding-left: 20px; display: flex;
  flex-direction: column; gap: 10px; }
.nv-inf .nv-inf-paso { font-size: 13.5px; line-height: 1.6; color: #1A1A1A; }
.nv-inf .nv-inf-paso .nv-inf-p { margin: 0; }
/* El «cuándo» y el «cómo se verifica» son lo que convierte una recomendación en
   algo que alguien puede ejecutar y comprobar. Se sangran para que se lean como
   parte del paso, no como otro paso. */
.nv-inf .nv-inf-campito { margin: 4px 0 0 0; padding-left: 9px; border-left: 2px solid #e2e2e2; }
.nv-inf .nv-inf-campito-l { display: block; font-size: 10.5px; font-weight: 800;
  letter-spacing: .05em; text-transform: uppercase; color: #8a8a8a; }
.nv-inf .nv-inf-campito .nv-inf-p { margin: 0; font-size: 12.5px; color: #444; }

/* Ámbar y no rojo para la prioridad alta, mismo criterio que el resto del repo:
   una recomendación urgente no es un error, es una prisa. Rojo aquí diría «algo
   se rompió» en un documento que alguien va a firmar. */
.nv-inf .nv-inf-prio { display: inline-block; font-size: 10px; font-weight: 800;
  letter-spacing: .05em; text-transform: uppercase; padding: 2px 8px;
  border-radius: 999px; border: 1px solid #d6d6d6; color: #6b6b6b;
  margin-bottom: 4px; }
.nv-inf .nv-inf-prio.is-alta { border-color: #9a6a00; color: #9a6a00; }
.nv-inf .nv-inf-prio.is-media { border-color: #b8b8b8; color: #5b5b5b; }
.nv-inf .nv-inf-prio.is-baja { border-color: #dcdcdc; color: #8a8a8a; }

/* --- bibliografía --- */
.nv-inf .nv-inf-bib-norma { margin: 0 0 8px; font-size: 11.5px; color: #6b6b6b; overflow-wrap: anywhere; }
.nv-inf .nv-inf-bib { margin: 0; padding-left: 22px; display: flex; flex-direction: column; gap: 9px; }
/* Los DOIs y los títulos de paper vienen sin espacios y son larguísimos: sin
   `anywhere` se salen de la hoja a 360 px. */
.nv-inf .nv-inf-ref { font-size: 12px; line-height: 1.55; color: #333;
  overflow-wrap: anywhere; border-radius: 6px; padding: 2px 4px; margin-left: -4px; }
/* Al saltar desde una cita, la entrada se ilumina un momento: sin eso, en una
   lista de doce referencias no se sabe a cuál llevó el salto. */
.nv-inf .nv-inf-ref.is-mirando { background: #fff3cd; }
.nv-inf .nv-inf-ref-t { display: block; }
.nv-inf .nv-inf-ref-pie { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-top: 3px; }
.nv-inf .nv-inf-link { color: #1a6b57; text-decoration: underline; font-size: 11px; overflow-wrap: anywhere; }
.nv-inf .nv-inf-base { font-size: 10px; padding: 1px 7px; border-radius: 999px;
  border: 1px solid #dcdcdc; color: #7a7a7a; white-space: nowrap; }

/* ── EL MARCO otra vez: trazabilidad, FUERA de la hoja ───────────────────────
   Cómo se hizo el informe no es parte del documento que se entrega. Por eso
   vive fuera del papel y vuelve a usar las variables del tema. */
.nv-inf .nv-inf-meta { display: flex; flex-direction: column; gap: 5px; padding: 0 2px; }
.nv-inf .nv-inf-meta p { margin: 0; overflow-wrap: anywhere; }
.nv-inf .nv-inf-audit { margin: 0; font-size: 12.5px; line-height: 1.5; color: #c98a00; }

/* ── EL MARCO: mis informes ──────────────────────────────────────────────── */
.nv-inf .nv-inf-lista { display: grid; grid-template-columns: minmax(0, 1fr); gap: 10px; }
@media (min-width: 620px) { .nv-inf .nv-inf-lista { grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); } }
.nv-inf .nv-inf-item { display: flex; flex-direction: column; gap: 7px; text-align: left;
  background: var(--nv-superficie); border: 1px solid var(--nv-linea);
  border-radius: var(--nv-r-sm, 14px); padding: 12px 13px; font: inherit;
  color: var(--nv-texto); cursor: pointer; min-width: 0; }
.nv-inf .nv-inf-item:hover { border-color: var(--nv-acento); }
.nv-inf .nv-inf-item-t { font-size: 14px; font-weight: 700; line-height: 1.35; overflow-wrap: anywhere; }
.nv-inf .nv-inf-item-pie { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; font-size: 12px; }
.nv-inf .nv-inf-tag { font-size: 11px; padding: 2px 9px; border-radius: 999px;
  border: 1px solid var(--nv-linea); color: var(--nv-tenue); white-space: nowrap; }

.nv-inf .nv-inf-vacio { text-align: center; padding: 26px 12px; color: var(--nv-tenue); }
.nv-inf .nv-inf-vacio p { margin: 0 0 6px; font-size: 13.5px; }

/* ── IMPRESIÓN ───────────────────────────────────────────────────────────────
   No hay generador de PDF en el repo (`pdfjs-dist` solo LEE), así que lo que se
   ofrece es imprimir — que es lo que de verdad existe, y desde ahí el navegador
   sabe guardar en PDF. Se apaga TODO el marco: pestañas, botones, trazabilidad.
   Lo que se imprime es el documento, no la aplicación.

   🔴 LA PARTE DE FUERA, RESUELTA EL 2026-08-14 — y no era cosmética. El dueño
   imprimió en producción y salió **1 HOJA DE PAPEL**, con la barra de
   desplazamiento dibujada dentro. Causa medida: `.nv-panel` —el contenedor de
   la app entera— tiene `overflow: auto`, y un navegador SOLO IMPRIME LA PARTE
   VISIBLE de una caja con scroll. Con `scrollHeight` 1965 contra `clientHeight`
   1290 se perdían 675 px de informe: el profesional entregaba un documento
   cortado sin enterarse, que es lo peor que puede pasarle a esta pieza.

   Se arregla SIN tocar `app.css` —que no tiene dueño y lo tocan varios hilos—
   colgando las reglas de `.nv-print-inf`, una marca que `informe.js` pone en el
   <html> en `beforeprint` y quita en `afterprint`. Así estas reglas SOLO existen
   mientras se imprime un informe: la impresión de cualquier otra pantalla queda
   exactamente como estaba. */
@media print {
  /* Lo de FUERA de `.nv-inf`, solo con la marca puesta. */
  .nv-print-inf .nv-side,
  .nv-print-inf .nv-wtop,
  .nv-print-inf .nv-scrim,
  .nv-print-inf .nv-fb-btn,
  /* `.nv-fab` es el botón redondo del asistente de IA, y NO es `.nv-asis-fab`
     como parecía: se midió con el medio `print` emulado y era el ÚNICO elemento
     `position: fixed` que seguía saliendo en el papel — un círculo con «IA»
     encima del informe. Un adorno de la app estampado en un documento que
     alguien firma con su tarjeta profesional. */
  .nv-print-inf .nv-fab { display: none !important; }
  /* LA LÍNEA QUE ARREGLA EL RECORTE: sin scroll no hay parte «no visible», así
     que el informe entero llega al papel en las hojas que haga falta. */
  .nv-print-inf .nv-panel { overflow: visible !important; height: auto !important;
    max-height: none !important; padding: 0 !important; }
  .nv-print-inf .nv-work,
  .nv-print-inf .nv-app { display: block !important; height: auto !important; overflow: visible !important; }
  /* El fondo oscuro de la app no se imprime: gasta tinta y deja el texto claro
     ilegible sobre papel. La hoja ya trae sus colores fijos (`marca.css`). */
  .nv-print-inf body, .nv-print-inf .nv-work { background: #fff !important; }

  .nv-inf .nv-inf-tabs,
  .nv-inf .nv-mod-h,
  .nv-inf .nv-inf-barra-acc,
  .nv-inf .nv-inf-meta,
  /* 🔴 LA NOTA DE «CÓMO SE GUARDA EN PDF» NO VA EN EL PDF. Parece obvio y no lo
     era: vive FUERA de `.nv-inf-meta` —a propósito, pegada al botón, que es
     donde se busca— y por eso no la tapaba ninguna de las reglas de aquí
     arriba. Medido el 2026-08-15 extrayendo el texto del PDF generado por el
     propio navegador: el documento EMPEZABA por «Se abre la ventana de
     impresión de tu navegador…», encima del membrete. Un instructivo de la app
     dentro de un entregable que un profesional firma con su tarjeta. */
  .nv-inf .nv-inf-pdf-como,
  .nv-inf .nv-inf-btn { display: none !important; }
  .nv-inf, .nv-inf .nv-inf-body, .nv-inf .nv-inf-vista { gap: 0; display: block; }
  /* Ni sombra ni bordes redondeados sobre papel: la sombra sale como una banda
     gris sucia y el radio no significa nada impreso. */
  .nv-inf .nv-inf-hoja { box-shadow: none; border-radius: 0; border-left: 0;
    border-right: 0; border-bottom: 0; padding: 0; }
  /* Una recomendación partida entre dos páginas se lee mal y se ejecuta peor. */
  .nv-inf .nv-inf-paso, .nv-inf .nv-inf-ref { break-inside: avoid; page-break-inside: avoid; }
  .nv-inf .nv-inf-h4 { break-after: avoid; page-break-after: avoid; }
  /* Impreso, el número de la cita ya no salta a ninguna parte: se deja como
     texto normal para que no parezca un enlace muerto. */
  .nv-inf .nv-inf-cita { text-decoration: none; color: #1A1A1A; }
  /* 🔴 Y EL ENLACE DE LA REFERENCIA, QUE SE HABÍA QUEDADO FUERA. Medido sobre
     un PDF de producción del dueño (5 páginas): `#1a6b57` aparecía **38 veces
     en la página 4 y 364 en la página 5** — nueve direcciones verdes y
     subrayadas en el papel. La regla de arriba apaga `.nv-inf-cita` y a
     `.nv-inf-link` (`informe.css:233`) no lo apagaba nadie.
     En papel un subrayado no se pulsa: es ruido que además promete algo que el
     papel no puede cumplir. */
  .nv-inf .nv-inf-link { text-decoration: none; color: #1A1A1A; }
  /* Y si la dirección YA está escrita dentro del texto de la cita —que es lo
     normal: las cuatro normas la incluyen— el enlace no se imprime en absoluto.
     Imprimir dos veces seguidas el mismo DOI, nueve veces en una hoja, se lee
     como un documento roto. En pantalla sigue estando, que es donde se pulsa. */
  .nv-inf .nv-inf-link.is-repetido { display: none !important; }
}
