/* ─────────────────────────────────────────────────────────────────────────────
 * The Curated · tokens de diseño
 *
 * Fuente: branding/the_curated_brandboard_final.html — paleta «Cendré Chaud», v2.0
 *
 * DOS CAPAS, Y LA DISTINCIÓN IMPORTA:
 *
 *   --marca-*   La marca, verbatim. No se toca, no se ajusta, no se "mejora".
 *               Si el brandboard cambia, cambia esto y nada más.
 *
 *   --ui-*      Lo que usa la aplicación. Deriva de la marca, y CADA desviación
 *               está justificada abajo con su motivo y su medición.
 *
 * Por qué separarlas: un brandboard se diseña para tarjetas, Instagram y papel —
 * superficies donde se mira. Una herramienta de trabajo se usa de noche, en un
 * celular, con una mano, entre la escuela y la casa. Son restricciones distintas
 * y mezclarlas produce o una marca rota o una herramienta ilegible.
 * ───────────────────────────────────────────────────────────────────────────── */

:root {
  /* ── LA MARCA · Cendré Chaud ──────────────────────────────────────────────
   * Los seis colores del brandboard, con sus nombres y sus roles.            */
  --marca-ceniza-calida: #EEEAE4;  /* fondo primario     */
  --marca-roble:         #302C28;  /* texto · fondo oscuro */
  --marca-ceniza:        #B8AEA4;  /* acento · líneas    */
  --marca-neblina:       #D8D2CA;  /* fondo secundario   */
  --marca-pizarra:       #908880;  /* texto secundario   */
  --marca-creme:         #F5F2EE;  /* fondo tarjeta      */

  /* ⚠️ DESVIACIÓN 0 — el único color que el brandboard no trae, y hacía falta.
   *
   * Cendré Chaud es toda gris cálido. Es correcta para papelería y para Instagram, y en
   * una herramienta produjo el defecto que se vio al mirarla completa: «todo es beige
   * sobre beige, el color no significa nada». Sin un acento, la única forma de destacar
   * algo era el semáforo — y usar el rojo del Verificador para señalar el botón principal
   * es enseñarle que rojo no quiere decir nada.
   *
   * El latón sale de la misma familia (H 36°, gris cálido subido de saturación), así que
   * no se lee como un color de software metido a la fuerza. Su trabajo es UNO: decir
   * «aquí» y «esto es lo que sigue». Nunca dice bueno ni malo — eso es del semáforo.
   *
   *   #C2A878 sobre roble          6.51:1  ✓  (es donde vive: el riel)
   *   #8E7A55 sobre ceniza cálida  4.62:1  ✓  (la versión para fondo claro)
   */
  --marca-laton:         #C2A878;
  --marca-laton-oscuro:  #8E7A55;

  /* Tipografía. Cormorant Garamond 300/400 + itálicas · Raleway 200/300/400/500 */
  --marca-display: 'Cormorant Garamond', Garamond, Georgia, serif;
  --marca-texto:   'Raleway', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;

  /* ── SUPERFICIES ────────────────────────────────────────────────────────── */
  --ui-fondo:            var(--marca-ceniza-calida);
  --ui-fondo-tarjeta:    var(--marca-creme);
  --ui-fondo-alterno:    var(--marca-neblina);
  --ui-fondo-inverso:    var(--marca-roble);
  --ui-linea:            var(--marca-ceniza);
  --ui-linea-tenue:      rgba(48, 44, 40, .10);

  /* El acento, en sus dos fondos. Sobre el riel oscuro va el latón claro; sobre papel,
   * el oscuro — el claro sobre crème da 1.9:1 y sería un adorno ilegible. */
  --ui-acento:           var(--marca-laton-oscuro);
  --ui-acento-inverso:   var(--marca-laton);
  --ui-acento-fondo:     rgba(194, 168, 120, .13);

  /* El riel: el roble deja de ser sólo tinta y se vuelve superficie. */
  --ui-riel:             var(--marca-roble);
  --ui-riel-texto:       var(--marca-ceniza);
  --ui-riel-vivo:        var(--marca-ceniza-calida);
  --ui-riel-encima:      rgba(238, 234, 228, .07);
  --ui-riel-linea:       rgba(238, 234, 228, .10);

  /* El ancho de trabajo. Estaba en 640 en todas las pantallas y sobraba media pantalla
   * de 1500 vacía; 1180 es donde una fila de dos columnas todavía deja el texto corrido
   * cerca de los 65 caracteres que se leen sin cansarse. */
  --ui-ancho:            1180px;

  /* ── TEXTO ──────────────────────────────────────────────────────────────── */
  --ui-texto:            var(--marca-roble);        /* 11.56:1 sobre el fondo */
  --ui-texto-inverso:    var(--marca-ceniza-calida);

  /* ⚠️ DESVIACIÓN 1 — la única del sistema, y es obligatoria.
   *
   * El brandboard asigna Pizarra #908880 como «texto secundario» sobre Ceniza
   * Cálida. Medido, ese par da 2.91:1. El mínimo de WCAG AA para texto normal
   * es 4.5:1, así que reprueba — y no por poco.
   *
   * En una tarjeta de presentación eso no importa: se lee una vez, con luz, de
   * cerca. Aquí es el color de «vence en 3 días», «falta el pasaporte de un
   * viajero», «$18,400». Se lee de noche, en un celular, con prisa.
   *
   * La corrección conserva el matiz exacto (H 30°, S 7%) y sólo baja la
   * luminosidad de 53% a 34%. Es el mismo gris cálido, más oscuro.
   *
   *   #5D5751 sobre ceniza cálida  5.95:1  ✓
   *           sobre crème          6.38:1  ✓
   *           sobre neblina        4.75:1  ✓
   *
   * `--marca-pizarra` se queda intacto para piezas de marca: papelería, la
   * carta impresa, Instagram. Ahí el brandboard manda.                        */
  --ui-texto-secundario: #5D5751;
  --ui-texto-tenue:      var(--marca-pizarra);  /* sólo decorativo, nunca información */

  /* ── EL SEMÁFORO DEL VERIFICADOR ────────────────────────────────────────────
   * ⚠️ DESVIACIÓN 2 — el brandboard no tiene rojo, ámbar ni verde. No los
   * necesita: es una marca de viajes de lujo, toda en grises cálidos.
   *
   * Pero el Verificador es el producto (CLAUDE.md §8) y necesita 🔴 🟡 🟢.
   * En vez de meter colores de semáforo genéricos —que romperían la marca en
   * la pantalla que más se usa— se derivan tres tonos desaturados dentro de la
   * misma familia cálida. Se leen como parte del sistema, no como una alerta
   * de software.
   *
   * Todos medidos ≥4.5:1 sobre ceniza cálida y crème.                          */
  --ui-rojo:             #8C4A3C;   /* 5.55 · 5.96  · detiene */
  --ui-ambar:            #6E521E;   /* 6.07 · 6.51  · avisa   */
  --ui-verde:            #4F6350;   /* 5.42 · 5.82  · pasa    */

  /* Fondos de fila. Muy tenues: el color señala, el texto explica. */
  --ui-rojo-fondo:       rgba(140, 74, 60, .09);
  --ui-ambar-fondo:      rgba(110, 82, 30, .10);
  --ui-verde-fondo:      rgba(79, 99, 80, .09);

  /* Sobre fondo oscuro los mismos tonos se aclaran, medidos contra roble. */
  --ui-rojo-inverso:     #D89482;   /* 5.59 */
  --ui-ambar-inverso:    #D9B472;   /* 7.07 */
  --ui-verde-inverso:    #9DB79E;   /* 6.40 */

  /* El cuarto estado (docs/decisiones/001): «no pude revisar». Sin color
   * a propósito — no es bueno ni malo, es ausencia de información. */
  --ui-sin-cobertura:    var(--ui-texto-secundario);
  --ui-sin-cobertura-fondo: rgba(48, 44, 40, .05);

  /* ── ESCALA TIPOGRÁFICA ─────────────────────────────────────────────────────
   * Cormorant Garamond para títulos y cifras; Raleway para todo lo demás.
   * El brandboard usa Raleway 200 en varios lugares — aquí el mínimo es 300:
   * un peso 200 a 12px en un celular al sol no se lee.                         */
  --tipo-titulo:    400 clamp(28px, 5vw, 46px)/1.05 var(--marca-display);
  --tipo-seccion:   400 clamp(20px, 3vw, 26px)/1.2  var(--marca-display);
  --tipo-cifra:     300 34px/1 var(--marca-display);
  --tipo-cita:      italic 300 18px/1.5 var(--marca-display);
  /* ⚠️ SUBIDO DE PESO EL 8 DE SEPTIEMBRE DE 2026, mirando la plataforma completa.
   *
   * Estaba en Raleway 300 a 15px el cuerpo y 300 a 13px lo secundario. Raleway 300 es un
   * peso de titular de revista: a 13px, en un gris del 60%, sobre beige, y de noche, se
   * lee como una marca de agua. Y lo secundario es donde vive «vence en 3 días» y
   * «$18,400» — no es letra chica, es la información.
   *
   * Sube a 400 y el secundario a 14px. Se ve más ordinario y se lee muchísimo mejor, que
   * en una herramienta de trabajo es el intercambio correcto: la elegancia la carga el
   * Cormorant de los títulos y de las cifras, no el cuerpo. */
  --tipo-cuerpo:    400 15px/1.65 var(--marca-texto);
  --tipo-secundario:400 14px/1.55 var(--marca-texto);
  /* ⚠️ BAJADA DE 9px/.3em EL 17 DE SEPTIEMBRE DE 2026, mirando su teléfono a 390 px.
   *
   * Nueve píxeles con un tercio de eme de separación es una tipografía GRABADA: la de una
   * placa, un acta o un membrete de notaría. Está en sesenta y cuatro lugares, y de ahí
   * sale casi todo lo que se sentía «formal» en una herramienta que tiene que sentirse
   * como un compañero de trabajo — «JUEVES, 17 DE SEPTIEMBRE», «1 DE 22», «HACE 3 DÍAS».
   *
   * Once píxeles con .1em siguen siendo una etiqueta —se distingue del cuerpo a simple
   * vista— pero se leen como un renglón de una aplicación, no como un encabezado de un
   * documento oficial. Y a nueve píxeles, en un celular al sol, tampoco se leían. */
  --tipo-etiqueta:  600 11px/1.2 var(--marca-texto);   /* + letter-spacing, uppercase */

  --letra-etiqueta: .1em;
  --letra-logo-the: 1px;
  --letra-logo-curated: -1px;

  /* ── RITMO Y FORMA ──────────────────────────────────────────────────────────
   * El brandboard separa bloques con 2px de aire, no con bordes redondeados.
   * Es un sistema de filetes y rectángulos: se respeta.                        */
  --r: 2px;
  /* La píldora, para lo que SÍ es una píldora: un chip, un botón flotante, una cuenta.
     Existía como 20px, 24px, 26px y 9px sueltos en cuatro lugares — cuatro decisiones
     distintas para la misma forma. El sistema es de rectángulos y las píldoras son la
     excepción; una excepción con nombre es una decisión, sin nombre es un descuido. */
  --r-pildora: 999px;
  --e1: 4px;  --e2: 8px;  --e3: 14px; --e4: 22px; --e5: 36px; --e6: 60px;

  /* ── ELEVACIÓN ─────────────────────────────────────────────────────────────
   * Había seis sombras escritas a mano, con cuatro desenfoques, cuatro opacidades y dos
   * tintas distintas, sin ninguna regla que las relacionara. Son tres alturas y nada más:
   *
   *   apoyada  lo que flota apenas sobre la página — una pista, un globo
   *   alzada   lo que se levanta de verdad — el botón del chat, un panel
   *   encima   lo que tapa la pantalla — el cajón del teléfono, un diálogo
   *
   * La tinta es siempre el roble con transparencia, nunca negro: una sombra negra sobre un
   * fondo cálido se ve sucia, y el brandboard no tiene negro.                            */
  --sombra-apoyada: 0 2px 10px rgba(48, 44, 40, .18);
  --sombra-alzada:  0 3px 16px rgba(48, 44, 40, .24);
  --sombra-encima:  0 -6px 24px rgba(48, 44, 40, .28);
  /* Sobre el riel oscuro la misma sombra desaparece: ahí sí hace falta negro. */
  --sombra-en-lo-oscuro: 0 2px 10px rgba(0, 0, 0, .35);

  /* Lo más ancho que puede ponerse una columna de contenido.
     A 1,440 px el riel se come 225 y el lienzo estira los renglones a 1,130: cuarenta
     caracteres de nombre con medio monitor de aire a la derecha. Mil cien es donde una
     rejilla de cuatro cifras todavía cabe y un renglón de lista todavía se recorre con el
     ojo sin perder el principio. */
  --ancho-lectura: 1100px;

  /* Objetivo táctil mínimo. CLAUDE.md §3.9: una mano, pulgar, botones abajo. */
  --toque-min: 44px;
}

/* ─────────────────────────────────────────────────────────────────────────────
 * EL LOGOTIPO
 *
 * Es una palabra, no un símbolo: «the» en Cormorant 300 y «curated» en
 * Cormorant 400, misma línea base, con la fila de detalles debajo
 * (Travel Experiences — filete — by Marce).
 *
 * ⚠️ Consecuencia para la PWA que hay que resolver, no ignorar: un logotipo de
 * palabra NO funciona como ícono de app. A 60×60 en la pantalla de inicio,
 * «the curated» con su filete es una mancha. El brandboard ya trae la
 * respuesta sin decirlo: el avatar de Instagram usa el monograma «tc».
 * Ese es el ícono. Ver docs/decisiones/002.
 * ───────────────────────────────────────────────────────────────────────────── */

.logo { display: flex; flex-direction: column; align-items: flex-start; }
.logo-linea { display: flex; align-items: baseline; line-height: 1; }
.logo-the {
  font-family: var(--marca-display); font-weight: 300;
  letter-spacing: var(--letra-logo-the); color: var(--marca-pizarra);
  padding-right: .18em;
}
.logo-curated {
  font-family: var(--marca-display); font-weight: 400;
  letter-spacing: var(--letra-logo-curated); line-height: .88;
  color: var(--marca-roble);
}
.logo-detalles { display: flex; align-items: center; width: 100%; gap: 1.2em; margin-top: .18em; }
.logo-sub, .logo-by {
  font-family: var(--marca-texto); text-transform: uppercase; white-space: nowrap;
}
.logo-sub { font-weight: 400; color: var(--marca-pizarra); letter-spacing: .45em; }
.logo-by  { font-weight: 300; color: var(--marca-ceniza);  letter-spacing: .3em; }
.logo-filete { flex: 1; height: 1px; background: var(--marca-neblina); opacity: .8; }

/* Sobre fondo oscuro se invierten los papeles, tal como en el brandboard. */
.logo--inverso .logo-the  { color: var(--marca-ceniza); }
.logo--inverso .logo-curated { color: var(--marca-ceniza-calida); }
.logo--inverso .logo-sub  { color: var(--marca-ceniza); }
.logo--inverso .logo-by   { color: var(--marca-pizarra); }
.logo--inverso .logo-filete { background: var(--marca-pizarra); }

/* Tamaños del brandboard. `curated` manda; lo demás escala con él. */
.logo--xl .logo-curated { font-size: 96px } .logo--xl .logo-the { font-size: 28px }
.logo--lg .logo-curated { font-size: 68px } .logo--lg .logo-the { font-size: 20px }
.logo--md .logo-curated { font-size: 46px } .logo--md .logo-the { font-size: 14px }
.logo--sm .logo-curated { font-size: 30px } .logo--sm .logo-the { font-size: 10px }
.logo--xs .logo-curated { font-size: 20px } .logo--xs .logo-the { font-size: 7px }
.logo--xl .logo-sub, .logo--xl .logo-by { font-size: 8px }
.logo--lg .logo-sub, .logo--lg .logo-by { font-size: 7px }
.logo--md .logo-sub, .logo--md .logo-by { font-size: 6px }
.logo--sm .logo-sub, .logo--sm .logo-by { font-size: 5px }
/* XS va sin fila de detalles: a ese tamaño el filete y las versalitas se ensucian. */
.logo--xs .logo-detalles { display: none }

@media (prefers-reduced-motion: reduce) { * { animation: none !important; transition: none !important } }

/* ═══════════════════════════════════════════════════════════════════════════════════════
 * EL ARMAZÓN · el riel, el lienzo, y las piezas que se repiten en todas las pantallas.
 *
 * ───────────────────────────────────────────────────────────────────────────────────────
 * QUÉ ESTABA MAL, MEDIDO MIRÁNDOLA
 *
 * Cada pantalla era una columna de 560 o 640px centrada en una de 1500: media pantalla
 * vacía. Todo era beige sobre beige, así que el color no significaba nada y no había
 * jerarquía. Las cifras —lo único que se lee de un vistazo— iban en letra chica. Y para
 * saber si el dinero tenía algo pendiente había que entrar al dinero.
 *
 * ───────────────────────────────────────────────────────────────────────────────────────
 * LA IDEA, EN UNA FRASE
 *
 * Un riel oscuro fijo a la izquierda con las secciones y SUS CUENTAS VIVAS, y a la derecha
 * un lienzo ancho donde las cosas se pueden poner en dos columnas: por qué a la izquierda,
 * qué sale a la derecha.
 *
 * El riel con cuentas es la mitad del valor de la herramienta y no costaba nada: ver el
 * «1» rojo junto a La cadena sin abrir nada es exactamente lo que una lista de ligas no
 * hace.
 *
 * ⚠️ Y no cambia la marca. La paleta es Cendré Chaud verbatim; lo que cambia es cuánta se
 * usa — el roble deja de ser sólo tinta y se vuelve superficie.
 * ═══════════════════════════════════════════════════════════════════════════════════════ */

body{margin:0;padding:0}

/* ── EL FOCO DEL TECLADO ────────────────────────────────────────────────────────────────
 * ⚠️ Faltaba por completo en ligas, botones, puertas del riel y `.btn`. Sólo los campos de
 * texto tenían anillo, porque el navegador se lo pone solo y nadie lo quitó. Todo lo demás
 * se navegaba a ciegas: con Tab no había forma de saber dónde estabas parada. Y las puertas
 * del riel son LA navegación, así que sin esto el teclado no sirve para moverse.
 *
 * `:focus-visible` y no `:focus` a propósito: el navegador sólo lo enciende cuando el foco
 * llegó por teclado, así que un clic del ratón no deja el anillo pegado —que es la razón
 * por la que la gente quita los anillos y deja la página sin foco.
 *
 * Dos colores, no uno: el riel es roble oscuro y el lienzo es ceniza clara. Un anillo que
 * contrasta en uno desaparece en el otro. Y `outline` —no `border`, no `box-shadow`— porque
 * es lo único que no mueve nada de sitio al aparecer y lo único que sigue el redondeado.
 * ─────────────────────────────────────────────────────────────────────────────────────── */
/* ⚠ SIN `:where()`. Estaba así, y `:where()` tiene especificidad CERO: cualquier regla
   con una clase que ponga `outline` apaga el anillo de foco de todo el producto sin que
   nadie lo note. Hoy ninguna lo hace; era el selector más frágil del proyecto, y el que
   menos se puede dar el lujo de romperse en silencio — sin él, quien navega con teclado
   deja de saber dónde está. */
a:focus-visible, button:focus-visible, summary:focus-visible, [tabindex]:focus-visible{
  outline:2px solid var(--ui-texto);outline-offset:2px;border-radius:3px}
.riel a:focus-visible, .riel button:focus-visible, .riel [tabindex]:focus-visible{
  outline-color:var(--ui-riel-vivo)}
/* El `.btn` sólido ya es tinta oscura: el anillo del mismo color se le funde encima. */
.btn:not(.fantasma):focus-visible{outline-color:var(--ui-acento);outline-offset:3px}

/* ⚠️ `align-content:start` NO es cosmético. Con `min-height:100vh` y las filas al alto de
   su contenido, la rejilla REPARTE el espacio que sobra entre las filas —es lo que hace por
   defecto— y en el teléfono, donde el riel y el lienzo son dos filas, eso le mete la mitad
   del sobrante ENCIMA del contenido: se midió en 104 px de hueco muerto arriba del título.
   Sólo se ve en las pantallas cortas, o sea justo en los estados vacíos, que son los que
   más falta hace que se lean. */
.app{display:grid;grid-template-columns:212px 1fr;min-height:100vh;
  align-items:start;align-content:start}
/* ⚠️ `min-width:0` en el lienzo. Una columna `1fr` de rejilla NO se encoge por debajo del
   contenido más ancho que tenga —es `min-width:auto`, el que trae de fábrica— así que un
   nombre de archivo largo sin espacios ensancha la columna, y con ella la página entera:
   medido, 1,467 px de contenido en una ventana de 1,280. Se ve como una barra de deslizar
   horizontal que no debería existir. */
/* ⚠️ Y `overflow-x:clip`, que arregla un defecto viejo y difícil de ver: las pistas de
   `[data-dice]` son `::after` absolutos con `min-width:max-content`, y aunque estén
   invisibles SIGUEN CONTANDO para el área que se puede deslizar. Medido en la pantalla del
   viaje: 1,467 px de contenido en una ventana de 1,280 — o sea una barra horizontal que no
   debería existir, en la pantalla que es el producto.

   `clip` y no `hidden` a propósito: `hidden` crea un contenedor de deslizamiento y rompe el
   `position:sticky` del riel. El precio es que una pista pegada al borde derecho se puede
   recortar; una barra horizontal permanente es peor que una pista a medias. */
.lienzo{min-width:0;overflow-x:clip}

/* ── EL RIEL ──────────────────────────────────────────────────────────────────────────── */
.riel{background:var(--ui-riel);color:var(--ui-riel-texto);
  padding:var(--e4) 0 var(--e3);display:flex;flex-direction:column;gap:var(--e4);
  position:sticky;top:0;height:100vh;overflow-y:auto}
.riel .marca{display:flex;align-items:baseline;padding:0 var(--e3);text-decoration:none}
.riel .marca .the{font:300 10px/1 var(--marca-display);letter-spacing:1px;
  color:var(--marca-pizarra);padding-right:.18em}
.riel .marca .cur{font:400 24px/.88 var(--marca-display);letter-spacing:-.6px;
  color:var(--ui-riel-vivo)}
.riel nav{display:flex;flex-direction:column}
.riel .gr{font:var(--tipo-etiqueta);letter-spacing:.26em;text-transform:uppercase;
  color:var(--marca-pizarra);padding:var(--e3) var(--e3) 5px}
.riel a.puerta{display:flex;align-items:center;justify-content:space-between;gap:var(--e2);
  padding:9px var(--e3);font:var(--tipo-secundario);text-decoration:none;
  color:var(--ui-riel-texto);border-left:2px solid transparent;min-height:var(--toque-min)}
.riel a.puerta:hover{background:var(--ui-riel-encima);color:var(--ui-riel-vivo)}
.riel a.puerta .n{font-variant-numeric:tabular-nums;font-size:12px;color:var(--marca-pizarra)}
/* Dónde está parada. El latón hace aquí su único trabajo: decir «aquí». */
.riel a.puerta.aqui{background:var(--ui-riel-encima);color:#fff;font-weight:500;
  border-left-color:var(--ui-acento-inverso)}
