/* El portal entero, sin framework y sin nada de fuera. Lo único que hay al lado
 * es `tipografias.css`, que declara IBM Plex —los mismos ficheros que sirve
 * Umbral en casa de cada cliente— servida desde aquí.
 *
 * ## Las tres decisiones que explican todo lo demás
 *
 * · **Son dos pantallas con dos oficios distintos, y se parecen a propósito.** La
 *   puerta es un escaparate que ve todo internet; la sala es una mesa de trabajo
 *   que vemos nosotros. Comparten el armazón, la tipografía y los colores de
 *   estado, y se diferencian en la densidad: aire en la puerta, filas en la sala.
 *
 * · **La composición es la del contrato de la suite.** Dos columnas centradas con
 *   aire a los lados —1120 px, no dos mitades a sangre—, titular con remates,
 *   tarjeta con esquina de 12 px y sombra suave. Es lo que hace que la puerta de
 *   la sala y la de los módulos parezcan de la misma casa, y está medido sobre lo
 *   que Umbral converge, no copiado a ojo.
 *
 * · **El portal no tiene color de módulo, y eso es deliberado.** Su cromo es un
 *   azul de acero neutro. El color medido de cada módulo aparece SOLO en la
 *   tarjeta de ese módulo: si el cromo llevara el acento de uno de ellos, la
 *   puerta estaría diciendo que ese es el principal.
 *
 * Y una regla que no es estética: **los colores de estado quedan fuera de la
 * personalización**, aquí y en los cuatro módulos. Que el rojo signifique lo
 * mismo en todas las pantallas de la suite es seguridad, no gusto. */

:root {
  color-scheme: light dark;

  --papel: #f4f6f8;
  --tarjeta: #ffffff;
  --hundido: #eef1f4;
  --raya: #dde2e8;
  --raya-fina: #e9edf1;

  --tinta: #151a21;
  --suave: #566173;
  --tenue: #8792a2;

  /* El cromo del portal. No es el acento de ningún módulo. */
  --acento: #2f5d78;
  --acento-fondo: #e8f0f5;
  /* Los botones llevan su propio par, y no `--acento` con blanco encima: en
   * oscuro el acento se aclara para poder leerse sobre el papel oscuro, y
   * entonces blanco sobre él da 1,9:1. Con el par declarado por tema, un botón
   * relleno se lee en los dos sin excepciones escritas en cada regla. */
  --boton-fondo: #2f5d78;
  --boton-tinta: #ffffff;

  --bien: #17734a;
  --bien-fondo: #e4f2ea;
  --aviso: #8a5900;
  --aviso-fondo: #fbf0da;
  --mal: #a5251c;
  --mal-fondo: #fbe9e7;

  /* El paño oscuro de las dos pantallas de presentación. Es oscuro en los dos
   * temas —como el carril del panel—, así que sus colores son suyos y no se
   * derivan de los de arriba. */
  --pano: #121820;
  --pano-raya: #232d3a;
  --pano-lejos: #1b3a4a;

  --curva: .4rem;
  --curva-tarjeta: .75rem;      /* 12 px: la esquina del contrato */
  --ancho: 70rem;               /* 1120 px */

  /* La monoespaciada se declara UNA vez y se pide por aquí. En el panel estaba
   * escrita cuatro veces con dos listas distintas, y así es como una dirección y
   * una versión acaban en dos tipografías que no son la misma. */
  --mono: "IBM Plex Mono", ui-monospace, "Cascadia Mono", Consolas, monospace;
  --serif: "IBM Plex Serif", Georgia, "Times New Roman", serif;
}

/* La paleta oscura está escrita dos veces a propósito, y las dos hacen falta:
 * una para quien ha elegido oscuro y otra para quien no ha elegido nada y su
 * sistema lo pide. Es la forma que tiene Umbral y de ahí se copia, para que una
 * prueba de conformidad pueda buscar los dos bloques por su nombre.
 *
 * **`screen and` no sobra, y es lo que hace que esto se imprima bien.** Sin ello
 * la paleta oscura también vale al imprimir, y entonces las tarjetas salen casi
 * negras. Acotarlo a la pantalla no se olvida nunca; redefinir la paleta entera
 * dentro de `@media print` es una lista que hay que acordarse de ampliar cada vez
 * que nace un color. */
