/* ============================================================
   E1 · el sistema visual
   ============================================================
   Astra lo dijo sin rodeos: la interfaz de obra NO es la plantilla de E1.
   Obra es una herramienta de trabajo para alguien que camina una casa con
   casco; E1 es de un señor que quiere saber cómo están sus cosas. No se
   parecen y no deben parecerse.

   De ahí las decisiones:

   · CALMA, NO TABLERO. Nada de rejillas de números grandes. La pantalla
     empieza con una frase en español que dice cómo están las cosas, y debajo
     lo que necesita atención. Un tablero lleno de cifras sin acción es
     precisamente lo que §6 pide evitar.

   · TIPOGRAFÍA CON JERARQUÍA DE VERDAD. Una escala corta (7 pasos) y solo dos
     pesos. Si todo grita, nada se lee.

   · COLOR CON SIGNIFICADO, NO DECORATIVO. El acento se usa para lo accionable.
     El rojo SOLO para lo vencido. Y hay un color propio —gris punteado— para
     «no se sabe», que es el estado que este producto se toma en serio.

   · ZONAS TÁCTILES DE 44 px como mínimo, porque se usa con el pulgar y a veces
     con el sol encima.

   PALETA: la de las láminas de Planeación — azul #1857C9, tinta #172238,
   superficies blancas, fondo #EEF1F5. La versión anterior era arena y verde;
   se cambió porque la identidad la fija Salvador, no yo.

   TIPOGRAFÍA: las láminas piden Manrope para títulos y Source Sans 3 para
   cuerpo. NO SE PUEDEN CARGAR AQUÍ y hay que decirlo en vez de fingirlo: el
   proyecto no mete dependencias de red, y esos archivos no vienen en el
   paquete. Va una pila del sistema con las mismas proporciones —peso 700 para
   títulos, 400/600 para cuerpo— y las familias quedan nombradas primero, así
   que el día que existan los archivos entran solas sin tocar una línea.
   ============================================================ */

:root{
  /* La paleta de las láminas. */
  /* LA PALETA DE LA BASE VISUAL, con el contraste medido y no supuesto —la
     propia base dice que son «referencias de la muestra, no autorización de
     sustituir todos los colores existentes sin comprobar contraste»—:

       texto #172238 sobre blanco        15.88:1
       texto #172238 sobre el fondo      14.69:1
       secundario #58667B sobre blanco    5.83:1
       acción #1E56C8 sobre blanco        6.52:1
       blanco sobre el botón #1E56C8      6.52:1
       acción sobre selección #E8EFFC     5.65:1

     Todo eso pasa AA con holgura. El divisor #E1E6ED da 1.25:1, que está bien
     para una línea entre renglones —el contenido ya separa— pero NO para el
     borde de un control, donde WCAG pide 3:1. Por eso `--linea-fuerte` no es
     el divisor aclarado: es #7d8a9e, que da 3.50:1 sobre blanco y 3.24:1
     sobre el fondo. */
  --fondo:#f5f6f8;
  --tarjeta:#ffffff;
  --tarjeta-2:#f7f9fc;
  --linea:#e1e6ed;
  --linea-fuerte:#7d8a9e;

  --tinta:#172238;
  --tinta-2:#58667b;
  --tinta-3:#8592a8;

  --acento:#1e56c8;
  --acento-claro:#e8effc;
  --acento-tinta:#123f92;

  --alerta:#b3261e;          /* SOLO vencido */
  --alerta-claro:#fdecea;
  --aviso:#8a5a12;           /* pronto, en espera, por confirmar */
  --aviso-claro:#fdf3e0;

  --r-s:10px; --r:14px; --r-l:20px;
  --sombra:0 1px 2px rgba(28,26,23,.04), 0 6px 20px rgba(28,26,23,.05);
  --sombra-alta:0 8px 40px rgba(28,26,23,.16);

  /* Escala tipográfica: 7 pasos y se acabó. */
  --t-xs:11.5px; --t-s:13px; --t-m:15px; --t-l:17px;
  --t-xl:21px; --t-2xl:26px; --t-3xl:32px;

  --e-1:4px; --e-2:8px; --e-3:12px; --e-4:16px; --e-5:24px; --e-6:32px; --e-7:48px;

  /* Las escribe `marca.js`. Aquí van los valores de respaldo, para que la app
     se vea bien aunque ese módulo no llegue a correr. */
  --tipo-titulos:"Manrope",-apple-system,BlinkMacSystemFont,"Segoe UI",system-ui,sans-serif;
  --tipo-cuerpo:"Source Sans 3",-apple-system,BlinkMacSystemFont,"Segoe UI",system-ui,sans-serif;
}

