/* ═══════════════════════════════════════════════════════════════════════════
   AVI DISPATCH · Rediseño B2 — tema navy oscuro (predeterminado) + tema claro
   opcional + barra píldora flotante (iPhone/iPad vertical)
   ───────────────────────────────────────────────────────────────────────────
   Aprobado por el operador 2026-08-10 sobre el previo
   PROJECTS/AVI_Dispatch_previo_app_gratis.html. v2 (misma noche): «mejora todo
   para computadora, para iPad, para iPhone… haz la versión clara por si la
   gente lo quiere cambiar; la predeterminada sea la oscura».

   CÓMO FUNCIONA
   · <body class="{% if theme_dark %}tdk{% endif %}"> — el server resuelve el
     tema (?theme= > sesión > preferencia de cuenta > OSCURO). Sin JS, sin
     flash, CSP intacta. Conmutador sol/luna en la nav (/set-theme).
   · Tema CLARO = la app de siempre (app.css tal cual) + la barra B2 clara.
   · Tema OSCURO = clase `tdk` re-pinta los componentes existentes.
   · La BARRA vive en AMBOS temas: ≤834px (iPhone + iPad vertical); en
     horizontal/desktop manda la nav de arriba.

   REGLA DE ORO (textual): «espejo del que hay actualmente… que no se pierdan
   ninguna de las informaciones». Solo CSS; cero DOM funcional.
   ═══════════════════════════════════════════════════════════════════════ */

/* ── 1 · Lienzo oscuro ─────────────────────────────────────────────────── */
/* ⚠️ POR QUÉ SÓLIDO Y NO DEGRADADO (pulidos 7d — el operador, 2026-08-11, tras tres
   intentos de tapar «la línea azul marino»): el lienzo era
   linear-gradient(175deg,#0b2240,#123563,#17466f). Cualquier banda o velo que
   cubra la franja del reloj tiene UN color; el degradado debajo tiene OTRO a
   esa altura → el borde se ve SIEMPRE. En el login no se notaba porque esa
   pantalla no hace scroll («ahí me gusta cómo se ve, déjala así»).
   Con lienzo SÓLIDO la banda usa el MISMO color y desaparece — por
   construcción, no por ajuste fino. Un solo tono, declarado una vez. */
