﻿/* ===========================================================================
   KAIRO -- hoja de estilos
   TODO color sale de una variable. Un color suelto en una regla queda
   invisible en modo oscuro: ya paso, y por eso esta reescrita entera.
   =========================================================================== */

:root {
    --marino: #16294b;
    --marino-claro: #2b436d;

    --fondo: #f0f1f4;
    --panel: #ffffff;
    --panel-2: #f7f8fa;      /* filas de encabezado, zonas hundidas */
    --linea: #dfe1e6;
    --linea-fuerte: #c9ccd2;

    --tinta: #1c1c1a;
    --tinta-2: #616161;      /* minimo para texto secundario (WCAG AA) */
    --tinta-3: #8a8a86;

    --acento: var(--marino);
    --acento-texto: #ffffff;

    --ok-fondo: #e1f5ee;  --ok-texto: #0f6e56;  --ok-solido: #1d9e75;
    --mal-fondo: #fcebeb; --mal-texto: #a32d2d; --mal-solido: #a32d2d;
    --avi-fondo: #fdf3e0; --avi-texto: #633806;
    --neu-fondo: #eef0f3; --neu-texto: #5f5e5a;
    --chip-fondo: #eef1f6; --chip-texto: var(--marino);

    /* Recuadro del seguidor visual sobre el video. Va sobre imagen de
       camara, no sobre el fondo de la interfaz, asi que no cambia con el
       tema. */
    --seguido: #29c5f6;

    --radio: 8px;
    --marca-font: "Helvetica Neue", Helvetica, Arial, system-ui, sans-serif;
}

/* El tema lo fija un atributo en <html>, que escribe el script ANTES de
   pintar, para que no haya un destello blanco al entrar en modo oscuro. */
[data-tema="oscuro"] {
    --marino: #7fa3d8;           /* el marino puro no contrasta sobre oscuro */
    --marino-claro: #a9c2e6;

    --fondo: #14171c;
    --panel: #1b1f26;
    --panel-2: #22272f;
    --linea: #2e343d;
    --linea-fuerte: #3d444f;

    --tinta: #e8eaed;
    --tinta-2: #a8adb6;
    --tinta-3: #7d838d;

    --acento: #4a7fc7;
    --acento-texto: #ffffff;

    --ok-fondo: #10312a;  --ok-texto: #6fd8b4;  --ok-solido: #1d9e75;
    --mal-fondo: #3a1a1a; --mal-texto: #f0a0a0; --mal-solido: #c94a4a;
    --avi-fondo: #38290f; --avi-texto: #f0cd93;
    --neu-fondo: #262b33; --neu-texto: #a8adb6;
    --chip-fondo: #24303f; --chip-texto: #9dbde8;
    --seguido: #29c5f6;
}

* { box-sizing: border-box; }

html, body {
    margin: 0;
    font-family: system-ui, "Segoe UI", Roboto, sans-serif;
    font-size: 15px;
    color: var(--tinta);
    background: var(--fondo);
}

h1 { font-size: 22px; font-weight: 500; margin: 0 0 16px; }
h2.seccion { font-size: 16px; font-weight: 500; margin: 22px 0 6px; }
a { color: var(--acento); }

.tenue { color: var(--tinta-2); }
.chico { font-size: 13px; }
.mono { font-family: ui-monospace, Consolas, monospace; }
.rojo { color: var(--mal-texto); }
.ok { color: var(--ok-texto); font-size: 13px; }
.mal { color: var(--mal-texto); font-size: 13px; }
.cargando { padding: 40px; color: var(--tinta-2); }

/* ------------------------------------------------------------- login ----- */
.login-fondo { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 20px; }

.login-caja {
    width: 100%; max-width: 360px;
    background: var(--panel);
    border: 1px solid var(--linea);
    border-radius: 12px;
    padding: 28px;
}

.isotipo { display: flex; justify-content: center; margin-bottom: 14px; color: var(--marino); }

.login-caja .marca-grande {
    font-family: var(--marca-font);
    font-size: 30px; font-weight: 500;
    letter-spacing: .32em; text-indent: .32em;
    color: var(--marino); margin: 0; text-align: center;
}

.login-caja .sub {
    font-family: var(--marca-font);
    margin: 8px 0 26px; color: var(--tinta-2);
    font-size: 10px; font-weight: 500;
    letter-spacing: .26em; text-indent: .26em;
    text-transform: uppercase; text-align: center;
}

.login-caja label { display: block; font-size: 13px; color: var(--tinta-2); margin: 12px 0 4px; }

.login-caja input {
    width: 100%; height: 38px; padding: 0 10px;
    border: 1px solid var(--linea); border-radius: var(--radio);
    font-size: 15px; background: var(--panel); color: var(--tinta);
}

.login-caja input:focus {
    outline: none; border-color: var(--acento);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--acento) 22%, transparent);
}

.login-caja button {
    width: 100%; height: 40px; margin-top: 20px;
    border: none; border-radius: var(--radio);
    background: var(--acento); color: var(--acento-texto);
    font-size: 15px; cursor: pointer;
}

.login-caja button:disabled { opacity: .6; cursor: default; }

.error {
    margin-top: 14px; padding: 9px 11px; border-radius: var(--radio);
    background: var(--mal-fondo); color: var(--mal-texto); font-size: 14px;
}

/* -------------------------------------------------------------- barra ---- */
.barra-sup {
    display: flex; align-items: center; gap: 18px;
    height: 54px; padding: 0 18px;
    background: var(--panel);
    border-bottom: 1px solid var(--linea);
    position: sticky; top: 0; z-index: 20;
}

.marca-enlace { display: flex; align-items: center; gap: 9px; text-decoration: none; color: var(--marino); }
.marca-enlace:hover { opacity: .78; }

.marca {
    font-family: var(--marca-font);
    font-size: 16px; font-weight: 500;
    letter-spacing: .24em; text-indent: .24em;
    color: var(--marino);
}

.menu { display: flex; gap: 4px; align-items: center; }

.menu a {
    color: var(--tinta-2); text-decoration: none; font-size: 14px;
    padding: 7px 12px; border-radius: var(--radio);
}

.menu a:hover { color: var(--tinta); background: var(--panel-2); }
.menu a.activo { color: var(--tinta); background: var(--panel-2); font-weight: 500; }

.derecha { margin-left: auto; display: flex; align-items: center; gap: 8px; }

/* Desplegable con <details>: nativo, sin JavaScript y con teclado gratis. */
.grupo { position: relative; }

.grupo > summary {
    list-style: none; cursor: pointer; font-size: 14px;
    color: var(--tinta-2); padding: 7px 12px; border-radius: var(--radio);
    display: flex; align-items: center; gap: 6px;
}

.grupo > summary::-webkit-details-marker { display: none; }
.grupo > summary::after { content: "▾"; font-size: 11px; color: var(--tinta-3); }
.grupo > summary:hover { color: var(--tinta); background: var(--panel-2); }
.grupo[open] > summary { color: var(--tinta); background: var(--panel-2); }

.grupo-menu {
    position: absolute; right: 0; top: calc(100% + 6px);
    background: var(--panel);
    border: 1px solid var(--linea);
    border-radius: 10px;
    padding: 6px; min-width: 190px;
    box-shadow: 0 8px 24px rgb(0 0 0 / 14%);
    display: flex; flex-direction: column; gap: 2px;
}

.grupo-menu a { display: block; padding: 8px 12px; text-decoration: none; color: var(--tinta-2); border-radius: var(--radio); }
.grupo-menu a:hover { background: var(--panel-2); color: var(--tinta); }
.grupo-menu a.activo { color: var(--tinta); font-weight: 500; }

.contexto {
    font-size: 13px; color: var(--tinta-2);
    padding: 4px 10px; background: var(--panel-2); border-radius: 999px;
}

.icono {
    width: 34px; height: 34px; display: grid; place-items: center;
    border: 1px solid var(--linea); border-radius: var(--radio);
    background: var(--panel); color: var(--tinta-2);
    cursor: pointer; font-size: 15px; line-height: 1;
}

.icono:hover { color: var(--tinta); border-color: var(--linea-fuerte); }

.usuario { display: flex; align-items: center; gap: 10px; font-size: 14px; }

.salir {
    border: 1px solid var(--linea); background: var(--panel);
    border-radius: var(--radio); padding: 6px 12px;
    font-size: 13px; cursor: pointer; color: var(--tinta);
}

.salir:hover { border-color: var(--linea-fuerte); }

main { padding: 24px 20px; max-width: 1150px; }

/* -------------------------------------------------------------- tabla ---- */
.tabla {
    width: 100%;
    /* separate y no collapse: con collapse, el borde propio de la tabla se
       fusiona con el de las celdas y contra las esquinas redondeadas salen
       lineas dobles y cortadas. */
    border-collapse: separate;
    border-spacing: 0;
    background: var(--panel);
    border: 1px solid var(--linea);
    border-radius: 10px;
    overflow: hidden;
}

.tabla th, .tabla td { padding: 10px 12px; border-bottom: 1px solid var(--linea); text-align: left; }
.tabla tbody tr:last-child td { border-bottom: none; }
.tabla th { font-weight: 500; font-size: 13px; color: var(--tinta-2); background: var(--panel-2); }
.tabla td.num, .tabla th.num { text-align: right; }
.tabla td.acciones { white-space: nowrap; text-align: right; }
.pendiente { color: var(--mal-texto); font-weight: 500; }