:root[data-tema="oscuro"] {
  --papel: #0d1117;
  --tarjeta: #151b23;
  --hundido: #1b222c;
  --raya: #262f3b;
  --raya-fina: #1f2630;

  --tinta: #e3e8ef;
  --suave: #97a2b2;
  --tenue: #6b7685;

  --acento: #86b6d0;
  --acento-fondo: #14273a;
  --boton-fondo: #86b6d0;
  --boton-tinta: #0d1117;

  --bien: #55c08a;
  --bien-fondo: #10291f;
  --aviso: #d9a53f;
  --aviso-fondo: #2b2113;
  --mal: #ef8375;
  --mal-fondo: #2d1815;

  --pano: #0a0e14;
  --pano-raya: #1c2430;
}

@media screen and (prefers-color-scheme: dark) {
  :root[data-tema="auto"] {
    --papel: #0d1117;
    --tarjeta: #151b23;
    --hundido: #1b222c;
    --raya: #262f3b;
    --raya-fina: #1f2630;

    --tinta: #e3e8ef;
    --suave: #97a2b2;
    --tenue: #6b7685;

    --acento: #86b6d0;
    --acento-fondo: #14273a;
    --boton-fondo: #86b6d0;
    --boton-tinta: #0d1117;

    --bien: #55c08a;
    --bien-fondo: #10291f;
    --aviso: #d9a53f;
    --aviso-fondo: #2b2113;
    --mal: #ef8375;
    --mal-fondo: #2d1815;

    --pano: #0a0e14;
    --pano-raya: #1c2430;
  }
}

* { box-sizing: border-box; }

body {
  margin: 0;
  background: var(--papel);
  color: var(--tinta);
  font: 15px/1.6 "IBM Plex Sans", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  -webkit-text-size-adjust: 100%;
}

/* El salto al contenido. No se esconde con `display:none` —eso lo saca también
 * del recorrido del tabulador y deja de servir para lo único que sirve—: se
 * aparta de la pantalla y vuelve cuando recibe el foco. */
.saltar {
  position: absolute; left: .5rem; top: -4rem; z-index: 10;
  background: var(--boton-fondo); color: var(--boton-tinta);
  padding: .45rem .9rem; border-radius: var(--curva); text-decoration: none;
}
.saltar:focus { top: .5rem; }
main:focus { outline: none; }

/* El foco se ve SIEMPRE y en todo. Esta pantalla se recorre con el tabulador más
 * de lo que parece: son enlaces a otros sitios puestos en rejilla, y sin marca de
 * foco no se sabe a cuál se va a saltar. */
a:focus-visible, button:focus-visible, input:focus-visible {
  outline: 2px solid var(--acento); outline-offset: 2px;
}

a { color: var(--acento); }

.mono { font-family: var(--mono); font-size: .92em; }
.tenue { color: var(--tenue); }
.letra-pequena { font-size: .84rem; }
.mal { color: var(--mal); }
.aviso { color: var(--aviso); }
.bien { color: var(--bien); }

/* ── La barra ─────────────────────────────────────────────────────────────── */
/* Una franja y no un carril lateral: aquí no hay secciones que recorrer —hay dos
 * pantallas—, y un menú vertical para dos sitios gasta un cuarto de la pantalla
 * en decir lo que caben en dos palabras arriba. */
.barra {
  display: flex; align-items: center; justify-content: space-between;
  gap: 1rem 1.5rem; flex-wrap: wrap;
  padding: .7rem clamp(1rem, 4vw, 2rem);
  border-bottom: 1px solid var(--raya);
  background: var(--tarjeta);
}
.marca {
  display: flex; flex-direction: column; text-decoration: none;
  color: var(--tinta); font-weight: 600; letter-spacing: -.01em; font-size: 1.05rem;
}
.marca small { font-weight: 400; font-size: .78rem; color: var(--tenue); letter-spacing: 0; }
.a-la-derecha { display: flex; align-items: center; gap: .9rem; flex-wrap: wrap; }
.a-la-derecha .quien { color: var(--suave); font-size: .88rem; }
.a-la-derecha form { margin: 0; }
.a-la-derecha button {
  font: inherit; font-size: .88rem; cursor: pointer;
  background: none; border: 1px solid var(--raya); color: var(--suave);
  padding: .3rem .7rem; border-radius: var(--curva);
}
.a-la-derecha button:hover { border-color: var(--tenue); color: var(--tinta); }
.enlace-sala { text-decoration: none; font-size: .9rem; }
.enlace-sala.aqui { color: var(--tinta); font-weight: 600; }