@media (prefers-color-scheme:dark){
  :root:not([data-theme="light"]){
    --fondo:#0f1521; --tarjeta:#18202e; --tarjeta-2:#1e2836;
    --linea:#2a3446; --linea-fuerte:#3c4860;
    --tinta:#eef2f8; --tinta-2:#a9b5c8; --tinta-3:#7a8699;
    --acento:#7aa6f5; --acento-claro:#152744; --acento-tinta:#b9d0fb;
    --alerta:#f2b8b5; --alerta-claro:#3a1d1b;
    --aviso:#e8c284; --aviso-claro:#3a2d14;
    --sombra:0 1px 2px rgba(0,0,0,.4);
    --sombra-alta:0 8px 40px rgba(0,0,0,.6);
  }
}

*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
  margin:0; background:var(--fondo); color:var(--tinta);
  /* «Source Sans 3» va primero: si algún día están los archivos, entra sola. */
  font:var(--t-m)/1.5 var(--tipo-cuerpo);
  overflow-x:hidden;
  padding-bottom:calc(70px + env(safe-area-inset-bottom));
}
h1,h2,h3{margin:0;font-family:var(--tipo-titulos);
  font-weight:700;letter-spacing:-.02em;line-height:1.22}
p{margin:0}
button,input,select,textarea{font:inherit;color:inherit}
[hidden]{display:none!important}
::selection{background:var(--acento-claro);color:var(--acento-tinta)}

/* ---------- encabezado ---------- */
.cab{
  position:sticky; top:0; z-index:30; background:var(--fondo);
  padding:calc(var(--e-3) + env(safe-area-inset-top)) var(--e-4) var(--e-3);
  display:flex; align-items:center; gap:var(--e-3);
  border-bottom:1px solid transparent; transition:border-color .2s;
}
.cab.pegada{border-color:var(--linea)}
.cab h1{font-size:var(--t-xl); flex:1; min-width:0}
.cab .sub{font-size:var(--t-s); color:var(--tinta-3); font-weight:400; display:block; margin-top:1px}

.senal{
  display:inline-flex; align-items:center; gap:6px; flex:none;
  min-height:34px; padding:0 var(--e-3); border-radius:999px;
  border:1px solid var(--linea); background:var(--tarjeta);
  font-size:var(--t-xs); color:var(--tinta-2); cursor:pointer;
}
.senal .led{width:7px;height:7px;border-radius:50%;background:var(--acento)}
.senal.sin{background:var(--aviso-claro);color:var(--aviso);border-color:transparent}
.senal.sin .led{background:currentColor}

main{padding:0 var(--e-4) var(--e-6); max-width:720px; margin:0 auto}

/* ---------- marca y distintivo de muestra ---------- */
.marca{flex:1; display:flex; align-items:center; gap:var(--e-3); min-width:0}
.logo{font-family:var(--tipo-titulos); font-weight:800; font-size:var(--t-l);
  letter-spacing:.06em; color:var(--acento); white-space:nowrap}
/* El nombre puede ser MÁS LARGO que SERENO el día que lo elija naming. Se
   encoge antes de empujar al distintivo de muestra fuera de la pantalla. */
.marca{min-width:0}
.marca>[data-marca-logo]{flex:0 1 auto; min-width:0; overflow:hidden}
.marca>[data-marca-logo] .logo{display:block; overflow:hidden; text-overflow:ellipsis}
/* Siempre visible. Si la demo se enseña en una junta, nadie tiene que
   acordarse de que los datos son de prueba: lo dice la pantalla. */
/* `flex:none` NO es cosmético: con un nombre largo —y el nombre va a cambiar,
   porque SERENO es provisional— el reparto elástico comprimía este distintivo
   hasta «De…». El aviso de que los datos son ficticios no se encoge; el que se
   encoge es el logo, que la persona ya sabe cómo se llama. */
.demo{flex:none; font-size:var(--t-xs); color:var(--tinta-2); background:var(--tarjeta);
  border:1px solid var(--linea); border-radius:999px; padding:4px var(--e-2);
  white-space:nowrap}
.titular{max-width:720px; margin:0 auto; padding:var(--e-2) var(--e-4) 0}
.titular h1{font-size:var(--t-2xl)}
.titular .sub{display:block; font-size:var(--t-s); color:var(--tinta-3); margin-top:2px}
@media (min-width:860px){ .titular{margin:0; padding-left:var(--e-5); max-width:760px} }
/* NO se esconde en pantallas chicas. La primera versión la ocultaba por debajo
   de 380 px «para que cupiera», y esconder justo en el teléfono el aviso de que
   los datos son ficticios es esconderlo donde más importa. Se acorta el texto,
   que es otra cosa. */