/* Fila de alta del ABM de motivos y motivos dados de baja. */
.fila-motivo { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.fila-motivo input[type=text], .fila-motivo input:not([type]) { flex: 1; min-width: 260px; }

.fila-motivo input:not([type=checkbox]), .fila-motivo select {
    height: 34px; padding: 0 10px;
    border: 1px solid var(--linea); border-radius: var(--radio);
    background: var(--panel); color: var(--tinta); font-size: 14px;
}

.fila-motivo button.primario {
    background: var(--acento); color: var(--acento-texto); border-color: var(--acento);
    border-radius: var(--radio); padding: 7px 16px; font-size: 14px;
    border: 1px solid var(--acento); cursor: pointer;
}

/* Dado de baja: se sigue viendo porque hay eventos historicos que lo usan. */
.tabla tr.inactivo td { opacity: .55; }
tr.tenue-fila td { opacity: .55; }

/* ------------------------------------------------------------ botones ---- */
button { font-family: inherit; }

.tabla td.acciones button, .marco-alta button, .barra-seleccion button {
    border: 1px solid var(--linea); background: var(--panel); color: var(--tinta);
    border-radius: var(--radio); padding: 6px 12px;
    font-size: 13px; cursor: pointer; margin-left: 6px;
}

.barra-seleccion button { margin-left: 0; padding: 3px 10px; font-size: 12px; }
.tabla td.acciones button:hover, .marco-alta button:hover { border-color: var(--acento); }
button.primario { background: var(--acento); color: var(--acento-texto); border-color: var(--acento); }
button:disabled { opacity: .5; cursor: default; }

/* --------------------------------------------------------------- chips --- */
.estado { display: inline-block; font-size: 12px; padding: 3px 10px; border-radius: 999px; white-space: nowrap; }
.estado.vivo { background: var(--ok-fondo); color: var(--ok-texto); }
.estado.caido { background: var(--mal-fondo); color: var(--mal-texto); }
.estado.neutro { background: var(--neu-fondo); color: var(--neu-texto); }
.chip { background: var(--chip-fondo); color: var(--chip-texto); font-size: 12px; padding: 3px 9px; border-radius: var(--radio); }

/* ------------------------------------------------------ configuracion ---- */
.descubierto { background: var(--panel-2); }
.barra-seleccion { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; }
.canales { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 12px; }

.canal {
    display: flex; align-items: center; gap: 6px;
    border: 1px solid var(--linea); border-radius: var(--radio);
    padding: 5px 10px; font-size: 13px;
    background: var(--panel); color: var(--tinta); cursor: pointer;
}

.canal.existente { opacity: .5; cursor: default; }

.marco-alta {
    background: var(--panel); border: 1px solid var(--linea);
    border-radius: 12px; padding: 16px; margin-top: 24px; max-width: 720px;
}

.campos { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
.campos label { display: flex; flex-direction: column; gap: 4px; font-size: 13px; color: var(--tinta-2); }

.campos input, .celda {
    height: 36px; padding: 0 10px;
    border: 1px solid var(--linea); border-radius: var(--radio);
    font-size: 14px; color: var(--tinta); background: var(--panel);
}

.celda { width: 100%; height: 32px; }
.celda.chica { width: 76px; text-align: right; }
select.celda { padding: 0 6px; }

.aviso {
    margin: 14px 0; padding: 9px 12px;
    background: var(--avi-fondo); color: var(--avi-texto);
    border-radius: var(--radio); font-size: 13px;
}

/* ------------------------------------------- presupuesto de computo ------ */
.presupuesto {
    background: var(--panel); border: 1px solid var(--linea);
    border-radius: 12px; padding: 14px 16px; margin-bottom: 18px;
}

.presupuesto-cabeza { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 8px; }
.presupuesto-cabeza strong { font-weight: 500; }
.barra { display: flex; height: 10px; background: var(--neu-fondo); border-radius: 999px; overflow: hidden; }
.barra .alta { background: var(--mal-solido); }
.barra .normal { background: var(--acento); }
.barra .analitica { background: var(--ok-solido); }
.leyenda { display: flex; gap: 16px; margin-top: 8px; flex-wrap: wrap; }
.punto { display: inline-block; width: 8px; height: 8px; border-radius: 2px; margin-right: 6px; }
.punto.alta { background: var(--mal-solido); }
.punto.normal { background: var(--acento); }
.punto.analitica { background: var(--ok-solido); }
.punto.apagada { background: var(--linea-fuerte); }

/* ------------------------------------------------------ cola de alertas -- */
.encabezado { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
.encabezado h1 { margin: 0 0 12px; }
.atajos { margin-left: auto; font-size: 13px; }

.tarjetas { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; margin: 12px 0 20px; }

.tarjeta {
    background: var(--panel); border: 1px solid var(--linea);
    border-radius: var(--radio); padding: 12px 14px;
    display: flex; flex-direction: column; gap: 2px;
}

.tarjeta span { font-size: 13px; color: var(--tinta-2); }
.tarjeta strong { font-size: 24px; font-weight: 500; }

.evento {
    background: var(--panel); border: 1px solid var(--linea);
    border-radius: 12px; padding: 14px; margin-bottom: 12px; cursor: pointer;
    /* Para poder colgar la confianza del angulo sin que empuje al resto. */
    position: relative;
}

/* La confianza de la deteccion, arriba a la derecha de la tarjeta.
   Deliberadamente en gris y no en rojo: es una medida de cuan seguro esta el
   modelo de que hay alguien manipulando mercaderia, NO de que haya un hurto.
   Pintarla de rojo la haria leer como alarma y sesgaria al que revisa. */
.confianza {
    position: absolute; top: 12px; right: 14px;
    text-align: right; line-height: 1; pointer-events: none;
}

.confianza strong {
    display: block; font-size: 32px; font-weight: 650;
    color: var(--tinta); font-variant-numeric: tabular-nums;
}

.confianza strong span { font-size: 17px; font-weight: 500; margin-left: 1px; }

.confianza .rotulo {
    display: block; margin-top: 3px;
    font-size: 10px; letter-spacing: .08em; text-transform: uppercase;
    color: var(--tinta-2);
}

/* En pantalla chica el numero grande le come el lugar al nombre de la camara,
   asi que se achica y se queda en la misma fila que el resto. */
@media (max-width: 560px) {
    .confianza strong { font-size: 23px; }
    .confianza strong span { font-size: 13px; }
}

.evento.foco { border-color: var(--acento); box-shadow: 0 0 0 2px color-mix(in srgb, var(--acento) 18%, transparent); }
.evento-datos { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 10px; }
.evento-imagenes { display: grid; grid-template-columns: 1.6fr 1fr; gap: 8px; margin-bottom: 10px; }

.general, .recorte {
    position: relative; overflow: hidden;
    background: #10151f;      /* fijo: es el fondo de una foto, no de la interfaz */
    border-radius: var(--radio); aspect-ratio: 16 / 9;
}

.general img { width: 100%; height: 100%; object-fit: cover; display: block; }
.general .caja { position: absolute; border: 2px solid #ff4d4d; border-radius: 2px; pointer-events: none; }
.recorte img { position: absolute; max-width: none; display: block; }
.recorte .sin-caja { position: absolute; inset: 0; display: grid; place-items: center; font-size: 13px; color: var(--tinta-3); }

.evento-acciones { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }

.evento-acciones button {
    border: 1px solid var(--linea); background: var(--panel); color: var(--tinta);
    border-radius: var(--radio); padding: 7px 14px; font-size: 14px; cursor: pointer;
}

.evento-acciones button:hover { border-color: var(--acento); }
.evento-acciones button.peligro { border-color: var(--mal-solido); color: var(--mal-texto); }
.evento-acciones button.peligro:hover { background: var(--mal-fondo); }

/* ------------------------------- cartel de error de Blazor --------------
   Va oculto y Blazor lo muestra (display:block en linea) cuando hay una
   excepcion sin atrapar. Sin esta regla queda visible siempre y parece que la
   aplicacion esta rota; PERO si se lo esconde de mas, una pagina que revienta
   al dibujarse queda en blanco sin decir nada. Por eso va bien visible,
   arriba y en rojo: que se note. */
#blazor-error-ui {
    display: none; position: fixed; top: 0; left: 0; right: 0; z-index: 1000;
    padding: 12px 16px; background: var(--mal-fondo); color: var(--mal-texto);
    border-bottom: 2px solid var(--mal-solido); font-size: 14px;
}

#blazor-error-ui .dismiss { cursor: pointer; position: absolute; right: 12px; top: 8px; }

/* --------------------------------------------------------------- modal ---
   OJO: la plantilla de Blazor traia Bootstrap, que define .modal con
   display:none (lo muestra su propio JavaScript). Como esta hoja usa el mismo
   nombre, el modal quedaba en el DOM pero de 0x0: el fondo tapaba la pantalla
   y no se veia nada. Se saco Bootstrap entero, que ademas no se usaba. Si
   alguna vez vuelve, hay que renombrar esta clase. */
.titulo-con-accion { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; margin-bottom: 12px; }

.redondo {
    width: 34px; height: 34px; border-radius: 50%;
    padding: 0; margin: 0; flex: none;
    display: inline-flex; align-items: center; justify-content: center;
}

/* El signo va en SVG y no como caracter: el glifo "+" tiene su propia linea
   base y queda siempre corrido dentro del circulo, distinto en cada fuente. */
.redondo svg { display: block; }

.fondo-modal {
    position: fixed; inset: 0; z-index: 100;
    background: rgb(0 0 0 / 45%);
    display: flex; align-items: center; justify-content: center; padding: 20px;
}

.modal {
    background: var(--panel); border: 1px solid var(--linea);
    border-radius: 12px; padding: 18px;
    width: 100%; max-width: 560px;
    max-height: 90vh; overflow: auto;
}

.modal-cabeza { display: flex; align-items: center; justify-content: space-between; margin-bottom: 14px; }
.modal-pie { display: flex; justify-content: flex-end; gap: 8px; margin-top: 16px; }

.modal-pie button {
    border: 1px solid var(--linea); background: var(--panel); color: var(--tinta);
    border-radius: var(--radio); padding: 8px 16px; font-size: 14px; cursor: pointer;
}

.modal-pie button.primario { background: var(--acento); color: var(--acento-texto); border-color: var(--acento); }

/* ------------------------------------------------------- vista en vivo --- */
.vista-vivo { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); gap: 14px; align-items: start; }

.marco-vivo {
    position: relative; background: #10151f;
    border-radius: var(--radio); overflow: hidden; aspect-ratio: 16 / 9;
}

.marco-vivo img { width: 100%; height: 100%; object-fit: contain; display: block; }

/* La franja se ancla ABAJO: una persona se mide desde el piso hacia arriba. */
.guia-piso {
    position: absolute; left: 0; right: 0; bottom: 0;
    border-top: 2px dashed #ffd24d;
    background: linear-gradient(to top, rgb(255 210 77 / 16%), transparent);
    pointer-events: none;
}

.guia-piso span {
    position: absolute; top: 4px; left: 8px;
    font-size: 11px; color: #ffd24d;
    background: rgb(0 0 0 / 45%); padding: 1px 6px; border-radius: 3px;
}

.ayuda-vivo p { margin: 0 0 10px; }

.ayuda-vivo button {
    border: 1px solid var(--linea); background: var(--panel); color: var(--tinta);
    border-radius: var(--radio); padding: 6px 12px; font-size: 13px; cursor: pointer;
}

/* El filtro va en el encabezado, alineado a la derecha del titulo. */
.encabezado .filtro { width: auto; min-width: 220px; margin-left: auto; height: 34px; }

/* -------------------------------------------------------------- agentes -- */
.carga { display: flex; flex-direction: column; gap: 4px; min-width: 240px; }
.carga .barra { height: 8px; }
.carga .celda.chica { width: 62px; height: 26px; display: inline-block; }

.token {
    background: var(--panel-2); border: 1px solid var(--linea);
    border-radius: var(--radio); padding: 12px;
    font-size: 13px; word-break: break-all; user-select: all;
}

.pie-vivo { display: flex; align-items: center; gap: 8px; font-size: 13px; }

/* ---------------------------------------------------------------- reglas -- */
.modal.ancho { max-width: 760px; }
.bloque { margin: 16px 0; }
.condiciones { display: flex; flex-wrap: wrap; gap: 6px; margin: 6px 0 10px; min-height: 28px; align-items: center; }

.chip-cond {
    display: inline-flex; align-items: center; gap: 6px;
    background: var(--chip-fondo); color: var(--chip-texto);
    font-size: 13px; padding: 4px 10px; border-radius: var(--radio);
}

.chip-cond .quitar {
    border: none; background: none; color: inherit;
    cursor: pointer; padding: 0; font-size: 12px; opacity: .7;
}

.chip-cond .quitar:hover { opacity: 1; }
.agregar-cond { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }

.agregar-cond select, .agregar-cond input, .campos select, .campos input[type=time] {
    height: 34px; padding: 0 8px;
    border: 1px solid var(--linea); border-radius: var(--radio);
    background: var(--panel); color: var(--tinta); font-size: 14px;
}

.agregar-cond button, button.mini {
    border: 1px solid var(--linea); background: var(--panel); color: var(--tinta);
    border-radius: var(--radio); padding: 6px 12px; font-size: 13px; cursor: pointer;
}

button.mini { padding: 2px 9px; font-size: 12px; }
.linea-check { flex-direction: row !important; align-items: center; gap: 8px !important; }

/* ------------------------------------------------------------ etiquetas -- */
.etiquetas-filtro { display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 14px; }

.tag {
    border: 1px solid var(--linea); background: var(--panel); color: var(--tinta-2);
    border-radius: 999px; padding: 4px 12px; font-size: 13px; cursor: pointer;
}

.tag:hover { border-color: var(--linea-fuerte); color: var(--tinta); }
.tag.activo { background: var(--acento); border-color: var(--acento); color: var(--acento-texto); }

.ambar { color: var(--avi-texto); }
.aviso.mal-aviso { background: var(--mal-fondo); color: var(--mal-texto); }

/* Marcas de referencia sobre la barra de carga. */
.barra-marcada { position: relative; padding-bottom: 16px; }
.barra .excedido { background: var(--mal-solido); }

.marca-carga {
    position: absolute; top: 0; height: 10px;
    border-left: 2px solid var(--panel);
    pointer-events: none;
}

.marca-carga.limite { border-left-color: var(--mal-solido); }

.marca-carga span {
    position: absolute; top: 11px; left: -7px;
    font-size: 10px; color: var(--tinta-3);
}

.marca-carga.limite span { color: var(--mal-texto); }

/* --------------------------------------------------- visor de secuencia -- */
.secuencia { margin: 4px 0 12px; }

.marco-secuencia {
    /* El 16/9 es solo el valor inicial, hasta que se sepa la medida real del
       clip: marcar.js lo pisa con la proporcion del video apenas carga. Si
       queda uno que no es 16/9 y no se corrige, vuelven las franjas negras y
       con ellas el desfasaje entre lo que se marca y lo que se dibuja. */
    background: #10151f; border-radius: var(--radio);
    overflow: hidden; aspect-ratio: 16 / 9; max-height: 460px;
    display: grid; place-items: center;
}

.marco-secuencia img,
.marco-secuencia video { width: 100%; height: 100%; object-fit: contain; display: block; }

/* El recuadro de lo que vio el modelo, encima del video. Lo posiciona
   rastro.js en pixeles siguiendo la reproduccion; aca solo va como se ve. */
.marco-secuencia.con-rastro { position: relative; }

/* El recuadro que sigue a la persona.
   Escuadras en las esquinas en vez de un marco cerrado: el marco tapa a la
   persona justo en el borde, que es donde estan las manos, y ademas es lo que
   distingue de un vistazo un sistema que MIDE de un rectangulo dibujado.
   El color lo pone rastro.js segun la confianza; aca solo va la forma. */
.caja-video {
    --c: var(--mal-solido);
    --esq: 22%;             /* cuanto ocupa cada escuadra */
    --g: 3px;               /* grosor */
    position: absolute; display: none; pointer-events: none;
    border-radius: 3px;
    /* Marco tenue para que se entienda hasta donde llega el recuadro... */
    box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--c) 35%, transparent),
                0 0 14px color-mix(in srgb, var(--c) 30%, transparent);
    /* ...y las cuatro escuadras, dos gradientes por esquina. */
    background:
        linear-gradient(var(--c), var(--c)) 0 0 / var(--esq) var(--g) no-repeat,
        linear-gradient(var(--c), var(--c)) 0 0 / var(--g) var(--esq) no-repeat,
        linear-gradient(var(--c), var(--c)) 100% 0 / var(--esq) var(--g) no-repeat,
        linear-gradient(var(--c), var(--c)) 100% 0 / var(--g) var(--esq) no-repeat,
        linear-gradient(var(--c), var(--c)) 0 100% / var(--esq) var(--g) no-repeat,
        linear-gradient(var(--c), var(--c)) 0 100% / var(--g) var(--esq) no-repeat,
        linear-gradient(var(--c), var(--c)) 100% 100% / var(--esq) var(--g) no-repeat,
        linear-gradient(var(--c), var(--c)) 100% 100% / var(--g) var(--esq) no-repeat;
    /* Suaviza el salto entre muestras. El rastro trae un punto cada 200 ms y
       la pantalla pinta a 60: sin esto se ve el escalon. */
    transition: left .12s linear, top .12s linear,
                width .12s linear, height .12s linear;
}