/* Tres enlaces pegados, no un desplegable: un desplegable son dos gestos y aquí
 * el valor puesto se lee de un vistazo. */
.tema { display: flex; border: 1px solid var(--raya); border-radius: var(--curva); overflow: hidden; }
.tema a {
  padding: .25rem .55rem; font-size: .78rem; text-decoration: none;
  color: var(--suave); background: var(--tarjeta);
}
.tema a + a { border-left: 1px solid var(--raya); }
.tema a:hover { background: var(--hundido); }
.tema a[aria-current] { background: var(--acento-fondo); color: var(--acento); font-weight: 600; }

/* ── El lienzo y el pie ───────────────────────────────────────────────────── */
main {
  max-width: var(--ancho); margin: 0 auto;
  padding: clamp(1.25rem, 3vw, 2.25rem) clamp(1rem, 4vw, 2rem) 3rem;
}
footer {
  max-width: var(--ancho); margin: 0 auto;
  padding: 1.25rem clamp(1rem, 4vw, 2rem) 2.5rem;
  border-top: 1px solid var(--raya-fina);
  display: flex; flex-wrap: wrap; gap: .4rem 1.25rem; align-items: baseline;
  font-size: .84rem; color: var(--suave);
}
footer .version { margin-left: auto; font-family: var(--mono); color: var(--tenue); }

/* ── Notas ────────────────────────────────────────────────────────────────── */
.nota {
  margin: 0 0 1.25rem; padding: .7rem .9rem;
  border: 1px solid var(--raya); border-left: 3px solid var(--tenue);
  border-radius: var(--curva); background: var(--tarjeta);
}
.nota.mal { border-left-color: var(--mal); background: var(--mal-fondo); color: var(--tinta); }
.nota.aviso { border-left-color: var(--aviso); background: var(--aviso-fondo); color: var(--tinta); }
.nota .ayuda { color: var(--suave); }
.volver { margin-top: 1.5rem; }

/* ── El paño de presentación ──────────────────────────────────────────────── */
/* El mismo paño en la puerta y en la entrada a la sala: fondo oscuro en los dos
 * temas, con una línea de pelo blanca al 7 %. En claro no se ve —es blanca contra
 * casi blanco— y en oscuro es lo que la despega del fondo, que si no quedan dos
 * negros distintos pegados y parece sin acabar. Una regla en vez de una por tema. */
.pano, .acceso-pano {
  background: linear-gradient(160deg, var(--pano) 0%, var(--pano-raya) 55%, var(--pano-lejos) 145%);
  color: #fff;
  box-shadow: 0 0 0 1px rgba(255, 255, 255, .07);
}
.firma { font-size: .95rem; font-weight: 600; opacity: .9; letter-spacing: .01em; }
/* Con remates, y es el único sitio del portal donde los hay: los módulos de la
 * suite titulan con serif su pantalla de entrada, y ésa es la nota que se
 * reconoce de una a otra. La cara es IBM Plex Serif, hermana de la Sans que ya
 * servimos: misma superfamilia, misma licencia, mismo mecanismo. */