@media (max-width:519px){
  .demo{font-size:10.5px; padding:3px 7px}
}

/* ---------- el saludo de Inicio ---------- */
.resumen{
  padding:var(--e-4) 0 var(--e-5);
}
.resumen .frase{font-size:var(--t-2xl); line-height:1.2; letter-spacing:-.02em}
.resumen .frase em{font-style:normal; color:var(--acento)}
.resumen .frase b{font-weight:650; color:var(--alerta)}
.resumen .pie{margin-top:var(--e-2); color:var(--tinta-2); font-size:var(--t-s)}

/* ---------- secciones ---------- */
.seccion{margin-bottom:var(--e-5)}
.seccion>h2{
  font-size:var(--t-xs); text-transform:uppercase; letter-spacing:.09em;
  color:var(--tinta-3); margin:0 0 var(--e-2) 2px; font-weight:650;
}
.seccion>h2 .cuenta{color:var(--tinta-3); font-weight:400; letter-spacing:0; text-transform:none}

.tarjeta{
  background:var(--tarjeta); border:1px solid var(--linea);
  border-radius:var(--r); box-shadow:var(--sombra); overflow:hidden;
}

/* ---------- filas ---------- */
.fila{
  display:flex; gap:var(--e-3); align-items:center; width:100%;
  min-height:56px; padding:var(--e-3) var(--e-4);
  border:0; border-bottom:1px solid var(--linea);
  background:none; text-align:left; cursor:pointer;
}
.fila:last-child{border-bottom:0}
.fila:hover{background:var(--tarjeta-2)}
.fila:active{background:var(--linea)}
.fila.quieta{cursor:default}
.fila.quieta:hover{background:none}
.fila .barra{flex:none; width:3px; align-self:stretch; border-radius:2px; background:var(--linea-fuerte); margin:10px 0}
.fila .barra.vencida{background:var(--alerta)}
.fila .barra.hoy,.fila .barra.pronto{background:var(--aviso)}
.fila .barra.calma{background:var(--acento)}
.fila .barra.nose{background:repeating-linear-gradient(180deg,var(--tinta-3) 0 3px,transparent 3px 6px)}
.fila .txt{flex:1; min-width:0}
/* Hasta DOS líneas antes de cortar. En 375 px, «Garantía de muestra por
   vencer» se quedaba en «Garantía de muestra por…», que es justo la parte que
   no dice nada. El subtítulo sí se corta en una: ahí lo importante va primero. */
.fila .tit{display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical;
  overflow:hidden; font-weight:550; line-height:1.35}
.fila .sub{display:block; font-size:var(--t-s); color:var(--tinta-2); margin-top:2px;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.fila .flecha{flex:none; color:var(--tinta-3); font-size:var(--t-l)}

/* ---------- etiquetas ---------- */
.etq{
  flex:none; font-size:var(--t-xs); font-weight:550; white-space:nowrap;
  padding:4px var(--e-2); border-radius:999px;
  background:var(--linea); color:var(--tinta-2);
}
.etq.mala{background:var(--alerta-claro); color:var(--alerta)}
.etq.media{background:var(--aviso-claro); color:var(--aviso)}
.etq.buena{background:var(--acento-claro); color:var(--acento-tinta)}
:root[data-theme="dark"] .etq.buena{color:var(--acento)}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]) .etq.buena{color:var(--acento)}}
/* «No se sabe» tiene aspecto propio: borde punteado y gris. Si se pintara de
   rojo, el sistema estaría gritando por un dato que nunca tuvo. */
.etq.nose{background:transparent; color:var(--tinta-3); border:1px dashed var(--linea-fuerte); font-weight:400}
.etq.origen{background:transparent; color:var(--tinta-3); font-weight:400; font-size:var(--t-xs); padding-left:0}
.etq.ficticio{background:repeating-linear-gradient(45deg,var(--aviso-claro) 0 6px,transparent 6px 12px);
  color:var(--aviso); border:1px solid var(--aviso-claro)}

/* ---------- botones ---------- */
.btn{
  display:flex; align-items:center; justify-content:center; gap:var(--e-2);
  width:100%; min-height:50px; padding:0 var(--e-4);
  border-radius:var(--r-s); border:1px solid transparent;
  background:var(--acento); color:#fff; font-weight:600; cursor:pointer;
  margin-top:var(--e-3);
}
/* Lo cazó Astra: `:root:not([data-theme="light"])` se cumple SIEMPRE, porque el
   HTML nunca fija ese atributo. O sea que el texto oscuro del tema oscuro se
   estaba aplicando también en claro.
   La primera corrección fue dejar blanco SIEMPRE, y estaba mal por el otro
   lado: en tema oscuro el acento es un azul CLARO (#7aa6f5) y blanco sobre él
   no llega ni a 2:1. Lo destapó la comprobación de marca al mirar el oscuro.
   Ahora cada tema lleva el suyo, con el guardado donde corresponde: dentro del
   `@media`, que es lo único que de verdad significa «oscuro». */