.riel a.puerta.aqui .n{color:var(--ui-acento-inverso)}
/* La pastilla roja es la que hace que el riel valga: se ve sin abrir nada. */
.riel a.puerta .n.urge{background:var(--ui-rojo-inverso);color:var(--marca-roble);
  border-radius:var(--r-pildora);padding:1px 7px;font-weight:600}
.riel .pie{margin-top:auto;padding:var(--e3);font:var(--tipo-secundario);font-size:12px;
  line-height:1.5;color:var(--marca-pizarra);border-top:1px solid var(--ui-riel-linea);
  display:flex;flex-direction:column;gap:2px}
.riel .pie a{color:var(--ui-riel-texto)}
.riel .soltar{margin:0 var(--e3);font:var(--tipo-secundario);font-weight:500;
  text-align:center;text-decoration:none;color:var(--ui-riel-vivo);
  border:1px solid var(--ui-riel-linea);border-radius:var(--r);padding:9px var(--e2)}
.riel .soltar:hover{background:var(--ui-riel-encima)}

/* ── EL LIENZO ────────────────────────────────────────────────────────────────────────── */
.lienzo{padding:var(--e5) var(--e5) var(--e6);min-width:0}
.lienzo > *{max-width:var(--ui-ancho);margin-left:auto;margin-right:auto}

/* La tira de encabezado: título a la izquierda, la cifra que resume a la derecha. */
.tira{display:flex;align-items:baseline;justify-content:space-between;
  gap:var(--e4);flex-wrap:wrap}
.tira .der{text-align:right}

/* ── PIEZAS QUE SE REPITEN ────────────────────────────────────────────────────────────── */

/* Dos columnas: el porqué y lo que sale. La proporción por defecto da más aire a la
 * izquierda porque ahí va la evidencia, que es lo que se lee. */
.dos{display:grid;grid-template-columns:1.25fr 1fr;gap:var(--e4);align-items:start}
.dos > *{display:flex;flex-direction:column;gap:var(--e2);min-width:0}
.dos.der-manda{grid-template-columns:1fr 1.25fr}

/* Baldosas de cifra. ⚠️ SÓLO donde la cifra es el punto de la pantalla — el dinero, el
 * cierre, tu mes. Ponerlas en todas partes es cómo dejan de significar algo. */
.baldosas{display:grid;gap:var(--e2);
  grid-template-columns:repeat(auto-fit,minmax(160px,1fr))}
/* ⚠️ En el teléfono, `minmax(160px,1fr)` mete DOS por renglón y deja la tercera sola con un
   hueco del mismo tamaño al lado. Se ve como si faltara una cuarta baldosa que nunca existió,
   y en una pantalla de dinero un hueco donde debería ir una cifra se lee como un dato que se
   perdió. A 390px caben dos de 160 y sobran 22: la rejilla tiene razón y el resultado igual
   está mal, así que abajo de 480 se apilan y cada cifra se lee de corrido. */
@media (max-width:480px){ .baldosas{grid-template-columns:1fr} }
.baldosa{border:1px solid var(--ui-linea-tenue);border-radius:var(--r);
  padding:var(--e3);background:var(--ui-fondo-tarjeta);
  display:flex;flex-direction:column;gap:3px}
.baldosa .et{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}
.baldosa .cif{font:var(--tipo-cifra);font-variant-numeric:tabular-nums;
  overflow-wrap:anywhere}
/* Cuando la baldosa dice «no sé» en vez de una cifra, no es una cifra: no debe pesar como
   una. §3.6 pide decirlo; la jerarquía pide no gritarlo. */
.baldosa .cif:not(.r):not(.a):not(.v){color:var(--ui-texto)}
.baldosa .cif.r{color:var(--ui-rojo)} .baldosa .cif.a{color:var(--ui-ambar)}
.baldosa .cif.v{color:var(--ui-verde)}
.baldosa .hd{font:var(--tipo-secundario);color:var(--ui-texto-secundario);margin:0}

/* La tarjeta genérica. La franja de color va por dentro (box-shadow) para que el borde
 * siga siendo el mismo filete en todas: el brandboard es de filetes, no de bordes gordos. */
.tj{background:var(--ui-fondo-tarjeta);border:1px solid var(--ui-linea-tenue);
  border-radius:var(--r);padding:var(--e3);display:flex;flex-direction:column;gap:5px}
.tj.rojo{background:var(--ui-rojo-fondo);box-shadow:inset 3px 0 0 var(--ui-rojo)}
.tj.ambar{background:var(--ui-ambar-fondo);box-shadow:inset 3px 0 0 var(--ui-ambar)}
.tj.verde{box-shadow:inset 3px 0 0 var(--ui-verde)}
.tj.gris{background:var(--ui-sin-cobertura-fondo);box-shadow:inset 3px 0 0 var(--ui-linea)}
.tj > p{margin:0}
.tj .et{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}
.tj .ht{font-weight:600}
.tj .hd{font:var(--tipo-secundario);color:var(--ui-texto-secundario)}
.tj blockquote{margin:3px 0 0;padding-left:var(--e2);
  border-left:2px solid var(--ui-linea-tenue);
  font:var(--tipo-secundario);color:var(--ui-texto-secundario)}

/* Botones. Uno principal por bloque; el resto fantasma. */
.btn{display:inline-flex;align-items:center;justify-content:center;
  font:var(--tipo-secundario);font-weight:600;text-decoration:none;cursor:pointer;
  background:var(--ui-texto);color:var(--ui-texto-inverso);border:1px solid transparent;
  border-radius:var(--r);padding:9px var(--e3);min-height:var(--toque-min)}
.btn:hover{opacity:.88}
.btn.fantasma{background:transparent;color:var(--ui-texto);border-color:var(--ui-linea)}
.btn.fantasma:hover{background:var(--ui-fondo-alterno);opacity:1}
.enlinea{display:flex;gap:var(--e2);align-items:center;flex-wrap:wrap}

/* Pastillas. Dicen DE QUIÉN es algo — que es lo que un contador no dice. */
.chip{display:inline-block;padding:4px 10px;border:1px solid var(--ui-linea-tenue);
  border-radius:var(--r-pildora);font:var(--tipo-secundario);font-size:12.5px;
  color:var(--ui-texto-secundario);text-decoration:none;white-space:nowrap}
a.chip:hover{background:var(--ui-fondo-alterno);color:var(--ui-texto)}
.chip.oro{border-color:rgba(194,168,120,.65);color:var(--ui-acento);
  background:var(--ui-acento-fondo)}
.chip.v{border-color:rgba(79,99,80,.45);color:var(--ui-verde);background:var(--ui-verde-fondo)}
.chip.r{border-color:rgba(140,74,60,.45);color:var(--ui-rojo);background:var(--ui-rojo-fondo)}
.chip.aqui{border-color:var(--ui-texto);color:var(--ui-texto);font-weight:600}

/* La línea de tiempo. Es la forma de los tres tramos y la de los viajes anteriores: se
 * aprende una vez y sirve en las dos. */
.linea-t{display:grid;grid-template-columns:auto 1fr;gap:0 var(--e3)}
.linea-t .pt{width:10px;height:10px;border-radius:50%;margin-top:6px;
  background:var(--ui-linea);grid-column:1}
.linea-t .pt.v{background:var(--ui-verde)} .linea-t .pt.r{background:var(--ui-rojo)}
.linea-t .pt.a{background:var(--ui-ambar)}
.linea-t .tallo{width:1px;background:var(--ui-linea-tenue);margin:2px auto;grid-column:1}
.linea-t .cont{grid-column:2;padding-bottom:var(--e3);display:flex;flex-direction:column;gap:2px}
.linea-t .cont > *{margin:0}
/* ── LA LIGA DEL RENGLÓN CUBRE EL RENGLÓN ────────────────────────────────────────
   En el expediente de un cliente hay 46 viajes, y cada uno es un título de una línea
   con su fecha debajo. La liga era el TEXTO del título: 14 px de alto, en un renglón
   que mide cuarenta y tantos. El pulgar le pega al de arriba.

   Estirarla a 44 px sería lo fácil y lo peor: cuarenta y seis renglones × 28 px son
   mil trescientos píxeles más de página, en la pantalla que justamente se está
   acortando. En vez de eso la liga se vuelve bloque y se come con `padding` el aire
   que el renglón ya tenía —el `gap` de arriba y el hueco hasta la fecha— compensado
   con un margen negativo del mismo tamaño. El renglón mide lo mismo; lo que crece es
   el área que responde al dedo. */
.linea-t .cont .ht a{display:block;padding:9px 0;margin:-9px 0 -7px;
  text-decoration:none;color:var(--ui-texto)}
.linea-t .cont .ht a:hover{text-decoration:underline}

/* Tabla compacta. Cifras con tabular-nums o las columnas no se leen. */
table.mini{width:100%;border-collapse:collapse;font:var(--tipo-secundario)}
table.mini th{text-align:left;font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);
  padding:0 var(--e2) 5px 0;border-bottom:1px solid var(--ui-linea-tenue)}
table.mini td{padding:6px var(--e2) 6px 0;border-bottom:1px solid var(--ui-linea-tenue);
  vertical-align:top}
table.mini tr:last-child td{border-bottom:0}
.m{font-variant-numeric:tabular-nums}
.de-donde{color:var(--ui-texto-secundario)}

/* La sección con su título. `h5` es la etiqueta de sección dentro del lienzo. */
.lienzo h5{font:var(--tipo-etiqueta);letter-spacing:.24em;text-transform:uppercase;
  color:var(--ui-texto-secundario);margin:0 0 var(--e2)}

/* ── CUANDO EL TABLERO YA NO CABE ─────────────────────────────────────────────────────────
 * §3.9: una mano, pulgar, botones abajo.
 *
 * ⚠️ AQUÍ EL RIEL SE ACOSTABA, Y ESO DEJABA UNA BANDA MUERTA DE 140px DE ANCHO.
 *
 * Entre 761 y 900px —el iPad en vertical, o su laptop con la ventana a media pantalla— el
 * riel se volvía una tira horizontal de 58px que SE SALÍA POR LA DERECHA, y la barra de
 * abajo todavía no aparecía porque entraba hasta 760. Medido a 820px: se veían seis puertas
 * y las otras siete —La cadena, Cierre de mes, Buscar, Cómo va esto— quedaban fuera de la
 * pantalla, sin nada que dijera que estaban ahí. O sea que en ese rango la mitad de la
 * navegación no existía.
 *
 * La decisión es la misma que ya estaba escrita para el teléfono, aplicada donde de verdad
 * empieza a doler: **o el riel cabe como tablero, o se va y manda la barra de abajo.** No
 * hay una tercera forma que funcione, y la tira que se desliza era justamente la que §3.9
 * dice que no sirve — arriba, donde el pulgar no llega, y escondiendo puertas detrás de un
 * gesto que nadie adivina.
 *
 * Los dos puntos de quiebre son ahora el mismo número a propósito: eran 900 y 760, y la
 * distancia entre los dos era el defecto.                                                */
@media (max-width:900px){
  .app{grid-template-columns:1fr}
  /* ⚠️ Aire abajo por el botón de «pregúntame», que flota fijo en la esquina. Sin esto tapa
     el último renglón de la pantalla, y el último renglón de «de corrido» es justo el que
     ella iba a tocar. */
  .lienzo{padding:var(--e4) var(--e3) 92px}
  .dos,.dos.der-manda{grid-template-columns:1fr;gap:var(--e3)}
  /* La cabecera en dos mitades no cabe en 375px: el título se parte en cuatro renglones y
     la cifra de la derecha queda pegada al borde. Se apilan, y la cifra pasa a la
     izquierda — a la derecha de una pantalla angosta no la busca nadie. */
  .tira{flex-direction:column;align-items:flex-start}
  .tira .der{text-align:left;align-items:flex-start}
  /* Los tres tramos en columna, con la línea que los une vuelta vertical. */
  ol.tramos{grid-template-columns:1fr;gap:var(--e3)}
  ol.tramos::before{left:5px;right:auto;top:5px;bottom:5px;height:auto;width:1px}
  ol.tramos > li{padding-top:0;padding-left:var(--e4)}
  ol.tramos > li::before{top:2px}
}

/* La cifra que resume una pantalla entera. Una sola por pantalla: si hay dos, ninguna
   es la que importa. Vive en «tu mes» y podría vivir en el cierre — nunca en las dos. */
.cifrota{font:300 clamp(38px,5vw,52px)/1 var(--marca-display);
  font-variant-numeric:tabular-nums}

/* ═══════════════════════════════════════════════════════════════════════════════════════
 * PREGÚNTAME · el chat, en todas las pantallas
 *
 * Cerrado es un botón en la esquina; abierto es una columna a la derecha que no le quita
 * sitio a lo que estaba haciendo. En el celular se abre completo: media pantalla de chat en
 * 375px no es ni chat ni pantalla.
 * ═══════════════════════════════════════════════════════════════════════════════════════ */
.abrirChat{position:fixed;right:var(--e4);bottom:var(--e4);z-index:30;
  display:flex;align-items:center;gap:var(--e2);cursor:pointer;
  font:var(--tipo-secundario);font-weight:600;
  background:var(--ui-riel);color:var(--ui-riel-vivo);
  border:1px solid var(--ui-riel-linea);border-radius:var(--r-pildora);
  padding:11px var(--e4);min-height:var(--toque-min);
  box-shadow:var(--sombra-apoyada)}
.abrirChat:hover{background:var(--marca-roble)}
.abrirChat .chispa{color:var(--ui-acento-inverso);font-size:15px;line-height:1}
.abrirChat[aria-expanded="true"]{display:none}

.chat{position:fixed;top:0;right:0;bottom:0;width:min(420px,100%);z-index:31;
  background:var(--ui-fondo-tarjeta);border-left:1px solid var(--ui-linea);
  display:flex;flex-direction:column;
  box-shadow:var(--sombra-alzada)}
.chat > header{display:flex;align-items:flex-start;justify-content:space-between;
  gap:var(--e2);padding:var(--e4);border-bottom:1px solid var(--ui-linea-tenue)}
.chat > header p{margin:0}
.chat > header .et{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);margin-bottom:3px}
.chat > header .hd{font:var(--tipo-secundario);color:var(--ui-texto-secundario)}
.cerrarChat{background:transparent;border:0;cursor:pointer;font-size:24px;line-height:1;
  color:var(--ui-texto-secundario);padding:0 4px}
.cerrarChat:hover{color:var(--ui-texto)}

.chat .hilo{flex:1;overflow-y:auto;padding:var(--e4);
  display:flex;flex-direction:column;gap:var(--e3)}
.chat .dice p{margin:0 0 var(--e2)}
.chat .dice p:last-child{margin-bottom:0}
.chat .dice.ella{align-self:flex-end;max-width:88%;
  background:var(--ui-fondo-alterno);border-radius:var(--r);padding:var(--e2) var(--e3);
  font:var(--tipo-secundario)}
.chat .dice.claude{font:var(--tipo-secundario);line-height:1.6}
.chat .dice.claude .hd{color:var(--ui-texto-secundario)}
.chat .dice.pensando{color:var(--ui-texto-secundario);font-style:italic}
.chat .dice.mal{color:var(--ui-rojo)}

.chat .sugeridas{display:flex;flex-wrap:wrap;gap:5px;padding:0 var(--e4) var(--e3)}
.chat .sug{font:var(--tipo-secundario);font-size:12.5px;cursor:pointer;text-align:left;
  background:transparent;color:var(--ui-texto-secundario);
  border:1px solid var(--ui-linea-tenue);border-radius:var(--r-pildora);padding:5px 11px}
.chat .sug:hover{border-color:var(--ui-linea);color:var(--ui-texto)}

.chat form{display:flex;flex-direction:column;gap:var(--e2);
  padding:var(--e3) var(--e4) var(--e4);border-top:1px solid var(--ui-linea-tenue)}
.chat form .et{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}
.chat textarea{font:var(--tipo-secundario);padding:var(--e2);resize:vertical;
  border:1px solid var(--ui-linea);border-radius:var(--r);
  background:var(--ui-fondo);color:var(--ui-texto)}
.chat textarea:focus{outline:2px solid var(--ui-texto);outline-offset:1px}

@media (max-width:640px){
  .chat{width:100%;border-left:0}
  .abrirChat{right:var(--e3);bottom:var(--e3);padding:11px var(--e3)}
  .abrirChat .q{display:none}
}

/* ═══════════════════════════════════════════════════════════════════════════════════════
 * QUÉ PASA SI LE DAS CLIC · la pista que sale al pasar el cursor
 *
 * ⚠️ NO ES UN ADORNO, Y NO ES EL `title` DEL NAVEGADOR.
 *
 * «Que cuando pongas el cursor sobre algo que le puedas dar clic, te dé una breve
 * explicación de qué hace.» — Yuyo, 8 de septiembre de 2026.
 *
 * El `title` de siempre tarda un segundo largo en salir, aparece donde el navegador quiere,
 * y con la letra del sistema. Para algo que se lee de pasada, ese segundo es justo el tiempo
 * en el que ella ya hizo clic o ya se fue. Esto sale en 350 ms, en su tipografía, y dice una
 * frase, no un nombre.
 *
 * ⚠️ LA REGLA DE LO QUE SE ESCRIBE AHÍ: dice QUÉ VA A PASAR, no cómo se llama el botón. Un
 * texto que repite la etiqueta —«Clientes: ver clientes»— es peor que ninguno, porque enseña
 * que estas pistas no dicen nada y deja de leerlas.
 *
 * En un aparato sin cursor no sale al tocar —ahí el dedo va directo— pero sí sale con el
 * foco: quien navega con teclado la necesita más que nadie. El corte está abajo, y es por
 * `hover: none` y NO por ancho de pantalla, que era el defecto que tenía.
 * ═══════════════════════════════════════════════════════════════════════════════════════ */
[data-dice]{position:relative}
[data-dice]::after{
  content:attr(data-dice);
  position:absolute;left:50%;bottom:calc(100% + 8px);transform:translateX(-50%);
  z-index:60;pointer-events:none;
  min-width:max-content;max-width:min(280px,60vw);white-space:normal;text-align:left;
  font:400 12.5px/1.4 var(--marca-texto);letter-spacing:0;text-transform:none;
  background:var(--ui-riel);color:var(--ui-riel-vivo);
  padding:7px 10px;border-radius:var(--r);
  box-shadow:var(--sombra-apoyada);
  opacity:0;visibility:hidden;transition:opacity .13s ease .35s,visibility 0s linear .48s}
[data-dice]::before{
  content:"";position:absolute;left:50%;bottom:calc(100% + 3px);transform:translateX(-50%);
  z-index:60;pointer-events:none;
  border:5px solid transparent;border-top-color:var(--ui-riel);
  opacity:0;visibility:hidden;transition:opacity .13s ease .35s,visibility 0s linear .48s}
[data-dice]:hover::after,[data-dice]:hover::before,
[data-dice]:focus-visible::after,[data-dice]:focus-visible::before{
  opacity:1;visibility:visible;transition-delay:.35s,0s}

/* Arriba del todo no cabe: se voltea hacia abajo. */
[data-dice][data-abajo]::after{bottom:auto;top:calc(100% + 8px)}
[data-dice][data-abajo]::before{bottom:auto;top:calc(100% + 3px);
  border-top-color:transparent;border-bottom-color:var(--ui-riel)}

/* En el riel oscuro la pista se pinta al revés, o desaparece sobre su propio fondo. */
.riel [data-dice]::after{background:var(--ui-fondo-tarjeta);color:var(--ui-texto);
  box-shadow:var(--sombra-en-lo-oscuro)}
.riel [data-dice]::before{border-top-color:var(--ui-fondo-tarjeta)}
/* Y sale a un lado, no arriba: el riel es angosto y una pista de 280px se saldría. */
.riel [data-dice]::after{left:calc(100% + 10px);bottom:auto;top:50%;
  transform:translateY(-50%)}
.riel [data-dice]::before{left:calc(100% + 5px);bottom:auto;top:50%;
  transform:translateY(-50%);border-top-color:transparent;border-right-color:var(--ui-fondo-tarjeta)}

/* ══════════════════════════════════════════════════════════════════════════════
   ⚠ LA PISTA SE APAGA POR EL APARATO, NO POR EL ANCHO.
   Esto decía `@media (max-width:900px)`, con el argumento de que «en el celular el dedo va
   directo y no hay pasar por encima». El argumento es correcto y el corte estaba mal:

     · Una ventana de escritorio a 800 px —media pantalla, como se trabaja con el correo
       al lado— perdía las cincuenta pistas aunque tuviera ratón.
     · Una tablet táctil de 1024 px las conservaba sin poder dispararlas nunca.

   `hover: hover` pregunta justo lo que importa: si este aparato puede pasar por encima.
   ═════════════════════════════════════════════════════════════════════════════ */
@media (hover: none){
  /* Sin cursor no hay globo — pero el foco sí existe: con teclado externo o navegación por
     conmutador, `:focus-visible` lo sigue sacando. Por eso sólo se apaga el de `:hover`. */
  [data-dice]:hover::after,[data-dice]:hover::before{display:none}
}
@media (prefers-reduced-motion: reduce){
  [data-dice]::after,[data-dice]::before{transition:none}
}

/* ── LA FRANJA DE DESHACER ──────────────────────────────────────────────────
 * §3.7 dice «deshacer en vez de confirmar», y el botón de deshacer vivía DENTRO
 * del renglón. En «de corrido» eso no sirve: en cuanto ella decide, el renglón se
 * esconde y la siguiente cosa ocupa su lugar — con el botón adentro. La salida
 * existía y desaparecía justo cuando hacía falta.                              */
.franjaDeshacer{position:fixed;left:50%;bottom:var(--e4);transform:translateX(-50%);
  z-index:40;display:flex;align-items:center;gap:var(--e4);
  background:var(--ui-riel);color:var(--ui-riel-vivo);
  border:1px solid var(--ui-riel-linea);border-radius:var(--r-pildora);
  padding:11px var(--e4);font:var(--tipo-secundario);
  box-shadow:var(--sombra-alzada);
  animation:sube .18s ease}
@keyframes sube{from{opacity:0;transform:translate(-50%,10px)}to{opacity:1;transform:translate(-50%,0)}}
.franjaDeshacer button{font:var(--tipo-secundario);font-weight:600;cursor:pointer;
  background:transparent;color:var(--ui-acento-inverso);border:0;padding:0;
  border-bottom:1px solid rgba(194,168,120,.5)}
.franjaDeshacer button:hover{border-bottom-color:var(--ui-acento-inverso)}
.franjaDeshacer button:disabled{opacity:.5;cursor:default}
/* En el celular va de lado a lado y arriba del botón de pregúntame. */
@media (max-width:640px){
  .franjaDeshacer{left:var(--e3);right:var(--e3);transform:none;bottom:82px;
    justify-content:space-between;animation:none}
}
@media (prefers-reduced-motion: reduce){.franjaDeshacer{animation:none}}

/* ══ BUSCAR ══════════════════════════════════════════════════════════════════════════════
   La caja del riel y la pantalla de resultados.

   ⚠️ La caja va en el riel, no dentro de cada pantalla: buscar es la forma de moverse por
   la herramienta, no una función de la lista de viajes. Desde cualquier lado, Enter busca. */
.riel .cajaBuscar{margin:0 var(--e3)}
.riel .cajaBuscar input{width:100%;box-sizing:border-box;font:var(--tipo-secundario);
  padding:7px var(--e2);border-radius:var(--r);
  background:var(--ui-riel-encima);color:var(--ui-riel-vivo);
  border:1px solid transparent;-webkit-appearance:none}