/* Franja con la posicion de cada deteccion dentro del clip. De un vistazo se
   ve si el modelo marco todo el rato o un instante suelto. */
/* Perfil de confianza a lo largo del clip. Mas alto = mas confianza. Antes
   eran marcas de si/no y con el rastreo nuevo quedaba llena de punta a punta:
   una barra llena no dice donde mirar. */
.franja-rastro {
    position: relative; height: 22px; margin-top: 6px;
    background: var(--neu-fondo); border-radius: 3px; overflow: hidden;
}

/* Cada barrita es un instante; la altura la pone rastro.js segun la
   confianza. Anclada abajo para que se lea como un grafico y no como marcas
   flotando. */
.franja-rastro i {
    position: absolute; bottom: 0;
    background: var(--mal-solido);
}

/* Por debajo del umbral: presente pero callado. Que no parezca que ahi nadie
   miro, sin competir con los picos. */
.franja-rastro i.bajo {
    background: var(--linea-fuerte);
    max-height: 45%;
}

/* Entidad a la que se llego por enlace: se marca un momento y se apaga. Ver
   ir.js. Fijo no sirve -- al volver por el menu quedaria una fila resaltada
   sin motivo aparente. */
.recien-llegado {
    animation: llegada 2.4s ease-out;
}

@keyframes llegada {
    0%, 40% { background: var(--acento-suave, rgba(120, 170, 255, .22)); }
    100%    { background: transparent; }
}

/* Nombre de una entidad que lleva a su propia pantalla. Se distingue del texto
   comun pero sin el azul subrayado del enlace clasico: en una tabla con muchas
   filas eso seria ruido. */
/* Un iconito, no un subrayado. El borde punteado de abajo se leia como texto
   raro y no como "esto lleva a otra pantalla". Israel: "hacele como un iconito
   con un enlace o algo, asi subrayado es inentendible".

   Va como ::after y no en el marcado porque son cuatro lugares -- el numero y la
   camara en /ultimos y en Inicio, y el numero en Pruebas -- y asi el icono sale
   de una sola regla en vez de cuatro copias que se desincronizan. */
.enlace-entidad {
    color: inherit; text-decoration: none; cursor: pointer;
    white-space: nowrap;          /* el icono nunca cae solo al renglon de abajo */
}

.enlace-entidad::after {
    /* El glifo literal y no su codigo de escape: escrito como escape, los
       primeros dos digitos se comieron como octal y quedo un caracter de
       control 0x11 seguido del resto. El resto del archivo ya usa el glifo
       directo, ver la regla de .grupo > summary::after. */
    content: "↗";
    display: inline-block;
    margin-left: 3px;
    font-size: .78em;
    font-family: system-ui, "Segoe UI Symbol", sans-serif;
    color: var(--acento);
    /* Sin text-decoration heredada: si el contenedor subraya, la flecha
       quedaba tachada por abajo. */
    text-decoration: none;
}

.enlace-entidad:hover { color: var(--acento); }
.enlace-entidad:hover::after { transform: translate(1px, -1px); }

/* Gestos de CONTEXTO: los que el modelo vio y NO abren aviso -- doblando,
   probandose, prenda en la mano. Explican por que se disparo, asi que se
   muestran; pero van tenues y colgados de ARRIBA, no anclados abajo, para que
   se lean como anotacion y no se confundan con el perfil del gesto que avisa.
   Sin esa separacion la franja mezclaria dos cosas distintas en la misma
   forma, y dejaria de responder "donde mirar". */
.franja-rastro i.contexto {
    background: var(--linea-fuerte);
    opacity: .5;
    bottom: auto; top: 0;
    max-height: 40%;
}

/* Numero de evento. Seleccionable a mano (el resto de la tarjeta no lo es,
   porque un clic en cualquier lado la enfoca) para poder copiarlo. */
.id-evento {
    font-family: ui-monospace, Consolas, monospace;
    font-size: 13px; color: var(--tinta-2);
    background: var(--neu-fondo); border-radius: 4px;
    padding: 2px 6px;
    /* user-select para poder copiar solo el numero y pasarselo a otro. Pero el
       cursor ya no es de texto: ahora el numero ES el enlace a las acciones, y
       un cursor de I sobre algo que navega dice lo contrario de lo que hace. */
    user-select: text;
}

/* Chip del clip que todavia no llego. En gris, no en amarillo: no es una
   advertencia, es que falta esperar. */
.chip.esperando {
    background: var(--neu-fondo); color: var(--neu-texto);
    display: inline-flex; align-items: center; gap: 7px;
}

/* La mecha: cuanto falta para que llegue el clip. Dura lo que la espera real
   (~220 s) y arranca ya empezada, con retraso negativo, segun cuando ocurrio
   el evento. */
.mecha {
    display: inline-block; width: 46px; height: 3px;
    background: var(--linea-fuerte); border-radius: 2px; overflow: hidden;
}

.mecha i {
    display: block; height: 100%; width: 100%;
    background: var(--neu-texto);
    transform-origin: left center; transform: scaleX(0);
    animation: llenando 220s linear forwards;
}

@keyframes llenando { from { transform: scaleX(0); } to { transform: scaleX(1); } }

@media (prefers-reduced-motion: reduce) {
    .mecha i { animation: none; transform: scaleX(.5); opacity: .5; }
}

/* ---------------------------------------------- motivo y comentario ----- */
.explicacion {
    border: 1px solid var(--linea); border-radius: var(--radio);
    background: var(--panel-2); padding: 10px; margin-bottom: 10px;
    display: flex; flex-direction: column; gap: 8px; cursor: default;
}

.motivos { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }

.motivo {
    border: 1px solid var(--linea); background: var(--panel); color: var(--tinta);
    border-radius: 999px; padding: 4px 11px; font-size: 13px; cursor: pointer;
}

.motivo:hover { border-color: var(--linea-fuerte); }

.motivo.elegido {
    background: var(--acento); color: var(--acento-texto); border-color: var(--acento);
}

.explicacion textarea {
    width: 100%; resize: vertical; padding: 8px 10px;
    border: 1px solid var(--linea); border-radius: var(--radio);
    background: var(--panel); color: var(--tinta);
    font: inherit; font-size: 14px;
}

.explicacion textarea:focus {
    outline: none; border-color: var(--acento);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--acento) 22%, transparent);
}

/* Marca en el boton cuando el evento ya tiene motivo cargado. */
.punto {
    display: inline-block; width: 6px; height: 6px; margin-left: 6px;
    border-radius: 50%; background: var(--ok-solido); vertical-align: middle;
}

/* El porcentaje sale de data-pct, que actualiza el mismo script. Va por
   encima del recuadro salvo cuando la caja toca el borde de arriba, que ahi
   se daria vuelta y quedaria cortado. */
/* El porcentaje. Mas grande que antes a proposito: es el numero que la
   persona mira, y en 11px sobre imagen de camara se perdia. */
.caja-video::after {
    content: attr(data-pct);
    position: absolute; top: -26px; left: -3px;
    background: var(--c); color: #fff;
    font: 700 14px/1.45 system-ui, sans-serif;
    letter-spacing: .02em;
    padding: 1px 8px; border-radius: 3px; white-space: nowrap;
    box-shadow: 0 1px 6px rgb(0 0 0 / 45%);
}

/* Barrita de confianza pegada abajo del recuadro. El ancho lo pone rastro.js
   en --pct. Dice lo mismo que el numero, pero se lee sin leer. */
.caja-video::before {
    content: "";
    position: absolute; left: 0; right: 0; bottom: -7px; height: 3px;
    border-radius: 2px;
    background: linear-gradient(to right,
        var(--c) 0 calc(var(--pct, 0) * 1%),
        color-mix(in srgb, var(--c) 22%, transparent) calc(var(--pct, 0) * 1%) 100%);
}

/* Con el recuadro pegado al borde de arriba, la etiqueta se saldria del marco.
   Las clases las pone rastro.js, que es el unico que conoce las medidas
   reales del video dentro del marco. */
.caja-video.etiqueta-abajo::after { top: auto; bottom: -20px; }
.caja-video.etiqueta-adentro::after { top: 2px; left: 2px; }

/* Barra de cuenta regresiva del refresco de la cola. Es fina a proposito: no
   es informacion que haya que mirar, es una senal de vida. */
.refresco {
    height: 3px; background: var(--linea); border-radius: 2px;
    overflow: hidden; margin: 0 0 14px;
}

.refresco .avance {
    height: 100%; width: 100%; background: var(--acento);
    transform-origin: left center;
    animation: vaciando 20s linear forwards;
}

@keyframes vaciando { from { transform: scaleX(1); } to { transform: scaleX(0); } }

/* Si alguien tiene el movimiento reducido, la barra se queda quieta en vez de
   animarse. */
@media (prefers-reduced-motion: reduce) {
    .refresco .avance { animation: none; opacity: .35; }
}

/* ------------------------------------------------- marcar a mano -------- */
/* Capa transparente sobre el video donde se arrastra el recuadro. Sin
   marcando no recibe eventos, para no robarle los clics a los controles. */
/* Deja libres los 46 px de abajo: ahi estan los controles del video. Si la
   capa los tapara, en modo marcar no se podria mover la linea de tiempo --
   y para marcar hay que ubicarse primero en el momento. */
.capa-marcar { position: absolute; inset: 0 0 46px 0; pointer-events: none; }
.capa-marcar.marcando { pointer-events: auto; cursor: crosshair; }

.caja-marcando {
    position: absolute; pointer-events: none;
    border: 2px dashed var(--ok-solido);
    background: color-mix(in srgb, var(--ok-solido) 12%, transparent);
}

/* Marca ya guardada, dibujada sobre el video al pasar por su momento. */
.caja-marca {
    position: absolute; pointer-events: none;
    border: 3px solid var(--ok-solido);
    box-shadow: 0 0 0 1px rgba(0, 0, 0, .5);
}

.caja-marca::after {
    content: attr(data-gesto);
    position: absolute; top: -21px; left: -3px;
    background: var(--ok-solido); color: #fff;
    font: 600 11px/1.6 system-ui, sans-serif;
    padding: 0 6px; border-radius: 2px; white-space: nowrap;
}

.marcas-lista { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }

.marcas-lista .marca {
    display: inline-flex; align-items: center; gap: 6px;
    border: 1px solid var(--linea); border-radius: 999px;
    padding: 3px 6px 3px 11px; font-size: 13px; background: var(--panel);
}

.marcas-lista .marca button {
    border: none; background: none; color: var(--tinta-2);
    cursor: pointer; font-size: 15px; line-height: 1; padding: 0 3px;
}

.marcas-lista .marca button:hover { color: var(--mal-texto); }

/* Fuera del tramo que el modelo analizo: senala donde va a estar la marca,
   sin afirmar que ahi hay algo. Punteado, palido y sin porcentaje. */
/* Lo puso el seguidor, no el modelo. En CELESTE y no en un rojo palido:
   sobre el piso de cemento el rojo suave se perdia, y ademas conviene que
   sean dos colores distintos y no dos intensidades del mismo. Rojo = lo
   reconocio el modelo. Celeste = lo esta siguiendo el seguidor.

   SIN la sombra que si lleva el recuadro firme: el box-shadow dibuja un
   anillo SOLIDO por fuera del borde, y contra un borde punteado eso se ve
   como un rectangulo negro entero rodeando los guiones. Sobre el borde
   solido pasa desapercibido; sobre este, no. La legibilidad la aporta el
   celeste, que se eligio justamente por contrastar con el piso. */