@media (prefers-color-scheme:dark){
  :root:not([data-theme="light"]) .btn{color:#0d1a2e}
  :root:not([data-theme="light"]) .op[aria-pressed="true"]{color:#0d1a2e}
}
:root[data-theme="dark"] .btn{color:#0d1a2e}
:root[data-theme="dark"] .op[aria-pressed="true"]{color:#0d1a2e}
.btn.suave{background:var(--tarjeta); color:var(--tinta); border-color:var(--linea-fuerte)}
.btn.texto{background:none; color:var(--acento); border:0; min-height:44px; font-weight:550}
.btn:active{transform:scale(.99); opacity:.9}
.btn[disabled]{opacity:.45; cursor:not-allowed}

/* ---------- estados ---------- */
.estado{padding:var(--e-6) var(--e-4); text-align:center}
.estado .ico{font-size:30px; line-height:1; margin-bottom:var(--e-3); opacity:.5}
.estado b{display:block; font-size:var(--t-l); margin-bottom:var(--e-2)}
.estado p{color:var(--tinta-2); font-size:var(--t-s); max-width:36ch; margin:0 auto}
.cargando{padding:var(--e-5) var(--e-4)}
.hueso{height:14px; border-radius:7px; background:var(--linea);
  animation:late 1.4s ease-in-out infinite; margin-bottom:var(--e-2)}
.hueso.corto{width:45%} .hueso.medio{width:72%}
@keyframes late{0%,100%{opacity:.55}50%{opacity:1}}
@media (prefers-reduced-motion:reduce){.hueso{animation:none}}

.nota{
  display:flex; gap:var(--e-3); padding:var(--e-3) var(--e-4);
  border-radius:var(--r-s); background:var(--tarjeta-2);
  border:1px solid var(--linea); font-size:var(--t-s); color:var(--tinta-2);
  margin:var(--e-3) 0;
}
.nota.aviso{background:var(--aviso-claro); border-color:transparent; color:var(--aviso)}
.nota.mala{background:var(--alerta-claro); border-color:transparent; color:var(--alerta)}
.nota b{color:inherit}

/* ---------- buscar ---------- */
.buscar{position:relative; margin-bottom:var(--e-4)}
.buscar input{
  width:100%; min-height:48px; padding:0 var(--e-4) 0 42px;
  border:1px solid var(--linea); border-radius:var(--r-s);
  background:var(--tarjeta); color:var(--tinta);
}
.buscar input:focus{outline:2px solid var(--acento); outline-offset:-1px; border-color:transparent}
.buscar .lupa{position:absolute; left:var(--e-3); top:50%; transform:translateY(-50%);
  color:var(--tinta-3); pointer-events:none}

/* ---------- navegación ---------- */
/* LA BARRA PRINCIPAL, y SOLO ella. Estas reglas decían `nav` a secas, así que
   alcanzaban a cualquier <nav> de la página: cuando el expediente estrenó sus
   pestañas, heredaron `position:fixed` y `flex-direction:column` y salieron
   apiladas en una columna sobre el contenido. Un selector de elemento es una
   regla que no sabe a quién le va a pegar. */
#nav{
  position:fixed; left:0; right:0; bottom:0; z-index:40; display:flex;
  background:color-mix(in srgb, var(--tarjeta) 92%, transparent);
  backdrop-filter:blur(12px); border-top:1px solid var(--linea);
  padding-bottom:env(safe-area-inset-bottom);
}
nav button{
  flex:1; min-height:58px; border:0; background:none; cursor:pointer;
  color:var(--tinta-3); font-size:var(--t-xs); font-weight:550;
  display:flex; flex-direction:column; align-items:center; justify-content:center;
  gap:3px; position:relative;
}
nav button[aria-current="page"]{color:var(--acento)}
#nav .ico{font-size:19px; line-height:1}
#nav .globo{
  position:absolute; top:9px; left:50%; margin-left:6px;
  background:var(--alerta); color:#fff; font-size:10px; font-weight:700;
  min-width:17px; height:17px; border-radius:9px; display:grid; place-items:center; padding:0 4px;
}

/* Escritorio: la navegación pasa al costado y el contenido respira. */
@media (min-width:860px){
  body{padding-bottom:0; padding-left:212px}
  #nav{
    top:0; right:auto; width:212px; flex-direction:column; justify-content:flex-start;
    border-top:0; border-right:1px solid var(--linea); padding-top:var(--e-6); gap:2px;
  }
  nav button{flex:none; flex-direction:row; justify-content:flex-start; gap:var(--e-3);
    padding:0 var(--e-4); font-size:var(--t-m); min-height:46px; border-radius:var(--r-s);
    margin:0 var(--e-2)}
  nav button[aria-current="page"]{background:var(--acento-claro)}
  #nav .globo{position:static; margin-left:auto}
  .cab{padding-left:var(--e-5)}
  main{padding-left:var(--e-5); padding-right:var(--e-5); max-width:760px; margin:0}
}

/* ---------- ventana ---------- */
.modal{position:fixed; inset:0; z-index:60; background:rgba(20,18,15,.5);
  display:flex; align-items:flex-end; justify-content:center; animation:aparece .15s ease-out}
@keyframes aparece{from{opacity:0}to{opacity:1}}
@media(min-width:640px){.modal{align-items:center}}
.caja{
  background:var(--fondo); width:100%; max-width:560px; max-height:92vh; overflow:auto;
  border-radius:var(--r-l) var(--r-l) 0 0; box-shadow:var(--sombra-alta);
  padding:var(--e-5) var(--e-4) calc(var(--e-5) + env(safe-area-inset-bottom));
  animation:sube .22s cubic-bezier(.2,.8,.2,1);
}
@keyframes sube{from{transform:translateY(14px)}to{transform:none}}
@media (prefers-reduced-motion:reduce){.modal,.caja{animation:none}}
@media(min-width:640px){.caja{border-radius:var(--r-l)}}
.caja h2{font-size:var(--t-xl); margin-bottom:var(--e-1)}
.caja .intro{color:var(--tinta-2); font-size:var(--t-s); margin-bottom:var(--e-4)}

label{display:block; font-size:var(--t-s); font-weight:550; margin:var(--e-4) 0 var(--e-2)}
label .opt{color:var(--tinta-3); font-weight:400}
input,select,textarea{
  width:100%; min-height:48px; padding:var(--e-3);
  border:1px solid var(--linea-fuerte); border-radius:var(--r-s);
  background:var(--tarjeta); color:var(--tinta);
}
textarea{min-height:88px; resize:vertical; line-height:1.5}
input:focus,select:focus,textarea:focus{outline:2px solid var(--acento); outline-offset:-1px; border-color:transparent}

.opciones{display:flex; flex-wrap:wrap; gap:var(--e-2); margin-top:var(--e-2)}
.op{
  min-height:44px; padding:0 var(--e-4); border-radius:999px;
  border:1px solid var(--linea-fuerte); background:var(--tarjeta);
  cursor:pointer; font-size:var(--t-s); font-weight:500;
}
.op[aria-pressed="true"]{background:var(--acento); color:#fff; border-color:transparent}


.par{display:flex; gap:var(--e-3)} .par>*{flex:1}

/* interruptor de permiso, para la pantalla de compartir */
.permiso{display:flex; align-items:center; gap:var(--e-3); padding:var(--e-3) 0;
  border-bottom:1px solid var(--linea)}
.permiso:last-child{border-bottom:0}
.permiso .txt{flex:1}
.permiso .tit{font-weight:550; font-size:var(--t-m)}
.permiso .sub{font-size:var(--t-s); color:var(--tinta-2)}
.permiso input[type=checkbox]{width:auto; min-height:auto; flex:none; width:22px; height:22px; accent-color:var(--acento)}

/* vista previa de lo que se comparte */
.previa{background:var(--acento-claro); border-radius:var(--r-s); padding:var(--e-4); margin-top:var(--e-4)}

.previa h3{font-size:var(--t-s); text-transform:uppercase; letter-spacing:.08em; color:var(--acento-tinta); margin-bottom:var(--e-2)}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]) .previa h3{color:var(--acento)}}
.previa ul{margin:0; padding-left:18px; font-size:var(--t-s); color:var(--tinta-2)}
.previa li{margin:3px 0}