.riel .cajaBuscar input::placeholder{color:var(--marca-pizarra)}
.riel .cajaBuscar input:focus{outline:none;border-color:var(--marca-laton);
  background:var(--ui-riel-encima);color:#fff}

.buscaGrande{display:flex;flex-wrap:wrap;gap:var(--e2);align-items:center;
  margin-top:var(--e3)}
.buscaGrande input[type=search]{flex:1 1 22ch;min-width:0;font:var(--tipo-secundario);
  font-size:16px;padding:10px var(--e3);border-radius:var(--r);
  border:1px solid var(--ui-linea);background:var(--ui-fondo-tarjeta);color:var(--ui-texto);
  -webkit-appearance:none}
.buscaGrande input[type=search]:focus{outline:2px solid var(--marca-laton);outline-offset:-1px}
.buscaGrande select{font:var(--tipo-secundario);padding:9px var(--e2);border-radius:var(--r);
  border:1px solid var(--ui-linea);background:var(--ui-fondo-tarjeta);color:var(--ui-texto);
  max-width:26ch}

.comoSeBusca{margin:var(--e3) 0 var(--e3);padding-left:var(--e3);display:flex;
  flex-direction:column;gap:5px}
.comoSeBusca b{font-weight:600;color:var(--ui-texto)}

.grupoHallado{margin-top:var(--e4)}
.grupoHallado > h2{font:var(--tipo-etiqueta);letter-spacing:.2em;text-transform:uppercase;
  color:var(--ui-texto-secundario);margin:0 0 var(--e2);display:flex;gap:var(--e2);
  align-items:baseline}
.listaHallada{display:flex;flex-direction:column;gap:2px}
.hallado{display:grid;grid-template-columns:1fr auto;align-items:center;gap:var(--e3);
  padding:var(--e3);text-decoration:none;color:var(--ui-texto);
  background:var(--ui-fondo-tarjeta);border:1px solid var(--ui-linea-tenue);
  border-radius:var(--r);min-height:var(--toque-min)}
.hallado:hover{background:var(--ui-fondo-alterno)}
.hallado .quees{display:flex;flex-direction:column;gap:1px;min-width:0}
.hallado .nom{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hallado .hd{font:var(--tipo-secundario);color:var(--ui-texto-secundario);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* ⚠️ Los montos en columna, alineados por el punto: es lo que deja comparar de un vistazo
   sin leer cada cifra. */
.hallado .montoHallado{font:var(--tipo-secundario);font-variant-numeric:tabular-nums;
  white-space:nowrap;color:var(--ui-texto)}

.nadaHallado{margin-top:var(--e4);padding:var(--e4);border-radius:var(--r);
  background:var(--ui-fondo-tarjeta);border:1px solid var(--ui-linea-tenue)}
.nadaHallado p{margin:0 0 var(--e2)}
.nadaHallado p:last-child{margin:0}
/* ⚠️ §3.13 en la pantalla: lo que no se pudo considerar se dice, y se ve. */
.avisoIncompleto{margin-top:var(--e4);padding:var(--e3);border-radius:var(--r);
  border:1px dashed var(--ui-linea);color:var(--ui-texto-secundario)}
.nota{margin:var(--e2) 0 0}

@media (max-width:900px){
  /* El riel entero no existe abajo de 900px, así que su caja de buscar tampoco. Se entra a
     buscar por su puerta de la barra de abajo, que es donde llega el pulgar. */
  .riel .cajaBuscar{display:none}
  /* Cada control su renglón. ⚠️ `min-width:0` y `width:100%` porque un `<select>` se
     estira a lo que mide su opción más larga —«NAO CRUISES SAPI DE CV · 111»— y sin eso
     se sale de la pantalla y empuja la página de lado. */
  .buscaGrande{gap:var(--e2)}
  .buscaGrande input[type=search],.buscaGrande select{
    flex:1 1 100%;width:100%;min-width:0;max-width:none;box-sizing:border-box}
}


/* ══ LAS PIEZAS ══════════════════════════════════════════════════════════════════════════
   Lo que antes cada pantalla reinventaba. Ver src/ui/piezas.ts. */

/* ── Pestañas ── Son ligas de verdad, así que se ven como ligas y se marcan con la línea
   de abajo, no con un fondo: un fondo las hace parecer botones y un botón promete que algo
   va a pasar, no que uno se va a mover. */
.pestanas{display:flex;gap:var(--e3);flex-wrap:wrap;align-items:baseline;
  border-bottom:1px solid var(--ui-linea-tenue);margin-bottom:var(--e4)}
.pestana{display:inline-flex;align-items:baseline;gap:6px;padding:var(--e2) 0;
  margin-bottom:-1px;border-bottom:2px solid transparent;
  font:var(--tipo-secundario);font-weight:500;text-decoration:none;
  color:var(--ui-texto-secundario);white-space:nowrap}

/* ── EN EL TELÉFONO LAS PESTAÑAS SE DESLIZAN, NO SE PARTEN ──────────────────────
   Medido a 390 px: las seis del dinero se partían en TRES renglones desiguales
   —«Lo que vas a cobrar / Lo que te pagan», luego tres, luego una suelta— y con eso
   la barra medía 145 px. Sumada a la de arriba son 189 px: el 22% de la primera
   pantalla gastado en navegación, antes de una sola palabra, en las seis pantallas
   del dinero.

   Y partidas dejan de leerse como una fila de pestañas: tres renglones de ligas
   sueltas se leen como un menú, que es lo que una fila de pestañas existe para no
   ser. En un renglón que se desliza se ven como lo que son, se sabe que hay más a
   la derecha, y la pantalla recupera cien píxeles.

   `scroll-snap` para que no se quede una a medias, y la que está seleccionada se
   trae sola al entrar (`scroll-margin`). */
@media (max-width:560px){
  .pestanas{flex-wrap:nowrap;overflow-x:auto;scroll-snap-type:x proximity;
    gap:var(--e4);margin-bottom:var(--e3);
    scrollbar-width:none;-webkit-overflow-scrolling:touch}
  .pestanas::-webkit-scrollbar{display:none}
  .pestana{scroll-snap-align:start;scroll-margin-inline:var(--e4);flex:0 0 auto;
    min-height:44px;align-items:center}
}
.pestana:hover{color:var(--ui-texto)}
.pestana.aqui{color:var(--ui-texto);border-bottom-color:var(--marca-laton)}
.pestana .n{font-variant-numeric:tabular-nums;font-size:12px;color:var(--ui-texto-secundario)}
.pestana .n.urge{background:var(--ui-rojo-inverso);color:var(--marca-roble);
  border-radius:var(--r-pildora);padding:1px 7px;font-weight:600}

/* ── Plegables ── `<details>` nativo. El resumen del encabezado es lo que evita abrir. */
.pliegue{border:1px solid var(--ui-linea-tenue);border-radius:var(--r);
  background:var(--ui-fondo-tarjeta);margin-bottom:var(--e2)}
.pliegue > summary{display:flex;align-items:baseline;justify-content:space-between;
  gap:var(--e3);padding:var(--e3);cursor:pointer;list-style:none;
  min-height:var(--toque-min);box-sizing:border-box}
.pliegue > summary::-webkit-details-marker{display:none}
.pliegue > summary:hover{background:var(--ui-fondo-alterno)}
.pliegue > summary:focus-visible{outline:2px solid var(--marca-laton);outline-offset:-2px}
.pliegue > summary .quees{font:var(--tipo-etiqueta);letter-spacing:.2em;
  text-transform:uppercase;color:var(--ui-texto)}
/* ⚠️ El resumen NO se corta con puntos suspensivos: es el dato por el que existe el
   plegable, y medio dato es peor que ninguno. Envuelve. */
.pliegue > summary .resumen{font:var(--tipo-secundario);color:var(--ui-texto-secundario);
  text-align:right;font-variant-numeric:tabular-nums}
/* El triángulo lo pone el navegador; aquí se dibuja para que gire igual en todos. */
.pliegue > summary .quees::before{content:'▸';display:inline-block;width:1.1em;
  color:var(--ui-texto-secundario);transition:transform .12s ease}
.pliegue[open] > summary .quees::before{transform:rotate(90deg)}
.pliegue > .dentro{padding:0 var(--e3) var(--e3)}

/* ── Estados vacíos ── */
.nada{padding:var(--e4) 0}
.nada .vacio{margin:0 0 var(--e2)}
.nada .yQue{margin:var(--e3) 0 0}

/* ── La cabecera con algo a la derecha ── */
.cab .alLado{display:flex;align-items:center;gap:var(--e2);flex:none}

@media (prefers-reduced-motion:reduce){
  .pliegue > summary .quees::before{transition:none}
}


/* ── ¿Son la misma persona? ──────────────────────────────────────────────────────────────
   Va arriba de la lista y no escondido: cada respuesta corrige la lista para siempre. Pero
   con borde punteado y sin fondo fuerte, porque es una pregunta, no una alarma. */
.parecidos{margin:var(--e4) 0;padding:var(--e3);border:1px dashed var(--ui-linea);
  border-radius:var(--r)}
.parecidos > h2{font:var(--tipo-etiqueta);letter-spacing:.2em;text-transform:uppercase;
  color:var(--ui-texto-secundario);margin:0 0 var(--e2)}
.listaParecidos{display:flex;flex-direction:column;gap:2px;margin-top:var(--e3)}
.parecido{display:grid;grid-template-columns:1fr auto;align-items:center;gap:var(--e3);
  padding:var(--e3);background:var(--ui-fondo-tarjeta);
  border:1px solid var(--ui-linea-tenue);border-radius:var(--r)}
.parecido.cerrado{opacity:.55}
.parecido .cuales{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--e2);min-width:0}
.parecido .cuales a{color:var(--ui-texto);font-weight:500}
.parecido .cuales .hd{font:var(--tipo-secundario);color:var(--ui-texto-secundario)}
.parecido .quedice{display:flex;gap:var(--e2);flex:none}
.parecido .dicho{grid-column:1/-1;margin:0;font:var(--tipo-secundario);
  color:var(--ui-texto-secundario)}
.parecido .dicho:empty{display:none}

@media (max-width:900px){
  /* El pulgar manda: los dos botones abajo, de ancho completo, no en la esquina. */
  .parecido{grid-template-columns:1fr}
  .parecido .quedice{width:100%}
  .parecido .quedice > *{flex:1;text-align:center}
}

/* ── El expediente del viaje ─────────────────────────────────────────────────────────── */
.monton{margin-top:var(--e3)}
.monton:first-child{margin-top:0}
.monton > h3{font:var(--tipo-secundario);font-weight:600;letter-spacing:.08em;
  text-transform:uppercase;color:var(--ui-texto-secundario);margin:0 0 6px;
  display:flex;gap:var(--e2);align-items:baseline}
.losDocs,.losPasajeros{list-style:none;margin:0;padding:0;
  display:flex;flex-direction:column;gap:2px}
.losDocs > li,.losPasajeros > li{display:flex;flex-wrap:wrap;gap:var(--e2);
  align-items:baseline;padding:7px var(--e2);border-radius:var(--r);
  background:var(--ui-fondo-alterno);min-width:0;
  /* Los nombres de archivo de los operadores no traen espacios donde partir. Que envuelva
     por donde sea es más feo y más útil que cortarlo con puntos suspensivos: el nombre es
     lo único que distingue un `VGR7210021V3_DV25627` de un `..._DV25632`. */
  overflow-wrap:anywhere}
.losDocs .queEs,.losDocs .dijo,.losPasajeros .dijo{font:var(--tipo-secundario);
  color:var(--ui-texto-secundario)}
.losPasajeros .nom{font-weight:500}
/* ⚠️ Un documento de bóveda NO se ve como una liga: no lo es. Verlo azul y subrayado y que
   no abra enseña que las ligas de esta pantalla mienten. */
.losDocs .enBoveda{color:var(--ui-texto);cursor:default}
.losDocs .sinCopia{color:var(--ui-texto-secundario);cursor:default}

.dineroDelViaje{display:flex;flex-direction:column;gap:var(--e3)}
.unaCadena{display:grid;grid-template-columns:1fr auto;gap:var(--e3) var(--e3);
  align-items:center;padding:var(--e3);border-radius:var(--r);
  background:var(--ui-fondo-alterno)}
.unaCadena .quees{display:flex;flex-direction:column;gap:1px;min-width:0}
.unaCadena .nom{font-weight:500}
.unaCadena .hd{font:var(--tipo-secundario);color:var(--ui-texto-secundario)}
.tresTramos{grid-column:1/-1;list-style:none;display:flex;flex-wrap:wrap;gap:var(--e3);
  margin:0;padding:0;font:var(--tipo-secundario);color:var(--ui-texto-secundario)}
.tresTramos > li{display:flex;align-items:center;gap:6px}
/* ⚠️ El estado va con forma Y con color, no sólo con color: un semáforo que sólo es color
   no lo lee quien no distingue el rojo del verde. */
.tresTramos > li::before{content:'○';font-size:11px}
.tresTramos > li.thecho::before{content:'●';color:var(--ui-verde)}
.tresTramos > li.thecho{color:var(--ui-texto)}

@media (max-width:900px){
  .unaCadena{grid-template-columns:1fr}
  .unaCadena .btn{justify-self:start}
}


/* ══ LA BARRA DE ABAJO ═══════════════════════════════════════════════════════════════════
   Sólo en el teléfono. En la computadora el riel es un tablero —trece puertas con sus
   cuentas a la vista— y esconderlas detrás de cuatro no simplifica: quita el vistazo. */
.barraAbajo{display:none}

@media (max-width:900px){
  /* ⚠️ EL RIEL SE VA. Se acostaba y se deslizaba, así que las puertas de la derecha no
     existían hasta que uno adivinaba que había que empujar — y arriba, que es donde el
     pulgar no llega (§3.9). Su caja de buscar tiene puerta propia en la barra. */
  .riel{display:none}

  .barraAbajo{display:flex;position:fixed;left:0;right:0;bottom:0;z-index:40;
    background:var(--ui-riel);
    padding:6px var(--e2) calc(6px + env(safe-area-inset-bottom));
    gap:2px;align-items:stretch}
  /* ⚠️ `flex-start` Y NO `center`, y se ve en cuanto se mira la barra en un teléfono: con
     las puertas centradas, una que trae cuenta ocupa dos renglones y su nombre sube, y una
     sin cuenta ocupa uno y su nombre queda en medio. «Hoy» y «Clientes» salían más arriba
     que «Cómo vas» y «Dinero», en la única barra que ella usa en el celular.

     Con `flex-start` los cinco nombres arrancan a la misma altura y la cuenta cuelga
     debajo, que es donde tiene que estar: el nombre es lo que se lee, la cuenta es lo que
     se mira de reojo. */
  .abajoPuerta,.masPuertas > summary{
    flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;
    gap:2px;padding:9px 2px 7px;min-height:46px;border-radius:var(--r);
    font:var(--tipo-secundario);font-size:12px;font-weight:500;
    color:var(--ui-riel-texto);text-decoration:none;text-align:center;
    list-style:none;cursor:pointer;box-sizing:border-box}
  .masPuertas > summary::-webkit-details-marker{display:none}
  .abajoPuerta.aqui{background:var(--ui-riel-encima);color:#fff}
  .abajoPuerta .n{font-variant-numeric:tabular-nums;font-size:11px;
    color:var(--marca-pizarra)}
  .abajoPuerta.aqui .n{color:var(--ui-acento-inverso)}
  .abajoPuerta .n.urge{background:var(--ui-rojo-inverso);color:var(--marca-roble);
    border-radius:var(--r-pildora);padding:0 6px;font-weight:600}

  /* «Más» abre HACIA ARRIBA: abajo no hay espacio y ahí está la mano. */
  .masPuertas{flex:1;display:flex;position:relative}
  .masPuertas[open] > summary{background:var(--ui-riel-encima);color:#fff}
  .lasOtras{position:absolute;bottom:calc(100% + 8px);right:0;min-width:min(64vw,240px);
    display:flex;flex-direction:column;
    background:var(--ui-riel);border-radius:var(--r);padding:var(--e2) 0;
    box-shadow:var(--sombra-encima);max-height:60vh;overflow-y:auto}
  /* ⚠️ Los estilos de `.puerta` viven bajo `.riel`, así que aquí las ligas salían azules
     y subrayadas, con la cuenta pegada al nombre. Una puerta que se ve como una liga de
     página web dentro de un menú negro se lee como un error, no como una puerta. */
  .lasOtras .puerta{display:flex;align-items:center;justify-content:space-between;
    gap:var(--e2);border-left:0;padding:11px var(--e3);min-height:var(--toque-min);
    font:var(--tipo-secundario);text-decoration:none;color:var(--ui-riel-texto)}
  .lasOtras .puerta:hover{background:var(--ui-riel-encima);color:var(--ui-riel-vivo)}
  .lasOtras .puerta.aqui{background:var(--ui-riel-encima);color:#fff;font-weight:500}
  .lasOtras .puerta .n{font-variant-numeric:tabular-nums;font-size:12px;
    color:var(--marca-pizarra)}
  .lasOtras .puerta .n.urge{background:var(--ui-rojo-inverso);color:var(--marca-roble);
    border-radius:var(--r-pildora);padding:1px 7px;font-weight:600}

  /* ⚠️ Aire abajo del lienzo por la barra fija. Sin esto, el último renglón de cada lista
     queda tapado — y el último renglón de «lo de hoy» es una cosa por hacer. */
  .lienzo{padding-bottom:calc(72px + env(safe-area-inset-bottom))}
  /* Y el botón de «pregúntame» sube por encima de la barra, no debajo. */
  .abrirChat{bottom:calc(78px + env(safe-area-inset-bottom))}
  /* La franja de deshacer también: si queda debajo de la barra, «se puede deshacer» deja
     de ser verdad justo en el teléfono. */
  .franjaDeshacer{bottom:calc(72px + env(safe-area-inset-bottom))}
}

/* ══ EL VISOR ════════════════════════════════════════════════════════════════════════════
   El documento a la izquierda, lo que leí de él a la derecha. */
.visor{display:flex;flex-direction:column;gap:var(--e3);min-width:0}
.visor .nombreDoc{font:400 clamp(19px,2.4vw,26px)/1.15 var(--marca-display);
  overflow-wrap:anywhere}
.dosDelVisor{display:grid;grid-template-columns:1.35fr 1fr;gap:var(--e4);
  align-items:start;min-width:0}
.dosDelVisor > *{min-width:0}
/* ⚠️ El alto del documento se ata a la ventana, no al contenido: un PDF de nueve páginas
   dentro de un marco que crece haría la página infinita y perdería el panel de al lado. */
.elDocumento{width:100%;height:min(74vh,760px);border:1px solid var(--ui-linea);
  border-radius:var(--r);background:var(--ui-fondo-tarjeta);display:block}
img.elDocumento{height:auto;max-height:min(74vh,760px);object-fit:contain}
.sinArchivo,.pideBoveda{padding:var(--e4);border:1px dashed var(--ui-linea);
  border-radius:var(--r)}
.pideBoveda form{margin-top:var(--e3)}

.deLaPagina{margin-top:var(--e3)}
.deLaPagina > h3{font:var(--tipo-secundario);font-weight:600;letter-spacing:.08em;
  text-transform:uppercase;color:var(--ui-texto-secundario);margin:0 0 6px;
  display:flex;gap:var(--e2);align-items:baseline}
.losCampos{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--e2)}
.unCampo{display:flex;flex-direction:column;gap:2px;padding:var(--e2);
  border-radius:var(--r);background:var(--ui-fondo-alterno);min-width:0}
.unCampo .deQue{font:var(--tipo-secundario);color:var(--ui-texto-secundario)}
.unCampo .dice{font-weight:500;overflow-wrap:anywhere}
.unCampo .cuanSeguro{font:var(--tipo-secundario);font-size:12px;
  color:var(--ui-texto-secundario);font-style:italic}
/* ⚠️ El fragmento es lo que hace comprobable el dato (§3.13): va con la marca de cita a la
   izquierda para que se lea como lo que es —lo que dice el papel— y no como una nota
   nuestra. */
.unCampo .deDonde{margin:4px 0 0;padding-left:var(--e2);
  border-left:2px solid var(--marca-laton);
  font:var(--tipo-secundario);color:var(--ui-texto-secundario);overflow-wrap:anywhere}
.unCampo .sinFragmento{font-size:12px;font-style:italic}
.losDocs a.enBoveda{color:var(--ui-texto);text-decoration:none;font-weight:500}
.losDocs a.enBoveda:hover{text-decoration:underline}

@media (max-width:900px){
  /* El documento arriba y lo leído abajo: en una columna angosta, dos paneles de 50 % no
     dejan leer ninguno de los dos. */
  .dosDelVisor{grid-template-columns:1fr}
  .elDocumento{height:min(60vh,520px)}
}

/* ── El sobre de un correo ───────────────────────────────────────────────────────────────
   De quién es y cuándo llegó, igual en las seis pantallas que enseñan correos. Antes cada
   una lo resolvía a su manera y la misma persona parecía dos.

   ⚠️ La jerarquía es la del ojo y NO la que había en `/asignar`, donde el remitente y la
   fecha iban en versalitas de 9px y el asunto en la línea gruesa — se leía al revés de como
   se busca. Quien escribe es lo primero que se mira. */
.sobreCorreo{display:block}
.sobreCorreo .deQuien{display:flex;align-items:baseline;justify-content:space-between;
  gap:var(--e3);flex-wrap:wrap}
.sobreCorreo .nom{font:500 15px/1.35 var(--marca-texto);color:var(--ui-texto)}
/* ⚠️ LA FECHA NO VA EN MAYÚSCULAS, y no es una preferencia.
   Una etiqueta en versalitas nombra una SECCIÓN —«TIEMPO ESTIMADO», «EMPEZAR AQUÍ»— y ahí
   está bien: es un letrero. Una fecha es CONTENIDO, y «14 DE SEPTIEMBRE · HACE 3 DÍAS»
   repetido en cada una de cien tarjetas grita cien veces algo que nadie escribe así. En
   minúsculas se lee de un vistazo y deja de competir con el nombre de al lado. */
.sobreCorreo .cuando{font:400 12.5px/1.35 var(--marca-texto);
  color:var(--ui-texto-secundario);white-space:nowrap;
  font-variant-numeric:tabular-nums}
.sobreCorreo .cuando.urge{color:var(--ui-rojo)}
/* La dirección cruda, debajo y en chico: sirve para saber de qué casa es, no para leerse. */
.sobreCorreo .dir{font:400 12.5px/1.4 var(--marca-texto);color:var(--ui-texto-secundario);
  margin:2px 0 0;word-break:break-word}
.sobreCorreo .asuntoCorreo{font:400 15px/1.45 var(--marca-texto);color:var(--ui-texto);
  margin:var(--e2) 0 0}
/* El resumen: la línea que el modelo escribió al entenderlo. Se paga; se enseña. */
.sobreCorreo .resumenCorreo{font:var(--tipo-secundario);color:var(--ui-texto-secundario);
  margin:var(--e1) 0 0}

/* ── Separar de lo de arriba ─────────────────────────────────────────────────────────────
   Había 14 `style="margin-top:var(--eN)"` escritos a mano en la pantalla principal. Usaban
   el token bien, pero no existía una clase para «sepárate de lo de arriba», así que se
   escribía a mano cada vez — y un atributo de estilo es donde las excepciones se esconden.
   Tres pasos, que son los tres que se usaban. */
.separa{margin-top:var(--e3)}
.separa-mas{margin-top:var(--e4)}
.separa-mucho{margin-top:var(--e5)}

/* ── El monograma ────────────────────────────────────────────────────────────────────────
   La marca visual de un cliente, generada de su nombre. El porqué —y por qué NO son
   fotografías de destinos— está en `el-monograma.ts`.

   Cuadrado y no círculo: el brandboard es un sistema de filetes y rectángulos, y un círculo
   aquí sería la misma excepción sin nombre que este cambio vino a quitar. */
.monograma{display:inline-flex;align-items:center;justify-content:center;flex:none;
  font:600 11px/1 var(--marca-texto);letter-spacing:.08em;
  border-radius:var(--r);width:28px;height:28px;user-select:none}
.monograma.grande{width:44px;height:44px;font-size:15px;letter-spacing:.1em}

/* ══════════════════════════════════════════════════════════════════════════════════════
   EL PULGAR NECESITA 44 PÍXELES, Y CUATRO CONTROLES NO LLEGABAN

   Medido en la pantalla del viaje a 390 px —un iPhone 14— con la misma función que sirve
   el servidor: cuatro controles por debajo de 40 px de alto. El peor, «← Viajes» con 17:
   es la liga con la que se sale de la pantalla, o sea la que más veces va a tocar, y era
   la más chica de todas.

   No es una cifra inventada: Apple pide 44×44 pt desde hace quince años, y por debajo de
   eso el dedo falla y toca lo de al lado. En una lista de correos, tocar lo de al lado
   significa abrir el viaje equivocado.

   ⚠️ SÓLO EN APARATOS TÁCTILES, y por `hover: none` como todo lo demás de este archivo —
   no por ancho de pantalla, que fue el error que ya se corrigió en las pistas. Con ratón
   estos tamaños están bien y agrandarlos estropearía la composición.

   ⚠️ Y SE CRECE HACIA ADENTRO, con `min-height` y centrado, no con `padding` suelto: el
   padding movería todo lo de abajo y la pantalla se vería distinta en el teléfono por una
   razón que no tiene nada que ver con el teléfono.
   ══════════════════════════════════════════════════════════════════════════════════════ */
@media (hover: none){
  /* ═══════════════════════════════════════════════════════════════════════════
     EL PISO DEL PULGAR, UNA VEZ, PARA TODO LO QUE SE APRIETA.
     ═══════════════════════════════════════════════════════════════════════════
     Medido a 390 px con el toque emulado de verdad: 581 controles medían menos de
     44 px, repartidos en quince clases. Arreglarlos uno por uno es cómo se gana el
     defecto de mañana — la clase nueva que nadie se acuerda de incluir.

     Un botón, un `select`, un campo y un `summary` son SIEMPRE un control discreto:
     no viven dentro de un párrafo, no hay caso en que quepan en menos. Así que el
     piso va aquí, sobre el elemento, y no sobre una lista de clases.

     ⚠️ LAS LIGAS NO ENTRAN en esta regla, y es a propósito: una liga sí vive dentro
     de un párrafo, y darle 44 px de alto a «ver el viaje» en medio de una frase
     infla la prosa. Las ligas que son RENGLONES —no palabras— se arreglan donde se
     arma ese renglón.

     Los dos que más caro cuestan salieron de aquí y merecen nombrarse: «Sí, es la
     misma» medía 27 px y es donde decide si dos expedientes son la misma persona
     —un dedazo FUSIONA dos clientes—, y «Esto no es cierto» medía 32 px y es con lo
     único que ella avisa de un falso positivo. En un producto cuya primera promesa
     es cero falsos positivos, ése es el último botón que puede costar trabajo. */
  button,
  select,
  summary,
  [role="button"],
  input:not([type="hidden"]):not([type="checkbox"]):not([type="radio"]){
    min-height:44px;
  }
  /* Un botón con `min-height` y sin alinear deja su texto pegado arriba. */
  button,[role="button"]{display:inline-flex;align-items:center;justify-content:center}

  .deVuelta a,
  details>summary,
  .volver a{
    min-height:44px;
    display:inline-flex;align-items:center;gap:6px;
  }
  /* El `<summary>` con `display:flex` pierde el triangulito que pone el navegador. Donde
     ya se quitaba a propósito no cambia nada; donde no, se repone con el mismo signo que
     esta plataforma ya usa para plegar y desplegar. */
  details>summary::marker,
  details>summary::-webkit-details-marker{display:none}
  details>summary::before{content:'+';color:var(--ui-texto-secundario);font-weight:400}
  details[open]>summary::before{content:'−'}
  /* Los que ya traían su propio signo no llevan dos. */
  .llenarPasajero>summary::before,
  .cuales>summary::before{content:none}
}

/* La pantalla del Verificador. Todo sale de tokens.css: aquí no hay un solo color literal. */
*{box-sizing:border-box}
body{background:var(--ui-fondo);color:var(--ui-texto);font:var(--tipo-cuerpo);
  margin:0;padding:var(--e4) var(--e3) var(--e6)}
.verificador{width:100%;display:flex;flex-direction:column;gap:var(--e4)}
.cab{display:flex;flex-direction:column;gap:var(--e2);
  border-bottom:1px solid var(--ui-linea);padding-bottom:var(--e3)}
/* Una cabecera que además lleva su veredicto a la derecha. `.tira` la pone en fila; sin
   esto ganaba el `column` de arriba y el veredicto caía debajo del título, alineado a la
   izquierda, que es justo donde no se lee. */
/* ⚠️ REJILLA, NO FILA QUE SE ENVUELVE.
 *
 * Con `flex-wrap`, un título largo —«Agenda | Semana del 7 al 11 de septiembre»— se lleva
 * el renglón entero y el veredicto se cae debajo, suelto y sin alinear. Visto en un viaje
 * real: «No pude revisar lo suficiente» quedaba flotando a media pantalla.
 *
 * Con dos columnas, el título se envuelve DENTRO de la suya y el veredicto se queda donde
 * tiene que estar. `minmax(0,1fr)` es lo que le permite encogerse: sin el 0, una palabra
 * larga fija el ancho mínimo y vuelve a empujar. */
.cab.tira{display:grid;grid-template-columns:minmax(0,1fr) auto;
  align-items:baseline;gap:var(--e3) var(--e4);flex-wrap:nowrap}
.cab.tira > div{display:flex;flex-direction:column;gap:var(--e1);min-width:0}
.cab.tira .der{align-items:flex-end;text-align:right}
.cab.tira p{margin:0}
@media (max-width:900px){
  .cab.tira{grid-template-columns:1fr}
  .cab.tira .der{align-items:flex-start;text-align:left}
}
/* Lleva el cliente, la fecha, los pasajeros y el destino del viaje: eso es contenido, no
   un letrero de sección, y en versalitas espaciadas se lee como el membrete de un acta. */
.momento{font:400 12.5px/1.4 var(--marca-texto);
  color:var(--ui-texto-secundario);margin:0}
.cab h1{font:var(--tipo-titulo);margin:0;text-wrap:balance}
.veredicto{font:var(--tipo-seccion);margin:0}
.rojo .veredicto{color:var(--ui-rojo)} .ambar .veredicto{color:var(--ui-ambar)}
.verde .veredicto{color:var(--ui-verde)} .sin_cobertura .veredicto{color:var(--ui-texto-secundario)}
.cobertura,.cuenta{font:var(--tipo-secundario);color:var(--ui-texto-secundario);margin:0}
.cuenta b{font-weight:500} .cuenta .r{color:var(--ui-rojo)} .cuenta .a{color:var(--ui-ambar)}

.reglas{display:flex;flex-direction:column;gap:var(--e2)}
.regla{background:var(--ui-fondo-tarjeta);border:1px solid var(--ui-linea-tenue);
  border-left:3px solid var(--ui-linea);border-radius:var(--r);
  padding:var(--e3);display:flex;flex-direction:column;gap:var(--e2)}
.regla.rojo{border-left-color:var(--ui-rojo);background:var(--ui-rojo-fondo)}
.regla.ambar{border-left-color:var(--ui-ambar);background:var(--ui-ambar-fondo)}
.regla.verde{border-left-color:var(--ui-verde)}
.regla.gris{border-left-color:var(--ui-linea);background:var(--ui-sin-cobertura-fondo);opacity:.82}
.regla header{display:flex;align-items:baseline;gap:var(--e2);margin:0}
.regla h3{font:400 19px/1.3 var(--marca-display);margin:0;flex:1}
/* Qué hace este hallazgo, dicho en una palabra. El color lo dice y la palabra lo confirma:
   un semáforo sin texto obliga a acordarse de qué significa cada tono. */
.que-hace{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;white-space:nowrap}
.regla.rojo .que-hace{color:var(--ui-rojo)}
.regla.ambar .que-hace{color:var(--ui-ambar)}
.regla .id{font:var(--tipo-etiqueta);letter-spacing:.2em;color:var(--ui-texto-secundario)}
.hallazgo{display:flex;flex-direction:column;gap:var(--e1)}
.ht{font-weight:500;margin:0}
.hd{font:var(--tipo-secundario);color:var(--ui-texto-secundario);margin:0}
.ev{display:flex;flex-direction:column;gap:3px;margin-top:var(--e2);
  padding-top:var(--e2);border-top:1px dashed var(--ui-linea-tenue);font:var(--tipo-secundario)}
/* Las tres líneas de evidencia en rejilla y no en línea corrida: con `inline-block` el
   texto largo se envolvía DEBAJO de su propia etiqueta y las tres dejaban de leerse como
   una tabla de tres renglones, que es lo que son. */
.ev p{margin:0;display:grid;grid-template-columns:78px 1fr;gap:var(--e2);align-items:baseline}
.ev .k{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);text-transform:uppercase;
  color:var(--ui-texto-secundario)}
.ev blockquote{margin:var(--e1) 0 0;padding:var(--e2);background:var(--ui-fondo-alterno);
  border-radius:var(--r);font:var(--tipo-secundario);white-space:pre-wrap;overflow-x:auto}
.pie{border-top:1px solid var(--ui-linea);padding-top:var(--e2);
  font:var(--tipo-secundario);color:var(--ui-texto-secundario)}
.pie p{margin:0}

/* ── La cita que lleva al documento ──────────────────────────────────────────
 * La liga cubre la cita entera, no un iconito al lado: lo que ella quiere tocar es el texto
 * que está leyendo, y un blanco de un renglón de alto se acierta sin apuntar.
 * `display:block` para que el blanco sea de verdad todo el bloque y no sólo las letras. */
.ev blockquote:has(.citaLiga){padding:0}
.citaLiga{display:block;padding:var(--e2);color:inherit;text-decoration:none;
  border-radius:var(--r);border:1px solid transparent}
.citaLiga:hover{border-color:var(--ui-linea);background:var(--ui-fondo-tarjeta)}
/* «Ver en …, p. 3» es información —dice a dónde va—, así que se lee siempre, no sólo al
 * pasar el ratón: en un teléfono no hay ratón que pasar. */
.citaLiga .deDonde{display:block;margin-top:var(--e1);
  font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);text-transform:uppercase;
  color:var(--ui-acento);white-space:normal}

/* ── La pantalla del día ─────────────────────────────────────────────────────
 * Mismos tokens. La jerarquía la carga el orden y el filete, no el color:
 * pintar todo de rojo es cómo el rojo deja de significar algo.            */
.dia{width:100%;display:flex;flex-direction:column;gap:var(--e4)}
.dia .cab{display:flex;flex-direction:column;gap:var(--e1);
  border-bottom:1px solid var(--ui-linea);padding-bottom:var(--e3)}
.dia .fecha{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);margin:0}
.dia h1{font:var(--tipo-titulo);margin:0;text-wrap:balance}
.dia .g{display:flex;flex-direction:column;gap:var(--e2)}
.dia .g h2{font:var(--tipo-seccion);margin:0 0 var(--e1)}
.dia .p1 h2{color:var(--ui-rojo)}
.dia .p2 h2{color:var(--ui-rojo)}
.dia .p3 h2{color:var(--ui-ambar)}
.dia .p4 h2{color:var(--ui-texto-secundario)}
.dia .r{background:var(--ui-fondo-tarjeta);border:1px solid var(--ui-linea-tenue);
  border-left:3px solid var(--ui-linea);border-radius:var(--r);padding:var(--e3);
  display:flex;flex-direction:column;gap:2px}
.dia .p1 .r,.dia .p2 .r{border-left-color:var(--ui-rojo)}
.dia .p3 .r{border-left-color:var(--ui-ambar)}
.dia .r.urge{background:var(--ui-rojo-fondo)}
.dia .r .v{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);margin:0 0 var(--e1)}
.dia .r .t{font-weight:500;margin:0}
.dia .r .q{font:var(--tipo-secundario);color:var(--ui-texto-secundario);margin:0}
.dia .pie{border-top:1px solid var(--ui-linea);padding-top:var(--e2);
  font:var(--tipo-secundario);color:var(--ui-texto-secundario);
  display:flex;flex-direction:column;gap:var(--e1)}