/* Lo puso el seguidor y no el modelo: escuadras finas en celeste, sin brillo
   y sin barrita. Que se note que ahi nadie midio nada. */
.caja-video.previsto {
    --c: var(--seguido);
    --g: 2px;
    box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--seguido) 25%, transparent);
}
.caja-video.previsto::before { content: none; }

.caja-video.previsto::after { content: none; }
.mando { display: flex; align-items: center; gap: 8px; margin-top: 8px; }

/* Un <a> con cara de boton. Es <a> y no <button> para que se pueda abrir en
   pestaña nueva con el medio o con ctrl.

   La caja se define SUELTA y no dentro de .mando: la primera version la tenia
   anidada ahi, asi que el mismo class="boton" usado en otra parte -- el
   "Juzgarlo" del cartel de acciones -- salia como texto pelado. */
a.boton {
    display: inline-flex; align-items: center; text-decoration: none;
    border: 1px solid var(--linea); background: var(--panel); color: var(--tinta);
    border-radius: var(--radio); padding: 6px 14px; font-size: 14px; cursor: pointer;
}
a.boton:hover { border-color: var(--acento); background: var(--panel-2); }

.mando button {
    border: 1px solid var(--linea); background: var(--panel); color: var(--tinta);
    border-radius: var(--radio); padding: 6px 14px; font-size: 14px; cursor: pointer;
}

.mando a.boton {
    /* align-self:stretch y no un line-height a mano: un <a> y un <button> con la
       misma fuente y el mismo padding NO miden igual -- daba 25,6 contra 27 --
       porque el boton normaliza el line-height distinto. Estirarlo al alto de la
       fila no depende de la metrica de la fuente. */
    align-self: stretch;
}

.mando button.primario { background: var(--acento); color: var(--acento-texto); border-color: var(--acento); }
/* OJO: aca vivia `.linea-tiempo { flex: 1 }`, de cuando la linea era un
   <input type=range> DENTRO de .mando. Ya es un div propio y hermano de
   .mando, asi que ese flex:1 solo hacia que se estirara para llenar el alto
   que sobrara en el contenedor. En un monitor apaisado no se notaba; Israel
   trabaja con el monitor parado y la franja le quedaba de 250 px de alto. El
   alto lo fija .linea-tiempo mas abajo y nadie mas. */
.linea-tiempo { accent-color: var(--acento); }

/* ------------------------------------------------ marcar personas a mano --
   Encajonar a TODA la gente de un cuadro, para medir detectores. Nada que ver
   con la marca del ladron en un evento: aca se marca al que no hace nada
   tambien. */
.marco-personas {
    position: relative; background: #000; border-radius: var(--radio);
    overflow: hidden; margin: 12px 0;
}

.capa-personas {
    position: relative; display: block; width: 100%;
    aspect-ratio: 16 / 9; cursor: crosshair; touch-action: none;
    user-select: none;
}

.capa-personas img {
    width: 100%; height: 100%; object-fit: contain; display: block;
    pointer-events: none;   /* el arrastre lo maneja la capa, no la imagen */
}

/* Cada persona ya marcada. El numero ayuda a contar en escenas cargadas, que
   es justo donde uno se pierde. */
.caja-persona {
    position: absolute; border: 2px solid var(--ok-solido);
    background: rgba(46, 160, 67, .12); border-radius: 2px;
    cursor: pointer;
}
.caja-persona::after {
    content: attr(data-n);
    position: absolute; top: -19px; left: -2px;
    background: var(--ok-solido); color: #fff;
    font: 600 11px/1.5 system-ui, sans-serif;
    padding: 0 5px; border-radius: 2px;
}
.caja-persona:hover {
    border-color: var(--mal-solido);
    background: rgba(220, 77, 77, .18);
}
/* Al pasar por encima se anuncia QUE HACE el clic. Decia "borrar", que era
   cierto cuando el clic borraba; el borrado paso a un boton y el cartel quedo
   mintiendo. Israel: "le apreto el borrar a uno mal puesto, y no se borra" --
   apretaba la caja, que es lo que la caja decia que hiciera. */
.caja-persona:hover::after { content: 'elegir'; background: var(--acento); }

.avance-personas { margin: 10px 0 4px; }
.avance-personas .barra {
    height: 6px; background: var(--linea); border-radius: 3px; overflow: hidden;
}
.avance-personas .barra i {
    display: block; height: 100%; background: var(--ok-solido);
    transition: width .3s ease;
}
.avance-personas span { font-size: 13px; color: var(--tinta-2); }

.mando .cuenta { font-size: 13px; color: var(--tinta-2); }
.mando .origen { font-size: 12px; color: var(--tinta-3); margin-left: auto; }

.marco-vacio {
    border: 1px solid var(--linea); border-radius: var(--radio);
    padding: 24px; text-align: center; background: var(--panel);
}

/* ------------------------------------------------------- el "¿por qué?" ---
   Que se cumplio para que saltara el aviso, y cuan raro es para ESA camara.
   Lo importante del panel es la comparacion: un 78% de confianza no significa
   nada suelto, significa algo contra la mediana de su propia camara. */
.porque-boton {
    border: 1px solid var(--linea); background: var(--panel);
    color: var(--tinta-2); border-radius: 999px;
    padding: 2px 10px; font-size: 12px; cursor: pointer;
}
.porque-boton:hover { color: var(--tinta); border-color: var(--linea-fuerte); }

.porque {
    margin: 10px 0 4px; padding: 12px 14px;
    background: var(--panel-2); border: 1px solid var(--linea);
    border-radius: var(--radio); font-size: 13px;
}

.porque .disparo { margin: 0 0 12px; color: var(--tinta); line-height: 1.5; }

.porque .eje { display: grid; grid-template-columns: 150px 64px 1fr; 
               gap: 8px; align-items: center; margin-bottom: 9px; }
.porque .eje .que { color: var(--tinta-2); }
.porque .eje .valor { font-weight: 600; text-align: right; }

/* La regla con la marca donde cae este evento dentro de su camara. Es una
   posicion relativa, no una barra que se llena: lo que dice es "mas alto que
   el N% de los otros", no "N% de algo". */
.porque .eje .regla {
    position: relative; height: 4px; background: var(--linea);
    border-radius: 2px; grid-column: 3;
}
.porque .eje .regla i {
    position: absolute; top: -4px; width: 3px; height: 12px;
    background: var(--acento); border-radius: 2px; transform: translateX(-50%);
}
.porque .eje .contexto {
    grid-column: 3; font-size: 11px; color: var(--tinta-2); margin-top: -2px;
}

.porque .historial {
    margin: 12px 0 0; padding-top: 10px;
    border-top: 1px solid var(--linea); color: var(--tinta);
}

/* Que el modelo no razona hay que decirlo en la pantalla, no solo de palabra:
   si no, el numero grande se lee como si fuera un juicio. */
.porque .limite {
    margin: 8px 0 0; font-size: 12px; color: var(--tinta-2);
    line-height: 1.45; font-style: italic;
}

/* ------------------------------------------ que hace la persona (tramos) ---
   Inicio y fin de cada accion sobre el video. Un tramo de 6 segundos etiqueta
   150 cuadros: el rastreo ya sabe donde esta la persona en cada uno. */
.acciones {
    margin: 10px 0 4px; padding: 10px 12px;
    background: var(--panel-2); border: 1px solid var(--linea);
    border-radius: var(--radio);
}
.acciones .titulo {
    font-size: 13px; font-weight: 500; margin-bottom: 8px;
    display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap;
}
.acciones .titulo .grabando { color: var(--mal-texto); font-weight: 400; font-size: 12px; }

.acciones .gestos { display: flex; flex-wrap: wrap; gap: 6px; }

.acciones .gesto {
    border: 1px solid var(--linea); background: var(--panel);
    color: var(--tinta-2); border-radius: 999px;
    padding: 4px 12px; font-size: 13px; cursor: pointer;
}
.acciones .gesto:hover { color: var(--tinta); border-color: var(--linea-fuerte); }

/* El que esta abierto esperando el fin. Late para que no quede a medias sin
   que nadie se de cuenta. */
.acciones .gesto.grabando {
    background: var(--mal-solido); color: #fff; border-color: var(--mal-solido);
    animation: latiendo 1.4s ease-in-out infinite;
}
@keyframes latiendo { 50% { opacity: .62; } }
@media (prefers-reduced-motion: reduce) {
    .acciones .gesto.grabando { animation: none; }
}

.acciones .gesto.mas { font-weight: 600; padding: 4px 11px; }

.acciones .gesto-nuevo { display: flex; gap: 6px; margin-top: 8px; }
.acciones .gesto-nuevo input {
    flex: 1; max-width: 280px; height: 30px; padding: 0 8px;
    border: 1px solid var(--linea); border-radius: var(--radio);
    background: var(--panel); color: var(--tinta); font-size: 13px;
}

.acciones .tramos { list-style: none; margin: 10px 0 0; padding: 0; }
.acciones .tramos li {
    display: flex; align-items: center; gap: 9px;
    padding: 3px 0; font-size: 13px;
}
.acciones .tramos a { font-family: ui-monospace, Consolas, monospace; font-size: 12px; }
.acciones .tramos button {
    border: none; background: none; color: var(--tinta-3);
    cursor: pointer; font-size: 15px; line-height: 1; padding: 0 4px;
}
.acciones .tramos button:hover { color: var(--mal-texto); }

/* La caja elegida mientras se etiqueta, y la que ya tiene gesto. */
/* La elegida tiene que distinguirse SIN pasar el mouse: es la que se va a
   borrar, y confundirla borra la caja de otra persona. */
.caja-persona.elegida {
    border-color: var(--acento); border-width: 3px;
    background: rgba(88, 166, 255, .16);
}
.caja-persona.elegida::after { content: 'elegida ' attr(data-n); background: var(--acento); }
.caja-persona.con-gesto { border-style: solid; }

/* --------------------------------------------- pantalla de etiquetado ------
   Lista de videos a la izquierda, el que se esta marcando a la derecha. Se
   etiquetan de a ciento cincuenta: tener que volver al listado entre uno y
   otro seria insoportable. */
.etiquetado { display: grid; grid-template-columns: 210px 1fr; gap: 16px; }

.cola {
    max-height: 74vh; overflow-y: auto;
    border: 1px solid var(--linea); border-radius: var(--radio);
    background: var(--panel); padding: 5px;
}
.cola .fila {
    display: flex; align-items: center; gap: 7px; width: 100%;
    border: none; background: none; color: var(--tinta-2);
    padding: 6px 8px; border-radius: var(--radio);
    font-size: 13px; cursor: pointer; text-align: left;
}
.cola .fila:hover { background: var(--panel-2); color: var(--tinta); }
.cola .fila.activa { background: var(--chip-fondo); color: var(--chip-texto); font-weight: 500; }
.cola .fila .id { font-family: ui-monospace, Consolas, monospace; font-size: 12px; }
.cola .fila .cam { font-weight: 500; }
.cola .fila .dur { color: var(--tinta-3); font-size: 12px; }
/* Cuantos tramos lleva ese video. Verde para poder barrer la lista de un
   vistazo y ver que falta. */
.cola .fila .listo {
    margin-left: auto; background: var(--ok-solido); color: #fff;
    border-radius: 999px; padding: 0 6px; font-size: 11px; font-weight: 600;
}

/* El reproductor tiene que aguantar CUALQUIER relacion de aspecto: los clips
   de incidentes son recortes de grabaciones de pantalla y van de 484x320 a
   1920x1080, con relaciones de 1,51 a 2,25. Con una caja pensada para 16:9, el
   de 484x320 desbordaba y los controles quedaban abajo del pliegue.

   La clave es acotar por ALTO y no por ancho, y que la columna sea flex: asi el
   video ocupa lo que puede y los botones de gesto siempre entran en pantalla
   sin scrollear. */
.taller { display: flex; flex-direction: column; gap: 8px; }

.taller .marco-secuencia {
    position: relative;
    background: #000; border-radius: var(--radio); overflow: hidden;
}

/* width 100% a proposito, aunque agrande un video chico y se vea borroso.
   Con `width: auto` los clips de 484x320 se mostraban en su tamano nativo:
   diminutos, y -- peor -- centrados en un marco alto, con sus controles a
   mitad de camino. La capa de marcado cubre el marco menos los ultimos 46 px,
   asi que esos controles quedaban DEBAJO de la capa y no se podian ni tocar ni
   ver (eventos 133 y 154).

   Ocupando el ancho, los controles vuelven al borde de abajo del elemento,
   que es justo la franja que la capa deja libre. Y object-fit: contain se
   encarga de no deformar la imagen. */