.dato{display:flex; justify-content:space-between; gap:var(--e-3); padding:var(--e-3) 0;
  border-bottom:1px solid var(--linea); font-size:var(--t-s)}
.dato:last-child{border-bottom:0}
.dato dt{color:var(--tinta-2)} .dato dd{margin:0; text-align:right; font-weight:500}
.dato dd.vacio{color:var(--tinta-3); font-weight:400; font-style:italic}

/* ---------------------------------------------------------------
   La portada · entrar, crear cuenta, primer paso
   ---------------------------------------------------------------
   Los nombres de la paleta salen de `:root`, no de la memoria: escribí
   --papel, --letra, --r-2, --mala-tinta… y ninguno existe. Una variable
   CSS que no existe no da error: el color simplemente no se aplica y la
   pantalla queda medio pintada sin que nada avise.

   Tapa la app entera. No es el modal: del modal se sale con Escape o
   picando fuera, y de aquí no se sale sin entrar. Por eso es otra clase
   y no un modal con una bandera. */
.portada{position:fixed; inset:0; z-index:60; overflow-y:auto;
  background:var(--fondo); display:flex; align-items:flex-start;
  justify-content:center; padding:max(24px,env(safe-area-inset-top)) 16px 40px}
.portada .hoja{width:100%; max-width:420px; background:var(--tarjeta);
  border:1px solid var(--linea); border-radius:var(--r-l); padding:24px 20px 20px;
  box-shadow:var(--sombra-alta); margin-top:6vh}