.dia .pie p{margin:0}

/* ⚠️ `hidden` TIENE QUE GANARLE A `display`.
 *
 * El navegador trae `[hidden]{display:none}`, pero cualquier regla nuestra con un selector
 * de clase —`.corredor .cosa{display:flex}`— le gana por especificidad, y entonces el
 * atributo `hidden` deja de esconder nada.
 *
 * Se vio mirando el corredor de tandas: enseñaba las tres cosas a la vez cuando debía
 * enseñar una. La pantalla entera existe para enseñar una sola cosa, así que el defecto no
 * era cosmético — anulaba la pantalla.
 */
[hidden] { display: none !important; }

/* ── EL VERIFICADOR, EN DOS COLUMNAS ─────────────────────────────────────────
 * A la izquierda lo que encontró: es a lo que hay que hacerle algo, y cada
 * hallazgo lleva su botón adentro. A la derecha lo que salió limpio y lo que no
 * se pudo mirar — hay que decirlo (decisión 001) pero no es tarea suya.       */
.verificador .loQueEncontre,.verificador .alCostado{
  display:flex;flex-direction:column;gap:var(--e2)}
/* Los bloques que se mudaron al costado traían su propio margen de cuando vivían
   sueltos abajo. Dentro de una columna con `gap`, ese margen los desalinea. */
.verificador .alCostado > .aldia,
.verificador .alCostado > .papeles{margin-top:0;width:100%}
.verificador .alCostado > .papeles + .volver{display:none}

/* Lo que salió limpio: una lista, no trece tarjetas. Es buena noticia y no
   necesita el mismo espacio que un problema. */
ul.limpias{margin:0;padding-left:1.1em;font:var(--tipo-secundario);
  color:var(--ui-texto-secundario);display:flex;flex-direction:column;gap:2px}

/* «Escribirle sobre esto». Es el botón principal del hallazgo: lo otro que hay
   —«esto no es cierto»— es una corrección, no una salida. */
.pedir-caja{margin-top:var(--e2)}
.pedir{font:var(--tipo-secundario);font-weight:600;cursor:pointer;
  background:var(--ui-texto);color:var(--ui-texto-inverso);border:1px solid transparent;
  border-radius:var(--r);padding:9px var(--e3);min-height:var(--toque-min)}
.pedir:hover{opacity:.88}
.pedir:disabled{opacity:.6;cursor:default}

/* Los títulos de los bloques que se mudaron al costado. Venían en Cormorant grande de
   cuando eran secciones sueltas de página completa; dentro de la columna compiten con el
   título del viaje, que es el único que debe verse como título. */
.verificador .alCostado h2{font:var(--tipo-etiqueta);letter-spacing:.24em;
  text-transform:uppercase;color:var(--ui-texto-secundario);margin:0 0 var(--e2)}
/* Aire entre grupos del costado. El `gap` de la columna basta entre tarjetas; entre un
   grupo y el encabezado del siguiente hace falta el doble o se leen como uno solo. */
.verificador .alCostado h5:not(:first-child){margin-top:var(--e3)}

/* ══ EL VIAJE ════════════════════════════════════════════════════════════════════════════
   Quiénes van y qué compraron. Iba antes que la lista de papeles a propósito: el nombre
   del PDF es cómo se comprueba, no lo que se vino a ver. */

.quienesVan,.elItinerario{margin-bottom:var(--e4)}
.quienesVan h3,.elItinerario h3{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);margin:0 0 var(--e2);
  display:flex;align-items:baseline;justify-content:space-between;gap:var(--e2)}

.pasajero{border-top:1px solid var(--ui-linea-tenue);padding:var(--e3) 0}
.pasajero:last-child{border-bottom:1px solid var(--ui-linea-tenue)}
.pasajero .nom{font:400 17px/1.25 var(--marca-display);margin:0;color:var(--ui-texto)}
.pasajero .et.menor{background:var(--ui-fondo-alterno);padding:2px 6px;border-radius:var(--r);
  color:var(--ui-texto-secundario);vertical-align:2px}

/* Los datos en pares etiqueta/valor: es una ficha, no prosa. `auto-fit` para que dos datos
   no dejen dos columnas vacías al lado. */
.datosPasajero{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));
  gap:var(--e2) var(--e3);margin:var(--e2) 0 0}
.datosPasajero div{min-width:0}
.datosPasajero dt{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}
.datosPasajero dd{margin:2px 0 0;font:var(--tipo-secundario);color:var(--ui-texto);
  font-variant-numeric:tabular-nums;word-break:break-word}
.datosPasajero dd.mal{color:var(--ui-rojo)}

/* ⚠️ Lo que falta NO se pinta de rojo. Ocho de cada diez pasajeros no traen hoja de datos:
   un muro rojo en cuatro de cada cinco fichas enseña a ignorar el rojo, y entonces el
   pasaporte que SÍ está por vencer se pierde entre el ruido. Va en gris, y en su renglón. */
.pasajero .falta{font:var(--tipo-secundario);color:var(--ui-texto-secundario);
  margin:var(--e2) 0 0;border-left:2px solid var(--ui-linea);padding-left:var(--e2)}

/* ⚠️ La marca de origen va CHICA y en gris, no de color. Sale en el 85 % de los datos que
   ella llene, y una insignia de color repetida en cada renglón deja de leerse como origen y
   empieza a leerse como decoración. Lo que tiene que hacer es estar, no gritar. */
.datosPasajero .et.suyo{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);background:var(--ui-fondo-alterno);
  padding:1px 5px;border-radius:var(--r);margin-left:6px;vertical-align:1px}

/* Escribir lo que falta. Plegado: la ficha se lee mucho más de lo que se llena. */
.llenarPasajero{margin:var(--e2) 0 0}
.llenarPasajero>summary{font:var(--tipo-secundario);color:var(--ui-acento);cursor:pointer;
  list-style:none;display:inline-flex;align-items:center;gap:6px;border-radius:var(--r);
  padding:2px 0}
.llenarPasajero>summary::-webkit-details-marker{display:none}
.llenarPasajero>summary::before{content:'+';font:var(--tipo-secundario);
  color:var(--ui-texto-secundario)}
.llenarPasajero[open]>summary::before{content:'−'}
.llenarPasajero>summary:hover{text-decoration:underline}

.camposDeElla{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));
  gap:var(--e2) var(--e3);margin:var(--e2) 0 0;padding:var(--e3);
  background:var(--ui-fondo-alterno);border-radius:var(--r)}
.campoDeElla{display:flex;flex-direction:column;gap:4px;min-width:0}
.campoDeElla span{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}
.campoDeElla input{font:var(--tipo-secundario);color:var(--ui-texto);background:var(--ui-fondo);
  border:1px solid var(--ui-linea);border-radius:var(--r);padding:7px 9px;min-width:0;
  font-variant-numeric:tabular-nums}
.campoDeElla input:focus-visible{outline:2px solid var(--ui-acento);outline-offset:1px}

/* El botón y el aviso ocupan el renglón entero: son de la caja, no de un campo. */
.camposDeElla .guardarPasajero{grid-column:1/-1;justify-self:start;font:var(--tipo-secundario);
  color:var(--ui-fondo);background:var(--ui-texto);border:0;border-radius:var(--r);
  padding:8px 16px;cursor:pointer}
.camposDeElla .guardarPasajero:hover{background:var(--ui-acento)}
.camposDeElla .guardarPasajero:disabled{opacity:.5;cursor:default}
.camposDeElla .salida{grid-column:1/-1;margin:0;color:var(--ui-texto-secundario)}

/* ── «No pude revisarlo — esto es lo que falta» ───────────────────────────────────────
   ⚠️ NO VA EN ROJO NI EN ÁMBAR. Sale en 285 de 322 viajes, y un muro de alerta en nueve de
   cada diez pantallas enseña a ignorar la alerta — que es justo lo que no se puede perder
   cuando un pasaporte SÍ está por vencer. Es información, no regaño: gris, como el resto de
   lo que no se pudo mirar. */
.loQueFalta{padding:var(--e3)}
.encabezaFalta{margin:0 0 var(--e3)}
.queFalta{border-top:1px solid var(--ui-linea-tenue);padding:var(--e3) 0}
.queFalta:first-of-type{border-top:0;padding-top:0}
.queFalta:last-child{padding-bottom:0}
.queFalta .ht{margin:0}
.queFalta .hd{margin:var(--e1) 0 0}

/* El número que ordena la lista. Va discreto: es el porqué del orden, no un marcador. */
.queFalta .destraba{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);margin:var(--e2) 0 0;
  font-variant-numeric:tabular-nums}

.queFalta .acciones{display:flex;flex-wrap:wrap;align-items:center;gap:var(--e2);
  margin:var(--e2) 0 0}
.queFalta .oTambien{margin:0}

.noRevise .hd{margin:var(--e1) 0 0}

/* ── Pedir cotización ────────────────────────────────────────────────────────────────── */
.pedirCoti{margin-bottom:var(--e4)}
.pedirCoti h3{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);margin:0 0 var(--e2);
  display:flex;align-items:baseline;justify-content:space-between;gap:var(--e2)}
.pedirCoti>.hd{margin:0 0 var(--e2)}
.pedirCoti .falta{font:var(--tipo-secundario);color:var(--ui-texto-secundario);
  margin:0 0 var(--e2);border-left:2px solid var(--ui-linea);padding-left:var(--e2)}
.lasCuatro{margin:0 0 var(--e2)}
.preguntas{margin:var(--e2) 0 0;padding-left:1.1em}
.preguntas li{font:var(--tipo-secundario);color:var(--ui-texto-secundario);margin:0 0 4px}

/* Un renglón por operador, con su cuenta. La cuenta es el argumento, no un adorno.

   ⚠️ EL TEXTO EN UNA COLUMNA Y EL BOTÓN EN OTRA. La primera versión ponía los tres en una
   fila que envolvía, y el botón caía de renglón o no según lo largo que fuera el correo del
   operador: cuatro renglones seguidos con el botón en cuatro lugares distintos. Una lista se
   recorre con la vista por el borde, y ese borde tiene que estar quieto. */
.unOperador{border-top:1px solid var(--ui-linea-tenue);padding:var(--e3) 0;
  display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:var(--e2) var(--e3)}