.taller video {
    width: 100%; max-height: 52vh;
    object-fit: contain; display: block;
    background: #000;
}

@media (max-width: 900px) {
    .etiquetado { grid-template-columns: 1fr; }
    .cola { max-height: 190px; }
}

/* --------------------------------------- de quien es el tramo de accion ---
   Un clic sobre la persona. Sin esto, en un cenital con diez personas el
   tramo no dice de quien habla y el dato no sirve para entrenar. */
.marco-secuencia.con-quien { position: relative; }

/* La capa donde se dibuja el recuadro de la persona.
   Deja libre una franja abajo para los controles del video. 64 px y no 46: en
   Chrome la BARRA DE PROGRESO va arriba de la franja de controles, asi que es
   lo primero que se come la capa cuando el margen queda corto. Con 46 el
   evento 162 quedaba sin barra de progreso, que es justo lo que hace falta
   para volver y adelantar mientras se marca. */
.capa-quien {
    /* TODO el video, hasta el borde de abajo.
       Antes era 'inset: 0 0 64px 0' para dejar libres los controles nativos, y
       eso creaba una franja muerta de 64 px donde no aparecia la cruz y los
       recuadros no se tomaban. Israel lo encontro en el 192: "no puedo marcar
       mas abajo que eso, y si selecciono abajo no me lo toma".
       Es peor de lo que parece: las personas cerca de la camara aparecen
       justamente abajo, y son las mas grandes y mas faciles de rastrear.
       Los controles nativos no hacen falta mientras se marca -- estan la linea
       de tiempo propia, los botones de 1s y 5s, las flechas y la barra
       espaciadora. Y para el caso raro, el switch 'marcar persona' apaga la
       capa y devuelve el video entero. */
    position: absolute; inset: 0;
    cursor: crosshair;
}

/* Apagada: el video queda completamente libre. Sirve de valvula de escape para
   cualquier clip con una geometria que no previmos. */
.capa-quien.apagada { display: none; }

/* El recuadro de la persona a la que se refiere el tramo. En azul del tema y
   no en rojo: no es una deteccion del modelo, es una marca de quien etiqueta. */
.caja-quien {
    position: absolute; pointer-events: none;
    border: 3px solid var(--acento); border-radius: 3px;
    background: color-mix(in srgb, var(--acento) 12%, transparent);
    box-shadow: 0 0 0 1px rgb(0 0 0 / 45%);
}

.acciones .pide-quien { color: var(--mal-texto); font-weight: 500; }
.acciones .tiene-quien { color: var(--ok-texto); font-weight: 400; font-size: 12px; }
.acciones .tiene-quien button {
    border: none; background: none; color: var(--acento);
    cursor: pointer; font-size: 12px; text-decoration: underline; padding: 0 4px;
}
.acciones .gesto:disabled { opacity: .45; cursor: not-allowed; }

/* Bajar el clip. El de "con rastreo" trae el recuadro quemado adentro: en
   pantalla lo dibuja el navegador, asi que el mp4 tal cual sale pelado. */
.bajar {
    display: inline-block; text-decoration: none;
    border: 1px solid var(--linea); border-radius: var(--radio);
    padding: 6px 12px; font-size: 13px; color: var(--acento); background: var(--panel);
}
.bajar:hover { border-color: var(--acento); background: var(--panel-2); }
.bajar.tenue { color: var(--tinta-2); }

/* Filtro de la cola de etiquetado. Con 156 videos, volver a ver los ya hechos
   es puro estorbo. */
.filtro-cola {
    width: 100%; height: 30px; margin-bottom: 6px;
    border: 1px solid var(--linea); border-radius: var(--radio);
    background: var(--panel); color: var(--tinta); font-size: 13px; padding: 0 6px;
}

/* Cambiar el gesto de un tramo ya cargado. Once botones parecidos: equivocarse
   es facil y volver a marcar el tramo entero por eso seria absurdo. */
.cambia-gesto {
    border: 1px solid transparent; border-radius: var(--radio);
    background: transparent; color: var(--tinta);
    font-size: 13px; font-weight: 500; padding: 2px 4px; cursor: pointer;
    max-width: 260px;
}
.cambia-gesto:hover, .cambia-gesto:focus {
    border-color: var(--linea-fuerte); background: var(--panel);
}

/* Confirmacion de que el cambio de gesto quedo guardado. Se va sola a los dos
   segundos: un cartel permanente deja de leerse. */
.acciones .tramos .guardado {
    font-size: 11px; font-weight: 600; color: var(--ok-texto);
    background: var(--ok-fondo); border-radius: 3px; padding: 1px 6px;
    animation: aparece .18s ease-out;
}
@keyframes aparece { from { opacity: 0; transform: translateX(-4px); } }
@media (prefers-reduced-motion: reduce) {
    .acciones .tramos .guardado { animation: none; }
}

/* Video descartado para etiquetar: el guion dice "de este no se saca nada",
   sin gritar. En gris y no en rojo: no es un error, es una decision. */
.cola .fila .descartado {
    margin-left: auto; color: var(--tinta-3);
    font-size: 14px; font-weight: 700; line-height: 1;
}

/* Prender y apagar la capa de marcado. Existe porque esa capa tapa parte del
   video y ya se comio los controles en dos clips de geometria rara. */
.capa-switch {
    display: inline-flex; align-items: center; gap: 5px;
    font-size: 12px; color: var(--tinta-2); cursor: pointer;
    border: 1px solid var(--linea); border-radius: var(--radio); padding: 5px 10px;
}
.capa-switch:hover { color: var(--tinta); border-color: var(--linea-fuerte); }
.capa-switch input { margin: 0; cursor: pointer; }

/* ------------------------------------------------ linea de tiempo propia ---
   Existe porque los controles del navegador quedaban tapados: la capa de
   marcado tiene que cubrir parte del video, y cada clip tiene una geometria
   distinta -- 484x320, 1622x892 -- asi que taparlos era inevitable. Esta barra
   vive fuera de la capa y debajo del video. */
.linea-tiempo {
    /* 36 px y no 26: hay que poder agarrarla con el mouse sin apuntar.
       Israel: "que sea mas agarrable el punto, cuesta mucho hacerle click".
       Con la barra alta el clic cae adentro aunque uno no mire, y como el
       clic en cualquier parte ya mueve el video, no hace falta acertarle a
       la perilla. */
    position: relative; height: 36px; margin: 14px 0 0;
    background: var(--neu-fondo); border-radius: 4px;
    cursor: pointer;
    border: 1px solid var(--linea);
}

/* Los tramos ya marcados. Sirven para no pisarlos al marcar el siguiente. */
.linea-tiempo .tramo {
    position: absolute; top: 0; bottom: 0; max-width: 100%;
    background: color-mix(in srgb, var(--ok-solido) 45%, transparent);
    border-left: 1px solid var(--ok-solido);
    border-right: 1px solid var(--ok-solido);
}

/* Donde estamos parados. Arranca en 0 explicitamente: sin `left` el elemento
   se quedaba en su posicion estatica -- despues de los tramos -- hasta que el
   video informaba su duracion, y quedaba en cualquier lado o invisible.

   Linea MAS perilla: una linea de 3 px sobre una barra con bloques verdes se
   pierde. La perilla asoma por arriba de la barra y se ve siempre. */
.linea-tiempo { overflow: visible; }

/* OJO CON EL SELECTOR. Esto decia `.linea-tiempo .cursor`, de cuando el cursor
   vivia adentro de la barra. Al armar el Gantt se movio al overlay .cruce para
   poder cruzar todas las pistas, y ahi el selector dejo de matchear: el cursor
   quedo siendo un <i> SIN position, sin ancho y sin color, o sea INVISIBLE.
   Israel: "faltaria agregar una linea con el tiempo actual". No faltaba: se
   habia roto al mover el elemento y estuvo un dia sin verse. */
.pistas .cursor {
    position: absolute; left: 0; top: -4px; bottom: -4px; width: 3px;
    margin-left: -1.5px; background: var(--mal-solido);
    box-shadow: 0 0 0 1px rgb(255 255 255 / 55%);
    pointer-events: none;
}

.pistas .cursor::before {
    content: ""; position: absolute; left: 50%; top: -9px;
    width: 20px; height: 20px; margin-left: -10px;
    background: var(--mal-solido); border: 2px solid var(--panel);
    border-radius: 50%;
    box-shadow: 0 1px 4px rgb(0 0 0 / 45%);
}

.reloj {
    font-family: ui-monospace, Consolas, monospace;
    font-size: 12px; color: var(--tinta-2); margin-top: 3px;
}

/* Aviso de lo que cuesta una zona muerta. Va en el color de advertencia y no
   en gris: apagar un pedazo de camara es una decision con consecuencias, y la
   pantalla tiene que decirlo antes y no despues. */
.aviso-zona {
    background: var(--avi-fondo); color: var(--avi-texto);
    border-radius: var(--radio); padding: 8px 12px; margin-top: 8px;
}

/* Con que modelo se detecto el evento. Chico y al pie: solo importa cuando se
   comparan dos versiones, que es justamente cuando hay que poder verlo. */
.porque .modelo-uso {
    margin: 10px 0 0; font-size: 12px; color: var(--tinta-2);
}
.porque .modelo-uso code {
    background: var(--neu-fondo); border-radius: 3px; padding: 1px 5px;
}

/* ---------------------------------------------------- banco de pruebas ----
   Diez clips fijos con la respuesta conocida. Las tablas dicen CUANTO acierta;
   esto muestra COMO, que es lo que no se ve en un porcentaje. */
/* Uno abajo del otro y del tamano de las alertas. En dos columnas de 420 px
   el video quedaba tan chico que no se distinguia si el recuadro seguia a la
   persona, que es exactamente para lo que existe esta pantalla. */
.banco { display: flex; flex-direction: column; gap: 16px; }

.caso {
    border: 1px solid var(--linea); border-radius: var(--radio);
    padding: 10px; background: var(--panel);
    border-left: 4px solid var(--linea-fuerte);
}
/* El borde dice de un vistazo que se espera de cada clip, sin tener que leer
   el titulo de la seccion cuando uno esta a mitad de la lista. */
.caso.hurto { border-left-color: var(--mal-solido); }
.caso.nada  { border-left-color: var(--ok-solido); }