.portada h2{margin:0 0 6px; font:600 22px/1.25 var(--tipo-cuerpo)}
.portada .intro{margin-bottom:18px}
.portada-marca{display:flex; justify-content:center; margin-bottom:18px}
.portada-marca img{max-height:34px}
.portada label{display:block; margin-bottom:14px; font:600 13px/1.4 var(--tipo-cuerpo); color:var(--tinta-2)}
.portada label input, .portada label select{display:block; width:100%; margin-top:6px}
.portada .campo{margin-bottom:16px}
.portada .campo .etiq{display:block; font:600 13px/1.4 var(--tipo-cuerpo);
  color:var(--tinta-2); margin-bottom:8px}
.portada .pista{display:block; margin-top:8px; font:400 12px/1.45 var(--tipo-cuerpo); color:var(--tinta-3)}
.malo{background:var(--alerta-claro); color:var(--alerta); border-radius:var(--r-s);
  padding:10px 12px; margin-bottom:14px; font:500 13px/1.45 var(--tipo-cuerpo)}
/* El distintivo cuando se habla con un servidor de verdad: mismo sitio, otro
   color, para que no se confunda con el de datos ficticios. */
.demo.servidor{background:var(--acento-claro); color:var(--acento-tinta)}
.salir{margin-left:8px; background:transparent; border:1px solid var(--linea);
  color:var(--tinta-2); border-radius:999px; padding:5px 12px;
  font:600 12px/1 var(--tipo-cuerpo); cursor:pointer}
.salir:hover{border-color:var(--tinta-3); color:var(--tinta)}

/* ===============================================================
   EL EXPEDIENTE · una pantalla, no un recuadro
   ===============================================================
   Lo que se buscaba: que la propiedad no llegue como un modal con cinco
   listas apiladas. El encabezado se queda arriba con el nombre y el
   siguiente paso; las secciones se eligen y solo se pinta una.

   En escritorio el cuerpo tiene ANCHO DE LECTURA. «Pantalla completa» no
   quiere decir estirar las mismas tarjetas a lo ancho de un monitor: un
   renglón de 1400 px no se lee, se recorre con el cuello. */
.exp-cab{margin:0 0 var(--e-5)}
.volver{background:none; border:0; padding:4px 0; margin:0 0 var(--e-2);
  color:var(--acento); font:600 var(--t-m)/1 var(--tipo-cuerpo); cursor:pointer}
.volver:hover{text-decoration:underline}
.exp-cab h1{font:700 var(--t-2xl)/1.15 var(--tipo-titulos); margin:0 0 4px;
  letter-spacing:-.02em}
.exp-donde{margin:0 0 var(--e-4); color:var(--tinta-2); font-size:var(--t-m)}
.enlace{background:none; border:0; padding:0; color:var(--acento);
  font:inherit; cursor:pointer; text-decoration:underline}
.exp-acciones{display:flex; flex-wrap:wrap; gap:var(--e-2); margin-bottom:var(--e-4)}
.exp-acciones .btn{margin:0; width:auto; flex:1 1 auto; min-width:180px}
.exp-acciones .btn.texto{flex:0 0 auto; min-width:0}

/* Las secciones: pestañas que RUEDAN en el teléfono en vez de comprimirse.
   Encoger seis títulos para que quepan es como se llega a «Manten…» */
/* LAS PESTAÑAS RUEDAN, Y SE TIENE QUE NOTAR. A 375 px caben tres y media, y
   la cuarta se cortaba sin ninguna señal: parecía que Historial y Documentos
   no existían. Comprimir los cinco títulos para que quepan es lo que la
   devolución de diseño prohíbe —«sin comprimirlas»—, así que ruedan y el
   degradado del borde dice que hay más. */