.unOperador:last-child{border-bottom:1px solid var(--ui-linea-tenue)}
.unOperador .ht{margin:0;word-break:break-word}
.unOperador .hd{margin:2px 0 0;grid-column:1}
.unOperador>.pedir{grid-column:2;grid-row:1 / span 2;align-self:center}

/* En el teléfono no caben dos columnas: el botón baja y ocupa el ancho, que es lo que se
   toca con el pulgar. */
@media (max-width: 560px){
  .unOperador{grid-template-columns:1fr}
  .unOperador>.pedir{grid-column:1;grid-row:auto;justify-self:start}
}

/* ── Los cinco recados ───────────────────────────────────────────────────────────────
   Misma forma que los pasajeros y los tramos: es una lista más de esta columna, no una
   pieza nueva. Que se vean iguales es el punto — la columna se lee de corrido. */
.losRecados{margin-bottom:var(--e4)}
.losRecados h3{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);margin:0 0 var(--e2);
  display:flex;align-items:baseline;justify-content:space-between;gap:var(--e2)}
.recado{border-top:1px solid var(--ui-linea-tenue);padding:var(--e3) 0;
  display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;
  gap:var(--e2) var(--e3)}
.recado:last-child{border-bottom:1px solid var(--ui-linea-tenue)}
.quienRecado{flex:1 1 240px;min-width:0}
.quienRecado .ht{margin:0}
.quienRecado .hd{margin:2px 0 0;word-break:break-word}
.quienRecado .falta{font:var(--tipo-secundario);color:var(--ui-texto-secundario);
  margin:var(--e2) 0 0;border-left:2px solid var(--ui-linea);padding-left:var(--e2)}

/* ⚠️ «De tu historial» y «revísalo» NO se ven igual. Uno sale de un 84 % y el otro de un
   59 %, y enseñarlos idénticos sería decirle que confíe igual en los dos. */
.quienRecado .et.deducido{background:var(--ui-fondo-alterno);color:var(--ui-texto-secundario)}
.quienRecado .et.dudoso{background:transparent;color:var(--ui-ambar);
  border:1px solid var(--ui-ambar)}
.quienRecado .et.deducido,.quienRecado .et.dudoso{font:var(--tipo-etiqueta);
  letter-spacing:var(--letra-etiqueta);text-transform:uppercase;padding:1px 6px;
  border-radius:var(--r);margin-left:6px;vertical-align:1px}

.recado>.pedir{flex:0 0 auto}

.tramo{border-top:1px solid var(--ui-linea-tenue);padding:var(--e3) 0}
.tramo:last-child{border-bottom:1px solid var(--ui-linea-tenue)}
.tramo .que{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);margin:0}
.tramo .dice{font:400 17px/1.3 var(--marca-display);margin:2px 0 0;color:var(--ui-texto)}
.tramo .cuandoTramo{font-variant-numeric:tabular-nums;margin:var(--e1) 0 0}
.tramo .clave{font-variant-numeric:tabular-nums;letter-spacing:.04em;margin:var(--e1) 0 0}
/* Lo que sólo está cotizado se marca: un renglón sin marca se lee como una reserva, y esa
   confusión se paga en el mostrador. */
.tramo.cotizado{opacity:.72}
.tramo.cotizado .et{background:var(--ui-ambar-fondo);color:var(--ui-ambar);
  padding:2px 6px;border-radius:var(--r);vertical-align:1px}

/* El destino en el encabezado: es lo único de ahí que salió de una deducción y no de un
   campo, así que lleva subrayado punteado — la forma universal de «pásame por encima». */
.verificador .cab .destino{border-bottom:1px dotted var(--ui-linea);cursor:help}

/* ── «← Viajes», la liga con que se sale de aquí ──────────────────────────────────────
   ⚠️ NO TENÍA UN SOLO ESTILO. Salía en el azul subrayado del navegador, en la pantalla que
   es el producto y en todas las de su clase. Una liga azul de página web dentro de esta
   paleta se lee como un error de carga, no como el camino de regreso. */
.deVuelta{margin:0 0 var(--e3)}
.deVuelta a{color:var(--ui-texto-secundario);text-decoration:none;
  font:var(--tipo-secundario);border-radius:var(--r)}
.deVuelta a:hover{color:var(--ui-texto);text-decoration:underline}

/* ── El borrador de la propuesta ──────────────────────────────────────────────
 * Tiene que verse como las suyas, no como esta app: es el único documento del
 * sistema que sale con SU nombre encima y lo lee un cliente que paga entre
 * $50,000 y $150,000. Cormorant para el cuerpo (las suyas son así), Raleway
 * sólo en las versalitas.                                                     */
.prop{max-width:760px;margin:0 auto;display:flex;flex-direction:column;gap:var(--e4)}

/* La portada: rúbrica en versalitas espaciadas, título, subtítulo en cursiva,
   la foto ancha, y la banda de dos o tres cifras.                             */
.prop .portada{display:flex;flex-direction:column;gap:var(--e2);text-align:center;
  padding-bottom:var(--e3);border-bottom:1px solid var(--ui-linea)}
.prop .rubrica{font:400 10px/1 var(--marca-texto);letter-spacing:.34em;
  text-transform:uppercase;color:var(--ui-texto-secundario);margin:0}
.prop .portada h1{font:300 40px/1.05 var(--marca-display);margin:0}
.prop .sub{font:300 italic 19px/1.35 var(--marca-display);
  color:var(--ui-texto-secundario);margin:0}

/* El lugar de la foto. No se pone una de archivo: una imagen genérica en una
   propuesta de lujo se nota más que no tenerla.                               */
.prop .foto{border:1px dashed var(--ui-linea);border-radius:var(--r);
  aspect-ratio:16/7;display:flex;align-items:center;justify-content:center;
  font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);text-transform:uppercase;
  color:var(--ui-texto-secundario);background:var(--ui-fondo-alterno)}

.prop .banda{display:flex;justify-content:center;gap:var(--e4);flex-wrap:wrap;
  border-top:1px solid var(--ui-linea-tenue);padding-top:var(--e3);margin-top:var(--e2)}
.prop .banda div{display:flex;flex-direction:column;gap:3px;align-items:center}
.prop .banda .et{font:500 8.5px/1 var(--marca-texto);letter-spacing:.16em;
  text-transform:uppercase;color:var(--ui-texto-secundario)}
.prop .banda .dato{font:400 17px/1.15 var(--marca-display)}

/* Las opciones: la carne del documento. Cada una con su precio a la derecha. */
.prop .opcion{border:1px solid var(--ui-linea);border-radius:var(--r);
  padding:var(--e3);background:var(--ui-fondo-tarjeta);
  display:flex;flex-direction:column;gap:var(--e1)}
.prop .opcion header{display:flex;justify-content:space-between;align-items:baseline;
  gap:var(--e3);flex-wrap:wrap}
.prop .opcion h2{font:400 21px/1.2 var(--marca-display);margin:0}
.prop .opcion .precio{font:400 19px/1 var(--marca-display);
  font-variant-numeric:tabular-nums;white-space:nowrap}
.prop .opcion .detalle{font-size:14px;color:var(--ui-texto-secundario);margin:0}
.prop .opcion ul{margin:0;padding-left:1.1em;font-size:14px;display:flex;
  flex-direction:column;gap:2px}

/* El cierre: próximos pasos, firma, tres contactos, letra chica.              */
.prop .cierre{border-top:1px solid var(--ui-linea);padding-top:var(--e3);
  display:flex;flex-direction:column;gap:var(--e2)}
.prop .cierre h2{font:400 22px/1.2 var(--marca-display);margin:0}
.prop .contactos{display:flex;gap:var(--e3);flex-wrap:wrap;font-size:14px;margin:0}
.prop .credito,.prop .chica{font-size:12px;color:var(--ui-texto-secundario);margin:0}
.prop .rubricafirma{font:400 17px/1.2 var(--marca-display);margin:0}

/* Un hueco tiene que ESTORBAR. Es lo mismo que en el FFP-03 y por lo mismo:
   un espacio en blanco se lee como si no hiciera falta.                       */
.prop .hueco{display:inline-block;min-width:140px;border-bottom:1px dashed var(--ui-rojo);
  height:1em;vertical-align:baseline}
/* Un hueco grande sin nombre son dos cajas idénticas donde no se sabe cuál es cuál.
   El texto va en `content` para que NO se imprima: es una instrucción para ella. */
.prop .hueco.bloque{display:flex;align-items:center;justify-content:center;
  min-height:2.2em;border:1px dashed var(--ui-rojo);border-radius:var(--r);width:100%}
.prop .hueco.bloque::before{content:attr(data-pone);font:var(--tipo-etiqueta);
  letter-spacing:var(--letra-etiqueta);text-transform:uppercase;color:var(--ui-rojo)}
@media print{.prop .hueco.bloque::before{content:''}}

/* Lo de antes de mandarla. No se imprime: es para ella, no para el cliente.   */
.antes-prop{max-width:760px;margin:0 auto var(--e4);border:1px solid var(--ui-linea);
  border-left:3px solid var(--ui-rojo);border-radius:var(--r);padding:var(--e3);
  background:var(--ui-fondo-tarjeta);display:flex;flex-direction:column;gap:var(--e2)}
.antes-prop .et{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);margin:0}
.antes-prop p{margin:0;font-size:14px}
.antes-prop .rep{border-left:2px solid var(--ui-rojo);padding-left:var(--e2)}
.antes-prop ul{margin:0;padding-left:1.2em;font-size:14px;display:flex;
  flex-direction:column;gap:3px;color:var(--ui-texto-secundario)}
.antes-prop .tipos{display:flex;gap:var(--e1);flex-wrap:wrap}
.antes-prop .tipos a{font-size:13px;border:1px solid var(--ui-linea);border-radius:var(--r);
  padding:3px 10px;text-decoration:none;color:var(--ui-texto)}
.antes-prop .tipos a.puesto{background:var(--ui-fondo-inverso);color:var(--ui-texto-inverso);
  border-color:var(--ui-fondo-inverso)}

@media print{
  .no-print{display:none!important}
  .prop{max-width:none}
}

/* La lista de huecos, plegada por clase. Ver `huecosAgrupados`: un pedido de 42 opciones
   producía 84 renglones casi idénticos en el panel que ella lee antes de mandar. */
.antes-prop .cuales>summary{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);cursor:pointer;
  list-style:none;padding:2px 0}
.antes-prop .cuales>summary::-webkit-details-marker{display:none}
.antes-prop .cuales>summary::before{content:'+ '}
.antes-prop .cuales[open]>summary::before{content:'− '}
.antes-prop .cuales ul{margin:4px 0 var(--e2);padding-left:1.1em}

/* Lo que sólo existe en el servidor: la subida y la lista. Sin un color literal. */

.subir{width:100%;display:flex;flex-direction:column;gap:var(--e4)}

.zona{border:1px dashed var(--ui-linea);border-radius:var(--r);
  padding:var(--e6) var(--e3);text-align:center;
  display:flex;flex-direction:column;align-items:center;gap:var(--e2);
  transition:border-color .15s,background .15s}
.zona.encima{border-color:var(--ui-verde);background:var(--ui-fondo-alterno)}
.zona.trabajando{opacity:.55;pointer-events:none}

.grande{font:var(--tipo-cuerpo);font-weight:500;
  background:var(--ui-texto);color:var(--ui-texto-inverso);
  border:0;border-radius:var(--r);padding:var(--e2) var(--e4);cursor:pointer}
.grande:hover{opacity:.88}
.pista{font:var(--tipo-secundario);color:var(--ui-texto-secundario);margin:0}

.estado{font:var(--tipo-secundario);color:var(--ui-texto-secundario);margin:0;text-align:center}
.estado.mal{color:var(--ui-rojo)}

.recientes{display:flex;flex-direction:column;gap:var(--e2)}
.recientes h2{font:var(--tipo-seccion);margin:0}
.racha{font:var(--tipo-secundario);color:var(--ui-texto-secundario);margin:0}
.racha b{color:var(--ui-verde);font-weight:500}
.recientes ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--e1)}
.recientes a{display:flex;align-items:center;gap:var(--e2);
  padding:var(--e2);border-radius:var(--r);text-decoration:none;color:inherit;
  border:1px solid var(--ui-linea-tenue)}
.recientes a:hover{background:var(--ui-fondo-alterno)}
.recientes .pt{width:8px;height:8px;border-radius:50%;background:var(--ui-linea);flex:none}
.recientes .rojo .pt{background:var(--ui-rojo)}
.recientes .ambar .pt{background:var(--ui-ambar)}
.recientes .verde .pt{background:var(--ui-verde)}
.recientes .doc{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.recientes .ver{font:var(--tipo-secundario);color:var(--ui-texto-secundario);flex:none}

.volver{width:100%;margin-top:var(--e4);text-align:center;font:var(--tipo-secundario)}
.volver a{color:var(--ui-texto-secundario)}

/* Una mano, pulgar, botones abajo (§3.9). */
@media (max-width:520px){
  .zona{padding:var(--e5) var(--e2)}
  .grande{width:100%;padding:var(--e3)}
  /* El veredicto NO se esconde: sin él sólo queda un punto de color sin etiqueta, y ella
     no puede saber de un vistazo si algo está mal. Se acomoda debajo del nombre. */
  .recientes a{flex-wrap:wrap}
  .recientes .doc{flex:1 1 auto;min-width:0}
  .recientes .ver{flex:1 0 100%;padding-left:calc(8px + var(--e2))}
}

.papeles{width:100%;margin-top:var(--e4);display:flex;flex-direction:column;
  gap:var(--e2);border-top:1px solid var(--ui-linea);padding-top:var(--e3)}
.papeles h2{font:var(--tipo-seccion);margin:0}
.papeles ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}
.papeles li{font:var(--tipo-secundario);color:var(--ui-texto-secundario)}
.papeles li::before{content:"— ";}
.papeles .grande{align-self:flex-start}

.borradores{width:100%;margin-top:var(--e4);display:flex;flex-direction:column;
  gap:var(--e2);border-top:1px solid var(--ui-linea);padding-top:var(--e3)}
.borradores h2{font:var(--tipo-seccion);margin:0}
.borrador{background:var(--ui-fondo-tarjeta);border:1px solid var(--ui-linea-tenue);
  border-radius:var(--r);padding:var(--e3);display:flex;flex-direction:column;gap:var(--e2)}
.borrador.llamada{background:var(--ui-ambar-fondo);border-left:3px solid var(--ui-ambar)}
.borrador header{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--e1) var(--e2)}
.borrador .motivo{font-weight:500;flex:1;min-width:12ch}
.borrador .quien{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}
.borrador .texto{background:var(--ui-fondo);border:1px solid var(--ui-linea-tenue);
  border-radius:var(--r);padding:var(--e2);display:flex;flex-direction:column;gap:var(--e1)}
.borrador .texto p{margin:0}
.borrador .asunto{font-weight:500;padding-bottom:var(--e1);
  border-bottom:1px solid var(--ui-linea-tenue)}
.borrador mark.hueco{background:var(--ui-rojo-fondo);color:var(--ui-rojo);
  border-radius:3px;padding:0 3px;font-weight:500}
.borrador .huecos{font:var(--tipo-secundario);color:var(--ui-rojo);margin:0}
.copiar{align-self:flex-start;font:var(--tipo-secundario);font-weight:500;
  background:transparent;color:var(--ui-texto);cursor:pointer;
  border:1px solid var(--ui-linea);border-radius:var(--r);padding:6px var(--e2)}
.copiar:hover{background:var(--ui-fondo-alterno)}

.ir-a-hoy{margin:0;font:var(--tipo-secundario)}
.ir-a-hoy a{color:var(--ui-texto)}

.entrar{display:flex;flex-direction:column;gap:var(--e4)}
.entrar .cab{border:0;padding:0;text-align:center}
.entrar .zona{border:0;padding:0;gap:var(--e3)}
.entrar input{font:var(--tipo-cuerpo);width:100%;padding:var(--e2);
  border:1px solid var(--ui-linea);border-radius:var(--r);
  background:var(--ui-fondo);color:var(--ui-texto)}
.entrar input:focus{outline:2px solid var(--ui-texto);outline-offset:1px}
.entrar .grande{width:100%}

/* Un hallazgo que ella marcó como falso: se tacha, no se esconde. */
.hallazgo.es-falso{opacity:.5}
.hallazgo.es-falso .ht{text-decoration:line-through}
.falso{align-self:flex-start;margin-top:var(--e1);
  font:var(--tipo-secundario);background:transparent;color:var(--ui-texto-secundario);
  border:1px solid var(--ui-linea-tenue);border-radius:var(--r);padding:4px 10px;cursor:pointer}
.falso:hover{border-color:var(--ui-linea);color:var(--ui-texto)}
.falso:disabled{opacity:.5;cursor:wait}

/* Lo que todavía no encendemos, detrás de una línea. */
.apagadas{border-top:1px solid var(--ui-linea-tenue);padding-top:var(--e2)}
.apagadas summary{font:var(--tipo-secundario);color:var(--ui-texto-secundario);
  cursor:pointer;padding:var(--e1) 0}
.apagadas summary:hover{color:var(--ui-texto)}
.apagadas .reglas{margin-top:var(--e2)}

/* Lo que la plataforma aprendió de los correos. */
.sabe{width:100%;display:flex;flex-direction:column;gap:var(--e4)}
.sabe section{display:flex;flex-direction:column;gap:var(--e2)}
.sabe h2{font:var(--tipo-seccion);margin:0}
.sabe ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--e2)}
/* ── DOS COLUMNAS, POR EL LARGO DEL RENGLÓN ─────────────────────────────────
 * Estas tarjetas ocupaban los 1180px de ancho, y un párrafo de ese largo no se
 * lee: el ojo pierde el renglón al regresar. En dos columnas cada una queda
 * cerca de los 65 caracteres, y de paso caben ocho en una pantalla en vez de
 * cuatro — que es la mitad del punto de esta lista.                          */
.abierto ul,.dinero .abierto{display:grid;grid-template-columns:1fr 1fr;
  gap:var(--e2);align-items:start}
@media (max-width:900px){.abierto ul,.dinero .abierto{grid-template-columns:1fr}}
.abierto li{background:var(--ui-ambar-fondo);border-left:3px solid var(--ui-ambar);
  border-radius:var(--r);padding:var(--e3);display:flex;
  flex-direction:column;gap:var(--e1)}
.sabe blockquote{font:var(--tipo-secundario);color:var(--ui-texto-secundario);
  margin:0;padding-left:var(--e2);border-left:2px solid var(--ui-linea-tenue)}
.quienes table{width:100%;border-collapse:collapse;font:var(--tipo-secundario)}
.quienes th{text-align:left;font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);
  padding-bottom:var(--e1);border-bottom:1px solid var(--ui-linea)}
.quienes td{padding:6px 0;border-bottom:1px solid var(--ui-linea-tenue)}
.quienes td:first-child{overflow:hidden;text-overflow:ellipsis;max-width:22ch}
.quienes th:not(:first-child),.quienes td:not(:first-child){text-align:right;width:6ch}
.perfil{background:var(--ui-fondo-tarjeta);border:1px solid var(--ui-linea-tenue);
  border-radius:var(--r);padding:var(--e3);display:flex;flex-direction:column;gap:var(--e2)}
.perfil ul{gap:var(--e1)}
.perfil li{font:var(--tipo-secundario)}
.perfil li::before{content:"— "}

.tirar{align-self:flex-start;margin-top:var(--e2);
  font:var(--tipo-secundario);background:transparent;color:var(--ui-texto-secundario);
  border:1px solid var(--ui-linea-tenue);border-radius:var(--r);padding:6px 10px;cursor:pointer}
.tirar:hover{color:var(--ui-rojo);border-color:var(--ui-rojo)}
.tirar.armado{color:var(--ui-rojo);border-color:var(--ui-rojo);font-weight:500}
.tirar:disabled{opacity:.5;cursor:wait}

/* Aprobar y mandar. Lo que sale lleva su nombre encima: el botón pide dos toques. */
.mandar{display:flex;flex-wrap:wrap;align-items:flex-end;gap:var(--e2);
  padding-top:var(--e2);border-top:1px solid var(--ui-linea-tenue)}
.mandar label{flex:1;min-width:16ch;display:flex;flex-direction:column;gap:4px;
  font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}
.mandar input{font:var(--tipo-cuerpo);width:100%;padding:8px var(--e2);
  border:1px solid var(--ui-linea);border-radius:var(--r);
  background:var(--ui-fondo);color:var(--ui-texto);text-transform:none;letter-spacing:normal}
.mandar input:focus{outline:2px solid var(--ui-texto);outline-offset:1px}
.enviar{font:var(--tipo-cuerpo);font-weight:500;cursor:pointer;
  background:var(--ui-texto);color:var(--ui-texto-inverso);
  border:0;border-radius:var(--r);padding:9px var(--e3)}
.enviar:hover{opacity:.88}
.enviar.armado{background:var(--ui-rojo)}
.enviar:disabled{opacity:.45;cursor:not-allowed}
.mandar .nota{flex:1 0 100%;font:var(--tipo-secundario);color:var(--ui-texto-secundario)}
.mandar .nota.mal{color:var(--ui-rojo)}
.borrador.mandado{opacity:.6}
.borrador.mandado .texto{border-style:dashed}

@media (max-width:520px){
  .mandar label{flex:1 0 100%}
  .enviar{width:100%}
}

.lector{font:var(--tipo-secundario);color:var(--ui-texto-secundario);margin:0}
.lector.mal{color:var(--ui-rojo)}
/* ⚠️ Ni rojo ni gris. Rojo dice «está roto» y no lo está — la lista sirve, nada más viene
   con retraso. Gris se lee como pie de página y esto cambia cómo hay que leer la lista. */
.lector.tibio{color:var(--ui-ambar);margin-bottom:var(--e2)}

/* ── La tanda de contestaciones ───────────────────────────────────────────────
 * Uno a la vez, y sólo uno: la lista completa invita a leerlos todos antes de
 * mandar el primero, que es exactamente el rato que esto existe para quitarle. */
.tanda .paso{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);margin:0 0 var(--e2)}

/* Sobre qué correo está contestando. Va arriba y completo. */
.tanda .sobre{border:1px solid var(--ui-linea);border-radius:var(--r);
  padding:var(--e3);background:var(--ui-fondo-alterno);
  display:flex;flex-direction:column;gap:var(--e1);margin-bottom:var(--e3)}
.tanda .quien-fila{display:flex;justify-content:space-between;align-items:baseline;
  gap:var(--e3);flex-wrap:wrap}
.tanda .viaje a{color:var(--ui-texto)}
.tanda .viaje.sin{font-style:italic}

.tanda .redaccion{display:flex;flex-direction:column;gap:var(--e2)}
.tanda .cargando{font-style:italic}
.tanda .asunto-l{display:flex;flex-direction:column;gap:3px;
  font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);text-transform:uppercase;
  color:var(--ui-texto-secundario)}
.tanda .asunto{font:400 15px/1.4 var(--marca-texto);padding:6px 8px;
  border:1px solid var(--ui-linea);border-radius:var(--r);background:var(--ui-fondo-tarjeta)}

/* El borrador marcado. Se LEE aquí y se EDITA en el textarea: un textarea no
 * puede subrayar, y subrayar es la mitad del producto.                        */
.tanda .marcado{border:1px solid var(--ui-linea);border-radius:var(--r);
  padding:var(--e3);background:var(--ui-fondo-tarjeta)}
