/* =====================================================================
   Laboratorio - Armazon
   Franja de entorno, cabecera, contenido y pie.

   Parte de la hoja de estilos del Laboratorio, que se sirve en varios archivos
   enlazados en orden desde src/views/_estilos.php. El orden importa:
   la cascada es la concatenacion de todos ellos.
   ===================================================================== */
/* --------------------------------------------------------------------
   Franja de entorno
   Igual que en legacy_blue: solo se pinta fuera de produccion, para que
   nadie confunda la copia de pruebas con la sala real.
   -------------------------------------------------------------------- */
.franja-entorno {
  background: var(--rojo);
  color: #fff;
  text-align: center;
  font-size: .8rem;
  font-weight: 600;
  letter-spacing: .04em;
  text-transform: uppercase;
  padding: 3px 8px;
}

/* --------------------------------------------------------------------
   Cabecera
   -------------------------------------------------------------------- */
.cabecera {
  position: relative;
  z-index: 100;
  background: var(--banda);
  color: #fff;
  box-shadow: var(--sombra);
  /* La línea de la sala, cruzando el pie de la banda. Va con --acento y no
     con --acento-banda porque este borde se ve contra el contenido, que es
     claro, no contra la banda. */
  border-bottom: 3px solid var(--acento);
}

.cabecera-int {
  max-width: 1500px;
  margin: 0 auto;
  padding: 0 18px;
  display: flex;
  align-items: center;
  gap: 20px;
  flex-wrap: wrap;
  min-height: 54px;
}

/* El primer renglon de la cabecera: marca, sala, usuario, campanita y el
   boton del menu.

   En pantalla ancha esto NO es una caja. `display: contents` la disuelve y
   sus cinco hijos siguen siendo elementos flex de .cabecera-int, con el
   mismo `order` y el mismo gap de siempre: la cabecera de escritorio no
   cambio en nada.

   Existe por el telefono. Ahi .cabecera-int arma varios renglones -el menu,
   el buscador y el bloque de la derecha ocupan la fila entera con
   `flex: 0 0 100%`- y eso traia un problema: envolver NO achica. Flexbox
   primero corta el renglon y recien despues reparte lo que sobra o lo que
   falta, asi que un nombre largo -«Todas las salas»- empujaba en vez de
   ceder y la hamburguesa se caia sola al renglon de abajo, debajo del FS.

   Agrupados en esta caja, el primer renglon es UN renglon y no se corta
   nunca: lo que no entra se achica. Cual se achica lo decide angosto.css.
   --------------------------------------------------------------------- */
/* La barra se queda arriba mientras se recorre la pantalla: el menu, la sala
   y la campanita a un golpe de vista en cualquier parte de una lista de
   doscientas filas, sin volver al tope.

   `sticky` y no `fixed`: la barra sigue ocupando su lugar en el flujo, asi
   que no hay que compensarla con un margen de arriba que despues quede
   viejo. Donde no se pega -el telefono, la impresion, la pared, que no tiene
   cabecera- vuelve sola a ser una barra comun.

   POR QUE VA ATADA A `html.js`
   ---------------------------
   Lo que se pega DENTRO del contenido -el titulo con las pestañas de
   Reparaciones y de Base Slots- tiene que empezar JUSTO debajo de la barra,
   no atras. Ese "justo debajo" es --alto-cabecera, y la barra no mide
   siempre lo mismo: con seis secciones, entre los 700 y los 1000 px el menu
   se va a dos renglones y pasa de 57 a mas de 100. Medido: 56 a 1280 px,
   101 a 900, 125 a 780. El valor exacto solo lo sabe el navegador, y quien
   se lo pregunta es fs.js.

   Sin JavaScript no hay quien mida, y una barra pegada con una medida
   equivocada tapa las pestañas. Asi que sin JavaScript la barra no se pega
   y la pantalla queda exactamente como estaba: se pierde una comodidad, no
   se rompe nada. Es la misma regla que el menu del telefono.

   El z-index la deja por encima de todo lo que pasa por debajo. Los
   desplegables que nacen dentro de la barra -la campanita- son hijos y
   viajan con ella; los del contenido se abren siempre hacia abajo, lejos. */