.exp-tabs-caja{position:relative}
.exp-tabs-caja::after{content:''; position:absolute; right:0; top:0; bottom:2px;
  width:36px; pointer-events:none;
  background:linear-gradient(to right, transparent, var(--fondo) 70%)}
.exp-tabs{position:static; display:flex; gap:2px; overflow-x:auto; padding:0 0 2px;
  border-bottom:1px solid var(--linea); background:none; backdrop-filter:none;
  scrollbar-width:none; -webkit-overflow-scrolling:touch}
.exp-tabs::-webkit-scrollbar{display:none}
.exp-tabs button{flex:0 0 auto; background:none; border:0; cursor:pointer;
  padding:10px 14px; margin-bottom:-1px; color:var(--tinta-2);
  font:600 var(--t-m)/1 var(--tipo-cuerpo); border-bottom:2px solid transparent}
.exp-tabs button[aria-selected="true"]{color:var(--acento); border-bottom-color:var(--acento)}
.exp-cuerpo{max-width:760px}

/* Filtros en fila · para inventario e historial */
.filtros{display:flex; gap:var(--e-2); overflow-x:auto; padding-bottom:var(--e-2);
  margin-bottom:var(--e-3); scrollbar-width:none}
.filtros::-webkit-scrollbar{display:none}
.chip{flex:0 0 auto; background:var(--tarjeta); border:1px solid var(--linea);
  color:var(--tinta-2); border-radius:999px; padding:6px 13px; cursor:pointer;
  font:600 var(--t-s)/1 var(--tipo-cuerpo)}