.pano h1, .acceso-pano h1 {
  margin: 0; font-family: var(--serif); font-weight: 600;
  font-size: clamp(1.6rem, 3.1vw, 2.2rem); line-height: 1.14; letter-spacing: -.01em;
  max-width: 22ch;
}
.entradilla { margin: 0; font-size: .95rem; line-height: 1.6; color: rgba(255, 255, 255, .78); max-width: 52ch; }
.entradilla strong { color: #fff; font-weight: 600; }
.puntos { display: grid; gap: .8rem; }
.punto {
  display: flex; align-items: flex-start; gap: .7rem; margin: 0;
  font-size: .88rem; line-height: 1.5; color: rgba(255, 255, 255, .87);
}
.punto svg { flex: none; margin-top: .15rem; opacity: .85; }

.presentacion { margin-bottom: 2.5rem; }
.presentacion .pano {
  border-radius: var(--curva-tarjeta);
  padding: clamp(1.5rem, 4vw, 2.75rem);
  display: flex; flex-direction: column; gap: 1.1rem;
}

.titulo-de-seccion {
  font-size: .82rem; text-transform: uppercase; letter-spacing: .08em;
  color: var(--tenue); font-weight: 600; margin: 2.5rem 0 1rem;
}

/* ── Los módulos en la puerta ─────────────────────────────────────────────── */
.modulos { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); }
.modulo {
  display: flex; flex-direction: column; gap: .5rem;
  background: var(--tarjeta); border: 1px solid var(--raya);
  border-radius: var(--curva-tarjeta); padding: 1.25rem;
  /* La sombra suave del contrato, y solo en las tarjetas que se ofrecen: en la
   * sala una ficha con sombra es ruido. */
  box-shadow: 0 10px 26px -12px rgba(16, 24, 32, .18), 0 2px 6px -3px rgba(16, 24, 32, .08);
  /* El color medido del módulo, arriba y sin texto encima: es un distintivo, no
   * información, así que no tiene que cumplir ningún mínimo de contraste. */
  border-top: 3px solid var(--m, var(--tenue));
}
.modulo h3 { margin: .1rem 0 0; font-size: 1.15rem; letter-spacing: -.01em; }
.modulo .lema { margin: 0; font-size: .82rem; text-transform: uppercase; letter-spacing: .06em; color: var(--tenue); }
.modulo .promesa { margin: .3rem 0 1rem; color: var(--suave); font-size: .92rem; flex: 1; }
.modulo .boton { align-self: flex-start; background: var(--m-osc, var(--boton-fondo)); color: #fff; }
/* El que todavía no está: gris, sin sombra y sin enlace. Un hueco anunciado es
 * más honesto que una sorpresa, pero tiene que verse que es un hueco. */
.modulo.previsto {
  box-shadow: none; border-style: dashed; background: var(--hundido);
  border-top-style: solid; border-top-color: var(--tenue);
}
.modulo.previsto h3 { color: var(--suave); }
.todavia-no {
  align-self: flex-start; font-size: .82rem; color: var(--tenue);
  border: 1px dashed var(--raya); border-radius: var(--curva); padding: .35rem .7rem;
}

.boton {
  display: inline-flex; align-items: center; justify-content: center; gap: .4rem;
  font: inherit; font-size: .92rem; font-weight: 600; cursor: pointer;
  background: var(--boton-fondo); color: var(--boton-tinta);
  border: 0; border-radius: var(--curva); padding: .5rem 1rem; text-decoration: none;
}
.boton:hover { filter: brightness(1.08); }
.boton.ancho { width: 100%; }

/* ── La puerta de la sala ─────────────────────────────────────────────────── */
/* Dos columnas CENTRADAS y con aire a los lados, no dos mitades a sangre: en un
 * portátil de 1440 el bloque mide 1120 y quedan 160 a cada lado. Es lo único de
 * esta pantalla que se copia de los otros módulos, y es justo lo que hace que
 * parezcan hermanas. */
.acceso {
  min-height: 100vh; display: grid; grid-template-columns: 1.02fr 1fr;
  max-width: var(--ancho); margin-inline: auto; background: var(--papel);
}
.acceso-pano {
  padding: 3rem clamp(2rem, 6vw, 4.75rem);
  display: flex; flex-direction: column; justify-content: center; gap: 1.6rem;
}
.acceso-formulario { display: grid; place-items: center; padding: 2.5rem 1.5rem; }
.acceso-caja { width: 100%; max-width: 25rem; }
.acceso-marca { display: flex; flex-direction: column; margin-bottom: 1.4rem; font-size: 1.3rem; font-weight: 700; letter-spacing: -.01em; }
.acceso-marca small { font-size: .8rem; font-weight: 400; color: var(--tenue); letter-spacing: 0; }
/* La tarjeta se levanta un poco del fondo: esquina más redonda y sombra suave,
 * como las de los otros módulos. */
.tarjeta {
  background: var(--tarjeta); border: 1px solid var(--raya);
  border-radius: var(--curva-tarjeta); padding: 1.4rem;
  box-shadow: 0 10px 26px -12px rgba(16, 24, 32, .22), 0 2px 6px -3px rgba(16, 24, 32, .10);
}
.campo { display: flex; flex-direction: column; gap: .3rem; margin-bottom: 1rem; }
.campo label { font-size: .85rem; color: var(--suave); font-weight: 600; }
.campo input {
  font: inherit; padding: .55rem .7rem; border-radius: var(--curva);
  border: 1px solid var(--raya); background: var(--papel); color: var(--tinta);
}
.tarjeta-pie {
  margin: 1.1rem 0 0; padding-top: 1rem; border-top: 1px solid var(--raya-fina);
  font-size: .82rem; color: var(--tenue); line-height: 1.55;
}
.acceso .letra-pequena { margin-top: 1rem; line-height: 1.6; }

/* Por debajo de 1000 px el paño se va: en un móvil lo que hace falta es el
 * formulario y no el discurso. La marca sigue estando, porque la lleva arriba el
 * paño del formulario. */
@media (max-width: 1000px) {
  .acceso { grid-template-columns: 1fr; min-height: 0; }
  .acceso-pano { display: none; }
}

/* ── La sala ──────────────────────────────────────────────────────────────── */
.cabecera { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; flex-wrap: wrap; margin-bottom: 1.5rem; }
.cabecera h1 { margin: 0 0 .25rem; font-size: 1.5rem; letter-spacing: -.015em; }
.cabecera p { margin: 0; max-width: 62ch; font-size: .9rem; }
.sangrado { margin-left: .2rem; }

.marcadores { display: grid; gap: .75rem; grid-template-columns: repeat(auto-fit, minmax(7rem, 1fr)); margin-bottom: 1.75rem; }
.marcador {
  background: var(--tarjeta); border: 1px solid var(--raya); border-radius: var(--curva);
  padding: .8rem .9rem; display: flex; flex-direction: column; gap: .15rem;
}
.marcador.ancho { grid-column: span 2; min-width: 12rem; }
/* Cifras en monoespaciada: una columna de números se compara en vertical. */
.marcador .cifra { font-family: var(--mono); font-size: 1.6rem; font-weight: 600; line-height: 1.1; }
.marcador .pie { font-size: .78rem; color: var(--tenue); }
.marcador .dato { font-size: .95rem; }
.marcador.bien .cifra { color: var(--bien); }
.marcador.mal { border-color: var(--mal); background: var(--mal-fondo); }
.marcador.mal .cifra { color: var(--mal); }
/* «Sin saber» nunca en rojo: no saber si algo está vivo no es que esté caído. */
.marcador.sin-saber { border-color: var(--raya); background: var(--hundido); }
.marcador.sin-saber .cifra { color: var(--suave); }

.modulo-sala { margin: 2rem 0; }
.modulo-sala h2 {
  display: flex; align-items: center; gap: .6rem; flex-wrap: wrap;
  margin: 0 0 .9rem; font-size: 1.1rem; letter-spacing: -.01em;
  padding-bottom: .5rem; border-bottom: 1px solid var(--raya-fina);
}
.modulo-sala h2 small { font-weight: 400; font-size: .82rem; color: var(--tenue); text-transform: uppercase; letter-spacing: .06em; }
/* El distintivo del módulo, del tamaño de lo que es: un punto de color. */
.modulo-sala .pinta { width: .7rem; height: .7rem; border-radius: 2px; background: var(--m, var(--tenue)); flex: none; }

.instalaciones { display: grid; gap: .9rem; grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr)); }
.instalacion {
  background: var(--tarjeta); border: 1px solid var(--raya); border-radius: var(--curva);
  padding: .9rem 1rem; display: flex; flex-direction: column; gap: .55rem;
}
/* Los datos son de un cliente, o la máquina tiene aviso: raya roja a la
 * izquierda, que es lo que se ve antes de leer nada. */