html.js .cabecera {
  position: sticky;
  top: 0;
}

/* Cuando el navegador trae algo a la vista por su cuenta -Tab hasta un campo
   que estaba abajo del borde- deja libre lo que ocupan las barras pegadas.
   Sin esto, el campo que acaba de recibir el foco aparece justo atras de una
   de ellas y parece que el Tab no hizo nada.

   Son DOS sumadas: la barra de la aplicacion y, en la ficha de reparacion, su
   cabecera, que tambien se queda a la vista. --alto-ficha vale cero en todas
   las demas pantallas. */
html.js { scroll-padding-top: calc(var(--alto-cabecera) + var(--alto-ficha)); }

.cabecera-barra { display: contents; }

.marca {
  order: 1;
  color: #fff;
  font-family: var(--fuente-display);
  font-weight: 600;
  font-size: 1.12rem;
  letter-spacing: .05em;
  white-space: nowrap;
}

/* La sala, pegada a la marca. Va en BLANCO y no en el color de la sala, que
   fue lo primero que se probó: el color claro sobre la banda da 8:1 de
   contraste, de sobra, pero es el mismo tono que el fondo y el nombre se
   diluye igual. Un número no arregla lo que el ojo ve.

   El color de la sala sigue estando en la cabecera, donde sí se despega: la
   línea que cruza el pie de la banda y la barra de la sección abierta.

   El blanco va al 80%: la marca es blanco pleno, y esa diferencia de brillo
   ordena las dos -primero el sistema, después la sala-.

   Y va del tamaño de la marca, separada por una barra fina, porque con el
   tamaño del menú se leía como una opción más: misma condensada, mismas
   mayúsculas, mismo cuerpo. La sala no es un lugar al que se va, es dónde
   estás; tiene que leerse pegada a la marca y no en la fila de al lado.

   El marcado son dos: una pastilla para quien tiene una sola sala y un
   selector para quien las ve todas; las dos se dibujan igual para que la
   cabecera no cambie de forma según el rol de quien mira. */
.sala-marca {
  order: 1;
  display: flex;
  align-items: center;
  /* Encerrada entre dos barras. La de la izquierda la separa de la marca, la
     de la derecha del menú: así la sala no se lee ni como parte del nombre
     del sistema ni como la primera opción del menú, que es exactamente entre
     esas dos cosas donde está.

     El margen negativo la acerca a la marca -el gap de la cabecera son 20px-
     para que las barras queden entre los tres bloques y no colgando. */
  margin-left: -8px;
  padding: 0 11px;
  border-left: 1px solid rgba(255, 255, 255, .25);
  border-right: 1px solid rgba(255, 255, 255, .25);
}
.marca:hover { text-decoration: none; opacity: .9; }

.nav { order: 2; display: flex; gap: 0; flex-wrap: wrap; flex: 1; align-self: stretch; }

/* Los enlaces ocupan todo el alto de la banda, que es lo que permite marcar
   el abierto con una barra abajo en vez de con una pastilla rellena. */