.chip.sel{background:var(--acento); border-color:var(--acento); color:#fff}

/* El icono de cada evento del historial */
.ev-ico{flex:none; width:26px; height:26px; border-radius:999px; display:grid;
  place-items:center; margin-right:var(--e-3); background:var(--fondo);
  color:var(--tinta-3); font:700 12px/1 var(--tipo-cuerpo)}
.ev-ico.reporte{background:var(--alerta-claro); color:var(--alerta)}
.ev-ico.trabajo{background:var(--acento-claro); color:var(--acento-tinta)}
.ev-ico.gasto,.ev-ico.autorizacion{background:var(--aviso-claro); color:var(--aviso)}

/* El distintivo del entorno de prueba: discreto, y sin jerga.
   Decía «Contra Servidor local», que es una frase de programador dentro del
   discurso de alguien que solo quiere ver su casa. */
.demo.prueba{background:var(--fondo); color:var(--tinta-3); font-weight:500}

@media (min-width:768px){
  .exp-cab h1{font-size:var(--t-3xl)}
  /* «Sin enviar» al final de la barra lateral: es estado, no un destino diario. */
  .nav-cola{margin-top:auto}
}

/* El monograma de la lámina: dos letras del propio nombre, no un icono nuevo.
   `aria-hidden` porque no aporta nada a quien escucha la pantalla: el nombre
   va justo al lado y decir «A-C, Aire acondicionado» sería repetirlo mal. */
.mono{flex:none; width:40px; height:40px; border-radius:8px; display:grid;
  place-items:center; margin-right:var(--e-3); background:var(--fondo);
  color:var(--tinta-2); font:700 13px/1 var(--tipo-titulos); letter-spacing:.02em}
.fila .mono + .txt{min-width:0}

/* El enlace «Historial» que va a la derecha del título de sección. */
.seccion h2 .enlace{font:600 var(--t-m)/1 var(--tipo-cuerpo); text-decoration:none}
.seccion h2 .enlace:hover{text-decoration:underline}

/* UNA SOLA FORMA DE ACORTAR UN TEXTO EN PANTALLA CHICA.
   Había dos: `.demo .largo` escondía la coletilla del distintivo a 420 px, y
   yo acababa de escribir otra a 520 para el encabezado. Dos mecanismos para lo
   mismo es como se pudre una hoja de estilo: el día que alguien cambie uno,
   el otro se queda. Queda una, y el caso especial del distintivo desaparece.

   Lo que NO cambia: el aviso de datos ficticios no se esconde en el teléfono
   —ahí es donde más importa—, se ACORTA. Y el nombre accesible siempre lleva
   la frase entera, así que quien escucha la pantalla no pierde nada.

   Y con nombres que no chocan: `.corto` YA existía como modificador del
   esqueleto de carga (`.hueso.corto{width:45%}`), así que una utilidad global
   con ese nombre le habría cambiado el `display` a un bloque que no es texto.
   Un nombre corto y genérico en una hoja compartida es una colisión esperando. */
.solo-chica{display:inline}
.solo-ancha{display:none}
@media (min-width:520px){ .solo-chica{display:none} .solo-ancha{display:inline} }

/* ===============================================================
   LA ZONA QUE SE TOCA, NO LA QUE SE VE  ·  44 px en el teléfono
   ===============================================================
   La base visual pide «controles táctiles de al menos 44 px de zona
   efectiva». Medido a 360, 390 y 430 px, seis controles no llegaban: la
   señal (34), Salir (24), los filtros del historial (27), «‹ Propiedades»
   (23), el enlace «Historial» del título de sección (15) y el «ver Casa
   Flamingo» del expediente de un vehículo (23).

   ZONA EFECTIVA, no tamaño. Astra aprobó la lámina con estos pesos y estos
   aires; engordar un enlace de 15 px para llegar a 44 sería cambiar el
   diseño aprobado por una regla que no pide tamaño, pide puntería. Así que
   la zona crece y lo que se ve se queda igual.

   SOLO A LO ALTO, salvo la señal. A lo ancho los demás ya pasan de 44, y
   estirarlos de más los metería unos dentro de otros.

   Y SOLO EN PANTALLA CHICA. Con ratón, una zona invisible más alta que el
   enlace se come clics de lo que tiene arriba y abajo. El puntero fino no
   necesita ayuda; el dedo sí.

   La medición está en `medir-toques.js`, para que esto se compruebe en vez
   de creerse. */
@media (max-width:767px){

  .senal, .salir, .seccion h2 .enlace, .exp-donde .enlace{position:relative}
  .senal::after, .salir::after,
  .seccion h2 .enlace::after, .exp-donde .enlace::after{
    content:''; position:absolute; left:0; right:0;
    top:50%; transform:translateY(-50%); height:44px;
  }
  /* La señal es la única que tampoco llega de ancho: 33 px. Los 7 de cada
     lado caben en los 8 que la separan de «Salir» —queda 1 px—, así que
     las dos zonas siguen sin tocarse. */
  .senal::after{left:-7px; right:-7px}

  /* DOS que no se arreglan con la caja invisible, cada uno por lo suyo.

     Los filtros del historial van en una fila que se desliza a lo ancho, y
     `overflow-x:auto` obliga al navegador a poner también `overflow-y:auto`:
     la fila mide 35 px y RECORTA lo que se salga por arriba y por abajo. La
     zona invisible de 44 quedaba en 35 clavados —el alto de la fila— en las
     tres pantallas. Un contenedor que se desliza no deja crecer a nadie
     hacia afuera; ahí la pastilla tiene que crecer de verdad.
     Medido: 27 · 35 · 44.

     «‹ Propiedades» es el otro caso:
     está pegado bajo el encabezado, que es pegajoso y se pinta encima, así
     que la mitad de arriba de la zona queda debajo de él. Medí 33.

     Entonces la caja crece de verdad —pero HACIA ABAJO, no repartida—, y
     el espacio de abajo se recoge los mismos 21 px que creció, para que el
     título siga cayendo donde caía. Mi primer intento repartió el
     crecimiento con 11 px de margen negativo arriba y volvió a meterse
     debajo del encabezado: la caja medía 44 y solo 28 recibían el toque.
     Un arreglo de puntería que empeora la puntería.

     Y recoger el espacio abajo mete el título 13 px dentro del botón; como
     el h1 se pinta después, se quedaba él con esos toques —28 otra vez,
     por el otro extremo—. `z-index` lo resuelve sin mover nada de sitio:
     el título no es clicable, así que lo único que cambia es que el borde
     invisible del botón pasa por encima de un texto inerte.
     Medido, en orden: 23 · 28 · 30 · 44. */
  .chip{min-height:44px; display:inline-flex; align-items:center; padding:6px 13px}
  .volver{min-height:44px; display:inline-flex; align-items:center; padding:0;
    margin-bottom:calc(var(--e-2) - 21px); position:relative; z-index:1}
}

/* Revisión funcional R2: escritorio amplio, formulario con errores visibles. */
.error-form { padding:16px; margin:0 0 16px; border:1px solid #cf625a; border-radius:12px; background:#fff1ef; color:#7a2821; }
@media (min-width:860px) {
  main, .titular { width:100%; max-width:1440px; margin-inline:auto; }
  .exp-cuerpo { max-width:none; }
  .lista-bienes { display:grid; grid-template-columns:repeat(auto-fit,minmax(320px,1fr)); gap:16px; background:transparent; border:0; box-shadow:none; overflow:visible; }
  .lista-bienes > .fila { background:var(--tarjeta); border:1px solid var(--linea); border-radius:16px; min-height:112px; }
}