.instalacion.ojo, .entorno.ojo { border-left: 3px solid var(--mal); }
.instalacion header { display: flex; align-items: center; gap: .45rem; flex-wrap: wrap; }
.instalacion .donde { font-weight: 600; margin-right: .2rem; }
.instalacion .direccion { word-break: break-all; }
.instalacion .por-dentro { margin: -.3rem 0 0; font-size: .8rem; }
.instalacion dl { display: grid; grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr)); gap: .5rem .9rem; margin: .2rem 0 0; }
.instalacion dt { font-size: .74rem; text-transform: uppercase; letter-spacing: .05em; color: var(--tenue); }
.instalacion dd { margin: .1rem 0 0; font-size: .9rem; display: flex; gap: .4rem; align-items: baseline; flex-wrap: wrap; }
.detalle { margin: 0; font-size: .86rem; line-height: 1.5; }
/* La nota del catálogo es de dentro y se lee como tal: no es lo que contesta la
 * instalación, es lo que alguien escribió sobre ella. */
.nota-del-catalogo {
  margin: 0; padding-top: .5rem; border-top: 1px dashed var(--raya-fina);
  font-size: .84rem; color: var(--suave);
}

/* El texto de `cuidado`: en rojo, sin plegar y con icono. Se pone solo cuando de
 * verdad hay algo que pueda salir caro, porque un aviso en todas partes es un
 * aviso en ninguna. */