.tanda .marcado p{margin:0 0 var(--e2)}
.tanda .marcado p:last-child{margin-bottom:0}
.tanda .cuerpo{font:400 15px/1.55 var(--marca-texto);padding:var(--e3);width:100%;
  border:1px solid var(--ui-linea);border-radius:var(--r);
  background:var(--ui-fondo-tarjeta);color:var(--ui-texto);resize:vertical}

/* Las dos marcas. Ámbar = compruébalo. Rojo = dijo que salió de un papel y no
 * está. La diferencia importa: la segunda es un dato inventado.              */
.tanda mark{background:none;padding:0 1px;border-radius:2px;cursor:help}
.tanda mark.verificar{background:var(--ui-ambar-fondo);
  box-shadow:inset 0 -2px 0 var(--ui-ambar)}
.tanda mark.inventado{background:var(--ui-rojo-fondo);color:var(--ui-rojo);
  box-shadow:inset 0 -2px 0 var(--ui-rojo)}

.tanda .acciones{display:flex;gap:var(--e2);flex-wrap:wrap;align-items:center}
.tanda .acciones .grande{flex:1 1 12rem}
.tanda .estado{font-size:14px;color:var(--ui-texto-secundario);margin:0}

/* «Enviar así» cuando hay un dato en rojo: sigue siendo suyo, pero deja de ser el
   camino de menor esfuerzo. */
.tanda .mandar.riesgo{border-color:var(--ui-rojo);color:var(--ui-rojo);background:none}
.tanda .firma-nota{font-style:italic}

/* ── Cómo va la herramienta ───────────────────────────────────────────────────
 * No es un tablero: no hay gráficas ni comparativas. Son cuentas de cosas que
 * o funcionan o no, y el color sólo distingue las tres. §10.5 prohíbe los
 * puntajes, y una tendencia sobre 20–50 clientes al año sería ruido.        */
.salud{width:100%;display:flex;flex-direction:column;gap:var(--e5)}
.salud section{display:flex;flex-direction:column;gap:var(--e3)}
.salud h2{font:var(--tipo-seccion);margin:0}

.salud .latidos{gap:2px}
.salud .latido{display:flex;justify-content:space-between;align-items:baseline;gap:var(--e3);
  flex-wrap:wrap;padding:var(--e3);background:var(--ui-fondo-tarjeta);
  border:1px solid var(--ui-linea);border-radius:var(--r)}
.salud .latido.bien{box-shadow:inset 3px 0 0 var(--ui-verde)}
.salud .latido.revisar{box-shadow:inset 3px 0 0 var(--ui-ambar)}
.salud .latido.mal{box-shadow:inset 3px 0 0 var(--ui-rojo);background:var(--ui-rojo-fondo)}

.rejilla-cifras{display:grid;grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));
  gap:2px;background:var(--ui-linea-tenue)}
.rejilla-cifras > div{background:var(--ui-fondo-tarjeta);padding:var(--e3);
  display:flex;flex-direction:column;gap:3px}
.salud .cifra{font:var(--tipo-cifra);font-variant-numeric:tabular-nums}
.salud .cifra.r{color:var(--ui-rojo)}
.salud .et{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}

/* ── El cierre de mes ─────────────────────────────────────────────────────────
 * La pantalla no tenía una sola regla propia: la tabla salía sin bordes y el
 * bloque de entrega sin separación. §9.4 es lo que más tiempo le quita al mes,
 * y estaba pintada como una nota al pie.                                     */
.cierre{width:100%;display:flex;flex-direction:column;gap:var(--e4)}
.cierre .cab{border:0;padding:0}
.cierre > h1{font:var(--tipo-titulo);margin:0}
.cierre h2{font:var(--tipo-seccion);margin:0 0 var(--e2)}
.cierre p{margin:0}
.cierre h1{margin:0}
.cierre h2{font:var(--tipo-seccion);margin:0}

/* ⚠️ LA TABLA SE DESLIZA EN VEZ DE CORTARSE.
 *
 * Medido en una ventana de 390px: la tabla de `/cobrar` mide 553px, y `.lienzo` lleva
 * `overflow-x:clip` —puesto a propósito, para que las pistas invisibles no creen una barra
 * horizontal en toda la página—. O sea que los 163px que sobran no se deslizaban: SE
 * CORTABAN. Y la columna que se perdía era la última, «Tuya», que es la cifra por la que
 * existe la pantalla.
 *
 * El envoltorio le da su propio deslizamiento a la tabla sin devolverle uno a la página, que
 * es lo que `clip` estaba evitando. `contain-intrinsic-size` no hace falta; lo que sí hace
 * falta es que el borde de la tabla se note como deslizable, y de eso se encarga el degradado
 * de la derecha. */
.tablaAncha{overflow-x:auto;-webkit-overflow-scrolling:touch;max-width:100%}

/* ⚠️ ESTO ERA UNA TABLA DE TRES COLUMNAS, Y A 390px NO SE PODÍA LEER.
 *
 * «Aspen · semana santa» salía partido en tres renglones y «el % de comisión del proveedor
 * (la celda amarilla)» en cuatro, cada uno en su columna de 100px. Una tabla tiene sentido
 * cuando se comparan columnas entre renglones; aquí no se compara nada — es una lista de
 * viajes con lo que le falta a cada uno. La forma estaba mal, no el ancho.
 *
 * Como lista se lee de corrido en el teléfono y sigue cuadrando en la computadora, donde el
 * nombre y el folio comparten renglón y lo que falta va debajo. */
.renglonesHuecos{list-style:none;margin:var(--e2) 0 0;padding:0;
  display:flex;flex-direction:column;gap:var(--e2)}
.renglonesHuecos li{padding-top:var(--e2);border-top:1px solid var(--ui-linea-tenue)}
.renglonesHuecos li:first-child{border-top:0;padding-top:0}
.renglonesHuecos p{margin:0}
.renglonesHuecos .ht{display:flex;gap:var(--e2);align-items:baseline;
  justify-content:space-between;flex-wrap:wrap}
.renglonesHuecos .falta{margin-top:3px;font:var(--tipo-secundario);color:var(--ui-acento)}
.cierre-tabla{width:100%;border-collapse:collapse;font:var(--tipo-secundario)}
.cierre-tabla th{text-align:left;font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);
  padding:0 var(--e2) 6px 0;border-bottom:1px solid var(--ui-linea)}
.cierre-tabla td{padding:8px var(--e2) 8px 0;vertical-align:top;
  border-bottom:1px solid var(--ui-linea-tenue)}
.cierre-tabla .m{font-variant-numeric:tabular-nums;white-space:nowrap}
.cierre-tabla td .hd{margin:2px 0 0}

/* La celda amarilla: donde no se sabe, se dice, y no se pinta un cero. §3.6 */
.cierre-tabla td.hueco{color:var(--ui-ambar);white-space:normal}

.entregar{display:flex;flex-direction:column;gap:var(--e3);
  border-top:1px solid var(--ui-linea);padding-top:var(--e4)}
.entregar .bajar{display:inline-block;font:var(--tipo-cuerpo);font-weight:500;
  background:var(--ui-texto);color:var(--ui-texto-inverso);text-decoration:none;
  border-radius:var(--r);padding:var(--e2) var(--e4)}
.entregar .bajar:hover{opacity:.88}
.entregar > p{margin:0}
.entregar .borrador{max-width:640px}

.cuadrar{display:flex;flex-direction:column;gap:var(--e2);align-items:flex-start;
  background:var(--ui-fondo-tarjeta);border:1px solid var(--ui-linea-tenue);
  border-radius:var(--r);padding:var(--e3)}
.cuadrar .ht,.cuadrar .hd{margin:0}
.cuadrar button{font:var(--tipo-secundario);font-weight:500;background:transparent;
  color:var(--ui-texto);cursor:pointer;border:1px solid var(--ui-linea);
  border-radius:var(--r);padding:6px var(--e2)}
.cuadrar button:hover{background:var(--ui-fondo-alterno)}
.cuadrar .bien{color:var(--ui-verde);font-weight:500}
.cuadrar .mal{color:var(--ui-rojo);font-weight:500}

/* ── A qué viaje va cada cosa ──────────────────────────────────────────────────
 * La cola de «sin asignar» de §6.1, con un lugar donde vaciarla. Cada tarjeta es
 * una decisión suya, así que se ven como decisiones: separadas, con su evidencia
 * y con un solo botón.                                                        */
.asignar{width:100%;display:flex;flex-direction:column;gap:var(--e5)}
.asignar h1{margin:0}
.asignar section{display:flex;flex-direction:column;gap:var(--e3)}
.asignar h2{font:var(--tipo-seccion);margin:0}
.asignar > .hd{margin:0}

.huerfano,.asignar .union{background:var(--ui-fondo-tarjeta);
  border:1px solid var(--ui-linea-tenue);border-radius:var(--r);
  padding:var(--e3);display:flex;flex-direction:column;gap:var(--e2)}
.huerfano header{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--e1) var(--e2)}
.huerfano .motivo{font-weight:500;flex:1;min-width:12ch}
.huerfano .quien{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}
.huerfano p,.asignar .union p{margin:0}
.huerfano .av{color:var(--ui-ambar)}

.huerfano .elegir{display:flex;flex-wrap:wrap;align-items:end;gap:var(--e2)}
.huerfano label{display:flex;flex-direction:column;gap:4px;flex:1;min-width:18ch;
  font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}
.huerfano select{font:var(--tipo-secundario);max-width:100%;
  padding:6px var(--e1);border:1px solid var(--ui-linea);border-radius:var(--r);
  background:var(--ui-fondo);color:var(--ui-texto);text-transform:none;letter-spacing:0}

.asignar button{font:var(--tipo-secundario);font-weight:500;background:transparent;
  color:var(--ui-texto);cursor:pointer;border:1px solid var(--ui-linea);
  border-radius:var(--r);padding:6px var(--e2)}
.asignar button:hover:not(:disabled){background:var(--ui-fondo-alterno)}
.asignar button:disabled{opacity:.5;cursor:default}
/* Juntar dos expedientes mezcla papeles de dos familias si el par está mal.
   El segundo toque se ve distinto para que no sea el mismo gesto. */
.asignar button.armado{background:var(--ui-texto);color:var(--ui-texto-inverso);
  border-color:var(--ui-texto)}
.asignar .salida{margin-left:var(--e2)}
.asignar .salida.mal{color:var(--ui-rojo)}

.asignar .ev{display:flex;flex-wrap:wrap;gap:4px}
.asignar .ev span{background:var(--ui-fondo);border:1px solid var(--ui-linea-tenue);
  border-radius:3px;padding:1px 6px;font-variant-numeric:tabular-nums}

/* Lo ya resuelto no se esconde —se acaba de decidir y desaparecer confunde—
   pero deja de pedir atención. */
.huerfano.listo,.asignar .union.listo{opacity:.55}
.huerfano.listo .elegir,.huerfano.listo .pensar{display:none}

/* ── Cumpleaños, lo que salió mal, y qué le gusta a cada quien ─────────────────
 * Tres cosas que la plataforma sabía y no enseñaba. Van con la misma forma que el
 * resto de /sabe —una tarjeta, su cita debajo— porque son lo mismo: algo que se
 * afirma y de dónde salió (§3.13).                                            */
.sabe .cumples,.sabe .incidentes,.sabe .gustos,
.revision .gustos{display:flex;flex-direction:column;gap:var(--e2)}
.sabe .cumples h2,.sabe .incidentes h2{font:var(--tipo-seccion);margin:0}
.sabe .cumples ul{list-style:none;margin:0;padding:0;display:flex;
  flex-direction:column;gap:var(--e2)}
.sabe .cumples li{background:var(--ui-fondo-tarjeta);border:1px solid var(--ui-linea-tenue);
  border-radius:var(--r);padding:var(--e3)}
.sabe .cumples li p{margin:0}
.sabe .cumples a{color:var(--ui-texto)}
.sabe .incidentes .perfil p{margin:0}

/* El gusto de un cliente, dentro de su viaje. */
.gustos{width:100%;margin-top:var(--e4);
  border-top:1px solid var(--ui-linea);padding-top:var(--e3);
  display:flex;flex-direction:column;gap:var(--e2)}
.gustos h2{font:var(--tipo-seccion);margin:0}
.gustos p{margin:0}
.gustos ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--e2)}
.gustos li{font:var(--tipo-secundario)}
/* La cita va debajo de cada rasgo y en gris: es lo que lo sostiene, no lo que se afirma. */
.gustos blockquote{margin:4px 0 0;padding-left:var(--e2);
  border-left:2px solid var(--ui-linea-tenue);
  font:var(--tipo-secundario);color:var(--ui-texto-secundario)}
.gustos button{font:var(--tipo-secundario);font-weight:500;background:transparent;
  color:var(--ui-texto);cursor:pointer;border:1px solid var(--ui-linea);
  border-radius:var(--r);padding:6px var(--e2)}
.gustos button:hover:not(:disabled){background:var(--ui-fondo-alterno)}
.gustos button:disabled{opacity:.5;cursor:default}
.gustos .mal{color:var(--ui-rojo)}

/* ── En qué va este viaje · y las dudas ───────────────────────────────────────
 * Dos bloques que contestan la misma pregunta y NO son lo mismo. El de arriba
 * cuenta lo que ya está guardado; el de abajo pregunta.
 *
 * ⚠️ Las dudas se pintan deliberadamente SIN color de severidad. El principio 1
 * protege el semáforo, y de nada sirve si la maqueta hace que una pregunta se
 * vea como un hallazgo. Van en gris, con su título diciendo lo que son.      */
.aldia{width:100%;margin-top:var(--e4);
  border-top:1px solid var(--ui-linea);padding-top:var(--e3);
  display:flex;flex-direction:column;gap:var(--e2)}
.aldia h2{font:var(--tipo-seccion);margin:0}
.aldia h3{font:var(--tipo-seccion);font-size:1rem;margin:var(--e3) 0 0}
.aldia p{margin:0}
.aldia button{align-self:flex-start;font:var(--tipo-secundario);font-weight:500;
  background:transparent;color:var(--ui-texto);cursor:pointer;
  border:1px solid var(--ui-linea);border-radius:var(--r);padding:6px var(--e2)}
.aldia button:hover:not(:disabled){background:var(--ui-fondo-alterno)}
.aldia button:disabled{opacity:.5;cursor:default}
.aldia .mal{color:var(--ui-rojo);margin-left:var(--e2)}

#aldiaLineas,#aldiaDudas{display:flex;flex-direction:column;gap:var(--e2)}
.aldia .linea{background:var(--ui-fondo-tarjeta);border:1px solid var(--ui-linea-tenue);
  border-radius:var(--r);padding:var(--e3);display:flex;flex-direction:column;gap:3px}
.aldia .linea .et{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}

/* La duda: mismo material, sin barra de color y con el fondo neutro del cuarto
   estado —«no pude revisar»—, que es lo más cerca que hay de «no sé». */
.aldia .duda{background:var(--ui-sin-cobertura-fondo);
  border:1px dashed var(--ui-linea);border-radius:var(--r);
  padding:var(--e3);display:flex;flex-direction:column;gap:3px}
.aldia blockquote{margin:4px 0 0;padding-left:var(--e2);
  border-left:2px solid var(--ui-linea-tenue);
  font:var(--tipo-secundario);color:var(--ui-texto-secundario)}

/* ── Lo que ya está resuelto, esperando su visto bueno ─────────────────────────
 * «No se trata de informar: se trata de resolver.» El borrador va ARRIBA y con
 * peso; las tres salidas van abajo, chiquitas y sin fondo. El orden visual es
 * el argumento: una pantalla con cuatro botones iguales le devuelve la decisión
 * de qué hacer; ésta ya decidió y le pide el visto bueno.                     */
.resolver{margin-top:var(--e3);padding-top:var(--e3);
  border-top:1px solid var(--ui-linea-tenue);
  display:flex;flex-direction:column;gap:var(--e2)}
.resolver p{margin:0}

.yaEscrito{display:flex;flex-direction:column;gap:var(--e2)}
.yaEscrito .et{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-verde)}
.yaEscrito .texto{background:var(--ui-fondo);border:1px solid var(--ui-linea-tenue);
  border-radius:var(--r);padding:var(--e2);display:flex;flex-direction:column;gap:var(--e1)}
.yaEscrito .asunto{font-weight:500;padding-bottom:var(--e1);
  border-bottom:1px solid var(--ui-linea-tenue)}
.yaEscrito mark.hueco{background:var(--ui-rojo-fondo);color:var(--ui-rojo);
  border-radius:3px;padding:0 3px;font-weight:500}

.resolver .mandar{display:flex;flex-wrap:wrap;align-items:end;gap:var(--e2)}
.resolver .mandar label{display:flex;flex-direction:column;gap:4px;flex:1;min-width:16ch;
  font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}
.resolver .mandar input{font:var(--tipo-secundario);padding:6px var(--e1);
  border:1px solid var(--ui-linea);border-radius:var(--r);
  background:var(--ui-fondo);color:var(--ui-texto);text-transform:none;letter-spacing:0}
/* El botón principal se ve principal. */
.resolver .enviar{font:var(--tipo-secundario);font-weight:500;
  background:var(--ui-texto);color:var(--ui-texto-inverso);
  border:1px solid var(--ui-texto);border-radius:var(--r);
  padding:7px var(--e3);cursor:pointer;min-height:var(--toque-min)}
.resolver .enviar:hover:not(:disabled){opacity:.88}
.resolver .enviar:disabled{opacity:.45;cursor:default}
/* El segundo toque se ve distinto: no es una confirmación, es un gesto aparte. */
.resolver .enviar.armado{background:var(--ui-rojo);border-color:var(--ui-rojo)}

/* ── LAS SALIDAS: EXISTEN, NO COMPITEN — PERO SE TOCAN ──────────────────────────
   Eran texto subrayado de 2 px de alto útil. En un teléfono eso no se lee como un
   control: se lee como una nota al pie, y el pulgar le pega al de al lado. Ahora son
   fichas con su propio contorno y 44 px de alto —lo que mide la yema de un pulgar—
   sin subir de jerarquía: siguen siendo grises sobre el fondo, contra el botón
   principal que es sólido y oscuro. */
.salidas{display:flex;flex-wrap:wrap;align-items:center;gap:var(--e1) var(--e2)}
/* ⚠️ EL ALTO DEL PULGAR NO ES EL TAMAÑO VISUAL, y confundirlos invierte la jerarquía.
   Al volverlas fichas quedaron tan grandes que tres salidas ocupaban tres renglones y
   pesaban más que «Ver el viaje», que es lo que ella iba a tocar. El alcance del dedo se
   consigue con el `min-height` de 44 px; el peso en la página, con el tipo y el aire.
   Así que la ficha mide 44 de alto y se ve de 13 px: se toca como botón, se lee como nota. */
.salidas .salida{font:400 13px/1 var(--marca-texto);background:transparent;
  color:var(--ui-texto-secundario);border:1px solid var(--ui-linea-tenue);border-radius:999px;
  padding:0 var(--e2);min-height:var(--toque-min);cursor:pointer;
  display:inline-flex;align-items:center;
  transition:background .12s ease,color .12s ease,border-color .12s ease}
.salidas .salida:hover:not(:disabled){color:var(--ui-texto);border-color:var(--ui-linea)}
/* Respuesta al dedo ANTES de que el servidor conteste. Sin esto, tocar y esperar
   medio segundo se siente como que no registró, y ella toca otra vez. */
.salidas .salida:active:not(:disabled){background:var(--ui-linea-tenue);
  color:var(--ui-texto);transform:scale(.97)}
.salidas .salida:disabled{opacity:.4;cursor:default}
.salidas .dicho{color:var(--ui-texto-secundario)}
.salidas .dicho.mal{color:var(--ui-rojo)}
.salidas .deshacer{font:var(--tipo-secundario);font-weight:500;background:transparent;
  color:var(--ui-texto);border:0;border-bottom:1px solid var(--ui-linea);
  padding:0;cursor:pointer;margin-left:4px}

/* Ya decidido: no se esconde —acaba de decidirlo y desaparecer confunde— pero
   deja de pedir atención, y el borrador se guarda. */
.resolver.cerrado .yaEscrito{display:none}
/* Ya decidido, con transición: el renglón se apaga en su lugar en vez de saltar.
   Es lo que hace que se sienta que algo pasó — y a la vez sigue ahí, que es lo que
   §3.7 pide para poder deshacerlo. */
.espera,.resolver,.tarea{transition:opacity .18s ease,background .18s ease}
.espera:has(.resolver.cerrado){opacity:.5}
@media (prefers-reduced-motion:reduce){
  .espera,.resolver,.tarea,.salidas .salida{transition:none}
  .salidas .salida:active:not(:disabled){transform:none}
}
.resolver.cerrado .salidas .salida{display:none}

/* ══ EL BRIEF DE LA MAÑANA ════════════════════════════════════════════════════
 * «En vez de doce expedientes abiertos, cuatro tandas.»
 *
 * Lo que había era una lista de 122 tarjetas iguales. Esto es lo contrario: se
 * abre, se lee en diez segundos, y se sabe qué sigue. Lo urgente arriba y suelto;
 * las tandas abajo, con su cuenta y su tiempo.                                */
.brief{width:100%;display:flex;flex-direction:column;gap:var(--e5)}
.brief .cab{border:0;padding:0;display:flex;flex-direction:column;gap:var(--e1)}
/* ⚠️ Tiene que ganarle a `.brief .cab`, que es igual de específica y viene antes: sin esto
   la cuenta y los minutos caían debajo del saludo, alineados a la izquierda, que es donde
   nadie los busca. La pregunta de las 7:40 —«¿me da tiempo?»— va a la derecha del título. */
.brief .cab.tira,.expediente .cab.tira,.cierre .cab.tira{
  display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:baseline}
.brief .cab.tira > div,.expediente .cab.tira > div,.cierre .cab.tira > div{
  display:flex;flex-direction:column;gap:var(--e1)}
.brief .cab.tira .der,.expediente .cab.tira .der,.cierre .cab.tira .der{
  align-items:flex-end;text-align:right}

/* ⚠️ VA DESPUÉS, y ahí está el defecto que corrige. Estaba escrita ARRIBA de la regla de
   `.der`, con la misma especificidad — así que la de escritorio ganaba por orden y en el
   celular «26 pendientes» seguía pegado a la derecha, debajo del saludo, alineado con nada.
   Una media query que viene antes de lo que quiere sobreescribir no hace nada. */
@media (max-width:900px){
  .brief .cab.tira,.expediente .cab.tira,.cierre .cab.tira{grid-template-columns:1fr}
  .brief .cab.tira .der,.expediente .cab.tira .der,.cierre .cab.tira .der{
    align-items:flex-start;text-align:left}
}
/* ⚠️ SIN MAYÚSCULAS. Es la primera línea que ella lee en la mañana, arriba de «Buenos
   días»: «JUEVES, 17 DE SEPTIEMBRE» saluda como un citatorio. La regla es la misma de
   `.sobreCorreo .cuando` — versalitas para LETREROS, minúsculas para contenido. */
.brief .fecha{font:400 13px/1.3 var(--marca-texto);
  color:var(--ui-texto-secundario);margin:0}
.brief h1{font:var(--tipo-titulo);margin:0}
.brief .resumen{font:var(--tipo-cuerpo);color:var(--ui-texto-secundario);margin:0}
.brief h2{font:var(--tipo-seccion);margin:0 0 var(--e2);
  display:flex;justify-content:space-between;align-items:baseline;gap:var(--e2)}