:root { --tdk-canvas: #123563; }
body.tdk {
  /* !important: fbo.html trae background inline en <body>; el tema manda. */
  background: var(--tdk-canvas) !important;
  color: #dbe9fa;
  color-scheme: dark;
}
body.tdk .shell { color: #dbe9fa; }

body.tdk h1, body.tdk h2, body.tdk h3, body.tdk h4 { color: #fff; }
body.tdk a { color: #7fb0ff; }
body.tdk hr { border-color: rgba(255,255,255,.14); }
body.tdk .muted, body.tdk .sub, body.tdk small,
body.tdk .act-s, body.tdk .note { color: #9fb6d4; }

/* El hero del home y los encabezados navy se FUNDEN con el lienzo (antes eran
   un navy sobre otro navy: doble marco sin propósito). */
body.tdk .nb-hero { background: transparent; box-shadow: none; }
body.tdk .page-hdr, body.tdk .app-hdr, body.tdk.scan-page h1 {
  background: transparent;
  padding-left: 0; padding-right: 0;
}

/* ── 2 · Tarjetas y secciones (oscuro) ─────────────────────────────────── */
body.tdk .card {
  background: rgba(255,255,255,.07);
  border: 1px solid rgba(255,255,255,.13);
  border-top: 1px solid rgba(255,255,255,.13);   /* fuera la cejita de acento */
  border-radius: 16px;
  box-shadow: none;
}
body.tdk .card h2 { color: #fff; }
body.tdk .sec-label { color: #9fb6d4; }

body.tdk .act {
  background: rgba(255,255,255,.07);
  border-color: rgba(255,255,255,.13);
}
body.tdk .act:hover { background: rgba(255,255,255,.12); border-color: rgba(127,176,255,.5); }
body.tdk .act-t { color: #fff; }
body.tdk .act-ic { background: rgba(77,163,255,.16); color: #bfe0ff; }

body.tdk details { border-color: rgba(255,255,255,.14); }
body.tdk summary { color: #dbe9fa; }

/* ── 3 · Formularios (inputs blancos redondeados del previo) ───────────── */
body.tdk .fld label, body.tdk .fldf label, body.tdk label { color: #9fb6d4; }
body.tdk input:not([type="checkbox"]):not([type="radio"]):not([type="file"]),
body.tdk select, body.tdk textarea {
  background: rgba(255,255,255,.94);
  color: #0b386a;
  border: 0;
  border-radius: 11px;
  padding: 10px 12px;
  font-weight: 600;
}
body.tdk input::placeholder, body.tdk textarea::placeholder { color: #8ea3bd; font-weight: 500; }
body.tdk input[readonly], body.tdk input:disabled, body.tdk select:disabled {
  background: rgba(255,255,255,.16);
  color: #cfe0f2;
}
body.tdk input:focus, body.tdk select:focus, body.tdk textarea:focus {
  outline: 2px solid #4da3ff;
}

/* Botones: JERARQUÍA del previo — la acción principal (submit) en verde,
   lo demás fantasma. Lo fino por página se pule con capturas del operador. */
body.tdk button, body.tdk .btn {
  background: rgba(255,255,255,.10);
  color: #fff;
  border: 1.5px solid rgba(255,255,255,.25);
  border-radius: 11px;
  font-weight: 700;
}
body.tdk button:hover, body.tdk .btn:hover { background: rgba(255,255,255,.16); }
body.tdk button[type="submit"], body.tdk input[type="submit"] {
  background: linear-gradient(160deg, #2fae6e, #22995d);
  border: 0;
  color: #fff;
}
body.tdk button[type="submit"]:hover, body.tdk input[type="submit"]:hover {
  background: linear-gradient(160deg, #35bd79, #27a566);
}
body.tdk button:disabled { opacity: .45; }

/* ── 4 · Tablas ────────────────────────────────────────────────────────── */
body.tdk table { color: #dbe9fa; }
body.tdk th { color: #9fb6d4; border-color: rgba(255,255,255,.14); }
body.tdk td { border-color: rgba(255,255,255,.10); }
body.tdk tr:hover td { background: rgba(255,255,255,.04); }
body.tdk .rtable td::before { color: #9fb6d4; }

/* ── 5 · Avisos, estados y páginas con fondo propio ────────────────────── */
body.tdk .alert { border-color: rgba(255,255,255,.10); }
body.tdk .error, body.tdk .err { color: #ffb4b4; }
body.tdk .ok, body.tdk .success { color: #9fe8c3; }

/* ⚠️ Lección (el operador, pulidos 3): aquí decía `background: transparent` — eso
   le quitaba el gradiente al scan y el <html> pelón se veía BLANCO. El lienzo
   se declara completo, con la misma fuerza que el body.tdk general. */
body.tdk.scan-page {
  background: var(--tdk-canvas) !important;
  color: #dbe9fa;
}
body.tdk.scan-page .sub { color: #9fb6d4; }
body.tdk.precios-page { color: #dbe9fa; }

body.tdk .appnav {
  background: rgba(10,22,40,.55);
  border: 1px solid rgba(255,255,255,.08);
  border-radius: 14px;
}

/* ── 6 · Lupas (equip-picker) en oscuro ────────────────────────────────────
   equip-picker.css las pinta claras; aquí el modo oscuro las alcanza. El
   encabezado ya es navy — se queda. */
body.tdk .eqp-md { background: #10294a; }
body.tdk .eqp-gt { color: #9fb6d4; }
body.tdk .eqp-opt {
  background: rgba(255,255,255,.06);
  border-color: rgba(255,255,255,.16);
}
body.tdk .eqp-opt .eqp-d { color: #c6d7ec; }
body.tdk .eqp-opt .eqp-code {
  background: rgba(77,163,255,.14);
  border-color: rgba(77,163,255,.35);
  color: #bfe0ff;
}
body.tdk .eqp-opt.on {
  border-color: #4da3ff;
  background: rgba(77,163,255,.16);
}
body.tdk .eqp-opt.on .eqp-code { background: #1f5aa8; border-color: #1f5aa8; color: #fff; }
body.tdk .eqp-cop { background: rgba(255,255,255,.06); border-color: rgba(255,255,255,.16); }
body.tdk .eqp-cop .eqp-d { color: #c6d7ec; }
body.tdk .eqp-cop.on { border-color: #4da3ff; background: rgba(77,163,255,.16); }
body.tdk .eqp-foot { background: rgba(0,0,0,.25); border-top-color: rgba(255,255,255,.12); }
body.tdk .eqp-hint { color: #9fb6d4; }

/* Índice de fichas (ficha-index.css) en oscuro — COMPLETO (pulidos 5: la
   barra pegajosa de arriba salía clara flotando sobre el navy). */
body.tdk #ficha-idx { background: linear-gradient(#0e2946 82%, rgba(14,41,70,0)); }
body.tdk .fx-prog { background: rgba(255,255,255,.08); border-color: rgba(255,255,255,.16); box-shadow: none; }
body.tdk .fx-prog span { color: #dbe9fa; }
body.tdk .fx-bar { background: rgba(255,255,255,.15); }
body.tdk .fx-chip { background: rgba(255,255,255,.08); border-color: rgba(255,255,255,.22); color: #c6d7ec; }
body.tdk .fx-chip.ok { border-color: rgba(47,174,110,.5); color: #9fe8c3; background: rgba(47,174,110,.14); }
body.tdk .fx-chip.on { border-color: #4da3ff; color: #fff; background: rgba(77,163,255,.2); }

/* ── 7 · BARRA PÍLDORA B2 — en AMBOS temas, iPhone + iPad vertical ─────── */
.tbar { display: none; }
.cta-cuenta { display: none; }       /* solo móvil (ver media query) */

@media (max-width: 834px) {          /* iPhone + iPad vertical (820/834) */
  /* aire inferior en ambos temas (solo las páginas cliente cargan esta hoja) */
  body { padding-bottom: calc(86px + env(safe-area-inset-bottom, 0px)); }

  /* Etapa 2 (pedido del operador tras el deploy): en móvil la nav de ARRIBA ya no
     existe — la navegación es la barra. Solo se oculta el visual: _nav.html
     sigue cargando csrf-fetch/i18n/pwa (scripts, no caja). Salir, idioma,
     tema y Seguridad viven en Datos («Mi cuenta»); el admin tiene su engrane
     en la barra. En desktop la nav sigue igual. */
  body .appnav { display: none; }
  /* también el aire de arriba respeta el notch ya sin la caja */
  body { padding-top: calc(env(safe-area-inset-top, 0px) + 6px); }

  /* Velo del status bar (pulidos 6, el operador 2026-08-11: «al hacer scroll puedes
     ver cómo [el contenido] se sigue viendo arriba de la barra de la ficha»).
     iOS pega los sticky DEBAJO del safe-area, así que la franja del reloj
     queda descubierta y el contenido pasa por ahí a plena luz. Este velo FIJO
     cubre exactamente esa franja con el color del lienzo (+ un desvanecido),
     en AMBOS temas. pointer-events:none: ahí nunca hay nada que tocar. */
  /* ⚠️ AQUÍ VIVÍA EL VELO DEL STATUS BAR — y ERA la línea (pulidos 7f, el operador:
     «no arreglaste nada de las líneas… y en modo Claro hay una línea blanca»).
     Historia, para que a nadie se le ocurra volver a ponerlo: se agregó para
     tapar el contenido que se veía pasar bajo el reloj; primero con degradado
     (se veía el corte), luego sólido (se seguía viendo), luego con z-index
     alto (y en tema claro apareció como una FRANJA BLANCA pegada arriba). El
     velo era una banda sin contenido: siempre iba a leerse como una línea.
     La solución de verdad ya estaba puesta: el lienzo SÓLIDO (--tdk-canvas)
     y, en las fichas, la banda del índice —que sí tiene contenido y por eso
     se ve intencional—. En las demás páginas el contenido simplemente pasa
     bajo el status bar, como en cualquier app de iOS. Sin velo, sin línea. */

  /* iOS hace AUTO-ZOOM al enfocar cualquier campo con letra <16px (pulidos 7,
     el operador probando FBOs con su dummy: «cuando escribo hace como un Zoom» — y
     el zoom además descuadra el velo y deja ver el contenido del status bar).
     En móvil TODO campo escribible va a 16px y el zoom se acaba. El !important
     alcanza también a los inputs con letra chica escopeada (tabla perf, fldf). */
  body input:not([type="checkbox"]):not([type="radio"]),
  body select, body textarea { font-size: 16px !important; }

  /* Banda FIJA de las fichas (pulidos 7b — decisión del operador tras ver la
     tapa a medias: «que nunca se mueva y que todo colapse por abajo, todo
     sólido»). La banda vive en ficha-index.css (esa hoja carga DESPUÉS que
     esta: solo ahí le gana a su propio sticky base); aquí van su color
     oscuro y el resumen del editor, que con la banda ya no debe pegarse.
     `body .fpb .summary` porque el sticky viene del <style> del template,
     que carga al final — hace falta más especificidad, no más orden. */
  /* La banda va del MISMO color del lienzo: con fondo sólido no hay borde que
     delate dónde termina (pulidos 7d). La sombra sí se queda: es la que corta
     limpio el contenido que pasa por debajo. */
  body.tdk #ficha-idx { background: var(--tdk-canvas); }
  body .fpb .summary { position: static; }

  /* La tarjeta «Mi cuenta» de Datos SOLO vive en móvil (en desktop la nav de
     arriba ya trae todo esto). */
  .cta-cuenta { display: block; }

  /* Accesos individuales del home FUERA en móvil (el operador, Etapa 2: «para eso
     ya tenemos las burbujas de abajo» — la barra navega; todo flujo entra por
     Nuevo vuelo). En desktop, sin barra, los accesos siguen. Solo CSS: el DOM
     y sus gates quedan intactos. */
  .nb-quick { display: none; }

  .tbar {
    display: flex;
    position: fixed;
    left: 14px; right: 14px;
    bottom: calc(12px + env(safe-area-inset-bottom, 0px));
    z-index: 90;
    max-width: 560px;                /* en iPad no se estira de borde a borde */
    margin: 0 auto;
    border-radius: 999px;
    padding: 5px 6px;
    -webkit-backdrop-filter: blur(16px);
    backdrop-filter: blur(16px);
    /* tema CLARO (base) */
    background: rgba(255,255,255,.92);
    border: 1px solid #d9d9de;
    box-shadow: 0 14px 40px rgba(4,44,83,.22);
  }
  .titem {
    flex: 1;
    display: flex; flex-direction: column; align-items: center; gap: 2px;
    padding: 7px 2px;
    color: #6B6B70;
    text-decoration: none;
    border-radius: 999px;
    -webkit-tap-highlight-color: transparent;
  }
  .titem svg {
    width: 21px; height: 21px;
    stroke: currentColor; fill: none;
    stroke-width: 1.9; stroke-linecap: round; stroke-linejoin: round;
  }
  .titem span { font-size: .6rem; font-weight: 800; line-height: 1.1; white-space: nowrap; }
  .titem.on { color: #0F4E88; background: #EAF1FB; }

  /* tema OSCURO (override) */
  body.tdk .tbar {
    background: rgba(10,22,40,.92);
    border: 1px solid rgba(255,255,255,.10);
    box-shadow: 0 14px 40px rgba(0,0,0,.5);
  }
  body.tdk .titem { color: #8fa6c4; }
  body.tdk .titem.on { color: #fff; background: rgba(77,163,255,.18); }
}

/* ── 8 · Afinado por tamaño ────────────────────────────────────────────────
   iPad horizontal y Mac: en oscuro las tarjetas ganan una sombra suave para
   despegarse del gradiente en pantallas grandes. */
@media (min-width: 835px) {
  body.tdk .card, body.tdk .act { box-shadow: 0 8px 28px rgba(0,0,0,.18); }
}

/* ══════════════════════════════════════════════════════════════════════════
   VERSIÓN iPad / PC · Etapa 1: el MARCO (2026-08-12)

   ⛔ EL iPHONE NO SE TOCA — instrucción textual del operador: «de la versión del
   iPhone NO MUEVAS NADA». Todo lo de aquí abajo vive en `min-width: 835px`, y
   los estilos del iPhone viven completos dentro de `max-width: 834px`: son dos
   mundos que no se cruzan. Si algo de esta sección se ve en un iPhone, es un
   bug — y la regla que lo delata es el breakpoint.

   Cómo se distingue un iPad de una PC, que fue la decisión del operador («abajo en
   iPad, lateral en PC»): NO por ancho — un iPad horizontal (1194) es más ancho
   que muchas laptops — sino por el PUNTERO. `pointer: coarse` es un dedo;
   `pointer: fine` es un ratón o un trackpad. Es la única señal honesta.

   La barra es la MISMA de siempre (_tabbar.html, `.tbar`/`.titem`): no hay un
   segundo menú que mantener, solo se acuesta o se para según el aparato.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── iPad (dedo, pantalla grande): la barra de abajo, más holgada ────────── */
@media (min-width: 835px) and (pointer: coarse) {
  body .appnav { display: none; }        /* la navegación es la barra */
  body { padding-bottom: 112px; }

  .tbar {
    display: flex;
    position: fixed;
    left: 50%; transform: translateX(-50%);
    bottom: calc(16px + env(safe-area-inset-bottom, 0px));
    z-index: 90;
    width: auto; max-width: 720px;
    border-radius: 999px;
    padding: 6px 10px;
    background: rgba(255,255,255,.96);
    border: 1px solid rgba(15,78,136,.12);
    box-shadow: 0 16px 44px rgba(6,20,40,.28);
    -webkit-backdrop-filter: saturate(1.4) blur(10px);
    backdrop-filter: saturate(1.4) blur(10px);
  }
  .titem {
    display: flex; flex-direction: column; align-items: center; gap: 3px;
    padding: 8px 20px;                   /* con dedo, blanco generoso */
    color: #6B6B70; text-decoration: none; border-radius: 999px;
  }
  .titem svg {
    width: 22px; height: 22px;
    stroke: currentColor; fill: none;
    stroke-width: 1.9; stroke-linecap: round; stroke-linejoin: round;
  }
  .titem span { font-size: .7rem; font-weight: 800; line-height: 1.1; white-space: nowrap; }
  .titem.on { color: #0F4E88; background: #EAF1FB; }

  body.tdk .tbar {
    background: rgba(10,22,40,.94);
    border-color: rgba(255,255,255,.10);
    box-shadow: 0 16px 44px rgba(0,0,0,.5);
  }
  body.tdk .titem { color: #8fa6c4; }
  body.tdk .titem.on { color: #fff; background: rgba(77,163,255,.18); }
}

/* ── PC (ratón/trackpad): la MISMA barra, parada a la izquierda ──────────── */
@media (min-width: 835px) and (pointer: fine) {
  body .appnav { display: none; }        /* un solo menú, no dos */
  /* !important porque varias plantillas traen `padding:0` EN LÍNEA en el body
     (fbo.html, entre otras) y un inline le gana a cualquier hoja: sin esto el
     contenido se centra en la ventana entera, se mete bajo el menú y queda
     «todo pegado a la izquierda» — que fue exactamente el reporte del operador. */
  body { padding-left: 216px !important; }

  .tbar {
    display: flex; flex-direction: column;
    align-items: stretch; gap: 2px;
    position: fixed; top: 0; left: 0; bottom: 0;
    width: 216px; z-index: 90;
    padding: 18px 12px;
    background: #f4f8fd;
    border-right: 1px solid rgba(15,78,136,.14);
    overflow-y: auto;
  }
  /* En vertical el icono va DELANTE del texto: se lee como una lista, que es
     lo que un menú lateral es. */
  .titem {
    display: flex; flex-direction: row; align-items: center; gap: 11px;
    padding: 10px 12px;
    color: #4a5b70; text-decoration: none; border-radius: 10px;
    transition: background .12s ease;
  }
  .titem svg {
    width: 20px; height: 20px; flex: 0 0 auto;
    stroke: currentColor; fill: none;
    stroke-width: 1.9; stroke-linecap: round; stroke-linejoin: round;
  }
  .titem span { font-size: .86rem; font-weight: 700; line-height: 1.2; }
  .titem:hover { background: rgba(15,78,136,.07); }     /* hay ratón: hay hover */
  .titem.on { color: #0F4E88; background: #e4eefb; }

  body.tdk .tbar {
    background: rgba(4,16,31,.72);
    border-right-color: rgba(127,176,255,.16);
  }
  body.tdk .titem { color: #a9c4e4; }
  body.tdk .titem:hover { background: rgba(127,176,255,.10); }
  body.tdk .titem.on { color: #fff; background: rgba(77,163,255,.16); }

  /* El shell centrado ya no compite con la barra: se centra en el espacio que
     QUEDA, no en la ventana. */
  body > .wrap, body > .shell, body > main { margin-left: auto; margin-right: auto; }
}

/* ══════════════════════════════════════════════════════════════════════════
   VERSIÓN iPad / PC · Etapa 2: las CASILLAS (2026-08-12)

   el operador: «casillas chicas solo para texto necesario y sin desperdiciar
   espacios y renglones». El problema no era que faltaran columnas —la ficha ya
   iba a dos desde los 680 px— sino que TODOS los campos medían lo mismo: el
   sexo (una letra) ocupaba tanto como un apellido, y media pantalla se iba en
   blanco. Aquí la rejilla deja de ser fija y se llena con tantas casillas como
   quepan, cada una de un ancho cómodo de leer.

   Vale para iPad y PC por igual (de ahí que no filtre por puntero): a partir
   de 835 px hay ancho de sobra en los dos. El iPhone sigue con su columna
   única — no se toca.
   ══════════════════════════════════════════════════════════════════════════ */
@media (min-width: 835px) {
  /* Fichas de personas y aeronaves: de 2 columnas fijas a las que quepan.
     En una Mac son 4 por renglón; en iPad, 3. Ocho campos pasan de cuatro
     renglones a dos. */
  body .grid { grid-template-columns: repeat(auto-fit, minmax(206px, 1fr)); gap: 10px 14px; }

  /* Filas del compositor y de la ficha de aeronave (equipo, performance):
     mismo criterio, con un mínimo menor porque ahí los datos son cortos
     (velocidades, regímenes, códigos). */
  body .rowf { grid-template-columns: repeat(auto-fit, minmax(172px, 1fr)); }

  /* Un campo que queda solo en su renglón NO debe estirarse a lo ancho de la
     pantalla: una matrícula de seis letras en una caja de 900 px es justo el
     desperdicio del que hablaba el operador. */
  body .fld > input, body .fld > select,
  body .fldf > input, body .fldf > select { max-width: 420px; }
  /* …salvo los que de verdad son largos: ruta, correos, notas. */
  body .fld > textarea, body .fldf > textarea,
  body .fld.ancho > input, body .fldf.ancho > input { max-width: none; }

  /* Menos aire muerto entre bloques: en pantalla grande el scroll sobra, no
     falta. */
  body .fpb .blk { margin-bottom: 12px; }
  body h3.grp { margin: 14px 0 6px; }
}

/* ── 9 · Ronda de pulidos 2 (el operador probando la Etapa 2, 2026-08-10) ──────── */

/* «El 5 de equipo y supervivencia se ve en blanco» — plan_vuelo trae
   .pvb details.eqro{background:#fff} propio; en oscuro se funde a la tarjeta. */
body.tdk .pvb details.eqro {
  background: rgba(255,255,255,.05);
  border-color: rgba(255,255,255,.15);
}
body.tdk .pvb details.eqro > summary { color: #fff; }
body.tdk .pvb details.eqro > summary .sub,
body.tdk .pvb h2 .sub { color: #9fb6d4; }        /* «letras grises feas» */
body.tdk .pvb .i18chips .chipbtn {
  background: rgba(77,163,255,.14);
  border-color: rgba(77,163,255,.35);
  color: #bfe0ff;
}
/* chip con su clave YA puesta en el item 18: iluminado (pulidos 4) */
body.tdk .pvb .i18chips .chipbtn.on {
  background: #4da3ff;
  border-color: #4da3ff;
  color: #08213c;
}

/* «Hay que separar los botones» — aire entre las acciones de la vista previa
   (ambos temas; antes quedaban pegados en columna). */
.pvb .pvactions { display: flex; flex-wrap: wrap; gap: 9px; align-items: center; }
.pvb .pvactions .btn, .pvb .pvactions .calcbtn { margin: 0; }

/* El <input type="date"> original, fuera de la vista pero VIVO: si se ocultara
   con display:none, un campo `required` impediría enviar el formulario entero
   («invalid form control is not focusable») — date-mask.js. */
input.dm-orig {
  position: absolute !important;
  width: 1px; height: 1px;
  opacity: 0; pointer-events: none;
  margin: 0; padding: 0; border: 0;
}

/* Fecha completa pero imposible (un 02/31): se marca al soltar el campo, nunca
   mientras se teclea. Vale en los dos temas — date-mask.js. */
input.dm-mal {
  border-color: #c0261c !important;
  box-shadow: 0 0 0 2px rgba(192,38,28,.18);
}

/* «Preparar este vuelo» con texto azul: body.tdk a ganaba por especificidad */
body.tdk .av-go { color: #fff; }
body.tdk .av-go.lockd { color: #dbe9fa; }

/* ── §6 Documentos en oscuro (2026-08-11) ─────────────────────────────────
   «algunas partes del plan de Flight Service siguen teniendo de fondo blanco».
   El cuadro del plan ICAO y los botones fantasma nacieron claros en
   plan_vuelo.html y el tema nunca los repintó. */
body.tdk .pvb .fpl {
  background: rgba(255,255,255,.05);
  border-color: rgba(255,255,255,.15);
  color: #dbe9fa;
}
body.tdk .pvb .btn.ghost {
  background: rgba(255,255,255,.06);
  border-color: rgba(127,176,255,.35);
  color: #dbe9fa;
}
/* Tarjeta del plan ya presentado: se leía gris sobre blanco («casi no se lee
   bien con el número de ID»). Aquí el ID es lo que más contrasta. */
body.tdk .pvb .fs21res {
  background: rgba(77,163,255,.10);
  border-color: rgba(77,163,255,.34);
}
body.tdk .pvb .fs21head { color: #eaf3ff; }
body.tdk .pvb .fs21head b {
  color: #fff;
  background: rgba(0,0,0,.28);
}
body.tdk .pvb .fs21res .note { color: #b9cfe9; }
body.tdk .pvb .fs21btns .btn.danger {
  color: #ffb3ab;
  border-color: rgba(255,120,105,.45);
  background: rgba(192,38,28,.16);
}

/* checkboxes cuadros negros (inspectores del scan) → acento del tema */
body.tdk input[type="checkbox"], body.tdk input[type="radio"] { accent-color: #4da3ff; }

/* «El scan tapa el menú de abajo» — scan-page y fbo-page traen SU padding
   (uno por clase, otro inline) que pisaba el aire de la barra. !important:
   aquí gana la barra o no se puede picar «Generar vista previa». */
@media (max-width: 834px) {
  body.scan-page, body.fbo-page, body.tdk.scan-page, body.tdk.fbo-page {
    padding-bottom: calc(100px + env(safe-area-inset-bottom, 0px)) !important;
  }
}

/* ── 10 · Ronda de pulidos 3 (el operador, 2026-08-10 22:10): «necesito que TODA la
   aplicación se parezca en cuanto a los fondos y todo» — el scan y el FBO
   traían su paleta clara scopeada; aquí el oscuro los alcanza pieza por
   pieza. Los CORREOS son documento: fondo claro con texto oscuro SIEMPRE. ── */

/* SCAN — todo lo que era blanco/gris claro, al navy */
body.tdk.scan-page .review {
  background: rgba(196,127,0,.14);
  border-color: rgba(240,192,0,.45);
  color: #f2d59a;
}
body.tdk.scan-page label.block { color: #c6d7ec; }
body.tdk.scan-page .file-input-wrapper {
  background: rgba(255,255,255,.06);
  border-color: rgba(255,255,255,.25);
}
body.tdk.scan-page .file-input-wrapper p { color: #bfe0ff; }
body.tdk.scan-page .file-input-wrapper small { color: #9fb6d4; }
/* nombre final del PDF: caja legible sobre el navy */
body.tdk.scan-page .preview-box {
  background: rgba(0,0,0,.28);
  border-color: rgba(255,255,255,.16);
  color: #dbe9fa;
}
body.tdk.scan-page .preview-box .lbl { color: #9fb6d4; }
/* nombres de los PDFs adjuntos («la letra se ve muy bajita») */
body.tdk.scan-page .file-row {
  background: rgba(255,255,255,.08);
  border-color: rgba(255,255,255,.15);
  color: #dbe9fa;
}
/* la ACCIÓN de la página, en el verde CTA de toda la app */
body.tdk.scan-page button.primary, body.tdk.scan-page #generate-btn {
  background: linear-gradient(160deg, #2fae6e, #22995d);
  color: #fff;
}
body.tdk.scan-page button.primary:active, body.tdk.scan-page #generate-btn:active {
  background: linear-gradient(160deg, #27a566, #1e8a52);
}
/* modal de confirmación de envío + panel del recorte */
body.tdk.scan-page .send-confirm-box, body.tdk.scan-page .cropper-panel {
  background: #10294a;
  color: #dbe9fa;
}
body.tdk.scan-page .cropper-instructions,
body.tdk.scan-page .lbl-text { color: #c6d7ec; }

/* FBO — misma vestida (labels, notas, avisos, botones fantasma) */
body.tdk.fbo-page .fbo-fld label { color: #c6d7ec; }
body.tdk.fbo-page .fbo-svc label { color: #dbe9fa; }
body.tdk.fbo-page .fbo-grp-t { color: #9fb6d4; border-bottom-color: rgba(255,255,255,.15); }
body.tdk.fbo-page .fbo-note { color: #9fb6d4; }
body.tdk.fbo-page .fbo-ask {
  background: rgba(77,163,255,.14);
  border-color: rgba(77,163,255,.35);
  color: #bfe0ff;
}
body.tdk.fbo-page .fbo-warn {
  background: rgba(196,127,0,.14);
  border-color: rgba(240,192,0,.45);
  color: #f2d59a;
}
body.tdk.fbo-page .fbo-btn.ghost {
  background: rgba(255,255,255,.10);
  color: #dbe9fa;
  border-color: rgba(255,255,255,.25);
}
/* Salida/Llegada: el elegido se nota DE LEJOS (pulidos 4: «casi no se
   diferencia cuál está seleccionado») — verde CTA en ambos temas. */
.fbo-page #fbo-leg-dep:not(.ghost), .fbo-page #fbo-leg-arr:not(.ghost) {
  background: linear-gradient(160deg, #2fae6e, #22995d);
  color: #fff;
}

/* 5b del plan («la letra de incluir la solicitud no se lee bien en gris»):
   TODOS los labels del compositor suben de contraste en oscuro. */
body.tdk .pvb label { color: #c6d7ec; }
body.tdk .pvb .fldf label { color: #c6d7ec; }

/* ── 11 · Ronda de pulidos 5 (el operador, 2026-08-10 23:20) ─────────────────── */

/* «Los fondos de los equipos siguen siendo blancos» — la ficha del avión
   (aircraft_equipment) trae sus acordeones .fpb con paleta clara propia:
   aquí el navy los alcanza pieza por pieza, como los .card de Documentos. */
body.tdk .fpb details.acc {
  background: rgba(255,255,255,.07);
  border-color: rgba(255,255,255,.14);
  box-shadow: none;
}
body.tdk .fpb details.acc > summary { color: #fff; }
body.tdk .fpb details.acc > summary .sub { color: #9fb6d4; }
body.tdk .fpb details.sub { border-color: rgba(255,255,255,.16); }
body.tdk .fpb details.sub > summary { color: #c6d7ec; }
body.tdk .fpb .opt-note { color: #9fb6d4; }
body.tdk .fpb .blk { border-bottom-color: rgba(255,255,255,.12); }
body.tdk .fpb .blk h3 { color: #9fb6d4; }
body.tdk .fpb label.cb { color: #dbe9fa; }
body.tdk .fpb .code {
  color: #bfe0ff;
  background: rgba(77,163,255,.14);
  border-color: rgba(77,163,255,.35);
}
body.tdk .fpb .grp { border-color: rgba(255,255,255,.16); }
body.tdk .fpb .grp .lbl { color: #c6d7ec; }
body.tdk .fpb .out { color: #dbe9fa; }
body.tdk .fpb .out .val {
  color: #bfe0ff;
  background: rgba(0,0,0,.28);
  border-color: rgba(255,255,255,.3);
}
body.tdk .fpb .fldf label { color: #c6d7ec; }
body.tdk .fpb table.perf th { background: rgba(255,255,255,.1); color: #c6d7ec; border-color: rgba(255,255,255,.14); }
body.tdk .fpb table.perf td { border-color: rgba(255,255,255,.1); color: #dbe9fa; }
body.tdk .fpb table.perf td.alt { background: rgba(0,0,0,.25); color: #bfe0ff; }
body.tdk .fpb .perfwrap { border-color: rgba(255,255,255,.16); }

/* Pulidos 6 (el operador 2026-08-11): los LISTADOS de 10a / PBN / PER seguían
   BLANCOS — entidad_crud.html les pone `.fpb .opts{background:#fff}` como
   marco de lista y el tema no lo cubría (el transponder de 10b se salvaba
   porque su marco es el .grp, con .opts transparente). «Déjalos como el 10b». */
body.tdk .fpb .opts {
  border-color: rgba(255,255,255,.16);
  background: rgba(6,19,38,.35);
}
body.tdk .fpb .opts label.cb:hover { background: rgba(255,255,255,.06); }
body.tdk .fpb .grp .opts { background: transparent; border: 0; }

/* «Se enviará a:» del scan (pulidos 7c): la caja es VERDE CLARA por inline
   (#ecfdf5) y el tema pinta .review en ámbar → el texto salía amarillo sobre
   verde, ilegible. Misma regla de siempre: caja clara = color EXPLÍCITO que
   valga en ambos temas. El azul institucional se lee y es el de los enlaces. */
body.tdk #recipients-summary,
body.tdk #recipients-summary strong,
body.tdk #recipients-summary li { color: #0b386a; }

/* Caja «Performance típica del modelo — precargada»: era clara con inline
   styles y las notas heredaban texto claro → ilegible. En oscuro se vuelve
   tarjeta navy (los !important ganan a los estilos inline del template). */
body.tdk #perf-seed {
  background: #10294a !important;
  border-color: rgba(255,255,255,.22) !important;
}
body.tdk #perf-seed > div:first-child { color: #dbe9fa !important; }

/* «La fecha de nacimiento / fecha de vuelo se ve rara, se hace grande por la
   derecha» — el input date nativo de iOS se estira con el tema; se empareja
   con los demás campos. */
body.tdk input[type="date"], body.tdk input[type="datetime-local"] {
  -webkit-appearance: none;
  appearance: none;
  display: block;
  width: 100%;
  min-height: 46px;
}
body.tdk input[type="date"]::-webkit-date-and-time-value { text-align: left; margin: 0; }