.cuidado {
  display: flex; align-items: flex-start; gap: .5rem; margin: 0;
  background: var(--mal-fondo); border: 1px solid var(--mal); border-radius: var(--curva);
  padding: .6rem .7rem; font-size: .86rem; line-height: 1.5;
}
.cuidado svg { flex: none; color: var(--mal); margin-top: .1rem; }

.entornos { display: grid; gap: .9rem; grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); }
.entorno {
  background: var(--tarjeta); border: 1px solid var(--raya); border-radius: var(--curva);
  padding: 1rem; display: flex; flex-direction: column; gap: .5rem;
}
.entorno h3 { display: flex; align-items: center; gap: .5rem; margin: 0; font-size: 1rem; }
.entorno h3 svg { color: var(--tenue); }
.entorno .maquina { margin: 0; font-size: .82rem; color: var(--suave); word-break: break-word; }
.entorno .para { margin: 0; font-size: .88rem; color: var(--suave); }
.entorno p:last-child { margin-top: auto; }

/* ── Los sellos ───────────────────────────────────────────────────────────── */
/* Todos con borde y fondo, no solo color de texto: un sello que solo cambia de
 * color no se distingue en una pantalla mala ni para quien no separa el rojo del
 * verde, y lo que dicen estos es de quién son unos datos. */
.sello {
  display: inline-block; font-size: .74rem; font-weight: 600; line-height: 1.4;
  padding: .12rem .45rem; border-radius: .25rem;
  border: 1px solid var(--raya); background: var(--hundido); color: var(--suave);
  white-space: nowrap;
}
.estado-vivo { border-color: var(--bien); background: var(--bien-fondo); color: var(--bien); }
.estado-raro { border-color: var(--aviso); background: var(--aviso-fondo); color: var(--aviso); }
.estado-caido { border-color: var(--mal); background: var(--mal-fondo); color: var(--mal); }
/* Gris, y nunca rojo: ver `sondas.py`. */
.estado-no-se { border-style: dashed; }
.de-cliente { border-color: var(--mal); background: var(--mal-fondo); color: var(--mal); }
.de-casa { color: var(--tenue); }
.fuera, .solo-nuestro { border-style: dashed; color: var(--tenue); }

/* ── Estrecho ─────────────────────────────────────────────────────────────── */
@media (max-width: 720px) {
  .barra { padding: .6rem 1rem; }
  .marcador.ancho { grid-column: span 2; }
  .cabecera { flex-direction: column; }
  footer .version { margin-left: 0; }
}