.brief h2 .et{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}
.brief section{display:flex;flex-direction:column}
.brief p{margin:0}

/* Lo urgente se ve urgente, y no se agrupa nunca. */
.brief .urgente{background:var(--ui-rojo-fondo);border:1px solid var(--ui-linea-tenue);
  box-shadow:inset 3px 0 0 var(--ui-rojo);border-radius:var(--r);
  padding:var(--e3);display:flex;flex-direction:column;gap:3px;margin-bottom:var(--e2)}
/* El cliente y el viaje YA vienen en mayúsculas del documento («BLANCA GARZA»): volver a
   aplicárselas no cambia nada y sí obliga a cargar con el interletraje de placa. */
.brief .urgente .v{font:400 12.5px/1.35 var(--marca-texto);
  color:var(--ui-texto-secundario)}
.brief .urgente .t{font-weight:500}
.brief .urgente .q{font:var(--tipo-secundario);color:var(--ui-texto-secundario)}

/* Una tanda es una fila que se toca entera, no una tarjeta con un botón dentro. */
@media (max-width:520px){
  /* ⚠️ POR LÍNEA DE BASE, y ése es todo el arreglo.
     La cifra medía dos renglones y se centraba sobre ellos, así que el «13» flotaba a media
     altura mientras «Aprobar mensajes» se alineaba arriba: dos cosas de la misma fila
     apuntando a sitios distintos, que es lo que se ve como «descuadrado» sin poder decir
     por qué. Ahora la cifra y el nombre comparten línea de base —como en cualquier renglón
     de texto— y los minutos se van a la derecha de esa misma línea.
     El subtítulo largo ya no choca con los minutos porque envuelve DENTRO de su columna. */
  .brief .tanda{grid-template-columns:auto 1fr auto;gap:2px var(--e2);align-items:baseline}
  .brief .tanda .primero{grid-area:1 / 1 / 2 / 4}
  .brief .tanda .cuenta{grid-area:2 / 1 / 3 / 2}
  .brief .tanda .quees{grid-area:2 / 2 / 3 / 3}
  .brief .tanda .mins{grid-area:2 / 3 / 3 / 4;justify-self:end}
  /* El asomo necesita su propia área: con colocación explícita arriba, el automático lo
     mandaría encima de la cifra. */
  .brief .tanda .asomo{grid-area:3 / 1 / 4 / 4}
}
.brief .tanda{display:grid;grid-template-columns:auto 1fr auto;align-items:baseline;
  gap:2px var(--e3);padding:var(--e3);text-decoration:none;color:var(--ui-texto);
  background:var(--ui-fondo-tarjeta);border:1px solid var(--ui-linea-tenue);
  border-radius:var(--r);margin-bottom:2px;min-height:var(--toque-min)}
.brief .tanda .primero{grid-area:1 / 1 / 2 / 4}
.brief .tanda .cuenta{grid-area:2 / 1 / 3 / 2}
.brief .tanda .quees{grid-area:2 / 2 / 3 / 3}
.brief .tanda .mins{grid-area:2 / 3 / 3 / 4}
.brief .tanda:hover{background:var(--ui-fondo-alterno)}
.brief .tanda .cuenta{font:var(--tipo-cifra);font-size:26px;
  font-variant-numeric:tabular-nums;min-width:1.6em;text-align:right}
.brief .tanda .quees{display:flex;flex-direction:column;gap:1px}
.brief .tanda .nom{font-weight:500}
.brief .tanda .hd{font:var(--tipo-secundario);color:var(--ui-texto-secundario)}
.brief .tanda .mins{font:var(--tipo-secundario);color:var(--ui-texto-secundario);
  font-variant-numeric:tabular-nums;white-space:nowrap}
/* ⚠️ DENTRO DE LA TARJETA, no encima del borde.
   Iba en `position:absolute; top:-8px`, así que se montaba sobre la línea de arriba y le
   cortaba la esquina redondeada: se leía como algo mal pegado, no como una etiqueta. Y en
   una pantalla que ella abre a diario, un elemento que parece roto le quita autoridad a
   todo lo demás. Ahora es un renglón más de la fila, arriba de la cifra, donde además se
   lee antes que ella —que es justo lo que «empezar aquí» quiere decir. */
.brief .tanda .primero{justify-self:start;
  font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);text-transform:uppercase;
  background:var(--ui-texto);color:var(--ui-texto-inverso);
  padding:4px 8px;border-radius:999px;margin-bottom:var(--e1)}

/* ⚠️ SIN el prefijo de pantalla, y ésa es la corrección.
 *
 * Estaba escrito como `.brief .empezar, .corredor .empezar`, y el mismo botón existe
 * también en «lo que sé» y en «el dinero» — donde salía como una liga azul subrayada del
 * navegador, en dos pantallas que no tienen un solo azul. Un estilo amarrado a la pantalla
 * en la que se escribió deja de valer en la siguiente que lo use. */
.empezar{align-self:flex-start;margin-top:var(--e3);
  font:var(--tipo-cuerpo);font-weight:500;text-decoration:none;
  background:var(--ui-texto);color:var(--ui-texto-inverso);
  border-radius:var(--r);padding:var(--e2) var(--e4);min-height:var(--toque-min);
  display:inline-flex;align-items:center}
.empezar:hover{opacity:.88}
.brief .pie{font:var(--tipo-secundario);color:var(--ui-texto-secundario);
  border-top:1px solid var(--ui-linea-tenue);padding-top:var(--e3);
  display:flex;flex-direction:column;gap:2px}

/* ══ DENTRO DE UNA TANDA ══════════════════════════════════════════════════════
 * Una cosa a la vez. No hay lista alrededor, y eso es el punto.                */
.corredor{width:100%;display:flex;flex-direction:column;gap:var(--e4)}
.corredor .cab{border:0;padding:0;display:flex;flex-direction:column;gap:var(--e1)}
.corredor .fecha{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);margin:0}
.corredor h1{font:var(--tipo-seccion);margin:0}
.corredor p{margin:0}

/* El avance, en puntos. Se ve cuánto falta sin contar. */
.corredor .pista{display:flex;gap:4px}
.corredor .paso{flex:1;height:3px;background:var(--ui-linea-tenue);border-radius:2px}
.corredor .paso.aqui{background:var(--ui-texto)}
.corredor .paso.listo{background:var(--ui-verde)}

/* ── DOS COLUMNAS, Y NO ES DECORACIÓN ────────────────────────────────────────
 * Izquierda: POR QUÉ. A quién va, por qué se le saca hoy, y de dónde salió cada
 * dato. Es lo que le permite decir que sí sin abrir el viaje entero, y es
 * exactamente lo que no estaba.
 *
 * Derecha: QUÉ SALE. El mensaje con forma de mensaje. Antes era un párrafo
 * dentro de una caja gris, y por eso no se leía como algo que va a salir con su
 * nombre.                                                                     */
.corredor .cosa{display:block}
.corredor .cosa .porQue,.corredor .cosa .queSale{
  display:flex;flex-direction:column;gap:var(--e2)}
.corredor .cosa .t{font:400 19px/1.3 var(--marca-display)}
.corredor .cosa .q{font:var(--tipo-secundario);color:var(--ui-texto-secundario)}
.corredor .cosa blockquote{margin:3px 0 0;padding-left:var(--e2);
  border-left:2px solid var(--ui-linea-tenue);
  font:var(--tipo-secundario);color:var(--ui-texto-secundario)}
/* En el corredor el borrador es EL contenido de la columna, no un añadido al pie
   de una tarjeta: se le quita la línea de arriba y el margen que lo separaba. */
.corredor .queSale .resolver{margin-top:0;padding-top:0;border-top:0}

/* Las pastillas de abajo. Un contador dice «quedan 4»; esto dice de QUIÉN son —y
   se puede tocar para ir a una, que es la diferencia entre una lista y un
   adorno. */
.corredor .loQueQueda{margin-top:var(--e4);border-top:1px solid var(--ui-linea-tenue);
  padding-top:var(--e3)}
/* Es un `<button>`, así que hay que devolverle la forma del chip: el navegador le pone su
   propia tipografía y su propio fondo. Y área táctil mínima, que como span no tenía. */
.corredor .pastilla{cursor:pointer;font:inherit;color:inherit;background:transparent;
  min-height:var(--toque-min)}
.corredor .pastilla:hover{background:var(--ui-fondo-alterno)}
.corredor .pastilla.aqui{border-color:var(--ui-texto);color:var(--ui-texto);font-weight:600}
.corredor .pastilla.v{border-color:rgba(79,99,80,.45);color:var(--ui-verde);
  background:var(--ui-verde-fondo);cursor:default}
/* El que ya está hecho lleva `disabled` desde el guión — con Tab ya no se alcanza. Aquí
   sólo se le quita el estado de «tocable» para que el cursor lo diga también. */
.corredor .pastilla:disabled{cursor:default}
.corredor .pastilla.v::before{content:"✓ "}
.corredor .saltar{margin-top:var(--e2)}
.corredor .saltarBtn{font:var(--tipo-secundario);background:transparent;
  color:var(--ui-texto-secundario);border:0;border-bottom:1px solid var(--ui-linea-tenue);
  padding:2px 0;cursor:pointer}
.corredor .saltarBtn:hover{color:var(--ui-texto);border-bottom-color:var(--ui-linea)}

.corredor .final{display:flex;flex-direction:column;gap:var(--e2);
  background:var(--ui-verde-fondo);border:1px solid var(--ui-linea-tenue);
  border-radius:var(--r);padding:var(--e4)}
.corredor .final h2{font:var(--tipo-seccion);margin:0}
.corredor .volver{font:var(--tipo-secundario);margin-top:var(--e3)}

/* ══ LO QUE VIVE FUERA DEL ARMAZÓN ════════════════════════════════════════════
 * La barra horizontal de seis ligas se fue: la sustituyó el riel de `armazon.css`,
 * que además lleva las cuentas. Lo que queda aquí son las tres excepciones.   */

/* 1 · La pantalla de entrar. Va SIN riel —enseñaría sus cuentas a quien no ha
 *     puesto la contraseña— así que necesita su propio centro.                */
.suelta{padding:var(--e4) var(--e3) var(--e6)}
.entrar{max-width:380px;margin:12vh auto 0}

/* 2 · Lo que se imprime o se manda: la propuesta y el formato de pago a Le Grand.
 *     El riel no va en un papel que sale de aquí con su nombre.               */
@media print{
  .riel,.volver,.no-print{display:none!important}
  .app{display:block}
  .lienzo{padding:0}
}

/* 3 · Texto corrido. Donde se lee de verdad —no una tabla, no tarjetas— el ancho
 *     se corta a 65 caracteres: un párrafo de 1180px de ancho no se lee, se
 *     escanea y se abandona.                                                  */
.prosa,.subir,.brief .resumen,.expediente .resumen{max-width:66ch}
.subir{margin:0 auto}

/* ══ EL EXPEDIENTE ════════════════════════════════════════════════════════════
 * La capa permanente. Se ve distinta a la cola A PROPÓSITO: sin contadores, sin
 * tiempos, sin botones que empujan. Aquí se entra a leer y a decidir.         */
.expediente{width:100%;display:flex;flex-direction:column;gap:var(--e5)}
.expediente .cab{border:0;padding:0;display:flex;flex-direction:column;gap:var(--e1)}
.expediente .fecha{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);margin:0}
.expediente h1{font:var(--tipo-titulo);margin:0}
.expediente h2{font:var(--tipo-seccion);margin:0 0 var(--e2)}
/* El viaje que está pasando: una tarjeta que se toca entera, no un renglón más de la
   lista. Es sobre el que hay que hacer algo hoy; los anteriores son de dónde sale «la 412,
   la misma de la otra vez». Enseñarlos igual los vuelve un archivo. */
a.elDeAhora{text-decoration:none;color:var(--ui-texto)}
a.elDeAhora:hover{border-color:var(--ui-linea)}
.expediente .linea-t a{color:var(--ui-texto)}
.expediente .resumen{font:var(--tipo-cuerpo);color:var(--ui-texto-secundario);margin:0}
.expediente p{margin:0}
.expediente section{display:flex;flex-direction:column}
.expediente blockquote{margin:3px 0 0;padding-left:var(--e2);
  border-left:2px solid var(--ui-linea-tenue);
  font:var(--tipo-secundario);color:var(--ui-texto-secundario)}
.expediente .limpia > li{display:flex;flex-direction:column;gap:1px}

/* Una fila que se toca entera. La misma forma que las tandas: se aprende una vez. */
.viajes{display:flex;flex-direction:column;gap:2px}
.viaje{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:var(--e3);
  padding:var(--e3);text-decoration:none;color:var(--ui-texto);
  background:var(--ui-fondo-tarjeta);border:1px solid var(--ui-linea-tenue);
  border-radius:var(--r);min-height:var(--toque-min)}
.viaje:hover{background:var(--ui-fondo-alterno)}
.viaje .cuenta{font:var(--tipo-cifra);font-size:24px;font-variant-numeric:tabular-nums;
  min-width:1.4em;text-align:right}
.viaje .quees{display:flex;flex-direction:column;gap:1px;min-width:0}
.viaje .nom{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.viaje .hd{font:var(--tipo-secundario);color:var(--ui-texto-secundario)}
.viaje .mins{font:var(--tipo-secundario);color:var(--ui-texto-secundario);
  font-variant-numeric:tabular-nums;white-space:nowrap}
.viaje .pt{width:9px;height:9px;border-radius:50%;flex:none;background:var(--ui-linea)}
.viaje .pt.r{background:var(--ui-rojo)} .viaje .pt.a{background:var(--ui-ambar)}
.viaje .pt.v{background:var(--ui-verde)} .viaje .pt.g{background:var(--ui-linea)}

/* Lo que es archivo y no pendiente se guarda detrás de una línea. `/dinero` enseñaba
   122 tarjetas —60 de Le Grand, 60 de proveedores, todas de doce meses atrás— y lo
   que de verdad hay que despachar quedaba enterrado arriba de todas ellas. */
details.quienes{border:1px solid var(--ui-linea-tenue);border-radius:var(--r);
  padding:var(--e2) var(--e3);background:var(--ui-fondo-tarjeta)}
details.quienes > summary{font:var(--tipo-secundario);font-weight:500;cursor:pointer;
  padding:var(--e1) 0;list-style:none}
details.quienes > summary::-webkit-details-marker{display:none}
details.quienes > summary::before{content:"▸ ";color:var(--ui-texto-secundario)}
details.quienes[open] > summary::before{content:"▾ "}
details.quienes[open] > summary{margin-bottom:var(--e2);
  border-bottom:1px solid var(--ui-linea-tenue)}

/* ═══════════════════════════════════════════════════════════════════════════════
 * LAS PANTALLAS QUE NUNCA TUVIERON CSS
 *
 * ⚠️ ESTO NO ES PULIDO. Se descubrió cruzando las clases que `pagina.ts` escribe
 * contra las que las hojas definen: `.cadenas`, `.dinero`, `.contestar`, `.bola`,
 * `.ficha`, `.tramos`, `.correos-del-viaje` y ocho más NO TENÍAN UNA SOLA REGLA.
 *
 * O sea que la cadena de pagos —el módulo del miedo declarado de §9.3— se veía con
 * los estilos por omisión del navegador: Times New Roman, h1 gigante, sin aire y
 * sin jerarquía, dentro de una app cuyo resto está en Cormorant y Raleway.
 *
 * Es la mitad de «como está no sirve para nada», y no se veía revisando el código
 * pantalla por pantalla porque el HTML era correcto. Faltaba la hoja.
 * ═══════════════════════════════════════════════════════════════════════════════ */

/* El esqueleto que toda pantalla del lienzo comparte. Antes cada una lo repetía —o
   no lo tenía— y por eso unas respiraban y otras no. */
main.cadenas,main.dinero,main.contestar,main.bola{
  width:100%;display:flex;flex-direction:column;gap:var(--e4)}
main.cadenas > h1,main.dinero > h1,main.contestar > h1,main.bola > h1{
  font:var(--tipo-titulo);margin:0;text-wrap:balance}
main.cadenas h2,main.dinero h2,main.contestar h2,main.bola h2{
  font:var(--tipo-seccion);margin:0 0 var(--e2)}
main.cadenas h3,main.dinero h3,main.contestar h3,main.bola h3{
  font:400 19px/1.3 var(--marca-display);margin:0 0 var(--e1)}
main.cadenas p,main.dinero p,main.contestar p,main.bola p{margin:0}
main.cadenas section,main.dinero section,main.bola section{
  display:flex;flex-direction:column}
.vacio{font:var(--tipo-cuerpo);color:var(--ui-texto-secundario);max-width:66ch}

/* ── LA CADENA · los tres tramos, dibujados ─────────────────────────────────────
 * El tercero es el que no existe en ningún registro y el que carga el riesgo: si
 * Le Grand no le paga al operador, la que queda mal es ella. Así que cuando falta
 * no es un renglón gris más — es el que se ve.                                  */
.cadena{background:var(--ui-fondo-tarjeta);border:1px solid var(--ui-linea-tenue);
  border-radius:var(--r);padding:var(--e4);display:flex;flex-direction:column;gap:var(--e3)}
.cadena.urge{background:var(--ui-rojo-fondo);box-shadow:inset 3px 0 0 var(--ui-rojo)}
.cadena.cerrada{box-shadow:inset 3px 0 0 var(--ui-verde)}
.cadena > header{display:flex;align-items:baseline;justify-content:space-between;
  gap:var(--e3);flex-wrap:wrap;border-bottom:1px solid var(--ui-linea-tenue);
  padding-bottom:var(--e2)}
.cadena .quien{font:400 21px/1.2 var(--marca-display)}
.cadena .quien a{color:var(--ui-texto);text-decoration:none}
.cadena .quien a:hover{text-decoration:underline}
.cadena .motivo{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}
.cadena.urge .motivo{color:var(--ui-rojo)}
.cadena.cerrada .motivo{color:var(--ui-verde)}

/* Los eslabones en fila, con la línea que los une por detrás: es una cadena y se
   tiene que ver como una. En el celular se acuestan y la línea se vuelve vertical. */
ol.tramos{list-style:none;margin:0;padding:0;display:grid;
  grid-template-columns:repeat(3,1fr);gap:var(--e3);position:relative}
ol.tramos::before{content:"";position:absolute;left:5px;right:5px;top:5px;height:1px;
  background:var(--ui-linea-tenue)}
ol.tramos > li{position:relative;padding-top:var(--e3);display:flex;
  flex-direction:column;gap:2px}
ol.tramos > li::before{content:"";position:absolute;top:0;left:0;
  width:11px;height:11px;border-radius:50%;background:var(--ui-fondo-tarjeta);
  border:2px solid var(--ui-linea)}
ol.tramos > li.hecho::before{background:var(--ui-verde);border-color:var(--ui-verde)}
ol.tramos > li.pendiente::before{background:var(--ui-fondo);border-color:var(--ui-linea)}
/* El tercero pendiente es el único que se pinta de rojo. Los otros dos pendientes
   son un paso que todavía no toca; éste es dinero que ya salió y nadie confirmó. */
ol.tramos > li:last-child.pendiente::before{border-color:var(--ui-rojo)}
ol.tramos > li:last-child.pendiente .ht{color:var(--ui-rojo)}
ol.tramos .ht{font-weight:600;font-size:14px}
ol.tramos .hd{font:var(--tipo-secundario);color:var(--ui-texto-secundario)}

.tramo-nuevo,form.nueva{display:flex;flex-wrap:wrap;align-items:flex-end;gap:var(--e2);
  border-top:1px solid var(--ui-linea-tenue);padding-top:var(--e3)}
.tramo-nuevo label{display:flex;flex-direction:column;gap:3px;
  font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}
.tramo-nuevo input,.tramo-nuevo select{font:var(--tipo-secundario);padding:7px var(--e2);
  border:1px solid var(--ui-linea);border-radius:var(--r);
  background:var(--ui-fondo);color:var(--ui-texto);min-height:var(--toque-min)}
.tramo-nuevo button,form.nueva button{font:var(--tipo-secundario);font-weight:600;
  cursor:pointer;background:var(--ui-texto);color:var(--ui-texto-inverso);
  border:0;border-radius:var(--r);padding:9px var(--e3);min-height:var(--toque-min)}
/* ── LA LISTA DE VIAJES SIN CADENA ───────────────────────────────────────────────
   Eran cien renglones con un botón negro de ancho completo cada uno: 24 pantallas de
   teléfono que se leían como cien pendientes. Ahora el renglón es una fila —nombre a
   la izquierda, botón chico a la derecha— y encima está el campo con el que de verdad
   se usa: cuando cae un pago, se busca ese viaje. */
form.nueva{border:0;padding:var(--e2) 0;justify-content:space-between;
  align-items:center;gap:var(--e3);border-bottom:1px solid var(--ui-linea-tenue)}
form.nueva .ht{font-weight:500;min-width:0;overflow:hidden;text-overflow:ellipsis}
form.nueva[hidden]{display:none}
.sinCadena form.nueva button{flex:0 0 auto;font-size:13px;padding:0 var(--e3);
  background:transparent;color:var(--ui-texto);border:1px solid var(--ui-linea)}
.sinCadena form.nueva button:hover{background:var(--ui-fondo-alterno)}

details.masViajes>summary{cursor:pointer;list-style:none;min-height:44px;
  display:inline-flex;align-items:center;gap:6px;
  font:var(--tipo-secundario);color:var(--ui-texto-secundario)}
details.masViajes>summary::-webkit-details-marker{display:none}
details.masViajes>summary b{color:var(--ui-texto);font-variant-numeric:tabular-nums}

/* ── CONTESTAR ─────────────────────────────────────────────────────────────────── */
.espera{background:var(--ui-fondo-tarjeta);border:1px solid var(--ui-linea-tenue);
  border-radius:var(--r);padding:var(--e4);display:flex;flex-direction:column;gap:var(--e3)}
.espera .paso{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}
.espera .sobre{display:flex;flex-direction:column;gap:var(--e1);
  border-bottom:1px solid var(--ui-linea-tenue);padding-bottom:var(--e3)}
.espera .quien-fila{display:flex;align-items:baseline;justify-content:space-between;
  gap:var(--e3);flex-wrap:wrap}
.espera .quien{font:400 21px/1.2 var(--marca-display)}
.espera .motivo{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}
.espera blockquote,.correo blockquote{margin:var(--e1) 0 0;padding-left:var(--e2);
  border-left:2px solid var(--ui-linea-tenue);
  font:var(--tipo-secundario);color:var(--ui-texto-secundario)}
.espera .viaje.sin{color:var(--ui-texto-secundario);font-style:italic}

/* ── LOS CORREOS DE UN VIAJE ───────────────────────────────────────────────────── */
.correos-del-viaje{width:100%;margin-top:var(--e5);display:flex;flex-direction:column;gap:var(--e2)}
.correos-del-viaje > h2{font:var(--tipo-seccion);margin:0}
.correo{background:var(--ui-fondo-tarjeta);border:1px solid var(--ui-linea-tenue);
  border-radius:var(--r);padding:var(--e3);display:flex;flex-direction:column;gap:3px}
.correo > header{display:flex;align-items:baseline;justify-content:space-between;
  gap:var(--e2);flex-wrap:wrap}
.correo .quien{font-weight:600;font-size:14px}
.correo .motivo,.correo .por{font:var(--tipo-secundario);color:var(--ui-texto-secundario)}
.correo .por{font-style:italic}
.correo .dato{margin-top:var(--e2);padding-top:var(--e2);
  border-top:1px dashed var(--ui-linea-tenue)}

/* ── LA FICHA DEL HUÉSPED ──────────────────────────────────────────────────────── */
.ficha{width:100%;margin-top:var(--e5);display:flex;flex-direction:column;gap:var(--e3);
  background:var(--ui-fondo-tarjeta);border:1px solid var(--ui-linea-tenue);
  border-radius:var(--r);padding:var(--e4)}
.ficha > h2{font:var(--tipo-seccion);margin:0}
.ficha > h3{font:400 19px/1.3 var(--marca-display);margin:var(--e2) 0 0}
.ficha p{margin:0}
dl.datos{display:grid;grid-template-columns:auto 1fr;gap:var(--e1) var(--e3);margin:0;
  font:var(--tipo-secundario)}
dl.datos dt{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);padding-top:2px}
dl.datos dd{margin:0}
ul.faltantes,ul.peticiones,ul.miradas{margin:0;padding-left:1.1em;
  font:var(--tipo-secundario);display:flex;flex-direction:column;gap:var(--e1)}