.nav a {
  display: flex;
  align-items: center;
  color: #c8d4e4;
  padding: 0 13px;
  font-family: var(--fuente-display);
  font-size: .97rem;
  letter-spacing: .09em;
  text-transform: uppercase;
  white-space: nowrap;
}
.nav a:hover { background: rgba(255, 255, 255, .08); color: #fff; text-decoration: none; }

/* El acceso a la pared es sólo un ícono, y entre enlaces de texto gris se
   perdía. Va blanco dentro de un recuadro con el borde del color de la sala,
   como la línea de la banda: se lee como botón en los dos temas, porque la
   banda es oscura en ambos. Sin display:block el SVG se alinea como texto y
   queda corrido hacia arriba. */
.nav-pared svg { display: block; }
.nav-pared-icono {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 34px;
  border-radius: 8px;
  background: rgba(255, 255, 255, .12);
  box-shadow: inset 0 0 0 1.5px var(--acento-banda);
  color: #fff;
}
.nav a.nav-pared:hover { background: none; }
.nav a.nav-pared:hover .nav-pared-icono { background: rgba(255, 255, 255, .22); }

/* La sección abierta: letra blanca y una barra del color de la sala abajo.
   La barra va con --acento-banda, la variante clara: esta SÍ se dibuja
   encima de la banda, y en el tema claro el acento a secas es oscuro sobre
   oscuro. */
.nav a.activo {
  color: #fff;
  font-weight: 600;
  box-shadow: inset 0 -3px 0 var(--acento-banda);
}

/* Botón hamburguesa: escondido en pantalla ancha, aparece solo en el teléfono
   Y solo con JavaScript (ver el bloque @media). Las tres barras se dibujan con
   el propio span más su ::before y ::after, sin imágenes. Es un <button>, así
   que se le sacan los estilos que el navegador le pone por defecto. */
.nav-toggle {
  display: none;
  cursor: pointer;
  background: none;
  border: 0;
  padding: 0;
  color: inherit;
}
.nav-toggle > span,
.nav-toggle > span::before,
.nav-toggle > span::after {
  display: block;
  width: 22px;
  height: 2px;
  background: #fff;
  border-radius: 2px;
  transition: transform .2s ease, background .2s ease;
}
.nav-toggle > span { position: relative; }
.nav-toggle > span::before { content: ''; position: absolute; top: -7px; }
.nav-toggle > span::after  { content: ''; position: absolute; top:  7px; }

/* Abierto: las barras se cruzan en una X, para que se vea que se cierra ahí
   mismo. La clase la pone fs.js al tocar el botón. */
.menu-abierto .nav-toggle > span { background: transparent; }
.menu-abierto .nav-toggle > span::before { transform: translateY(7px) rotate(45deg); }
.menu-abierto .nav-toggle > span::after  { transform: translateY(-7px) rotate(-45deg); }

.nav-toggle:focus-visible { outline: 2px solid #fff; outline-offset: 3px; border-radius: 4px; }

.cabecera-der { order: 5; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.actividad-encabezado { order: 4; display: flex; align-items: center; }

/* Campanita y desplegable de actividad. El panel usa los registros de
   auditoría operativa, pero solo muestra los de la sala actualmente elegida. */
.actividad { position: relative; }
.actividad-boton {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 32px;
  cursor: pointer;
  border: 1px solid rgba(255, 255, 255, .22);
  border-radius: var(--radio-chico);
  background: rgba(255, 255, 255, .12);
  color: #fff;
}
.actividad-boton:hover, .actividad.abierta .actividad-boton { background: rgba(255, 255, 255, .2); }
.actividad-boton:focus-visible { outline: 2px solid #fff; outline-offset: 3px; }
.actividad-campana { font-size: 1rem; line-height: 1; filter: grayscale(1) brightness(3); }
.actividad-contador {
  position: absolute;
  top: -7px;
  right: -8px;
  min-width: 17px;
  padding: 1px 4px;
  border: 2px solid var(--banda);
  border-radius: 999px;
  background: var(--rojo);
  color: #fff;
  font-size: .67rem;
  font-weight: 700;
  line-height: 1.25;
  text-align: center;
}
.actividad-panel {
  position: absolute;
  z-index: 110;
  top: calc(100% + 8px);
  right: 0;
  width: min(380px, calc(100vw - 28px));
  max-height: min(540px, calc(100vh - 88px));
  overflow: auto;
  border: 1px solid var(--borde);
  border-radius: var(--radio);
  background: var(--fondo-panel);
  color: var(--texto);
  box-shadow: var(--sombra);
  opacity: 0;
  transform: translateY(-8px);
  pointer-events: none;
  transition: opacity .18s ease, transform .18s ease;
}
.actividad-panel[hidden] { display: none; }
.actividad.abierta .actividad-panel { opacity: 1; transform: translateY(0); pointer-events: auto; }
.actividad-titulo { display: flex; justify-content: space-between; gap: 12px; padding: 13px 14px; border-bottom: 1px solid var(--borde); }
.actividad-titulo span { color: var(--texto-suave); font-size: .82rem; }
.actividad-lista { margin: 0; padding: 0; list-style: none; }
.actividad-lista li + li { border-top: 1px solid var(--borde); }
.actividad-lista li.actividad-no-leida > a { background: var(--acento-suave); box-shadow: inset 3px 0 0 var(--acento); }
.actividad-lista li.actividad-no-leida > a:hover { background: var(--fondo-hover); }
.actividad-lista a { display: grid; grid-template-columns: 25px minmax(0, 1fr); gap: 9px; padding: 11px 14px; color: inherit; }
.actividad-lista a:hover { background: var(--fondo-hover); text-decoration: none; }
.actividad-lista strong, .actividad-detalle, .actividad-meta { display: block; }
.actividad-lista strong { font-size: .88rem; }
.actividad-detalle { margin-top: 2px; color: var(--texto); font-size: .83rem; }
.actividad-meta { margin-top: 3px; color: var(--texto-suave); font-size: .78rem; }
/* --azul-700 no existe en la paleta: la declaracion era invalida y el color
   caia en el heredado, asi que el glifo de cualquier accion sin regla propia
   salia gris oscuro en vez de azul. Va con --acento, que si existe y ademas
   sigue el tema oscuro. */
.actividad-icono { display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 50%; background: var(--acento-suave); color: var(--acento); font-weight: 700; }
.actividad-icono-crear { background: #d9f5e5; color: #167044; }
.actividad-icono-cambio_estado { background: #e5ddff; color: #5739a4; }
.actividad-icono-bitacora { background: #fff0c9; color: #9a6400; }
.actividad-icono-adjunto_subir { background: #d9edff; color: #1265a8; }
/* Verde azulado y no azul: el azul ya es el de "Archivo subido", y las dos
   acciones conviven en la misma lista. En la bitacora el envio a LAB si va en
   azul, porque ahi no hay adjuntos con los que chocar; lo que comparten las dos
   pantallas es el glifo →, que es lo que se reconoce. */
.actividad-icono-envio_lab { background: #d6ecea; color: #0d6b60; }
.actividad-vacia { margin: 0; padding: 18px 14px; color: var(--texto-suave); font-size: .9rem; }
.actividad-pie { padding: 10px 14px; border-top: 1px solid var(--borde); font-size: .88rem; }

.usuario {
  color: #fff;
  display: flex;
  flex-direction: column;
  line-height: 1.2;
  font-size: .88rem;
  text-align: right;
}
.usuario:hover { text-decoration: none; opacity: .85; }
.usuario .rol { color: #9fb3cd; font-size: .8rem; }

/* Quien esta logueado, para la barra del telefono. En pantalla ancha no se
   muestra: ahi ese dato ya esta en `.usuario`, con nombre completo y rol. */
.usuario-movil { display: none; }

.form-sala, .form-salir, .form-tema { margin: 0; }
.form-ir { order: 3; }

/* Botón de tema. Vive en la cabecera oscura, así que se estila como el
   selector de sala y no como un botón del contenido. */
.btn-tema {
  background: rgba(255, 255, 255, .12);
  border: 1px solid rgba(255, 255, 255, .22);
  color: #fff;
  border-radius: var(--radio-chico);
  padding: 5px 9px;
  font-family: inherit;
  font-size: .86rem;
  cursor: pointer;
  line-height: 1.4;
  display: flex;
  align-items: center;
  gap: 6px;
}
.btn-tema:hover { background: rgba(255, 255, 255, .2); }

.btn-tema .icono { font-size: 1rem; line-height: 1; }

/* En la pantalla de ingreso no hay cabecera: el botón va arriba a la derecha
   y necesita colores del contenido, no de la barra. */
.pagina-login .form-tema {
  position: absolute;
  top: 14px;
  right: 16px;
}
.pagina-login .btn-tema {
  background: var(--fondo-panel);
  border-color: var(--borde-fuerte);
  color: var(--texto-suave);
}
.pagina-login .btn-tema:hover { background: var(--fondo-hover); }

/* El selector se dibuja igual que la sala fija: quien administra ve la misma
   cabecera que la sala, no una con una caja de más. Lo único que lo delata
   como control es el subrayado punteado y la flecha que el navegador le pone
   solo; al pasar el mouse el subrayado se vuelve lleno. */
.form-sala select {
  background: transparent;
  color: rgba(255, 255, 255, .8);
  border: 0;
  border-bottom: 1px dashed rgba(255, 255, 255, .35);
  border-radius: 0;
  padding: 0 0 1px;
  font-family: var(--fuente-display);
  font-size: 1.12rem;
  font-weight: 500;
  letter-spacing: .12em;
  text-transform: uppercase;
  cursor: pointer;
}
.form-sala select:hover { border-bottom-style: solid; border-bottom-color: rgba(255, 255, 255, .7); color: #fff; }
.form-sala select:focus-visible { outline: 2px solid #fff; outline-offset: 3px; }
.form-sala select option {
  color: var(--texto);
  background: var(--fondo-panel);
  letter-spacing: normal;
}

/* Una sala concreta es un filtro global, no sólo el nombre del contexto. Se
   distingue con texto y línea propios, sin encerrarla en una pastilla: el
   encabezado ya tiene suficientes cajas y un relleno saturado competía con
   la navegación. Los tres tonos apagados viven en tokens.css y sólo se usan
   acá, para no confundir una sala con los colores de estado del contenido. */
.form-sala.sala-activa select {
  padding: 0 0 2px;
  border: 0;
  border-bottom: 2px solid var(--sala-cabecera);
  border-radius: 0;
  background: transparent;
  color: var(--sala-cabecera);
  font-weight: 600;
}
.form-sala.sala-activa select:hover {
  border-bottom-color: #fff;
  background: transparent;
  color: #fff;
}

/* "Ir a UID" del encabezado: mismo estilo que el selector de sala, sobre la
   barra oscura. Angosto para no comerle lugar al menú. */
.form-ir { margin: 0; }
.form-ir input {
  width: 130px;
  background: rgba(255, 255, 255, .12);
  color: #fff;
  border: 1px solid rgba(255, 255, 255, .22);
  border-radius: var(--radio-chico);
  padding: 5px 9px;
  font-size: .88rem;
}
.form-ir input::placeholder { color: rgba(255, 255, 255, .6); }
.form-ir input:focus { background: rgba(255, 255, 255, .2); outline: none; }

/* Usuario atado a una sala: en vez del selector se muestra cuál es. Mismo
   lugar y mismo peso visual, pero sin parecer algo en lo que se puede hacer
   clic. */
.sala-fija {
  font-family: var(--fuente-display);
  font-size: 1.12rem;
  font-weight: 500;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, .8);
  white-space: nowrap;
}

/* --------------------------------------------------------------------
   Estructura
   -------------------------------------------------------------------- */
.contenido {
  max-width: 1500px;
  margin: 0 auto;
  padding: 20px 18px 44px;
}

.pie {
  max-width: 1500px;
  margin: 0 auto;
  padding: 14px 18px 28px;
  display: flex;
  justify-content: space-between;
  gap: 12px;
  flex-wrap: wrap;
  color: var(--texto-tenue);
  font-size: .82rem;
  border-top: 1px solid var(--borde);
}

.titulo-pagina { margin-bottom: 16px; }
.titulo-pagina .sub { margin: 3px 0 0; color: var(--texto-suave); font-size: .92rem; }