.caso .cabecera {
    display: flex; align-items: center; gap: 9px;
    margin-bottom: 8px; font-size: 13px; flex-wrap: wrap;
}
.caso video { width: 100%; max-height: 70vh; object-fit: contain; display: block; background: #000; }

/* Candidatos de la prueba temporal. Se distinguen del banco fijo con un borde
   al costado: son para elegir, no para medir. */
.caso.candidato { border-left: 3px solid #7a5cd6; }
.caso.candidato .gestos-cand {
  margin: .4rem 0 0;
  color: #616161;          /* AA sobre blanco; ver memoria de contraste */
  line-height: 1.35;
}

/* Ubicaciones de la persona: anclas para el rastreo, no gestos. Se muestran
   en una barra propia para que no se confundan con los tramos marcados. */
.ubicaciones {
  display: flex; flex-wrap: wrap; align-items: center; gap: .4rem;
  padding: .5rem .6rem; margin: .5rem 0;
  border-left: 3px solid #7a5cd6; background: #f7f5fd; border-radius: 4px;
}
.ubi-tit { font-weight: 600; color: #4a3a80; margin-right: .3rem; }
.ubi-vacio { color: #616161; font-size: .9em; }
.ubi { display: inline-flex; align-items: center; border: 1px solid #c9bcea;
       border-radius: 4px; overflow: hidden; background: #fff; }
.ubi.otra { border-style: dashed; }          /* marcas viejas, de hurto */
/* La ubicacion ELEGIDA: es a esa persona a la que se le van a marcar los
   gestos. Sin marcarla, con varias ubicaciones en pantalla no se sabe sobre
   cual se esta trabajando, y el gesto termina atribuido a quien no era. */
.ubi.elegida { border-color: #4a3a80; border-width: 2px; background: #ede8fa; }
.ubi-ir { border: 0; background: none; padding: .2rem .45rem; cursor: pointer;
          color: #4a3a80; font-variant-numeric: tabular-nums; }
.ubi-ir:hover { background: #ede8fa; }
.ubi-x { border: 0; border-left: 1px solid #e0d8f5; background: none;
         padding: .2rem .4rem; cursor: pointer; color: #8a3a3a; }
.ubi-x:hover { background: #fbeaea; }
.ubi-guardar { margin-left: .4rem; }

/* Ubicaciones ya guardadas, dibujadas sobre el video. Atenuadas a proposito:
   son referencia, no lo que se esta marcando ahora. */
.caja-ubi {
  position: absolute; border: 2px dashed #7a5cd6; border-radius: 3px;
  background: rgba(122, 92, 214, .10); pointer-events: none;
}
.caja-ubi b {
  position: absolute; top: -1.15rem; left: -2px;
  background: #7a5cd6; color: #fff; font-size: .7rem; font-weight: 600;
  padding: 0 .25rem; border-radius: 2px; white-space: nowrap;
}
/* Y en la linea de tiempo, CUANDO esta cada ancla. */
.linea-tiempo .ubi-tick {
  position: absolute; top: 0; bottom: 0; width: 2px;
  background: #7a5cd6; transform: translateX(-1px); pointer-events: none;
}
.ubi-ok { color: #4a3a80; font-size: .85em; margin: 0 .3rem; }

/* Ubicacion abierta: se esta armando el tramo, todavia no se guardo. */
.ubi-abierta { color: #4a3a80; font-size: .9em; }
.ubi-cerrar {
  border: 1px solid #7a5cd6; background: #fff; color: #4a3a80;
  border-radius: 4px; padding: .1rem .4rem; cursor: pointer; margin-left: .2rem;
}
.ubi-cerrar:hover { background: #ede8fa; }
.caja-quien.abierta { border-style: solid; border-color: #7a5cd6; }
/* En la linea: los tramos son barra, los puntuales una raya fina. */
.linea-tiempo .ubi-tick.tramo {
  width: auto; background: rgba(122, 92, 214, .45); transform: none;
  border-left: 2px solid #7a5cd6; border-right: 2px solid #7a5cd6;
}
.ubi-error { color: #a12b2b; font-size: .9em; font-weight: 600; }

/* Cuenta de ubicaciones en la cola. Violeta, como todo lo de ubicaciones, para
   que no se confunda con el contador verde de tramos marcados. */
.ubi-cuenta {
  min-width: 1.35rem; text-align: center; border-radius: 999px;
  padding: 0 .3rem; font-size: .78rem; font-weight: 700;
  background: #7a5cd6; color: #fff;
}
/* Con una sola ancla (la vieja del 14/08) el rastreo se pierde igual: se marca
   apagada para que se note que ese video todavia esta por hacer. */
.ubi-cuenta.flaca { background: #ece7f7; color: #6b5aa0; font-weight: 600; }

/* Los recuadros los posiciona marcar.js en PIXELES dentro de la capa, con la
   misma geometria con la que lee el mouse. Aca va solo como se ven. */
.capa-quien .caja-ubi, .capa-quien .caja-quien {
  position: absolute; pointer-events: none;
}

/* La perilla crece cuando el mouse esta sobre la barra: confirma que eso se
   agarra, sin tener que descubrirlo probando. */
.pistas:hover .cursor::before { transform: scale(1.25); }
.pistas .cursor::before { transition: transform .08s ease-out; }

/* Las dos respuestas del banco: la de Israel y la del modelo. Separadas a
   proposito -- confundirlas fue el bug que hizo que la pantalla pareciera
   afirmar algo que en realidad venia del catalogo cargado a mano. */
.veredicto {
  font-size: .78rem; font-weight: 600; padding: .1rem .4rem;
  border-radius: 999px; white-space: nowrap;
}
.veredicto.vos { background: #eceff1; color: #37474f; }
.veredicto.modelo.bien { background: #1b5e20; color: #fff; }
.veredicto.modelo.mal { background: #a12b2b; color: #fff; }
.veredicto.sindato { background: #f3f0fa; color: #6b5aa0; }

/* Domo: el clip sirve para revisar pero no para entrenar gestos. */
/* La grilla de recortes de manos. Seis columnas de 224 px es lo que entra en
   una pantalla sin scroll horizontal, y el recorte llega a ese tamaño desde
   sembrar_manos.py: agrandarlo por CSS solo lo pixela. */
.grilla-manos { display: grid; gap: .6rem; margin: 1rem 0;
                grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); }
.manos-item { border: 1px solid var(--borde, #3a3a3a); border-radius: 6px;
              padding: .35rem; }
.manos-item img { width: 100%; display: block; border-radius: 4px; }
.manos-datos { font-size: .72rem; margin: .3rem 0 .35rem; }
/* Cuatro botones ya no entran en una fila de 190 px: se envuelven. */
.manos-botones { display: flex; gap: .25rem; flex-wrap: wrap; }
.manos-botones .chico { flex: 1; font-size: .72rem; padding: .25rem .1rem; }
/* Etiquetada: se atenua pero NO se saca de la grilla, asi un click equivocado
   se puede corregir y la lista no salta bajo el cursor. */
.manos-hecha { opacity: .38; }

/* Las tiras de "devolvio la prenda". Una por fila y no en grilla: la tira son
   ocho recortes de 150 px pegados, 1200 px de ancho, y la direccion del gesto
   -- lo unico que separa agarrar de dejar -- solo se lee si los ocho cuadros se
   ven en orden y a tamaño. Encogerla a una celda de grilla la haria inutil.

   Si la pantalla es mas angosta que la tira, scrollea la tira sola: el body con
   scroll horizontal hace perder los botones de la derecha. */
.tiras { display: flex; flex-direction: column; gap: .55rem; margin: 1rem 0; }
.tira-item { border: 1px solid var(--borde, #3a3a3a); border-radius: 6px;
             padding: .4rem .5rem; }
.tira-datos { font-size: .74rem; margin: 0 0 .3rem; }
/* La tira se genera a 1600 px (ocho recortes de 200) para que entre entera en
   un monitor de 24 pulgadas sin scroll horizontal. Con width:100% y max-width en
   el tamaño nativo se ve 1:1 en esa pantalla y se encoge en las mas chicas, en
   vez de aparecer una barra de scroll por fila. */
.tira-foto img { display: block; width: 100%; max-width: 1600px; height: auto;
                 border-radius: 4px; }
/* Dos filas de botones, una por pregunta: agarro, y donde termino. Cada fila
   lleva su rotulo a la izquierda -- con dos preguntas y diez botones, sin rotulo
   no se sabe cual contesta cual. Se envuelven en pantallas angostas. */
.tira-fila { display: flex; gap: .35rem; margin-top: .35rem; flex-wrap: wrap;
             align-items: center; }
.tira-fila .chico { font-size: .74rem; padding: .28rem .6rem; }
.tira-rotulo { font-size: .72rem; opacity: .7; min-width: 11ch; }
/* La opcion elegida queda marcada: es la unica forma de ver que se contesto una
   pregunta y falta la otra, y de darse cuenta de un click equivocado sin
   recargar. */
.tira-fila .chico.puesto { border-color: var(--acento, #7ec9a0);
                           color: var(--acento, #7ec9a0); font-weight: 600; }
.tira-fila .chico:disabled { opacity: .35; cursor: default; }
/* El cartel de guardado fallido. Visible a proposito: el modo silencioso hizo
   perder clicks sin que se notara. */
.aviso-error { border: 1px solid #a85555; background: rgba(168, 85, 85, .12);
               border-radius: 6px; padding: .5rem .7rem; margin: .6rem 0;
               display: flex; gap: .7rem; align-items: center;
               flex-wrap: wrap; font-size: .8rem; }
/* Que significa cada boton. Con ocho clases la definicion tiene que estar a la
   vista: la primera version tenia cuatro y se quedo corta tres veces. */
.ayuda-clases { max-width: 80ch; margin: .4rem 0 .9rem 1.1rem; padding: 0;
                line-height: 1.45; }
.ayuda-clases li { margin-bottom: .18rem; }
/* Igual que en Manos: se atenua pero no se saca, asi un click equivocado se
   puede corregir y la lista no salta bajo el cursor. */
.tira-hecha { opacity: .38; }

.domo-check { display: inline-flex; align-items: center; gap: .3rem; cursor: pointer; }
/* El motivo del "no usar". Angosto a proposito: es una nota corta, no un
   comentario -- para eso ya esta el campo de comentario del evento. */
.motivo-no-usar { width: 12rem; margin-left: .4rem; padding: .2rem .4rem;
                  font-size: .85rem; }
.domo-chip {
  background: #8d6e63; color: #fff; font-size: .7rem; font-weight: 700;
  border-radius: 999px; padding: 0 .35rem;
}

/* El recuadro alrededor del titulo de la pagina.
   ------------------------------------------------------------------
   Blazor trae <FocusOnNavigate Selector="h1"> en App.razor: al navegar le
   pone tabindex="-1" al titulo y lo enfoca, para que un lector de pantalla
   anuncie en que pagina estas. Es correcto y hay que conservarlo.
   El efecto no buscado es visual: en Alertas se juzga con el teclado (H, I,
   N), y apenas se toca una tecla Chrome decide que la navegacion es por
   teclado y le dibuja el anillo de foco al h1. Queda un recuadro alrededor
   de "Alertas" que parece un error de diseno.
   Se apaga SOLO para ese caso -- un titulo enfocado por navegacion -- y no
   para los controles de verdad, donde el anillo hace falta para saber donde
   esta uno parado. */
h1[tabindex="-1"]:focus,
h1[tabindex="-1"]:focus-visible { outline: none; box-shadow: none; }

/* Zonas muertas como poligono. El SVG va encima de la foto y no intercepta
   clics salvo en los vertices: el clic sobre el area vacia tiene que llegar a
   la capa de abajo para agregar un punto nuevo. */
.capa-poligonos { position: absolute; inset: 0; pointer-events: none; }
.capa-poligonos .zona {
  fill: rgba(214, 64, 64, .22); stroke: #d64040; stroke-width: 2;
}
/* El que se esta armando va punteado y sin relleno: se distingue de los ya
   cerrados de un vistazo. */
.capa-poligonos .zona.armando {
  fill: none; stroke-dasharray: 6 4;
}
.capa-poligonos .vertice {
  fill: #fff; stroke: #d64040; stroke-width: 2;
  pointer-events: all; cursor: grab;
}
/* El primer punto se resalta: es el que hay que tocar para cerrar la figura. */
.capa-poligonos .vertice.primero { fill: #d64040; r: 8; cursor: pointer; }

/* Acceso a las zonas muertas desde el renglon de la camara. Verde cuando ya
   tiene alguna dibujada: el color evita abrir 48 camaras para ver cuales
   estan configuradas. */
.zonas-link {
  display: inline-block; padding: .15rem .5rem; margin-right: .4rem;
  border: 1px solid var(--linea); border-radius: 999px;
  font-size: .78rem; text-decoration: none; color: var(--tinta-2);
}
.zonas-link:hover { border-color: var(--acento); color: var(--acento); }
.zonas-link.tiene {
  background: #1b5e20; border-color: #1b5e20; color: #fff; font-weight: 600;
}

/* Ver una camara en vivo desde el listado. */
.grupo-camaras { margin-top: 18px; }
.grupo-camaras.apagadas { opacity: .75; }
.vivo-btn { margin-right: .4rem; }
.modal-fondo {
  position: fixed; inset: 0; background: rgb(0 0 0 / 62%);
  display: grid; place-items: center; z-index: 200;
}
.modal-vivo {
  background: var(--panel); border: 1px solid var(--linea);
  border-radius: 12px; padding: 14px; max-width: 92vw; max-height: 92vh;
}
.modal-vivo img {
  display: block; max-width: 86vw; max-height: 74vh;
  border-radius: 6px; background: #10151f;
}
.modal-cab { display: flex; align-items: center; gap: 12px; margin-bottom: 10px; }
.modal-cab .icono { margin-left: auto; }

/* ------------------------------------------------- revision por NVR ----- */
/* Existe porque "eventos por camara" solo no dice si una camara esta bien
   puesta: una apagada da cero y esta perfecta. Lo que delata un error es que
   los campos se contradigan entre si, y eso se chequea solo. */
.revision { margin: 22px 0; }
.revision .nvr { margin-bottom: 18px; }
.revision .nvr h3 {
    font-size: 15px; font-weight: 600; margin: 0 0 8px;
    display: flex; align-items: baseline; gap: 8px;
}
/* La tabla tiene 11 columnas y no entra en un celular. Scrollea ELLA, dentro
   de su caja, para que la pagina no se mueva de costado. */
.tabla-scroll { overflow-x: auto; }
.tabla-scroll .tabla { min-width: 900px; }
.revision .con-problema td { background: var(--avi-fondo); }
.chip.alerta {
    display: inline-block; margin: 1px 0;
    background: var(--avi-fondo); color: var(--avi-texto);
}


/* ------------------------------------------------------------- inicio ---- */
.tablero {
    display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px;
    align-items: start; margin-top: 6px;
}
.tablero .panel {
    background: var(--panel); border: 1px solid var(--linea);
    border-radius: var(--radio); padding: 14px 16px;
    display: flex; flex-direction: column; gap: 8px;
}
/* Los graficos necesitan ancho; las dos metricas sueltas no. */
.tablero .ancho { grid-column: span 4; }
.tablero .destacado { grid-column: span 1; }
@media (max-width: 1000px) {
    .tablero { grid-template-columns: repeat(2, 1fr); }
    .tablero .ancho { grid-column: span 2; }
}
@media (max-width: 620px) {
    .tablero { grid-template-columns: 1fr; }
    .tablero .ancho, .tablero .destacado { grid-column: span 1; }
}

.tablero .rotulo { font-size: 13px; color: var(--tinta-2); }
.tablero .grande { font-size: 40px; line-height: 1; font-weight: 600; }

/* La dona. Es un circulo con el borde cortado por stroke-dasharray: no hace
   falta calcular ningun path ni traer una libreria de graficos. */
.dona-caja { display: flex; justify-content: center; }
.dona { width: 120px; height: 120px; }
.dona .pista { fill: none; stroke: var(--linea); stroke-width: 12; }
.dona .arco  { fill: none; stroke: var(--acento); stroke-width: 12; }
.dona-num {
    text-anchor: middle; font-size: 26px; font-weight: 600; fill: var(--tinta);
}
.dona-pie { text-anchor: middle; font-size: 11px; fill: var(--tinta-2); }

/* Barras verticales, para las horas y los dias. */
.horas, .dias { display: flex; align-items: flex-end; gap: 6px; height: 130px; }
.hora, .dia {
    flex: 1; display: flex; flex-direction: column; align-items: center;
    height: 100%; gap: 4px;
}
.hora .col, .dia .col {
    flex: 1; width: 100%; display: flex; align-items: flex-end;
    background: var(--panel-2); border-radius: 3px;
}
.hora .col i, .dia .col i {
    width: 100%; background: var(--acento); border-radius: 3px; min-height: 2px;
}
.hora .et, .dia .et { font-size: 10px; color: var(--tinta-2); }

/* El embudo: abiertos -> revisados -> aciertos. Tres numeros, no un grafico:
   con 13 eventos cualquier dibujo seria decoracion. */
.embudo { display: flex; gap: 26px; flex-wrap: wrap; }
.embudo div { display: flex; flex-direction: column; }
.embudo strong { font-size: 26px; line-height: 1.1; }
.embudo span { font-size: 12px; color: var(--tinta-2); }
/* La tarjeta entera es el boton, no solo el texto de abajo: con un numero
   grande y rojo, el reflejo es hacerle clic al numero. */
.tablero a.clickeable { text-decoration: none; color: inherit; }
.tablero a.clickeable:hover { border-color: var(--acento); }

/* -------------------------------------------------- prueba de camara ---- */
.modal-prueba {
    background: var(--panel); border-radius: var(--radio);
    padding: 18px 20px; width: min(1100px, 94vw);
    max-height: 90vh; overflow-y: auto;
}
.modal-prueba .pedir {
    display: flex; gap: 14px; align-items: flex-end; flex-wrap: wrap;
    margin: 12px 0 6px;
}
.modal-prueba .pedir label {
    display: flex; flex-direction: column; gap: 4px;
    font-size: 13px; color: var(--tinta-2);
}
.modal-prueba .pedir input, .modal-prueba .pedir select { padding: 6px 8px; }

.una-prueba {
    border: 1px solid var(--linea); border-radius: var(--radio);
    padding: 12px 14px; margin-top: 12px;
}
.cab-prueba { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }

/* El video al lado de la tabla: hay que mirar los dos juntos. El numero dice
   cuantas cosas encontro y el recuadro dice cuales, que es lo unico que
   distingue una persona de un perchero. */
.prueba-cuerpo {
    display: grid; grid-template-columns: minmax(320px, 1fr) minmax(320px, 1fr);
    gap: 16px; align-items: start; margin-top: 10px;
}
@media (max-width: 900px) {
    .prueba-cuerpo { grid-template-columns: 1fr; }
}
.prueba-cuerpo video {
    width: 100%; border-radius: var(--radio); background: #000;
}
.prueba-cuerpo .tabla { font-size: 13px; }
.prueba-cuerpo .tabla th, .prueba-cuerpo .tabla td { padding: 6px 8px; }
.prueba-cuerpo .mejor td { background: var(--ok-fondo); }

/* Donde miro el modelo cuando abrio el aviso. Punteada y en ambar para que no
   se confunda con las marcas hechas a mano: es una pista, no un dato cargado.
   Sin esto, marcar un evento "nada" con varios clientes en pantalla era
   adivinar a cual habia senalado la maquina. */
.caja-modelo {
    position: absolute; pointer-events: none;
    border: 2px dashed #f0a020; border-radius: 3px;
    box-shadow: 0 0 0 1px rgba(0, 0, 0, .35);
}
.caja-modelo b {
    position: absolute; top: -20px; left: 0; white-space: nowrap;
    background: #f0a020; color: #1c1c1a;
    font-size: 11px; font-weight: 600; padding: 1px 5px; border-radius: 3px;
}

/* Pedir mas o menos video de cada lado del evento. */
.margenes {
    display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
    margin: 8px 0; font-size: 13px;
}
.margenes label { display: flex; align-items: center; gap: 4px; color: var(--tinta-2); }
.margenes input { width: 62px; padding: 4px 6px; }

/* ---------------------------------------------------------------------------
   Chip de alertas sin revisar, en la barra de arriba.

   Esta en el layout, asi que se ve desde cualquier pantalla. Dos estados a
   proposito: en cero queda apagado y no pide atencion -- si parpadeara siempre
   se deja de mirar -- y con algo pendiente se pone rojo y late. El "0" tambien
   se muestra: es la diferencia entre "no hay nada" y "no cargo", que era
   justamente la duda del 22/08.
   --------------------------------------------------------------------------- */
.chip-alertas {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 1.9rem;
    height: 1.6rem;
    padding: 0 .45rem;
    border-radius: 999px;
    border: 1px solid rgba(255, 255, 255, .28);
    font-size: .82rem;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    text-decoration: none;
    line-height: 1;
}

.chip-alertas.vacio {
    color: rgba(255, 255, 255, .62);
    background: transparent;
}

.chip-alertas.hay {
    color: #fff;
    background: var(--mal-solido);
    border-color: transparent;
    animation: late-chip 2s ease-in-out infinite;
}

.chip-alertas:hover { filter: brightness(1.12); }

@keyframes late-chip {
    0%, 100% { box-shadow: 0 0 0 0 rgba(163, 45, 45, .70); }
    50%      { box-shadow: 0 0 0 .32rem rgba(163, 45, 45, 0); }
}

/* Quien prefiere no ver cosas moviendose no las ve. */
@media (prefers-reduced-motion: reduce) {
    .chip-alertas.hay { animation: none; }
}

/* ------------------------------------------------------- pistas (Gantt) --
   Una pista por gesto, sobre un eje de tiempo compartido con la barra de
   arriba.

   Por que en pistas separadas y no todo en una franja: una persona puede tener
   el canasto en la mano Y meterse la mano en el bolsillo al mismo tiempo. En
   una sola franja los dos tramos se encimaban y se leian como un bloque; no
   habia forma de ver que eran dos cosas a la vez, que es justamente el dato.
   Israel: "lo veo como un editor de audio con muchas pistas".

   Grilla de dos columnas -- rotulo | carril -- y NO una fila con flex por
   pista: con flex, un rotulo mas largo corre su carril y esa pista queda
   desalineada de las demas, que es lo unico que no se puede permitir cuando
   todo el sentido es compararlas verticalmente. */
.pistas {
    /* El ancho del canal de rotulos es una variable porque lo necesitan dos:
       la grilla, para su primera columna, y el cursor, que va posicionado
       ENCIMA de la grilla y tiene que empezar justo donde empiezan los
       carriles. Con dos numeros sueltos se desalinean al primer cambio. */
    --canal: 8.5rem;
    --hueco: 8px;
    position: relative;
    display: grid;
    grid-template-columns: var(--canal) 1fr;
    align-items: center;
    column-gap: var(--hueco);
    row-gap: 3px;
    margin: 14px 0 0;
}

/* Con el monitor parado sobra alto y falta ancho: el canal se achica antes que
   los carriles, que son los que tienen que poder leerse. */
@media (max-width: 900px) {
    .pistas { --canal: 5.5rem; }
}


.pistas .carril {
    position: relative;
    height: 22px;
    min-width: 0;
    background: var(--panel-2);
    border: 1px solid var(--linea);
    border-radius: 3px;
}

/* La barra de arriba mantiene sus 36 px: es la que se agarra para moverse por
   el video y tiene que ser facil de acertar. Las pistas son mas bajas porque no
   se las agarra enteras, solo sus puntas.

   OJO CON EL ORDEN. `.pistas .linea-tiempo` y `.pistas .carril` tienen la MISMA
   especificidad -- dos clases cada una -- asi que el empate lo desempata el
   orden en el archivo. Puesta antes, esta regla perdia y la barra quedaba de 22
   px: se medio en 22 y por eso esta aca abajo. */
.pistas .linea-tiempo { margin: 0; grid-column: 2; height: 36px; }

.rotulo-pista {
    grid-column: 1;
    font-size: 11px;
    line-height: 1.15;
    color: var(--tinta-2);
    text-align: right;
    /* Un rotulo largo no puede empujar la columna: se corta. El titulo
       completo esta en el title. */
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.rotulo-pista.eje {
    font-family: ui-monospace, Consolas, monospace;
    color: var(--tinta-3);
}

.rotulo-pista.ubis { color: #4a3a80; font-weight: 600; }

/* --- las barras --- */
.pistas .barra {
    position: absolute; top: 1px; bottom: 1px;
    display: flex; align-items: center; justify-content: center;
    box-sizing: border-box;
    background: color-mix(in srgb, var(--ok-solido) 38%, transparent);
    border: 1px solid var(--ok-solido);
    border-radius: 3px;
    cursor: pointer;
    overflow: hidden;
}

.pistas .barra:hover {
    background: color-mix(in srgb, var(--ok-solido) 55%, transparent);
}

.pistas .barra.agarrada {
    background: color-mix(in srgb, var(--ok-solido) 70%, transparent);
    /* Sin transicion a proposito: la barra tiene que ir pegada al mouse. */
    z-index: 3;
}

.pistas .barra.guardando { opacity: .55; }

.rotulo-tramo {
    font-family: ui-monospace, Consolas, monospace;
    font-size: 10px; color: var(--tinta);
    pointer-events: none; white-space: nowrap;
    padding: 0 2px;
}

/* Las puntas. 10 px de ancho y no 4: es lo que se puede agarrar sin apuntar,
   la misma razon por la que la barra de arriba mide 36 y no 26. El cursor
   ew-resize es la unica pista visual de que se pueden mover, asi que importa. */
.pistas .punta {
    position: absolute; top: -2px; bottom: -2px; width: 10px;
    cursor: ew-resize;
    /* Se pinta como una manija fina centrada en los 10 px agarrables: el area
       de clic es mas grande que lo que se ve, que es lo que uno quiere. */
    background:
        linear-gradient(var(--ok-texto), var(--ok-texto)) center / 2px 100% no-repeat;
    touch-action: none;
}

.pistas .punta.izq { left: -1px; }
.pistas .punta.der { right: -1px; }
.pistas .punta:hover,
.pistas .barra.agarrada .punta,
.pistas .marca-ubi.agarrada .punta {
    background: linear-gradient(var(--mal-solido), var(--mal-solido))
                center / 3px 100% no-repeat;
}

/* --- la pista de ubicaciones --- */
.pistas .carril.ubis { background: color-mix(in srgb, #7a5cd6 8%, var(--panel-2)); }

.pistas .marca-ubi {
    /* Volvio a ser <span>: las puntas agarrables son elementos interactivos
       adentro, y un <button> no puede contener otro. Quedan los reset del
       borde igual, porque el borde lateral se pinta a mano abajo.

       Ojo con las puntuales: miden 2 px y las dos manijas miden 10, asi que se
       superponen casi enteras. Medido en el navegador: el centro de cada una
       sigue golpeando la suya, o sea que las dos se pueden agarrar -- pero con
       muy poco margen, asi que en una puntual cual agarras depende de donde
       apoyes exactamente. */
    cursor: pointer;
    position: absolute; top: 1px; bottom: 1px;
    background: rgba(122, 92, 214, .45);
    border: 0;
    border-left: 2px solid #7a5cd6; border-right: 2px solid #7a5cd6;
    border-radius: 2px;
    box-sizing: border-box;
    padding: 0;
}

/* Una ubicacion puntual no tiene tramo: raya fina en vez de barra. */
.pistas .marca-ubi.punto {
    width: 2px !important;
    background: #7a5cd6; border: 0;
    transform: translateX(-1px);
}

/* --- el cursor que cruza todas las pistas ---

   Va posicionado ABSOLUTO sobre la grilla y no como celda de la grilla. Como
   celda hay que decirle cuantas filas ocupa, y las filas son tantas como
   gestos tenga el video: `grid-row: 1 / span 99` reservaba 99 filas y cada
   fila vacia igual cobraba su row-gap -- 294 px de aire y una franja de 482
   px, justo el problema que esto venia a arreglar. Absoluto no necesita saber
   cuantas filas hay. */
.pistas .cruce {
    position: absolute;
    top: 0; bottom: 0; right: 0;
    left: calc(var(--canal) + var(--hueco));
    pointer-events: none;   /* no le roba el clic ni a la barra ni a las puntas */
}

/* El cursor de la barra de arriba se movio aca, asi que el de adentro de
   .linea-tiempo ya no existe. Este cruza el alto entero. */
.pistas .cruce .cursor { top: 0; bottom: 0; }

@media (prefers-reduced-motion: reduce) {
    .pistas .barra { transition: none; }
}


/* --- la fila del + del Gantt ---
   Existe porque los botones de gesto estan al pie de la pantalla y en 768 px de
   alto quedan abajo del pliegue. En un 'nada' sin tramos el Gantt esta vacio,
   asi que sin esto la pantalla no ofrece nada para empezar a marcar. */
.pistas .rotulo-pista.mas-rotulo { color: var(--tinta-3); font-style: italic; }

.pistas .carril.fila-mas {
    display: flex; align-items: center; gap: 5px;
    background: transparent; border: 1px dashed var(--linea-fuerte);
    height: auto; min-height: 22px; padding: 2px 4px;
    /* Se deja crecer: con quince gestos la lista pasa a dos renglones y
       recortarla esconderia justo el que se busca. */
    flex-wrap: wrap;
}

.mas-gesto {
    flex: 0 0 auto;
    width: 20px; height: 18px; line-height: 1;
    border: 1px solid var(--linea-fuerte); background: var(--panel);
    color: var(--tinta-2); border-radius: 3px; cursor: pointer;
    font-size: 13px; font-weight: 700; padding: 0;
}
.mas-gesto:hover { background: var(--chip-fondo); color: var(--acento); }

.mas-quien {
    font-size: 11px; font-family: ui-monospace, Consolas, monospace;
    color: var(--ok-texto); font-weight: 700;
}

.mas-g {
    font-size: 10.5px; line-height: 1.1;
    padding: 2px 5px; border-radius: 3px;
    border: 1px solid var(--linea); background: var(--panel);
    color: var(--tinta); cursor: pointer; white-space: nowrap;
}
.mas-g:hover { border-color: var(--acento); color: var(--acento); }

/* Un tramo abierto se ve distinto: hay que tocarlo de nuevo para cerrarlo, y
   sin marca no se sabe cual quedo a medias. */
.mas-g.grabando {
    background: var(--mal-solido); border-color: var(--mal-solido);
    color: #fff; font-weight: 700;
}

/* ------------------------------------------ pantallas bajas: modo compacto --
   Israel trabaja por AnyDesk sobre un monitor de 1366x768, y AnyDesk espeja la
   pantalla fisica: no hay forma de agrandarla desde afuera. En 768 px de alto la
   pagina de marcado no entra, y lo que queda abajo del pliegue es justo lo que
   se necesita -- el Gantt y los gestos.

   La cuenta que no cerraba: encabezado 90 + refresco 10 + video 460 + pistas 95
   + reloj 18 + mando 40 = 713, mas el cromo del navegador. Sobre ~680 px utiles
   se iba 150 px.

   Lo que se recorta es el ALTO DEL VIDEO y el encabezado, y nada mas: los
   controles de marcado quedan todos visibles, que es el punto. El video sigue
   entero -- object-fit: contain -- solo mas chico.

   Se activa por max-height y no por max-width a proposito: el problema es el
   alto, y un monitor 1920x768 tendria exactamente el mismo. */
@media (max-height: 900px) {
    /* El video toma lo que sobra despues de reservar lo de abajo. El calc es
       explicito para que se vea de donde sale cada pixel. */
    .marco-secuencia {
        max-height: calc(100vh - 300px);
        min-height: 220px;      /* abajo de esto no se ve a nadie */
    }

    /* El encabezado: el titulo mas chico y los atajos afuera. Los atajos siguen
       funcionando -- H, I, N -- solo no se anuncian. */
    .encabezado h1 { font-size: 1.15rem; margin: 0; }
    .encabezado .atajos { display: none; }
    .encabezado { gap: 8px; margin-bottom: 6px; }

    /* La cola de videos al costado tambien se estira sola. */
    .cola { max-height: calc(100vh - 220px); }

    /* Y el mando, que son botones grandes para el dedo pero acá compiten con el
       Gantt por el mismo alto. */
    .mando { gap: 6px; margin-top: 6px; }
    /* El <a class="boton"> entra tambien en el modo compacto. Sin esto
       quedaba 30,8 px de alto contra 27 de los <button> de al lado, o sea
       un boton mas alto que sus vecinos en la misma fila. Medido. */
    .mando button, .mando a.boton { padding: 4px 10px; font-size: 13px; }
    .mando .origen { display: none; }
}

/* Mas abajo de 800 el video cede todavia mas: a esa altura la prioridad es
   poder marcar, no ver grande. */
@media (max-height: 800px) {
    .marco-secuencia { max-height: calc(100vh - 260px); }
    .reloj { display: none; }        /* el tiempo ya esta en el rotulo del eje */
}


/* La ubicacion elegida: es la persona a la que se le van a marcar los gestos, y
   sin marcarla no se sabe sobre quien se esta trabajando. */
.pistas .marca-ubi.elegida {
    background: color-mix(in srgb, var(--acento) 55%, transparent);
    border-left-color: var(--acento); border-right-color: var(--acento);
    box-shadow: 0 0 0 2px var(--acento);
    z-index: 2;
}
.pistas .marca-ubi:hover { filter: brightness(1.25); }

/* Los recuadros ya marcados, como botones en la fila del +. La barra de la
   pista es fina y hay que acertarle; estos son del tamano de un boton. */
.mas-ubi {
    font-size: 10.5px; font-family: ui-monospace, Consolas, monospace;
    padding: 2px 6px; border-radius: 3px; cursor: pointer; white-space: nowrap;
    /* Con tokens, no con colores fijos: hay tema claro y oscuro. La primera
       version tenia el texto en #4a3a80 sobre var(--panel), y en el tema oscuro
       eso es morado oscuro sobre rgb(27,31,38) -- ilegible. El morado del borde
       si va fijo, porque es el color con el que se pintan las ubicaciones en
       todo el Gantt y sirve para reconocerlas. */
    border: 1px solid #7a5cd6; background: var(--panel); color: var(--tinta);
    font-weight: 700;
}
.mas-ubi:hover { background: var(--panel-2); border-color: var(--acento); }
.mas-ubi.elegida {
    background: var(--acento); border-color: var(--acento);
    color: var(--acento-texto);
}

/* El rotulo del paso 1 va apagado: marcar quien es opcional desde que las
   acciones se desataron de los recuadros, y en tono normal seguia leyendose
   como una orden. */
.pide-quien.flojo {
    /* NO se apaga con opacity. .pide-quien es un rojo de atencion,
       rgb(163,45,45), y bajarle la opacidad a .7 lo lava a rgb(188,106,107):
       contraste 3,65 sobre el panel claro, abajo del minimo de 4,5. Medido en el
       navegador. Israel: "el texto es gris, no se ve nada".

       Se apaga cambiando el COLOR al de texto normal, que es lo que
       corresponde: dejo de pedir algo, no lo digo mas flojito. */
    color: var(--tinta); opacity: .8; font-weight: 400;
}
.pide-quien.flojo em { font-style: normal; }

/* Alta de etiqueta desde la fila del Gantt: mismo alto que los botones de
   gesto para que la fila no cambie de altura al abrirse. */
.mas-g.nuevo { font-weight: 700; padding: 2px 7px; }
.mas-g.alta { border-color: var(--acento); color: var(--acento); font-weight: 700; }
.mas-nuevo {
    font-size: 10.5px; padding: 2px 6px; border-radius: 3px; width: 130px;
    border: 1px solid var(--linea); background: var(--panel); color: var(--tinta);
}
.mas-mal { font-size: 10.5px; color: var(--mal-solido); }

/* El check para apagar los recuadros sobre el video. Va pegado al titulo del
   registro, que es donde se los está viendo cuando molestan. */
.ubi-ver {
    display: inline-flex; align-items: center; gap: 4px;
    font-size: 10.5px; cursor: pointer; user-select: none; margin-left: 8px;
    /* Color FIJO, no var(--tinta): el bloque .ubicaciones tiene
       background:#f7f5fd fijo en los dos temas, y todos sus hijos usan colores
       fijos oscuros. Con var(--tinta) en tema oscuro esto quedaba casi blanco
       sobre casi blanco -- contraste 1,08, medido. Es el mismo #4a3a80 de
       .ubi-tit, que da 8,8 en los dos temas. */
    color: #4a3a80;
}
.ubi-ver:hover { color: #2f2456; }
.ubi-ver input { margin: 0; cursor: pointer; }


/* --- aviso de cajas sugeridas (pantalla de marcar personas) ---
   Las cajas que propone un detector tienen que verse como propuestas y no como
   trabajo ya hecho: si parecen revisadas se guardan sin mirar, y el dataset
   termina con lo que el detector cree -- que es exactamente lo que se queria
   corregir. Los cuadros sembrados son agaches, el caso donde mas se equivoca. */
.aviso-sugeridas {
    display: inline-block;
    font-size: 12px; line-height: 1.35;
    padding: 4px 9px; margin-right: 8px;
    border: 1px solid var(--linea-fuerte);
    border-left: 3px solid var(--mal-solido);
    border-radius: 4px;
    background: var(--chip-fondo);
    color: var(--tinta);
}

/* ── Mapa de calor de los gestos ────────────────────────────────────────────
   Un solo tono, claro a oscuro, escalado con color-mix sobre var(--panel): asi
   la rampa queda monotona en los dos temas sin escribir dos juegos de hex.

   El tono es naranja y no azul a proposito: azul es var(--acento), que ya
   significa "esto esta elegido". Un boton muy usado y un boton seleccionado
   tienen que poder distinguirse.

   El nivel 0 -- sin usar todavia -- va SIN tinte. Un gesto que nadie uso no es
   poco caliente, es otra cosa. */
.gesto.calor-1, .mas-g.calor-1 { background: color-mix(in srgb, #eb6834 12%, var(--panel)); }
.gesto.calor-2, .mas-g.calor-2 { background: color-mix(in srgb, #eb6834 26%, var(--panel)); }
.gesto.calor-3, .mas-g.calor-3 { background: color-mix(in srgb, #eb6834 42%, var(--panel)); }
.gesto.calor-4, .mas-g.calor-4 { background: color-mix(in srgb, #eb6834 60%, var(--panel)); }
.gesto.calor-1, .gesto.calor-2, .gesto.calor-3, .gesto.calor-4,
.mas-g.calor-1, .mas-g.calor-2, .mas-g.calor-3, .mas-g.calor-4 {
    border-color: color-mix(in srgb, #eb6834 55%, var(--linea));
    /* La tinta del tema, no la del boton. Con el color de .gesto fijo, el
       contraste del rotulo se derrumbaba al subir el calor: 6,19 -> 3,08 en
       claro y 7,33 -> 2,76 en oscuro, medido. Como el tinte se mezcla con
       var(--panel), la rampa sigue al tema, y entonces var(--tinta) es la que
       contrasta en los dos: queda 8,5 y 5,0 en el escalon mas fuerte. */
    color: var(--tinta);
}
/* El tramo abierto gana siempre: es un estado, no una medida. Va despues para
   que le gane por orden a cualquier nivel de calor. */
.gesto.grabando, .mas-g.grabando {
    background: var(--mal-solido); border-color: var(--mal-solido); color: #fff;
}
/* La cuenta, en tinta y no en el color del tinte. */
.calor-n {
    margin-left: 5px; font-size: .82em; font-variant-numeric: tabular-nums;
    /* SIN opacity. Con .75 la cuenta quedaba entre 2,16 y 4,7 -- abajo del
       minimo en los nueve casos medidos. Tercera vez hoy que apagar con
       opacidad termina en texto ilegible: se apaga con color, no con alfa. */
}
.calor-n:empty { display: none; }

/* Los motivos del evento en Acciones. Van arriba de la fila de gestos y
   separados, porque son otra cosa: etiquetas fijas del aviso entero, no tramos
   en el tiempo. */
.motivos-evento {
    display: flex; flex-wrap: wrap; align-items: center; gap: 6px;
    margin: 6px 0 2px;
}
.motivos-evento .motivos { width: 100%; }
