/* ==========================================================================
   RUMBO - Identidad visual
   ==========================================================================
   TODOS los colores, tamaños y espacios salen de las variables de acá abajo.
   Para el tema claro sólo se redefinen las mismas variables. Si hace falta
   cambiar algo, se cambia UNA vez y cambia toda la app: no hay colores
   escritos a mano en el resto del archivo.
   ========================================================================== */

/* ---------------------------- TEMA OSCURO ---------------------------- */
:root, :root[data-theme="dark"] {
  /* Superficies. Gris oscuro, NO negro: antes el fondo era #0b0b0d y quedaba
     un agujero negro. */
  --negro:      #1a1a1e;   /* fondo general */
  --panel:      #232327;   /* tarjeta */
  --panel-alt:  #2b2b31;   /* tarjeta interna, campos */
  --borde:      #3a3a41;

  /* Texto */
  --texto:      #f0f0f2;
  --muted:      #9a9aa2;   /* 6,2:1 sobre el fondo: pasa AA */

  /* Acento: el naranja de la marca. Es el ÚNICO color de acento. */
  --naranja:    #ff6b00;
  --naranja-cl: #ff9040;   /* el naranja como TEXTO */
  --naranja-db: rgba(255,107,0,.14);

  /* Estado */
  --ok:         #3ecf8e;
  --alerta:     #ffb020;
  --peligro:    #ff5252;
  --ok-db:      rgba(62,207,142,.15);
  --alerta-db:  rgba(255,176,32,.15);
  --peligro-db: rgba(255,82,82,.15);

  /* La "chapa" de arriba: barra del logo, acciones y solapas.
     En OSCURO va igual que el resto; en CLARO queda gris oscuro a propósito. */
  --chapa-bg:     #232327;
  --chapa-bg2:    #1a1a1e;
  --chapa-borde:  #3a3a41;
  --chapa-txt:    #f0f0f2;
  --chapa-muted:  #9a9aa2;
  --chapa-activa: #ff9040;

  /* Fondo de las casillas del formulario. Va MÁS OSCURO que la tarjeta que las
     rodea: una casilla se tiene que ver hundida, no sobresalir. Antes usaban
     --panel-alt, que es más CLARO que la tarjeta, y parecían botones. */
  --campo-bg:   #15151a;

  /* Colores que SIGNIFICAN algo y no se tocan: el celeste de los
     alternativos y los de cada tipo de espacio aéreo. */
  --alt-color:  #35b7d6;
  --sombra:     rgba(0,0,0,.5);
  --mapa-bg:    #0f1116;

  /* ------------------------- TIPOGRAFÍA -------------------------
     UNA sola fuente en toda la app. Antes los códigos, las frecuencias y las
     horas iban en monoespaciada; se sacó a propósito.
     ⚠️ Helvetica no viene instalada en Windows: ahí cae en Arial, que tiene
     exactamente las mismas medidas. No se descarga ninguna fuente: la app
     tiene que andar sin internet. */
  --fuente: Helvetica, "Helvetica Neue", Arial, "Liberation Sans", sans-serif;
  /* El CUERPO se queda como está. Lo que sube un punto y engorda es todo lo
     que ROTULA: etiquetas de campo, solapas, encabezados de tabla, píldoras.
     Eran demasiado tenues al lado del dato que describen. */
  --t-base:   13px;
  --t-etq:    12.5px;   /* etiqueta de campo y de dato */
  --t-valor:  15px;
  --t-titulo: 14.5px;   /* título de tarjeta */
  --t-chico:  12px;
  --t-mini:   11px;
  --peso-etq: 600;      /* semi-negrita de los rótulos */

  --radio:      8px;
  --radio-btn:  6px;
  --pad-card:   14px;
  /* Separación general. Las TARJETAS llevan más aire que el resto: apretadas
     se leen como una lista continua y cuesta ver dónde termina una y empieza
     la siguiente. */
  --gap:        12px;
  --gap-cards:  18px;
}

/* ---------------------------- TEMA CLARO ---------------------------- */
:root[data-theme="light"] {
  --negro:      #eef0f3;
  --panel:      #ffffff;
  --panel-alt:  #f5f6f8;
  --borde:      #dfe3e8;
  --texto:      #1a1d23;
  --muted:      #5f6570;   /* 5,9:1 sobre blanco */
  --naranja:    #ff6b00;
  /* El naranja como TEXTO sobre claro tiene que ser más oscuro para leerse:
     el #c85400 que se usaba antes daba 4,45 y se quedaba a 0,05 de pasar. */
  --naranja-cl: #b84c00;   /* 5,2 sobre blanco */
  --naranja-db: rgba(255,107,0,.12);
  --ok:         #177349;   /* el #1f8a5b daba 4,33: no pasaba */
  --alerta:     #9a6100;
  --peligro:    #c62828;
  --ok-db:      rgba(23,115,73,.12);
  --alerta-db:  rgba(154,97,0,.12);
  --peligro-db: rgba(198,40,40,.10);

  /* La chapa NO se pone blanca: queda gris oscuro y ancla la pantalla. */
  --chapa-bg:     #2b3038;
  --chapa-bg2:    #22262d;
  --chapa-borde:  #3d434c;
  --chapa-txt:    #eef0f3;   /* 11,6:1 */
  --chapa-muted:  #b9bec7;   /*  7,1:1 */
  --chapa-activa: #ff9040;   /*  5,9:1 */
  --campo-bg:     #eef1f5;   /* más oscuro que la tarjeta blanca */

  --alt-color:  #0e7fa0;
  --sombra:     rgba(20,30,50,.18);
  --mapa-bg:    #e8ebf0;
}

* { box-sizing: border-box; }

/* ⚠️ NO HABÍA NINGUNA REGLA GLOBAL PARA LOS ENLACES. Cualquier <a> sin clase
   salía con el AZUL DE FÁBRICA del navegador (#0000EE), que sobre el tema
   oscuro es casi ilegible y en los dos temas no tiene nada que ver con la
   paleta. Pasaba, por ejemplo, con el enlace al AIP del panel de espacios
   aéreos. Se arregla en la base para que no vuelva a colarse ninguno. */
a { color: var(--naranja-cl); text-decoration-color: rgba(255,144,64,.45); }
a:hover { text-decoration-color: currentColor; }
a:focus-visible { outline: 2px solid var(--naranja); outline-offset: 2px; border-radius: 3px; }
/* En la hoja impresa los enlaces van en negro: el naranja sale gris claro. */
.hoja-papel a { color: #000 !important; }

html, body { height: 100%; }

body {
  margin: 0;
  font-family: var(--fuente);
  background: var(--negro);
  color: var(--texto);
  font-size: var(--t-base);
  line-height: 1.45;
  /* Cifras del mismo ancho donde la fuente lo soporte. No está garantizado en
     todos los sistemas, pero acá no molesta: los valores van cada uno en su
     celda y la alineación entre filas la da la grilla, no la fuente. */
  font-variant-numeric: tabular-nums;
}

/* UNA sola fuente, de verdad. Hay tres cosas que NO la heredan solas:
     · los <button>, <input> y <select>, que usan la del sistema operativo;
     · los <code> (los comandos del panel "Estado de los datos");
     · lo que trae Leaflet: los carteles del mapa y los botones de zoom, que
       define su propio CSS con "Helvetica Neue" y "Lucida Console". */
button, input, select, textarea, code, kbd, samp, pre,
.leaflet-container, .leaflet-container a, .leaflet-control,
.leaflet-control-zoom-in, .leaflet-control-zoom-out {
  font-family: var(--fuente);
}

/* ===================== BARRAS DE DESPLAZAMIENTO =====================
   Que sigan el tema en vez de ser las grises del sistema operativo, que en
   modo oscuro se ven como una franja clara pegada al costado. */
* { scrollbar-color: var(--borde) transparent; scrollbar-width: thin; }
::-webkit-scrollbar { width: 11px; height: 11px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
  background: var(--borde); border-radius: 999px;
  border: 3px solid transparent; background-clip: content-box;
}
::-webkit-scrollbar-thumb:hover { background: var(--muted); background-clip: content-box; }
::-webkit-scrollbar-corner { background: transparent; }

/* ================================ ÍCONOS ================================
   Todos SVG de trazo, heredan el color del texto. Ni un emoji: los emoji los
   dibuja el sistema operativo y salen distintos en cada máquina. */
.ico {
  width: 16px; height: 16px; flex: 0 0 auto; display: block;
  fill: none; stroke: currentColor; stroke-width: 1.7;
  stroke-linecap: round; stroke-linejoin: round;
}
.solapa .ico { width: 17px; height: 17px; }
.chip .ico, .badge-legal .ico { width: 11px; height: 11px; stroke-width: 2.3; }
/* Cuál de las frecuencias de una misma dependencia es el canal principal.
   Va PRIMERO en el renglón, con ancho fijo, para que las etiquetas queden
   alineadas en columna y se lean de un vistazo. */
.freq-canal { flex: 0 0 auto; min-width: 34px; text-align: center;
  font-size: 9.5px; font-weight: 700; letter-spacing: .3px;
  padding: 1px 4px; border-radius: 3px;
  border: 1px solid var(--borde); color: var(--muted); white-space: nowrap; }
.freq-canal.es-principal { border-color: var(--naranja); color: var(--naranja-cl); }
.card-flecha .ico { width: 13px; height: 13px; }

/* ======================= PANTALLA DE INGRESO ======================= */
.cuenta { position: fixed; inset: 0; z-index: 9000; overflow: auto;
  display: flex; align-items: center; justify-content: center; padding: 24px;
  background: var(--negro); }
.cuenta.oculto { display: none; }
.cuenta-caja { width: 100%; max-width: 380px; position: relative; }
/* "Volver": flecha a la IZQUIERDA y arriba, que es donde la busca cualquiera.
   Antes era una cruz a la derecha, y una cruz dice "cerrar" cuando lo que hace
   en realidad es volver a la página anterior. */
.cuenta-cerrar {
  /* ⚠️ `fixed` y NO `absolute`: pegado a la ESQUINA DE LA PANTALLA, no a la
     esquina del formulario. Con `absolute` se apoyaba en la caja del
     formulario, que en el celular está centrada a media altura, y la flecha
     terminaba a 227 px del borde de arriba, encima del logo. Además, como la
     pantalla de ingreso puede scrollear, `fixed` la deja siempre a la vista. */
  position: fixed; top: var(--e3); left: var(--e3); z-index: 2;
  display: inline-flex; align-items: center; gap: 6px;
  background: none; border: 0; padding: 6px 8px;
  color: var(--muted); font-family: inherit;
  font-size: var(--t-chico); font-weight: var(--peso-etq);
  line-height: 1; cursor: pointer; border-radius: var(--radio-btn);
}
.cuenta-cerrar .ico { width: 16px; height: 16px; }
.cuenta-cerrar:hover { color: var(--texto); background: var(--panel-alt); }
.cuenta-logo { display: block; height: 46px; width: auto; color: var(--texto); margin: 0 auto; }
.cuenta-bajada { text-align: center; color: var(--muted); font-size: var(--t-chico);
  margin: 8px 0 22px; }
.cuenta-solapas { display: flex; border-bottom: 1px solid var(--borde); margin-bottom: 18px; }
.cuenta-solapa { flex: 1; background: none; border: 0; cursor: pointer; font-family: inherit;
  color: var(--muted); font-size: var(--t-base); font-weight: var(--peso-etq);
  padding: 10px 0; border-bottom: 2px solid transparent; }
.cuenta-solapa.activa { color: var(--texto); border-bottom-color: var(--naranja); }
.cuenta-form { display: flex; flex-direction: column; gap: 14px; }
.cuenta-form.oculto { display: none; }
.cuenta-btn { width: 100%; justify-content: center; text-decoration: none; }
.cuenta-aviso { border: 1px solid var(--borde); border-left: 3px solid var(--naranja);
  background: var(--panel); border-radius: 8px; padding: 11px 13px; margin-bottom: 16px;
  font-size: var(--t-chico); line-height: 1.55; }
.cuenta-aviso.oculto { display: none; }
.cuenta-aviso.mal { border-left-color: var(--peligro); }
.cuenta-aviso.bien { border-left-color: var(--ok); }
.cuenta-aviso a { color: var(--naranja-cl); word-break: break-all; }
.cuenta-o { display: flex; align-items: center; gap: 10px; margin: 18px 0;
  color: var(--muted); font-size: var(--t-mini); }
.cuenta-o::before, .cuenta-o::after { content: ''; flex: 1; height: 1px; background: var(--borde); }
.cuenta-google.oculto { display: none; }
/* ---------------- Cuenta: nombre + menú desplegable ------------------
   El nombre pasó de 15 px a 13,8 px: a mitad de camino entre el cuerpo de la
   app (13) y los títulos de tarjeta (14,5). Era el texto más grande de la
   barra y competía con el logo. */
.usuario-menu { position: relative; }
.usuario-menu.oculto { display: none; }
.barra-usuario {
  display: flex; align-items: center; gap: 7px;
  font-size: 13.8px; font-weight: var(--peso-etq); color: var(--chapa-txt);
  white-space: nowrap; cursor: pointer;
  background: none; border: 1px solid transparent; border-radius: 999px;
  padding: 4px 8px 4px 4px;
}
.barra-usuario:hover { border-color: var(--chapa-borde); background: rgba(255,255,255,.05); }
.barra-usuario[aria-expanded="true"] { border-color: var(--chapa-borde); background: rgba(255,255,255,.07); }
.usuario-flecha { width: 13px; height: 13px; opacity: .7; transition: transform .15s; }
.barra-usuario[aria-expanded="true"] .usuario-flecha { transform: rotate(180deg); }
/* La inicial, en una bocha naranja: identifica la cuenta de un vistazo */
.usuario-inicial {
  display: grid; place-items: center; width: 24px; height: 24px; flex: 0 0 auto;
  border-radius: 50%; background: var(--naranja); color: #14140f;
  font-size: 12px; font-weight: 800; text-transform: uppercase;
}
.usuario-pop {
  position: absolute; top: calc(100% + 8px); right: 0; z-index: 7000;
  min-width: 232px; padding: 6px;
  background: var(--panel); border: 1px solid var(--borde); border-radius: 10px;
  box-shadow: 0 10px 30px rgba(0,0,0,.45);
}
.usuario-pop.oculto { display: none; }
.usuario-cab { display: flex; align-items: center; gap: 9px; padding: 8px 9px 10px; }
.usuario-cab .usuario-inicial { width: 32px; height: 32px; font-size: 14px; }
.usuario-datos { min-width: 0; display: flex; flex-direction: column; }
.usuario-datos strong { font-size: 13px; }
.usuario-datos span { font-size: 11px; color: var(--muted);
  overflow: hidden; text-overflow: ellipsis; }
.usuario-datos span.oculto { display: none; }
.usuario-item {
  display: flex; align-items: center; gap: 9px; width: 100%;
  padding: 8px 9px; border-radius: 7px; cursor: pointer; text-align: left;
  background: none; border: 0; color: var(--texto); font-size: 12.5px;
}
.usuario-item:hover { background: var(--panel-alt); }
.usuario-item .ico { width: 15px; height: 15px; flex: 0 0 auto; color: var(--muted); }
.usuario-item.usuario-salir:hover { color: #ff8080; }
.usuario-item.usuario-salir:hover .ico { color: #ff8080; }
.usuario-sep { height: 1px; background: var(--borde); margin: 5px 4px; }

/* ---------------- Interruptor de tema: media luna + on/off ------------ */
.tema-sw {
  display: flex; align-items: center; gap: 7px;
  background: none; border: 0; cursor: pointer; padding: 4px 2px;
}
.tema-luna { width: 16px; height: 16px; color: var(--chapa-txt); opacity: .85;
  fill: currentColor; stroke: none; }
.tema-riel {
  position: relative; width: 34px; height: 18px; border-radius: 999px;
  background: var(--chapa-borde); transition: background .15s;
}
.tema-bocha {
  position: absolute; top: 2px; left: 2px; width: 14px; height: 14px;
  border-radius: 50%; background: #fff; transition: transform .15s;
}
/* Prendido = modo oscuro (la luna está "encendida") */
.tema-sw[aria-checked="true"] .tema-riel { background: var(--naranja); }
.tema-sw[aria-checked="true"] .tema-bocha { transform: translateX(16px); }
.tema-sw[aria-checked="true"] .tema-luna { color: var(--naranja); opacity: 1; }

/* ======================= MENÚ LATERAL =======================
   Pegado al borde, sin márgenes. Cerrado se ven sólo los íconos; al pasarle
   el mouse se despliega POR ENCIMA del contenido.
   ⚠️ El que se agranda es `.lat-caja`, que está posicionada en absoluto: si
   creciera la propia columna, todo lo de la derecha se correría de lugar y el
   plan se re-maquetaría cada vez que el mouse pasa cerca. */
.marco { flex: 1 1 auto; min-height: 0; display: flex; }
.marco-der { flex: 1 1 auto; min-width: 0; min-height: 0;
  display: flex; flex-direction: column; }

/* ⚠️ z-index ALTO. Leaflet pone sus paneles en 400 y sus controles (el +/− del
   zoom) en 800-1000, y el mapa de la vista de aeródromos ocupa toda la pantalla:
   con el 60 que tenía, al desplegarse el menú quedaba POR DEBAJO del mapa.
   1500 lo deja arriba del mapa pero abajo de las capas que sí tienen que taparlo:
   la ficha del aeródromo (2000), el "calculando" (3000) y la pantalla de cuenta
   (9000). */
.lateral { flex: 0 0 var(--lat-ancho, 52px); position: relative; z-index: 1500; }
.lat-caja {
  position: absolute; inset: 0 auto 0 0;
  width: var(--lat-ancho, 52px);
  display: flex; flex-direction: column; gap: 2px;
  padding: 10px 8px;
  /* El mismo gris que la barra de solapas del vuelo: son la misma "chapa" */
  background: var(--chapa-bg2);
  border-right: 1px solid var(--chapa-borde);
  overflow: hidden;
  transition: width .16s ease, box-shadow .16s ease;
}
.lateral:hover .lat-caja, .lateral:focus-within .lat-caja {
  width: 214px;
  box-shadow: 6px 0 22px var(--sombra);
}
.lat-item { display: flex; align-items: center; gap: 12px; width: 198px;
  background: none; border: 0; cursor: pointer; font-family: inherit;
  color: var(--chapa-muted); font-size: 13.5px; font-weight: 500;
  padding: 10px 9px; border-radius: var(--radio-btn); text-align: left; white-space: nowrap; }
.lat-item:hover:not(:disabled) { color: var(--chapa-txt); background: rgba(255,255,255,.07); }
.lat-item.activa { color: var(--chapa-activa); background: var(--naranja-db); }
.lat-item:disabled { opacity: .35; cursor: not-allowed; }
.lat-item .ico { width: 18px; height: 18px; flex: 0 0 auto; }
/* El rótulo aparece con el despliegue; sin esto, cerrado, se ve un pedacito */
.lat-item span { opacity: 0; transition: opacity .12s ease; }
.lateral:hover .lat-item span, .lateral:focus-within .lat-item span { opacity: 1; }

/* La hora UTC, abajo de todo y sólo con el menú desplegado */
.lat-reloj { margin-top: auto; padding: 10px 9px 2px; white-space: nowrap;
  font-size: var(--t-mini); color: var(--chapa-muted);
  border-top: 1px solid var(--chapa-borde);
  opacity: 0; transition: opacity .12s ease; }
.lateral:hover .lat-reloj, .lateral:focus-within .lat-reloj { opacity: 1; }

/* ======================= MIENTRAS SE CALCULA =======================
   Tapa el CONTENIDO, no los menús: mientras espera, el piloto tiene que
   seguir viendo dónde está parado. */
.calculando { position: fixed; z-index: 3000;
  display: flex; align-items: center; justify-content: center;
  background: rgba(10, 10, 12, .62); backdrop-filter: blur(1.5px); }
.calculando.oculto { display: none; }
/* ⚠️ BLANCO SIEMPRE, con el tema que sea. El velo de atrás es negro al 62% en
   los dos temas; con `--texto` el texto salía negro sobre negro en tema claro
   y no se leía nada. Los colores van escritos acá y no como tokens a propósito:
   lo que manda no es el tema de la app, es el velo. */
.calc-caja { display: flex; flex-direction: column; align-items: center; gap: 12px;
  color: #f2f2f4; }
.calc-rueda { width: 54px; height: 54px; color: var(--naranja);
  animation: girar 900ms linear infinite; }
@keyframes girar { to { transform: rotate(360deg); } }
.calc-txt { font-size: var(--t-base); font-weight: var(--peso-etq); }
.calc-reloj { font-size: 11.5px; color: #c3c3cb; min-height: 1.2em; text-align: center; max-width: 300px; }

/* ======================= EL PANEL ======================= */
/* La primera fila son cuatro paneles y van TODOS del mismo alto: con alturas
   distintas la fila se ve rota. `align-items: stretch` (el de fábrica) los
   iguala; el contenido de cada uno se empuja hacia arriba. */
.panel-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: var(--gap-cards);
  /* Alto mínimo SÓLO de la primera fila (los cuatro cuadros de arriba). Los
     cuatro comparten alto, y lo marcaba el más alto: al primero —el del último
     plan, que es el que más mete: dos aeródromos grandes, el avión y cuatro
     botones— le quedaban 52 px de aire contra 92 del de la rosca.
     `grid-template-rows` con UNA sola medida toca nada más que la fila 1: la
     de "Vuelos recientes" es implícita y sigue midiendo lo que necesita. */
  grid-template-rows: minmax(285px, auto); }
.panel-grid > .card { display: flex; flex-direction: column; }
.panel-grid > .card > :last-child { margin-top: auto; }
@media (max-width: 1240px) { .panel-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 700px)  { .panel-grid { grid-template-columns: 1fr; } }
.panel-tit { display: flex; align-items: baseline; gap: 8px; margin: 0 0 12px; }
.panel-tit h3 { font-size: var(--t-titulo); font-weight: 700; margin: 0; }
.panel-tit .sub { font-size: var(--t-mini); color: var(--muted); margin-left: auto; }

/* Último plan: el par de aeródromos, grande */
.ult-par { display: flex; align-items: center; justify-content: center; gap: 14px;
  margin: 6px 0 2px; }
.ult-ad { text-align: center; min-width: 0; }
.ult-icao { font-size: 19px; font-weight: 700; letter-spacing: .5px; }
.ult-nom { font-size: var(--t-mini); color: var(--muted); line-height: 1.25;
  max-width: 110px; margin: 2px auto 0; }
.ult-avion { text-align: center; font-size: var(--t-chico); color: var(--muted); margin: 6px 0 0; }
.ult-avion strong { color: var(--texto); }
.ult-flecha { color: var(--naranja); flex: 0 0 auto; }
.ult-flecha .ico { width: 26px; height: 26px; }
/* Los atajos de cada caja del Panel, en DOS columnas y no apilados: apilados
   estiraban la caja y rompían la fila pareja de la primera hilera.
   `margin-top: auto` (de `.panel-grid > .card > :last-child`) los deja siempre
   pegados abajo, así arrancan a la misma altura en las cuatro cajas. */
.panel-botones {
  /* ⚠️ DOS COLUMNAS FIJAS, NO `auto-fit`. Con `repeat(auto-fit, minmax(112px,
     1fr))` la cantidad de columnas cambiaba con el ancho de la tarjeta: cuatro
     botones se veían 2×2 en una pantalla y 1×4 en otra, así que el mismo botón
     estaba en un lugar distinto según el tamaño de la ventana. Ahora la
     disposición NO cambia nunca: los botones sólo se estiran. */
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 6px; margin-top: 10px;
  /* ⚠️ El `padding` va ADEMÁS del `margin`, y no por gusto: en la tarjeta del
     gráfico de planes el margen queda anulado y el botón terminaba pegado
     contra las barras (medido: 0 px de separación, contra 12 px en las demás).
     Un padding no se puede colapsar ni anular por el de al lado, así que
     garantiza el aire en todas las tarjetas. */
  padding-top: 12px;
}
.panel-botones .btn {
  width: 100%; justify-content: center; text-align: center;
  padding: 6px 9px; font-size: 12px; line-height: 1.2;
}
/* Un botón solo, o el último de una cantidad impar, ocupa la fila entera: si no
   queda un hueco al lado que se ve como si faltara algo. */
.panel-botones .btn:only-child,
.panel-botones .btn:nth-child(odd):last-child { grid-column: 1 / -1; }
/* En pantalla angosta, uno abajo del otro: dos botones de 70 px no se leen. */
@media (max-width: 520px) {
  .panel-botones { grid-template-columns: 1fr; }
}

/* ===========================================================================
   AERÓDROMOS FAVORITOS (arriba del panel)
   ===========================================================================
   Cuadraditos con SÓLO el código. Son los campos de siempre: el de base, el
   del aeroclub, los dos o tres a los que uno vuela seguido. */
/* ⚠️ EL AIRE DE ARRIBA Y EL DE ABAJO, IGUALES. La tira no es una tarjeta: es
   una hilera de atajos de 34 px de alto, mobiliario de la barra más que
   contenido del panel. Con `--gap-cards` abajo (24 px) y 12 px arriba quedaba
   descentrada: pegada a la barra y con un hueco vacío debajo, que es lo que se
   ve como un error de maquetado. Con `--gap` a los dos lados la tira queda
   apoyada donde tiene que estar. */
.favs {
  display: flex; flex-wrap: wrap; align-items: center; gap: 7px;
  margin: 0 0 var(--gap);
}
.fav {
  display: inline-flex; align-items: stretch; overflow: hidden;
  border: 1px solid var(--borde); border-radius: 8px; background: var(--panel);
}
.fav-cod {
  border: 0; background: transparent; color: var(--texto); cursor: pointer;
  font-weight: 800; font-size: 13px; letter-spacing: .06em;
  padding: 7px 10px; font-family: inherit;
}
.fav:hover { border-color: var(--naranja); }
.fav-cod:hover { color: var(--naranja-cl); }
/* Acá había una ✕ para sacar de favoritos. Se fue: quedaba pegada al botón de
   abrir, del tamaño de un dedo y en la primera fila del panel, y se borraba un
   aeródromo sin querer. Ahora se saca desde la ficha (`.fad-fav`). */
/* En reposo es un "+" solo, del mismo tamaño que un cuadradito de código:
   la tira tiene que leerse como una hilera de aeródromos, no como un botón con
   una frase al final. Al pasar por encima se abre y dice qué hace.
   ⚠️ La transición va en `max-width` y no en `width`: con `width: auto` no
   hay nada que animar y el texto aparecería de golpe. */
.fav-mas {
  display: inline-flex; align-items: center; gap: 0;
  border: 1px dashed var(--borde); border-radius: 8px; background: transparent;
  color: var(--muted); cursor: pointer; font-size: 12px; padding: 7px 11px;
  font-family: inherit; white-space: nowrap;
}
.fav-mas-sig { font-size: 14px; line-height: 1; font-weight: 700; }
.fav-mas-txt {
  max-width: 0; overflow: hidden;
  transition: max-width .18s ease, margin-left .18s ease;
  margin-left: 0;
}
.fav-mas:hover .fav-mas-txt, .fav-mas:focus-visible .fav-mas-txt {
  max-width: 200px; margin-left: 6px;
}
.fav-mas:hover { border-color: var(--naranja); color: var(--naranja-cl); }
.favs-vacio { font-size: 12px; color: var(--muted); }
.fav-buscar { position: relative; }
.fav-buscar input {
  background: var(--campo-bg, var(--panel-alt)); color: var(--texto);
  border: 1px solid var(--naranja); border-radius: 8px;
  padding: 7px 10px; font-size: 12px; font-family: inherit; width: 210px;
}
/* En celular, la tira scrollea en horizontal en vez de apilarse en cuatro
   renglones y comerse la pantalla. */
@media (max-width: 520px) {
  .favs { flex-wrap: nowrap; overflow-x: auto; padding-bottom: 4px; }
  .fav, .fav-mas { flex-shrink: 0; }
  /* Sin mouse no hay hover: el botón se queda en "+" y lo explica el
     `aria-label` (y el lector de pantalla). */
  .fav-mas-txt { max-width: 0; margin-left: 0; }
}

/* Gráfico de planes por día, con la regla de cantidades a la izquierda. */
.panel-grid > .card.card-centrada { justify-content: center; }
.panel-grid > .card.card-centrada > :last-child { margin-top: 0; }
.barras-fila { display: flex; align-items: stretch; gap: 6px; margin-top: auto; }
.barras-eje {
  position: relative; flex: 0 0 auto; width: 18px; height: 82px;
  border-right: 1px solid var(--borde);
}
.barras-marca {
  position: absolute; right: 4px; transform: translateY(50%);
  font-size: 9px; color: var(--muted); line-height: 1; white-space: nowrap;
}
/* Cada marca lleva su rayita, que cruza el gráfico y hace legible la altura */
.barras-marca::after {
  content: ''; position: absolute; left: calc(100% + 4px); top: 50%;
  width: 1px; height: 1px; background: var(--borde);
}
.barras { flex: 1; display: flex; align-items: flex-end; gap: 2px; height: 82px;
  border-bottom: 1px solid var(--borde); padding-bottom: 0; }
.barra-dia { flex: 1; background: var(--naranja); border-radius: 2px 2px 0 0; min-height: 2px; opacity: .85; }
.barra-dia.cero { background: var(--borde); opacity: .5; }
.barras-pie { display: flex; justify-content: space-between; font-size: var(--t-mini);
  color: var(--muted); margin-top: 5px; }

/* Rosca de tipos de avión */
.rosca-fila { display: flex; align-items: center; gap: 14px; }
.rosca { width: 92px; height: 92px; flex: 0 0 auto; }
.rosca-lista { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.rosca-item { display: flex; align-items: center; gap: 7px; font-size: var(--t-chico); }
.rosca-pt { width: 9px; height: 9px; border-radius: 2px; flex: 0 0 auto; }
.rosca-pct { color: var(--muted); margin-left: auto; }
.panel-vacio { color: var(--muted); font-size: var(--t-chico); text-align: center;
  padding: 22px 8px; line-height: 1.6; }

/* Tabla de vuelos recientes */
.vuelos-tabla { width: 100%; border-collapse: collapse; font-size: var(--t-chico); }
.vuelos-tabla th { text-align: left; }
.vuelos-tabla td { padding: 8px 6px; border-bottom: 1px solid var(--borde); }
.vuelos-tabla tr:last-child td { border-bottom: 0; }
.vuelos-tabla .par { font-weight: 700; white-space: nowrap; }
.vuelo-acciones { display: flex; gap: 6px; justify-content: flex-end; }
/* La fila entera abre el vuelo: no hace falta apuntarle a un botón chiquito */
.fila-vuelo { cursor: pointer; }
.fila-vuelo:hover td { background: var(--panel-alt); }
.fila-vuelo:focus-visible { outline: 2px solid var(--naranja); outline-offset: -2px; }

/* Adelanto: lo que todavía no tiene backend va marcado como tal */
.adelanto { border: 1px dashed var(--borde); border-radius: var(--radio);
  padding: 26px 20px; text-align: center; color: var(--muted); line-height: 1.65; }
.adelanto .ico { width: 34px; height: 34px; opacity: .5; margin-bottom: 10px; }
.adelanto h4 { color: var(--texto); font-size: var(--t-titulo); margin: 0 0 8px; }
.etq-adelanto { display: inline-block; font-size: var(--t-mini); font-weight: 700;
  color: var(--naranja-cl); border: 1px solid var(--naranja); border-radius: 999px;
  padding: 2px 9px; margin-bottom: 12px; }

/* ---------------------- Barra superior ---------------------- */
.barra {
  display: flex;
  align-items: center;
  /* ⚠️ `flex-start`, NO `space-between`. Quién va a la izquierda y quién a la
     derecha lo decide un margen automático en el interruptor de tema (ver
     `.tema-sw` más abajo), porque ese botón cambia de lado según el tamaño de
     pantalla. Con `space-between` los tres grupos se repartían solos y el
     interruptor quedaba flotando en el medio. */
  justify-content: flex-start;
  gap: 12px;
  padding: 8px 14px;
  background: var(--chapa-bg);
  color: var(--chapa-txt);
  border-bottom: 1px solid var(--chapa-borde);
}

/* El logo es un SVG entero. El isotipo (la brújula) lleva su naranja adentro
   del dibujo; las letras heredan `currentColor`, así que basta con darle color
   al contenedor para que funcione en los dos temas. */
.logo {
  line-height: 0; background: none; border: 0; padding: 0; cursor: pointer;
  border-radius: 6px;
}
.logo:focus-visible { outline: 2px solid var(--naranja); outline-offset: 3px; }
.logo-svg {
  /* Con las proporciones reales la brújula ocupa 2,3 veces la altura de las
     letras, así que el conjunto tiene que ir más alto para que el logotipo se
     siga leyendo. A 34 px la mayúscula queda en ~15 px. */
  display: block;
  height: 34px;
  width: auto;
  color: var(--chapa-txt);
}

.barra-info { display: flex; align-items: center; gap: 7px; flex-wrap: wrap;
  justify-content: flex-end; min-width: 0; }
.chip {
  display: inline-flex; align-items: center; gap: 4px;
  font-size: var(--t-mini);
  font-weight: 700;
  letter-spacing: .3px;
  padding: 3px 9px;
  border-radius: 999px;
  background: transparent;
  border: 1px solid var(--chapa-borde);
  color: var(--chapa-muted);
  white-space: nowrap;
}
.chip-alerta {
  background: rgba(255, 82, 82, .16);
  border-color: #ff5252;
  color: #ff8a8a;
}

/* Botón de tema claro/oscuro */
.btn-tema {
  width: 30px; height: 30px; border-radius: var(--radio-btn);
  background: transparent; border: 1px solid var(--chapa-borde);
  color: var(--chapa-muted); cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center;
  transition: border-color .15s, color .15s;
}
.btn-tema:hover { border-color: var(--naranja); color: var(--chapa-activa); }

/* ==================== BARRA DE ACCIONES ====================
   Cambia de VISTA: datos del vuelo ⇄ plan. */
/* ⚠️ LAS SOLAPAS SE ACOMODAN EN VARIOS RENGLONES, NO SE VAN DE COSTADO.
   Con `overflow-x: auto` y una sola fila, en un celular de 375 px la barra
   medía 375 y su contenido 917: cuatro de las siete solapas quedaban FUERA de
   la pantalla y no había forma de tocarlas salvo adivinar que se puede
   arrastrar. Eso es lo que se veía como "el menú se corta a la mitad".
   Envolviendo, todas quedan siempre a la vista y al alcance del dedo. */
.acciones {
  display: flex; flex-wrap: wrap; gap: 2px; padding: 0 10px;
  background: var(--chapa-bg2); border-bottom: 1px solid var(--chapa-borde);
}
.acciones::-webkit-scrollbar { display: none; }
.accion {
  flex: 0 0 auto; display: flex; align-items: center; gap: 6px;
  padding: 9px 12px; border: 0; background: none; cursor: pointer;
  color: var(--chapa-muted); font-size: 13.5px; font-weight: 500;
  border-bottom: 2px solid transparent; white-space: nowrap; font-family: inherit;
  transition: color .15s;
}
.accion:hover:not(:disabled) { color: var(--chapa-txt); }
.accion.activa { color: var(--chapa-activa); border-bottom-color: var(--naranja); }
/* Sin plan calculado no hay nada que mostrar: se ven grisados y no responden */
.accion:disabled { opacity: .35; cursor: not-allowed; }
.accion:disabled.activa { border-bottom-color: transparent; }
.accion.sep-izq { margin-left: auto; }

/* Lo único que queda pegado al scrollear */
/* Lo que queda clavado arriba: la barra de acciones del vuelo, las solapas y
   los avisos. En escritorio da igual (ahí sólo scrollea la columna izquierda,
   así que esto nunca se va de la pantalla); en el celular es lo que hace que no
   haya que volver al principio para cambiar de sección. */
.pegajoso { position: sticky; top: 0; z-index: 45; }

/* ========================== SOLAPAS ==========================
   NAVEGAN POR SCROLL: llevan a la sección y se iluminan solas según dónde
   estás leyendo. No cambian de pantalla, así nada queda escondido detrás de
   un click que no hiciste. */
.solapas {
  display: flex; gap: 2px; padding: 0 10px;
  background: var(--chapa-bg); border-bottom: 1px solid var(--chapa-borde);
  overflow-x: auto; scrollbar-width: none;
}
.solapas::-webkit-scrollbar { display: none; }
.solapas[hidden] { display: none; }
.solapa {
  position: relative; flex: 0 0 auto;
  display: flex; flex-direction: column; align-items: center; gap: 2px;
  min-width: 62px; padding: 7px 10px 5px; border: 0; background: none; cursor: pointer;
  color: var(--chapa-muted); font-size: var(--t-mini); font-weight: 700;
  font-family: inherit; border-bottom: 3px solid transparent; text-decoration: none;
}
.solapa:hover { color: var(--chapa-txt); background: rgba(255,255,255,.05); }
.solapa.activa { color: var(--chapa-activa); border-bottom-color: var(--naranja);
  background: var(--naranja-db); }
.solapa .punto {
  position: absolute; top: 5px; right: 9px;
  width: 6px; height: 6px; border-radius: 50%; background: var(--peligro);
}

/* ======================= FRANJA DE AVISOS =======================
   Siempre visible, en las dos vistas: un NOTAM grave o un SIGMET en ruta no
   puede quedar escondido detrás de una solapa que no abriste. */
.avisos {
  display: flex; align-items: center; gap: 7px;
  padding: 7px 14px; background: var(--panel-alt);
  border-bottom: 1px solid var(--borde);
  overflow-x: auto; scrollbar-width: none;
}
.avisos::-webkit-scrollbar { display: none; }
.avisos[hidden] { display: none; }
.avisos-tit { font-size: var(--t-chico); color: var(--muted); font-weight: 700; flex: 0 0 auto; }
/* ⚠️ Cada aviso va en UN renglón: ícono y texto uno al lado del otro.
   `.badge-legal` es un elemento de línea, así que el SVG del ícono caía como
   un bloque y empujaba el texto abajo, dejando una caja del doble de alto. */
.avisos .badge-legal {
  cursor: pointer; flex: 0 0 auto;
  display: inline-flex; align-items: center; gap: 5px;
  padding: 3px 10px; line-height: 1.3;
}
.avisos .badge-legal .ico { width: 12px; height: 12px; stroke-width: 2.3; }
.avisos .badge-legal:hover { filter: brightness(1.18); }

/* ---------------------- Layout general ----------------------
   EN ESCRITORIO LA PÁGINA NO SCROLLEA. La ventana se reparte en columnas de
   alto fijo y el ÚNICO que scrollea es el contenido de la izquierda. Con eso:
     · la barra de arriba y las solapas quedan siempre a la vista,
     · el mapa nunca se va de pantalla.
   Se hace con flex y no con alturas calculadas a mano, así no hay ningún
   número mágico que se desincronice si cambia el alto de la barra. */
body { display: flex; flex-direction: column; height: 100vh; overflow: hidden; }
.barra, .acciones, .pegajoso { flex: 0 0 auto; }

.cuerpo {
  flex: 1 1 auto;
  min-height: 0;                 /* imprescindible: si no, el hijo no scrollea */
  display: grid;
  /* contenido · mapa (o la vista previa de la hoja). El menú lateral NO es una
     columna de esta grilla: vive afuera, para poder desplegarse por encima. */
  grid-template-columns: minmax(0, 1fr) 44%;
  gap: var(--gap);
  padding: var(--gap);
  align-items: stretch;
}
.col-izq {
  min-width: 0; min-height: 0;
  overflow-y: auto;              /* el único que scrollea */
  /* ⚠️ SIN `scroll-behavior: smooth`. Con la animación puesta, saltar a una
     sección depende de que el navegador la ejecute; donde no lo hace, el salto
     simplemente NO OCURRE y la solapa parece rota. Llegar siempre vale más que
     llegar con animación. */
  display: flex; flex-direction: column; gap: var(--gap);
  padding-right: 4px;            /* aire para la barra de scroll */
}
.col-der { min-width: 0; min-height: 0; display: flex; flex-direction: column; }
.col-der.oculto { display: none; }
.cuerpo.sin-derecha { grid-template-columns: minmax(0, 1fr); }
.mapa-pegado { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }

/* Las dos vistas comparten el mapa de la derecha */
.vista { display: none; }
.vista.activa { display: flex; flex-direction: column; gap: var(--gap-cards); }
/* ⚠️ Las tarjetas del formulario cuelgan de un <form>, que es UN solo hijo de
   la vista: el gap de la vista no las separa. El <form> necesita el suyo. */
#vista-form > form { display: flex; flex-direction: column; gap: var(--gap-cards); }

/* ==================== TARJETA DESPLEGABLE ====================
   Es el patrón de TODA la app: el formulario y cada panel del resultado.
   El `.bloque` de los resultados se convierte en `.card` desde app.js. */
.card, .bloque {
  background: var(--panel);
  border: 1px solid var(--borde);
  border-radius: var(--radio);
  overflow: hidden;
  scroll-margin-top: 104px;   /* que no quede tapada por lo pegajoso */
}
/* El encabezado. Plegado es una BARRA BAJA con el texto centrado en su alto;
   desplegado se separa un poco del contenido que abre. */
.card-cab {
  display: flex; align-items: center; gap: 9px;
  min-height: 34px;                       /* barra baja cuando está plegada */
  padding: 3px var(--pad-card);
  cursor: pointer; user-select: none;
}
.card-cab:hover { background: var(--panel-alt); }
/* Las del formulario son fijas: no se pliegan ni invitan a hacerlo */
#vista-form .card-cab { cursor: default; }
#vista-form .card-cab:hover { background: none; }
.card:not(.plegada) > .card-cab { padding-top: 10px; padding-bottom: 8px; }

/* El titular manda: es lo que se lee de un vistazo al recorrer la lista */
.card-tit {
  font-size: 16px; font-weight: 700; margin: 0; letter-spacing: -.2px;
  color: var(--texto); line-height: 1.2;
}
.card-tit small { font-weight: 400; color: var(--muted); font-size: var(--t-chico); margin-left: 5px; }
.card-cab .relleno { flex: 1; }

/* Lo que resume el panel, a la derecha del titular ("4 críticos", "348 nm").
   ⚠️ SÓLO CON EL PANEL PLEGADO: está para poder leer el panel sin abrirlo. Con
   el panel abierto los mismos números están adentro, más grandes y con su
   rótulo, a dos centímetros de ahí. */
.card-resumen { display: none; }
.plegada > .card-cab .card-resumen {
  display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
  justify-content: flex-end; font-size: var(--t-chico); color: var(--muted);
}
.card-resumen strong { color: var(--texto); font-weight: 700; }

.card-flecha {
  flex: 0 0 auto; width: 26px; height: 26px; display: grid; place-items: center;
  color: var(--muted); transition: transform .18s;
}
.card-flecha .ico { width: 20px; height: 20px; stroke-width: 2; }
.card-cab:hover .card-flecha { color: var(--naranja-cl); }
.card-cuerpo { padding: 0 var(--pad-card) var(--pad-card); }
.card.plegada > .card-cuerpo { display: none; }
.card.plegada .card-flecha { transform: rotate(-90deg); }

/* Los paneles del resultado, separados entre sí.
   ⚠️ `.col-izq` tiene `gap`, pero todos los paneles viven DENTRO de
   `#resultado`, que es un solo hijo: sin esto quedaban pegados uno al otro. */
#resultado { display: flex; flex-direction: column; gap: var(--gap-cards); }

/* La cabecera del plan (SAAP → SAAC · VFR · Cessna 152) no se convierte en
   tarjeta desplegable porque no tiene título propio, así que el relleno no se
   lo pone `.card-cuerpo`: hay que dárselo acá. Sin esto el texto quedaba
   pegado al borde de la tarjeta. */
.card-simple { padding: 12px var(--pad-card); }
.card-simple .cabecera-plan { margin-bottom: 0; }
.card-simple .cabecera-plan + * { margin-top: 8px; }

/* Aire al final del resultado.
   ⚠️ NO es decorativo: sin él, las últimas secciones no pueden subir hasta la
   línea de lectura por más que se scrollee, y sus solapas no se iluminan
   nunca. Se comprobó: al ir a "Alternativos" se encendía "Mapas". */
#resultado:not(:empty)::after { content: ''; display: block; height: 45vh; }

/* ---------------------- Formulario ---------------------- */
.grid-form { display: grid; grid-template-columns: repeat(auto-fit, minmax(132px, 1fr)); gap: 10px; }
.campo-ancho { grid-column: span 2; }

.titulo-seccion {
  font-size: var(--t-chico);
  color: var(--muted);
  font-weight: 700;
  margin: 14px 0 8px;
}
.titulo-seccion:first-child { margin-top: 0; }

.fila-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }

/* Salida ⇄ destino: es el único par que de verdad va junto */
.par-campos, .fila-swap { display: flex; gap: 6px; align-items: flex-end; margin-bottom: 10px; }
.par-campos .campo, .fila-swap .campo { flex: 1; margin-bottom: 0; }
.btn-swap {
  flex: 0 0 auto; width: 30px; height: 38px; margin-bottom: 0;
  display: grid; place-items: center;
  background: var(--panel-alt); border: 1px solid var(--borde);
  border-radius: var(--radio-btn); color: var(--muted); cursor: pointer;
  transition: border-color .15s, color .15s;
}
.btn-swap:hover { border-color: var(--naranja); color: var(--naranja-cl); }

.campo { margin-bottom: 0; position: relative; }

/* Desplegable de autocompletado (aeródromos): propio, para poder ordenar por
   coincidencia de código y respetar el color del tema (el <datalist> nativo
   no se puede estilar y usa los colores del sistema operativo). */
.autocomplete-lista {
  position: absolute; top: 100%; left: 0; right: 0; z-index: 40;
  margin: 4px 0 0; padding: 4px;
  background: var(--panel); border: 1px solid var(--borde);
  border-radius: 8px; box-shadow: 0 6px 20px var(--sombra);
  max-height: 260px; overflow-y: auto;
  list-style: none;
}
.autocomplete-lista.oculto { display: none; }

/* ⚠️ LA TARJETA QUE TIENE UN AUTOCOMPLETADO NO PUEDE RECORTAR.
   `.card` trae `overflow: hidden` para que el encabezado desplegable respete
   las esquinas redondeadas. Pero la lista del autocompletado es `position:
   absolute` y cae POR DEBAJO del borde de la tarjeta, así que el recorte se la
   comía: en el campo "Alternativo 2", que es el último de su tarjeta, se veía
   nada más que el primer renglón y medio. No era que quedara atrás de otra
   cosa: estaba cortada.
   La tarjeta marcada con `card-lista` deja de recortar, y el redondeo de las
   esquinas se lo pone el encabezado por su cuenta. */
.card.card-lista { overflow: visible; }
.card.card-lista > .card-cab { border-radius: var(--radio) var(--radio) 0 0; }
.card.card-lista.plegada > .card-cab { border-radius: var(--radio); }
/* Y la lista tiene que ganarle a la tarjeta de abajo, que también pinta fondo. */
.card.card-lista .autocomplete-lista { z-index: 60; }
.autocomplete-item {
  padding: 8px 10px; border-radius: 6px; cursor: pointer;
  font-size: var(--t-base); color: var(--texto);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.autocomplete-item:hover { background: var(--panel-alt); }
.autocomplete-item.activo { background: var(--naranja); color: #fff; }

/* Etiqueta de campo y de dato: en minúscula, gris, chica. */
.campo label, .etq {
  display: block;
  font-size: var(--t-etq);
  font-weight: var(--peso-etq);
  color: var(--muted);
  margin-bottom: 4px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.campo select,
.campo textarea,
.campo input {
  width: 100%;
  height: 38px;
  padding: 0 10px;
  background: var(--campo-bg);
  border: 1px solid var(--borde);
  border-radius: var(--radio-btn);
  color: var(--texto);
  font-size: var(--t-base);
  font-family: inherit;
}
/* ⚠️ El `textarea` NO estaba en esta regla y quedaba con el estilo de fábrica
   del navegador: fondo blanco, borde gris y letra chica, en el medio de una
   pantalla oscura. Se le da el mismo aspecto que al resto y alto propio, que
   para eso es un campo de varios renglones. */
.campo textarea {
  height: auto; min-height: 72px; padding: 8px 10px;
  line-height: 1.45; resize: vertical;
}
.campo select:focus,
.campo textarea:focus,
.campo input:focus {
  outline: none;
  border-color: var(--naranja);
  box-shadow: 0 0 0 3px var(--naranja-db);
}
.campo input::placeholder,
.campo textarea::placeholder { color: var(--muted); opacity: .7; }

.ayuda { font-size: var(--t-chico); color: var(--muted); margin: 7px 0 0; }

/* ======================================================================
   LOS TRES NIVELES DE TEXTO
   ======================================================================
   Nivel 1 (lo que impide volar) usa `.ruta-cobertura`/`.alerta`, que ya
   existían y no cambian. Acá van los otros dos.

   NIVEL 2 — LA MARQUITA DE LA FUENTE
   De dónde sale el dato. Tiene que estar (una app de vuelo tiene que poder
   auditarse) pero no hace falta leerlo cada vez. Es un `<details>` chiquito:
   se toca y se abre, sin JavaScript y sin depender del mouse.
   ⚠️ NO usar `title` para esto: en el celular no hay puntero, y un texto que
   sólo aparece al pasar el mouse por encima, en el celular no existe. */
.marca-fuente { display: inline-block; margin: 8px 0 0; }
.marca-fuente > summary {
  display: inline-flex; align-items: center; gap: 5px;
  list-style: none; cursor: pointer;
  font-size: var(--t-mini); color: var(--muted);
  border: 1px solid var(--borde); border-radius: 999px;
  padding: 1px 9px 2px;
}
.marca-fuente > summary::-webkit-details-marker { display: none; }
/* El puntito de la izquierda: hace que se lea como una marca y no como un
   botón de acción. */
.marca-fuente > summary::before {
  content: ''; width: 4px; height: 4px; border-radius: 50%;
  background: var(--muted); opacity: .7;
}
.marca-fuente > summary:hover { border-color: var(--naranja); color: var(--naranja-cl); }
.marca-fuente[open] > summary { border-color: var(--naranja); color: var(--naranja-cl); }
.marca-fuente-txt {
  font-size: var(--t-mini); color: var(--muted); line-height: 1.55;
  margin-top: 6px; padding-left: 10px; border-left: 2px solid var(--borde);
  max-width: 60ch;
}

/* NIVEL 3 — LA AYUDA DE "CÓMO SE USA", UNA SOLA VEZ
   La segunda vez que abrís la misma pantalla ya sabés cómo se usa. Se cierra
   con "Entendido" y no vuelve; se pueden traer todas de nuevo desde el menú de
   la cuenta. Se ve como una tarjeta suave y NO como un aviso: el ámbar y el
   rojo están reservados para lo que impide volar. */
.ayuda-uso {
  display: flex; align-items: flex-start; gap: var(--e3);
  background: var(--panel-alt); border: 1px solid var(--borde);
  border-radius: 8px; padding: 10px 12px; margin: 8px 0;
}
.ayuda-uso-txt { flex: 1; font-size: var(--t-chico); color: var(--muted); line-height: 1.55; }
.ayuda-uso-ok {
  flex-shrink: 0; align-self: center;
  background: none; border: 1px solid var(--borde); border-radius: 999px;
  color: var(--muted); font: inherit; font-size: var(--t-mini); font-weight: var(--peso-etq);
  padding: 3px 11px; cursor: pointer;
}
.ayuda-uso-ok:hover { border-color: var(--naranja); color: var(--naranja-cl); }
/* En el celular el botón al lado deja el texto en una columna de nada */
@media (max-width: 640px) {
  .ayuda-uso { flex-direction: column; gap: var(--e2); }
  .ayuda-uso-ok { align-self: flex-end; }
}
/* Al imprimir no va ninguna de las dos: la hoja de la piernera es para volar,
   no para aprender a usar la app. */
@media print {
  .ayuda-uso, .marca-fuente { display: none !important; }
}

/* ---------------------- Botones ---------------------- */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  height: 38px; padding: 0 16px; border-radius: var(--radio-btn);
  font-size: var(--t-base); font-weight: 700; font-family: inherit; cursor: pointer;
  border: 1px solid transparent;
}
.btn-1 { background: var(--naranja); color: #fff; border-color: var(--naranja); }
.btn-1:hover { filter: brightness(1.08); }
.btn-1:disabled { background: var(--panel-alt); border-color: var(--borde);
  color: var(--muted); cursor: wait; filter: none; }
.btn-2 { background: transparent; color: var(--texto); border-color: var(--borde); font-weight: 500; }
.btn-2:hover { border-color: var(--naranja); color: var(--naranja-cl); }
.btn-ancho { width: 100%; }
.btn-chico { height: 28px; padding: 0 10px; font-size: var(--t-chico); }

/* El aviso de "no usar para navegación real" es lo único del pie que se lee
   siempre: las seis líneas de fuentes están en la marquita, detrás. */
.pie-aviso { margin: 0 0 6px; }
.pie-fuente {
  margin-top: 4px;
  padding-top: 12px;
  border-top: 1px solid var(--borde);
  font-size: var(--t-mini);
  color: var(--muted);
  line-height: 1.6;
}

/* ---------------------- El mapa ---------------------- */
/* El mapa ocupa todo el alto disponible de su columna y no se mueve nunca */
.mapa-caja {
  position: relative;
  border: 1px solid var(--borde);
  border-radius: var(--radio);
  overflow: hidden;
  background: var(--panel);
  flex: 1 1 auto; min-height: 0;
  display: flex; flex-direction: column;
}
#mapa { flex: 1 1 auto; min-height: 260px; width: 100%; background: var(--mapa-bg); }

/* Barra de controles de capas del mapa */
/* ===========================================================================
   BOTÓN Y MENÚ DE CAPAS
   ===========================================================================
   El botón de capas de cualquier aplicación de mapas, abajo a la derecha. Antes
   las ocho casillas vivían en una tira permanente debajo del mapa, comiéndole
   alto al dibujo, que es lo único que hay que ver.
   ⚠️ z-index por encima de los paneles de Leaflet (400-700) pero por debajo de
   la ficha del espacio aéreo. */
.mapa-btn-capas {
  position: absolute; right: 12px; bottom: 12px; z-index: 1100;
  width: 38px; height: 38px; display: grid; place-items: center;
  border-radius: 9px; cursor: pointer;
  background: var(--panel); color: var(--texto);
  border: 1px solid var(--borde); box-shadow: 0 3px 12px var(--sombra);
}
.mapa-btn-capas:hover { border-color: var(--naranja); color: var(--naranja-cl); }
.mapa-btn-capas:focus-visible { outline: 2px solid var(--naranja); outline-offset: 2px; }

.mapa-capas {
  position: absolute; right: 12px; bottom: 58px; z-index: 1150;
  width: 232px; max-height: calc(100% - 76px); overflow-y: auto;
  padding: 10px 12px; border-radius: 10px;
  background: var(--panel); border: 1px solid var(--borde);
  box-shadow: 0 6px 22px var(--sombra);
  font-size: var(--t-chico); color: var(--muted);
  display: flex; flex-direction: column; gap: 10px;
}
.capas-cab { display: flex; align-items: center; justify-content: space-between; }
.capas-cab strong { color: var(--texto); font-size: 13px; }
.capas-cerrar {
  background: none; border: 0; color: var(--muted); cursor: pointer; font-size: 13px;
  padding: 2px 4px; border-radius: 4px;
}
.capas-cerrar:hover { color: var(--texto); }
.capas-grupo { display: flex; flex-direction: column; gap: 5px; }
.capas-grupo + .capas-grupo { border-top: 1px solid var(--borde); padding-top: 9px; }
.capas-tit {
  font-size: 10px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase;
  color: var(--muted); opacity: .8;
}
/* Las opciones de fondo usan el mismo dibujo que las casillas, pero redondas:
   es la señal de "elegí una sola". */
.capas-grupo input[type="radio"] {
  appearance: none; -webkit-appearance: none;
  width: 15px; height: 15px; margin: 0; flex-shrink: 0;
  border: 1.5px solid var(--muted); border-radius: 50%;
  background: var(--negro); cursor: pointer;
  display: grid; place-content: center;
}
.capas-grupo input[type="radio"]::after {
  content: ''; width: 7px; height: 7px; border-radius: 50%;
  background: var(--naranja); transform: scale(0);
}
.capas-grupo input[type="radio"]:checked { border-color: var(--naranja); }
.capas-grupo input[type="radio"]:checked::after { transform: scale(1); }

.capas-herramienta {
  display: flex; align-items: center; gap: 8px;
  padding: 7px 9px; border-radius: 7px; cursor: pointer; font-family: inherit;
  background: var(--panel-alt); border: 1px solid var(--borde); color: var(--texto);
  font-size: 12px; text-align: left;
}
.capas-herramienta:hover { border-color: var(--naranja); }
.capas-herramienta.activa {
  background: var(--naranja-db); border-color: var(--naranja); color: var(--naranja-cl);
}

/* El cartel de la lupa: sigue al cursor y dice la altura del suelo. */
.elev-cartel {
  position: absolute; z-index: 1200; pointer-events: none;
  padding: 5px 9px; border-radius: 7px;
  background: var(--panel); border: 1px solid var(--naranja);
  box-shadow: 0 3px 12px var(--sombra);
  font-size: 12px; color: var(--texto); white-space: nowrap;
}
.elev-cartel.oculto { display: none; }
/* Mientras se consulta la altura del punto exacto donde está el cursor. Sin
   esto el cartel mostraba el número del punto ANTERIOR, firme y pegado al
   cursor, como si fuera el de ahí. */
.elev-cartel.cargando { min-width: 34px; }
.elev-cartel.cargando > * { display: none; }
.elev-cartel.cargando::after {
  content: ''; display: block; width: 13px; height: 13px; margin: 2px auto;
  border: 2px solid var(--borde); border-top-color: var(--naranja);
  border-radius: 50%; animation: elev-gira .7s linear infinite;
}
@keyframes elev-gira { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
  .elev-cartel.cargando::after { animation-duration: 2.4s; }
}
.elev-cartel strong { font-size: 14px; color: var(--naranja-cl); }
.elev-m { color: var(--muted); margin-left: 5px; }
.elev-sin { color: var(--muted); font-style: italic; }
/* Con la lupa prendida, la cruz deja claro que el mapa está midiendo. */
#mapa.modo-lupa, #mapa.modo-lupa .leaflet-grab, #mapa.modo-lupa .leaflet-interactive {
  cursor: crosshair !important;
}
.chk { display: flex; align-items: center; gap: 6px; cursor: pointer; }
/* ⚠️ `accent-color` SOLO PINTA LA CASILLA MARCADA. La casilla vacía la dibuja
   el navegador con su estilo nativo y, en tema oscuro, sale como un cuadrado
   NEGRO CON BORDE NEGRO sobre el panel oscuro: no se ve. Por eso se dibuja
   entera acá, con los colores del tema. */
.chk input[type="checkbox"] {
  appearance: none; -webkit-appearance: none;
  width: 15px; height: 15px; margin: 0; flex-shrink: 0;
  border: 1.5px solid var(--muted);
  border-radius: 4px;
  background: var(--negro);
  cursor: pointer;
  display: grid; place-content: center;
}
.chk input[type="checkbox"]::after {
  content: ''; width: 9px; height: 9px; background: #fff; transform: scale(0);
  /* El tilde, recortado de un cuadrado: no hace falta ninguna fuente ni
     imagen, y así funciona sin conexión como el resto de la app. */
  clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);
}
.chk input[type="checkbox"]:checked {
  background: var(--naranja); border-color: var(--naranja);
}
.chk input[type="checkbox"]:checked::after { transform: scale(1); }
.chk input[type="checkbox"]:hover { border-color: var(--naranja); }
.chk input[type="checkbox"]:focus-visible {
  outline: 2px solid var(--naranja); outline-offset: 2px;
}
/* No hay un `.oculto` general en esta hoja: cada uno se declara al lado de su
   componente. Este es el de las casillas del mapa (hoy, los corredores VFR). */
.chk.oculto { display: none; }

.solo-celu { display: none; }
.solo-celu-in { display: none; }

/* ---------------------- Bloques de resultado ----------------------
   Cada `.bloque` que sale de app.js se convierte en una tarjeta desplegable
   (ver `convertirEnTarjetas` en app.js): su <h3> pasa a ser el encabezado que
   se toca para plegar, y el resto del contenido va adentro de `.card-cuerpo`.
   El aspecto de la tarjeta ya está definido arriba, en `.card, .bloque`.
   El <h3> queda por si algún bloque todavía no pasó por la conversión. */
/* ⚠️ `:not(.card-tit)` es imprescindible: sin él este margen de 12px le ganaba
   por especificidad al `margin: 0` del titular de la tarjeta y lo dejaba 6px
   por encima del centro de la barra plegada. */
.bloque h3:not(.card-tit) {
  font-size: var(--t-titulo);
  font-weight: 700;
  color: var(--texto);
  margin: 0 0 12px;
}
/* Sub-título dentro de un panel (antes era el h4 chiquito naranja) */
.bloque h4, .sub-tabla {
  font-size: var(--t-chico);
  font-weight: 700;
  color: var(--muted);
  margin: 14px 0 8px;
}

/* ===========================================================================
   LA CABECERA DEL PLAN
   ===========================================================================
   Dos partes: el par de aeródromos arriba —código grande y nombre debajo— y
   una tira de cuatro celdas con fecha, hora de salida, reglas y aeronave.
   La tira reusa `.perf-tira`, la misma de Performance: son los mismos
   rótulos chiquitos con el dato abajo, y no tiene sentido inventar una segunda
   forma de mostrar cuatro datos en fila. */
.cabecera-plan { display: block; }

/* La cabecera de UN alternativo: un solo código y el nombre al lado. Es la
   cabecera vieja del plan, que estos paneles compartían. El tamaño estaba
   escrito a mano en el HTML (`style="font-size:17px"`); acá tiene su regla. */
.cabecera-alt {
  display: flex; align-items: baseline; flex-wrap: wrap;
  gap: 4px 10px; margin-bottom: 4px;
}
.cabecera-alt .par { font-size: 17px; font-weight: 800; letter-spacing: 1px; }
.cabecera-alt .sub { font-size: 12px; color: var(--muted); }

.cp-par {
  display: flex; align-items: flex-start;
  flex-wrap: nowrap; gap: 2px 10px;
  margin-bottom: 12px;
}
/* `flex: 0 1 auto` con un tope en ch: cada aeródromo ocupa lo que necesita
   hasta ese tope y después parte el nombre. Sin el tope, un nombre largo
   empuja al otro aeródromo al otro extremo del panel. */
/* ⚠️ SIN `min-width: 0`. El tope de ancho tiene que partir el NOMBRE, no el
   código: con min-width en 0 el flex podía apretar la caja por debajo del ancho
   de "SROL" y el código se cortaba. Con el min-width automático la caja nunca
   baja del ancho del código, y el nombre se parte en los renglones que haga
   falta. 100 px es lo que deja los dos códigos cerca uno del otro. */
.cp-ad { display: block; flex: 0 1 auto; max-width: 100px; }
.cp-cod {
  display: block;
  font-size: 24px; font-weight: 800; letter-spacing: 1px;
  line-height: 1.1;
}
/* El nombre del aeródromo. Antes no estaba y sólo se veía el código: SACO es
   Córdoba para el que lo sabe y no es nada para el que no. Se parte en varios
   renglones sin problema: el tope de ancho lo pone `.cp-ad`, y lo que importa
   es que los dos CÓDIGOS queden cerca uno del otro. */
.cp-nom {
  display: block;
  font-size: 12px; color: var(--muted); line-height: 1.3;
  margin-top: 2px;
}
/* La flecha va alineada con los CÓDIGOS, no con la caja: si se centrara
   verticalmente quedaría a la altura del nombre, que está más abajo. */
.cp-flecha {
  color: var(--naranja);
  font-size: 24px; font-weight: 800; line-height: 1.1;
}
/* "privado" / "militar" van en su PROPIO renglón, debajo del aeródromo. Al
   lado de un código de cuatro letras la chapita se lee como si fuera parte del
   nombre. `width: fit-content` para que el recuadro mida lo que la palabra y
   no todo el ancho de la columna. */
.cp-ad .etq-uso {
  display: block; width: fit-content;
  margin: 5px 0 0;
}
/* "hasta", sólo para el lector de pantalla: la flecha es un dibujo y no se
   lee. Sin esto, un lector de pantalla dice "SABE SACO" de corrido. */
.cp-sr {
  position: absolute; width: 1px; height: 1px;
  overflow: hidden; clip-path: inset(50%); white-space: nowrap;
}

/* La tira de la cabecera es la de Performance, pero MÁS CHICA. En Performance
   los números son el dato principal de la pantalla y van grandes; acá son el
   encabezado —cuándo, con qué reglas, en qué avión— y compiten con el par de
   aeródromos, que es lo que hay que leer primero. Con el mismo tamaño que
   Performance la cabecera quedaba en 165 px de alto para decir cuatro cosas. */
.cp-tira { border-top: 0; }
.cp-tira .perf-celda { padding: 4px 12px; }
.cp-tira .perf-celda:first-child { padding-left: 0; }
.cp-tira .perf-rot { font-size: 9px; margin-bottom: 1px; }
.cp-tira .perf-val { font-size: 14px; font-weight: 700; line-height: 1.2; }
.cp-tira .perf-sub { font-size: 10.5px; margin-top: 0; }

@media (max-width: 620px) {
  /* ⚠️ EN EL CELULAR TAMBIÉN VAN AL LADO. Antes se apilaban y la flecha se
     giraba; el usuario pidió que sigan uno al lado del otro. Se reparten el
     ancho en mitades y el nombre se parte en los renglones que haga falta: es
     preferible un nombre de tres renglones a un origen y un destino separados
     por media pantalla. */
  .cp-par { flex-wrap: nowrap; gap: 2px 6px; }
  .cp-ad { flex: 1 1 0; max-width: none; }
  .cp-cod { font-size: 21px; }
  .cp-nom { font-size: 11.5px; }
  .cp-flecha { font-size: 21px; }
}

/* El código del aeródromo, clickeable: abre su ficha. Mismo tamaño y peso que
   el texto que reemplaza, con un subrayado punteado para que se note que se
   puede tocar sin gritarlo. */
/* El código del aeródromo, clickeable.
   ⚠️ Antes llevaba subrayado punteado: sobre el titular de 24 px en negrita
   quedaba una línea gruesa de puntos debajo de cada código, que se leía como
   suciedad. Ahora se marca con un subrayado FINO y continuo que sólo aparece
   al pasar el mouse. */
.cod-clic {
  cursor: pointer;
  border-bottom: 1px solid transparent;
  transition: color .15s, border-color .15s;
}
.cod-clic:hover, .cod-clic:focus-visible {
  color: var(--naranja);
  border-bottom-color: var(--naranja);
  outline: none;
}

.ruta-texto {
  background: var(--negro);
  border: 1px solid var(--borde);
  border-left: 3px solid var(--naranja);
  color: var(--naranja-cl);
  padding: 12px 14px;
  border-radius: 6px;
  font-size: 13.5px;
  letter-spacing: .8px;
  word-spacing: 3px;
  overflow-x: auto;
  white-space: nowrap;
}

.nota {
  font-size: 11.5px;
  padding: 8px 12px;
  border-radius: 6px;
  margin-top: 10px;
  border: 1px solid;
}
.nota.ok     { background: rgba(62,207,142,.08); border-color: rgba(62,207,142,.3); color: var(--ok); }
.nota.alerta { background: rgba(255,176,32,.08); border-color: rgba(255,176,32,.35); color: var(--alerta); }

/* Tarjetas de datos */
.grid-datos {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
  gap: 10px;
  margin-top: 14px;
}
.dato {
  background: var(--panel-alt);
  border: 1px solid var(--borde);
  border-radius: 8px;
  padding: 12px;
}
.dato .valor { font-size: 20px; font-weight: 700; color: var(--texto); }
.dato .valor small { font-size: 12px; color: var(--muted); font-weight: 500; }
.dato .etiqueta {
  font-size: 12.5px;
  font-weight: var(--peso-etq);
  color: var(--muted);
  margin-top: 2px;
}

/* Tabla */
.tabla-scroll { overflow-x: auto; }
table { width: 100%; border-collapse: collapse; font-size: 12.5px; }
th {
  background: var(--panel-alt);
  color: var(--muted);
  font-size: 12.5px;
  font-weight: var(--peso-etq);
  padding: 8px 6px;
  border-bottom: 1px solid var(--borde);
  white-space: nowrap;
}
td {
  padding: 7px 6px;
  border-bottom: 1px solid var(--borde);
  text-align: center;
  white-space: nowrap;
}
tbody tr:hover { background: var(--panel-alt); }
td.tramo { text-align: left; font-weight: 600; }
td.via { color: var(--naranja-cl); }
.fl-bajo { color: var(--muted); font-size: 11px; }
.wca { color: var(--muted); font-size: 10.5px; }
.comp { font-size: 10.5px; }
/* El signo es el del efecto sobre la velocidad SOBRE EL SUELO, no el de la
   componente en cara: +12 verde es doce nudos más de GS, −12 rojo son doce
   menos. Ver `compVientoTxt` en app.js. */
.v-cara { color: #ff8080; font-weight: 700; }  /* en cara: resta GS, va con − */
.v-cola { color: var(--ok); font-weight: 700; } /* de cola: suma GS, va con + */

/* Fases */
.grid-fases { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-top: 14px; }
.fase {
  background: var(--panel-alt);
  border: 1px solid var(--borde);
  border-top: 2px solid var(--naranja);
  border-radius: 8px;
  padding: 12px;
}
.fase h4 {
  margin: 0 0 8px;
  font-size: 11px;
  color: var(--texto);
}
.fase .linea {
  display: flex;
  justify-content: space-between;
  font-size: 12px;
  padding: 3px 0;
  color: var(--muted);
}
.fase .linea strong { color: var(--texto); }

/* ---------------------- Perfil vertical ---------------------- */
/* La zona del perfil: el dibujo, y a su derecha y abajo las dos barras para
   correrse cuando hay zoom. */
.perfil-zona {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 0;
  grid-template-rows: auto 0;
  gap: 0;
}
.perfil-zona.visible { grid-template-columns: minmax(0, 1fr) 16px; grid-template-rows: auto 16px; gap: 4px; }
.perfil-caja { overflow: hidden; grid-column: 1; grid-row: 1; }
/* Se hace zoom moviendo el viewBox, así que el SVG ya NO necesita desbordar la
   caja: se queda del ancho disponible y adentro se acerca y se corre. */
.perfil-svg { display: block; width: 100%; height: auto; touch-action: none; }
.perfil-svg.con-zoom { cursor: grab; }
.perfil-svg.arrastrando { cursor: grabbing; }

/* Las dos barras. Ocupan lugar cero mientras no haya zoom. */
.perfil-barra { appearance: none; background: transparent; margin: 0; padding: 0;
  opacity: 0; pointer-events: none; }
.perfil-zona.visible .perfil-barra { opacity: 1; pointer-events: auto; }
.perfil-barra-x { grid-column: 1; grid-row: 2; width: 100%; height: 16px; }
.perfil-barra-y { grid-column: 2; grid-row: 1; width: 16px; height: 100%;
  writing-mode: vertical-lr; }
.perfil-barra::-webkit-slider-runnable-track {
  background: var(--panel-alt); border: 1px solid var(--borde); border-radius: 999px;
}
.perfil-barra::-webkit-slider-thumb {
  appearance: none; width: 13px; height: 13px; border-radius: 50%;
  background: var(--naranja); border: 0; margin-top: -1px;
}
.perfil-barra::-moz-range-track {
  background: var(--panel-alt); border: 1px solid var(--borde); border-radius: 999px;
}
.perfil-barra::-moz-range-thumb {
  width: 13px; height: 13px; border-radius: 50%; background: var(--naranja); border: 0;
}

/* ⚠️ El texto del perfil se dibuja en unidades del SVG, así que se achica
   junto con el dibujo: alejado quedaba de 5 px y no se leía. `--k` lo compensa
   para que mida siempre lo mismo en pantalla; lo calcula app.js en cada zoom.
   Los tamaños concretos están más abajo, en cada clase de etiqueta. */
.perfil-svg { --k: 1; }
.perfil-svg .eje      { stroke: var(--borde); stroke-width: 1; }
/* TODAS las líneas y marcas decorativas del perfil dejan pasar el mouse: si
   no, la línea de altitud de transición, la de MSA o el cruce de FIR se
   comen el click de la banda de espacio aéreo que tienen debajo. */
.perfil-svg .rejilla,
.perfil-svg .trans,
.perfil-svg .msa-linea-svg,
.perfil-svg .cruce-fir,
.perfil-svg .hito { pointer-events: none; }
.perfil-svg .rejilla  { stroke: var(--borde); stroke-width: 1; stroke-dasharray: 2 4; opacity: .55; }
.perfil-svg .etq-eje  { fill: var(--muted); font-size: calc(9px * var(--k)); font-family: inherit; }
.perfil-svg .etq-esp  { font-size: calc(9px * var(--k)); font-weight: 600; font-family: inherit; }
.perfil-svg .trans    { stroke: var(--alerta); stroke-width: 1.2; stroke-dasharray: 6 4; }
.perfil-svg .trans-nivel { stroke: var(--alerta); stroke-width: 1.2; stroke-dasharray: 2 3; pointer-events: none; }
/* La capa de transición: la franja entre la altitud (abajo, QNH) y el nivel
   (arriba, 1013). Muy tenue a propósito: es una referencia de altímetro, no un
   espacio aéreo, y no tiene que competir con las bandas de abajo. Deja pasar el
   click para no robárselo al espacio aéreo que tapa. */
.perfil-svg .capa-trans { fill: var(--alerta); opacity: .10; pointer-events: none; }
.perfil-svg .etq-trans{ fill: var(--alerta); font-size: calc(9px * var(--k)); font-weight: 600; }
.perfil-svg .senda    { stroke: var(--naranja); stroke-width: 2.5; fill: none; stroke-linejoin: round; pointer-events: none; }
.perfil-svg .relleno  { fill: var(--naranja); opacity: .10; pointer-events: none; }
/* Puntos de la ruta sobre el perfil. pointer-events:none es imprescindible:
   si no, estas lineas tapan el click de las bandas de espacio aereo. */
.perfil-svg .wp-linea { stroke: var(--texto); stroke-width: 1; stroke-dasharray: 2 5; opacity: .28; pointer-events: none; }
/* Mismos íconos que el mapa: aeródromo = círculo con borde blanco relleno
   naranja; fix = punto chico con borde naranja relleno oscuro. */
.perfil-svg .wp-ico     { pointer-events: none; }
.perfil-svg .wp-ico-ad  { fill: var(--naranja); stroke: #ffffff; stroke-width: 2; }
.perfil-svg .wp-ico-fix { fill: #0b0b0d; stroke: var(--naranja); stroke-width: 2; }
/* Punto cargado a mano: no es un punto publicado, se dibuja distinto */
.perfil-svg .wp-ico-man { fill: var(--naranja); stroke: #ffffff; stroke-width: 2; opacity: .85; }
.perfil-svg .wp-etq   { fill: var(--naranja); font-size: 10.5px; font-weight: 800; font-family: inherit; pointer-events: none; }
.perfil-svg .hito     { fill: var(--naranja); }
.perfil-svg .etq-hito { fill: var(--texto); font-size: calc(9px * var(--k)); font-weight: 700; }
/* pointer-events:none es imprescindible: el terreno se dibuja DESPUÉS de las
   bandas de espacio aéreo y, si captura el mouse, tapa el click de toda banda
   que llegue hasta la superficie. */
.perfil-svg .terreno  { fill: #4a4234; opacity: .9; pointer-events: none; }
.perfil-svg .terreno-linea { fill: none; stroke: #8a7a55; stroke-width: 1; pointer-events: none; }

/* Los demás espacios aéreos que hay en el mismo punto del gráfico. Con esto
   ninguno queda inalcanzable, aunque esté completamente cubierto. */
.ficha-otros { margin-top: 8px; padding-top: 7px; border-top: 1px solid var(--borde); }
.ficha-otros > span { display: block; font-size: 11.5px; color: var(--muted); margin-bottom: 4px; }
.chip-otro { background: var(--panel-alt); border: 1px solid var(--borde); color: var(--texto);
  font: inherit; font-size: 10.5px; padding: 2px 7px; border-radius: 10px; margin: 0 4px 4px 0;
  cursor: pointer; }
.chip-otro:hover { border-color: var(--naranja); color: var(--naranja); }

/* Los textos van DIBUJADOS sobre las bandas pero no deben interceptar el
   mouse: si lo hacen, al pasar el cursor por encima de una letra se dispara
   mouseout de la banda de abajo y mouseover de nuevo al salir del texto,
   y la ficha de info parpadea (bug reportado como "stuttering" al hacer hover). */
.perfil-svg text { pointer-events: none; }

/* Colores por clase de espacio aereo */
.esp-A { fill: #ff4d4d; stroke: #ff4d4d; }
.esp-B { fill: #ff884d; stroke: #ff884d; }
.esp-C { fill: #7aa0ff; stroke: #7aa0ff; }
.esp-D { fill: #be78ff; stroke: #be78ff; }
.esp-E { fill: #4dd0a0; stroke: #4dd0a0; }
.esp-F, .esp-G { fill: #8e8e9b; stroke: #8e8e9b; }
.esp-SC { fill: #5a5a66; stroke: #5a5a66; }
.banda { fill-opacity: .16; stroke-width: 1; stroke-opacity: .75; }

/* ---------------------- Meteorologia ---------------------- */
/* Salida, destino y alternativo, SIEMPRE en una sola fila: con `auto-fit` y
   260px de mínimo entraban dos arriba y el tercero solo abajo, y se leía como
   si el alternativo fuera otra cosa. */
/* ⚠️ TRES EN FILA, SIEMPRE. Son salida, destino y alternativo: se miran
   comparándolas, y con dos arriba y una abajo la tercera se lee como si fuera
   otra cosa.
   Que entren las tres en 200 px por tarjeta obliga a apilar adentro —el
   gráfico arriba, los datos abajo—, y eso lo hace el bloque de abajo con una
   consulta de contenedor. */
.meteo-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 12px;
}
/* ⚠️ Estas tarjetas son TRES en fila y quedaban altísimas: mucho renglón para
   poco dato. Se apretó todo —cuerpo, aire, y las cuatro cifras en UNA fila de
   cuatro en vez de dos por dos— sin sacar nada de información. */
.meteo-tarjeta {
  background: var(--panel-alt);
  border: 1px solid var(--borde);
  border-radius: 8px;
  padding: 9px 10px;
}
/* Dos renglones: arriba quién es el aeródromo, abajo de dónde sale el dato y
   de cuándo es. Los dos arrancan en el mismo margen izquierdo. */
.meteo-cab {
  display: flex; flex-direction: column; align-items: stretch; gap: 3px;
  padding-bottom: 6px; margin-bottom: 7px;
  border-bottom: 1px solid var(--borde);
}
.meteo-cab-quien { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; min-width: 0; }
.meteo-cab-fuente { display: flex; align-items: baseline; gap: 5px; flex-wrap: wrap; min-width: 0; }
.meteo-cab .rol {
  font-size: 11px; font-weight: var(--peso-etq);
  color: var(--muted); background: var(--negro);
  padding: 2px 6px; border-radius: 4px;
}
.meteo-cab .icao { font-weight: 800; font-size: 15px; letter-spacing: 1px; }
/* El código abre la ficha. Hereda de `.cod-clic` el subrayado punteado que
   avisa que se puede tocar; acá sólo se le devuelve el tamaño, porque
   `.cod-clic` no trae ninguno. */
.meteo-cab .cod-clic.icao { font-weight: 800; font-size: 15px; letter-spacing: 1px; }
/* La palabra de la fuente (METAR / TAF / Pronóstico) y la hora, con la misma
   letra y pegadas al margen izquierdo. Antes las dos iban empujadas al margen
   derecho con `margin-left: auto`. */
.meteo-cab .hora { font-size: 10.5px; color: var(--muted); }
.meteo-cab .cat {
  font-size: 10px; font-weight: 800; letter-spacing: .5px;
  padding: 2px 7px; border-radius: 4px; border: 1px solid;
}
.cat-ok     { background: rgba(62,207,142,.14); color: var(--ok); border-color: rgba(62,207,142,.45); }
.cat-aviso  { background: rgba(255,176,32,.14); color: var(--alerta); border-color: rgba(255,176,32,.45); }
.cat-alerta { background: rgba(255,80,80,.14); color: #ff8080; border-color: rgba(255,80,80,.45); }

/* ⚠️ NADA DE RECORTAR VALORES. Un "6+ …" en vez de "6+ sm", o un "4° /…" en
   vez de "4° / -8°", es un dato meteorológico ilegible, y eso no se negocia
   por ganar altura. Van dos por fila (no cuatro) y el texto puede cortar
   renglón: la tarjeta crece lo que tenga que crecer. */
.meteo-datos { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 5px; margin-bottom: 7px; }
.mini { background: var(--negro); border-radius: 5px; padding: 5px 7px; min-width: 0; }
/* `overflow: hidden` es la red de seguridad: `ajustarTextoAlAncho` (app.js)
   achica la letra hasta que el dato entre, pero si por lo que fuera no llegara
   a correr, es preferible que quede recortado adentro del cuadrito antes que
   desbordado encima de lo de al lado. */
.mini-v { font-size: 12.5px; font-weight: 700; line-height: 1.25; overflow: hidden; }
/* La ráfaga, en su propio renglón debajo del viento —al lado se salía del
   cuadrito— pero con EL MISMO TAMAÑO Y PESO que el viento. Es un dato que
   decide si se despega o no; en 10 px y sin negrita se leía como una nota al
   pie del viento. El color ámbar se queda: es lo que la distingue. */
.mini-raf {
  font-size: 12.5px; font-weight: 700; color: var(--alerta);
  line-height: 1.25; margin-top: 1px; overflow: hidden;
}
.mini-e { font-size: 10px; font-weight: var(--peso-etq); color: var(--muted);
  line-height: 1.2; }

.meteo-linea {
  display: flex; justify-content: space-between; gap: 8px;
  font-size: 11px; padding: 3px 0; color: var(--muted); line-height: 1.4;
  border-top: 1px solid var(--borde);
}
.meteo-linea strong { color: var(--texto); text-align: right; }
/* Altitud de presión / densidad: cuando la densidad se dispara, el renglón se
   marca. No es un límite legal, es "mirá las distancias de pista". */
.meteo-linea.alt-dens.ojo strong { color: var(--alerta); }
.meteo-linea.alt-dens { cursor: help; }

.crudo { margin-top: 10px; }
.crudo summary {
  cursor: pointer; font-size: 11.5px; color: var(--muted);
}
.crudo summary:hover { color: var(--naranja); }
.crudo pre {
  background: var(--negro); border: 1px solid var(--borde);
  border-radius: 6px; padding: 8px; margin: 8px 0 0;
  font-size: 11px; color: var(--naranja-cl);
  white-space: pre-wrap; word-break: break-word;
}

/* Leyenda de clases del perfil (reemplaza la vieja lista de texto) */
.leyenda-clases {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  margin-top: 10px; padding-top: 10px;
  border-top: 1px solid var(--borde);
  font-size: 11px; color: var(--muted);
}
.ley-item { display: flex; align-items: center; gap: 6px; }
.ley-item i {
  width: 11px; height: 11px; border-radius: 3px;
  display: inline-block; opacity: .75;
}
.ley-item i.ley-linea {
  width: 16px; height: 0; border-radius: 0;
  border-top: 2px dashed var(--alerta); opacity: 1;
}
.ley-nota { margin-left: auto; font-style: italic; opacity: .8; }

/* Cruce de FIR */
.fir-cruce + .fir-cruce { margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--borde); }
.fir-flecha {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  font-size: 15px; font-weight: 700;
}
.fir-flecha .fir-de { color: var(--muted); }
.fir-flecha .fir-a { color: var(--texto); }
.fir-flecha .fir-icono { color: var(--naranja); font-size: 13px; }


/* Fila de cruce de FIR: sin resaltar todo el renglón, solo el rombo naranja */
tr.fila-fir td { color: var(--muted); font-size: 11.5px; }
tr.fila-fir td:first-child { color: var(--naranja); font-weight: 800; }
/* La celda del punto va en BLANCO, como el nombre de cualquier otro tramo: es
   el dato de la fila, no una aclaracion. El resto de la fila si va en gris,
   que es lo que la distingue de un tramo de verdad. */
tr.fila-fir td.tramo { color: var(--texto); }

/* Marcador de cruce de FIR en el mapa */
.icono-fir { background: none; border: none; }
.rombo-fir {
  width: 11px; height: 11px; margin: 2px;
  background: var(--naranja);
  border: 2px solid #fff;
  transform: rotate(45deg);
}
.pt.rombo { transform: rotate(45deg); border-radius: 2px; }
.pt-fir-cruce { background: var(--naranja); border: 1px solid #fff; }
.pt-fir { background: rgba(224,176,255,.25); border: 1px dashed #e0b0ff; }
.mapa-leyenda .sep { width: 1px; height: 14px; background: var(--borde); }

/* Perfil: linea de cruce de FIR */
.perfil-svg .cruce-fir { stroke: var(--naranja); stroke-width: 1.5; stroke-dasharray: 5 3; opacity: .9; }
.perfil-svg .etq-fir { fill: var(--naranja); font-size: calc(9px * var(--k)); font-weight: 700; }

/* Campo de ruta manual */
#rutaManual {
  width: 100%; padding: 9px 10px;
  background: var(--negro); border: 1px solid var(--borde);
  border-radius: 6px; color: var(--naranja-cl); font-size: 12px;
  letter-spacing: .5px; resize: vertical; line-height: 1.5;
}
#rutaManual:focus {
  outline: none; border-color: var(--naranja);
  box-shadow: 0 0 0 2px rgba(255,107,0,.15);
}
.mini-btn {
  float: right; text-transform: none; letter-spacing: 0;
  background: var(--panel-alt); color: var(--muted);
  border: 1px solid var(--borde); border-radius: 4px;
  font-size: 9.5px; padding: 1px 7px; cursor: pointer;
}
.mini-btn:hover { color: var(--naranja); border-color: var(--naranja); }

/* ---------------------- Etapa 8: perfil interactivo, layout ruta ----- */
/* Sugerencias AL LADO del campo de ruta */
.ruta-fila { display: flex; gap: 14px; align-items: flex-start; flex-wrap: wrap; }
.ruta-col-input { flex: 1 1 340px; min-width: 260px; }
.ruta-col-sug { display: flex; flex-direction: column; gap: 6px; width: 260px; max-width: 100%; }
.ruta-col-sug .sug-lbl { margin-bottom: 2px; }
.ruta-col-sug .chip-ruta { width: 100%; }
.ruta-col-sug .chip-ruta-txt { max-width: 100%; }

/* Vuelo controlado / no controlado. Encabeza el panel de espacios aéreos
   porque de ahí sale el nivel de crucero que corresponde. */
.ctl-caja {
  border: 1px solid var(--borde); border-left: 3px solid var(--borde);
  border-radius: 8px; padding: 9px 12px; background: var(--panel-alt);
  margin: 0 0 12px;
}
.ctl-caja.ctl-si { border-left-color: var(--naranja); }
.ctl-caja.ctl-no { border-left-color: var(--muted); }
.ctl-cab { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.ctl-cab strong { font-size: 13px; }
.ctl-ico { width: 17px; height: 17px; flex: 0 0 auto; }
.ctl-caja.ctl-si .ctl-ico { color: var(--naranja); }
.ctl-caja.ctl-no .ctl-ico { color: var(--muted); opacity: .6; }
.ctl-nivel { margin-left: auto; font-size: 11px; color: var(--muted); }
.ctl-nota { margin: 5px 0 0; line-height: 1.4; }

/* Perfil con ficha flotante (hover/click en las bandas) */
.perfil-wrap { position: relative; }
.perfil-svg .banda { cursor: pointer; }
.perfil-svg .banda:hover { fill-opacity: .3; }
/* Banda seleccionada (click): además de la ficha, resalta SU propio contorno */
.perfil-svg .banda-sel { stroke-width: 2.5; fill-opacity: .35; }
/* La ficha del perfil FLOTA SOBRE TODA LA PÁGINA, pegada al cursor: no está
   encerrada en el gráfico. Mientras es vista previa no recibe eventos del
   mouse, si no se robaría el hover de la banda que está describiendo (pasaba
   con las bandas del lado derecho). Al fijarla con un click sí los recibe,
   porque tiene el botón de cerrar y los de "también acá". */
/* ⚠️ Doble clase a propósito: `.ficha-espacio` está definida más abajo en el
   archivo con `position: absolute` y la misma especificidad, así que le ganaba
   a esta regla y la ficha seguía anclada adentro del gráfico. */
.ficha-espacio.ficha-perfil {
  position: fixed; top: 0; left: 0; right: auto;
  width: 230px; max-width: calc(100vw - 16px);
  z-index: 5000;
  pointer-events: none;
}
.ficha-espacio.ficha-perfil.fijada { pointer-events: auto; }

/* Editor de la ruta a cada alternativo (mismo patrón que el de la principal) */
.ruta-editor-alt { margin: 8px 0 10px; }
.ruta-editor-alt .ruta-editor { margin-bottom: 6px; }
.ruta-editor-alt .ruta-input {
  border-left: 3px solid var(--alt-color);
  /* Más bajo que el de la ruta principal: la columna del alternativo tiene
     menos cosas debajo, así que estirarlo a 74 px dejaría un campo enorme para
     una ruta que casi siempre es directa. */
  min-height: 56px;
}
.ruta-etq-manual { font-size: var(--t-mini); color: var(--muted); align-self: center; }
/* Las recomendadas van A LA DERECHA de la ruta en uso, en columna, igual que
   en el panel de la ruta principal. El panel de alternativos es más angosto
   que el del plan, así que las dos columnas piden menos ancho para arrancar:
   con los 340/260 de la principal nunca entraban al lado y bajaban solas. */
.ruta-editor-alt .ruta-col-input { flex: 1 1 240px; min-width: 200px; }
.sug-alt-rutas { display: flex; flex-direction: column; flex-wrap: nowrap;
  gap: 6px; width: 230px; max-width: 100%; margin-top: 0; }

/* Sección aparte de frecuencias */
.freq-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px; }
/* Los nombres de TMA/CTR son largos ("TMA SANTA ROSA DE CONLARA"): no pueden
   ir con el cuerpo de un código de aeródromo de cuatro letras. */
.freq-icao-chico { font-size: 12.5px; letter-spacing: 0; line-height: 1.25; }
.freq-card { background: var(--panel-alt); border: 1px solid var(--borde); border-radius: 8px; padding: 12px; }
.freq-card-cab { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; padding-bottom: 8px; border-bottom: 1px solid var(--borde); }
.freq-card-cab .rol { font-size: 12.5px; font-weight: var(--peso-etq); color: var(--muted); background: var(--negro); padding: 2px 6px; border-radius: 4px; }
.freq-card-cab .icao { font-weight: 800; font-size: 15px; letter-spacing: 1px; }

/* Sugerencias de alternativo (chips) */
.sug-alt { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; }
.chip-alt {
  display: flex; align-items: center; gap: 7px;
  padding: 6px 11px; border-radius: 7px; cursor: pointer;
  background: var(--panel-alt); border: 1px solid var(--borde); color: var(--texto);
}
.chip-alt:hover { border-color: var(--alt-color); background: rgba(53,183,214,.1); }
.chip-alt-icao { font-weight: 800; font-size: 13px; letter-spacing: .5px; }
.chip-alt-dist { font-size: 11px; color: var(--muted); }
/* El estado del tiempo de cada candidato, para poder COMPARAR de un vistazo en
   vez de probar uno por uno. El borde izquierdo lleva el color; el texto va en
   el color del tema para que no dependa SOLO del color (hay pilotos que no lo
   distinguen, y esto se imprime en blanco y negro). */
.chip-alt-cond { font-size: 10px; font-weight: 700; letter-spacing: .04em; }
.chip-alt { border-left-width: 3px; }
.chip-alt.cond-bien     { border-left-color: var(--ok); }
.chip-alt.cond-marginal { border-left-color: var(--alerta); }
.chip-alt.cond-mal      { border-left-color: var(--peligro); }
.chip-alt.cond-sindato  { border-left-color: var(--borde); }
.chip-alt.cond-bien     .chip-alt-cond { color: var(--ok); }
.chip-alt.cond-marginal .chip-alt-cond { color: var(--alerta); }
.chip-alt.cond-mal      .chip-alt-cond { color: var(--peligro); }
.chip-alt.cond-sindato  .chip-alt-cond { color: var(--muted); }

/* Por qué RUMBO eligió ese alternativo y no otro. */
.alt-motivo {
  font-size: 12px; line-height: 1.5; margin: 0 0 12px;
  padding: 9px 12px; border-radius: 7px; border-left: 3px solid;
}
.alt-motivo.ok  { background: var(--ok-db);     border-color: var(--ok); color: var(--texto); }
.alt-motivo.ojo { background: var(--alerta-db); border-color: var(--alerta); color: var(--texto); }
.alt-motivo strong { color: var(--texto); }

/* Nota de uso del aeródromo (privado / militar) */
.nota-uso {
  font-size: 12px; padding: 10px 12px; border-radius: 7px; margin: 10px 0;
  border: 1px solid;
}
.nota-uso.priv { background: rgba(255,176,32,.1); border-color: rgba(255,176,32,.45); color: var(--alerta); }
.nota-uso.mil  { background: rgba(255,80,80,.1); border-color: rgba(255,80,80,.45); color: #ff8080; }
.nota-uso strong { color: inherit; }

/* ---------------------- Etapa 7: MSA, frecuencias AD, longitud pista - */
/* Frecuencias del aeródromo en la tarjeta de meteo */
.ad-freq { margin-top: 10px; padding-top: 8px; border-top: 1px solid var(--borde); }
.ad-freq-tit { font-size: 11.5px; color: var(--muted); margin-bottom: 5px; }
.ad-freq-lista { display: grid; grid-template-columns: 1fr 1fr; gap: 3px 12px; }
.ad-freq-item { display: flex; justify-content: space-between; gap: 6px; font-size: 11px; }
.ad-freq-etq { color: var(--muted); }
.ad-freq-mhz { font-weight: 700; color: var(--naranja-cl); }

/* Frecuencias con distintivo de llamada, horario y de dónde salió el dato.
   En la tarjeta de frecuencias van a una sola columna para que entren. */
.freq-card .ad-freq-lista { grid-template-columns: 1fr; gap: 5px; }
/* ⚠️ `min-width: 0` EN TODA LA CADENA. Sin esto un distintivo de llamada
   largo ("EL PALOMAR RODAJE O SUPERFICIE") no se deja achicar y empuja la
   tarjeta a lo ancho: aparece barra horizontal, que es justo lo que no puede
   pasar en una hoja que se lee en la piernera. */
.freq-card .ad-freq-item {
  align-items: baseline; font-size: 11.5px; min-width: 0; flex-wrap: nowrap;
}
.freq-card .ad-freq-item > .ad-freq-etq { flex: 1 1 auto; min-width: 0; }
.freq-card .ad-freq-lista, .freq-card { min-width: 0; }
/* ⚠️ LA ETIQUETA VA EN UN RENGLÓN SOLO: sigla + distintivo de llamada. En
   columna, cada frecuencia ocupaba dos renglones y la tarjeta de una torre con
   ATIS, tierra y dos canales medía el doble. El MHz sí sigue en columna, con
   el horario debajo. */
.freq-card .ad-freq-etq { display: flex; align-items: baseline; gap: 6px; min-width: 0; }
/* El MHz y su horario, también en el mismo renglón: la frecuencia entera
   —sigla, quién contesta, en cuánto y a qué hora— se lee de una pasada. */
.freq-card .ad-freq-mhz {
  display: flex; align-items: baseline; gap: 5px; text-align: right;
  flex: 0 0 auto;
}
/* El distintivo de llamada, al lado de la sigla y recortado si no entra: la
   sigla es lo que no se puede perder. */
.freq-llamada {
  font-size: 9.5px; color: var(--muted); font-style: italic; margin-top: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0;
}
.freq-sigla { font-weight: 700; color: var(--texto); letter-spacing: .04em; flex: 0 0 auto; }
.freq-hor { font-size: 9.5px; color: var(--muted); font-weight: 400; font-family: inherit; margin-top: 1px; }
.freq-org { font-size: 8.5px; padding: 1px 5px; align-self: center; flex-shrink: 0; }

.freq-horario { margin-top: 10px; padding-top: 8px; border-top: 1px solid var(--borde); font-size: 11px; }
.freq-hor-tit { font-size: 11.5px; color: var(--muted); display: block; }
.freq-hor-aviso { margin: 5px 0 0; font-size: 11px; line-height: 1.45; }
.freq-horario.alerta .freq-hor-aviso { color: var(--alerta); }
.freq-horario.aviso .freq-hor-aviso { color: var(--muted); }

/* MSA */
.opt-nivel.msa-linea { border-left-color: var(--alerta); }
.perfil-svg .msa-linea-svg { stroke: #ff7a7a; stroke-width: 1.2; stroke-dasharray: 3 3; }
.perfil-svg .etq-msa { fill: #ff7a7a; font-size: calc(9px * var(--k)); font-weight: 700; }

/* Longitud de pista en la rosa */
.rosa-largo { font-size: 11px; color: var(--muted); }
.rosa-corta { font-size: 10.5px; color: var(--alerta); font-weight: 600; }

/* ---------------------- Etapa 6: frecuencias, pistas, iconos --------- */
/* Recuadros compactos con ícono (performance de un solo valor) */
.dato { display: flex; align-items: center; gap: 9px; }
.dato-ico { font-size: 17px; line-height: 1; flex-shrink: 0; }
/* Los íconos son SVG monocromáticos: heredan el color del texto apagado y
   siguen al tema solos. `display: block` saca el hueco que el navegador deja
   debajo de un elemento en línea, que desalineaba el ícono con el número. */
.dato-ico svg { display: block; color: var(--muted); }
.hoja-papel .dato-ico svg { color: #000; }
.grid-datos.compacto {
  grid-template-columns: repeat(auto-fit, minmax(112px, 1fr)); gap: 8px;
}
.grid-datos.compacto .dato { padding: 8px 10px; }
.grid-datos.compacto .valor { font-size: 15px; }
.grid-datos.compacto .etiqueta { font-size: 10.5px; margin-top: 0; }

/* Chips de ruta: muestran la ruta escrita.
   ⚠️ La ruta se lee ENTERA, nunca con puntos suspensivos. Estaba con
   `text-overflow: ellipsis` y una ruta larga quedaba en
   "FDO W5 ROS T672 ERE UT672 DADMI…": el piloto no puede comparar dos
   opciones si no ve por dónde va cada una. Que baje de renglón. */
.chip-ruta-txt { font-size: 11px; letter-spacing: .3px;
  color: var(--naranja-cl); max-width: 100%;
  white-space: normal; overflow-wrap: anywhere; line-height: 1.3;
}
.chip-ruta.reco .chip-ruta-txt { color: var(--texto); }

/* Alternados múltiples */
.alt-item + .alt-item { margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--borde); }

/* Diagrama de pista (rosa + pista real) */
/* La rosa se lleva la mitad del alto de la tarjeta. Se achica y sus renglones
   se aprietan: son tres tarjetas en fila y el vuelo se mira de un vistazo. */
.rosa-caja {
  display: flex; flex-wrap: wrap; align-items: center; gap: 10px; min-width: 0;
  margin-top: 7px; padding-top: 7px; border-top: 1px solid var(--borde);
}

/* ⚠️ LA TARJETA SE MIDE A SÍ MISMA. Lo que decide si el gráfico y los datos
   entran uno al lado del otro es el ancho de LA TARJETA, no el de la ventana:
   la misma pantalla da tarjetas de 200 px con el mapa abierto y de 320 sin él.
   Una media query miraría la ventana y se equivocaría en los dos casos.
   `container-type: inline-size` hace que las reglas de abajo pregunten por el
   ancho de la tarjeta. */
.meteo-tarjeta { container-type: inline-size; }

/* Acá había una consulta de contenedor que APILABA el dibujo y los datos por
   debajo de 300 px de tarjeta. Se sacó: con tres tarjetas en fila se cumplía
   siempre, así que el apilado no era el caso raro sino el único. Ahora van al
   lado a cualquier ancho, con el dibujo más chico y su letra más grande. El
   `flex-wrap` de `.rosa-caja` queda como red: si algún día la tarjeta fuera
   más angosta que el dibujo, el texto pasa abajo en vez de salirse. */
/* Un poco más grande: adentro entra la pista con sus números, la rosa y la
   flecha de viento, y a 88 px la flecha no se distinguía de las marcas. */
/* `overflow: hidden`, no `visible`. Con `visible` cualquier cosa que se
   dibujara fuera del viewBox se salía de la TARJETA (era el caso de la
   etiqueta de dirección del viento). El viewBox ya se agrandó para que entre
   todo; esto garantiza que, si algún día algo se pasa, quede recortado
   adentro del cuadrito y no encima de lo de al lado. */
/* ⚠️ EL DIBUJO SE ADAPTA, EL TEXTO VA PEGADO A LA DERECHA.
   Era de 112 px fijos. En una tarjeta angosta —tres tarjetas de meteo en fila,
   o un celular— el dibujo se quedaba con su ancho y el texto de al lado se
   apretaba contra él, con "componente de frente" partido en cuatro renglones y
   un hueco muerto entre el texto y el borde de la tarjeta.
   Ahora el dibujo toma el 38% del ancho disponible, entre 76 y 124 px, y el
   texto se alinea al margen DERECHO de la tarjeta: así las cifras del viento
   quedan siempre en la misma columna, se mire en la pantalla que se mire.
   La propiedad aspect-ratio mantiene el círculo redondo sin fijar el alto. */
/* ⚠️ EL DIBUJO NO SE ACHICA. Un SVG escala TODO lo que tiene adentro, incluida
   la letra: con el dibujo en 84 px, los números de cabecera de pista y el rumbo
   del viento —11 px en las coordenadas del dibujo— terminaban en 5,6 px reales.
   Ilegibles. Y no hay manera de que la letra no escale: el tamaño de fuente de
   un SVG está en unidades del dibujo.
   La única salida es que el dibujo tenga un tamaño FIJO. Si en una tarjeta
   angosta no entran el dibujo y el texto en la misma fila, el texto pasa
   abajo —la caja tiene `flex-wrap`— y se sigue leyendo todo. */
.rosa-svg {
  /* 100 px: es lo que deja lugar para el texto al lado adentro de una tarjeta
     de meteo de 236 px (214 útiles = 100 + 8 de hueco + 106 de texto). El
     tamaño es FIJO a propósito: si fuera porcentual, la letra de adentro
     cambiaría de tamaño con el ancho de la tarjeta. */
  width: 100px; max-width: 100%; height: auto; aspect-ratio: 1 / 1;
  flex: 0 0 auto; overflow: hidden;
}
.rosa-info {
  /* `flex: 1 1 0` y no `1 1 130px`: con la base en 130 px, en una tarjeta de
     214 el texto pedía 130 y el dibujo 100, o sea 230, y el flex los mandaba a
     dos renglones. Con base 0 el texto se conforma con lo que sobra. */
  flex: 1 1 0; min-width: 0; font-size: 11px; line-height: 1.45;
  text-align: right;
}
.rosa-tit { font-size: 10px; }
.rosa-pista { font-size: 14px; }
.rv-tick { fill: var(--muted); }
.rv-quad { stroke: var(--borde); stroke-width: 1; }
/* Los tamaños de acá son en unidades del DIBUJO (viewBox 166). Con el dibujo
   fijo en 148 px la escala es 0,89, así que 12 px de dibujo son casi 11 px
   reales: legibles. Antes el dibujo se achicaba hasta 84 px -escala 0,5- y
   estos mismos 11 px terminaban en 5,6. */
.rv-card { fill: var(--muted); font-size: 13px; font-weight: 700; text-anchor: middle; }
.rv-pista-sup { fill: #4a4a52; stroke: #d7d7de; stroke-width: 1; }
.rv-eje { stroke: #fff; stroke-width: 1; stroke-dasharray: 3 3; opacity: .85; }
.rv-umbral { stroke: #fff; stroke-width: 1; opacity: .9; }
/* Los números de cabecera (22 / 04) son el otro dato del dibujo: a 7 px no se
   leían. Van a 11 px, con un borde del color del fondo para que se despeguen
   del rectángulo de la pista. */
.rv-num { fill: #fff; font-size: 17px; font-weight: 800; text-anchor: middle;
  dominant-baseline: middle; paint-order: stroke;
  stroke: var(--panel-alt); stroke-width: 3.3px; stroke-linejoin: round; }
/* ⚠️ La flecha de viento es el dato que decide la pista y la carrera de
   despegue, y era una rayita fina perdida entre los puntitos de la rosa.
   Va gruesa, naranja, con la punta rellena y el rumbo escrito en la cola. */
.rv-viento { stroke: var(--naranja); stroke-width: 5.5; stroke-linecap: round; }
.rv-viento-punta { fill: var(--naranja); stroke: none; }
/* ⚠️ EL MISMO TAMAÑO Y EL MISMO PESO ÓPTICO QUE LOS NÚMEROS DE PISTA.
   Los dos declaraban 11px y peso 800, y medidos daban el mismo alto de caja.
   Pero los de pista llevan un halo de 2,5 px pintado por debajo (paint-order)
   para despegarse del rectángulo de la pista, y ese halo los engorda: al lado,
   el rumbo del viento se veía más chico aunque no lo fuera. Con el mismo halo
   los dos pesan igual, que es lo que el ojo lee como "del mismo tamaño". */
.rv-viento-num {
  fill: var(--naranja-cl); font-size: 17px; font-weight: 800;
  text-anchor: middle; dominant-baseline: middle;
  paint-order: stroke; stroke: var(--panel-alt); stroke-width: 3.3px;
  stroke-linejoin: round;
}
.rv-viento-o { fill: var(--naranja); }
.rv-viento-txt { fill: var(--naranja-cl); font-size: 12.5px; font-weight: 700; text-anchor: middle; }
.rv-calma { fill: var(--muted); font-size: 12px; text-anchor: middle; }
.rosa-tit { font-size: 11.5px; color: var(--muted); }
.rosa-pista { font-size: 22px; font-weight: 800; color: var(--texto); }
.rosa-man { font-size: 10px; font-weight: 400; color: var(--muted); }
.rosa-largo { font-size: 11px; color: var(--muted); }
/* El viento, en naranja como la flecha: son el mismo dato y tienen que leerse
   juntos.
   ⚠️ `overflow: hidden` es la red de seguridad. Con `white-space: nowrap` y
   13 px fijos, un viento largo se SALÍA del recuadro por la derecha (peor
   todavía con la ráfaga pegada al lado, que ahora va en su propio renglón).
   `ajustarTextoAlAncho` (app.js) le baja el cuerpo hasta que entre; esto evita
   el desborde aunque ese ajuste no llegue a correr. */
.rosa-viento-lbl { font-size: 11px; color: var(--muted); margin-top: 5px; }
.rosa-viento-lbl strong {
  display: block; color: var(--naranja-cl);
  font-size: 13px; font-weight: 800; line-height: 1.25; white-space: nowrap;
  overflow: hidden;
}
/* La ráfaga, en su propio renglón y en ámbar: es un dato distinto del viento
   medio y hay que poder distinguirlos de un vistazo. Del MISMO tamaño y peso
   que el viento —13 px y negrita— porque es igual de importante: de la ráfaga
   depende si se despega o no. Lo único que los distingue es el color. */
.rosa-raf { font-size: 11px; color: var(--muted); line-height: 1.25; }
.rosa-raf strong {
  display: block; color: var(--alerta);
  font-size: 13px; font-weight: 800; line-height: 1.25; white-space: nowrap;
  overflow: hidden;
}
.rosa-comp { font-size: 11px; color: var(--naranja-cl); }
.rosa-corta { font-size: 10.5px; color: var(--alerta); font-weight: 600; }

/* ---------------------- Etapa 5: reorganización ---------------------- */
.titulo-seccion .op { text-transform: none; letter-spacing: 0; color: var(--muted); font-weight: 400; }

/* Nota aclaratoria bajo un campo del formulario */
.campo-nota { display: block; margin-top: 4px; font-size: 10.5px; color: var(--muted); line-height: 1.35; }

/* --------------------------- SIGMET --------------------------- */
/* Banda en el perfil vertical. pointer-events:none es imprescindible: si no,
   tapa el click de las bandas de espacio aéreo que quedan debajo. */
/* La franja del SIGMET SÍ recibe el mouse: es clickeable y abre su ficha.
   Antes tenía `pointer-events: none` y era lo único del gráfico que no se
   podía tocar, justo el aviso más importante. */
.perfil-svg .sig-banda { cursor: pointer; }
.perfil-svg .sig-banda.cruza {
  fill: rgba(224, 38, 74, .20); stroke: #e0264a; stroke-width: 1.5; stroke-dasharray: 5 3;
}
.perfil-svg .sig-banda.cerca {
  fill: rgba(224, 138, 38, .10); stroke: #e08a26; stroke-width: 1; stroke-dasharray: 3 4;
}
.sig-item {
  border: 1px solid var(--borde); border-left: 3px solid var(--borde);
  border-radius: 7px; padding: 8px 11px; margin-top: 8px; background: var(--panel-alt);
}
.sig-item.cruza { border-left-color: #e0264a; }
/* Al tocar la franja del SIGMET en el corte vertical, la pantalla baja hasta
   este aviso y lo marca un momento, para que se vea CUÁL de todos es. */
.sig-item.sig-resaltado { animation: sig-marcar 2.2s ease-out; }
@keyframes sig-marcar {
  0%, 30% { background: var(--naranja-db); box-shadow: 0 0 0 2px var(--naranja); }
  100%    { background: transparent; box-shadow: 0 0 0 0 transparent; }
}
.sig-item.cerca { border-left-color: #e08a26; }
.sig-cab { display: flex; flex-wrap: wrap; gap: 8px; align-items: baseline; }
.sig-tipo { font-weight: 700; font-size: 13px; }
.sig-item.cruza .sig-tipo { color: #e0264a; }
.sig-item.cerca .sig-tipo { color: #e08a26; }
.sig-fir { font-size: 11px; color: var(--muted); }
.sig-datos { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 4px; font-size: 11.5px; color: var(--muted); }
.sig-datos strong { color: var(--texto); }
.sig-caduco { color: var(--alerta); }
.sig-crudo {
  font-size: 10.5px; line-height: 1.45; white-space: pre-wrap; margin: 6px 0 0;
  color: var(--muted);
}

/* --------------------- NOTAM --------------------- */
/* A QUÉ AERÓDROMO pertenece cada aviso importa tanto como el aviso.
   ⚠️ Antes el rótulo era gris de 12px y se perdía entre las cajas de colores
   de los NOTAM, que gritan mucho más. Ahora es un encabezado de verdad: texto
   grande, del color principal, con una barra naranja al costado y una línea
   que lo separa del grupo anterior. */
.notam-grupo { margin-top: 18px; }
.notam-grupo:first-of-type { margin-top: 4px; }
.notam-grupo + .notam-grupo { border-top: 1px solid var(--borde); padding-top: 16px; }
.notam-grupo h4 {
  font-size: 15px; margin: 0 0 9px; display: flex; flex-wrap: wrap;
  gap: 8px; align-items: center; color: var(--texto); font-weight: 700;
  border-left: 3px solid var(--naranja); padding-left: 9px;
}
/* El rol (Salida / Destino / Alternativo / FIR) delante del código */
.notam-rol {
  font-size: var(--t-mini); font-weight: 700; color: var(--naranja-cl);
  background: var(--naranja-db); border: 1px solid var(--naranja);
  border-radius: 999px; padding: 2px 8px;
}
.notam-grupo h4 .nom { font-weight: 400; color: var(--muted); font-size: var(--t-chico); }
.notam-falla { color: var(--alerta); }

/* Avisos apartados (fuera del horario del vuelo, o lejos de la ruta): se
   pliegan pero NUNCA se esconden, y el resumen dice cuántos son. */
.notam-apartados { margin-top: 8px; border-top: 1px solid var(--borde); padding-top: 8px; }
.notam-apartados > summary {
  cursor: pointer; font-size: 11px; color: var(--muted); list-style: revert;
}
.notam-apartados > summary:hover { color: var(--texto); }
.notam-item {
  border: 1px solid var(--borde); border-left: 3px solid var(--borde);
  border-radius: 7px; padding: 8px 11px; margin-top: 6px; background: var(--panel-alt);
}
/* ⚠️ DOS BANDAS Y DOS INTENSIDADES (ver el comentario largo de claseNotam).
   Banda = qué le hace al vuelo: rojo impide, ámbar hay que mirarlo.
   Intensidad = si te toca a vos: fuerte cuando el aviso cae sobre ESTE vuelo,
   apagado cuando es real pero queda lejos de la ruta o fuera de tu horario.
   Los fuertes son exactamente los que cuenta el encabezado, así que "2
   críticos" se corresponde con dos renglones que saltan a la vista.

   Los apagados usan el MISMO tono pero al 45% sobre el fondo de la tarjeta: es
   el mismo color, más lavado, no otro color. Un tono distinto se leería como
   otra categoría. */
.notam-item.impide { border-left-color: color-mix(in srgb, var(--peligro) 45%, var(--borde)); }
.notam-item.mirar  { border-left-color: color-mix(in srgb, var(--alerta) 45%, var(--borde)); }
.notam-item.grave  { border-left-color: color-mix(in srgb, var(--peligro) 45%, var(--borde)); }

/* Los que SÍ tocan este vuelo: barra gruesa, color pleno y el fondo teñido.
   Los tres juntos hacen que el renglón se encuentre pasando la hoja. */
.notam-item.impide.fuerte {
  border-left-width: 4px; border-left-color: var(--peligro);
  background: var(--peligro-db);
  border-color: color-mix(in srgb, var(--peligro) 30%, var(--borde));
  border-left-color: var(--peligro);
}
.notam-item.mirar.fuerte {
  border-left-width: 4px; border-left-color: var(--alerta);
  background: var(--alerta-db);
  border-color: color-mix(in srgb, var(--alerta) 30%, var(--borde));
  border-left-color: var(--alerta);
}

/* La marca escrita. El color no puede ser lo único que distinga un aviso que
   impide el vuelo: en la hoja impresa en blanco y negro no hay color, y hay
   gente que no distingue el rojo del ámbar. */
.notam-marca {
  font-size: 9.5px; font-weight: 800; letter-spacing: .09em;
  padding: 1px 5px; border-radius: 3px; flex: 0 0 auto;
}
.notam-marca.es-critico  { background: var(--peligro); color: #fff; }
.notam-marca.es-atencion { background: var(--alerta); color: #241a00; }
[data-theme="light"] .notam-marca.es-atencion { color: #fff; }
.notam-cab { display: flex; flex-wrap: wrap; gap: 8px; align-items: baseline; }
.notam-id { font-size: 11.5px;
  font-weight: 700; color: var(--texto);
}
.notam-tipo { font-weight: 700; font-size: 12.5px; }
.notam-item.grave .notam-tipo { color: #e0264a; }
.notam-dist { font-size: 11px; color: var(--muted); margin-left: auto; }
.notam-texto { margin: 5px 0 0; font-size: 12px; line-height: 1.5; }
.notam-pie {
  display: flex; flex-wrap: wrap; gap: 12px; margin-top: 5px;
  font-size: 11px; color: var(--muted);
}

/* --------------------- Distancias de pista --------------------- */
/* Salida y llegada, una al lado de la otra SÓLO si entran.
   ⚠️ Antes eran dos columnas fijas: con el panel a media pantalla, las dos
   tablas no entraban y la tarjeta las recortaba. Con `auto-fit` bajan solas a
   una columna cuando no hay lugar. */
.dist-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 18px; }
@media (max-width: 900px) { .dist-grid { grid-template-columns: 1fr; } }
/* Y si aun así la tabla se pasa, se puede correr de costado en vez de cortarse */
.dist-pista-caja { overflow-x: auto; }
/* ⚠️ `min-width: 0` EN EL HIJO DE LA GRILLA. Sin esto el scroll de arriba no
   sirve para nada: un elemento de grilla mide por lo menos su contenido
   (`min-width: auto`), así que el bloque de cada pista crecía hasta el ancho de
   la tabla y se salía del panel por la derecha, pasándose del margen de todo lo
   demás. Con 0 puede achicarse, y ahí sí la caja de adentro scrollea. */
.dist-grid > * { min-width: 0; }
.dist-tit {
  font-size: 12px;
  margin: 0 0 3px; display: flex; flex-wrap: wrap; gap: 8px; align-items: baseline;
}
.dist-pista { text-transform: none; letter-spacing: 0; font-size: 11px; color: var(--naranja); font-weight: 600; }
.dist-pista.sin { color: var(--alerta); }
.dist-cond { margin: 0 0 7px; font-size: 10.5px; }
.dist-sub { margin: 10px 0 4px; font-size: 10.5px; }
.tabla-dist { width: 100%; border-collapse: collapse; font-size: 11.5px; }
.tabla-dist th {
  font-size: 11.5px;
  color: var(--muted); text-align: right; padding: 3px 5px; font-weight: 600;
}
.tabla-dist th:first-child, .tabla-dist td:first-child { text-align: left; }
.tabla-dist td { padding: 3px 5px; text-align: right; border-bottom: 1px solid var(--borde); white-space: nowrap; }
.tabla-dist tr.ok    td:last-child { color: #2ead6a; font-weight: 700; }
.tabla-dist tr.aviso td:last-child { color: var(--alerta); font-weight: 700; }
.tabla-dist tr.mal   td { color: #e04a4a; }
.tabla-dist tr.mal   td:last-child { font-weight: 700; }
.tabla-dist tr.fila-actual { background: rgba(255, 167, 38, .08); }
.tabla-dist .est { font-size: 9px; color: var(--muted); font-style: italic; }
.dist-aviso { margin-top: 8px; font-size: 10.5px; line-height: 1.45; }

/* ------------------------- Peso y balance ------------------------- */
.bloque-wb { margin-top: 14px; }
.wb-avion { font-size: 12px; color: var(--muted); font-weight: 500; }
.wb-grid { display: grid; grid-template-columns: minmax(240px, 320px) 1fr; gap: 20px; align-items: start; }
@media (max-width: 860px) { .wb-grid { grid-template-columns: 1fr; } }

/* Dibujo del avión: las casillas van encima, posicionadas por estación */
/* ⚠️ El esquema se dibuja ALTO (lienzo de 430) porque el eje largo ES la
   estación real del POH, y eso no se toca: es lo que hace que cada casilla
   caiga en su lugar físico. Lo que se achica es cuánto ocupa en pantalla, con
   un ancho menor: así la columna izquierda termina a la misma altura que la de
   resultados en vez de quedar como un chorizo con medio panel vacío al lado.
   Las casillas van posicionadas en %, así que acompañan solas. */
.wb-plano { position: relative; flex: 0 1 172px; max-width: 172px; margin: 0 auto; }
.wb-svg { display: block; width: 100%; height: auto; }
.wb-fus { fill: var(--panel-alt); stroke: var(--texto); stroke-width: 1.6; opacity: .95; }
.wb-butaca { fill: none; stroke: var(--texto); stroke-width: 1.3; opacity: .75; }
.wb-linea-int { stroke: var(--texto); stroke-width: 1.2; opacity: .6; stroke-linecap: round; }
.wb-divisor { stroke: var(--texto); stroke-width: 1.1; opacity: .5; }
.wb-area { fill: var(--muted); font-size: 10px; font-weight: 700; letter-spacing: .06em; font-family: inherit; }

/* Selector de unidades: de peso (lb/kg) y de combustible (gal/L) */
.wb-unidades, .comb-unidades { display: inline-flex; gap: 0; vertical-align: middle; }
.wb-unidades { margin-left: 10px; }
.wb-u {
  padding: 3px 11px; font-size: 11px; font-weight: 700; cursor: pointer;
  background: var(--panel-alt); color: var(--muted);
  border: 1px solid var(--borde);
}
.wb-u:first-child { border-radius: 6px 0 0 6px; }
.wb-u:last-child { border-radius: 0 6px 6px 0; border-left: none; }
.wb-u.act { background: var(--naranja); color: #14140f; border-color: var(--naranja); }

/* Combustible: viene del plan, no se edita acá */
.wb-comb-plan {
  display: flex; justify-content: space-between; align-items: baseline; gap: 10px;
  margin-top: 10px; padding: 8px 11px; border-radius: 7px;
  background: var(--panel-alt); border: 1px solid var(--borde);
  font-size: 12px;
}
.wb-comb-plan span { color: var(--muted); }
.wb-comb-plan strong { color: var(--naranja); font-size: 12.5px; }

/* ⚠️ Las casillas de carga van FUERA del dibujo, a los costados. Estaban
   encimadas sobre el fuselaje (`position:absolute` sobre `.wb-plano`) y con el
   dibujo achicado se tapaban entre ellas y tapaban el esquema. Ahora hay una
   columna a cada lado y cada casilla se posiciona a la altura de su estación:
   el asiento izquierdo a la izquierda, el derecho a la derecha, y lo que va
   sobre el eje (el equipaje) a la derecha, que ahí está libre. */
.wb-plano-fila { display: flex; align-items: stretch; justify-content: center; gap: 6px; }
/* El ancho va de la mano del alto mínimo del SVG: ver el comentario largo de
   `.wb-svg`. A 78 px el rótulo y el "FS …" se partían en dos renglones cada uno
   y la casilla trepaba a 87 px de alto. */
.wb-lado { position: relative; flex: 1 1 96px; min-width: 96px; max-width: 126px; }
.wb-lado .wb-campo {
  position: absolute; transform: translateY(-50%); width: 100%;
  display: flex; flex-direction: column; align-items: center; gap: 2px;
}
.wb-lado.izq .wb-campo { right: 0; }
.wb-lado.der .wb-campo { left: 0; }
.wb-campo input {
  width: 100%; max-width: 68px; padding: 5px 4px; text-align: center;
  font-size: 13px; font-weight: 700;
  border: 1px solid var(--borde); border-radius: 6px;
  background: var(--panel); color: var(--texto);
}
.wb-campo input:focus { outline: none; border-color: var(--naranja); }
/* ⚠️ POR QUÉ EL DIBUJO TIENE ALTO MÍNIMO Y LAS COLUMNAS SON MÁS ANCHAS
   Las casillas se ubican a la altura de su estación, así que la separación
   entre dos casillas vecinas sale del ALTO del esquema. Al llevar el rótulo de
   9,5 px al tamaño normal de la app, las casillas crecieron y las dos zonas de
   equipaje del C152 quedaban montadas una sobre la otra.
   Hacen falta las DOS cosas, y ninguna alcanza sola:
   · Ensanchar las columnas baja la casilla de 87 a 59 px (el rótulo y el "FS…"
     dejan de partirse en dos renglones), PERO le saca ancho al dibujo, que baja
     de alto y junta todavía más las estaciones.
   · El alto mínimo del SVG cancela justamente ese efecto: con
     `preserveAspectRatio` el dibujo mantiene la proporción y las estaciones
     quedan separadas sea cual sea el ancho de la ventana.
   Con 380 px quedan 90 px entre estaciones contra 59 de casilla: margen de
   sobra para nombres de estación más largos en otros aviones.
   Probado sin un solo pisado de 620 a 1400 px de ventana. */
.wb-svg { min-height: 380px; }

/* El rótulo de la estación ("Piloto", "Acompañante", "Equipaje 1"). Va al
   tamaño normal de la app: a 9,5 px era la letra más chica de toda la pantalla
   y había que acercarse para leer en qué asiento se está cargando el peso. */
.wb-rot { font-size: var(--t-chico); color: var(--texto); text-align: center;
  line-height: 1.25; overflow-wrap: anywhere; }
.wb-fs {
  font-size: var(--t-mini); color: var(--muted); text-align: center; line-height: 1.2;
  overflow-wrap: anywhere;
}
.wb-nota { margin-top: 10px; }
.wb-vacio { display: flex; gap: 10px; margin-top: 8px; }
.wb-vacio label { flex: 1; font-size: 10.5px; color: var(--muted); display: flex; flex-direction: column; gap: 3px; }
.wb-vacio input {
  padding: 6px; font-size: 12.5px; border: 1px solid var(--borde); border-radius: 6px;
  background: var(--panel); color: var(--texto);
}

/* Resultados */
.wb-veredicto {
  padding: 9px 12px; border-radius: 7px; font-weight: 700; font-size: 13.5px; margin-bottom: 12px;
}
.wb-veredicto.ok { background: rgba(46, 173, 106, .16); color: #2ead6a; }
.wb-veredicto.no { background: rgba(224, 74, 74, .16); color: #e04a4a; }
.wb-tabla { width: 100%; border-collapse: collapse; font-size: 12px; margin-bottom: 12px; }
.wb-tabla th, .wb-tabla td { padding: 5px 7px; border-bottom: 1px solid var(--borde); }
.wb-tabla th { font-size: 11.5px; color: var(--muted); text-align: left; }
.wb-tabla td:not(:first-child), .wb-tabla th:not(:first-child) { text-align: right; }
.wb-tabla tfoot td { border-top: 2px solid var(--borde); border-bottom: none; }
.wb-tabla tr.wb-mal td { color: #e04a4a; }

/* Gráfico del sobre de CG */
.wb-env { width: 100%; height: auto; max-width: 380px; display: block; }
.wb-sobre { fill: rgba(46, 173, 106, .13); stroke: #2ead6a; stroke-width: 1.6; }
.wb-rej { stroke: var(--borde); stroke-width: 1; stroke-dasharray: 2 4; opacity: .55; }
.wb-ejeL { stroke: var(--borde); stroke-width: 1.2; }
.wb-eje { fill: var(--muted); font-size: 9px; font-family: inherit; }
.wb-tit { font-size: 9.5px; }
.wb-guia { stroke: var(--muted); stroke-width: 1; stroke-dasharray: 3 3; opacity: .8; }
.wb-punto.ok { fill: #2ead6a; stroke: var(--panel); stroke-width: 2; }
.wb-punto.no { fill: #e04a4a; stroke: var(--panel); stroke-width: 2; }

/* ------- Performance: datos en dos renglones + combustible al lado ------- */
/* Las cifras arriba a todo el ancho y el combustible legal DEBAJO, también a
   todo el ancho: es la tabla que decide si el vuelo sale o no, y apretada en
   media columna se leía peor que el resto. */
.perf-fila { display: flex; flex-direction: column; gap: 14px; }
/* ⚠️ Los dos hijos van con `flex: 0 0 auto`. Traían `flex: 1 1 260px` y
   `flex: 1 1 400px` de cuando esto era una FILA: al pasarlo a columna, ese
   flex-basis dejó de ser el ancho y pasó a ser el ALTO, y encima crecían. Por
   eso quedaban 140 px de aire abajo de los cuadros y otros tantos abajo de la
   tabla. Y el `margin-top: 14px` de cada uno se sumaba al `gap` del contenedor:
   arriba de la tabla había 28 px en vez de 14. */
.perf-fila > .grid-datos.perf-datos,
.perf-fila > .fuel-caja { flex: 0 0 auto; margin-top: 0; margin-bottom: 0; }
.perf-fila > .fuel-caja { width: 100%; max-width: none; }
/* Los cuadros de datos van en DOS renglones (3 columnas para 5-6 datos). El
   selector lleva .grid-datos para ganarle a .grid-datos.compacto. */
.grid-datos.perf-datos {
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 8px; align-content: start;
}
@media (max-width: 1100px) { .grid-datos.perf-datos { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* ---------------- Combustible mínimo legal (RAAC 91.151) ---------------- */
.fuel-caja {
  /* ⚠️ El min-width era 360px fijo: en un celular de 375 no entraba dentro de
     la tarjeta y, como la tarjeta recorta para que el encabezado desplegable
     respete las esquinas redondeadas, el combustible mínimo legal quedaba
     CORTADO. Con min(360px, 100%) se achica cuando hace falta. */
  flex: 1 1 400px; min-width: min(360px, 100%); max-width: 520px;
  border: 1px solid var(--borde); border-left: 3px solid var(--borde);
  border-radius: 8px; padding: 9px 12px; background: var(--panel-alt); margin-top: 14px;
}
.fuel-caja.ok { border-left-color: #2ead6a; }
.fuel-caja.no { border-left-color: #e04a4a; }
.fuel-cab { display: flex; justify-content: space-between; align-items: center; gap: 8px; }
.fuel-tit { font-size: 11px; color: var(--muted); font-weight: 700; }
.fuel-regla { font-size: 10px; color: var(--muted); margin: 2px 0 6px; }
.badge-legal {
  padding: 2px 8px; border-radius: 999px; white-space: nowrap;
  font-size: 10.5px; font-weight: 700; letter-spacing: .02em;
}
/* ⚠️ LOS COLORES SALEN DE LAS VARIABLES DEL TEMA, NO A MANO. Estaban fijos en
   #2ead6a y #e04a4a para los dos temas y ninguno de los dos pasaba AA: medido,
   daban 4,13 y 3,23 en oscuro, y 2,41 y 3,16 en claro (hace falta 4,5). Las
   variables --ok y --peligro ya están calibradas tema por tema. */
/* El rojo y el ámbar se retocan SOLO para el chip, no en la variable global:
   esos colores se usan también para bordes y líneas, donde el mínimo de
   contraste que hace falta es otro.
   ⚠️ LOS DOS TEMAS DEFINEN LAS DOS VARIABLES. Definiendo en cada uno sólo la
   que hacía falta, el rojo aclarado para el fondo oscuro se colaba en el tema
   claro (`:root` a secas también matchea el claro) y el contraste caía a 1,94.
   "Ojo" es el estado que faltaba: sin él, "tres SIGMET cerca de la ruta" tenía
   que elegir entre el verde de "no pasa nada" y el rojo de "te cruza", y
   ninguno de los dos era cierto. */
:root, :root[data-theme="dark"] { --badge-no: #ff8a8a; --badge-ojo: var(--alerta); }
:root[data-theme="light"] { --badge-no: var(--peligro); --badge-ojo: #7d4e00; }
.badge-legal.ok  { background: var(--ok-db);      color: var(--ok); }
.badge-legal.no  { background: var(--peligro-db); color: var(--badge-no); }
.badge-legal.ojo { background: var(--alerta-db);  color: var(--badge-ojo); }
.tabla-fuel { width: 100%; border-collapse: collapse; font-size: 11.5px; table-layout: auto; }
.tabla-fuel th {
  font-size: 11.5px;
  color: var(--muted); text-align: right; padding: 0 0 3px; font-weight: 600;
}
.tabla-fuel th:nth-child(2), .tabla-fuel th:nth-child(3) { padding-left: 10px; }
.tabla-fuel td { padding: 4px 0; border-bottom: 1px solid var(--borde); }
/* Las dos columnas de números nunca se parten ni se recortan; el concepto es
   el único que puede envolver si el texto es largo.
   Estaban en `width: 1%` (lo más angostas posible) y con la tabla a todo el
   ancho quedaban dos cifras perdidas contra el borde derecho y un vacío enorme
   en el medio. Con un ancho propio los números se leen como una columna. */
.tabla-fuel th:nth-child(2), .tabla-fuel td:nth-child(2) { width: 92px; }
.tabla-fuel th:nth-child(3), .tabla-fuel td:nth-child(3) { width: 84px; }
.tabla-fuel td:nth-child(2) { text-align: right; white-space: nowrap; padding-left: 10px; }
.tabla-fuel td:nth-child(3) { text-align: right; white-space: nowrap; padding-left: 10px; }
.tabla-fuel td:first-child { color: var(--muted); line-height: 1.3; }
.tabla-fuel tfoot .fila-total td { border-top: 2px solid var(--borde); color: var(--texto); }
.tabla-fuel tfoot .fila-ok  td { color: #2ead6a; }
.tabla-fuel tfoot .fila-mal td { color: #e04a4a; }
.fuel-det { margin-top: 7px; }
.fuel-det summary { font-size: 10.5px; color: var(--muted); cursor: pointer; }
.fuel-det p { font-size: 10.5px; color: var(--muted); line-height: 1.4; margin: 5px 0 0; }

/* Cobertura de ruta y captions integrados (reemplazan callouts sueltos) */
.ruta-cobertura {
  font-size: 12px; padding: 8px 11px; border-radius: 6px; margin-top: 10px;
  border-left: 3px solid;
}
.ruta-cobertura.ok     { background: rgba(255,107,0,.06); border-color: var(--naranja); color: var(--naranja-cl); }
.ruta-cobertura.alerta { background: rgba(255,176,32,.08); border-color: var(--alerta); color: var(--alerta); }

/* AVISO DE TERRENO. Va arriba de todo el resultado y NO se puede cerrar: es el
   único aviso de la app que habla de chocar contra el suelo. Rojo cuando la
   ruta pasa por debajo del terreno, ámbar cuando pasa raspando. */
.aviso-terreno {
  border-radius: 10px; padding: 14px 16px; margin: 0 0 16px;
  border: 1px solid; border-left-width: 4px;
}
.aviso-terreno.choca { background: rgba(255,82,82,.10); border-color: var(--peligro); }
.aviso-terreno.justo { background: rgba(255,176,32,.09); border-color: var(--alerta); }
.aviso-terreno-tit { font-weight: 800; font-size: 15px; margin-bottom: 6px; }
.aviso-terreno.choca .aviso-terreno-tit { color: var(--peligro); }
.aviso-terreno.justo .aviso-terreno-tit { color: var(--alerta); }
.aviso-terreno-txt { font-size: 13px; line-height: 1.5; margin: 0 0 6px; color: var(--texto); }
.aviso-terreno-txt strong { color: var(--texto); }
.aviso-terreno .marca-fuente { margin-top: 4px; }

/* Aviso de vuelo nocturno. Va arriba de las tarjetas de meteorología porque
   cambia la decisión de salir: no es un detalle del METAR.
   Ámbar cuando es de noche y está resuelto; rojo cuando falta verificar algo
   (aeródromo no habilitado, o sin dato de habilitación ni de balizamiento). */
.aviso-noche {
  border-radius: 8px; padding: 11px 13px; margin: 0 0 14px;
  border-left: 3px solid; font-size: 12.5px;
}
.aviso-noche.aviso  { background: rgba(255,176,32,.08); border-color: var(--alerta); }
.aviso-noche.alerta { background: rgba(255,90,90,.09);  border-color: #ff5a5a; }
.aviso-noche-tit { font-weight: 700; margin-bottom: 7px; }
.aviso-noche.aviso  .aviso-noche-tit { color: var(--alerta); }
.aviso-noche.alerta .aviso-noche-tit { color: #ff5a5a; }
.aviso-noche-fila { display: flex; gap: 9px; padding: 5px 0; align-items: baseline; }
.aviso-noche-fila + .aviso-noche-fila { border-top: 1px solid var(--borde); }
.aviso-noche-rol { flex: 0 0 auto; font-weight: 700; color: var(--texto); white-space: nowrap; }
.aviso-noche-txt { color: var(--muted); line-height: 1.45; min-width: 0; }
.aviso-noche-fila.alerta .aviso-noche-txt { color: var(--texto); }

.cap-transicion { margin-top: 12px; border-top: 1px solid var(--borde); padding-top: 10px; }
.cap-transicion strong { color: var(--texto); }
.cap-alerta { color: var(--alerta); font-weight: 600; }

/* Editor de ruta */
/* ⚠️ LA COLUMNA SE ESTIRA Y EL CAMPO SE COME LO QUE SOBRA.
   La columna de la izquierda terminaba donde terminaba su contenido y, al lado,
   la de sugerencias seguía bajando: quedaba un hueco muerto abajo del campo de
   la ruta. Con `align-items: stretch` las dos columnas miden lo mismo, y con
   el editor en `flex: 1` el campo crece hasta donde arrancan los botones de
   insertar punto. */
.ruta-fila { align-items: stretch; }
.ruta-col-input { display: flex; flex-direction: column; }
.ruta-editor { display: flex; gap: 8px; align-items: stretch; flex: 1 1 auto; }
.ruta-editor-botones { display: flex; flex-direction: column; gap: 8px; }
.ruta-editor-botones .btn-ruta { padding: 8px 14px; }
.ruta-input {
  flex: 1; padding: 9px 11px;
  background: var(--negro); border: 1px solid var(--borde); border-radius: 6px;
  color: var(--naranja-cl);
  font-size: 13px; letter-spacing: .5px;
  /* Como ahora es un `textarea`: hereda la tipografía, se parte en renglones y
     no se le puede cambiar el tamaño de una esquina (lo decide el layout). */
  font-family: inherit; line-height: 1.5;
  resize: none; min-height: 74px;
  overflow-wrap: anywhere;
}
.ruta-input:focus { outline: none; border-color: var(--naranja); box-shadow: 0 0 0 2px rgba(255,107,0,.15); }
.btn-ruta {
  padding: 0 14px; border-radius: 6px; border: 1px solid var(--naranja);
  background: var(--naranja); color: #fff; font-weight: 700; font-size: 12px;
  cursor: pointer; white-space: nowrap;
}
.btn-ruta:hover { background: var(--naranja-cl); }
.btn-ruta.secundario { background: transparent; color: var(--muted); border-color: var(--borde); }
.btn-ruta.secundario:hover { color: var(--naranja); border-color: var(--naranja); }

/* ---------------- Puntos de ruta cargados a mano ---------------- */
/* Botonera debajo del campo de ruta */
.ruta-acciones { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; }
/* Cada botón lleva su rótulo largo y uno corto: el largo no entra en el ancho
   de un celular y los mandaba a dos renglones. */
.ra-corto { display: none; }
.btn-punto-mapa {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 7px 12px; border-radius: 6px; cursor: pointer;
  background: var(--panel-alt); border: 1px solid var(--borde);
  color: var(--texto); font-size: 12px; font-weight: 600;
  transition: border-color .12s, background .12s, color .12s;
}
.btn-punto-mapa:hover { border-color: var(--naranja); color: var(--naranja); }
/* Mientras el modo esta activo el boton queda marcado: el mapa esta esperando
   un clic y hay que poder ver que la app quedo en ese estado. */
.btn-punto-mapa.activo {
  background: var(--naranja); border-color: var(--naranja); color: #fff;
}
.btn-punto-mapa.activo .pin-icono { background: #fff; }
.btn-ayuda-puntos {
  padding: 7px 12px; border-radius: 6px; cursor: pointer;
  background: transparent; border: 1px dashed var(--borde);
  color: var(--muted); font-size: 12px;
}
.btn-ayuda-puntos:hover { color: var(--naranja); border-color: var(--naranja); }

/* Chinche dibujada con CSS (sin imagenes que haya que descargar) */
.pin-icono {
  width: 9px; height: 9px; flex: none;
  background: var(--naranja);
  border-radius: 50% 50% 50% 0;
  transform: rotate(-45deg);
}

/* Ayuda plegable de los formatos */
/* "¿Cómo escribo un punto?" también enseña a usar la app, así que lleva el
   violeta y la lamparita como el resto de los tips. Antes iba con el naranja de
   la marca, que no distingue una explicación de un dato. */
.ayuda-puntos {
  margin-top: 8px; padding: 12px 14px;
  background: var(--tip-db); border: 1px solid var(--tip-bd);
  border-left: 3px solid var(--tip); border-radius: 6px;
  font-size: 12px; line-height: 1.55; color: var(--texto);
}
.btn-ayuda-puntos .ico { width: 15px; height: 15px; color: var(--tip); }
.ayuda-puntos.oculto { display: none; }
.ayuda-puntos p { margin: 0 0 8px; }
.ayuda-puntos p:last-child { margin-bottom: 0; }
.ayuda-puntos code { font-size: 12px;
  padding: 1px 5px; border-radius: 4px;
  background: var(--negro); color: var(--naranja-cl);
}
/* ⚠️ ESTA TABLA SE SALÍA DE SU CAJA. Medido en el panel de la ruta: la caja
   mide 369 px y el contenido llegaba a 792, o sea 426 px de desborde tapando lo
   de al lado. Dos causas juntas:
     · `white-space: nowrap` en el encabezado, que le fijaba a la primera
       columna un ancho mínimo enorme;
     · los ejemplos largos (`462030S0750415W`) dentro de un <code>, que no
       tienen dónde cortarse.
   `table-layout: fixed` es lo que obliga a respetar el `width: 100%`: sin eso
   el navegador agranda la tabla hasta que entre el contenido, y el 100% no
   sirve de nada. */
.tabla-ayuda {
  border-collapse: collapse; margin: 0 0 10px;
  width: 100%; table-layout: fixed;
}
.tabla-ayuda th {
  /* ⚠️ El selector suelto `th` de esta hoja pone `white-space: nowrap` para
     la tabla de tramos. Acá hay que anularlo A MANO: sin esto el texto de las
     celdas no corta nunca y se sale de la caja, aunque la tabla mida bien. */
  white-space: normal;
  text-align: left; vertical-align: top;
  width: 34%;
  padding: 6px 12px 6px 0; font-size: 11px; color: var(--naranja);
  border-top: 1px solid var(--borde);
  overflow-wrap: anywhere;
}
.tabla-ayuda td {
  white-space: normal; text-align: left;
  vertical-align: top; padding: 6px 0; border-top: 1px solid var(--borde);
  overflow-wrap: anywhere;
}
/* Los ejemplos no se parten en cualquier lado, pero sí pueden pasar al renglón
   siguiente enteros. */
.tabla-ayuda code { overflow-wrap: break-word; }
/* Cinturón de seguridad: si algún día entra algo que no se puede partir, la
   caja scrollea sola en vez de reventar la maqueta. */
.ayuda-puntos { overflow-x: auto; }
.ay-sub { font-weight: 400; color: var(--muted); font-size: 10px; }
.ay-nota { color: var(--muted); font-size: 11px; }
.lista-avisos { margin: 6px 0 0; padding-left: 20px; }
.lista-avisos li { margin-bottom: 3px; }

/* Cursor de chinche sobre el mapa mientras se elige el punto. Hay que pisar
   tambien los cursores propios de Leaflet (grab / pointer), o el cursor cambia
   segun si el mouse esta sobre un poligono o sobre el fondo. */
#mapa.modo-pin,
#mapa.modo-pin .leaflet-grab,
#mapa.modo-pin .leaflet-interactive,
#mapa.modo-pin .leaflet-container {
  cursor: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='34' viewBox='0 0 32 34'%3E%3Cpath d='M16 2C11 2 7 6 7 11c0 6.5 9 21 9 21s9-14.5 9-21c0-5-4-9-9-9z' fill='%23ff6b00' stroke='%23fff' stroke-width='2.2' stroke-linejoin='round'/%3E%3Ccircle cx='16' cy='11' r='3.2' fill='%23fff'/%3E%3C/svg%3E") 16 32, crosshair !important;
}
/* Borde encendido: el mapa esta "armado" esperando el clic */
#mapa.modo-pin { box-shadow: inset 0 0 0 3px var(--naranja); }

/* Mientras se elige el punto el mapa crece lo que mide la barra, para que la
   barra no tape justo la zona donde el piloto va a hacer clic. */
.mapa-caja.eligiendo #mapa { height: 540px; }

/* Barra de instrucciones y vista previa, encima del mapa */
.pin-barra {
  position: absolute; left: 0; right: 0; bottom: 0; z-index: 1200;
  background: color-mix(in srgb, var(--panel) 94%, transparent);
  border-top: 2px solid var(--naranja);
  padding: 8px 12px; font-size: 12px; line-height: 1.5;
  backdrop-filter: blur(3px);
}
.pin-barra.oculto { display: none; }
.pin-linea1 { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; color: var(--texto); }
.btn-pin-cancelar {
  margin-left: auto; padding: 4px 10px; border-radius: 5px; cursor: pointer;
  background: transparent; border: 1px solid var(--borde);
  color: var(--muted); font-size: 11px;
}
.btn-pin-cancelar:hover { color: var(--naranja); border-color: var(--naranja); }
.pin-detalle {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  margin-top: 6px; padding-top: 6px; border-top: 1px solid var(--borde);
  font-size: 11.5px; color: var(--muted);
  /* Un aviso largo no puede comerse el mapa: la barra se queda chica y el
     texto se desplaza adentro. */
  max-height: 74px; overflow-y: auto;
}
.pin-token, .pin-ruta code { font-weight: 700;
  padding: 2px 7px; border-radius: 4px;
  background: var(--negro); color: var(--naranja-cl);
}
.pin-token { font-size: 13px; letter-spacing: .5px; }
.pin-txt { color: var(--texto); }
.pin-err { color: var(--muted); font-size: 11px; }
.pin-ruta { font-size: 11px; }
/* Dónde entra el punto. Cuando lo eligió el piloto (dejando el cursor en el
   texto de la ruta) se marca en naranja, para que se note que manda él y no
   la adivinanza del tramo más cercano. */
.pin-donde { font-size: 11px; color: var(--muted); }
.pin-donde strong { color: var(--texto); }
.pin-donde.a-mano, .pin-donde.a-mano strong { color: var(--naranja-cl); }
.pin-corte {
  font-size: 11px; font-weight: 700; color: var(--naranja-cl);
  border: 1px solid var(--naranja); border-radius: 999px; padding: 2px 9px;
}
.pin-aviso { color: var(--alerta); flex-basis: 100%; }

/* Vista previa del punto sobre el mapa */
.pin-previo .pin-cuerpo {
  width: 26px; height: 26px; border-radius: 50%;
  border: 2px solid var(--naranja); background: rgba(255,107,0,.28);
  box-shadow: 0 0 0 2px rgba(255,255,255,.6);
  animation: pin-latido 1.4s ease-in-out infinite;
}
@keyframes pin-latido {
  0%, 100% { transform: scale(1); opacity: 1; }
  50% { transform: scale(1.18); opacity: .75; }
}
/* .etq-pin ya no necesita regla propia: sólo fijaba la fuente monoespaciada,
   que se sacó de toda la app. */

/* ---------------- Mapas del vuelo ---------------- */
.btn-mapas {
  padding: 10px 18px; border-radius: 6px; cursor: pointer;
  background: var(--naranja); border: 1px solid var(--naranja);
  color: #fff; font-size: 13px; font-weight: 700;
}
.btn-mapas:hover { background: var(--naranja-cl); }
.mapas-cargando { color: var(--muted); font-size: 13px; padding: 24px 0; }

.solapas-mapas { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 10px; }
.solapa-mapa {
  padding: 7px 13px; border-radius: 6px 6px 0 0; cursor: pointer;
  background: var(--panel-alt); border: 1px solid var(--borde); border-bottom: none;
  color: var(--muted); font-size: 12px; font-weight: 600;
}
.solapa-mapa:hover { color: var(--naranja); }
.solapa-mapa.activa { background: var(--naranja); border-color: var(--naranja); color: #fff; }
.mapas-desc { margin: 0 0 8px; font-size: 12px; color: var(--muted); }

/* La hoja tiene fondo de papel SIEMPRE, también con el tema oscuro: es una
   carta pensada para leerse impresa, y en negativo no se entiende. */
.mapa-hoja {
  background: #ffffff; border: 1px solid var(--borde); border-radius: 6px;
  padding: 8px; overflow-x: auto;
}
.mapa-hoja svg.mapa-vuelo { display: block; width: 100%; height: auto; min-width: 700px; }
.mapas-pie { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 10px; }

/* Sugerencias de ruta (chips) */
.sugerencias { display: flex; align-items: stretch; gap: 8px; flex-wrap: wrap; margin-top: 12px; }
.sug-lbl {
  font-size: 11.5px;
  color: var(--muted); align-self: center; margin-right: 2px;
}
.chip-ruta {
  display: flex; flex-direction: column; gap: 1px;
  padding: 7px 11px; border-radius: 7px; cursor: pointer; text-align: left;
  background: var(--panel-alt); border: 1px solid var(--borde); color: var(--texto);
  transition: border-color .12s, background .12s;
}
.chip-ruta:hover { border-color: var(--naranja); background: rgba(255,107,0,.08); }
.chip-ruta.reco { border-color: var(--naranja); }
/* La que se está volando: se resalta, no se esconde. Las otras quedan a la
   vista para poder comparar y volver con un click. */
.chip-ruta.en-uso { border-color: var(--naranja); background: var(--naranja-db);
  box-shadow: inset 0 0 0 1px var(--naranja); }
.chip-ruta.en-uso .chip-dist { color: var(--naranja-cl); font-weight: 700; }
.chip-tag { font-size: 11px; font-weight: 700; color: var(--naranja-cl); }
.chip-ruta.reco .chip-tag::before { content: '★ '; }
.chip-dist { font-size: 13px; font-weight: 700; }
.chip-det { font-size: 10px; color: var(--muted); }

/* El nivel de CRUCERO planificado: es el que se vuela y el que va en la
   casilla 15 del plan de vuelo. Manda sobre el óptimo, que es una sugerencia. */
.nivel-crucero {
  display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap;
  margin-top: 12px; padding: 10px 13px;
  background: var(--panel-alt); border: 1px solid var(--borde);
  border-left: 3px solid var(--naranja); border-radius: 6px;
}
.nc-lbl { font-size: var(--t-chico); color: var(--muted); }
.nc-val { font-size: 21px; font-weight: 700; letter-spacing: -.3px; }
.nc-fl { font-size: 14px; font-weight: 700; color: var(--naranja-cl); }
.nc-auto { font-size: var(--t-mini); color: var(--muted); margin-left: auto; }

/* Campo con flechitas de paso (la V/S de descenso) */
.campo-paso { position: relative; }
.campo-paso input { width: 100%; padding-right: 30px; }
.paso-flechas { position: absolute; top: 0; right: 0; bottom: 0;
  display: flex; flex-direction: column; width: 26px;
  border-left: 1px solid var(--borde); }
.paso-btn { flex: 1; display: flex; align-items: center; justify-content: center;
  background: none; border: 0; color: var(--muted); cursor: pointer; padding: 0; }
.paso-btn:hover { color: var(--naranja-cl); background: var(--naranja-db); }
.paso-btn .ico { width: 11px; height: 11px; stroke-width: 2.6; }
.paso-btn:first-child { border-bottom: 1px solid var(--borde); }

/* ---------------- Campos de fecha y hora ------------------------------
   ⚠️ El calendario y el reloj los dibuja EL NAVEGADOR: no se pueden pintar con
   CSS. Lo que sí se puede es decirle en qué esquema está la página con
   `color-scheme`, y entonces Chrome dibuja el desplegable oscuro en vez de
   blanco, que es lo que desentonaba. Un panel con los colores exactos de la app
   sólo se consigue escribiendo un calendario propio.
   El iconito sí se puede teñir de naranja: es una imagen y se le aplica un
   filtro. Sin esto queda gris oscuro sobre fondo oscuro y no se ve. */
/* `accent-color` es lo ÚNICO del desplegable nativo que se puede pintar: Chrome
   lo usa para el día seleccionado del calendario y para la hora elegida en el
   reloj. El resto del panel (fondo, bordes, tipografía) lo dibuja el navegador
   y no hay CSS que lo alcance. */
.campo-fechahora { color-scheme: dark; cursor: pointer; accent-color: var(--naranja); }
:root[data-theme="light"] .campo-fechahora { color-scheme: light; }
.campo-fechahora::-webkit-calendar-picker-indicator {
  cursor: pointer; opacity: 1;
  /* De negro a naranja (#ff6b00). Los valores salen de convertir el color a
     una cadena de filtros; se verificó el resultado contra el token. */
  filter: invert(48%) sepia(72%) saturate(3000%) hue-rotate(1deg) brightness(103%) contrast(104%);
}
:root[data-theme="light"] .campo-fechahora::-webkit-calendar-picker-indicator {
  filter: invert(32%) sepia(89%) saturate(2400%) hue-rotate(9deg) brightness(94%) contrast(101%);
}
.campo-fechahora:focus { outline: none; border-color: var(--naranja); }

/* ================= BUSCADORES (aeródromos, ARO/AIS, combustible) ==========
   Los tres comparten estilo: un campo arriba y una lista de filas, cada una
   con el código a la izquierda y los datos al lado. */
.busc-input {
  width: 100%; padding: 10px 12px; margin: 4px 0 12px;
  font-size: var(--t-base); border: 1px solid var(--borde); border-radius: 8px;
  background: var(--panel); color: var(--texto);
}
.busc-input:focus { outline: none; border-color: var(--naranja); }
.busc-lista { display: flex; flex-direction: column; gap: 6px; }
.busc-fila {
  display: flex; align-items: flex-start; gap: 11px; width: 100%; text-align: left;
  padding: 10px 11px; border-radius: 8px;
  background: var(--panel-alt); border: 1px solid var(--borde); color: var(--texto);
}
button.busc-fila { cursor: pointer; }
button.busc-fila:hover { border-color: var(--naranja); }
.busc-fila-fija { cursor: default; }
.busc-apagada { opacity: .6; }
.busc-cod {
  flex: 0 0 auto; min-width: 46px; font-weight: 800; font-size: 14px;
  letter-spacing: .5px; color: var(--naranja-cl);
}
.busc-datos { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.busc-datos strong { font-size: 13px; line-height: 1.3; }
.busc-sub { font-size: 11px; color: var(--muted); line-height: 1.35; }
.busc-extra { flex: 0 0 auto; font-size: 11px; color: var(--muted); text-align: right; }
.busc-nota { margin-top: 12px; }
/* Teléfonos y correos: enlaces de verdad, para tocar y llamar */
.busc-contactos { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 4px; }
.contacto-enlace {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 4px 9px; border-radius: 999px; font-size: 11.5px;
  background: var(--negro); border: 1px solid var(--borde);
  color: var(--naranja-cl); text-decoration: none;
}
.contacto-enlace:hover { border-color: var(--naranja); }
.contacto-enlace .ico { width: 12px; height: 12px; }
.busc-etiquetas { display: flex; flex-wrap: wrap; gap: 5px; margin: 3px 0 1px; }
.comb-tag {
  font-size: 10.5px; font-weight: 700; padding: 2px 8px; border-radius: 999px;
  background: rgba(62,207,142,.14); color: var(--ok); border: 1px solid rgba(62,207,142,.4);
}
.comb-tag.no { background: rgba(255,80,80,.14); color: #ff8080; border-color: rgba(255,80,80,.4); }
/* El tipo de combustible cuando NO hay: gris y tachado. Sigue diciendo QUÉ es
   lo que falta, sin el verde que quiere decir "hay". */
.comb-tag.apagado {
  background: transparent; color: var(--muted); border-color: var(--borde);
  text-decoration: line-through;
}
.comb-tag.marca { background: rgba(255,107,0,.14); color: var(--naranja-cl); border-color: rgba(255,107,0,.45); }
.comb-tag.ojo { background: rgba(255,176,32,.14); color: var(--alerta); border-color: rgba(255,176,32,.4); }
/* Separador del menú lateral, entre "armar un vuelo" y "consultar" */
.lat-sep { height: 1px; background: var(--chapa-borde); margin: 6px 8px; flex: 0 0 auto; }

/* Pronóstico de la semana en la ficha del aeródromo. Se desplaza en horizontal
   si no entran los siete días: partirlos en dos renglones haría perder la
   lectura de izquierda a derecha, que es lo que hace legible una semana. */
.semana { display: flex; gap: 6px; overflow-x: auto; padding-bottom: 4px; }
.semana-dia {
  flex: 1 0 92px; min-width: 92px; text-align: center;
  padding: 8px 6px; border-radius: 8px;
  background: var(--panel-alt); border: 1px solid var(--borde);
}
.semana-fecha { font-size: 11px; font-weight: 700; color: var(--texto); line-height: 1.2; }
.semana-fecha small { display: block; font-size: 10px; font-weight: 400; color: var(--muted); }
/* El dibujito del tiempo. Se dibuja en SVG dentro de app.js (ver SVG_TIEMPO):
   los colores van ahí adentro porque cada parte lleva el suyo (el sol ámbar,
   la gota azul), así que acá sólo se le da tamaño y aire. */
.semana-icono { display: block; width: 40px; height: 40px; margin: 5px auto 1px; }
/* La categoría de vuelo del día. Es lo primero que mira un piloto: contesta
   "¿se puede volar?" antes que cualquier número. El código va en TEXTO y no
   sólo en color, para que se lea igual impreso en blanco y negro. */
.semana-cat {
  font-size: 10px; font-weight: 800; letter-spacing: .06em;
  padding: 2px 0; border-radius: 4px; margin: 3px 0 1px;
}
.semana-cat.cat-vfr  { background: var(--ok-db);      color: var(--ok); }
.semana-cat.cat-mvfr { background: var(--alerta-db);  color: var(--badge-ojo); }
.semana-cat.cat-ifr  { background: var(--peligro-db); color: var(--badge-no); }
.semana-cat.cat-lifr { background: var(--peligro-db); color: var(--badge-no); }
.semana-temp { font-size: 19px; font-weight: 800; color: var(--naranja-cl); margin: 2px 0 3px; }
.semana-linea { font-size: 10.5px; color: var(--muted); line-height: 1.35; }
.semana-fen { font-size: 10px; color: var(--alerta); margin-top: 3px; line-height: 1.3; }

/* ============== Aeródromos: mapa a pantalla completa =====================
   El buscador arriba y el mapa ocupando todo lo que queda. La lista de
   resultados flota SOBRE el mapa (a la izquierda) para no robarle alto. */
/* ⚠️ Alto en unidades de PANTALLA, no `height: 100%`. La columna izquierda
   scrollea (`overflow-y: auto`), así que no tiene un alto definido para que un
   hijo lo herede: con `100%` el mapa colapsaba a cero. */
.ad-mapa-vista { display: flex; flex-direction: column; gap: 10px; min-height: 0; }
.ad-mapa-barra { display: flex; align-items: center; gap: 12px; flex: 0 0 auto; }
.ad-mapa-barra .busc-input { margin: 0; flex: 1; }
.ad-mapa-cuenta { font-size: var(--t-mini); color: var(--muted); white-space: nowrap; }
.ad-mapa-caja { position: relative; flex: 1 1 auto; height: min(72vh, 720px); min-height: 320px; }
.ad-mapa { position: absolute; inset: 0; border-radius: 10px; overflow: hidden;
  border: 1px solid var(--borde); }
.ad-resultados {
  position: absolute; top: 10px; left: 10px; z-index: 500;
  width: 300px; max-width: calc(100% - 20px); max-height: calc(100% - 20px);
  overflow-y: auto; padding: 6px;
  background: var(--panel); border: 1px solid var(--borde); border-radius: 10px;
  box-shadow: 0 10px 30px rgba(0,0,0,.45);
  display: flex; flex-direction: column; gap: 4px;
}
.ad-resultados.oculto { display: none; }
.ad-res-fila {
  display: flex; align-items: flex-start; gap: 10px; width: 100%; text-align: left;
  padding: 7px 8px; border-radius: 7px; cursor: pointer;
  background: none; border: 1px solid transparent; color: var(--texto);
}
.ad-res-fila:hover { background: var(--panel-alt); border-color: var(--naranja); }
.ad-mapa-pie { flex: 0 0 auto; margin: 0; }

/* Entradas y salidas de TMA, arriba de la tabla de tramos */
.tma-caja {
  border: 1px solid var(--borde); border-left: 3px solid var(--naranja);
  border-radius: 8px; padding: 9px 12px; background: var(--panel-alt);
  margin: 0 0 12px;
}
.tma-cab { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.tma-lista { margin: 6px 0 0; line-height: 1.45; }

/* Cartas del AIP en la vista de exportar: agrupadas por aeródromo */
.cartas-ad + .cartas-ad { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--borde); }
.cartas-ad h4 { font-size: 12px; margin: 0 0 6px; display: flex; align-items: baseline; gap: 7px; }
.cartas-ad h4 .sub { font-size: 10.5px; color: var(--muted); font-weight: var(--peso-etq); }

/* Barra de unidades del peso y balance (va en el cuerpo, no en el título) */
.wb-barra { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 12px; }
/* El campo de combustible del formulario, con sus dos botones al lado */
.campo-con-unidad { display: flex; align-items: stretch; gap: 8px; }
.campo-con-unidad input { flex: 1 1 auto; min-width: 0; }
.campo-con-unidad .comb-unidades { flex: 0 0 auto; }

/* Nivel óptimo integrado */
.opt-nivel {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  margin-top: 12px; padding: 9px 12px;
  background: var(--panel-alt); border: 1px solid var(--borde);
  border-left: 3px solid var(--ok); border-radius: 6px; font-size: 12.5px;
}
.opt-lbl { font-size: 11.5px; color: var(--muted); }
.opt-nivel strong { color: var(--texto); font-size: 14px; }
/* Va debajo del nivel de crucero y más apagado: es una sugerencia, no el dato */
.opt-nivel-chico { margin-top: 6px; padding: 6px 12px; font-size: 11.5px; }
.opt-nivel-chico strong { font-size: 12.5px; color: var(--muted); }
.opt-ok { color: var(--ok); font-weight: 600; }
.opt-crit { color: var(--muted); font-size: 11px; margin-left: auto; }
.chip-alt-nivel {
  flex-direction: row; align-items: center; padding: 4px 10px;
  font-size: 11px; font-weight: 600; color: var(--ok); border-color: rgba(62,207,142,.4);
}
.chip-alt-nivel:hover { border-color: var(--ok); background: rgba(62,207,142,.1); }

/* Subtítulos dentro de un bloque */
.sub-tabla {
  font-size: 12px; font-weight: 700; color: var(--naranja);
  margin: 20px 0 8px; display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap;
}
.sub-cap { text-transform: none; letter-spacing: 0; color: var(--muted); font-size: 11px; font-weight: 400; }

/* Nota integrada dentro de una tarjeta de fase */
.fase-nota {
  margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--borde);
  font-size: 10.5px; color: var(--muted); line-height: 1.5;
}
.fase-nota strong { color: var(--naranja-cl); }

/* Un plan guardado es una foto: hay que decirlo antes que nada */
.aviso-foto { display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  border-left: 3px solid var(--alerta) !important; font-size: var(--t-chico);
  line-height: 1.55; }
.aviso-foto strong { color: var(--alerta); }
.aviso-foto .btn { margin-left: auto; }

/* El uso del aeródromo va pegado a SU código, chiquito: así se sabe de cuál de
   los dos se está hablando sin leer un cartel aparte. */
.etq-uso { display: inline-block; vertical-align: middle; margin-left: 5px;
  font-size: 10px; font-weight: 700; letter-spacing: .2px;
  padding: 1px 6px; border-radius: 3px; border: 1px solid currentColor; }
.etq-uso.priv { color: var(--alerta); }
.etq-uso.mil { color: var(--peligro); }

/* Marcador de aeroclub en el mapa */
.pt-club { background: #ffb020; border: 1px solid #ffd27a; }

/* Ficha de un espacio aéreo (la usa el perfil vertical) */
.ficha-espacio {
  position: absolute; top: 12px; right: 12px; z-index: 1000;
  width: 230px; max-width: calc(100% - 24px);
  background: var(--panel); border: 1px solid var(--borde);
  border-radius: 10px; padding: 12px 14px;
  box-shadow: 0 6px 20px var(--sombra);
}
.ficha-espacio.oculto { display: none; }
.ficha-cerrar {
  position: absolute; top: 8px; right: 8px;
  background: none; border: none; color: var(--muted); cursor: pointer; font-size: 13px;
}
.ficha-cerrar:hover { color: var(--texto); }
.ficha-cab { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; padding-right: 16px; }
.ficha-nom { font-weight: 700; font-size: 13px; }
.ficha-clase {
  font-weight: 800; font-size: 12px; padding: 2px 8px; border-radius: 5px;
  color: #0b0b0d;
}
.ficha-clase.precaucion {
  background: var(--alerta); color: #0b0b0d;
  box-shadow: 0 0 0 2px rgba(255,176,32,.3);
}
.ficha-clase.sc { background: var(--panel-alt); color: var(--muted); }
.ficha-tipo {
  font-weight: 800; font-size: 11px; padding: 2px 8px; border-radius: 5px;
  background: rgba(224,176,255,.2); color: #e0b0ff; border: 1px solid rgba(224,176,255,.4);
}
.ficha-tipo-linea { font-size: 11px; color: var(--muted); margin-bottom: 10px; }
.ficha-limites { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.ficha-limites div {
  background: var(--negro); border-radius: 6px; padding: 7px 9px;
}
.ficha-limites span { display: block; font-size: 11.5px; color: var(--muted); }
.ficha-limites strong { font-size: 12.5px; }
.ficha-horario {
  margin-top: 8px; background: var(--negro); border-radius: 6px; padding: 7px 9px;
}
.ficha-horario span { display: block; font-size: 11.5px; color: var(--muted); }
.ficha-horario strong { font-size: 11.5px; }
.ficha-aprox {
  margin-top: 8px; font-size: 10px; color: var(--muted); font-style: italic; line-height: 1.4;
}

/* Frecuencias en la ficha */
.ficha-freq { margin-top: 10px; padding-top: 8px; border-top: 1px solid var(--borde); }
.freq-item { display: flex; align-items: baseline; gap: 8px; font-size: 11.5px; padding: 2px 0; }
.freq-mhz { font-weight: 700; color: var(--naranja-cl); }
.freq-nom { color: var(--muted); font-size: 10.5px; }

.error {
  background: rgba(255,80,80,.1);
  border: 1px solid rgba(255,80,80,.4);
  color: #ff8080;
  padding: 14px;
  border-radius: 8px;
}

.vacio {
  text-align: center;
  color: var(--muted);
  padding: 50px 20px;
  font-size: 13px;
}

/* Tooltips de Leaflet en modo oscuro */
.leaflet-tooltip.etq {
  background: var(--panel);
  border: 1px solid var(--borde);
  color: var(--texto);
  font-size: 10.5px;
  font-weight: 600;
  padding: 2px 6px;
  box-shadow: 0 1px 4px var(--sombra);
}
.leaflet-tooltip.etq::before { display: none; }
/* El cartel lista TODOS los espacios aéreos bajo el cursor, uno por renglón,
   del más chico al más grande. Es lo que garantiza que ninguno quede
   escondido detrás de otro. */
.leaflet-tooltip.etq-pila { max-width: 300px; white-space: normal; padding: 4px 7px; }
.etq-fila { padding: 2px 0; }
.etq-fila + .etq-fila { border-top: 1px solid var(--borde); margin-top: 2px; }
.etq-sub { color: var(--muted); font-weight: 500; }
.etq-sel { color: var(--naranja); font-weight: 900; }
.leaflet-container { background: var(--mapa-bg); }

/* ⚠️ UN MOSAICO QUE YA CARGÓ SE VE. Punto.
   Leaflet arranca cada mosaico en `opacity: 0` (en línea) y la sube de a poco
   con `requestAnimationFrame`. Ese ciclo NO corre con la pestaña en segundo
   plano, y además se atasca si algún mosaico del lote falla: la capa entera
   queda transparente. Eso es lo que hacía que las cartas IFR "desaparecieran"
   al scrollear o hacer zoom, aunque los mosaicos estuvieran ahí y cargados.
   Se comprobó: 9 imágenes con la clase `leaflet-tile-loaded`, ninguna rota,
   todas con opacidad calculada 0.
   Ojo: `fadeAnimation` no sirve para esto — es opción del MAPA, no de la capa. */
.leaflet-tile-pane .leaflet-tile-loaded { opacity: 1 !important; }
.leaflet-control-attribution {
  background: var(--panel) !important;
  color: var(--muted) !important;
  font-size: 10px !important;
}
.leaflet-control-attribution a { color: var(--muted) !important; }
.leaflet-bar a {
  background: var(--panel) !important;
  color: var(--texto) !important;
  border-color: var(--borde) !important;
}
.leaflet-bar a:hover { background: var(--panel-alt) !important; }

/* ---------------------- Responsive ----------------------
   El celular es un objetivo real, no un "que entre como pueda": una sola
   columna, el mapa arriba de todo, y TODO lo que se toca de 44 px para
   arriba. */
@media (max-width: 900px) {
  /* En el celular vuelve a scrollear la PÁGINA entera: partir la pantalla en
     dos zonas con scroll propio en 375 px de ancho es imposible de usar. */
  body { display: block; height: auto; overflow: visible; }
  .pegajoso { position: sticky; top: 0; }
  .cuerpo { grid-template-columns: 1fr; padding: 9px; gap: 9px; height: auto; }
  /* En el celular no hay mouse: el menú lateral pasa a ser una fila fija
     arriba, con los rótulos siempre visibles. Desplegar al hover no existe. */
  .marco { flex-direction: column; }
  .lateral { flex: 0 0 auto; position: static; }
  .lat-caja { position: static; width: auto; flex-direction: row; overflow-x: auto;
    scrollbar-width: none; padding: 6px; gap: 4px;
    border-right: 0; border-bottom: 1px solid var(--chapa-borde); box-shadow: none; }
  .lat-caja::-webkit-scrollbar { display: none; }

  /* ⚠️ ESTA REGLA ES LA QUE ARREGLA EL MENÚ ROTO EN EL CELULAR, y tiene que
     repetir los mismos selectores de arriba aunque parezca al pedo.
     En escritorio el menú se despliega al pasarle el mouse:
         .lateral:hover .lat-caja { width: 214px; box-shadow: ... }
     Esa regla tiene MÁS ESPECIFICIDAD que `.lat-caja` a secas, y en CSS la
     especificidad le gana al orden: por estar dentro de esta media query, el
     `width: auto` de acá arriba NO la vencía.
     En el celular no hay mouse, pero al TOCAR un botón queda con el foco, y
     iOS además deja el `:hover` pegado. Resultado medido en un iPhone de
     390 px: apenas tocabas "Panel", la tira se achicaba de 390 a 214 px, se
     cortaba a la mitad de "Vuelos guardados" y le aparecía una sombra que
     ensuciaba el nombre del usuario de la barra de arriba.
     Acá se anula: en una fila horizontal, "desplegarse" no significa nada. */
  .lateral:hover .lat-caja,
  .lateral:focus-within .lat-caja { width: auto; box-shadow: none; }

  /* El reloj UTC no va en la fila. Vive escondido (`opacity: 0`) y se muestra
     con el menú desplegado, que en el celular no existe: lo único que hacía era
     aparecer de golpe al tocar un botón, en el medio de la fila y empujando los
     demás. En el celular la hora se mira en el reloj del teléfono. */
  .lat-reloj { display: none; }
  .lat-item { width: auto; flex-direction: column; gap: 4px; padding: 8px 12px;
    font-size: var(--t-mini); }
  .lat-item span { opacity: 1; max-width: 72px; overflow: hidden; text-overflow: ellipsis; }
  .col-izq { overflow: visible; min-height: auto; padding-right: 0; }
  .col-der { order: -1; }   /* el mapa, primero */
  /* ⚠️ SALVO EN "EXPORTAR PDF". Ahí la columna derecha no es el mapa: es la
     VISTA PREVIA de la hoja, que mide varias páginas. Puesta arriba, había que
     scrollear toda la previsualización antes de llegar a las casillas de qué
     incluir, que es lo que uno viene a tocar. En el celular la previa va
     DEBAJO del formulario: primero se elige, después se mira cómo quedó. */
  body.exportando .col-der { order: 1; }
  .mapa-caja { flex: none; }
  #mapa { height: 300px; min-height: 0; }
  .grid-fases { grid-template-columns: 1fr; }
  /* Tres aeródromos en fila no entran en un celular: ahí sí se apilan */
  .meteo-grid { grid-template-columns: 1fr; }

  .barra { flex-wrap: wrap; row-gap: 6px; padding: 8px 11px; }
  .logo-svg { height: 28px; }

  .card-cab, .card-cuerpo { padding-left: 12px; padding-right: 12px; }
  .campo select, .campo input, .btn, .btn-swap { height: 44px; }
  /* Las solapas del vuelo, en una sola fila que se arrastra con el dedo, igual
     que el menú de arriba. Antes envolvían en tres renglones: no se cortaban,
     pero se comían 137 px de pantalla —un sexto del alto de un celular— antes
     de empezar a mostrar el vuelo. */
  .acciones { flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none;
    -webkit-overflow-scrolling: touch; }
  .accion { padding: 13px 11px; }
  /* En una fila que se arrastra, "empujar a la derecha" deja un hueco enorme
     en el medio en vez de alinear con el borde. */
  .accion.sep-izq { margin-left: 0; }
  .solapa { min-width: 56px; padding: 7px 8px 5px; }

  .solo-celu { display: block; }
  .solo-celu-in { display: inline; }
  .solo-escritorio, .solo-escritorio-in { display: none; }
}

/* ---------------------- Estado de los datos -------------------------- */
/* Qué se baja solo y qué hay que rehacer. Va en el pie, plegado. */
.salud { margin-top: 12px; border-top: 1px solid var(--borde); padding-top: 10px; }
.salud > summary {
  cursor: pointer; font-weight: 700; font-size: 12px; list-style: revert;
  display: flex; align-items: center; gap: 8px;
}
.salud h5 {
  margin: 12px 0 5px; font-size: 11.5px; color: var(--muted); font-weight: 700;
}
.salud-fila {
  display: flex; align-items: baseline; gap: 8px; padding: 3px 0; font-size: 11.5px;
}
.salud-fila + .salud-fila { border-top: 1px solid var(--borde); }
.salud-fila .badge-legal { flex-shrink: 0; min-width: 62px; text-align: center; }
.salud-nom { font-weight: 600; }
.salud-det { color: var(--muted); font-size: 10.5px; margin-left: auto; text-align: right; }
.salud-porque { margin: 6px 0; }
.salud-porque code {
  display: inline-block; margin-top: 3px; background: var(--negro);
  border: 1px solid var(--borde); border-radius: 4px; padding: 2px 6px; font-size: 11px; color: var(--naranja-cl);
}

/* ====================== FICHA DEL AERÓDROMO ==========================
   Tarjeta emergente centrada con el fondo oscurecido. Se abre al hacer
   click en un aeródromo del mapa, del panel de salida/destino o de los
   alternativos. */
.ficha-ad { position: fixed; inset: 0; z-index: 2000; display: flex;
  align-items: center; justify-content: center; padding: 24px; }
.ficha-ad.oculto { display: none; }
.ficha-ad-fondo { position: absolute; inset: 0; background: rgba(0, 0, 0, .68);
  backdrop-filter: blur(2px); }
/* Que el fondo no se mueva mientras la ficha está abierta */
body.con-modal { overflow: hidden; }

.ficha-ad-caja {
  position: relative; background: var(--panel); border: 1px solid var(--borde);
  border-radius: 12px; box-shadow: 0 18px 60px rgba(0, 0, 0, .55);
  width: min(720px, 100%); max-height: min(88vh, 900px); overflow-y: auto;
  padding: 22px 24px 18px;
}
.ficha-ad-cerrar {
  position: sticky; top: 0; float: right; margin: -6px -8px 0 8px;
  background: var(--panel-alt); border: 1px solid var(--borde); color: var(--muted);
  width: 30px; height: 30px; border-radius: 8px; cursor: pointer; font-size: 14px;
  line-height: 1; z-index: 2;
}
.ficha-ad-cerrar:hover { color: var(--texto); border-color: var(--naranja); }

/* ⚠️ La cruz de los modales que tienen encabezado propio (los aviones y la
   tabla de códigos). NO sirve `.ficha-ad-cerrar`: esa es `float: right` y está
   pensada para una caja donde el contenido fluye a su alrededor. Acá el
   encabezado es un flex, así que la cruz es un ítem más y se alinea sola.
   Antes tenía una clase que no existía en la hoja y salía como un aspa suelta,
   sin caja y mal ubicada. */
.modal-cerrar {
  flex: 0 0 auto; align-self: flex-start; margin-left: auto;
  display: flex; align-items: center; justify-content: center;
  width: 30px; height: 30px; border-radius: 8px; cursor: pointer;
  background: var(--panel-alt); border: 1px solid var(--borde); color: var(--muted);
}
.modal-cerrar:hover { color: var(--texto); border-color: var(--naranja);
  background: var(--naranja-db); }
.modal-cerrar .ico { width: 15px; height: 15px; }
.ficha-ad-cargando { padding: 40px 0; text-align: center; color: var(--muted); }

.fad-cab { margin-bottom: 14px; padding-bottom: 12px; border-bottom: 1px solid var(--borde); }
.fad-codigos { display: flex; align-items: baseline; gap: 8px; }
.fad-icao { font-size: 26px; font-weight: 800; letter-spacing: 1.5px; }
.fad-alt { font-size: 12px; color: var(--muted); font-weight: 700; letter-spacing: 1px; }
.fad-nombre { font-size: 14px; margin-top: 2px; }
.fad-marcas { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 8px; }
/* Guardar/quitar de favoritos: vive en la ficha, que es donde uno ya está
   mirando el aeródromo y decidiendo si lo quiere. Es UN botón que cambia de
   cara, no dos: con dos habría que leer cuál está activo. */
.fad-fav-caja { margin-top: 10px; }
.fad-fav {
  display: inline-flex; align-items: center; gap: 6px;
  border: 1px solid var(--borde); border-radius: 8px; background: transparent;
  color: var(--muted); cursor: pointer; font-size: 12px; padding: 6px 11px;
  font-family: inherit;
}
.fad-fav .ico { width: 14px; height: 14px; }
.fad-fav:hover { border-color: var(--naranja); color: var(--naranja-cl); }
.fad-fav.esta { border-color: var(--naranja); color: var(--naranja-cl); }
.fad-fav.esta:hover { border-color: var(--peligro); color: var(--peligro); }

.fad-tit { margin: 18px 0 8px; font-size: 11.5px; color: var(--muted); font-weight: 800;
  border-top: 1px solid var(--borde); padding-top: 12px; }
.fad-sub { font-size: 11.5px;
  color: var(--muted); margin: 8px 0 3px; }

.fad-datos { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 8px 14px; }
.fad-dato { display: flex; flex-direction: column; font-size: 12.5px; }
.fad-dato > span { font-size: 11.5px; color: var(--muted); }

.fad-tabla { width: 100%; border-collapse: collapse; font-size: 12px; }
.fad-tabla th { text-align: left; font-size: 11.5px; color: var(--muted); padding: 3px 6px 5px 0; font-weight: 700; }
.fad-tabla td { padding: 5px 6px 5px 0; border-top: 1px solid var(--borde); vertical-align: baseline; }
.fad-tabla td small { color: var(--muted); font-size: 10px; margin-left: 4px; }
.fad-mono { font-weight: 700; }

.fad-frecs { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 4px 16px; }
.fad-frec { display: flex; justify-content: space-between; align-items: baseline;
  gap: 8px; font-size: 12px; padding: 3px 0; border-bottom: 1px solid var(--borde); }
.fad-frec-etq { color: var(--muted); display: flex; flex-direction: column; }
.fad-frec-etq small { font-size: 9.5px; font-style: italic; }
.fad-frec-mhz { font-weight: 700; color: var(--naranja-cl); }

.fad-crudo { font-size: 11px; white-space: pre-wrap;
  background: var(--negro); border: 1px solid var(--borde); border-radius: 6px;
  padding: 7px 9px; margin: 6px 0 0; color: var(--muted); }

.fad-carta { display: flex; align-items: baseline; gap: 10px; padding: 6px 8px;
  border: 1px solid var(--borde); border-radius: 7px; margin-bottom: 5px;
  text-decoration: none; color: var(--texto); font-size: 12.5px; }
.fad-carta:hover { border-color: var(--naranja); background: var(--panel-alt); }
.fad-carta-cod { font-weight: 700;
  color: var(--naranja-cl); flex-shrink: 0; min-width: 62px; }
.fad-carta-nom { flex: 1; }
.fad-carta-fecha { color: var(--muted); font-size: 10.5px; }

.fad-normas { font-size: 12.5px; line-height: 1.55; background: var(--panel-alt);
  border-left: 3px solid var(--naranja); border-radius: 0 7px 7px 0; padding: 9px 12px; }
.fad-mas { margin-top: 8px; }
.fad-mas > summary { cursor: pointer; font-size: 11.5px; color: var(--muted); list-style: revert; }
.fad-mas > summary:hover { color: var(--texto); }
.fad-pie { margin-top: 16px; padding-top: 12px; border-top: 1px solid var(--borde); }

/* Avisos de estado del aeródromo: van arriba de todo, antes de cualquier dato.
   "alerta" es rojo (cerrado); "aviso" es ámbar (elevación estimada, no figura
   en el MADHEL). */
.fad-aviso { font-size: 12.5px; line-height: 1.5; border-radius: 8px;
  padding: 9px 12px; margin: 10px 0 0; border: 1px solid; }
.fad-aviso.alerta { background: rgba(255, 59, 59, .10); border-color: rgba(255, 59, 59, .45); }
.fad-aviso.aviso { background: rgba(255, 167, 38, .10); border-color: rgba(255, 167, 38, .40); }


@media (max-width: 640px) {
  .ficha-ad { padding: 10px; }
  .ficha-ad-caja { padding: 16px 15px 14px; max-height: 92vh; }
  .fad-icao { font-size: 22px; }
}

/* ==========================================================================
   EXPORTAR: el diálogo de selección y la HOJA imprimible
   ========================================================================== */
.export-caja { max-width: 560px; }
/* Cartelito de confirmación / de pedir un nombre */
.dlg-caja { max-width: 430px; }
/* ⚠️ Las dos rayas horizontales del cartel de confirmación no eran decoración:
   salían de reusar `.fad-tit` (encabezado de sección de la ficha) y
   `.export-pie` (pie de la vista de exportar), que las dos traen `border-top`.
   En un cartelito de dos renglones parten el texto de los botones sin motivo. */
.dlg-caja .fad-tit { border-top: 0; padding-top: 0; margin-top: 0;
  font-size: 14px; color: var(--texto); }
.dlg-caja .export-pie { border-top: 0; padding-top: 0; margin-top: 14px; }
.dlg-caja .fpl-in { margin-top: 4px; }
.dlg-caja .fpl-in.oculto { display: none; }
.export-lista { display: grid; gap: 2px; margin: 12px 0; }
.export-item {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 10px; border-radius: var(--radio-btn); cursor: pointer;
}
.export-item:hover { background: var(--panel-alt); }
.export-item input { accent-color: var(--naranja); width: 17px; height: 17px; cursor: pointer; }
.export-item .nom { font-weight: 700; }
.export-item .det { color: var(--muted); font-size: var(--t-chico); }
.export-item.no-hay { opacity: .5; }
.export-pie { display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  border-top: 1px solid var(--borde); padding-top: 12px; }

/* ==================== PLAN DE VUELO EANA (formulario OACI) ==================== */
.fpl-oficina { background: var(--panel-alt); border: 1px solid var(--borde);
  border-left: 3px solid var(--naranja); border-radius: 8px;
  padding: 10px 12px; margin-bottom: 14px; font-size: var(--t-chico); line-height: 1.6; }
.fpl-oficina a { color: var(--naranja-cl); }

/* 12 columnas: cada renglón de la pantalla cae igual que en el formulario de
   papel, así pasar el plan en limpio es leer de arriba abajo sin buscar nada. */
/* La grilla del plan OACI son 12 columnas, para que cada renglón de la
   pantalla se corresponda con un renglón del formulario de papel. */
.fpl-grid { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: 10px; }
.fpl-c2 { grid-column: span 2; }   .fpl-c3 { grid-column: span 3; }
.fpl-c4 { grid-column: span 4; }   .fpl-c6 { grid-column: span 6; }
.fpl-c12 { grid-column: span 12; }

/* ⚠️ EL NOMBRE DE LA CASILLA SE PARTE, NUNCA SE CORTA. Es a TODO ancho, no
   sólo en el celular: aun en una pantalla grande la columna del formulario es
   angosta y "15 · Velocidad de crucero" no entra en un campo de media fila.
   Un nombre partido en dos renglones se lee; cortado con puntitos, no, y en un
   plan de vuelo el piloto tiene que saber QUÉ casilla está llenando porque el
   papel se numera igual. Las celdas de la fila quedan del mismo alto de todos
   modos, porque la grilla las estira. */
.fpl-campo .etq {
  white-space: normal; overflow: visible; text-overflow: clip;
  line-height: 1.25;
}

/* ⚠️ EL PLAN OACI SE REAGRUPA ABAJO DE 900 px, NO DE 620.
   Las 12 columnas son para que cada renglón de la pantalla se corresponda con
   un renglón del papel, y eso pide una ventana ancha. En 750 px un campo de
   `span 2` medía 55 px y el nombre de la casilla salía cortado con puntitos
   ("9 · N…"), que en un plan de vuelo es lo peor que puede pasar: el piloto
   tiene que poder leer QUÉ casilla está llenando, porque el papel se numera
   igual. Y el textito de ayuda, en una columna así, se partía en cuatro
   renglones y estiraba el campo al triple de alto que sus vecinos.

   Abajo de 900 px se pasa a 6 columnas y NADA queda más angosto que media
   fila. */
@media (max-width: 900px) {
  .fpl-grid { grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 9px; }
  .fpl-c2, .fpl-c3, .fpl-c4 { grid-column: span 3; }   /* media fila */
  .fpl-c6, .fpl-c12 { grid-column: span 6; }           /* fila entera */

  /* La ayuda de cada casilla, más chica y sin ocupar media pantalla. */
  .fpl-campo .fpl-ayuda { font-size: 10.5px; line-height: 1.3; }
}

@media (max-width: 620px) {
  /* Las flechitas de subir/bajar el régimen de descenso quedaban de 25×23 px:
     con el dedo se falla más de lo que se acierta. Se ensanchan sin tocar el
     dibujo de la flecha, que sigue chico. */
  .paso-btn { min-height: 30px; min-width: 34px; }
  .paso-btn .ico { width: 13px; height: 13px; }
}
.fpl-campo { display: flex; flex-direction: column; gap: 4px; min-width: 0;
  border-left: 3px solid transparent; padding-left: 7px; }
/* De dónde salió cada dato, de un vistazo */
.fpl-campo.est-plan { border-left-color: var(--naranja); }
/* Lo que trajo la ficha del avión pre-cargado. Va en el celeste que la app ya
   usa para "otra fuente de datos" (--alt-color, el de los alternativos): tiene
   que separarse del naranja del plan Y del verde de lo escrito a mano, que son
   los otros dos orígenes. */
.fpl-campo.est-avion { border-left-color: var(--alt-color); }

/* Los aeródromos (casillas 13 y 16). Salen del vuelo que ya se armó, así que
   van en gris: el gris dice "esto ya está resuelto, no hace falta que lo
   toques". SIGUEN SIENDO EDITABLES a propósito — no llevan `readonly` ni
   `disabled`—, y al escribirlos toman el color normal del texto, que es la
   señal de que ahora el dato lo puso el piloto. */
.fpl-in.fpl-del-vuelo { color: var(--muted); }
.fpl-in.fpl-del-vuelo:focus,
.fpl-campo.est-propio .fpl-in.fpl-del-vuelo { color: var(--texto); }

/* Lo que el piloto tiene que agregar a mano en la casilla 18 */
.fpl-falta18 {
  margin: 8px 0 4px; padding: 10px 12px;
  background: var(--alerta-db); border: 1px solid var(--alerta);
  border-radius: var(--radio-btn);
}
.fpl-falta18-tit { display: flex; align-items: center; gap: 6px;
  font-size: var(--t-chico); font-weight: 700; color: var(--alerta); }
.fpl-falta18-tit .ico { width: 14px; height: 14px; }
.fpl-falta18 ul { margin: 7px 0 0; padding-left: 18px; }
.fpl-falta18 li { font-size: var(--t-chico); line-height: 1.45; margin-bottom: 4px; }
.fpl-falta18 code { font-weight: 800; color: var(--alerta); }
.fpl-campo.est-propio { border-left-color: var(--ok); }
.fpl-campo.est-falta { border-left-color: var(--borde); }
.fpl-leyenda { display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
  font-size: var(--t-mini); color: var(--muted); margin-bottom: 12px; }
.fpl-pt { width: 10px; height: 10px; border-radius: 2px; background: var(--borde);
  margin-left: 8px; }
.fpl-pt.est-plan { background: var(--naranja); }
.fpl-pt.est-avion { background: var(--alt-color); }
.fpl-pt.est-propio { background: var(--ok); }

/* ================== AVIONES PRE-CARGADOS ==================
   El botón naranja del formulario, el menú para elegir y la pantalla de
   "Mis aviones". Se usa el mismo lenguaje visual del resto de la app: no hay
   colores ni tipografías nuevas, sólo más aire y más jerarquía. */

/* El botón, debajo del campo "Modelo". Naranja pero HUECO: el botón lleno de
   esta pantalla es "Generar plan", y dos naranjas llenos compitiendo hacen
   que ninguno se lea como el principal. */
.btn-precargado {
  display: flex; align-items: center; justify-content: center; gap: 7px;
  width: 100%; margin-top: 7px; padding: 9px 12px;
  background: var(--naranja-db); color: var(--naranja-cl);
  border: 1px solid var(--naranja); border-radius: var(--radio-btn);
  font-family: inherit; font-size: var(--t-chico); font-weight: 600;
  cursor: pointer; transition: background .12s, transform .06s;
}
.btn-precargado:hover { background: rgba(255,107,0,.24); }
.btn-precargado:active { transform: translateY(1px); }
.btn-precargado .ico { width: 17px; height: 17px; }
.btn-precargado.activo { background: transparent; }

/* El cartelito de qué avión quedó elegido */
.precargado-elegido {
  margin-top: 8px; padding: 9px 11px;
  background: var(--panel-alt); border: 1px solid var(--borde);
  border-left: 3px solid var(--naranja); border-radius: var(--radio-btn);
}
.pre-elegido-cab { display: flex; align-items: center; gap: 7px; }
.pre-elegido-cab .ico { width: 16px; height: 16px; color: var(--naranja); }
.pre-elegido-tipo { font-size: var(--t-mini); color: var(--muted);
  border: 1px solid var(--borde); border-radius: 4px; padding: 1px 5px; }
.pre-elegido-x { background: none; border: none; color: var(--muted); cursor: pointer;
  padding: 2px; display: flex; }
.pre-elegido-x:hover { color: var(--peligro); }
.pre-elegido-x .ico { width: 14px; height: 14px; }
.pre-elegido-que { margin: 5px 0 0; font-size: var(--t-mini); color: var(--muted); }
.pre-elegido-avisos { margin: 6px 0 0; padding-left: 16px; font-size: var(--t-mini);
  color: var(--alerta); line-height: 1.4; }

/* --- El menú para elegir --- */
.dlg-aviones-caja { max-width: 560px; }
.dlg-aviones-cab { display: flex; align-items: flex-start; gap: 12px; margin-bottom: 14px; }
.dlg-aviones-cab h3 { margin: 0 0 3px; font-size: var(--t-titulo); }
.dlg-aviones-cab .ayuda { margin: 0; }
.dlg-aviones-ico { width: 30px; height: 30px; flex: 0 0 auto; color: var(--naranja);
  fill: currentColor; }
.dlg-av-lista { display: flex; flex-direction: column; gap: 8px; }
.dlg-av-op {
  display: flex; align-items: center; gap: 12px; width: 100%; text-align: left;
  padding: 11px 13px; background: var(--panel-alt);
  border: 1px solid var(--borde); border-radius: 9px;
  color: var(--texto); font-family: inherit; cursor: pointer;
  transition: border-color .12s, background .12s;
}
.dlg-av-op:hover { border-color: var(--naranja); background: var(--naranja-db); }
.dlg-av-op.elegido { border-color: var(--naranja); background: var(--naranja-db); }
.dlg-av-mat { flex: 0 0 auto; font-size: 15px; font-weight: 800; letter-spacing: .5px; }
.dlg-av-cuerpo { display: flex; flex-direction: column; gap: 3px; min-width: 0; flex: 1; }
.dlg-av-tipo { font-size: var(--t-chico); color: var(--muted); }
.dlg-av-apodo { font-size: var(--t-chico); }
.dlg-av-detalle { display: flex; flex-wrap: wrap; gap: 5px; }
.dlg-av-chip { font-size: var(--t-mini); color: var(--muted);
  border: 1px solid var(--borde); border-radius: 4px; padding: 1px 6px; }
.dlg-av-chip.falta { color: var(--alerta); border-color: var(--alerta); }
.dlg-av-tilde { width: 15px; height: 15px; flex: 0 0 auto; color: var(--muted);
  transform: rotate(-90deg); }
.dlg-av-pie { display: flex; align-items: center; gap: 8px; margin-top: 14px;
  padding-top: 12px; border-top: 1px solid var(--borde); }

/* --- La pantalla "Mis aviones" --- */
.av-bajada { margin: 0 0 14px; }
.av-grilla { display: grid; gap: 12px;
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); }
.av-ficha { padding: 13px; background: var(--panel-alt);
  border: 1px solid var(--borde); border-radius: 10px; }
.av-ficha-cab { display: flex; align-items: center; gap: 10px; }
.av-ficha-ico { width: 26px; height: 26px; color: var(--naranja); fill: currentColor;
  flex: 0 0 auto; }
.av-ficha-id { display: flex; flex-direction: column; min-width: 0; }
.av-mat { font-size: 16px; font-weight: 800; letter-spacing: .5px; }
.av-tipo { font-size: var(--t-mini); color: var(--muted); }
.av-apodo { margin-top: 6px; font-size: var(--t-chico); color: var(--muted); }
.av-datos { display: grid; grid-template-columns: 1fr 1fr; gap: 6px 10px; margin: 11px 0 0; }
.av-mini dt { font-size: var(--t-mini); color: var(--muted); }
.av-mini dd { margin: 0; font-size: var(--t-chico); font-weight: 600;
  overflow-wrap: anywhere; }
.av-mini dd.av-sin { color: var(--borde); font-weight: 400; }
.av-faltan { display: flex; align-items: center; gap: 5px; margin-top: 10px;
  font-size: var(--t-mini); color: var(--alerta); }
.av-faltan .ico { width: 13px; height: 13px; }
.av-ficha-pie { display: flex; gap: 7px; margin-top: 12px;
  padding-top: 11px; border-top: 1px solid var(--borde); }

.av-vacio { text-align: center; padding: 28px 18px; }
.av-vacio-ico { width: 46px; height: 46px; color: var(--naranja); fill: currentColor;
  opacity: .75; }
.av-vacio h4 { margin: 10px 0 5px; font-size: var(--t-titulo); }
.av-vacio p { margin: 0 auto 14px; max-width: 380px; font-size: var(--t-chico);
  color: var(--muted); line-height: 1.5; }

/* --- El editor --- */
.av-grupo { margin-top: 18px; padding-top: 15px; border-top: 1px solid var(--borde); }
.av-grupo:first-of-type { border-top: none; padding-top: 0; }
.av-grupo-tit { margin: 0 0 3px; font-size: var(--t-titulo); }
.av-grupo .ayuda { margin: 0 0 11px; }
.av-form { display: grid; grid-template-columns: repeat(12, 1fr); gap: 11px; }
.av-col-2 { grid-column: span 2; } .av-col-3 { grid-column: span 3; }
.av-col-4 { grid-column: span 4; } .av-col-6 { grid-column: span 6; }
.av-col-8 { grid-column: span 8; } .av-col-12 { grid-column: span 12; }
.av-tach-fila { display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  margin-bottom: 8px; }
.av-tach-etq { flex: 0 0 175px; font-size: var(--t-chico); color: var(--muted); }
.av-tach-letras { display: flex; gap: 5px; }
.av-tach { width: 30px; height: 30px; background: var(--ok-db); color: var(--ok);
  border: 1px solid var(--ok); border-radius: var(--radio-btn);
  font-family: inherit; font-size: var(--t-chico); font-weight: 700; cursor: pointer; }
/* Tachada = NO lo lleva. Se dibuja igual que en el papel: con una raya encima. */
.av-tach.tachada { background: transparent; color: var(--muted); border-color: var(--borde);
  text-decoration: line-through; text-decoration-thickness: 2px; }
.av-acciones { display: flex; gap: 9px; margin-top: 20px; padding-top: 15px;
  border-top: 1px solid var(--borde); }

/* Obligatorio / opcional, al lado de la etiqueta. Chiquitos y sin color fuerte:
   son una aclaración, no una alarma. */
.etq-req, .etq-opc {
  margin-left: 6px; padding: 1px 5px; border-radius: 3px;
  font-size: var(--t-mini); font-weight: 500; text-transform: none; letter-spacing: 0;
}
.etq-req { color: var(--naranja-cl); background: var(--naranja-db); }
.etq-opc { color: var(--muted); border: 1px solid var(--borde); }

/* Las letras tachables, ahora adentro del grupo de la casilla 19 */
.av-tach-caja { margin-top: 13px; padding-top: 13px; border-top: 1px dashed var(--borde); }
.av-tach-caja .ayuda { margin-top: 9px; }

/* El campo con su botón de tabla de códigos al lado */
.campo-con-tabla { display: flex; gap: 7px; align-items: stretch; }
.campo-con-tabla > input, .campo-con-tabla > .fpl-in { flex: 1 1 auto; min-width: 0; }
.btn-tabla {
  display: inline-flex; align-items: center; gap: 5px; flex: 0 0 auto;
  padding: 0 10px; background: var(--panel-alt); color: var(--texto);
  border: 1px solid var(--borde); border-radius: var(--radio-btn);
  font-family: inherit; font-size: var(--t-mini); font-weight: 600;
  cursor: pointer; white-space: nowrap;
}
.btn-tabla:hover { border-color: var(--naranja); color: var(--naranja-cl); }
.btn-tabla .ico { width: 14px; height: 14px; }

/* ---------------- La tabla de códigos de la casilla 10 ---------------- */
.dlg-codigos-caja { max-width: 680px; }
.cod-cab { display: flex; align-items: flex-start; gap: 12px; }
.cod-cab h3 { margin: 0 0 3px; font-size: var(--t-titulo); }
.cod-cab .ayuda { margin: 0; }
/* Lo que va a quedar escrito en la casilla, SIEMPRE a la vista mientras se
   tilda: es el resultado, y sin verlo no se sabe qué se está armando. */
.cod-resultado {
  display: flex; align-items: center; gap: 9px; margin: 13px 0 4px;
  padding: 10px 12px; background: var(--campo-bg);
  border: 1px solid var(--naranja); border-radius: var(--radio-btn);
  position: sticky; top: 0; z-index: 2;
}
.cod-resultado-etq { font-size: var(--t-mini); color: var(--muted); }
.cod-resultado-val { font-size: 17px; font-weight: 800; letter-spacing: 1.5px;
  color: var(--naranja-cl); overflow-wrap: anywhere; }
/* Lo que había escrito y no se reconoce: se muestra aparte y NO se toca. */
.cod-resultado-raro { font-size: var(--t-mini); color: var(--alerta);
  border: 1px dashed var(--alerta); border-radius: 3px; padding: 1px 5px; }
.cod-grupo { margin-top: 15px; }
.cod-grupo-tit { margin: 0 0 7px; font-size: var(--t-chico); color: var(--muted);
  text-transform: uppercase; letter-spacing: .6px; }
.cod-lista { display: flex; flex-direction: column; gap: 4px; }
.cod-op {
  display: flex; align-items: flex-start; gap: 9px; padding: 7px 9px;
  border: 1px solid transparent; border-radius: 7px; cursor: pointer;
}
.cod-op:hover { background: var(--panel-alt); }
.cod-op.puesto { background: var(--naranja-db); border-color: var(--naranja); }
.cod-op input { flex: 0 0 auto; margin-top: 2px; accent-color: var(--naranja);
  width: 15px; height: 15px; }
.cod-letra { flex: 0 0 34px; font-weight: 800; font-size: var(--t-chico);
  letter-spacing: .5px; }
.cod-txt { font-size: var(--t-chico); line-height: 1.35; }
.cod-nota { display: block; font-size: var(--t-mini); color: var(--muted); margin-top: 2px; }
.cod-pie { display: flex; align-items: center; gap: 9px; margin-top: 18px;
  padding-top: 13px; border-top: 1px solid var(--borde); }

/* ---------------- Mis aviones en el panel principal ---------------- */
.panel-aviones { display: flex; flex-direction: column; gap: 7px; }
.panel-avion {
  display: flex; align-items: center; gap: 10px; width: 100%; text-align: left;
  padding: 9px 11px; background: var(--panel-alt); color: var(--texto);
  border: 1px solid var(--borde); border-radius: 8px;
  font-family: inherit; cursor: pointer;
}
.panel-avion:hover { border-color: var(--naranja); background: var(--naranja-db); }
.panel-avion-ico { width: 21px; height: 21px; flex: 0 0 auto; color: var(--naranja);
  fill: currentColor; }
.panel-avion-txt { display: flex; flex-direction: column; min-width: 0; flex: 1; }
.panel-avion-txt strong { font-size: var(--t-valor); letter-spacing: .4px; }
.panel-avion-sub { font-size: var(--t-mini); color: var(--muted);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.panel-avion-falta {
  flex: 0 0 auto; min-width: 19px; height: 19px; padding: 0 5px;
  display: flex; align-items: center; justify-content: center;
  background: var(--alerta-db); color: var(--alerta);
  border-radius: 10px; font-size: var(--t-mini); font-weight: 700;
}
.panel-avion-mas { margin: 2px 0 0; font-size: var(--t-mini); color: var(--muted);
  text-align: center; }
.panel-avion-aviso { margin: 9px 0 0; font-size: var(--t-mini); color: var(--alerta); }

/* El lápiz y la cruz del avión elegido en el formulario */
.pre-elegido-btn { background: none; border: none; color: var(--muted); cursor: pointer;
  padding: 3px; display: flex; border-radius: 4px; }
.pre-elegido-btn:hover { color: var(--naranja-cl); background: var(--naranja-db); }
.pre-elegido-btn .ico { width: 14px; height: 14px; }
.pre-elegido-x:hover { color: var(--peligro); background: var(--peligro-db); }

@media (max-width: 700px) {
  .av-form { grid-template-columns: repeat(6, 1fr); }
  .av-col-8 { grid-column: span 6; } .av-col-12 { grid-column: span 6; }
  .av-tach-etq { flex: 1 1 100%; }
  /* El botón de la tabla pasa abajo del campo: al lado no entra */
  .campo-con-tabla { flex-wrap: wrap; }
  .btn-tabla { flex: 1 1 100%; justify-content: center; height: 38px; }
}

/* Desplegable propio: cerrado muestra la LETRA (lo que va en el formulario),
   abierto muestra qué significa cada una. */
.fpl-sel { position: relative; }
.fpl-sel-btn { display: flex; align-items: center; justify-content: space-between; gap: 6px;
  width: 100%; background: var(--campo-bg); color: var(--texto);
  border: 1px solid var(--borde); border-radius: var(--radio-btn);
  padding: 7px 9px; font-family: inherit; font-size: var(--t-chico); cursor: pointer; }
.fpl-sel-btn:hover { border-color: var(--naranja); }
.fpl-sel-val { font-weight: 700; letter-spacing: .5px; }
.fpl-sel-btn .ico { width: 12px; height: 12px; color: var(--muted); }
.fpl-sel-lista { position: absolute; z-index: 40; top: calc(100% + 3px); left: 0; min-width: 220px;
  display: flex; flex-direction: column; gap: 2px; padding: 5px;
  background: var(--panel); border: 1px solid var(--borde); border-radius: 8px;
  box-shadow: 0 8px 22px var(--sombra); }
.fpl-sel-lista.oculto { display: none; }
.fpl-sel-op { text-align: left; background: none; color: var(--texto); border: 0;
  border-radius: var(--radio-btn); padding: 6px 9px; font-family: inherit;
  font-size: var(--t-chico); cursor: pointer; white-space: nowrap; }
.fpl-sel-op:hover { background: var(--panel-alt); }
.fpl-sel-op.act { color: var(--naranja-cl); }
.fpl-sel-op strong { display: inline-block; min-width: 16px; }

/* Los indicadores de la casilla 18 */
.fpl-18 { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 6px; }
.fpl-ind { background: var(--panel-alt); color: var(--muted);
  border: 1px solid var(--borde); border-radius: var(--radio-btn);
  padding: 3px 7px; font-size: 11px; font-weight: 700; cursor: pointer; }
.fpl-ind:hover { border-color: var(--naranja); color: var(--texto); }
.fpl-ind.puesto { border-color: var(--naranja); color: var(--naranja-cl); }
.fpl-18-detalle { margin-top: 8px; padding: 10px 12px; border: 1px solid var(--borde);
  border-radius: 8px; background: var(--panel-alt); }
.fpl-18-detalle.oculto { display: none; }
.f18-cab { display: flex; align-items: center; gap: 8px; font-size: var(--t-chico);
  margin-bottom: 8px; }
.f18-x { margin-left: auto; background: none; border: 0; color: var(--muted); cursor: pointer; }
.f18-ops { display: flex; flex-direction: column; gap: 4px; }
.f18-op { text-align: left; background: none; color: var(--texto);
  border: 1px solid var(--borde); border-radius: var(--radio-btn);
  padding: 5px 9px; font-size: var(--t-chico); cursor: pointer; font-family: inherit; }
.f18-op:hover { border-color: var(--naranja); }
.f18-op.act { border-color: var(--naranja); color: var(--naranja-cl); }
.f18-libre { display: flex; gap: 6px; align-items: center; }
.fpl-in { width: 100%; background: var(--campo-bg); color: var(--texto);
  border: 1px solid var(--borde); border-radius: var(--radio-btn);
  padding: 7px 9px; font-size: var(--t-chico); }
.fpl-in:focus { outline: none; border-color: var(--naranja); }
textarea.fpl-in { resize: vertical; min-height: 46px; line-height: 1.45; }
.fpl-ayuda { font-size: var(--t-mini); color: var(--muted); line-height: 1.45; }

/* Las letras de equipo: tachar = NO se lleva. Mismo gesto que en el papel. */
.fpl-tachables { display: flex; flex-direction: column; gap: 8px; }
.fpl-tach-fila { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.fpl-tach-etq { font-size: var(--t-chico); color: var(--muted); min-width: 168px; }
.fpl-letra { display: inline-flex; align-items: baseline; gap: 5px;
  background: var(--panel-alt); color: var(--texto);
  border: 1px solid var(--borde); border-radius: var(--radio-btn);
  padding: 6px 10px; font-size: 13px; font-weight: 700; cursor: pointer; }
.fpl-letra small { font-weight: 400; font-size: var(--t-mini); color: var(--muted); }
.fpl-letra:hover { border-color: var(--naranja); }
/* Tachada = con una línea encima, como cuando se tacha a mano */
.fpl-letra.tachada { text-decoration: line-through; text-decoration-thickness: 2px;
  color: var(--muted); border-style: dashed; }
.fpl-letra.tachada small { text-decoration: line-through; }

.fpl-firma { display: flex; align-items: flex-start; gap: 10px; flex-wrap: wrap; }
/* Misma proporción que el recuadro de firma del formulario (300 x 50 pt) */
#fpl-canvas { background: var(--campo-bg); border: 1px dashed var(--borde);
  border-radius: 8px; width: 100%; max-width: 460px; height: auto;
  aspect-ratio: 600 / 100; touch-action: none; cursor: crosshair; }
.fpl-pie { display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  margin-top: 16px; padding-top: 12px; border-top: 1px solid var(--borde); }

/* Buscador de oficinas ARO/AIS */
.aro-lista { display: flex; flex-direction: column; gap: 8px; margin-top: 10px; }
.aro-item { border: 1px solid var(--borde); border-radius: 8px; padding: 9px 11px;
  background: var(--panel-alt); }
.aro-cab { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.aro-icao { font-weight: 800; font-size: 14px; letter-spacing: 1px; }
.aro-nom { font-size: var(--t-chico); }
.aro-fir { font-size: var(--t-mini); color: var(--muted); margin-left: auto; }
.aro-datos { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 4px; font-size: var(--t-chico); }
.aro-datos a { color: var(--naranja-cl); }
.aro-aftn { color: var(--muted); }
.aro-tels { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 3px; font-size: var(--t-chico); }
.aro-tels a { color: var(--texto); }

@media (max-width: 900px) {
  /* ⚠️ ACÁ HABÍA DOS REGLAS VIEJAS DEL PLAN OACI, Y PISABAN A LAS BUENAS.
     Ponían la grilla en 2 columnas y ajustaban los anchos leyendo el atributo
     `style` —de cuando el ancho iba en línea y no como clase—. Como este
     bloque viene DESPUÉS del de 620 px, en un celular ganaba éste: la grilla
     quedaba de 2 columnas mientras los campos seguían pidiendo `span 3` y
     `span 6`, y el navegador los mandaba a columnas implícitas de 30 px. Eso
     era lo que rompía el formulario en el teléfono. El ancho del plan OACI lo
     maneja el bloque de 620 px, y sólo ese. */
  .pt-freq { columns: 2; }
  .pt-met-grid { columns: 1; }
}

/* --------------------------------- LA HOJA ---------------------------------
   ⚠️ SIEMPRE BLANCA, con el tema que sea. Por eso redefine los tokens acá
   adentro en vez de heredarlos: si heredara, en modo oscuro saldría una hoja
   negra que gasta tinta y no se lee impresa. */
/* La vista previa ocupa el lugar del mapa, en la columna derecha.
   ⚠️ `.mapa-pegado` trae su propio `display`, así que esconderlo necesita una
   regla explícita: la clase `.oculto` genérica no le gana. */
.panel-hoja {
  flex: 1 1 auto; min-height: 0;
  display: flex; flex-direction: column;
  background: #6b6b70;
  border: 1px solid var(--borde); border-radius: var(--radio); overflow: hidden;
}
.panel-hoja.oculto, .mapa-pegado.oculto { display: none !important; }
.hoja-tit { font-size: var(--t-chico); font-weight: var(--peso-etq); color: var(--chapa-muted); }
.hoja-barra {
  flex: 0 0 auto; display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 9px 14px; background: var(--chapa-bg); border-bottom: 1px solid var(--chapa-borde);
}
.hoja-scroll { flex: 1 1 auto; overflow: auto; padding: 0; min-height: 0; }
/* ⚠️ La hoja sigue siendo A4 de VERDAD (lo que se imprime no cambia); en la
   vista previa se la achica para que entre en el panel.
   El envoltorio existe porque un elemento escalado con `transform` SIGUE
   ocupando su tamaño original en el maquetado: sin él sobraba muchísimo
   espacio abajo y el scroll no llegaba al final. El envoltorio reserva el
   alto REAL (el escalado), que calcula `ajustarPreviaHoja()`. */
.panel-hoja .hoja-envoltorio { overflow: hidden; }
.panel-hoja .hoja-papel {
  /* ⚠️ `max-width: none` es lo que hace que la previa sea FIEL. Sin esto, el
     `max-width: 100%` de la hoja le ganaba al ancho A4 y la hoja se
     re-maquetaba angosta: se veía otra cosa distinta de la que iba a salir
     impresa (otros cortes de renglón, otros saltos de página). Acá el papel
     mide A4 de verdad y lo que se achica es la ESCALA. */
  width: 210mm;
  max-width: none;
  transform: scale(var(--zoom-hoja, 1));
  transform-origin: top left;
  box-shadow: none;
}
.hoja-papel {
  /* Los tokens, forzados a claro: la hoja no sigue el tema de la app */
  --negro: #ffffff; --panel: #ffffff; --panel-alt: #ffffff; --borde: #b8b8bc;
  --texto: #000000; --muted: #444448; --naranja: #000000; --naranja-cl: #000000;
  --naranja-db: transparent; --ok: #000000; --alerta: #000000; --peligro: #000000;
  --ok-db: transparent; --alerta-db: transparent; --peligro-db: transparent;
  --alt-color: #000000; --campo-bg: #ffffff; --sombra: transparent;

  width: 210mm; max-width: 100%; margin: 0 auto; padding: 14mm 13mm;
  background: #fff; color: #000;
  font-size: 10.5pt; line-height: 1.35;
  box-shadow: 0 4px 24px rgba(0,0,0,.45);
}
.hoja-papel h1 { font-size: 17pt; margin: 0 0 2mm; letter-spacing: -.3px; }
.hoja-papel .hoja-sub { font-size: 9pt; color: #444; margin: 0 0 5mm;
  border-bottom: 1.5px solid #000; padding-bottom: 2mm; }

/* ------------------------ PÁGINA 1: LA PIERNERA ------------------------
   Es la hoja que se mira en vuelo. Va apretada a propósito: cuerpo chico,
   poco aire y todo el ancho de la página, para que entre en una carilla. */
.hoja-portada { break-after: page; page-break-after: always; }
.pt-cab { display: flex; align-items: center; gap: 6mm;
  border-bottom: 2px solid #000; padding-bottom: 3mm; margin-bottom: 4mm; }
.pt-logo { height: 15mm; width: auto; color: #000; flex: 0 0 auto; }
.pt-cab-txt { min-width: 0; }
.pt-ruta { font-size: 19pt; font-weight: 700; line-height: 1.05; letter-spacing: -.5px; }
.pt-sub { font-size: 8.5pt; color: #333; margin-top: 1mm; }

/* ⚠️ NADA de grid ni de flex acá adentro. Al imprimir, Chrome no sabe partir
   un contenedor de grid entre páginas: lo que no entra en la primera NO pasa a
   la segunda, se PIERDE. Así desaparecían la meteorología y el corte vertical.
   Todo va en flujo normal, y las dos columnas se arman con una tabla, que sí
   se fragmenta bien. */
.pt-bloque { break-inside: avoid; page-break-inside: avoid; margin-bottom: 4mm; }
.hoja-papel .pt-dos { width: 100%; table-layout: fixed; border-collapse: separate;
  border-spacing: 4mm 0; margin: 0 -4mm 4mm; }
.hoja-papel .pt-dos > tbody > tr > td { border: 0; padding: 0; vertical-align: top; }
.pt-nivel { display: flex; align-items: baseline; gap: 3mm;
  border-bottom: 1px solid #000; padding-bottom: 1mm; margin-bottom: 1.5mm; }
.pt-nivel-val { font-size: 15pt; font-weight: 700; letter-spacing: -.3px; }
.pt-nivel-fl { font-size: 10pt; font-weight: 700; }
.hoja-papel .pt-bloque h2 {
  font-size: 9.5pt; margin: 0 0 1.5mm; padding: .6mm 0 .6mm 2mm;
  border-left: 2.5px solid #000; background: #e6e6e6;
}
.hoja-papel .pt-tabla { font-size: 7.6pt; }
.hoja-papel .pt-tabla th, .hoja-papel .pt-tabla td { padding: .7mm 1.2mm; }
.pt-tramo { white-space: nowrap; }
.pt-fuerte { font-weight: 700; }
.hoja-papel .pt-lista { font-size: 8.5pt; }
.hoja-papel .pt-lista td { border: 0; border-bottom: 1px solid #d8d8d8; padding: .8mm 0; }
.hoja-papel .pt-lista td:last-child { text-align: right; }
.pt-nota { font-size: 7.5pt; color: #444; margin: 1mm 0 0; }

/* Columnas por `columns`, no por grid: `columns` sí se fragmenta al imprimir */
.pt-freq { columns: 4; column-gap: 5mm; }
.pt-freq-col { break-inside: avoid; page-break-inside: avoid; margin-bottom: 2mm; }
.pt-freq-cab { font-weight: 700; font-size: 8pt; border-bottom: 1px solid #000; padding-bottom: .5mm; }
.pt-freq-fila { display: flex; justify-content: space-between; gap: 2mm;
  font-size: 8pt; padding: .4mm 0; border-bottom: 1px dotted #ccc; }

.pt-met-grid { columns: 2; column-gap: 4mm; }
.pt-met-col { display: block; }
.pt-met { border: 1px solid #9a9a9e; padding: 1.5mm 2mm; margin-bottom: 2mm;
  break-inside: avoid; page-break-inside: avoid; }
.pt-met-cab { font-weight: 700; font-size: 8.5pt; }
.pt-met-linea { font-size: 7.8pt; margin-top: .6mm; }
.pt-crudo { font-size: 7.2pt; color: #333; margin-top: 1mm;
  border-top: 1px dotted #bbb; padding-top: .8mm; word-break: break-word; }

/* El pie con el logo chico, repetido en todas las páginas al imprimir */
.hoja-pie-logo { display: flex; align-items: center; justify-content: space-between;
  gap: 4mm; margin-top: 6mm; padding-top: 2mm; border-top: 1px solid #000;
  font-size: 7.5pt; color: #444; }
.hoja-pie-logo svg { height: 8mm; width: auto; color: #000; }
.hoja-papel h2 {
  font-size: 12pt; margin: 7mm 0 2mm; padding: 1mm 0 1mm 3mm;
  border-left: 3px solid #000; background: #ececec;
  break-after: avoid; page-break-after: avoid;
}
.hoja-papel section { break-inside: auto; }

/* --- NOTAM en papel, ordenados por prioridad ------------------------------
   ⚠️ Todo en tablas y flujo normal: en Chrome, un contenedor `grid` o `flex`
   que cruza el corte de página PIERDE contenido al imprimir. Acá no se puede
   perder un renglón, así que ni grid ni flex.
   Y nada de fondos rellenos: en una impresora de aeroclub salen como manchas
   negras. Lo grave se distingue por una barra al costado y negrita. */
.hoja-papel .np-tit {
  font-size: 9.5pt; margin: 4mm 0 1.5mm; padding-bottom: .6mm;
  border-bottom: 1px solid #000;
  break-after: avoid; page-break-after: avoid;
}
.hoja-papel .np-tit-grave { border-bottom-width: 2px; }
.hoja-papel .np-nota { font-size: 7.8pt; color: #444; margin: 0 0 1.5mm; }
.hoja-papel .np-sin { margin-top: 3mm; }

/* Los graves, completos */
.hoja-papel .np-ficha {
  border-left: 3px solid #000; padding: 1mm 0 1mm 2.5mm; margin: 0 0 2mm;
  break-inside: avoid; page-break-inside: avoid;
}
.hoja-papel .np-ficha-cab { font-size: 8.8pt; margin-bottom: .6mm; }
.hoja-papel .np-ficha-cab .np-id { font-weight: 700; margin-left: 1.5mm; }
.hoja-papel .np-ficha-cab .np-et {
  font-size: 7.6pt; margin-left: 1.5mm; padding: 0 1mm;
  border: 1px solid #9a9a9e;
}
.hoja-papel .np-ficha-txt { font-size: 8.6pt; margin: .6mm 0; }
.hoja-papel .np-ficha-pie { font-size: 7.8pt; color: #333; }
.hoja-papel .np-ficha-pie span + span::before { content: ' · '; }
/* El texto original se imprime sólo en los graves: es el mismo aviso en clave
   OACI. Chico, pero entero: es el texto oficial y no se recorta. */
.hoja-papel .np-crudo {
  font-size: 7pt; margin: .8mm 0 0; padding: .8mm 1.2mm;
  border: 1px solid #c8c8cc; white-space: pre-wrap; word-break: break-word;
}

/* El resto, un renglón cada uno */
/* ⚠️ `table-layout: fixed` NO es un detalle. Con el maquetado automático (el
   de por defecto) el navegador ENSANCHA la tabla para que entre el texto más
   largo en vez de partirlo: los NOTAM traen tiras como
   "325139S/0605215W 324733S/0603652W ..." y la tabla se iba a 3.886 px sobre
   una hoja de 794. En pantalla se ve porque aparece una barra; en papel, todo
   lo que pasa el borde derecho simplemente NO SE IMPRIME. Con `fixed` mandan
   los anchos de abajo y el texto se acomoda. */
.hoja-papel .np-tabla { font-size: 7.8pt; table-layout: fixed; width: 100%; }
.hoja-papel .np-tabla td { padding: .7mm 1.2mm; vertical-align: top; }
.hoja-papel .np-tabla .np-donde { width: 17mm; }
.hoja-papel .np-tabla .np-id { width: 20mm; font-weight: 700; }
.hoja-papel .np-tabla .np-que { width: 30mm; }
.hoja-papel .np-tabla .np-cuando { width: 34mm; white-space: nowrap; }
/* El texto no se corta: un NOTAM cortado a la mitad puede decir otra cosa.
   Se acomoda en varios renglones, pero entero.
   ⚠️ `white-space: normal` explícito. Algo más arriba deja las celdas en
   `nowrap` y entonces el renglón se estira todo lo que haga falta: medido, la
   tabla se iba a 3.569 px sobre una hoja de 794. En papel eso no se ve, se
   PIERDE: lo que pasa el borde derecho no se imprime. */
.hoja-papel .np-tabla .np-texto,
.hoja-papel .np-tabla .np-que {
  white-space: normal; word-break: break-word; overflow-wrap: anywhere;
}
.hoja-papel .np-tabla .np-grave td { font-weight: 700; }

/* --- Tablas anchas en papel ----------------------------------------------
   ⚠️ En pantalla, las tablas grandes (la de tramos son 12 columnas) viven
   adentro de `.tabla-scroll`, que agrega una barra horizontal. En papel no hay
   barra: lo que pasa el borde derecho SE PIERDE. Medido en un SAAP→SACO, la
   tabla de tramos se iba 20,6 mm y se cortaba la columna de combustible
   restante, que es justo la que se mira en vuelo.
   Se deja fluir, se achica la letra y se permite que el texto baje de renglón. */
.hoja-papel .tabla-scroll { overflow: visible; }
.hoja-papel .tabla-scroll > table { width: 100%; font-size: 7pt; }
.hoja-papel .tabla-scroll th, .hoja-papel .tabla-scroll td {
  white-space: normal; word-break: break-word; overflow-wrap: anywhere;
  padding: .5mm .8mm;
}


/* Lo que no se pudo consultar. Enmarcado, porque "no se pudo preguntar" no es
   lo mismo que "no hay avisos" y en papel no hay color que lo distinga. */
.hoja-papel .np-falla {
  font-size: 8.4pt; margin: 2mm 0; padding: 1.5mm 2mm;
  border: 2px solid #000;
  break-inside: avoid; page-break-inside: avoid;
}
.hoja-papel .np-pie { font-size: 7.8pt; color: #444; margin: 3mm 0 0; }
.hoja-papel table { width: 100%; border-collapse: collapse; font-size: 8.5pt; }
.hoja-papel th, .hoja-papel td { border: 1px solid #9a9a9e; padding: 1.1mm 1.6mm; }
.hoja-papel th { background: #ececec; font-weight: 700; }
.hoja-papel tr { break-inside: avoid; page-break-inside: avoid; }
/* Nada de fondos de color ni píldoras rellenas: se imprimen como manchas */
.hoja-papel .badge-legal, .hoja-papel .chip, .hoja-papel .pill {
  background: none !important; border: 1px solid #000 !important; color: #000 !important;
  padding: 0 4px; border-radius: 3px; font-weight: 700;
}
.hoja-papel .ruta-cobertura, .hoja-papel .item, .hoja-papel .fuel-caja,
.hoja-papel .meteo-tarjeta, .hoja-papel .freq-card, .hoja-papel .fase {
  background: none !important; border: 1px solid #9a9a9e !important;
}
.hoja-papel .item.grave { border-left: 3px solid #000 !important; }
.hoja-papel .ico, .hoja-papel button, .hoja-papel .card-flecha,
.hoja-papel .sugerencias, .hoja-papel .ruta-acciones, .hoja-papel .ayuda-puntos,
.hoja-papel .solapas-mapas, .hoja-papel .mapas-pie, .hoja-papel .perfil-barra { display: none !important; }
.hoja-papel .card, .hoja-papel .bloque { border: 0; background: none; }
.hoja-papel .card-cab { padding: 0; cursor: default; }
.hoja-papel .card-cuerpo { display: block !important; padding: 0; }
.hoja-papel .grid-datos { display: grid; grid-template-columns: repeat(4, 1fr); gap: 2mm 4mm; }
/* ⚠️ EN PAPEL EL CUADRADO DESPLEGABLE SE SACA DE LA GRILLA. El PDF abre todos
   los `<details>`, y la tabla del combustible mínimo legal abierta adentro de
   una celda de grilla de 1/4 de ancho se corta (Chrome no reparte un elemento
   de grilla entre dos páginas: le recorta lo que no entra). Fuera de la
   grilla, en flujo normal, se imprime entera. */
.hoja-papel .dato-desplegable {
  display: block; grid-column: 1 / -1; border: 0 !important; padding: 0;
}
.hoja-papel .dato-desplegable > summary { padding: 0; }
.hoja-papel .dato-desplegable > summary::after { display: none; }
.hoja-papel .dato-desplegable > .fuel-caja { border: 1px solid #9a9a9e !important; }
.hoja-papel .tabla-scroll, .hoja-papel .dist-pista-caja, .hoja-papel .perfil-caja { overflow: visible; }

/* ⚠️⚠️ LA HOJA SIEMPRE MIDE 210 mm, PERO LAS MEDIA QUERIES MIDEN LA VENTANA.
   Por eso, con la ventana angosta (o en un celular), a la hoja le pegaba el
   apilado del celular y las tres tarjetas de meteorología —o las tres fases—
   salían una abajo de la otra, aunque en la hoja sobra lugar para las tres.
   La previa mostraba una cosa y la pantalla otra.

   Se rehace el reparto acá adentro, sin depender del ancho de la ventana, y
   con `display: table` en vez de grid: Chrome **fragmenta bien las tablas**
   entre páginas y en cambio con grid/flex lo que no entra en la página se
   PIERDE (es la misma razón por la que la portada está armada con tablas).
   Ver la nota de [[maquetar-para-imprimir]] en la memoria del proyecto. */
.hoja-papel .meteo-grid,
.hoja-papel .grid-fases {
  display: table !important; width: 100%; table-layout: fixed;
  border-collapse: separate; border-spacing: 3mm 0; margin-left: -3mm; margin-right: -3mm;
}
.hoja-papel .meteo-grid > *,
.hoja-papel .grid-fases > * {
  display: table-cell !important; vertical-align: top;
  break-inside: avoid; page-break-inside: avoid;
}
/* Estas dos tienen una cantidad variable de tarjetas: en columnas, que se
   reparten solas y también se fragmentan bien al imprimir. */
.hoja-papel .freq-grid, .hoja-papel .dist-grid {
  display: block !important; columns: 2; column-gap: 6mm;
}
.hoja-papel .freq-grid > *, .hoja-papel .dist-grid > * {
  break-inside: avoid; page-break-inside: avoid; margin-bottom: 3mm;
  -webkit-column-break-inside: avoid;
}

/* El perfil vertical, para blanco y negro: sin rellenos de color, todo trazo */
.hoja-papel .perfil-svg { width: 100%; height: auto; --k: 1.6; }
.hoja-papel .perfil-svg .banda { fill: none !important; stroke: #000 !important; stroke-width: .8 !important; }
.hoja-papel .perfil-svg .terreno { fill: #d8d8d8 !important; stroke: #000 !important; }
.hoja-papel .perfil-svg .relleno { fill: #f0f0f0 !important; }
.hoja-papel .perfil-svg text { fill: #000 !important; }
.hoja-papel .perfil-svg .rejilla { stroke: #c8c8c8 !important; }
.hoja-papel .perfil-svg .senda, .hoja-papel .perfil-svg .terreno-linea { stroke: #000 !important; }
/* ⚠️ En pantalla la MSA es rosa y la franja de control verde/gris. Impresas en
   blanco y negro las dos se vuelven grises casi iguales, y son justo dos datos
   de seguridad: la altura mínima y dónde hay espacio controlado. Acá se
   distinguen por trazo y por tono, no por color. */
.hoja-papel .perfil-svg .msa-linea-svg { stroke: #000 !important; stroke-width: 1.4 !important; }
.hoja-papel .perfil-svg .etq-msa { fill: #000 !important; }
/* La hoja de la piernera se imprime en blanco y negro: el naranja de la capa
   de transición sale como un gris que se confunde con el terreno. */
.hoja-papel .perfil-svg .trans,
.hoja-papel .perfil-svg .trans-nivel { stroke: #000 !important; }
.hoja-papel .perfil-svg .capa-trans { fill: #000 !important; opacity: .07 !important; }
.hoja-papel .perfil-svg .tira-ctl { fill: #fff !important; fill-opacity: 1 !important;
  stroke: #000 !important; stroke-opacity: 1 !important; }
.hoja-papel .perfil-svg .tira-g { fill: #a0a0a0 !important; fill-opacity: 1 !important;
  stroke: #000 !important; }
.hoja-papel .perfil-svg .etq-esp { fill: #000 !important; }
/* Lo que en pantalla se distingue por color, en papel se distingue por trazo.
   El borde rojo del NOTAM crítico impreso en gris queda igual que el de uno
   informativo: acá va negro y grueso. */
.hoja-papel .notam-item { border-left: 1px solid #9a9a9e !important; }
.hoja-papel .notam-item.grave, .hoja-papel .notam-item.critico {
  border-left: 4px solid #000 !important; }
.hoja-papel .notam-tipo { color: #000 !important; border-color: #000 !important; font-weight: 700; }
.hoja-papel .cat { background: none !important; border: 1px solid #000 !important; }
/* Los mapas del vuelo van en color y no deben heredar el "todo negro" de la
   hoja: son cartas, y el color ahí es dato (agua, tierra, zonas, viento). */
.hoja-papel .hoja-mapa svg text { fill: inherit; }
.hoja-papel td, .hoja-papel strong, .hoja-papel .ok, .hoja-papel .mal { color: #000 !important; }
.hoja-papel .hoja-nota { font-size: 8pt; color: #444; margin: 1mm 0 0; }
.hoja-papel .hoja-pie { margin-top: 8mm; padding-top: 2mm; border-top: 1px solid #000;
  font-size: 8pt; color: #444; }

/* Los mapas del vuelo: cada uno solo, en su hoja. Son grandes y apaisados,
   partidos al medio por un salto de página no sirven para nada. */
.hoja-papel .hoja-mapa { break-before: page; page-break-before: always;
  break-inside: avoid; page-break-inside: avoid; }
.hoja-papel .hoja-mapa svg { width: 100%; height: auto; }

/* --------- Fichas de los aeródromos, al final de la hoja ---------------
   Cada una empieza en página nueva: son de consulta y se buscan por
   aeródromo, así que tienen que poder encontrarse pasando hojas. */
.hoja-papel .hoja-ficha-ad { break-before: page; page-break-before: always; }
.hoja-papel .hoja-ficha-ad .fad-tit {
  font-size: 9.5pt; font-weight: 700; margin: 4mm 0 1.5mm;
  border-bottom: 1px solid #9a9a9e; padding-bottom: .8mm;
}
/* El encabezado de la ficha repite el código y el nombre que ya puso el <h2>
   de la sección, y las marcas de estado ya salen como avisos. */
.hoja-papel .hoja-ficha-ad .fad-cab { display: none; }
.hoja-papel .fad-datos { display: block; columns: 2; column-gap: 6mm; }
.hoja-papel .fad-datos > * { break-inside: avoid; page-break-inside: avoid; }
/* Las cartas del AIP son ENLACES: en papel un enlace sin su dirección no
   sirve para nada, así que se imprime la dirección al lado. */
.hoja-papel .fad-carta { display: block; color: #000 !important; text-decoration: none; }
.hoja-papel .fad-carta::after {
  content: ' — ' attr(href); font-size: 7pt; color: #444; word-break: break-all;
}
.hoja-papel .fad-normas { font-size: 8.5pt; }
.hoja-papel .fad-mas { break-inside: auto; }

/* ⚠️ COLAS HUÉRFANAS: tres hojas desperdiciadas en la exportación real.
   Cada ficha de aeródromo empieza en página nueva, y cuando pasaba de una
   página por poco, dejaba una hoja con TRES O CUATRO RENGLONES sueltos (la
   lista de cartas de una, las "Normas generales" de otra). En un plan que ya
   tiene 21 páginas, tres de ellas casi en blanco.

   Se arregla en dos pasos:
   1. Un título nunca queda solo al pie: se pega a lo que viene abajo.
   2. Cada bloque de la ficha (la tabla de pistas, la lista de frecuencias, la
      de cartas, las normas) no se parte al medio.
   Lo que sigue siendo más alto que una hoja se parte igual, que es lo correcto:
   el criterio es no dejar migajas, no impedir todo corte. */
.hoja-papel .hoja-ficha-ad .fad-tit {
  break-after: avoid; page-break-after: avoid;
}
.hoja-papel .hoja-ficha-ad .fad-tabla,
.hoja-papel .hoja-ficha-ad .fad-frecs,
.hoja-papel .hoja-ficha-ad .fad-normas,
.hoja-papel .hoja-ficha-ad .fad-cartas {
  break-inside: avoid; page-break-inside: avoid;
}
/* Y en cualquier párrafo de la hoja: nunca menos de dos renglones de un lado
   ni del otro de un corte de página. */
.hoja-papel p, .hoja-papel li { orphans: 2; widows: 2; }

/* Las tablas del peso y balance van enteras. La de límites (peso de despegue
   y los dos topes de CG) son TRES renglones que deciden si el avión sale o no:
   partida entre dos hojas quedaba media acá y media allá, y en la exportación
   real dejó una página con tres renglones sueltos. */
.hoja-papel .wb-tabla { break-inside: avoid; page-break-inside: avoid; }

/* ⚠️ HOJA EN BLANCO AL FINAL. La exportación terminaba con una página vacía.
   Pasa cuando el último elemento arrastra un margen inferior que ya no entra
   en la hoja: el navegador abre una más para ese margen y queda sola. Se le
   saca el margen al último hijo de la hoja. */
.hoja-papel > *:last-child { margin-bottom: 0 !important; }
.hoja-papel { padding-bottom: 0; }

/* ========================= .oculto, la regla general =========================
   ⚠️ Antes NO existía: cada componente declaraba su propio `.algo.oculto` y el
   que se olvidaba quedaba VISIBLE aunque el JavaScript le pusiera la clase. Así
   se veía la barra de solapas del vuelo dentro del Panel (`.acciones.oculto`),
   la casilla de los corredores VFR (`.chk.oculto`) y el botón de tema.

   Va acá, al final y ANTES del bloque de impresión, para dos cosas: le gana por
   orden a cualquier regla de una sola clase de más arriba (misma especificidad,
   gana la última), y no le pisa nada a `@media print`, que viene después.
   Los pocos `display: none !important` que ya existen siguen mandando. */
.oculto { display: none; }

/* ------------------------------ AL IMPRIMIR ------------------------------
   Sólo queda `#imprimible`, que es donde `mandarAImprimir()` copia la hoja. */
.imprimible { display: none; }
@media print {
  body > *:not(#imprimible) { display: none !important; }
  .imprimible { display: block !important; }
  .hoja-barra { display: none !important; }
  .hoja-scroll { overflow: visible; padding: 0; }
  /* En papel la hoja va a tamaño real: la reducción es sólo de la vista previa */
  .imprimible .hoja-papel { transform: none; margin-bottom: 0; }
  .hoja-papel { width: auto; box-shadow: none; padding: 0; margin: 0; }
  .hoja-papel h2 { background: #ececec; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
  .hoja-papel th { background: #ececec; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
  /* Los mapas SÍ van en color: son cartas, y el color es parte del dato
     (agua, tierra, zonas). El resto de la hoja ya está pensado en trazo. */
  .hoja-papel .hoja-mapa svg { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
  /* ⚠️ EL PIE NO VA `position: fixed`. Estaba así para repetirlo abajo de
     todas las páginas, y el lugar se reservaba con un `padding-bottom` en
     `.hoja-papel`. Eso NO funciona: un padding del contenedor deja lugar UNA
     vez, al final de todo, no al pie de cada página. Resultado medido en un
     plan de 14 páginas: en 8 de ellas quedaba texto abajo, y como el pie es
     fijo y con fondo blanco, se lo comía. Se tapaban NOTAM enteros.

     En Chrome no hay forma de reservar ese espacio por página con CSS (haría
     falta meter TODA la hoja adentro de una tabla y usar `<tfoot>`, que es lo
     único que el navegador repite reservando lugar). Así que el pie va una
     sola vez, al final, en el flujo normal: se pierde la repetición, no se
     pierde ni una línea de texto. */
  .hoja-pie-logo { break-inside: avoid; page-break-inside: avoid; }
  @page { size: A4 portrait; margin: 12mm; }
}

/* ===========================================================================
   PULIDO DE INTERFAZ
   ===========================================================================
   Va TODO junto y al final a propósito: son ajustes de presentación que se
   apoyan sobre lo de arriba. Si algo se ve peor, se borra este bloque entero
   y la app vuelve exactamente a como estaba. Ninguna regla de acá cambia qué
   información se muestra: sólo cuánta respira, qué tan fuerte se ve y en qué
   color. Un dato que estaba, sigue estando.
   =========================================================================== */

/* --- 1. ESCALA DE ESPACIADO ------------------------------------------------
   Todo múltiplo de 4. Antes había márgenes de 6, 7, 9, 10, 11 y 13 px puestos
   a ojo; esa irregularidad no se identifica pero se percibe, y es la mitad de
   por qué la app se veía "cruda". */
/* ⚠️ LOS TRES SELECTORES, no `:root` a secas. El bloque de tokens de arriba
   se declara como `:root, :root[data-theme="dark"]`, y `[data-theme="dark"]`
   tiene MÁS ESPECIFICIDAD que un `:root` pelado. Con `:root` solo, estas
   redefiniciones se cargaban pero perdían: `--pad-card` seguía en 14 px y
   `--gap-cards` en 18 aunque acá dijeran otra cosa. Medido, no supuesto. */
:root,
:root[data-theme="dark"],
:root[data-theme="light"] {
  --e1: 4px;  --e2: 8px;   --e3: 12px;
  --e4: 16px; --e5: 24px;  --e6: 32px;

  /* Las tarjetas son lo que más se mira: se les da aire de verdad. */
  --pad-card:  var(--e4);
  --gap:       var(--e3);
  --gap-cards: var(--e5);
}

/* El título de la tarjeta necesita separarse del cuerpo, si no se lee todo
   como un bloque continuo. */
.card-cab { padding-top: var(--e3); padding-bottom: var(--e3); }
.card-cuerpo { padding-bottom: var(--e4); }
.card-cuerpo > *:first-child { margin-top: 0; }
.card-cuerpo > *:last-child { margin-bottom: 0; }

/* --- 2. JERARQUÍA ----------------------------------------------------------
   Tres niveles y nada más: el DATO (grande y con todo el contraste), su
   ETIQUETA (chica, gris, en versalita) y el resto del texto. La etiqueta va
   arriba y en gris para que el ojo caiga primero en el número. */
.dato-etq, .campo > label, .sub-cap {
  font-size: var(--t-mini); font-weight: var(--peso-etq);
  letter-spacing: .04em; text-transform: uppercase; color: var(--muted);
}
.dato-valor { font-size: 21px; font-weight: 700; line-height: 1.15; color: var(--texto); }

/* --- 3. EL ACENTO SIGNIFICA UNA SOLA COSA ---------------------------------
   El naranja es "acá estás" / "esto es lo principal". Un AVISO no es un
   acento: si se pinta del mismo color que la solapa activa, el ojo deja de
   distinguir "estoy en esta pestaña" de "ojo con esto".
   Los avisos van en ámbar, y lo que puede impedir el vuelo, en rojo. */
.ruta-cobertura.alerta {
  border-left: 3px solid var(--alerta); background: var(--alerta-db);
  border-radius: var(--radio-btn); padding: var(--e2) var(--e3);
}
.ruta-cobertura.alerta.grave, .ruta-cobertura.peligro {
  border-left-color: var(--peligro); background: var(--peligro-db);
}

/* --- 4. BOTONES: TRES, Y SE DISTINGUEN -----------------------------------
   Uno lleno (la acción principal, UNO por pantalla), uno con borde
   (secundario) y uno sin nada (terciario). Antes los tres se parecían
   demasiado y ninguno se leía como "el que hay que apretar". */
.btn-1 { font-weight: 650; }
.btn-2 { background: transparent; border: 1px solid var(--borde); }
.btn-2:hover:not(:disabled) { border-color: var(--naranja); color: var(--naranja-cl); }

/* --- 5. FOCO VISIBLE ------------------------------------------------------
   Al moverse con el teclado hay que ver DÓNDE se está parado. Es accesibilidad
   y además es lo que separa una app prolija de una que no lo es.
   `:focus-visible` y no `:focus`: así el anillo NO aparece al hacer click con
   el mouse, que es cuando molesta. */
:where(button, a, input, select, textarea, [tabindex]):focus-visible {
  outline: 2px solid var(--naranja);
  outline-offset: 2px;
  border-radius: var(--radio-btn);
}

/* --- 6. TRANSICIONES ------------------------------------------------------
   150 ms al cambiar de vista. Sin esto los paneles aparecen de golpe y se
   siente como una página recargándose, no como una aplicación.
   ⚠️ Sólo la opacidad: mover cosas de lugar al entrar marea y, en una app que
   se usa apurado antes de volar, estorba. */
.vista.activa { animation: entrada .15s ease-out; }
@keyframes entrada { from { opacity: 0; } to { opacity: 1; } }

/* Quien pidió menos movimiento en su sistema, no lo tiene. */
@media (prefers-reduced-motion: reduce) {
  .vista.activa { animation: none; }
  * { transition-duration: .01ms !important; }
}

/* --- 7. ESTADOS VACÍOS ----------------------------------------------------
   "Todavía no generaste ningún plan" es correcto pero seco. Con aire y el
   texto centrado, un hueco pasa a leerse como una invitación. */
.panel-vacio {
  color: var(--muted); text-align: center;
  padding: var(--e5) var(--e3); margin: 0;
  line-height: 1.5;
}

/* --- 8. LA PANTALLA DE INGRESO -------------------------------------------
   Es lo PRIMERO que ve alguien y hoy no dice nada de lo que la app hace.
   En escritorio pasa a dos columnas: el formulario a la izquierda, angosto y
   limpio, y a la derecha una franja con la marca.
   En el celular la franja desaparece y queda sólo el formulario: en 375 px,
   una decoración que empuja el formulario abajo es un estorbo. */
@media (min-width: 900px) {
  .cuenta { padding: 0; align-items: stretch; }
  .cuenta-caja {
    /* El ancho de la columna del formulario va en una variable porque la franja
       de marca se ancla a mano al borde de esa columna (ver más abajo). */
    --col-form: 460px;
    max-width: none; width: 100%; min-height: 100vh;
    display: grid; grid-template-columns: var(--col-form) 1fr;
    /* ⚠️ `align-content: center` y NO `align-items: center`. Con `items` cada
       fila se estira para repartirse el alto de la pantalla y quedaban huecos
       enormes entre el logo, la bajada y las solapas. Con `content` el grupo
       entero se centra y las filas conservan su alto natural. */
    align-content: center;
    row-gap: var(--e3);
  }
  /* El formulario, contenido a un ancho legible dentro de su columna */
  .cuenta-caja > *:not(.cuenta-marca) {
    grid-column: 1; max-width: 340px; margin-left: auto; margin-right: auto;
    width: 100%;
  }
  .cuenta-caja .cuenta-marca {
    /* ⚠️ ESTO ERA `grid-column: 2; grid-row: 1 / 99; align-self: stretch`, y
       medía 1495 px de alto en una pantalla de 860. El motivo: al saltear 98
       filas se suman también los 97 `row-gap` de por medio, y el alto se va a
       cualquier lado. Mientras la franja fue un color plano no se notaba (un
       color plano se ve igual de alto que sea), pero apenas se le puso una
       hoja de fondo con `cover`, el `cover` se calculaba contra esos 1495 px y
       en pantalla se veía sólo una tira del medio del dibujo.

       La franja se saca de la grilla y se ancla a la PANTALLA. La columna 2 de
       la grilla queda vacía y sigue reservando el lugar, que es lo único que
       hacía falta de ella para que el formulario no se corra.

       ⚠️ Y va `fixed`, no `absolute`. Con `absolute` no sirve: un hijo
       POSICIONADO de una grilla se ancla a SU CELDA de la grilla, no al
       contenedor, aunque el contenedor sea `position: relative`. Medido: la
       franja arrancaba en x=920 (460 de la celda + 460 del `left`) y se iba de
       la pantalla. Con `fixed` el marco de referencia es la ventana, que es
       exactamente lo que se quiere: la franja ocupa desde el borde de la
       columna del formulario hasta el borde derecho, de arriba a abajo. */
    position: fixed; top: 0; right: 0; bottom: 0; left: var(--col-form);
    display: flex; align-items: center; justify-content: center;
    background:
      radial-gradient(120% 120% at 30% 20%, rgba(255,107,0,.10), transparent 60%),
      var(--panel);
    border-left: 1px solid var(--borde);
    /* La hoja de fondo se sale de la franja: hay que recortarla acá */
    overflow: hidden; isolation: isolate;
  }
  /* Nada que corregir acá: el botón ya va pegado a la esquina de la pantalla
     en todos los tamaños (ver `.cuenta-cerrar`). */
}

/* La franja de marca: oculta salvo en escritorio ancho (la media query de
   arriba la coloca en la segunda columna). */
.cuenta-marca { display: none; }
@media (min-width: 900px) { .cuenta-marca { display: flex; } }
.cuenta-marca-logo {
  width: min(42%, 340px); height: auto; color: var(--muted); opacity: .5;
  position: relative; z-index: 2;   /* por encima de la hoja de fondo */
}

/* --- La hoja de verdad detrás del logo -------------------------------------
   El fondo de la franja de ingreso es UNA HOJA REAL de las que genera la app:
   el corte vertical de un Bariloche–Mar del Plata, con el terreno de verdad y
   el viento del GFS. La arma `server/datos/generar-fondo-ingreso.mjs` y queda
   como archivo suelto en `web/img/fondo-ingreso.svg`.

   ⚠️ Va como `background-image` y NO como SVG en línea. Adentro del HTML, los
   `id` y el `<style>` de un SVG son globales de la página y pisan reglas de la
   app (ya rompió el PDF una vez). Como archivo aparte no puede tocar nada.

   ⚠️ Y va en un `::before`, no en el `background` de la franja, porque hace
   falta bajarle la opacidad a la hoja SIN desteñir el logo que va encima. */
.cuenta-marca::before {
  content: ''; position: absolute; inset: 0; z-index: 0;
  background: url('img/fondo-ingreso.svg') center / cover no-repeat;
  /* La hoja es papel blanco con líneas finas: a plena opacidad tapa la franja
     y compite con el formulario. Se deja como una marca de agua (la opacidad
     exacta la fija cada tema, más abajo). */
  /* Se desvanece hacia los bordes: así no se ve "una imagen pegada" sino que
     la hoja se funde con la franja. `-webkit-` incluido para Safari de iOS. */
  -webkit-mask-image: radial-gradient(115% 95% at 50% 50%, #000 35%, transparent 78%);
  mask-image: radial-gradient(115% 95% at 50% 50%, #000 35%, transparent 78%);
  pointer-events: none;
}
/* Un velo del color del panel encima de la hoja: baja el contraste del papel
   blanco y deja que el logo se lea sin depender de la opacidad de la hoja. */
.cuenta-marca::after {
  content: ''; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background: radial-gradient(52% 34% at 50% 46%, var(--panel) 0%, transparent 72%);
  opacity: .45;
}

/* En oscuro, una hoja de papel blanco al 30 % es un manchón claro en el medio
   de la pantalla. Se invierte (papel oscuro, líneas claras) y se baja todavía
   más. El `hue-rotate` devuelve los colores a su tono original: sin él, el
   verde del terreno sale violeta.

   ⚠️ El caso base de esta app es el OSCURO: la paleta se declara como
   `:root, :root[data-theme="dark"]`, y el claro es el que sobrescribe. Por eso
   la inversión va arriba sin condición y el claro la saca, y no al revés: si
   se escribiera `:root[data-theme="dark"] { invert }`, un `:root` pelado sin
   atributo (el primer instante antes de que el JS lo ponga) quedaría claro. */
.cuenta-marca::before { filter: invert(1) hue-rotate(180deg); opacity: .30; }
:root[data-theme="light"] .cuenta-marca::before { filter: none; opacity: .34; }

/* --- El menú lateral por encima del velo de "calculando" ------------------
   ⚠️ El velo gris estaba en z-index 3000 y el menú en 1500, así que al pasar
   el mouse el menú se desplegaba POR DEBAJO del gris: se veía apagado y no se
   podía tocar. Queda por encima del velo, pero por debajo de la pantalla de
   ingreso (9000), que sí tiene que tapar todo. */
.lateral { z-index: 3500; }

/* ==========================================================================
   LA LANDING · la pantalla pública, antes de iniciar sesión
   ==========================================================================
   Vive DENTRO de `#vista-inicio`, o sea en la misma columna que scrollea que
   todo el resto de la app. Por eso no lleva barra propia ni scroll propio: la
   barra de arriba y el scroll ya existen.

   ⚠️ NO hay ni un color escrito a mano acá abajo: todo sale de las variables
   de la identidad, igual que el resto del archivo. Así la landing acompaña
   sola al tema claro y al oscuro, y si mañana cambia el naranja de la marca
   cambia también acá sin tocar nada.

   ⚠️ Tampoco hay tipografía nueva. El aire "técnico" de los rótulos sale de
   MAYÚSCULAS + letras separadas (`letter-spacing`), no de una monoespaciada:
   la app usa una sola fuente a propósito y no descarga ninguna, porque tiene
   que andar sin internet.
   ========================================================================== */

.landing { display: flex; flex-direction: column; gap: var(--gap-cards); }
.landing.oculto { display: none; }

/* Cada sección es una tarjeta, como todo el resto de la app: la landing tiene
   que parecer la misma pieza de software, no una página pegada con cinta. */
.lp-hero, .lp-seccion, .lp-cierre, .lp-pie {
  background: var(--panel);
  border: 1px solid var(--borde);
  border-radius: var(--radio);
  padding: var(--e6) var(--e5);
  /* Que el enlace de la barra no deje la sección pegada al borde de arriba */
  scroll-margin-top: var(--e3);
}

/* ------------------------------- Títulos ------------------------------- */
.lp-sobretitulo {
  margin: 0 0 var(--e3);
  font-size: var(--t-mini);
  font-weight: var(--peso-etq);
  letter-spacing: .16em;         /* el "aire de teletipo", sin monoespaciada */
  text-transform: uppercase;
  color: var(--naranja-cl);
}
.lp-h1 {
  margin: 0;
  /* Crece con la pantalla y no necesita media queries para el tamaño */
  font-size: clamp(28px, 5.2vw, 46px);
  line-height: 1.1;
  letter-spacing: -.015em;
  color: var(--texto);
}
.lp-h2 {
  margin: 0 0 var(--e4);
  font-size: clamp(19px, 2.6vw, 26px);
  letter-spacing: -.01em;
  color: var(--texto);
}
.lp-bajada {
  margin: var(--e4) 0 0;
  max-width: 46ch;
  font-size: clamp(14px, 1.6vw, 17px);
  line-height: 1.6;
  color: var(--muted);
}

/* --------------------------------- Hero -------------------------------- */
.lp-hero {
  display: grid;
  grid-template-columns: 1fr;    /* primero el celular: una sola columna */
  gap: var(--e5);
  align-items: center;
  /* Un resplandor naranja muy tenue, del lado del título. Es el único adorno
     de toda la landing. */
  background:
    radial-gradient(120% 130% at 8% 0%, var(--naranja-db), transparent 58%),
    var(--panel);
}
@media (min-width: 900px) {
  .lp-hero { grid-template-columns: 1.05fr .95fr; gap: var(--e6); }
}

.lp-botones {
  display: flex; flex-wrap: wrap; align-items: stretch;
  gap: var(--e2); margin-top: var(--e5);
}
.lp-botones-centro { justify-content: center; }
.lp-cta { height: 46px; padding: 0 22px; font-size: var(--t-valor); }

/* Los botones de las tiendas. Son <span> y NO <a> a propósito: todavía no hay
   aplicación, así que no hay ningún lado a donde ir. Un enlace que no lleva a
   ninguna parte es peor que un cartel que avisa. */
.lp-tienda {
  display: inline-flex; align-items: center; gap: 9px;
  height: 46px; padding: 0 16px;
  border: 1px solid var(--borde); border-radius: var(--radio-btn);
  background: var(--panel-alt);
  cursor: not-allowed;
}
.lp-tienda .ico { width: 18px; height: 18px; flex-shrink: 0; color: var(--muted); }
.lp-tienda-txt {
  display: flex; flex-direction: column; line-height: 1.15; text-align: left;
  font-size: var(--t-base); font-weight: 700; color: var(--texto);
}
.lp-tienda-txt small {
  font-size: 9.5px; letter-spacing: .1em; text-transform: uppercase;
  font-weight: var(--peso-etq); color: var(--muted);
}

.lp-nota-hero {
  margin: var(--e4) 0 0; max-width: 52ch;
  font-size: var(--t-chico); line-height: 1.55; color: var(--muted);
}

/* -------------------- El marcador de la captura ------------------------- */
/* Se ve claramente como un hueco a rellenar, no como una imagen rota. */
.lp-captura {
  border: 1px solid var(--borde); border-radius: var(--radio);
  background: var(--negro); overflow: hidden;
  box-shadow: 0 18px 50px var(--sombra);
}
.lp-captura-barra {
  display: flex; gap: 6px; align-items: center;
  padding: 9px 12px; background: var(--chapa-bg2);
  border-bottom: 1px solid var(--chapa-borde);
}
.lp-captura-barra span {
  width: 9px; height: 9px; border-radius: 50%; background: var(--borde);
}
.lp-captura-hueco {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: var(--e2); text-align: center;
  aspect-ratio: 16 / 10; padding: var(--e5);
  border: 2px dashed var(--borde); margin: var(--e3);
  border-radius: var(--radio);
  color: var(--muted);
}
.lp-captura-hueco .ico { width: 30px; height: 30px; opacity: .55; }
.lp-captura-hueco strong { font-size: var(--t-base); color: var(--texto); }
.lp-captura-hueco span { font-size: var(--t-chico); }

/* ---------------------------- Características --------------------------- */
.lp-grilla {
  display: grid; gap: var(--gap);
  grid-template-columns: 1fr;                      /* celular */
}
@media (min-width: 620px) { .lp-grilla { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1100px) { .lp-grilla { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
/* La de opiniones no pasa de 3 por fila ni en pantallas anchas */
@media (min-width: 620px) { .lp-grilla-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 619px) { .lp-grilla-3 { grid-template-columns: 1fr; } }

.lp-tarjeta {
  background: var(--panel-alt); border: 1px solid var(--borde);
  border-radius: var(--radio); padding: var(--e4);
}
.lp-tarjeta:hover { border-color: var(--naranja); }
.lp-ico {
  width: 22px; height: 22px; color: var(--naranja-cl); margin-bottom: var(--e3);
}
.lp-tarjeta h3 {
  margin: 0 0 var(--e2); font-size: var(--t-titulo); color: var(--texto);
}
.lp-tarjeta p {
  margin: 0; font-size: var(--t-chico); line-height: 1.6; color: var(--muted);
}

/* ----------------------------- Cómo funciona ---------------------------- */
.lp-pasos {
  list-style: none; margin: 0; padding: 0;
  display: grid; gap: var(--gap); grid-template-columns: 1fr;
}
@media (min-width: 760px) { .lp-pasos { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
.lp-pasos li { display: flex; gap: var(--e3); align-items: flex-start; }
.lp-paso-n {
  flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  width: 34px; height: 34px; border-radius: 50%;
  background: var(--naranja-db); border: 1px solid var(--naranja);
  color: var(--naranja-cl); font-weight: 800; font-size: var(--t-valor);
}
.lp-pasos h3 { margin: 5px 0 var(--e1); font-size: var(--t-titulo); color: var(--texto); }
.lp-pasos p { margin: 0; font-size: var(--t-chico); line-height: 1.6; color: var(--muted); }

/* ------------------------------ Opiniones ------------------------------- */
.lp-aclaracion {
  margin: calc(var(--e4) * -1) 0 var(--e4);
  font-size: var(--t-chico); color: var(--muted);
}
.lp-opinion {
  margin: 0; padding: var(--e4);
  background: var(--panel-alt); border: 1px solid var(--borde);
  border-radius: var(--radio);
}
/* La marca de "esto es de mentira". Va ÁMBAR y no naranja de marca: es un
   aviso de estado, no un acento decorativo. */
.lp-ejemplo {
  display: inline-block; margin-bottom: var(--e3);
  padding: 2px 8px; border-radius: 999px;
  background: var(--alerta-db); border: 1px solid var(--alerta);
  color: var(--alerta);
  font-size: var(--t-mini); font-weight: var(--peso-etq);
  letter-spacing: .04em;
}
.lp-opinion blockquote {
  margin: 0 0 var(--e3); font-size: var(--t-base); line-height: 1.6; color: var(--texto);
}
.lp-opinion figcaption { font-size: var(--t-chico); color: var(--muted); }

/* -------------------------------- Cierre -------------------------------- */
.lp-cierre { text-align: center; }
.lp-cierre .lp-h2 { margin-bottom: var(--e2); }
.lp-cierre > p { margin: 0; font-size: var(--t-base); color: var(--muted); }

/* -------------------------- Preguntas frecuentes ------------------------ */
.lp-faqs { display: flex; flex-direction: column; gap: var(--e2); }
.lp-faq {
  background: var(--panel-alt); border: 1px solid var(--borde);
  border-radius: var(--radio); overflow: hidden;
}
.lp-faq > summary {
  display: flex; align-items: center; justify-content: space-between; gap: var(--e3);
  padding: var(--e3) var(--e4); cursor: pointer;
  font-size: var(--t-base); font-weight: var(--peso-etq); color: var(--texto);
  list-style: none;
}
.lp-faq > summary::-webkit-details-marker { display: none; }
/* El signo "+" que se convierte en "−" al abrir. Es un pseudo-elemento y no un
   ícono del sprite: así no depende de que ese símbolo exista. */
.lp-faq > summary::after {
  content: '+'; flex-shrink: 0;
  font-size: 18px; line-height: 1; color: var(--naranja-cl);
}
.lp-faq[open] > summary::after { content: '\2212'; }
.lp-faq > summary:hover { color: var(--naranja-cl); }
.lp-faq > p {
  margin: 0; padding: 0 var(--e4) var(--e4);
  font-size: var(--t-chico); line-height: 1.65; color: var(--muted);
  max-width: 78ch;
}

/* ---------------------------------- Pie --------------------------------- */
.lp-pie {
  display: flex; flex-wrap: wrap; gap: var(--e5);
  align-items: flex-start; justify-content: space-between;
  padding: var(--e5);
}
.lp-pie-logo { display: block; height: 30px; width: auto; color: var(--texto); }
.lp-pie-marca p {
  margin: var(--e3) 0 0; font-size: var(--t-mini);
  letter-spacing: .04em; color: var(--muted);
}
.lp-pie-enlaces { display: flex; flex-direction: column; gap: var(--e2); }
.lp-pie-enlaces a, .lp-pie-contacto a {
  font-size: var(--t-chico); color: var(--muted); text-decoration: none;
}
.lp-pie-enlaces a:hover, .lp-pie-contacto a:hover { color: var(--naranja-cl); }
.lp-pie-contacto {
  display: flex; flex-direction: column; gap: var(--e2);
  font-size: var(--t-chico); color: var(--muted);
}

/* ------------------- Los enlaces de la landing en la barra --------------- */
.barra-landing { display: flex; gap: var(--e4); align-items: center; }
.barra-landing.oculto { display: none; }
.barra-landing a {
  font-size: var(--t-chico); font-weight: var(--peso-etq);
  color: var(--chapa-muted); text-decoration: none; white-space: nowrap;
}
.barra-landing a:hover { color: var(--chapa-activa); }
.barra-entrar.oculto { display: none; }

/* En el celular los enlaces de la barra no entran: la barra ya lleva el logo,
   el interruptor de tema y el botón de entrar. Se ocultan y quedan los del
   pie, que hacen exactamente lo mismo. */
@media (max-width: 900px) {
  .barra-landing { display: none; }
}
@media (max-width: 560px) {
  .lp-hero, .lp-seccion, .lp-cierre { padding: var(--e5) var(--e4); }
  /* Los botones ocupan el ancho completo: en 375 px, dos al lado del otro
     dejan el texto en dos renglones y se ve apretado. */
  .lp-cta, .lp-tienda { width: 100%; justify-content: center; }
  .lp-pie { flex-direction: column; gap: var(--e4); }
}

/* Al imprimir no va: la hoja de la piernera es para volar. */
@media print { .landing, .barra-landing, .barra-entrar { display: none !important; } }

/* ==========================================================================
   PANTALLA DE CARGA
   ==========================================================================
   Tapa todo mientras la app decide qué mostrar. Arranca VISIBLE desde el HTML
   y la apaga `ocultarCarga()` en app.js.

   ⚠️ EL PROBLEMA QUE RESUELVE NO ERA "LA PÁGINA TARDA". Era que la página se
   armaba a la vista: la columna del mapa nacía visible y se escondía recién
   cuando el servidor contestaba si había sesión, así que en el medio se veía
   un mapa de la Argentina entero encima de la landing. Eso está arreglado en
   el HTML (la columna nace oculta). Esta capa cubre lo que queda: el viaje de
   red, que con el servidor dormido puede tardar bastante.
   ========================================================================== */

.carga {
  position: fixed; inset: 0; z-index: 99999;
  display: flex; align-items: center; justify-content: center;
  background: var(--negro);
  /* Que no se pueda tocar nada de abajo mientras tapa */
  cursor: progress;
}
/* La apaga el JavaScript. Se desvanece en vez de desaparecer de golpe: el corte
   seco se lee como un parpadeo, y justamente veníamos de sacar parpadeos.

   ⚠️ EL `!important` NO ES UN PARCHE SUCIO, HACE FALTA. Más abajo hay un plazo
   de seguridad que es una ANIMACIÓN, y en CSS una animación le gana a cualquier
   declaración normal, venga de donde venga (incluso de un `style=` en la propia
   etiqueta). Sin el `!important` esta opacidad no se aplicaba: medido, la capa
   se quedaba en 1 y el desvanecido no ocurría nunca. Lo único que le gana a una
   animación es `!important`. */
.carga.se-va {
  opacity: 0 !important; pointer-events: none;
  transition: opacity .28s ease;
}
.carga.oculto { display: none; }

.carga-caja {
  display: flex; flex-direction: column; align-items: center; gap: var(--e5);
  padding: var(--e5);
}
.carga-logo {
  width: min(260px, 62vw); height: auto; color: var(--texto);
  /* Respira despacio. Es el único movimiento del logo: la brújula NO gira,
     una brújula que gira sola es una brújula rota. */
  animation: carga-respira 1.9s ease-in-out infinite;
}
@keyframes carga-respira {
  0%, 100% { opacity: .82; }
  50%      { opacity: 1; }
}

/* La barrita de abajo. Es INDETERMINADA a propósito: no sabemos cuánto falta,
   y una barra que dice 40 % cuando nadie midió nada es mentira. */
.carga-barra {
  width: min(260px, 62vw); height: 2px; border-radius: 2px;
  background: var(--borde); overflow: hidden;
}
.carga-barra span {
  display: block; width: 38%; height: 100%; border-radius: 2px;
  background: var(--naranja);
  animation: carga-corre 1.25s ease-in-out infinite;
}
@keyframes carga-corre {
  0%   { transform: translateX(-100%); }
  100% { transform: translateX(360%); }
}

/* A quien le molesta el movimiento se le muestra el logo quieto. No es un
   detalle de cortesía: hay gente a la que una animación en bucle le da mareo. */
@media (prefers-reduced-motion: reduce) {
  .carga-logo, .carga-barra span { animation: none; }
  .carga-barra span { width: 100%; }
}

/* ⚠️ PLAZO MÁXIMO EN EL PROPIO CSS. Si el JavaScript no llega a correr —un
   error de red, un archivo que no bajó, un navegador viejo que revienta con
   algo— la pantalla de carga se quedaría tapando la app PARA SIEMPRE, y el
   usuario vería un logo eterno sin poder hacer nada. Con esta animación, a los
   8 segundos se desvanece sola aunque nadie la apague. Es el seguro de que una
   pantalla pensada para tapar no termine siendo la que rompe todo. */
.carga { animation: carga-rendirse 0s linear 8s forwards; }
@keyframes carga-rendirse { to { opacity: 0; visibility: hidden; } }

/* Al imprimir no existe */
@media print { .carga { display: none !important; } }

/* ==========================================================================
   LA BARRA DE ARRIBA EN EL CELULAR, Y LO QUE QUEDA PEGADO
   ========================================================================== */

/* El logo y el interruptor de tema, juntos. El interruptor iba antes en el
   grupo de la derecha (con el menú de la cuenta) y en el celular la barra
   envolvía en dos renglones: terminaba DEBAJO del logo en vez de al lado. */
.barra-izq { display: flex; align-items: center; gap: var(--e3); min-width: 0; }

/* --- De qué lado va el interruptor de tema --------------------------------
   EN LA COMPUTADORA: a la derecha, con el menú de la cuenta, que es donde
   estuvo siempre. El margen automático se come todo el espacio sobrante y
   empuja al interruptor —y a todo lo que viene después— contra el borde
   derecho.
   EN EL CELULAR (más abajo): se le saca ese margen y queda pegado al logo, y
   el margen automático pasa al grupo de la cuenta. Así la barra entra en UN
   renglón de 51 px en vez de envolver en dos de 85. */
.tema-sw { margin-left: auto; }

@media (max-width: 900px) {
  /* ⚠️ `nowrap`: la barra va en UN renglón. Con `wrap` medía 85 px de alto en
     un iPhone —logo arriba, interruptor y nombre abajo— y encima empujaba
     todo. Lo que se achica es el nombre del usuario, no la barra. */
  .barra { flex-wrap: nowrap; row-gap: 0; }
  /* ⚠️ El logo y el interruptor NO se achican; el que cede es el nombre, que es
     texto y se puede cortar. Sin esto, flex le sacaba ancho al grupo de la
     izquierda y el interruptor se salía 36 px por afuera, quedando debajo del
     nombre del usuario. */
  .barra-izq { flex: 0 0 auto; }
  /* Acá el interruptor se pega al logo y el margen automático pasa al grupo de
     la cuenta, que es el que ahora se va contra el borde derecho. */
  .tema-sw { margin-left: 0; flex: 0 0 auto; }
  .barra-info { flex: 0 1 auto; flex-wrap: nowrap; min-width: 0; margin-left: auto; }
  /* El nombre se corta con puntos suspensivos en vez de empujar el resto.
     ⚠️ El `min-width: 0` hace falta en TODA la cadena, no sólo en el botón. Un
     elemento de flex trae `min-width: auto`, que quiere decir "no me achico por
     debajo de mi contenido": con ponerlo en el botón y no en `.usuario-menu`,
     el menú seguía sin achicarse y se salía 33 px hacia la izquierda, montado
     encima del interruptor de tema. Medido. */
  .usuario-menu { min-width: 0; max-width: 100%; }
  /* El botón del usuario es un BLOQUE dentro de `.usuario-menu`, no un hijo de
     flex: `min-width: 0` no alcanza para que se achique, hace falta decirle que
     no puede pasarse de su caja. Sin esto el botón medía 204 px dentro de un
     hueco de 135 y el nombre se iba fuera de la pantalla. */
  .barra-usuario { min-width: 0; max-width: 100%; }
  .barra-usuario > span:not(.usuario-inicial) {
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0;
  }

  /* --- LO PEGAJOSO SE ESCONDE AL BAJAR Y VUELVE AL SUBIR ------------------
     En el celular la pantalla es corta: dejar la barra de acciones MÁS las
     solapas clavadas arriba se come casi 90 px de forma permanente, o sea un
     noveno del alto útil, mientras leés.
     Se resuelve como en cualquier app: bajando desaparecen, y apenas empezás a
     subir vuelven las dos juntas. Nunca hay que volver hasta el principio.
     La clase la pone y la saca `app.js` (ver `vigilarScrollCabecera`). */
  .pegajoso {
    transition: transform .22s ease;
    /* El fondo es imprescindible: al deslizarse por encima del contenido, sin
       fondo se leerían las dos cosas superpuestas. */
    background: var(--chapa-bg2);
  }
  body.bajando .pegajoso { transform: translateY(-100%); }

  /* A quien le molesta el movimiento, no se mueve nada: se queda siempre a la
     vista, que es el comportamiento seguro. */
  @media (prefers-reduced-motion: reduce) {
    .pegajoso { transition: none; }
    body.bajando .pegajoso { transform: none; }
  }
}

/* ==========================================================================
   EL PERFIL A PANTALLA COMPLETA
   ==========================================================================
   Toda la ventana, en la computadora y en el celular, con el teléfono vertical
   u horizontal. Se abre y se cierra SÓLO con los botones: girar el teléfono no
   hace nada por su cuenta.

   ⚠️ z-index 4000: por encima del menú lateral (3500) y del velo de
   "calculando" (3000), pero por debajo de la pantalla de ingreso (9000) y de la
   de carga (99999), que sí tienen que tapar esto.
   ========================================================================== */
.perfil-grande {
  position: fixed; inset: 0; z-index: 4000;
  display: flex; flex-direction: column;
  background: var(--negro);
}
.perfil-grande.oculto { display: none; }

.pg-barra {
  display: flex; align-items: center; gap: var(--e3);
  padding: var(--e2) var(--e3);
  background: var(--chapa-bg); border-bottom: 1px solid var(--chapa-borde);
  color: var(--chapa-txt); flex: 0 0 auto;
}
.pg-tit { font-size: var(--t-titulo); }
/* La ayuda cede el lugar primero: en un teléfono angosto sobra antes que los
   botones, que son los que hacen falta para salir. */
.pg-ayuda {
  flex: 1 1 auto; min-width: 0;
  font-size: var(--t-mini); color: var(--chapa-muted);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.pg-cerrar {
  flex: 0 0 auto;
  display: inline-flex; align-items: center; justify-content: center;
  width: 34px; height: 34px; padding: 0;
  background: none; border: 1px solid var(--chapa-borde); border-radius: var(--radio-btn);
  color: var(--chapa-txt); cursor: pointer;
}
.pg-cerrar:hover { border-color: var(--naranja); color: var(--naranja-cl); }
.pg-cerrar .ico { width: 17px; height: 17px; }

/* El cuerpo le da al perfil todo el alto que sobra. `min-height: 0` es
   imprescindible: sin él un hijo de flex no se achica y el gráfico desborda. */
.pg-cuerpo {
  flex: 1 1 auto; min-height: 0;
  display: flex; padding: var(--e3);
}
.pg-cuerpo .perfil-wrap { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; }
.pg-cuerpo .perfil-zona { flex: 1 1 auto; min-height: 0; }
.pg-cuerpo .perfil-caja { min-height: 0; }
/* ⚠️ Acá el SVG se estira a lo ALTO, que es justo lo contrario de lo que hace
   dentro de la tarjeta (ahí manda el ancho y el alto sale del dibujo). Sin
   esto, el perfil se veía como una banda finita arriba de una pantalla vacía. */
.pg-cuerpo .perfil-svg { width: 100%; height: 100%; }

/* En un teléfono en vertical, la barra de arriba se aprieta */
@media (max-width: 560px) {
  .pg-ayuda { display: none; }
  .pg-tit { font-size: var(--t-base); }
}
/* Y en un teléfono ACOSTADO, más todavía: la pantalla mide 390 px de alto y una
   barra de 61 se lleva un sexto. Justo en la posición donde el gráfico más se
   aprovecha. Medido: así el perfil pasa del 78 % al 87 % del alto. */
@media (max-height: 460px) {
  .pg-barra { padding: 3px var(--e3); }
  .pg-ayuda { display: none; }
  .pg-tit { font-size: var(--t-chico); }
  .pg-cerrar { width: 30px; height: 30px; }
  .pg-cuerpo { padding: var(--e2); }
}

/* Al imprimir no existe: la hoja lleva su propio perfil. */
@media print { .perfil-grande { display: none !important; } }

/* Los dos botones del perfil, en la tarjeta */
.perfil-botones { display: flex; flex-wrap: wrap; gap: var(--e2); margin-top: var(--e3); }

/* ==========================================================================
   LOS TEXTOS QUE ENSEÑAN A USAR LA APP
   ==========================================================================
   Tienen color e ícono propios para que se reconozcan de un vistazo y no se
   confundan con un aviso.

   ⚠️ EL COLOR NO PODÍA SER CUALQUIERA. En esta app cada color ya significa
   algo: el naranja es la marca, el ámbar y el rojo son avisos y peligros, el
   verde es "está bien" y el celeste son los alternativos. Un tip de uso no es
   nada de eso —no corre riesgo quien no lo lee— así que se le da el violeta,
   que estaba libre. Que NO sea ámbar es lo importante: un consejo de uso
   pintado de color aviso le roba atención a los avisos de verdad.
   ========================================================================== */
:root, :root[data-theme="dark"] {
  --tip:    #a78bfa;              /* 7,4:1 sobre el fondo oscuro */
  --tip-db: rgba(167, 139, 250, .10);
  --tip-bd: rgba(167, 139, 250, .38);
}
:root[data-theme="light"] {
  --tip:    #6d28d9;              /* 7,6:1 sobre blanco */
  --tip-db: rgba(109, 40, 217, .08);
  --tip-bd: rgba(109, 40, 217, .30);
}

.ayuda-uso {
  background: var(--tip-db);
  border-color: var(--tip-bd);
  border-left: 3px solid var(--tip);
}
.ayuda-uso-ico {
  flex: 0 0 auto; width: 18px; height: 18px; margin-top: 1px;
  color: var(--tip);
}
.ayuda-uso-txt strong { color: var(--tip); }
.ayuda-uso-ok { border-color: var(--tip-bd); color: var(--tip); }
.ayuda-uso-ok:hover { border-color: var(--tip); color: var(--tip); background: var(--tip-db); }

/* En el celular el ícono se queda arriba a la izquierda del texto, no se va a
   una fila propia: ocuparía un renglón entero para un dibujo de 18 px. */
@media (max-width: 640px) {
  .ayuda-uso { flex-direction: row; flex-wrap: wrap; }
  .ayuda-uso-ok { margin-left: auto; }
}

/* ==========================================================================
   MI PERFIL
   ==========================================================================
   Lo que el piloto elige contar de sí mismo. Es la base de la parte social que
   viene después, así que la cabecera está pensada para que un día se pueda
   mostrar tal cual a otra persona: foto, nombre, base y números.
   ========================================================================== */

/* Utilidades chicas que no existían todavía */
.btn-enlace {
  background: none; border: 0; padding: 0; margin-top: var(--e2);
  color: var(--naranja-cl); font: inherit; font-size: var(--t-chico);
  cursor: pointer; text-decoration: underline;
}
.btn-enlace:hover { color: var(--texto); }
/* Se lee con lector de pantalla pero no ocupa lugar en la pantalla */
.visualmente-oculto {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

.perfil-cab { display: flex; flex-direction: column; gap: var(--e5); }

.perfil-identidad { display: flex; align-items: center; gap: var(--e4); }

/* --- La foto ------------------------------------------------------------- */
.perfil-foto-zona { position: relative; flex: 0 0 auto; }
.perfil-foto {
  display: block; width: 84px; height: 84px; border-radius: 50%;
  object-fit: cover;
  background: var(--panel-alt); border: 2px solid var(--borde);
}
/* Mientras no hay foto, la inicial. No un ícono genérico de persona: la
   inicial dice de quién es la cuenta. */
.perfil-foto-vacia {
  display: flex; align-items: center; justify-content: center;
  font-size: 34px; font-weight: 800; color: var(--naranja-cl);
  background: var(--naranja-db); border-color: var(--naranja);
}
/* La camarita, abajo a la derecha de la foto. Es un <label> que dispara el
   selector de archivos escondido: así no hace falta un botón aparte. */
.perfil-foto-btn {
  position: absolute; right: -2px; bottom: -2px;
  display: flex; align-items: center; justify-content: center;
  width: 30px; height: 30px; border-radius: 50%;
  background: var(--panel); border: 1px solid var(--borde);
  color: var(--muted); cursor: pointer;
}
.perfil-foto-btn:hover { border-color: var(--naranja); color: var(--naranja-cl); }
.perfil-foto-btn .ico { width: 15px; height: 15px; }

.perfil-datos { min-width: 0; }
.perfil-nombre {
  margin: 0; font-size: clamp(19px, 2.4vw, 24px); color: var(--texto);
  overflow-wrap: anywhere;
}
.perfil-correo {
  margin: 2px 0 0; font-size: var(--t-chico); color: var(--muted);
  overflow-wrap: anywhere;
}

/* --- Los números --------------------------------------------------------- */
/* No se cargan a mano: salen de lo que la persona ya hizo en la app, así que
   no se pueden inflar. Por eso van en la cabecera y no en un formulario. */
.perfil-numeros {
  display: grid; gap: var(--e2);
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
}
.perfil-num {
  display: flex; flex-direction: column; gap: 2px;
  padding: var(--e3) var(--e4);
  background: var(--panel-alt); border: 1px solid var(--borde);
  border-radius: var(--radio);
}
.perfil-num strong { font-size: var(--t-valor); color: var(--texto); }
.perfil-num span { font-size: var(--t-mini); color: var(--muted); }
.perfil-num-ancho strong { font-size: var(--t-base); }

/* --- Licencias ----------------------------------------------------------- */
/* Cada licencia es una fila: tipo, número, vencimiento y el botón de quitar.
   En pantalla ancha van los tres campos en línea; en el celular, apilados. */
.perfil-lic {
  display: grid; gap: var(--e2);
  grid-template-columns: 1fr;
  align-items: end;
  padding: var(--e3); margin-bottom: var(--e2);
  background: var(--panel-alt); border: 1px solid var(--borde);
  border-radius: var(--radio);
}
@media (min-width: 720px) {
  .perfil-lic { grid-template-columns: minmax(0, 2fr) minmax(0, 1fr) 150px 34px; }
}
.perfil-lic-borrar {
  display: flex; align-items: center; justify-content: center;
  width: 34px; height: 34px; padding: 0;
  background: none; border: 1px solid var(--borde); border-radius: var(--radio-btn);
  color: var(--muted); cursor: pointer;
}
.perfil-lic-borrar:hover { border-color: var(--peligro); color: var(--peligro); }
.perfil-lic-borrar .ico { width: 15px; height: 15px; }
/* En el celular el botón de quitar va a lo ancho: un cuadradito de 34 px
   perdido al final de una pila de campos no se encuentra. Y sube a 44 px de
   alto, que es el mínimo para tocar cómodo con el dedo. */
@media (max-width: 719px) {
  .perfil-lic-borrar { width: 100%; height: 44px; gap: 8px; }
  .perfil-lic-borrar::after { content: 'Quitar'; font-size: var(--t-chico); }
}

/* --- El pie de guardar --------------------------------------------------- */
/* Queda pegado abajo: con varias licencias cargadas, el botón de guardar se iba
   fuera de la pantalla y había que scrollear para encontrarlo. */
.perfil-pie {
  position: sticky; bottom: 0; z-index: 5;
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--e3); flex-wrap: wrap;
  padding: var(--e3) var(--e4);
  background: var(--panel); border: 1px solid var(--borde);
  border-radius: var(--radio);
  box-shadow: 0 -6px 18px var(--sombra);
}
@media (max-width: 560px) {
  .perfil-identidad { gap: var(--e3); }
  .perfil-foto { width: 68px; height: 68px; }
  .perfil-foto-vacia { font-size: 27px; }
  /* El botón a lo ancho: es la acción principal de la pantalla */
  .perfil-pie { flex-direction: column; align-items: stretch; }
  .perfil-pie .btn { width: 100%; justify-content: center; }
}

/* Al imprimir no va: el perfil no es parte de la hoja de vuelo */
@media print { #vista-perfil { display: none !important; } }

/* Sin sesion, el menu lateral de la app no va: la landing es una pagina
   publica y ese rail es mobiliario interno. Lo prende erInicio(). */
body.sin-sesion .lateral { display: none; }

/* Por qué se eligió esa pista. Va debajo de las condiciones, en chico: es una
   explicación, no un dato de performance. */
.dist-motivo { color: var(--muted); font-style: italic; }

/* ===========================================================================
   BLANCOS DE TOQUE EN CELULAR
   ===========================================================================
   La WCAG 2.5.8 pide 24x24 px como mínimo para cualquier cosa que se toque.
   Medido en un iPhone de 375 px, 87 controles del plan quedaban por debajo:
   los 68 triangulitos de "ver fuente" (303x15), las casillas del mapa (99x17),
   los botones de unidad (40x20) y los enlaces sueltos (95x14).

   Se agranda con PADDING y no con `height`, para no correr la maqueta: el
   texto queda donde estaba y lo que crece es la zona sensible.

   `pointer: coarse` agarra también las tablets y los celulares apaisados, que
   por ancho no entrarían en el `max-width`. */
@media (pointer: coarse), (max-width: 720px) {
  summary { min-height: 26px; padding-top: 5px; padding-bottom: 5px; }
  .chk { min-height: 30px; padding: 4px 0; }
  .chk input[type="checkbox"] { width: 20px; height: 20px; }
  .chk input[type="checkbox"]::after { width: 12px; height: 12px; }
  .wb-u, .chip-ruta, .ayuda-uso-ok { min-height: 30px; padding-top: 6px; padding-bottom: 6px; }
  /* Los enlaces sueltos dentro de un párrafo no se pueden agrandar sin romper
     el renglón, así que se les da aire alrededor con el área de toque. */
  .ayuda a, .marca-fuente-txt a, p a { padding: 6px 2px; margin: -6px -2px; }
}



/* ===========================================================================
   NOTAM AGRUPADOS POR EFECTO
   ===========================================================================
   La otra manera de mirar los mismos avisos: juntos los que le hacen lo mismo
   al vuelo, sin importar de qué aeródromo vengan. */
.notam-vistas { display: flex; justify-content: flex-end; margin: 0 0 10px; }
.notam-familia { margin: 0 0 16px; }
.notam-familia > h4 {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin: 0 0 7px; padding-bottom: 5px; font-size: 13px;
  border-bottom: 1px solid var(--borde);
}
.notam-familia > h4 .nom { font-weight: 400; font-size: 11px; color: var(--muted); }
/* Cada aviso lleva SU aeródromo al lado: agrupando por efecto se pierde la
   columna del aeródromo, y sin eso no se sabe dónde está el problema. */
.notam-en-familia { position: relative; padding-left: 0; margin-bottom: 6px; }
.notam-donde {
  display: inline-block; font-weight: 800; font-size: 11px; letter-spacing: .5px;
  background: var(--panel-alt); border: 1px solid var(--borde);
  border-radius: 5px; padding: 1px 7px; margin-bottom: 3px;
}
/* Los que no rigen durante el vuelo o caen lejos van marcados, no escondidos. */
.notam-bandeja {
  font-size: 10.5px; color: var(--muted); font-style: italic; margin-left: 6px;
}

/* Lo que la ficha del aeródromo todavía está buscando. Va abajo de lo que ya
   se pudo pintar con lo que hay en memoria, y tiene que verse claramente como
   "falta esto": la ficha a medias nunca puede confundirse con la completa. */
.fad-parcial {
  display: flex; align-items: center; gap: 9px;
  margin: 14px 0 0; padding: 10px 12px; border-radius: 7px;
  background: var(--panel-alt); border: 1px dashed var(--borde);
  font-size: 12px; color: var(--muted);
}
.fad-parcial-rueda {
  width: 14px; height: 14px; flex-shrink: 0; border-radius: 50%;
  border: 2px solid var(--borde); border-top-color: var(--naranja);
  animation: girar 800ms linear infinite;
}

/* La ficha FIJA del espacio aéreo que se tocó en el mapa. Usa la caja de
   `.ficha-espacio` (posición absoluta arriba a la derecha del mapa), que es
   justo lo que hace falta: queda quieta y se cierra con la ✕.
   ⚠️ `pointer-events: auto` explícito: la del gráfico vertical los desactiva
   mientras no está fijada, y esta SIEMPRE lo está. */
.ficha-espacio.ficha-mapa { pointer-events: auto; z-index: 1200; }
.ficha-mapa .ficha-mas {
  margin: 8px 0 0; padding-top: 8px; border-top: 1px solid var(--borde);
  font-size: 11px; color: var(--muted); line-height: 1.45;
}

/* ===========================================================================
   EL METAR CRUDO, ARRIBA DE CADA TARJETA
   ===========================================================================
   El texto original del parte, adentro de la tarjeta del aeródromo del que
   habla. Es lo primero que mira el que sabe leerlo, y es lo que se cruza contra
   lo que dan por radio. Va en blanco y algo más grande que el resto: no es una
   nota al pie, es el dato. */
.crudo-cab {
  margin: 0 0 10px; padding: 8px 10px; border-radius: 7px;
  background: var(--panel-alt); border: 1px solid var(--borde);
  display: flex; flex-direction: column; gap: 4px; min-width: 0;
}
/* ⚠️ `overflow-wrap: anywhere`: un TAF es una sola tira larguísima sin espacios
   cómodos y, sin esto, estira la tarjeta y aparece el scroll horizontal. */
.crudo-cab code {
  font-size: 12px; line-height: 1.5; color: var(--texto);
  background: none; padding: 0; overflow-wrap: anywhere;
}
.crudo-taf { color: var(--muted) !important; font-size: 11.5px !important; }
.crudo-sin { font-size: 11px; color: var(--muted); font-style: italic; }

/* Acá vivía el CSS de la tira de semáforo. Se fue con la tira: decía lo mismo
   que la franja de avisos de arriba y ponía en verde lo que estaba bien, así
   que estaba siempre encendida. Ver el comentario largo de armarAvisos. */

/* ===========================================================================
   TABLAS QUE SE ACHICAN EN VEZ DE SCROLLEAR
   ===========================================================================
   La de tramos y la de distancias de despegue tienen muchas columnas. En un
   celular se salían y había que arrastrar de costado para leer una fila, que
   es justo lo que no se puede hacer con el avión andando.

   ⚠️ ANTES SE ACHICABAN CON `clamp()` EN VEZ DE SCROLLEAR, y era peor. La
   letra bajaba hasta 9 px y las celdas se cortaban con puntitos: una tabla que
   no se puede leer no es mejor que una que se arrastra de costado, es PEOR,
   porque parece que estuviera completa. Y eso pasaba también en una pantalla
   grande, apenas la ventana se angostaba un poco o la columna del mapa se
   llevaba la mitad del ancho.

   Ahora, en cualquier ancho: letra normal, cada columna pide lo que necesita
   (`table-layout: auto`), nada se corta, y el contenedor scrollea si hace
   falta. En una pantalla ancha no se nota, porque entra todo. */
.tabla-scroll, .dist-pista-caja {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: thin;   /* que se vea que hay más a la derecha */
}
.tabla-scroll table, .tabla-dist {
  font-size: 11.5px;
  table-layout: auto;
  width: auto;
  min-width: 100%;
}
.tabla-scroll table th, .tabla-scroll table td,
.tabla-dist th, .tabla-dist td {
  padding-left: 7px; padding-right: 7px;
  overflow: visible; text-overflow: clip;
  /* Ni los datos ni el encabezado se parten: sobre una tabla que ya scrollea,
     partir en dos renglones sólo hace la fila más alta sin ganar nada. */
  white-space: nowrap;
}

/* ===========================================================================
   EL SEGUNDO ALTERNATIVO, PLEGADO
   ===========================================================================
   Casi ningún vuelo lleva dos alternativos. Tenerlo siempre abierto —en el
   formulario y otra vez en el plan— hacía que media pantalla hablara de un
   aeródromo que nadie había pedido. Se pliega, pero NO se esconde: el que lo
   usa lo encuentra donde estaba. */
.alt2 { margin-top: 10px; border-top: 1px solid var(--borde); padding-top: 10px; }
.alt2 > summary {
  cursor: pointer; font-size: 12px; color: var(--muted); list-style: revert;
}
.alt2 > summary small { color: var(--muted); opacity: .8; margin-left: 4px; }
.alt2 > summary:hover { color: var(--texto); }
.alt2 > .grid-form { margin-top: 10px; }

.alt2-item { margin-top: 10px; }
.alt2-item > summary {
  cursor: pointer; font-size: 12px; color: var(--muted); list-style: revert;
  padding: 6px 0;
}
.alt2-item > summary:hover { color: var(--texto); }

/* ===========================================================================
   CUADRADO DESPLEGABLE (el del combustible mínimo legal)
   ===========================================================================
   En reposo se ve y se mide EXACTAMENTE igual que los demás cuadraditos de
   Performance; al abrirlo ocupa la fila entera para que la tabla legal entre
   sin apretarse. Es un `<details>` de verdad: se abre con el teclado, se
   imprime abierto si estaba abierto, y Ctrl+F encuentra lo de adentro. */
/* ⚠️ `display: block` Y EL SELECTOR LARGO, LOS DOS A PROPÓSITO.
   `.dato` trae `display: flex`, y un `<details>` en flex DEJA DE PLEGARSE:
   Chrome esconde lo cerrado con una regla propia que el flex desarma, así que
   la tabla entera se veía con el cuadrado cerrado. Y el padding lo pone
   `.grid-datos.compacto .dato`, que le gana a una clase sola: por eso el
   selector va con `.grid-datos` adelante. */
.grid-datos .dato.dato-desplegable { display: block; padding: 0; }
.dato-desplegable > summary {
  display: flex; align-items: center; gap: 9px;
  padding: 8px 10px; cursor: pointer; list-style: none;
}
.fuel-cuadro > summary .badge-legal { line-height: 1; }
.dato-desplegable > summary::-webkit-details-marker { display: none; }
/* La flechita, dibujada a mano: `list-style: revert` la mete adentro del flex
   y descoloca el icono. */
.dato-desplegable > summary::after {
  content: ''; flex: 0 0 auto; margin-left: auto;
  width: 6px; height: 6px; border-right: 1.5px solid var(--muted);
  border-bottom: 1.5px solid var(--muted); transform: rotate(45deg);
  transition: transform .15s ease; position: relative; top: -2px;
}
.dato-desplegable[open] > summary::after { transform: rotate(-135deg); top: 1px; }
.dato-desplegable > summary:hover { background: var(--panel); }
.dato-desplegable .dato-cuerpo { min-width: 0; }
/* Abierto ocupa el ancho completo de la grilla: la tabla del mínimo legal es
   la que decide si el vuelo sale, y en un tercio de fila no se lee. */
.grid-datos .dato-desplegable[open] { grid-column: 1 / -1; }
.dato-desplegable > .fuel-caja {
  width: 100%; max-width: none; min-width: 0;
  border: 0; border-top: 1px solid var(--borde); border-radius: 0;
  margin: 0;
}
/* El ✓/✕ va PEGADO AL NÚMERO, no al costado: en el costado el flex le comía
   ancho a la etiqueta y la partía en dos renglones. */
.fuel-cuadro > summary .badge-legal {
  font-size: 10px; padding: 1px 4px; vertical-align: 2px; margin-left: 3px;
}
.fuel-cuadro.ok { border-left: 3px solid var(--ok); }
.fuel-cuadro.no { border-left: 3px solid var(--peligro); }

/* ===========================================================================
   EL TERRENO NO SE NEGOCIA
   ===========================================================================
   Dos carteles. El primero es el más fuerte de toda la app y tiene que serlo:
   dice que el vuelo, tal como está cargado, no se puede volar con ese avión.
   No usa sólo color —en la hoja impresa en blanco y negro no se distingue— :
   lleva ícono, borde grueso y los tres números que lo demuestran. */
.terreno-stop {
  margin: 12px 0 0; padding: 12px 14px;
  border: 1px solid var(--peligro); border-left: 4px solid var(--peligro);
  border-radius: 10px; background: var(--peligro-db);
}
.terreno-stop-cab {
  display: flex; align-items: center; gap: 8px; color: var(--badge-no);
  font-size: 14.5px; margin-bottom: 6px;
}
.terreno-stop-cab .ico { width: 18px; height: 18px; flex: 0 0 auto; }
.terreno-stop p { margin: 0 0 6px; font-size: 12.5px; color: var(--texto); }
/* Los números, en columnas que se acomodan solas. Nada de tabla: son tres
   datos sueltos, no una tabla de nada. */
.terreno-stop-nums {
  display: flex; flex-wrap: wrap; gap: 6px 18px; margin: 8px 0;
  font-size: 12px; color: var(--muted);
}
.terreno-stop-nums b { color: var(--texto); font-size: 13.5px; }
.terreno-stop-que { color: var(--muted) !important; font-size: 12px !important; }

/* El segundo: RUMBO cambió de ruta solo para librar el terreno. Es informativo,
   no una alarma, pero no puede pasar desapercibido: un plan que da otra vuelta
   sin decir por qué se lee como un error de la app. */
.terreno-desvio {
  display: flex; align-items: flex-start; gap: 8px;
  margin: 12px 0 0; padding: 9px 12px;
  border: 1px solid var(--borde); border-left: 3px solid var(--alerta);
  border-radius: 8px; background: var(--panel-alt);
  font-size: 12px; color: var(--muted);
}
.terreno-desvio .ico { width: 15px; height: 15px; flex: 0 0 auto; margin-top: 1px; }
.terreno-desvio b { color: var(--texto); }

/* ===========================================================================
   LAS TRES FASES DEL VUELO
   ===========================================================================
   Una TIRA, con el mismo idioma que la de Performance: rótulo chiquito en
   mayúscula arriba, el número grande abajo, el contexto en gris. Sin cajas: una
   línea fina entre fase y fase y nada más.

   Las tres están A LA VISTA AL MISMO TIEMPO, que es lo que un desplegable no
   puede dar: para comparar el consumo del ascenso con el del crucero antes
   había que abrir uno, acordarse, y abrir el otro. El detalle completo —los
   datos del POH, las altitudes, la nota del VNAV— se abre desde cada fase, y
   se abre DEBAJO de la tira, a todo el ancho: en un tercio de fila no entra. */
/* Las celdas Y los detalles, en el mismo contenedor: es lo que permite
   intercalarlos en el celular con `order`. Ver el comentario de `menuFases`. */
.fases-tira {
  display: flex; flex-wrap: wrap; align-items: stretch;
  margin-top: 14px;
}
.fase-celda { order: var(--ord-esc, 1); }
/* En escritorio TODOS los detalles van al final y ocupan la fila entera: como
   sólo uno se ve por vez, no hace falta que cada uno sepa dónde va. */
.fase-det { order: 9; flex: 0 0 100%; }
.fase-celda {
  flex: 1 1 150px; min-width: 0;
  padding: 4px 12px; border-left: 1px solid var(--borde);
  display: flex; flex-direction: column; gap: 1px;
}
.fase-celda:first-child { border-left: 0; padding-left: 2px; }
.fase-rot {
  display: flex; align-items: center; gap: 6px; min-width: 0;
  font-size: 9px; font-weight: 700; letter-spacing: .09em;
  text-transform: uppercase; color: var(--muted);
}
.fase-rot svg { flex: 0 0 auto; display: block; }
.fase-nom { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fase-val {
  font-size: 14px; font-weight: 700; color: var(--texto); line-height: 1.2;
  font-variant-numeric: tabular-nums;
}
.fase-sub {
  font-size: 10.5px; color: var(--muted); line-height: 1.35;
  font-variant-numeric: tabular-nums;
}
/* El botón que abre el detalle de ESA fase. Chiquito y alineado a la izquierda,
   como el "¿Cómo se calcula?" del mínimo legal: es el mismo gesto. */
.fase-mas {
  align-self: flex-start; margin-top: 3px;
  border: 1px solid var(--borde); border-radius: 5px; background: transparent;
  color: var(--naranja-cl); cursor: pointer; font-family: inherit;
  font-size: 10.5px; font-weight: 700; padding: 1px 7px;
}
.fase-mas::after {
  content: ''; display: inline-block; width: 4px; height: 4px; margin-left: 5px;
  border-right: 1.3px solid currentColor; border-bottom: 1.3px solid currentColor;
  transform: rotate(45deg) translateY(-1px);
}
.fase-mas[aria-expanded="true"]::after { transform: rotate(-135deg) translateY(1px); }
.fase-mas:hover, .fase-mas.act { border-color: var(--naranja); }
.fase-det { margin-top: 10px; }
.fase-det.oculto { display: none; }
/* Adentro del desplegable la tarjeta ya no necesita su propio marco: el marco
   es la tira. */
.fase-det > .fase { border: 0; background: transparent; padding: 0; margin: 0; }

/* En papel se abren TODOS los detalles (la hoja no tiene nada que tocar) y los
   botones se esconden. */
.hoja-papel .fase-mas { display: none !important; }
.hoja-papel .fase-det, .hoja-papel .fase-det.oculto { display: block !important; }

/* En celular cada fase pasa a fila entera: tres columnas darían 110 px y
   "−588 fpm · 3° · GS 111 kt" no entra en ninguna letra legible. */
@media (max-width: 620px) {
  .fases-tira { flex-direction: column; }
  .fase-celda { border-left: 0; padding-left: 2px; }
  /* ⚠️ CADA DETALLE, DETRÁS DE SU FASE. Apiladas, "abajo de todo" es abajo del
     descenso: tocabas el ascenso y el detalle aparecía tres bloques más abajo.
     Con el orden del celular quedan celda, detalle, celda, detalle. */
  .fase-celda { order: var(--ord-cel, 1); }
  .fase-det { order: var(--ord-cel, 9); }
  /* La raya de separación ya no puede ser `+ .fase-celda`: entre dos celdas
     puede haber un detalle abierto. La lleva cada celda salvo la primera. */
  .fase-celda { border-top: 1px solid var(--borde); }
  .fase-celda[style*="--ord-cel:1"] { border-top: 0; }
}
/* ===========================================================================
   CADA ALTERNATIVO, UN DESPLEGABLE
   ===========================================================================
   El primero abierto (es el que se usa si hay que desviarse), el segundo
   plegado (casi ningún vuelo lleva dos). */
.alt-des { border-top: 1px solid var(--borde); margin-top: 12px; padding-top: 4px; }
.alt-des:first-of-type { border-top: 0; margin-top: 0; }
.alt-des > summary {
  cursor: pointer; list-style: revert; padding: 8px 0;
  font-size: 12.5px; font-weight: 700; color: var(--texto);
}
.alt-des > summary small { font-weight: 400; color: var(--muted); margin-left: 4px; }
.alt-des > summary:hover { color: var(--naranja-cl); }

/* ===========================================================================
   LOS LÍMITES VERTICALES DE UN ESPACIO AÉREO
   ===========================================================================
   Como en una carta: el techo arriba, el piso abajo y una raya entre los dos.
   Es la forma en la que están impresos en el AIP y en cualquier carta VFR, así
   que se lee sin traducir. Antes iban en un renglón aparte como "GND→FL145",
   que hay que leer al revés de como uno lo tiene aprendido. */
.ficha-lim {
  display: inline-flex; flex-direction: column; align-items: center;
  margin-left: auto; padding-left: 10px; flex: 0 0 auto;
  font-size: 10.5px; font-weight: 700; line-height: 1.25;
  color: var(--texto); font-variant-numeric: tabular-nums;
}
.ficha-lim .lim-sup { padding-bottom: 1px; }
/* La raya del medio: el separador de la carta. Va del ancho del texto más
   ancho de los dos, que es lo que hace que se lea como una fracción. */
.ficha-lim .lim-inf { border-top: 1px solid currentColor; padding-top: 1px; align-self: stretch; text-align: center; }

/* ===========================================================================
   LA TIRA DE PERFORMANCE
   ===========================================================================
   Los ocho cuadrados de antes eran ocho cajas con borde y fondo, y la fila se
   leía como ocho botones. Los números del vuelo no son botones: son una
   lectura. Van sin caja, separados por una línea fina, con el rótulo chiquito
   arriba y el número grande abajo — como cualquier hoja de despacho.

   Son DOS tiras apoyadas una sobre la otra, SIN título: arriba lo que se
   vuela, abajo el combustible. Se distinguen solas por lo que dicen, y un
   título encima de cada una serían dos renglones de texto para separar ocho
   números. */
.perf-tira {
  display: flex; flex-wrap: wrap; align-items: stretch;
}
/* Entre una tira y la otra, AIRE y no una raya: la raya las encajonaba y les
   devolvía el aspecto de caja que se había sacado a propósito. */
.perf-tira + .perf-tira { margin-top: 4px; }
.perf-celda {
  flex: 1 1 130px; min-width: 0;
  padding: 4px 12px;
  border-left: 1px solid var(--borde);
  display: flex; flex-direction: column; gap: 1px;
}
/* La primera de cada tira no lleva raya a la izquierda y va pegada al margen:
   así la columna de rótulos arranca alineada con el resto del panel. */
.perf-celda:first-child { border-left: 0; padding-left: 2px; }
.perf-rot {
  display: flex; align-items: center; gap: 5px; min-width: 0;
  font-size: 9px; font-weight: 700; letter-spacing: .09em;
  text-transform: uppercase; color: var(--muted);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.perf-rot svg { width: 11px; height: 11px; flex: 0 0 auto; }
.perf-val {
  font-size: 14px; font-weight: 700; color: var(--texto); line-height: 1.2;
  font-variant-numeric: tabular-nums;
}
.perf-val small { font-size: 10.5px; font-weight: 500; color: var(--muted); }
.perf-sub {
  font-size: 10.5px; color: var(--muted); line-height: 1.35;
  font-variant-numeric: tabular-nums;
}
.perf-ok  { color: var(--ok); }
.perf-mal { color: var(--peligro); }
/* El botón para adoptar el nivel óptimo. Vive en el renglón chico de la celda
   del nivel: el número y la acción, juntos. */
.perf-usar {
  border: 1px solid var(--borde); border-radius: 5px; background: transparent;
  color: var(--naranja-cl); cursor: pointer; font-family: inherit;
  font-size: 10.5px; font-weight: 700; padding: 1px 6px; margin-left: 3px;
}
.perf-usar:hover { border-color: var(--naranja); }

/* La tabla del mínimo legal. El botón que la abre está en el renglón chico de
   la celda "Mínimo legal" —que es donde uno pregunta de dónde sale ese
   número— pero la tabla se despliega ACÁ, debajo de las dos tiras y a todo el
   ancho: en un cuarto de fila no entra. */
.perf-legal { margin-top: 10px; }
.perf-legal.oculto { display: none; }
.perf-legal > .fuel-caja { width: 100%; max-width: none; }
/* La flechita del botón, para que se vea que abre algo. */
.perf-usar[data-abre-legal]::after {
  content: ''; display: inline-block; width: 4px; height: 4px; margin-left: 4px;
  border-right: 1.3px solid currentColor; border-bottom: 1.3px solid currentColor;
  transform: rotate(45deg) translateY(-1px);
}
.perf-usar[data-abre-legal].act::after { transform: rotate(-135deg) translateY(1px); }
.perf-usar.act { border-color: var(--naranja); }

/* En papel la tabla va SIEMPRE abierta y el botón se esconde. */
.hoja-papel .perf-legal, .hoja-papel .perf-legal.oculto { display: block !important; }

/* En celular las cuatro celdas entran de a dos: a cuatro por fila quedarían de
   80 px y el rótulo "SALIDA → LLEGADA" no entra en ninguna letra legible. */
@media (max-width: 620px) {
  /* Sólo el ACOMODO: de a dos por fila. El tamaño de la letra y el aire de la
     celda los decide la regla base, la misma que usan la cabecera del plan y
     las fases. Antes esta regla también fijaba `padding: 9px 10px` y
     `font-size: 15.5px`, y como está después en el archivo le ganaba a la
     base: en el celular la tira se quedó con el formato viejo. */
  .perf-celda { flex-basis: calc(50% - 1px); }
  .perf-celda:nth-child(odd) { border-left: 0; padding-left: 2px; }
  .perf-celda:nth-child(n+3) { border-top: 1px solid var(--borde); }
}

/* En papel se abre la tabla legal y se esconde el botón de "usar" el óptimo:
   en una hoja no hay nada que tocar. */
.hoja-papel .perf-usar { display: none !important; }
.hoja-papel [data-abre-legal] { display: none !important; }


/* ===========================================================================
   LA AGUJA DE LA BRÚJULA
   ===========================================================================
   Al pasar el mouse por el logo, la aguja da una vuelta entera y se pasa un
   poco de largo antes de asentarse, como una brújula de verdad buscando el
   norte. Vuelve exactamente a donde estaba: la vuelta es de 360°, así que el
   estado final es el inicial.

   ⚠️ EL GIRO LO PRENDE UNA CLASE, NO `:hover`. Con `:hover` la animación se
   corta en seco si el mouse se va antes de que termine, y la aguja queda
   clavada en cualquier ángulo. Con la clase —que pone `app.js` al entrar y
   saca al terminar— la vuelta siempre se completa.

   El centro de giro es el de la marca: la marca ocupa 230×230 arriba a la
   izquierda de un lienzo de 1218×230, así que su centro cae en (115, 115). */
.logo-aguja {
  transform-box: view-box;
  transform-origin: 115px 115px;
}
.logo-aguja.gira { animation: brujula 720ms cubic-bezier(.28, .84, .3, 1.12); }
@keyframes brujula { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }

/* Para quien pidió menos movimiento: la aguja no gira. El logo sigue andando
   igual, que es lo que importa. */
@media (prefers-reduced-motion: reduce) {
  .logo-aguja.gira { animation: none; }
}

/* ===========================================================================
   LA TABLA DE FRECUENCIAS
   ===========================================================================
   Antes esto eran tarjetas, una por aeródromo y por espacio aéreo. Costaban de
   leer por lo mismo que cuesta leer cualquier pila de tarjetas: para comparar
   dos frecuencias hay que buscarlas en dos cajas distintas y nada queda
   alineado con nada.

   ⚠️ TODOS LOS SELECTORES VAN CON `.tabla-scroll` ADELANTE. Esta tabla vive
   adentro de un `.tabla-scroll`, y ese contenedor define `.tabla-scroll table
   td { padding: … }` con más peso que `.tabla-frec td`. Sin el prefijo, el
   padding y la alineación de acá NO se aplicaban: la primera versión salió con
   todo centrado —porque el `td` global del proyecto centra— y con el padding
   del otro bloque. */
/* ⚠️ ANCHO FIJO Y TEXTO QUE SE PARTE.
   Antes era `table-layout: auto` con todo en `nowrap`, que es lo que hace el
   resto de las tablas del proyecto. En las otras funciona porque sus celdas son
   números cortos; acá no, porque una dependencia se llama "CENTRO DE CONTROL DE
   ÁREA EZEIZA — SECTOR NORTE". Una sola celda larga estiraba su columna hasta
   empujar a las demás, y la tabla salía con dos columnas gordas y dos flacas.

   Con `fixed` los cuatro anchos los decide el encabezado y NO el contenido: la
   celda larga se parte en varios renglones y ninguna columna se mueve. Los
   porcentajes suman 100, así que la tabla entra siempre en la pantalla y no
   hace falta scrollear al costado ni en el celular. */
.tabla-scroll .tabla-frec {
  width: 100%; border-collapse: collapse;
  table-layout: fixed;
  font-variant-numeric: tabular-nums;
}
.tabla-scroll .tabla-frec thead th:nth-child(1) { width: 23%; }
.tabla-scroll .tabla-frec thead th:nth-child(2) { width: 41%; }
.tabla-scroll .tabla-frec thead th:nth-child(3) { width: 14%; }
.tabla-scroll .tabla-frec thead th:nth-child(4) { width: 22%; }

/* El encabezado, igual que el de tramos y el de distancias: fondo, 12,5 px y el
   mismo padding. Antes era una versión chiquita en mayúsculas que no se parecía
   a ninguna otra tabla de la app. */
.tabla-scroll .tabla-frec thead th {
  background: var(--panel-alt);
  font-size: 12.5px; font-weight: var(--peso-etq); letter-spacing: 0;
  text-transform: none;
  color: var(--muted); text-align: left;
  padding: 8px 6px; border-bottom: 1px solid var(--borde);
  white-space: normal;
}
.tabla-scroll .tabla-frec thead th:last-child { text-align: right; }

/* Las filas, con el espaciado de las demás tablas. `normal` en el
   `white-space` es lo que permite que se parta: la regla general de
   `.tabla-scroll table td` lo pone en `nowrap`. */
.tabla-scroll .tabla-frec td,
.tabla-scroll .tabla-frec tbody th {
  padding: 7px 6px;
  vertical-align: top;
  text-align: left;
  line-height: 1.3;
  white-space: normal;
  overflow-wrap: anywhere;
}

/* El aeródromo se escribe UNA vez y la celda se estira sobre sus frecuencias:
   repetirlo en cada fila haría que la columna se lea como si fueran aeródromos
   distintos. Va arriba de todo del grupo, no centrado en el medio: así se lee
   como un encabezado de bloque. */
.tabla-scroll .tabla-frec .tf-grupo {
  font-size: 12px; font-weight: 700; color: var(--texto);
  white-space: normal; overflow-wrap: anywhere;
  vertical-align: top;
}
.tabla-scroll .tabla-frec tbody tr.tf-primera > * { border-top: 1px solid var(--borde); }
.tabla-scroll .tabla-frec tbody tr:first-child > * { border-top: 0; }

/* La dependencia: la sigla y el nombre, uno debajo del otro y los dos pegados
   al margen izquierdo de la columna. */
.tabla-scroll .tabla-frec .tf-dep { min-width: 0; }
.tabla-scroll .tabla-frec .tf-sigla {
  display: block; text-align: left;
  font-size: 12.5px; font-weight: 700; letter-spacing: .04em; color: var(--texto);
}
/* ⚠️ SIN PUNTOS SUSPENSIVOS. Antes se cortaba a 30 caracteres, y el nombre de
   una dependencia es justo el dato que no se puede adivinar por la mitad. */
.tabla-scroll .tabla-frec .tf-nombre {
  display: block; text-align: left;
  font-size: 11px; color: var(--muted); line-height: 1.3;
  white-space: normal; overflow-wrap: anywhere;
  margin-top: 1px;
}
.tabla-scroll .tabla-frec .tf-canal {
  font-size: 11px; font-weight: 700; letter-spacing: .04em; color: var(--muted);
}
/* La frecuencia SÍ se queda en un renglón: partir un número por la mitad es
   la única manera de leer mal una frecuencia. La columna se dimensionó para
   que "128.85" entre entero hasta en un celular angosto. */
.tabla-scroll .tabla-frec .tf-mhz {
  text-align: right; font-size: 13px; font-weight: 700;
  color: var(--naranja-cl); white-space: nowrap; overflow-wrap: normal;
}
.tabla-scroll .tabla-frec .tf-hor {
  display: block; text-align: right;
  font-size: 10.5px; font-weight: 400; color: var(--muted); letter-spacing: 0;
  white-space: normal;
}
.tabla-scroll .tabla-frec .tf-vacio { font-size: 11.5px; color: var(--muted); font-style: italic; }

/* ⚠️ EL AUXILIAR VA EN GRIS, y no es decoración: en una emergencia se llama al
   CPPL, y el AUX sólo si el ATS lo indica. El contraste dice cuál es cuál sin
   tener que leer la columna del canal. */
.tabla-scroll .tabla-frec .tf-aux .tf-sigla,
.tabla-scroll .tabla-frec .tf-aux.tf-canal { color: var(--muted); font-weight: 600; }
.tabla-scroll .tabla-frec .tf-aux.tf-mhz { color: var(--muted); font-weight: 600; }

/* La fila del espacio que se está mirando en el perfil o en el mapa. */
.tabla-scroll .tabla-frec tbody tr.tf-resaltada > * { background: var(--naranja-db); }
.tabla-scroll .tabla-frec tbody tr.tf-resaltada .tf-mhz { color: var(--naranja); }
.tabla-scroll .tabla-frec tbody tr.tf-resaltada > *:first-child {
  box-shadow: inset 3px 0 0 var(--naranja);
}

/* En papel: sin colores de fondo y con la letra en negro, como el resto. */
.hoja-papel .tabla-frec .tf-mhz { color: #000 !important; }
.hoja-papel .tabla-frec tr.tf-resaltada > * { background: none !important; box-shadow: none !important; }


/* La chapita de la ficha cuando lo que se está mirando es un SIGMET. Usa los
   mismos dos colores que la franja del gráfico: rojo si se atraviesa a la
   altitud del vuelo, ámbar si pasa cerca. */
.ficha-clase.sig-cruza { background: #e0264a; color: #fff; }
.ficha-clase.sig-cerca { background: #e08a26; color: #241a00; }


/* El renglón que cuenta los NOTAM que quedaron fuera del horario del vuelo.
   Va en gris y chico a propósito: NO es un aviso, es la constancia de que hubo
   avisos que no aplican. Si se viera como un aviso más, volvería a competir
   con los que sí rigen, que es justo lo que se quiso sacar del medio. */
.notam-fuera {
  margin-top: 6px;
  font-style: italic;
  opacity: .85;
}


/* "sobrevuelo": el espacio se pasa por arriba y NO hay que llamar. Va en gris
   y chiquito, debajo del nombre. No es un aviso —no pasa nada malo por
   sobrevolar un ATZ— es la aclaración de por qué esa frecuencia está en la
   lista si no la vas a usar. */
.tabla-scroll .tabla-frec .tf-sobrevuelo {
  display: block;
  margin-top: 2px;
  font-size: 9.5px; font-weight: 700; letter-spacing: .08em;
  text-transform: uppercase; color: var(--muted);
}


/* La 121.50: el último renglón de la tabla. Se separa con una línea más marcada
   y va en rojo, porque no es una dependencia más de la ruta sino la que se usa
   cuando algo salió mal. Sigue siendo una fila de la tabla —mismo ancho de
   columnas, mismo alineado del número— para que se encuentre donde se buscan
   todas las demás. */
.tabla-scroll .tabla-frec tbody tr.tf-emerg > * {
  border-top: 2px solid var(--borde);
  padding-top: 9px;
}
/* Sin color propio: la 121.50 se lee igual que las demás. Lo único que la
   distingue es la línea de arriba, que la separa del último aeródromo. */

/* En papel el color no siempre sale: ahí lo que la distingue es la negrita. */
.hoja-papel .tabla-frec tr.tf-emerg .tf-grupo,
.hoja-papel .tabla-frec tr.tf-emerg .tf-sigla,
.hoja-papel .tabla-frec tr.tf-emerg .tf-mhz { color: #000 !important; font-weight: 700; }


/* La nota de "esto es un pronóstico, no una observación", al pie de la tarjeta
   de meteo. Va en gris y chica —es una advertencia sobre el dato, no un dato—
   pero con la línea de arriba que la separa de lo que describe. */
.meteo-pie-nota {
  margin-top: 8px; padding-top: 6px;
  border-top: 1px solid var(--borde);
  font-size: 10.5px; color: var(--muted); line-height: 1.35;
}


/* ===========================================================================
   LA SECCIÓN DE RUTA EN EL CELULAR
   =========================================================================== */
@media (max-width: 620px) {
  /* Las sugerencias, a todo el ancho. Tenían 260 px fijos, así que en un
     celular de 375 quedaban con un hueco de 70 px al costado. */
  .ruta-col-sug { width: auto; flex: 1 1 100%; }

  /* Los dos botones, uno al lado del otro y repartiéndose el ancho. */
  .ruta-acciones { flex-wrap: nowrap; }
  .ruta-acciones > button { flex: 1 1 0; min-width: 0; justify-content: center; }
  .btn-ayuda-puntos {
    display: inline-flex; align-items: center; gap: 6px;
    padding-left: 8px; padding-right: 8px;
  }
  .btn-punto-mapa { padding-left: 8px; padding-right: 8px; }
  .ra-largo { display: none; }
  .ra-corto { display: inline; }
}


/* ===========================================================================
   EL PIN QUE SE ARRASTRA (sólo celular)
   ===========================================================================
   El de escritorio (`.pin-previo`) es una vista previa que sigue al mouse y no
   se toca. Éste se agarra con el dedo, así que es más grande, no late —una
   animación abajo del dedo se lee como que la app está pensando— y lleva un
   punto en el centro para saber exactamente qué coordenada se está eligiendo. */
.pin-dedo-cuerpo {
  width: 40px; height: 40px; border-radius: 50%;
  border: 3px solid var(--naranja);
  background: rgba(255,107,0,.22);
  box-shadow: 0 0 0 2px rgba(255,255,255,.75), 0 2px 8px rgba(0,0,0,.45);
  position: relative;
}
.pin-dedo-cuerpo::after {
  content: ''; position: absolute; left: 50%; top: 50%;
  width: 7px; height: 7px; margin: -3.5px 0 0 -3.5px;
  border-radius: 50%; background: #fff;
  box-shadow: 0 0 0 1.5px var(--naranja);
}
/* Mientras se arrastra, el cursor de chinche del mapa no tiene que aparecer
   encima del pin. */
.pin-dedo { cursor: grab; }

/* El botón que cierra el modo en el celular. En escritorio no se muestra: ahí
   el que inserta es el clic en el mapa. */
.btn-pin-listo {
  display: none;
  padding: 6px 14px; border-radius: 6px; cursor: pointer;
  background: var(--naranja); border: 1px solid var(--naranja);
  color: #fff; font-weight: 700; font-size: 12px; font-family: inherit;
}
.pin-barra.pin-celular .btn-pin-listo { display: inline-block; }
/* La instrucción del mouse no aplica al dedo. */
.pin-barra.pin-celular .pin-instruccion { display: none; }
/* Sin la instrucción, el "Cancelar" ya no necesita que lo empujen a la derecha:
   los dos botones quedan juntos, y el de insertar primero porque es el que se
   va a tocar. */
.pin-barra.pin-celular .pin-linea1 { gap: 8px; }
.pin-barra.pin-celular .btn-pin-cancelar { margin-left: 0; order: 2; }
.pin-barra.pin-celular .btn-pin-listo { order: 1; margin-left: auto; }


/* La entrada o salida de TMA, debajo del renglón de su tramo.
   (Acá vivía también `.fir-detalle`, el renglón que traducía el token del
   cruce de FIR a "Radial 128 a 15 nm del VOR MJZ". Se sacó: el token ya lo
   dice, y un piloto lee MJZ128015 sin que se lo traduzcan.) */
.tramo-tma {
  display: block;
  font-size: 10px; line-height: 1.3; color: var(--muted);
  font-weight: 400; letter-spacing: 0;
  white-space: normal;
}
/* La entrada o salida de TMA sí lleva color: no es una explicación, es lo que
   hace que ese punto esté en la ruta. */
.tramo-tma { color: var(--naranja-cl); font-weight: 700; letter-spacing: .04em; }