ul.miradas{list-style:none;padding-left:0}
ul.miradas li{display:flex;flex-direction:column;gap:1px}
.cierres{display:flex;flex-wrap:wrap;gap:var(--e2);margin-top:var(--e2)}
.perfiles{width:100%;margin-top:var(--e5);display:flex;flex-direction:column;gap:var(--e2)}
.perfiles h2{font:var(--tipo-seccion);margin:0}

/* ── LO QUE SE ESPERA DE OTROS ─────────────────────────────────────────────────── */
.bola .seguimiento,.bola article{background:var(--ui-fondo-tarjeta);
  border:1px solid var(--ui-linea-tenue);border-radius:var(--r);padding:var(--e3);
  display:flex;flex-direction:column;gap:3px;margin-bottom:2px}

/* ── LOS PAPELES DE UN VIAJE ────────────────────────────────────────────────
 * Antes era una lista de nombres de archivo. En un viaje de 76 papeles eso son
 * 76 renglones que dicen «VGR7210021V3_DV25460.pdf» —un RFC y un folio— y no
 * llevan a ninguna parte. Ahora cada uno dice qué es, qué se leyó de él, y se
 * abre.                                                                      */
ul.losPapeles{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}
ul.losPapeles li{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--e2);
  font:var(--tipo-secundario);padding-bottom:6px;
  border-bottom:1px solid var(--ui-linea-tenue)}
ul.losPapeles li:last-child{border-bottom:0}
ul.losPapeles a{color:var(--ui-texto);text-decoration:none;border-bottom:1px solid var(--ui-linea)}
ul.losPapeles a:hover{border-bottom-color:var(--ui-texto)}
/* Sin copia se ve distinto a propósito: no es un enlace roto, es un papel que
   está en su computadora y no aquí. */
ul.losPapeles .sinCopia{color:var(--ui-texto-secundario);border-bottom:1px dotted var(--ui-linea)}
ul.losPapeles .queEs{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);white-space:nowrap}
ul.losPapeles .dijo{color:var(--ui-texto-secundario);flex-basis:100%}

/* ── TODOS LOS PAPELES DE UN CLIENTE ────────────────────────────────────────
 * «¿Dónde está la factura de aquel viaje?» se contestaba abriendo viaje por
 * viaje. En rejilla caben cuarenta en una pantalla, cada uno con qué es y de
 * qué viaje, y cada uno abre. */
.susPapeles{margin-top:var(--e5);display:flex;flex-direction:column;gap:var(--e2)}
.rejillaPapeles{display:grid;gap:var(--e2);
  grid-template-columns:repeat(auto-fill,minmax(240px,1fr))}
.unPapel{background:var(--ui-fondo-tarjeta);border:1px solid var(--ui-linea-tenue);
  border-radius:var(--r);padding:var(--e2) var(--e3);
  display:flex;flex-direction:column;gap:2px;font:var(--tipo-secundario);min-width:0}
.unPapel > a:first-child{color:var(--ui-texto);text-decoration:none;font-weight:500;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  border-bottom:1px solid var(--ui-linea);align-self:flex-start;max-width:100%}
.unPapel > a:first-child:hover{border-bottom-color:var(--ui-texto)}
.unPapel .sinCopia{color:var(--ui-texto-secundario);font-weight:500;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.unPapel .queEs{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}
.unPapel .deQue{color:var(--ui-texto-secundario);font-size:12.5px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* El pasaporte que se vence pronto se ve, sin gritar: es una señal para mirarlo,
   no el hallazgo — ése lo da la regla, con su evidencia. */
.expediente td.ojo{color:var(--ui-ambar);font-weight:600}

/* ── LA FICHA DEL CLIENTE ────────────────────────────────────────────────────
 * Lo básico de un vistazo, antes de entrar a sus viajes y a sus papeles: cuántas
 * veces ha vuelto, qué gasta, qué viaja, con qué correo le escriben y con quién
 * viaja. Va arriba porque es lo que contesta «¿quién es esta gente?» — la
 * pregunta con la que se abre un expediente.                                  */
.ficha-cliente{display:flex;flex-direction:column;gap:var(--e2);margin-bottom:var(--e4);
  padding-bottom:var(--e4);border-bottom:1px solid var(--ui-linea-tenue)}
.ficha-cliente .baldosa .cif{font-size:28px}
.ficha-cliente .tj table.mini{margin-top:5px}

/* El porcentaje que ella corrige. Se ve como una celda, no como un formulario: escribe,
   sale del campo, y se guardó. Sin botón de guardar — un botón por celda son doce botones
   en la pantalla que existe para no capturar nada. */
input.pct{font:var(--tipo-secundario);font-variant-numeric:tabular-nums;width:5.5em;
  text-align:right;padding:3px 5px;border:1px solid transparent;border-radius:var(--r);
  background:transparent;color:var(--ui-texto)}
input.pct:hover{border-color:var(--ui-linea-tenue)}
input.pct:focus{outline:2px solid var(--ui-texto);outline-offset:0;background:var(--ui-fondo)}
input.pct::placeholder{color:var(--ui-ambar);font-style:italic}
input.pct.guardado{background:var(--ui-verde-fondo);border-color:rgba(79,99,80,.4)}
input.pct.mal{background:var(--ui-rojo-fondo);border-color:var(--ui-rojo)}

/* ── UN HUECO QUE ELLA LLENA ────────────────────────────────────────────────
 * ⚠️ SE VE OPCIONAL PORQUE LO ES. Un campo abierto en medio de la pantalla se
 * lee como trabajo pendiente, y ella tiene bastante. Es una liga chica que abre
 * el campo cuando quiere, sin botón de guardar: escribe, sale, y quedó.       */
.hueco-suyo{margin-top:var(--e2)}
.abreHueco{font:var(--tipo-secundario);font-size:12.5px;cursor:pointer;
  background:transparent;color:var(--ui-acento);border:0;padding:0;
  border-bottom:1px solid rgba(194,168,120,.5)}
.abreHueco:hover{border-bottom-color:var(--ui-acento)}
.campoHueco{display:flex;flex-direction:column;gap:4px;margin-top:var(--e2)}
.campoHueco .et{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}
.campoHueco input{font:var(--tipo-secundario);padding:7px var(--e2);
  border:1px solid var(--ui-linea);border-radius:var(--r);
  background:var(--ui-fondo);color:var(--ui-texto)}
.campoHueco input:focus{outline:2px solid var(--ui-texto);outline-offset:1px}

/* «¿Es la misma persona?» — la pregunta que se hace una vez.
   Va debajo del nombre, chica, y desaparece en cuanto contesta. */
.mismoNo{display:flex;flex-wrap:wrap;align-items:center;gap:var(--e2);margin-top:3px}
.mismoNo .hd{font-size:12.5px}
.esLaMisma{font:var(--tipo-secundario);font-size:12.5px;cursor:pointer;
  background:transparent;color:var(--ui-texto);
  border:1px solid var(--ui-linea-tenue);border-radius:var(--r-pildora);padding:3px 10px}
.esLaMisma:hover{border-color:var(--ui-texto)}

/* ── EL BUSCADOR ────────────────────────────────────────────────────────────
 * Con 322 viajes y 307 expedientes, «¿dónde está lo de Lisy?» no tenía respuesta
 * más que bajar la lista. Filtra en la pantalla, sin ir al servidor: una búsqueda
 * que tarda medio segundo por letra no se usa, se recorre la lista a mano.       */
.buscador{display:flex;align-items:baseline;gap:var(--e3);margin-bottom:var(--e2)}
.buscaEn{font:var(--tipo-cuerpo);flex:1;max-width:26rem;padding:9px var(--e3);
  border:1px solid var(--ui-linea);border-radius:var(--r);
  background:var(--ui-fondo-tarjeta);color:var(--ui-texto)}
.buscaEn:focus{outline:2px solid var(--ui-texto);outline-offset:1px}
.buscador .cuantos{white-space:nowrap;font-variant-numeric:tabular-nums}

/* Los atajos, dichos abajo y en chico. Sin esto son un secreto: un atajo que no
   se anuncia lo usa quien escribió el código. */
.corredor .atajos{margin-top:var(--e4);padding-top:var(--e3);
  border-top:1px solid var(--ui-linea-tenue);color:var(--ui-texto-secundario)}
.corredor .atajos kbd{font:500 11px/1 var(--marca-texto);
  border:1px solid var(--ui-linea);border-bottom-width:2px;border-radius:4px;
  padding:3px 6px;background:var(--ui-fondo-tarjeta);color:var(--ui-texto)}
@media (max-width:900px){.corredor .atajos{display:none}}

/* «← Tu gente». Va ARRIBA del título y no abajo: es lo primero que se busca cuando
   uno se equivocó de puerta, y abajo hay que recorrer la pantalla para hallarlo. */
.deVuelta{margin:0 0 var(--e2);font:var(--tipo-secundario)}
.deVuelta a{color:var(--ui-texto-secundario);text-decoration:none}
.deVuelta a:hover{color:var(--ui-texto)}

/* ── El asomo de una tanda ───────────────────────────────────────────────────────────────
   Antes el renglón decía «3 · Aprobar mensajes · 2 min» y nada más, así que en la pantalla
   de entrada —la primera que abre en la mañana— no se veía ni un remitente, ni una fecha,
   ni un asunto: los correos nunca son prioridad 1, y todo lo demás se colapsaba aquí.

   Va en su propia fila, debajo, y en el ancho completo del renglón: es la línea que dice
   QUÉ hay adentro, y meterla en la columna del nombre la cortaría a la mitad. */
.brief .tanda .asomo{grid-area:3 / 1 / 4 / 4;font:var(--tipo-secundario);
  color:var(--ui-texto-secundario);margin-top:var(--e2);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.brief .tanda .asomo strong{font-weight:600;color:var(--ui-texto)}
.brief .tanda .asomo .hd{color:var(--ui-texto-secundario)}

/* ══ EL TABLERO ══════════════════════════════════════════════════════════════════════════
   Cómo va todo, en una pantalla. No sustituye a «Hoy»: «Hoy» es la cola y se vacía; esto
   contesta «¿cómo voy?» y no se vacía nunca.

   ⚠️ SIN GRÁFICAS, y es una decisión medida: con 322 expedientes de los cuales el 32 %
   tiene fecha, una serie de tiempo sería más hueco que línea. Cifras con semáforo dicen lo
   mismo sin fingir precisión. */
/* El token no existía: era una variable inventada con respaldo, o sea un número suelto
   disfrazado de sistema. Ahora vive en `tokens.css` con los demás. */
.tablero{max-width:var(--ancho-lectura)}
.tablero section{margin-top:var(--e5)}
.tablero h2{font:400 clamp(19px,2.4vw,24px)/1.2 var(--marca-display);margin:0 0 var(--e3);
  display:flex;align-items:baseline;gap:var(--e3);flex-wrap:wrap}
.tablero h2 .et{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}

/* `auto-fit` con un mínimo: cuatro cifras caben en una fila ancha, dos en media pantalla y
   una en el teléfono, sin escribir tres puntos de corte. */
.rejillaCifras{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));
  gap:var(--e2)}
.cifraTablero{display:flex;flex-direction:column;gap:2px;padding:var(--e3);
  text-decoration:none;color:var(--ui-texto);background:var(--ui-fondo-tarjeta);
  border:1px solid var(--ui-linea-tenue);border-radius:var(--r);
  min-height:var(--toque-min);box-shadow:inset 3px 0 0 var(--ui-linea)}
.cifraTablero:hover{background:var(--ui-fondo-alterno)}
/* El filete de color al costado, que es el idioma de semáforo que esta plataforma ya usa. */
.cifraTablero.detiene{box-shadow:inset 3px 0 0 var(--ui-rojo)}
.cifraTablero.avisa{box-shadow:inset 3px 0 0 var(--ui-ambar)}
.cifraTablero.pasa{box-shadow:inset 3px 0 0 var(--ui-verde)}
.cifraTablero .valor{font:300 30px/1 var(--marca-display);font-variant-numeric:tabular-nums}
.cifraTablero.detiene .valor{color:var(--ui-rojo)}
.cifraTablero .et{font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario);margin-top:var(--e1)}
.cifraTablero .hd{font:var(--tipo-secundario);color:var(--ui-texto-secundario)}

/* ⚠ `.viaje` es una rejilla de TRES columnas —punto, contenido, cifra— y los renglones
   del tablero no traen el punto del semáforo, así que la cifra se acomodaba pegada al
   título en vez de irse a la derecha. Dos columnas cuando no hay punto. */
.tablero .viaje{grid-template-columns:1fr auto}

.tablero .corriendo .hd{margin:0 0 var(--e1)}
.tablero .corriendo .hd.mal{color:var(--ui-rojo)}
.tablero .pie{margin-top:var(--e5);padding-top:var(--e3);
  border-top:1px solid var(--ui-linea-tenue);color:var(--ui-texto-secundario);
  font:var(--tipo-secundario)}

/* ══ LO QUE TE PAGA CADA OPERADOR ════════════════════════════════════════════════════════
   La pantalla donde declara el % de comisión. 77 de 80 renglones de dinero la esperan.

   ⚠️ La evidencia va AL LADO de la casilla, nunca dentro: si el número que dicen sus
   renglones apareciera precargado, palomearía sin mirar y una mediana pasaría a ser
   política sin que nadie lo decidiera. */
.declarar{border-top:1px solid var(--ui-linea-tenue);padding:var(--e3) 0}
.declarar:last-of-type{border-bottom:1px solid var(--ui-linea-tenue)}
.declarar .evidencia{margin:var(--e2) 0 0;border-left:2px solid var(--marca-laton);
  padding-left:var(--e2)}
.declarar .yaEsta{font:var(--tipo-secundario);color:var(--ui-verde);margin:var(--e2) 0 0}

.declarar .casillas{display:flex;flex-wrap:wrap;gap:var(--e2) var(--e3);
  align-items:flex-end;margin-top:var(--e3)}
.declarar .casillas label{display:flex;flex-direction:column;gap:var(--e1);
  font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);text-transform:uppercase;
  color:var(--ui-texto-secundario)}
.declarar .casillas input,.declarar .casillas select{font:var(--tipo-cuerpo);
  padding:6px 8px;border:1px solid var(--ui-linea);border-radius:var(--r);
  background:var(--ui-fondo);color:var(--ui-texto);min-height:var(--toque-min);
  box-sizing:border-box}
.declarar .casillas input{width:9ch;font-variant-numeric:tabular-nums}
.declarar .casillas input:focus,.declarar .casillas select:focus{outline:none;
  border-color:var(--marca-laton)}
.declarar .casillas .guardar{font:var(--tipo-secundario);padding:0 var(--e3);
  min-height:var(--toque-min);border:1px solid var(--ui-texto);border-radius:var(--r);
  background:var(--ui-texto);color:var(--ui-fondo);cursor:pointer}
.declarar .casillas .guardar:disabled{opacity:.5;cursor:default}
.declarar .salida{margin:var(--e2) 0 0}

/* ── Subir el reporte de comisiones ──────────────────────────────────────────────────────
   El `<input type=file>` va oculto y el `<label>` hace de botón: el control nativo se ve
   distinto en cada navegador y no se puede estilar, y aquí todo lo demás es de esta casa.
   El label sigue siendo el control de verdad — teclado y lector de pantalla lo alcanzan. */
.subirReporte{display:flex;align-items:center;gap:var(--e3);flex-wrap:wrap}
.subirReporte .btn{cursor:pointer}
.subirReporte .hd{flex:1;min-width:20ch}
.conciliar .clave{font-variant-numeric:tabular-nums;letter-spacing:.04em}

/* El nombre legible, debajo del original. Va en un tono más tenue y con la flecha: es una
   propuesta, no el nombre del archivo — el de su carpeta no se toca. */
.losPapeles .seLlamaria{display:block;font:var(--tipo-secundario);
  color:var(--ui-texto-secundario);margin-top:2px}

/* ── LOS TRES MONTONES DE «LES TOCA A ELLOS» ─────────────────────────────────────
   Antes eran cuarenta tarjetas iguales: veinte pantallas de teléfono con la misma
   frase impresa cuarenta veces. Ahora el montón que se puede empujar va abierto y
   los otros dos detrás de una línea con su cuenta. Lo que se pliega es la lista,
   no lo que falta. */
.monton{display:flex;flex-direction:column;gap:var(--e3);margin-top:var(--e5)}
.monton > h2{font:var(--tipo-seccion);margin:0}
/* La explicación va UNA vez, aquí, y por eso puede darse el lujo de ser una frase. */
.monton > .hd{margin:0 0 var(--e2);max-width:58ch}

/* El que importa lleva la única barra de color de la pantalla. Todo lo demás es
   beige, así que un solo acento alcanza para decir «empieza por aquí». */
.monton.empuja > h2{display:flex;align-items:center;gap:var(--e2)}
.monton.empuja > h2::before{content:"";width:3px;height:1em;border-radius:2px;
  background:var(--ui-ambar);flex:0 0 auto}

/* Los plegados: la línea es el control, así que se ve y se toca como control. */
details.monton{gap:0}
details.monton > summary{cursor:pointer;list-style:none;display:flex;align-items:center;
  gap:var(--e2);min-height:44px;padding:var(--e2) 0;
  font:var(--tipo-secundario);color:var(--ui-texto-secundario);
  border-top:1px solid var(--ui-linea-tenue)}
details.monton > summary::-webkit-details-marker{display:none}
details.monton > summary::after{content:"ver";margin-left:auto;
  font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);text-transform:uppercase}
details.monton[open] > summary::after{content:"ocultar"}
details.monton > summary .cuantas{font-variant-numeric:tabular-nums;font-weight:600;
  color:var(--ui-texto)}
details.monton[open]{gap:var(--e3);padding-bottom:var(--e4)}
details.monton > .hd{margin:var(--e2) 0 var(--e3);max-width:58ch}

/* ── EL ESQUELETO DE LO QUE SE ESTÁ ESCRIBIENDO ──────────────────────────────────
   Tiene la forma del párrafo que viene: tres renglones, el último corto. Dice que
   algo está pasando y de qué tamaño, que es lo que una palabra en cursiva no dice. */
.redaccion .esqueleto{display:flex;flex-direction:column;gap:var(--e2);margin-top:var(--e3)}
.redaccion .esqueleto span{height:12px;border-radius:6px;background:var(--ui-linea-tenue);
  animation:respirar 1.4s ease-in-out infinite}
.redaccion .esqueleto span:nth-child(2){animation-delay:.18s}
.redaccion .esqueleto span:nth-child(3){width:58%;animation-delay:.36s}
@keyframes respirar{0%,100%{opacity:.45}50%{opacity:1}}
/* ⚠️ Quieto para quien pidió que nada se mueva — pero NO invisible: sin la animación
   el esqueleto sigue diciendo que viene algo, que es para lo que está. */
@media (prefers-reduced-motion:reduce){
  .redaccion .esqueleto span{animation:none;opacity:.6}
}

/* ── LAS OTRAS GRAFÍAS DEL NOMBRE ────────────────────────────────────────────────
   Once maneras de escribir al mismo cliente, plegadas. Es la evidencia de que los
   junté bien —tiene que poder verse— pero no es el encabezado de su cliente. */
.otrasGrafias{margin:var(--e3) 0 0}
.otrasGrafias>summary{cursor:pointer;list-style:none;min-height:44px;
  display:inline-flex;align-items:center;gap:6px;
  font:var(--tipo-secundario);color:var(--ui-texto-secundario)}
.otrasGrafias>summary::-webkit-details-marker{display:none}
.otrasGrafias>summary b{font-weight:600;color:var(--ui-texto);
  font-variant-numeric:tabular-nums}
.otrasGrafias>.prosa{margin:var(--e2) 0 0;max-width:62ch}

/* ── LOS DOCUMENTOS DEL CLIENTE, PLEGADOS ───────────────────────────────────────
   Setenta documentos de tres renglones cada uno eran diez de las diecisiete
   pantallas de teléfono que medía el expediente. A un documento se llega por su
   viaje, que ya está arriba; esta lista es la otra puerta y se consulta de vez en
   cuando. Detrás de una línea que dice cuántos hay. */
details.susPapeles{margin-top:var(--e5)}
details.susPapeles>summary{cursor:pointer;list-style:none;min-height:44px;
  display:flex;align-items:baseline;gap:6px;flex-wrap:wrap;
  font:var(--tipo-seccion);border-bottom:1px solid var(--ui-linea-tenue);
  padding-bottom:var(--e2)}
details.susPapeles>summary::-webkit-details-marker{display:none}
details.susPapeles>summary b{font-variant-numeric:tabular-nums}
details.susPapeles>summary .hd{font:var(--tipo-secundario);
  color:var(--ui-texto-secundario)}
details.susPapeles>summary::after{content:"ver";margin-left:auto;
  font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}
details.susPapeles[open]>summary::after{content:"ocultar"}
details.susPapeles>.rejillaPapeles{margin-top:var(--e3)}

/* ── UNA SECCIÓN PLEGADA ─────────────────────────────────────────────────────────
   Mismo gesto que los montones de «les toca a ellos» y los papeles del cliente: el
   encabezado sigue siendo un encabezado, y la cuenta va en él. Lo que es archivo se
   guarda detrás de una línea, no se esconde. */
details.plegada{margin-top:var(--e5)}
details.plegada>summary{cursor:pointer;list-style:none;min-height:44px;
  display:flex;align-items:baseline;gap:var(--e2);
  border-bottom:1px solid var(--ui-linea-tenue);padding-bottom:var(--e2)}
details.plegada>summary::-webkit-details-marker{display:none}
details.plegada>summary h2{margin:0}
details.plegada>summary b{font:var(--tipo-secundario);font-weight:600;
  font-variant-numeric:tabular-nums;color:var(--ui-texto-secundario)}
details.plegada>summary::after{content:"ver";margin-left:auto;
  font:var(--tipo-etiqueta);letter-spacing:var(--letra-etiqueta);
  text-transform:uppercase;color:var(--ui-texto-secundario)}
details.plegada[open]>summary::after{content:"ocultar"}
details.plegada>*:not(summary){margin-top:var(--e3)}
