/* =====================================================================
   TABLERO DE GESTIÓN DE PROYECTOS · Ops Console · RODECA Labs
   ─────────────────────────────────────────────────────────────────────
   Solicitud de Edna (2026-10-11). El ACOMODO es el de su referencia tipo
   SaaS (saludo + rango · cuatro indicadores · fila de tres · fila de dos ·
   Kanban); la IDENTIDAD es la de RODECA, no la de la referencia. Decisión
   de Edna, ya tomada — aquí no se vuelve a discutir, se aplica.

   ENCAPSULAMIENTO — la regla dura de este archivo
   Todo selector cuelga de #view-tablero y toda clase que yo introduzco
   empieza con "tab-". Lo segundo no es redundante: cal.css necesitó un
   bloque entero de "blindaje" porque la maqueta del calendario traía
   nombres genéricos (.btn, .panel, .av, .sub) que app.css ya declara a
   nivel raíz, y prefijar el selector NO alcanza — gana la propiedad más
   específica, propiedad por propiedad, no la regla entera. Escribiendo
   desde cero con prefijo propio ese problema no puede existir, así que
   este archivo no tiene blindaje y no lo necesita.
   Lo único que se usa de app.css es su propio sistema, como fue diseñado:
   .view, .view-head, .eyebrow, .mono, .sr, h1/h2 y sus tokens de espaciado
   y de radio (--s1 a --s8, --r1, --r2).
   [No escribas aquí la forma abreviada de esos dos nombres con un asterisco
   seguido de diagonal: esa pareja de caracteres CIERRA el comentario, y toda
   la prosa que sigue se lee como CSS. Pasó en la primera versión de este
   archivo y lo cazó scripts/check-tab-sintaxis.mjs contando aperturas contra
   cierres de comentario.]

   PALETA — las reglas de la dirección de diseño del CMO
   (company/.../direccion-diseno-calendario.md, secciones 1 y 5):
     · Real = "aquí estás / esto está activo". Rango seleccionado, columna
       de Kanban activa, cabeceras de las columnas. Estructura y selección.
     · Naranja = "haz esto ahora", poco y a propósito. En TODA esta pantalla
       hay exactamente DOS usos: el único botón de compromiso (crear
       proyecto, .tab-btn.tab-pri) y los avisos de pendiente (el indicador
       de tareas pendientes y la marca de prioridad "urgente"). No hay un
       tercer uso — en particular NO pinta barras de progreso, que es el
       ejemplo que la dirección prohíbe por su nombre.
     · Celeste nunca es superficie ni color principal de identidad: aquí
       sólo es etiqueta Mono sobre fondo oscuro.
     · Sin sombras suaves y sin esquinas muy redondeadas. Radios: 10px para
       cajas (el mismo --r:10px de cal.css) y 999px de pastilla. Espaciados:
       los --s1..--s8 que ya existen en app.css. No hay escala nueva.

   GRÁFICAS — los cuatro colores de dato
   Se dibujan a mano en SVG (la Console sirve script-src 'self': no hay
   librería que cargar, y una dona y unas barras apiladas son geometría
   simple). Ningún color literal vive en el marcado de la gráfica: los
   cuatro estados pasan por token y se voltean abajo, igual que cal.css
   hace con sus tintes. La dona NO es la única portadora del dato: la
   leyenda lleva el número y el porcentaje, y la gráfica de actividad
   lleva además una tabla equivalente oculta (.sr) con las tres series
   por día.
   Los valores de los cuatro estados cambiaron el 2026-10-12 — ver el
   bloque largo "LOS CUATRO ESTADOS" junto a los tokens, más abajo.
   ===================================================================== */
#view-tablero{
  /* marca */
  --tab-tinta:var(--depths); --tab-real:var(--royal); --tab-celeste:var(--aster);
  --tab-naranja:var(--habanero); --tab-papel:var(--luster); --tab-arena:var(--tan);
  /* semánticos de la Console: escritos contra el token semántico y no
     contra el de marca, para heredar el modo oscuro en un solo lugar */
  --tab-tx:var(--text-1); --tab-tx2:var(--text-3); --tab-fondo:var(--bg);
  --tab-sup:var(--surface); --tab-sup2:var(--surface2); --tab-borde:var(--border);
  --tab-r:10px;
  /* El radio de los botones DEL TABLERO. Edna, 2026-10-12: "los botoncitos
     están bien el de administrar. pero lo quisiera más redondeado". Es UN
     valor, no cinco: todo lo que se pica en esta pantalla usa este token y
     nada más. Las cajas y los paneles se quedan en --tab-r (10px) — la
     dirección de diseño pide "sin esquinas muy redondeadas" para las
     superficies, y esto es una excepción acotada a los controles, pedida por
     Edna y que NO sale de #view-tablero: el resto de la Console no se toca. */
  --tab-br:14px;
  /* El alto del botón «Ver más» de una columna. Es un token y no un número
     suelto porque la banda azul del encabezado se dimensiona con él: las
     cuatro columnas miden lo mismo lleven botón o no, y si este valor cambia,
     la banda lo sigue sola. */
  --tab-mas-h:24px;

  /* ═══════════════ LOS CUATRO ESTADOS DE TAREA ═══════════════
     SÓLO LA PALETA DE MARCA · decisión de Edna del 2026-10-13, que REVIERTE
     la excepción de tonos derivados del 2026-10-12.

     Edna, 2026-10-13: "tomando únicamente la paleta de colores de RODECA" ·
     "la paleta que usaste de colores complementarios no me agrada en lo
     absoluto porque están muy opacos".
     Los cuatro tonos derivados de la vuelta anterior (#E9BE23 ámbar,
     #189F84 teal, #2154DC azul y #591278 violeta) quedan FUERA. No se
     sustituyen por otros derivados: se vuelve a los seis colores de la tabla
     de marca y a nada más — Marino #111144, Real #223382, Celeste #9BACD8,
     Naranja #F98513, Marfil #F4F1EC, Arena #DAD1C8 — que es lo que la
     dirección de diseño del CMO pide desde el principio ("no se usa ningún
     color fuera de esta tabla, ni tonos derivados").

     EL REPARTO Y POR QUÉ
       · hecho       → Real.    Es lo cerrado: el más pesado contra el papel.
       · en curso    → Naranja. Es el único acento vivo de la marca y "en
                                curso" es donde está la acción.
       · por validar → Celeste. Está en espera de alguien.
       · pendiente   → Arena.   Todavía no empieza: el más liviano.

     LO QUE SE PIERDE, DICHO CON NÚMEROS Y NO ESCONDIDO
     La marca no tiene cuatro colores separables en escala de grises. Medido:
       CLARO · luminancia · texto encima · contra el blanco
         pendiente   #DAD1C8  0.6468  Marino  11.74:1   1.51:1
         por validar #9BACD8  0.4143  Marino   7.82:1   2.26:1
         en curso    #F98513  0.3696  Marino   7.07:1   2.50:1
         hecho       #223382  0.0432  blanco  11.27:1  11.27:1
       Pares en gris: pend/valida 1.501 · pend/curso 1.660 · pend/hecho 7.476
                      valida/curso 1.107 · valida/hecho 4.982 · curso/hecho 4.503
       EL PAR MÁS PARECIDO: en curso / por validar, 1.107:1.
     Eso está POR DEBAJO del 1.80:1 que exigía el juego derivado, y por debajo
     incluso de la pareja Marino/Real (1.570:1) que Edna rechazó en la vuelta
     pasada. No hay forma de evitarlo dentro de la marca: los seis colores dan
     dos azules oscuros casi iguales (Marino 0.0094 y Real 0.0432, 1.570:1
     entre sí), un celeste y un naranja casi iguales en luz (1.107:1), y dos
     neutros claros. Cualquier juego de cuatro cae debajo de 1.60:1 en algún
     par. Se buscó: con Marino dentro, el par Marino/Real reaparece; sin
     Arena, hay que meter Marino. No existe el juego que cumpla las dos cosas.

     ASÍ QUE LA DIFERENCIA LA CARGA LA FORMA, NO SÓLO EL COLOR
     Edna, 2026-10-13, ya rechazó dos veces una paleta optimizada por
     contraste y prefiere la de marca. El criterio manda sobre el número — y
     lo que compensa el número es la FORMA de la marca de color, que se ve
     igual en gris, en blanco y negro y sin distinguir colores:
       · hecho       → RELLENO SÓLIDO
       · en curso    → RELLENO SÓLIDO
       · por validar → RAYADO (franjas a 45°)
       · pendiente   → RAYADO (franjas a −45°, y más separadas)
     Los dos estados resueltos o activos van sólidos y están a 4.503:1 entre
     sí, que es de sobra. Los dos estados en espera van rayados y se separan
     entre ellos por 1.501:1 MÁS la dirección de la raya. Y el par flojo de
     verdad —en curso 1.107:1 por validar— queda separado por sólido contra
     rayado, que es la diferencia de forma más fuerte de las cuatro.
     Nota de visión del color: Celeste contra Naranja es, además, el único par
     de la marca que SIGUE distinguiéndose con deficiencia rojo-verde (es el
     eje azul–amarillo, el que esa deficiencia conserva). El par que de verdad
     se perdería sin forma es pendiente/por validar, y por eso los dos llevan
     raya en dirección distinta.
     Las franjas van en Marino (claro) y en Marino también en oscuro: las dos
     marcas rayadas son claras en los dos temas, así que la tinta oscura
     encima se ve siempre. Marino es de la marca; no entra un color nuevo.

     DÓNDE SE APLICA LA FORMA: en la leyenda de la dona, en los arcos de la
     dona, en las barras de la gráfica de actividad y en los chips de estado —
     o sea, en todos los lugares donde el color de estado pinta ÁREA. Lo
     verifica scripts/check-tab-colores.mjs, que además exige que los cuatro
     valores sean de la tabla de marca y nada más.

     Y EL NARANJA NO PUEDE COMPETIR CON EL BOTÓN DE COMPROMISO. Ahora Naranja
     es además un estado de tarea, así que se acota: como estado sólo pinta
     MARCAS DE DATO (arco, barra, muestra de leyenda, punto de 8px) — nunca
     una superficie de control, nunca un botón, nunca un borde de panel. El
     único control naranja de la pantalla sigue siendo .tab-btn.tab-pri.

     El `-tx` de cada uno es lo que devuelve sobre() para ese color, y existe
     porque un chip de estado lleva texto ENCIMA del color: el JS no puede
     calcularlo (el color vive en CSS, no en el marcado) y escribirlo a ojo
     era la forma de que dejara de cuadrar. check-tab-colores.mjs compara cada
     `-tx` contra sobre() del color de al lado. */
  --tab-g-pend:#DAD1C8;    --tab-g-pend-tx:#111144;
  --tab-g-hecho:#223382;   --tab-g-hecho-tx:#FFFFFF;
  --tab-g-curso:#F98513;   --tab-g-curso-tx:#111144;
  --tab-g-valida:#9BACD8;  --tab-g-valida-tx:#111144;
  /* La tinta de las franjas de las dos marcas rayadas. Marino en los dos
     temas: las dos marcas rayadas (Arena y Celeste) son claras siempre. */
  --tab-raya:#111144;

  /* ═══════════════ LA CADENA COMERCIAL · fases del pipeline ═══════════════
     Edna, 2026-10-13, con su cadena en la mano: seis fases de la 0 a la 5 y
     una línea entre la 2 y la 3 que dice "aquí se paga todo".

     NO SON SEIS COLORES, Y NO ES UNA OMISIÓN. Dentro de la tabla de marca no
     existen seis tonos separables — ya está medido arriba: ni siquiera hay
     CUATRO que lleguen a 1.80:1, el techo de la marca es 1.570:1. Con seis es
     peor. Y Naranja tiene exactamente dos usos en esta pantalla (el botón de
     compromiso y las marcas de pendiente) y no puede tener un tercero, por
     mucho que la imagen de Edna pinte la fase 3 de naranja.
     Lo que distingue a una fase es su POSICIÓN en la cadena y su RÓTULO: la
     barra va en orden de la 0 a la 5, cada segmento lleva su número adentro
     cuando cabe, y la leyenda de abajo lleva el nombre completo, el número de
     tareas y el cobro de cada una.

     EL COLOR CARGA UNA SOLA DISTINCIÓN: LA QUE VALE DINERO.
       · antes de la línea (todavía no se cobra) → la marca LIVIANA, que es el
         mismo Arena que ya es "pendiente": lo que aún no pesa;
       · después de la línea (ya cobrado) → la marca PESADA, que es el mismo
         Real que ya es "hecho" y que en oscuro se voltea a Marfil por la
         misma razón que él (Real contra #111328 queda a 1.62:1 y desaparece).
     Se escriben como ALIAS de los tokens de estado y no como una copia de sus
     valores: así el volteo de tema ya está resuelto en un solo lugar y no hay
     dos listas de hexadecimales que se puedan desincronizar. Ningún color
     entra a la hoja que no estuviera ya.

     Y LAS FASES VECINAS SE SEPARAN POR FORMA, no por tono: alternan sólido y
     rayado con los mismos <pattern> de index.html, más un filo de 2 unidades
     entre segmentos que calcula barraFases() en tablero.js. Es el mismo
     recurso con el que la dona separa sus dos estados en espera. */
  --tab-fase-gra:var(--tab-g-pend);    --tab-fase-gra-tx:var(--tab-g-pend-tx);
  --tab-fase-pag:var(--tab-g-hecho);   --tab-fase-pag-tx:var(--tab-g-hecho-tx);
  /* tintes, pistas y rejillas */
  --tab-t-real:rgba(34,51,130,.05);
  --tab-t-hover:rgba(34,51,130,.08);
  --tab-t-naranja:rgba(249,133,19,.1);
  --tab-pista:rgba(34,51,130,.1);      /* la pista de una barra de progreso */
  --tab-rejilla:rgba(34,51,130,.12);   /* las líneas de eje de una gráfica */
  --tab-drop:rgba(34,51,130,.07);      /* la columna que va a recibir la tarjeta */
  --tab-esq:rgba(34,51,130,.07);       /* el gris de un esqueleto de carga */
  --tab-velo:rgba(17,17,68,.45);       /* el fondo de un diálogo */
  /* EL RECORRIDO GUIADO (2026-10-15). Su velo es MÁS OSCURO que el de un
     diálogo (.45) a propósito: un diálogo sólo tiene que apagar el fondo, y
     un recorrido tiene que hacer que el HUECO se lea como iluminado. Es el
     mismo .55 del recorrido de la Console (tour.css), y es el número correcto
     por una razón que se puede medir: Marino al 55% sobre Marfil deja el velo
     en 4.0:1 contra el hueco, y al 45% se queda en 3.2:1 — ahí el hueco deja
     de verse recortado y parece un reflejo.
     El filo es el borde del hueco. En claro casi no se nota y da igual; en
     OSCURO es lo único que lo separa del velo, porque negro al 66% sobre una
     superficie oscura casi no cambia el tono. */
  --tab-rec-velo:rgba(17,17,68,.55);
  --tab-rec-filo:rgba(17,17,68,.2);
  --tab-sobre-real:var(--luster);      /* texto marfil sobre Real */
  --tab-rojo:var(--err-c);
  --tab-verde:var(--ok-c);
}

#view-tablero *,
#view-tablero *::before,
#view-tablero *::after{box-sizing:border-box}
#view-tablero :focus-visible{outline:2px solid var(--tab-naranja);outline-offset:2px}

/* ───────── saludo y selector de rango ─────────
   El rango manda sobre los cuatro indicadores y sobre nada más: el avance de
   un proyecto es de todo el proyecto, la dona y el Kanban son la población
   completa y la actividad son siempre los últimos 7 días. Eso se resuelve con
   rótulos honestos —la nota de aquí y el subtítulo de cada panel— y no
   agregando filtros que el dato no tiene. */
/* El rótulo del rango nombra las tarjetas sobre las que manda, así que es una
   frase y no una fecha suelta: la cabecera envuelve y el rótulo puede ocupar
   dos renglones en el teléfono en vez de desbordarse o cortar el nombre de
   una tarjeta a media palabra. */
#view-tablero .tab-kpis-h{display:flex;flex-wrap:wrap;align-items:center;
  justify-content:space-between;gap:var(--s2) var(--s3);margin-bottom:var(--s2)}
#view-tablero .tab-kpis-h .tab-panel-sub{min-width:0;flex:1 1 auto}
/* "Agregar proyecto" vive AQUÍ y no en el panel de progreso. Edna, 2026-10-12:
   "lo que está en administrar, me gustaría más que esté fuera de esa celda,
   en la parte de arriba. Arriba de donde va a quedar el número de todas las
   tareas que sea agregar proyecto. Con todo lo que tiene la vista de
   administrar."
   Va al final de esta cabecera, que es justo encima de la cuarta tarjeta
   («Total de tareas») cuando los cuatro indicadores están en fila. Abre el
   MISMO diálogo que abría «Administrar» —crear, renombrar, color,
   responsable, archivar, reactivar y clasificar—: no se construyó una vista
   nueva, se movió el botón. */
#view-tablero .tab-kpis-h .tab-btn{flex:0 0 auto;margin-left:auto}
#view-tablero .tab-sub-izq{display:block;text-align:left;margin-top:2px}

/* EL SALUDO, con la foto del Calendario (Edna, 2026-10-13).
   Es lo primero que se ve y hasta ahora era una línea de 15px perdida entre
   la cabecera y las tarjetas. Ahora es un bloque de identidad con jerarquía
   de verdad: foto de 56px, el nombre a 28px/700 —la escala h1 de pantalla
   ancha de app.css, no una escala inventada— y la frase de contexto a 13px
   en el gris secundario. Tres pesos distintos, que es lo que faltaba.
   El círculo mide lo mismo haya foto o no: con iniciales se ve igual de
   terminado, que es el caso normal hoy. */
#view-tablero .tab-saludo{display:flex;align-items:center;gap:var(--s4);
  margin:0 0 var(--s6);color:var(--tab-tx2)}
#view-tablero .tab-saludo .tab-av{width:56px;height:56px;font-size:19px;letter-spacing:.02em}
#view-tablero .tab-saludo-t{display:flex;flex-direction:column;gap:3px;min-width:0}
#view-tablero .tab-saludo b{font-size:28px;font-weight:700;letter-spacing:-.02em;
  line-height:1.15;color:var(--tab-tx)}
#view-tablero .tab-saludo .tab-saludo-r{font-size:13px;color:var(--tab-tx2)}

/* ───────── avisos ─────────
   Un fallo se dice; no se queda en silencio y no se queda en la consola del
   navegador. Mismo gesto que cal.css: franja con borde izquierdo de color y
   el mensaje que manda el servidor, tal cual. */
#view-tablero .tab-aviso{margin:0 0 var(--s4);padding:var(--s3);background:var(--err-bg);
  color:var(--tab-rojo);border-left:3px solid var(--tab-rojo);border-radius:0 var(--r2) var(--r2) 0;
  font-size:13px;line-height:1.5}
#view-tablero .tab-aviso.tab-ok{background:var(--ok-bg);color:var(--tab-verde);border-left-color:var(--tab-verde)}

/* ───────── botones ─────────
   .tab-pri es el ÚNICO naranja de botón en toda la pantalla: el botón de
   compromiso (crear un proyecto). Si algún día hace falta otro, primero se
   quita éste — la dirección de diseño pide uno por pantalla, no dos. */
#view-tablero .tab-btn{display:inline-flex;align-items:center;gap:var(--s2);height:34px;
  padding:0 var(--s4);background:var(--tab-sup);color:var(--tab-tx);border:1px solid var(--tab-borde);
  border-radius:var(--tab-br);font-size:13px;font-weight:500;cursor:pointer;white-space:nowrap;
  transition:background-color 150ms ease,border-color 150ms ease}
@media(hover:hover){#view-tablero .tab-btn:hover{background:var(--tab-t-real);border-color:var(--tab-real)}}
/* El chico lleva el MISMO radio y no uno proporcional: dos botones del mismo
   gesto a radios distintos es lo que hace que una pantalla se vea descuidada,
   y Edna pidió un radio, no una escala de radios. A 28px de alto, 14px de
   radio es media pastilla y se ve a propósito. */
#view-tablero .tab-btn.tab-sm{height:28px;padding:0 var(--s3);font-size:12px}
#view-tablero .tab-btn.tab-pri{background:var(--tab-naranja);border-color:var(--tab-naranja);color:var(--depths);font-weight:600}
@media(hover:hover){#view-tablero .tab-btn.tab-pri:hover{background:var(--tab-naranja);filter:brightness(1.06)}}
#view-tablero .tab-btn.tab-peligro{color:var(--tab-rojo);border-color:var(--tab-borde)}
@media(hover:hover){#view-tablero .tab-btn.tab-peligro:hover{background:var(--err-bg);border-color:var(--tab-rojo)}}
#view-tablero .tab-btn[disabled]{opacity:.5;cursor:not-allowed}
#view-tablero .tab-x{display:grid;place-items:center;width:30px;height:30px;border:0;background:none;
  color:var(--tab-tx2);border-radius:999px;cursor:pointer}
#view-tablero .tab-x svg{width:18px;height:18px}
@media(hover:hover){#view-tablero .tab-x:hover{background:var(--tab-t-real);color:var(--tab-tx)}}

/* ───────── campos ───────── */
#view-tablero .tab-campo{display:flex;flex-direction:column;gap:var(--s1);min-width:0}
#view-tablero .tab-campo > span{font-family:var(--mono);font-size:10px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--tab-tx2)}
#view-tablero .tab-campo input[type=text],
#view-tablero .tab-campo input[type=date],
#view-tablero .tab-campo select,
#view-tablero .tab-campo textarea{height:34px;padding:0 var(--s2);background:var(--tab-sup);
  color:var(--tab-tx);border:1px solid var(--tab-borde);border-radius:var(--r2);font-size:13px;
  font-family:var(--sans);width:100%}
#view-tablero .tab-campo textarea{height:auto;min-height:56px;padding:var(--s2);line-height:1.5;resize:vertical}
#view-tablero .tab-campo input[type=color]{height:34px;width:46px;padding:2px;background:var(--tab-sup);
  border:1px solid var(--tab-borde);border-radius:var(--r2);cursor:pointer}
#view-tablero .tab-campo input:focus,
#view-tablero .tab-campo select:focus,
#view-tablero .tab-campo textarea:focus{border-color:var(--tab-real);outline:0}
/* Cuántos caracteres quedan. Va DEBAJO del campo y no a su lado: al lado le
   robaría ancho al campo en el teléfono, donde la fila del editor ya se
   envuelve. Alto fijo para que aparecer no empuje nada —el contador se pinta
   en cuanto se cablea el editor, no sólo al escribir— y tabular-nums para que
   el número no baile al pasar de 80 a 79. */
#view-tablero .tab-cuenta{font-variant-numeric:tabular-nums;
  font-size:11px;color:var(--tab-tx2);line-height:14px;height:14px;
  text-align:right}
/* "Está por topar" se dice subiendo el contraste, NO con Naranja: la
   dirección de marca reserva Naranja para el botón de compromiso y para los
   avisos de pendiente, y un contador de caracteres no es ninguno de los dos
   (lo caza scripts/check-tab-css.mjs, que por eso existe). */
#view-tablero .tab-cuenta.tab-cuenta-cerca{color:var(--tab-tx)}

/* ───────── paneles ─────────
   Una sola caja repetida cinco veces lee como "sin diseño" (hallazgo 3 de la
   dirección de diseño). Lo que distingue aquí no es un borde ni una sombra:
   es la cabecera, que lleva el título en peso 600 y su etiqueta Mono al otro
   extremo, y el borde superior de color donde el dato tiene dueño. */
/* LA DENSIDAD, 2026-10-13. Edna: el acomodo ya es el de su referencia, lo
   que faltaba era que SE SINTIERA como ella — "tarjetas con aire, jerarquía
   clara, números grandes que se lean de lejos, y la densidad baja". Todo
   estaba a --s3/--s4, o sea 12 y 16px, y con la tipografía casi toda del
   mismo tamaño: uniforme y apretado. Los paneles suben a --s5 (20px) de
   relleno, la cabecera a --s4 de separación, y el título del panel pasa de
   14px a 17px/600, que es la escala h3 de app.css — no una nueva. */
#view-tablero .tab-panel{background:var(--tab-sup);border:1px solid var(--tab-borde);
  border-radius:var(--tab-r);padding:var(--s5);min-width:0;display:flex;flex-direction:column}
#view-tablero .tab-panel-h{display:flex;align-items:center;justify-content:space-between;
  gap:var(--s3);margin-bottom:var(--s4);min-height:28px}
#view-tablero .tab-panel-h h2{font-size:17px;font-weight:600;line-height:24px;letter-spacing:-.01em}
#view-tablero .tab-panel-sub{font-size:11.5px;line-height:1.45;color:var(--tab-tx2);text-align:right}
#view-tablero .tab-panel-b{flex:1;min-width:0}

/* ───────── los cuatro indicadores ───────── */
#view-tablero .tab-kpis{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:var(--s4);margin-bottom:var(--s4)}
#view-tablero .tab-kpi{background:var(--tab-sup);border:1px solid var(--tab-borde);
  border-radius:var(--tab-r);padding:var(--s5);min-width:0}
#view-tablero .tab-kpi .tab-kpi-e{font-family:var(--mono);font-size:10px;letter-spacing:.12em;
  text-transform:uppercase;color:var(--tab-tx2);display:block;margin-bottom:var(--s3)}
#view-tablero .tab-kpi .tab-kpi-v{font-variant-numeric:tabular-nums;
  font-size:38px;font-weight:700;letter-spacing:-.025em;line-height:1.05;color:var(--tab-tx);display:block}
#view-tablero .tab-kpi .tab-kpi-d{font-size:12px;display:inline-block;
  margin-top:var(--s2);color:var(--tab-tx2)}
#view-tablero .tab-kpi .tab-kpi-d.tab-sube{color:var(--tab-verde)}
#view-tablero .tab-kpi .tab-kpi-d.tab-baja{color:var(--tab-rojo)}
/* delta_pct = null significa "sin comparación", NO cero; nunca "↑0%". Y se
   dice con palabras QUE SE VEN: antes era un guion con el texto metido en un
   <span class="sr"> de 1×1 px, así que con "Mes anterior" o "Este año" eran
   tres de cuatro tarjetas enseñando un guion pelón (F4 de QA).
   El acomodo de la tarjeta no se rompe porque la línea del delta ya era un
   inline-block en su propio renglón; lo único que se cuida es que "sin
   comparación" no se parta en dos y no se lea como un dato (es Mono chico,
   gris, sin flecha y sin número). */
#view-tablero .tab-kpi .tab-kpi-d.tab-nada{color:var(--tab-tx2)}
#view-tablero .tab-kpi .tab-kpi-d.tab-kpi-sc,
#view-tablero .tab-kpi .tab-kpi-d.tab-kpi-nr{font-size:11px;
  white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}
/* El rótulo propio de un indicador que no depende del rango. Es más largo que
   un delta, así que éste sí se envuelve en dos renglones en vez de cortarse:
   el dato que lleva es la FRASE, no un número. */
#view-tablero .tab-kpi .tab-kpi-d.tab-kpi-nr{white-space:normal;line-height:1.4;
  text-overflow:clip;text-wrap:balance}
/* El indicador de pendientes es uno de los dos únicos naranjas de la
   pantalla: es un pendiente real, que es exactamente lo que la dirección de
   diseño autoriza para Naranja. */
#view-tablero .tab-kpi.tab-kpi-pend{border-left:3px solid var(--tab-naranja)}

/* ───────── fila de tres y fila de dos ───────── */
#view-tablero .tab-f3,
#view-tablero .tab-f2{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--s4);margin-bottom:var(--s4)}

/* ───────── progreso de proyectos ─────────
   Edna, 2026-10-12: "esto para que se haga más chiquita proceso de
   proyectos", "solo se pueden ver cuatro proyectos y los demás en un botón
   de ver más", y "son proyectos internos, no son proyectos que nos estén
   generando dinero, entonces los vamos a mover a una sección de proyectos
   internos. Puede ser ahí mismo. Pero dividir la celda y que diga proyectos
   internos."
   De dónde sale lo "más chiquito", que no es apretar la tipografía:
     · el tope de cuatro por bloque (lo pone tablero.js, TOPE_PROY);
     · la barra de avance DESAPARECE del proyecto que no tiene cronograma, que
       hoy son casi todos — y eso no es una decisión de espacio, es la de
       honestidad del punto 11 (ver pintarProyectos en tablero.js);
     · las filas pasan de --s3 a --s2 de separación.
   Dos bloques en la MISMA celda, divididos por una línea, con su rótulo cada
   uno. No son dos paneles: Edna pidió dividir la celda, no partirla en dos. */
#view-tablero .tab-proy{display:flex;flex-direction:column;gap:var(--s4)}
#view-tablero .tab-proy-g{display:flex;flex-direction:column;gap:var(--s3);min-width:0}
/* El bloque de internos se separa del de clientes con una línea y su rótulo.
   La línea es sólida y la de "Sin proyecto" es rayada, a propósito: ésta
   divide dos grupos de proyectos de verdad, aquélla separa lo que NO es un
   proyecto. */
#view-tablero .tab-proy-g + .tab-proy-g{margin-top:var(--s1);padding-top:var(--s3);
  border-top:1px solid var(--tab-borde)}
#view-tablero .tab-proy-gh{display:flex;align-items:baseline;justify-content:space-between;
  gap:var(--s2);font-family:var(--mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;
  color:var(--tab-tx2)}
#view-tablero .tab-proy-gh b{font-variant-numeric:tabular-nums;font-weight:600;color:var(--tab-tx2)}

/* Una fila de proyecto ES un botón: Edna pidió que cada proyecto se pueda
   picar para ver su detalle, y eso tiene que ser un control de verdad —
   alcanzable con Tab, disparable con Enter y con Espacio— y no un div con un
   click. Se le quitan los adornos de botón y se le deja el acomodo en
   rejilla, que es el que ya tenía. */
#view-tablero .tab-proy-f{display:grid;grid-template-columns:1fr auto;gap:var(--s1) var(--s3);
  align-items:baseline;min-width:0;width:100%;text-align:left;background:none;border:0;
  padding:var(--s2);margin:0 calc(-1 * var(--s2));font:inherit;color:inherit;
  border-radius:var(--tab-br);transition:background-color 120ms ease}
#view-tablero button.tab-proy-f{cursor:pointer}
@media(hover:hover){#view-tablero button.tab-proy-f:hover{background:var(--tab-t-real)}}
/* La flecha dice que la fila lleva a otro lado. Aparece en el hover y en el
   foco, no siempre: ocho flechas fijas en una columna angosta son ruido. */
#view-tablero .tab-proy-ir{font-size:14px;line-height:1;color:var(--tab-real);margin-left:var(--s2);
  opacity:0;transition:opacity 120ms ease}
@media(hover:hover){#view-tablero button.tab-proy-f:hover .tab-proy-ir{opacity:1}}
#view-tablero button.tab-proy-f:focus-visible .tab-proy-ir{opacity:1}
#view-tablero .tab-proy-n{font-size:14px;font-weight:600;color:var(--tab-tx);min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:var(--s2)}
#view-tablero .tab-proy-pt{width:9px;height:9px;border-radius:999px;flex-shrink:0}
#view-tablero .tab-proy-c{font-variant-numeric:tabular-nums;font-size:12px;font-weight:500;
  color:var(--tab-tx2);white-space:nowrap;display:block;text-align:right}
/* "sin iniciar" y "sin cronograma" NO son porcentajes y no se pueden ver como
   uno: van en Mono gris, en minúscula, sin número al lado. */
#view-tablero .tab-proy-c .tab-proy-nada{font-weight:400;color:var(--tab-tx2);opacity:.9}

/* "Ver más" / "Ver menos" de cada bloque. Dice CUÁNTOS faltan, no "ver más"
   a secas: el número es el dato que hace decidir si vale la pena abrirlo. */
/* El «ver más» del panel de proyectos, cuando va en la CABECERA y no al pie
   de un bloque: mismo control, alineado con el título. Edna pidió "solo el
   botón" en este panel — nada de la banda Real que llevan las columnas del
   flujo de tareas. */
#view-tablero .tab-proy-mas.tab-proy-mas-h{align-self:center;margin-left:auto;height:28px}
#view-tablero .tab-panel-h .tab-proy-mas-h{flex:0 0 auto}
#view-tablero .tab-proy-mas{align-self:flex-start;height:26px;padding:0 var(--s3);
  background:none;border:1px dashed var(--tab-borde);border-radius:var(--tab-br);
  font-size:12px;font-weight:500;color:var(--tab-tx2);cursor:pointer;
  transition:border-color 120ms ease,color 120ms ease}
@media(hover:hover){#view-tablero .tab-proy-mas:hover{border-color:var(--tab-real);color:var(--tab-tx)}}

/* El cronograma, cuando el proyecto lo tiene cargado. DOS números y el
   desfase: "comprometido 45% · real 31% · 2 semanas atrás". La barra lleva el
   avance REAL de relleno y una muesca donde va el comprometido, así que el
   atraso se ve además de leerse. */
/* DOS MAGNITUDES, UNA PISTA. La pista sube de 6 a 14px porque ahora lleva
   dos barras encajadas, no una: el comprometido a todo lo alto y el real
   encima, más delgado y centrado. Es la forma estándar de comparar "dónde
   deberíamos ir" contra "dónde vamos" sin poner dos renglones.
   Las dos van en el color del proyecto —que es DATO, lo manda el API y Edna
   lo puede cambiar— y lo que las distingue es el peso: el plan atenuado, el
   hecho a color pleno. Mismo color, dos pesos: no se inventa un segundo
   código de color encima del que ya existe.
   Naranja no entra aquí: la dirección de diseño lo prohíbe por su nombre en
   barras de progreso. */
#view-tablero .tab-proy-cr{grid-column:1 / -1;position:relative;height:14px;
  background:var(--tab-pista);border-radius:999px;overflow:hidden;margin-top:3px}
/* el comprometido — el plan */
#view-tablero .tab-proy-cr b{position:absolute;left:0;top:0;bottom:0;
  border-radius:999px;opacity:.3}
/* el real — lo hecho */
#view-tablero .tab-proy-cr i{position:absolute;left:0;top:4px;bottom:4px;
  display:block;border-radius:999px}
/* el filo exacto del plan */
#view-tablero .tab-proy-cr u{position:absolute;top:0;bottom:0;width:2px;margin-left:-1px;
  background:var(--tab-tx);border-radius:1px;text-decoration:none;opacity:.55}
#view-tablero .tab-proy-f.tab-atrasado .tab-proy-cr u{background:var(--warn-c);opacity:1}
/* LAS DOS MARCAS JUNTO A LOS NÚMEROS. Sin ellas la barra de arriba es un
   dibujo bonito que nadie sabe leer: la marca atenuada va pegada a
   "Comprometido" y la plena a "real", con el mismo peso que tienen en la
   barra. Es la leyenda, puesta donde se necesita, sin un renglón aparte. */
#view-tablero .tab-mk{display:inline-block;width:9px;height:9px;border-radius:2px;
  margin-right:5px;vertical-align:-1px;flex-shrink:0}
#view-tablero .tab-mk-plan{opacity:.3}
#view-tablero .tab-proy-c .tab-proy-sm,
#view-tablero .tab-proy-c .tab-proy-ds{margin-left:var(--s1)}
#view-tablero .tab-proy-ds{font-size:11.5px;font-weight:600;white-space:nowrap}
#view-tablero .tab-proy-f.tab-atrasado .tab-proy-ds{color:var(--warn-c)}
#view-tablero .tab-proy-f.tab-al-dia .tab-proy-ds{color:var(--tab-verde)}
/* LA COBERTURA, donde iría el desfase cuando el avance no está medido.
   Mismo tamaño y mismo sitio que .tab-proy-ds, pero NUNCA verde ni rojo: es
   un dato de cuánto respaldo tiene el número de al lado, no un juicio de si
   el proyecto va bien. Por eso es su propia clase y no un modificador de
   .tab-proy-ds — un día alguien le pondría color a aquélla y se lo heredaría
   a ésta. */
#view-tablero .tab-proy-sm{font-size:11.5px;font-weight:400;white-space:nowrap;color:var(--tab-tx2)}
/* La frase corta que explica el "real 0%". Va en renglón propio debajo de la
   barra, en minúscula y en el gris secundario: tiene que leerse, no competir
   con el nombre del proyecto. El párrafo largo vive en el detalle. */
#view-tablero .tab-proy-nm{grid-column:1 / -1;font-size:11px;line-height:1.35;
  color:var(--tab-tx2)}
/* SIN MEDIR: LA BARRA SE PINTA IGUAL. Antes esta regla la atenuaba al 55%
   y el resultado era justo lo que Edna reclamó el 2026-10-13 — "los
   proyectos que ya están avanzados como PH y PM están sin líneas de color
   de medición": Perritos House tiene cobertura 58% y por eso `medido` llega
   en false, así que su fila salía desteñida y parecía vacía.
   La honestidad se conserva donde de verdad vive —sin desfase, sin "al día",
   sin verde ni rojo, y con la frase que explica el "real %" debajo— pero el
   dato se pinta a toda voz: el comprometido y el real se dibujan igual que
   en un proyecto medido. Lo único que esta clase sigue haciendo es quitarle
   peso a la muesca, porque el filo del plan no es un juicio. */
#view-tablero .tab-proy-f.tab-sin-medir .tab-proy-cr u{background:var(--tab-tx2);opacity:.45}
/* La pista y el relleno. El relleno va en el color del proyecto, que es DATO
   (lo manda el API y Edna lo puede cambiar); la pista es un velo de Real.
   Naranja no entra aquí: la dirección de diseño prohíbe por su nombre usarlo
   en barras de progreso. */
#view-tablero .tab-proy-p{grid-column:1 / -1;height:6px;background:var(--tab-pista);
  border-radius:999px;overflow:hidden}
#view-tablero .tab-proy-p i{display:block;height:100%;border-radius:999px}
#view-tablero .tab-proy-m{grid-column:1 / -1;display:flex;gap:var(--s2);flex-wrap:wrap;
  align-items:center;font-size:11px;color:var(--tab-tx2)}
/* EN QUÉ FASE DE LA CADENA VA ESTE PROYECTO (Edna, 2026-10-13).
   Va en una pastilla propia y no mezclada con el responsable y el estado,
   porque los dos casos tienen que verse DISTINTOS:
     · con fase  → pastilla llena, es un dato;
     · sin fase  → pastilla hueca y punteada, es una DECISIÓN QUE FALTA.
   Hoy los ocho proyectos activos están sin fase —nadie se las ha puesto, y
   eso es correcto—, así que la segunda es la que Edna va a ver ocho veces al
   abrir: el punteado es el gesto de "pendiente de decidir" que esta pantalla
   ya usa para el estado «pendiente», no el de "algo se rompió" (que aquí es
   .tab-falla, en rojo, y no se parece en nada). */
#view-tablero .tab-proy-fa{display:inline-block;padding:0 6px;border-radius:999px;
  background:var(--tab-sup2);border:1px solid var(--tab-borde);color:var(--tab-tx2);
  font-size:10.5px;line-height:17px;white-space:nowrap;max-width:100%;
  overflow:hidden;text-overflow:ellipsis}
#view-tablero .tab-proy-fa.tab-proy-fa-no{background:none;border-style:dashed;font-style:italic}
#view-tablero .tab-proy-f.tab-archivado .tab-proy-n{color:var(--tab-tx2);text-decoration:line-through}
/* Un proyecto sin una sola tarea todavía. Al arrancar hay cuatro así (la
   migración sembró 10 proyectos y clasificó 40 tareas), y una pista vacía sin
   explicación se lee como un error. */
#view-tablero .tab-proy-f.tab-cero .tab-proy-c{color:var(--tab-tx2)}
#view-tablero .tab-proy-f.tab-cero .tab-proy-p{opacity:.5}

/* ───────── la fila "Sin proyecto" ─────────
   NO es un proyecto y no se puede ver como uno: al arrancar son 179 de 219
   tareas y es el camino por el que Edna las va a ir repartiendo. Se separa
   del grupo con una línea, va al final para que los proyectos de verdad lean
   como proyectos, no lleva punto de color (no tiene identidad), su pista va
   rayada en vez de rellena de un color que no existe, y lleva su propio botón
   de acción. */
#view-tablero .tab-proy-sin{margin-top:var(--s3);padding-top:var(--s3);
  border-top:1px dashed var(--tab-borde)}
#view-tablero .tab-proy-sin .tab-proy-n{color:var(--tab-tx2);font-style:normal}
#view-tablero .tab-proy-sin .tab-proy-hueco{width:8px;height:8px;border-radius:999px;
  border:1px dashed var(--tab-tx2);flex-shrink:0;display:block}
#view-tablero .tab-proy-sin .tab-proy-p{background:none;border:1px dashed var(--tab-borde);height:8px}
#view-tablero .tab-proy-sin .tab-proy-cuenta{font-variant-numeric:tabular-nums;
  font-size:17px;font-weight:700;letter-spacing:-.01em;color:var(--tab-tx)}
#view-tablero .tab-proy-sin .tab-ed-a{margin-top:var(--s2)}

/* las filas del diálogo de clasificar */
#view-tablero .tab-sin-f{display:grid;grid-template-columns:1fr;gap:var(--s2);padding:var(--s3);
  background:var(--tab-fondo);border:1px solid var(--tab-borde);border-radius:var(--r2)}
#view-tablero .tab-sin-f .tab-sin-t{font-size:13px;line-height:1.4;color:var(--tab-tx);overflow-wrap:anywhere}
#view-tablero .tab-sin-f .tab-sin-r{display:flex;gap:var(--s2);align-items:flex-end;flex-wrap:wrap}
#view-tablero .tab-sin-f .tab-sin-r .tab-campo{flex:1 1 160px}
#view-tablero .tab-sin-f.tab-listo{border-color:var(--tab-verde)}

/* ───────── LA COLUMNA COMPLETA, EN LISTA ─────────
   Edna, 2026-10-13: "cuando se pique el botón de ver más deben de abrirse las
   demás en lista". Es una LISTA y no una rejilla de tarjetas a propósito: lo
   que sobraba en la columna era el alto, y en lista el título va completo
   —sin el recorte de tres renglones de la tarjeta— con sus datos en una sola
   línea debajo y el botón de acciones a la derecha. Mismo control, mismos
   permisos: desde aquí se mueve y se clasifica igual que desde la tarjeta. */
#view-tablero .tab-lis-f{display:flex;align-items:flex-start;gap:var(--s3);padding:var(--s3);
  background:var(--tab-fondo);border:1px solid var(--tab-borde);border-radius:var(--r2)}
#view-tablero .tab-lis-c{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:var(--s2)}
#view-tablero .tab-lis-t{font-size:13px;line-height:1.45;color:var(--tab-tx);overflow-wrap:anywhere}
#view-tablero .tab-lis-f .tab-btn{flex:0 0 auto}
#view-tablero .tab-lis-d{display:inline-flex;align-items:center;gap:6px}
/* La caja del desplegable de módulo, en el diálogo de clasificar. Vacía no
   ocupa nada: la mayoría de los proyectos no tiene cronograma. */
#view-tablero .tab-sin-m:empty{display:none}
#view-tablero .tab-sin-m{margin-top:var(--s2)}
/* Cuando no hay desplegable que ofrecer se dice por qué, en una línea gris.
   No es un error: un proyecto sin cronograma no tiene módulos, y punto. */
#view-tablero .tab-mod-esp{font-size:12px;line-height:1.45;color:var(--tab-tx2)}

/* ───────── los módulos del cronograma, en el detalle ─────────
   Ligar tareas a módulos es lo que hace que `real_pct` exista, y
   `modulos_sin_tareas` NO es un error que esconder: es la lista de trabajo
   por hacer, y es lo que le dice a Edna por dónde empezar. Por eso el módulo
   sin tareas ligadas se marca, no se apaga. */
/* LAS DOS CELDAS, LO MÁS CHICAS POSIBLE (Edna, 2026-10-14: "estas dos celdas
   son muy largas y no me gusta … vamos a hacer las celdas lo más pequeñas
   posible"). Lo que se aprieta es el AIRE, no el contenido: ningún dato se
   fue en esta pasada, sólo los espacios entre renglones y los tamaños de
   letra de lo secundario. Doce módulos a 13px con --s2 de separación medían
   casi tanto como la columna entera. */
#view-tablero .tab-mods{display:flex;flex-direction:column;gap:var(--s1);margin:0;padding:0;
  list-style:none}
/* CADA MÓDULO EN UN SOLO RENGLÓN: número, nombre, porcentaje y su barra
   (Edna, 2026-10-14: "el porcentaje de cada módulo, para que ya no esté tan
   larga la celda, y que sea con una barra de porcentaje en cada uno").
   La barra es ancho fijo y no una fracción: doce barras que empiezan en la
   misma x se comparan de un vistazo, y una que mide distinto según lo largo
   que sea el nombre del módulo no se compara con nada. */
#view-tablero .tab-mod{display:grid;grid-template-columns:auto 1fr auto 64px;
  gap:2px var(--s2);align-items:center;padding-bottom:var(--s1);
  border-bottom:1px solid var(--tab-borde);min-width:0}
#view-tablero .tab-mod:last-child{border-bottom:0;padding-bottom:0}
#view-tablero .tab-mod-n{font-variant-numeric:tabular-nums;font-size:12px;
  color:var(--tab-tx2);min-width:2ch;text-align:right}
#view-tablero .tab-mod-t{font-size:12px;line-height:1.3;color:var(--tab-tx);min-width:0;
  overflow-wrap:anywhere}
/* La pista y el relleno. Mismo lenguaje que las barras de proyecto: pista
   apagada, relleno en Real. El módulo terminado se llena entero y además se
   marca su porcentaje en verde, que es la regla de "no dependas del color". */
#view-tablero .tab-mod-p{display:block;height:6px;border-radius:999px;
  background:var(--tab-pista);overflow:hidden;min-width:0}
#view-tablero .tab-mod-p i{display:block;height:100%;background:var(--tab-real);
  border-radius:999px}
#view-tablero .tab-mod.tab-mod-listo .tab-mod-p i{background:var(--tab-verde)}
/* Un módulo SIN tareas ligadas no lleva barra: una barra vacía se lee como
   "no se ha avanzado" y lo que pasa es que no se ha MEDIDO. La pista se deja
   punteada para que el renglón no se desalinee con los demás. */
#view-tablero .tab-mod.tab-mod-vacio .tab-mod-p{background:none;
  border-bottom:1px dotted var(--tab-borde);height:0;align-self:center}
#view-tablero .tab-mod-c{font-variant-numeric:tabular-nums;font-size:11px;font-weight:500;
  white-space:nowrap;color:var(--tab-tx2)}
#view-tablero .tab-mod.tab-mod-listo .tab-mod-c{color:var(--tab-verde)}
/* "sin tareas ligadas" es el renglón accionable de esta lista: se marca con
   el ámbar de pendiente, que es lo que significa. */
#view-tablero .tab-mod.tab-mod-vacio .tab-mod-c{color:var(--tab-tx);
  background:var(--tab-g-pend);color:var(--tab-g-pend-tx);border-radius:999px;padding:1px 7px}

/* ───────── los cuatro colores de dato, como clases ─────────
   tablero.js NO escribe ni un color en el marcado de una gráfica: cada trazo
   lleva su clase y el token se resuelve aquí. Así el modo oscuro voltea la
   dona y las barras sin que el JS se entere, y check-tab-css.mjs puede
   exigir que no quede ningún literal.
   Dos familias y no una: la dona necesita `stroke` con `fill:none`, y las
   barras y las muestras de la leyenda necesitan `fill`/`background`. Con una
   sola clase que pusiera las tres propiedades, el fill:none del arco y el
   fill del color quedarían empatados en especificidad y ganaría el orden del
   archivo — frágil. Separadas, no hay ambigüedad. */
#view-tablero .tab-arco{fill:none}

/* LOS DOS SÓLIDOS — hecho y en curso. Van a 4.503:1 entre sí en gris, que es
   de sobra, así que no necesitan forma: el color basta. */
#view-tablero .tab-s-hecho {stroke:var(--tab-g-hecho)}
#view-tablero .tab-s-curso {stroke:var(--tab-g-curso)}
#view-tablero .tab-f-hecho {fill:var(--tab-g-hecho); background-color:var(--tab-g-hecho)}
#view-tablero .tab-f-curso {fill:var(--tab-g-curso); background-color:var(--tab-g-curso)}

/* LOS DOS CON TEXTURA — por validar y pendiente. Son los que el color solo
   no separa (por validar contra en curso mide 1.107:1 en gris), así que la
   textura es la que carga la diferencia. Y son DOS TEXTURAS DISTINTAS, no la
   misma en dos direcciones: por validar va RAYADO y pendiente va PUNTEADO.
   La primera versión puso raya a los dos, a 45° y a −45°, y el guardián la
   rechazó con razón — entre ellos miden 1.501:1, también por debajo del piso
   viejo de 1.80:1, así que «raya contra raya» no los separaba. Cuatro
   estados, cuatro formas: sólido, sólido, rayado, punteado.
   En SVG la raya es un <pattern> declarado una sola vez en index.html
   (#tab-ray-valida y #tab-ray-pend, dentro de .tab-defs). Se referencia con
   la sintaxis de pintura con respaldo —url(...) seguido de un color—, así que
   si algún día el bloque de patrones desapareciera del HTML el arco se
   pintaría en su color sólido en vez de quedarse invisible.
   En HTML la misma raya se dibuja con un degradado repetido, sin SVG. */
#view-tablero .tab-s-valida{stroke:url(#tab-ray-valida) var(--tab-g-valida)}
#view-tablero .tab-s-pend  {stroke:url(#tab-pun-pend)   var(--tab-g-pend)}
#view-tablero .tab-f-valida{fill:url(#tab-ray-valida) var(--tab-g-valida);
  background-color:var(--tab-g-valida);
  background-image:repeating-linear-gradient(45deg,var(--tab-raya) 0 1.5px,transparent 1.5px 5px)}
#view-tablero .tab-f-pend  {fill:url(#tab-pun-pend) var(--tab-g-pend);
  background-color:var(--tab-g-pend);
  background-image:radial-gradient(var(--tab-raya) 1px,transparent 1.3px);background-size:5px 5px}
/* El bloque de patrones no ocupa lugar ni se lee: existe sólo para que
   url(#tab-ray-*) tenga a qué apuntar. No se pone display:none — un <defs>
   dentro de un SVG oculto así deja de resolverse en algunos navegadores. */
#view-tablero .tab-defs{position:absolute;width:0;height:0;overflow:hidden}
#view-tablero .tab-ray-f{fill:var(--tab-raya)}
/* Las franjas del patrón de SVG se pintan sobre el color base del estado. */
#view-tablero .tab-ray-b-valida{fill:var(--tab-g-valida)}
#view-tablero .tab-ray-b-pend  {fill:var(--tab-g-pend)}

/* ───────── dona de tareas ─────────
   Edna, 2026-10-12: "tareas, quiero que el círculo esté más grande y los
   valores abajo". La leyenda iba al lado y por eso la dona no podía crecer:
   se repartían el ancho del panel. En columna, la dona se lleva todo el ancho
   y la leyenda cabe en dos columnas debajo, que además es más corto de leer
   que cuatro renglones en una sola.
   La caja del SVG pasó de 132 a 176 unidades y el radio de 52 a 68 (lo fijan
   DONA_CAJA y DONA_R en tablero.js, no aquí: la geometría es del JS y los
   guiones la verifican ahí). El número del centro sube a 34px, que es lo que
   Edna pidió con "que el número del centro respire". */
#view-tablero .tab-dona{display:flex;flex-direction:column;align-items:center;gap:var(--s4)}
#view-tablero .tab-dona svg{width:176px;height:176px;max-width:100%;flex-shrink:0;display:block}
#view-tablero .tab-dona-c{font-variant-numeric:tabular-nums;
  font-size:42px;font-weight:700;letter-spacing:-.025em;fill:var(--tab-tx)}
#view-tablero .tab-dona-cs{font-family:var(--mono);font-size:9px;letter-spacing:.14em;fill:var(--tab-tx2)}
/* La leyenda lleva el número y el porcentaje: la dona no puede ser la única
   portadora del dato. Dos columnas en vez de cuatro renglones, y el swatch
   más grande ahora que los cuatro colores son el dato que Edna va a juzgar. */
#view-tablero .tab-leyenda{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:var(--s2) var(--s4);min-width:0;width:100%}
#view-tablero .tab-ley{display:grid;grid-template-columns:16px 1fr auto;align-items:center;
  gap:var(--s2);font-size:12.5px;color:var(--tab-tx);min-width:0}
#view-tablero .tab-ley i{width:16px;height:16px;border-radius:3px;display:block;
  border:1px solid var(--tab-raya)}
#view-tablero .tab-ley span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#view-tablero .tab-ley b{font-variant-numeric:tabular-nums;font-weight:600;
  font-size:12px;color:var(--tab-tx);white-space:nowrap}

/* ───────── la cadena comercial · la vista «Fase» del panel de Tareas ─────────
   La barra es LINEAL porque la cadena lo es: el orden de la fase 0 a la 5 es
   el dato, y un anillo lo destruiría. Ver el bloque de tokens --tab-fase-* y
   el bloque largo de tablero.js para por qué no son seis colores.
   La geometría (anchos, filo, alto, dónde cae la línea del dinero) la calcula
   barraFases() en tablero.js y la verifican los guiones ahí: aquí sólo vive
   el color y el acomodo. */
#view-tablero .tab-fase{display:flex;flex-direction:column;gap:var(--s3);min-width:0}
/* preserveAspectRatio="none" y alto fijo: la barra se estira al ancho del
   panel y su alto no cambia, igual que la gráfica de actividad. */
#view-tablero .tab-fase-g{display:block;width:100%;height:62px}

/* LAS CUATRO MARCAS. Dos bases —la liviana de lo que no se cobra y la pesada
   de lo cobrado— por dos formas —sólida y rayada—, que es lo que separa a dos
   fases vecinas. Cada una con su respaldo sólido detrás del patrón, igual que
   los estados: si el bloque de <pattern> faltara, el segmento se pinta de su
   color en vez de quedarse invisible. */
#view-tablero .tab-fa-gra  {fill:var(--tab-fase-gra); background-color:var(--tab-fase-gra)}
#view-tablero .tab-fa-pag  {fill:var(--tab-fase-pag); background-color:var(--tab-fase-pag)}
#view-tablero .tab-fa-gra-r{fill:url(#tab-ray-fgra) var(--tab-fase-gra);
  background-color:var(--tab-fase-gra);
  background-image:repeating-linear-gradient(45deg,var(--tab-raya) 0 1.5px,transparent 1.5px 5px)}
#view-tablero .tab-fa-pag-r{fill:url(#tab-ray-fpag) var(--tab-fase-pag);
  background-color:var(--tab-fase-pag);
  background-image:repeating-linear-gradient(45deg,var(--tab-fase-pag-tx) 0 1.5px,transparent 1.5px 5px)}
/* el fondo de cada patrón de SVG, que es el color base de su mitad */
#view-tablero .tab-ray-b-fgra{fill:var(--tab-fase-gra)}
#view-tablero .tab-ray-b-fpag{fill:var(--tab-fase-pag)}
/* y la tinta de la raya de la mitad pesada: el propio texto-sobre de su base
   (Marfil sobre Real en claro, Marino sobre Marfil en oscuro), que es lo
   único que contrasta con ella en los dos temas */
#view-tablero .tab-ray-f-fpag{fill:var(--tab-fase-pag-tx)}
/* La marca de «sin fase» no es una fase: no se pinta de ninguna de las dos
   bases, va hueca y punteada — que es como se ve una decisión que falta. */
#view-tablero .tab-fa-sin{background:none;border-style:dashed}

/* El número de la fase, DENTRO de su segmento. Es el rótulo que hace que la
   posición signifique algo sin bajar a la leyenda. */
#view-tablero .tab-fa-t{font-family:var(--mono);font-size:13px;font-weight:600}
#view-tablero .tab-fa-t-gra{fill:var(--tab-fase-gra-tx)}
#view-tablero .tab-fa-t-pag{fill:var(--tab-fase-pag-tx)}

/* LA LÍNEA DEL DINERO. Es la pregunta de negocio de la cadena, así que se
   marca con una raya de verdad y con su rótulo — no con un color. */
#view-tablero .tab-fase-l{stroke:var(--tab-tx);stroke-width:1.5;stroke-dasharray:3 2}
#view-tablero .tab-fase-lt{font-family:var(--mono);font-size:10px;letter-spacing:.06em;
  fill:var(--tab-tx2)}
#view-tablero .tab-fase-nota{margin:0;font-size:11.5px;line-height:1.45;color:var(--tab-tx2)}

/* La leyenda: mismo patrón que la de la dona, con una segunda línea para el
   cobro y el responsable de cada fase. Un renglón por fase y no dos columnas,
   porque aquí el ORDEN es el dato y dos columnas lo rompen. */
/* LA LEYENDA NO ES UNA LISTA. Edna, 2026-10-14: "la de fase sigue desplegando
   los parámetros en lista y se hace más grande la celda; acomodamos a modo de
   que entre la gráfica y los parámetros, pero no en lista".
   Siete renglones apilados eran siete veces el alto de un renglón; los mismos
   siete datos en una fila que envuelve ocupan dos. Es el mismo contenido con
   otra forma, que es exactamente lo que ella pidió. */
#view-tablero .tab-fley{display:flex;flex-wrap:wrap;gap:var(--s2) var(--s3);
  align-items:center;min-width:0;width:100%}
#view-tablero .tab-fl{display:inline-flex;align-items:center;gap:6px;
  min-width:0;font-size:12.5px;color:var(--tab-tx);white-space:nowrap}
#view-tablero .tab-fl i{width:12px;height:12px;border-radius:3px;display:block;
  border:1px solid var(--tab-raya);flex:0 0 auto}
#view-tablero .tab-fl-n{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}
#view-tablero .tab-fl b{font-variant-numeric:tabular-nums;font-weight:600;font-size:12px;
  color:var(--tab-tx);white-space:nowrap}
/* Una fase en CERO se queda en la lista —"no tenemos nada en Discovery" es un
   dato— pero se atenúa: no compite con las que sí tienen trabajo. */
#view-tablero .tab-fl.tab-fl-cero .tab-fl-n,
#view-tablero .tab-fl.tab-fl-cero b{color:var(--tab-tx2)}
#view-tablero .tab-fl.tab-fl-sin{padding-top:var(--s2);border-top:1px dashed var(--tab-borde)}
/* El aviso de "ningún proyecto tiene fase todavía" no es un error: no lleva
   el tratamiento de fallo, lleva el de "falta decidirlo". */
#view-tablero .tab-vacio.tab-fase-nadie{padding-bottom:var(--s3)}

/* ───────── esta semana ─────────
   Edna, 2026-10-12: "esta semana las juntas, sí se va, que se haga más
   pequeña también". Se hace más chica sin perder los siete días —son siete
   siempre, incluidos los vacíos, porque un día que falta deja un hueco que se
   lee como un error— apretando el renglón del día: la columna de la fecha
   baja de 46 a 38px, la separación de --s2 a --s1, y un día SIN juntas pasa a
   ser un renglón de una línea en vez de una caja con su propio texto. */
#view-tablero .tab-sem{display:flex;flex-direction:column;gap:var(--s1)}
#view-tablero .tab-sem-d{display:grid;grid-template-columns:38px 1fr;gap:var(--s2);
  padding-bottom:var(--s1);border-bottom:1px solid var(--tab-borde);align-items:baseline}
#view-tablero .tab-sem-d:last-child{border-bottom:0;padding-bottom:0}
#view-tablero .tab-sem-f{font-size:11.5px;font-weight:600;color:var(--tab-tx2);line-height:1.35}
/* Hoy en Real, que es "aquí estás" — el mismo gesto que la columna de hoy
   del calendario, no un color nuevo. */
#view-tablero .tab-sem-d.tab-hoy .tab-sem-f{color:var(--tab-real);font-weight:600}
#view-tablero .tab-sem-d.tab-hoy{background:var(--tab-t-real);margin:0 calc(-1 * var(--s2));
  padding:var(--s1) var(--s2) var(--s2);border-radius:var(--r2)}
#view-tablero .tab-sem-j{display:flex;flex-direction:column;gap:var(--s1);min-width:0}
/* Una junta es un <button> desde el 2026-10-13: picarla lleva al Calendario
   con su detalle abierto. Se le quita el aspecto de botón y se le deja el de
   renglón —width completo, texto a la izquierda— pero conserva cursor y foco
   visible, que es lo que dice que se puede picar. */
#view-tablero .tab-junta{display:grid;grid-template-columns:1fr auto;gap:var(--s2);align-items:center;
  padding:1px var(--s2);background:var(--tab-sup2);border:0;border-left:2px solid var(--tab-real);
  border-radius:0 var(--r2) var(--r2) 0;font-size:12px;min-width:0;width:100%;
  text-align:left;font:inherit;font-size:12px;cursor:pointer;
  transition:background-color 120ms ease}
@media(hover:hover){#view-tablero .tab-junta:hover{background:var(--tab-t-hover)}}
#view-tablero .tab-junta:focus-visible{outline:2px solid var(--tab-real);outline-offset:1px}
#view-tablero .tab-junta .tab-junta-t{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--tab-tx)}
#view-tablero .tab-junta .tab-junta-h{font-variant-numeric:tabular-nums;font-size:11px;color:var(--tab-tx2);white-space:nowrap}
#view-tablero .tab-junta.tab-propuesta{border-left-style:dashed}
#view-tablero .tab-junta.tab-cancelada .tab-junta-t{text-decoration:line-through;color:var(--tab-tx2)}
#view-tablero .tab-sem-v{font-size:11px;color:var(--tab-tx2);font-style:normal;opacity:.8}

/* ───────── equipo ───────── */
#view-tablero .tab-gente{display:flex;flex-direction:column;gap:var(--s2)}
#view-tablero .tab-p{display:grid;grid-template-columns:26px 1fr auto;gap:var(--s2);
  align-items:center;min-width:0}
/* El avatar baja de 34 a 26 SÓLO aquí: esta lista es un recuento de carga de
   trabajo, no un directorio, y la cara no es el dato. En el panel de equipo,
   que sí es un directorio, se queda como estaba. */
#view-tablero .tab-gente .tab-av{width:26px;height:26px;font-size:11px}
#view-tablero .tab-av{width:34px;height:34px;border-radius:999px;display:grid;place-items:center;
  font-size:13px;font-weight:600;overflow:hidden;flex-shrink:0}
#view-tablero .tab-av img{width:100%;height:100%;object-fit:cover;display:block}
#view-tablero .tab-p-n{font-size:13px;font-weight:500;color:var(--tab-tx);min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#view-tablero .tab-p-d{font-size:11px;color:var(--tab-tx2);min-width:0;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
#view-tablero .tab-p-t{font-variant-numeric:tabular-nums;font-size:12px;
  color:var(--tab-tx2);white-space:nowrap;text-align:right}
/* Tres estados, tres aspectos. "En junta" sale del calendario y es real, así
   que se marca con Real (está ocupada ahora). "Ausente" se apaga. */
#view-tablero .tab-p-e{display:inline-block;width:7px;height:7px;border-radius:999px;
  margin-right:var(--s1);background:var(--led-idle);vertical-align:middle}
#view-tablero .tab-p.tab-en-junta .tab-p-e{background:var(--tab-real)}
#view-tablero .tab-p.tab-activa-hoy .tab-p-e{background:var(--tab-verde)}
#view-tablero .tab-p.tab-ausente .tab-p-n{color:var(--tab-tx2)}

/* ───────── MI ÁREA: mis chiefs y sus subagentes ─────────
   Edna, 2026-10-12: "en equipo se supone que tienen que estar tus
   subagentes, o sea, si yo soy encargada del área de marketing, tengo a tal y
   a tal agente. que básicamente va a ser lo que está en el panel de equipo".
   El dato sale de GET /api/team tal cual: founders[] → el que viene con
   mine:true → chiefs[] → subagents[]. No se le pidió nada nuevo al backend.
   Este panel es MI ÁREA y no duplica la sección Equipo de la Console: los
   chiefs de las otras tres personas se ven allá, y aquí se dice así. */
#view-tablero .tab-jefes{display:flex;flex-direction:column;gap:var(--s3)}
#view-tablero .tab-jefe{display:flex;flex-direction:column;gap:var(--s2);
  padding:var(--s3);background:var(--tab-fondo);border:1px solid var(--tab-borde);
  border-radius:var(--tab-r);min-width:0}
#view-tablero .tab-jefe-h{display:grid;grid-template-columns:auto 1fr auto;align-items:center;
  gap:var(--s2);min-width:0}
#view-tablero .tab-jefe-n{font-size:13px;font-weight:600;color:var(--tab-tx);min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#view-tablero .tab-jefe-n span{font-weight:400;color:var(--tab-tx2);font-size:12px}
#view-tablero .tab-jefe-q{font-variant-numeric:tabular-nums;font-size:11px;
  color:var(--tab-tx2);white-space:nowrap}
/* El led de estado. Cinco estados del contrato y cinco aspectos: trabajando
   en Real (está pasando ahora), terminó en verde, falló en rojo, en reposo
   apagado, y «en cola» en el ÁMBAR DE PENDIENTE.
   Lo primero que puse en «en cola» fue Naranja, y lo rechazó mi propio
   scripts/check-tab-css.mjs: la dirección de diseño autoriza exactamente DOS
   naranjas en esta pantalla (el botón de compromiso y los avisos de
   pendiente) y éste habría sido un tercero. El guardia tiene razón — una cosa
   en cola no es algo que Edna tenga que ir a hacer ahora— y además el token
   correcto ya existía: «en cola» ES pendiente, así que lleva el mismo ámbar
   que el estado «pendiente» de las tareas. Un color menos y un significado
   más consistente. */
#view-tablero .tab-led{display:inline-block;width:8px;height:8px;border-radius:999px;
  background:var(--led-idle);flex-shrink:0}
#view-tablero .tab-led.tab-led-running{background:var(--tab-real)}
#view-tablero .tab-led.tab-led-done{background:var(--tab-verde)}
#view-tablero .tab-led.tab-led-failed{background:var(--tab-rojo)}
/* «En cola» lleva el color de pendiente, que desde el 2026-10-13 es Arena.
   Arena contra el papel blanco mide 1.507:1 — un punto de 8px en ese color
   se pierde. Lleva filo de Marino, que es la misma compensación por forma
   que usan las marcas de estado de las gráficas: borde, no color nuevo. */
#view-tablero .tab-led.tab-led-queued{background:var(--tab-g-pend);
  border:1px solid var(--tab-raya)}
/* Los subagentes van sangrados bajo su chief: son suyos, no otra lista. */
#view-tablero .tab-subs{display:flex;flex-direction:column;gap:var(--s1);margin:0;padding:0 0 0 var(--s3);
  list-style:none;border-left:1px solid var(--tab-borde)}
#view-tablero .tab-sub{display:grid;grid-template-columns:auto 1fr auto;align-items:center;
  gap:var(--s2);font-size:12px;color:var(--tab-tx);min-width:0}
#view-tablero .tab-sub .tab-sub-n{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#view-tablero .tab-sub .tab-sub-e{font-family:var(--mono);font-size:10px;letter-spacing:.06em;
  text-transform:uppercase;color:var(--tab-tx2);white-space:nowrap}
#view-tablero .tab-subs-v{font-size:12px;color:var(--tab-tx2);padding-left:var(--s3)}

/* ───────── gráfica de actividad ───────── */
#view-tablero .tab-act svg{width:100%;height:auto;display:block}
#view-tablero .tab-act-eje{stroke:var(--tab-rejilla);stroke-width:1}
#view-tablero .tab-act-f{font-size:8px;fill:var(--tab-tx2)}
#view-tablero .tab-act-l{display:flex;gap:var(--s2) var(--s3);flex-wrap:wrap;margin-top:var(--s2);
  font-family:var(--mono);font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--tab-tx2)}
#view-tablero .tab-act-l span{display:inline-flex;align-items:center;gap:var(--s1)}
#view-tablero .tab-act-l i{width:11px;height:11px;border-radius:2px;display:inline-block;
  border:1px solid var(--tab-raya)}

/* ───────── Kanban ─────────
   En teléfono se desplaza de lado con las columnas a ancho legible (260px),
   que es lo que pidió Edna: no se apilan ni se encogen hasta no leerse. */
/* El panel vuelve a tener sus cuatro márgenes iguales. El 0 de la derecha
   existía para que la fila que se deslizaba se "sangrara" hasta el borde y se
   viera que seguía; sin barra para deslizar (Edna, 2026-10-13) ese sangrado
   sólo dejaba a la columna «Hecho» pegada al filo. */
#view-tablero .tab-panel-kan{padding:var(--s4)}
#view-tablero .tab-panel-kan .tab-panel-h{flex-wrap:wrap}

/* ───────── el interruptor de ámbito ─────────
   Edna, 2026-10-12: "solo las de mi área, o sea, las de cada área, no las de
   todos. y eso va a reducir bastante la lista, el tamaño de la lista".
   Mismo control segmentado que el selector de rango, a propósito: hace lo
   mismo (elegir con qué se llena lo de abajo) y tiene que verse igual.
   Y lleva su propio rótulo diciendo que SÓLO toca al Kanban, por la misma
   razón por la que el rango lleva el suyo: un interruptor arriba de todo que
   en realidad afecta a un panel hace que alguien lo mueva, no vea cambiar los
   indicadores y concluya que el tablero está roto. Los indicadores, la dona y
   los proyectos son de la EMPRESA y no escuchan esto. */
#view-tablero .tab-ambito-caja{display:flex;flex-direction:column;align-items:flex-end;gap:var(--s1);
  min-width:0}
#view-tablero .tab-ambito{display:flex;gap:0;border:1px solid var(--tab-borde);
  border-radius:var(--tab-br);overflow:hidden;background:var(--tab-sup)}
#view-tablero .tab-ambito-b{height:30px;padding:0 var(--s3);font-size:12px;font-weight:500;
  color:var(--tab-tx2);background:none;border:0;
  border-left:1px solid var(--tab-borde);white-space:nowrap;cursor:pointer;
  transition:color 150ms ease,background-color 150ms ease}
#view-tablero .tab-ambito-b:first-child{border-left:0}
#view-tablero .tab-ambito-b[aria-pressed="true"]{background:var(--tab-real);color:var(--tab-sobre-real)}
@media(hover:hover){#view-tablero .tab-ambito-b:not([aria-pressed="true"]):hover{background:var(--tab-t-real);color:var(--tab-tx)}}
#view-tablero .tab-ambito-n{font-size:11px;line-height:1.4;color:var(--tab-tx2);text-align:right;max-width:100%}
/* LA CUENTA DE CADA BOTÓN (2026-10-13). El interruptor pasó de «Mi área |
   Todo el equipo» a «Mi área» más un botón por cada jefatura de quien está
   viendo —Edna: "debería de ser un botón que divida mis jefaturas para ver
   las tareas por jefaturas"—, y en la misma revisión se fue la línea de
   debajo que explicaba el filtro. Así que el botón tiene que decirse solo, y
   lo que le faltaba era su número: «Mi área 82», «Jefatura 4 39».
   Va en el mismo tono secundario que el botón, no en una banda de color: es
   un dato de apoyo, no una alerta. Cuando el botón está puesto hereda el
   color de encima del Real, como el resto de su texto. */
#view-tablero .tab-ambito-c{margin-left:6px;font-family:var(--mono);font-size:10.5px;
  font-variant-numeric:tabular-nums;opacity:.75}
/* LAS CUATRO COLUMNAS SE VEN DE UNA, SIN BARRA PARA DESLIZAR.
   Edna, 2026-10-13: "la celda de realizadas sigue saliendo, lo que quiero es
   que no esté la barra para deslizar sino que todas se vean".
   Por eso esto es una REJILLA y ya no una fila que se desborda: cuatro
   fracciones del ancho disponible (minmax(0,1fr) y no auto, que es lo que
   deja a una columna crecer con su contenido y empujar a las demás fuera).
   En pantallas angostas baja a dos y luego a una —se apilan, no se salen—, y
   nunca hay overflow horizontal.
   Y la MEDIDA LA DAN LAS TARJETAS DE «EN CURSO» (Edna, mismo día): las cuatro
   columnas son hermanas de la misma fila de la rejilla, así que miden lo
   mismo por construcción, y el título de la tarjeta se recorta a tres
   renglones (.tab-tar-t) para que una tarea larguísima no imponga su alto a
   las demás. */
#view-tablero .tab-kanban{display:grid;grid-template-columns:minmax(0,1fr);
  gap:var(--s3);padding:var(--s1) 0 var(--s2)}
#view-tablero .tab-col{min-width:0;display:flex;flex-direction:column;
  background:var(--tab-fondo);border:1px solid var(--tab-borde);border-radius:var(--tab-r);
  padding:var(--s4);gap:var(--s3);transition:background-color 120ms ease,border-color 120ms ease}
/* La columna que va a recibir la tarjeta se marca con Real: es estructura y
   selección, no una acción. */
#view-tablero .tab-col.tab-recibe{background:var(--tab-drop);border-color:var(--tab-real)}
/* EL ENCABEZADO DE LA COLUMNA ES SUPERFICIE REAL, DE LADO A LADO.
   Esto es la Regla B de la direccion de diseno del CMO, aplicada al pie de la
   letra: "Real es estructura secundaria, no solo «seleccionado» … la fila de
   encabezado de la rejilla, pasala a Real solido con texto Marfil/Celeste".
   Y es la respuesta a lo que Edna vio el 2026-10-13 ("no usaste bien la
   paleta de colores"): el diagnostico de esa misma direccion es que el
   problema nunca fue la paleta sino que al color le faltaba AREA — un lienzo
   de marfil y blanco con una pastilla azul suelta. Cuatro cabeceras Real
   solido le dan al panel las anclas de color que no tenia, y el azul deja de
   ser un adorno de 20px para ser estructura.
   El rotulo va en Celeste sobre fondo oscuro, que es el UNICO uso que la
   Regla D aprueba para Celeste (etiqueta, nunca superficie ni identidad).
   Los margenes negativos sacan la banda hasta el filo de la columna: la caja
   tiene padding --s4 y la banda tiene que ignorarlo. */
/* LAS CUATRO BANDAS MIDEN LO MISMO, lleven botón o no. Edna, 2026-10-14:
   "esto está disparejo, hay unos más largos que otros; podrías alinear toda
   la franja azul y por ende se alinean las celdas de las tareas".
   La causa era el botón «Ver más»: la banda crecía a su altura (24px) sólo
   en las columnas que tenían algo escondido, así que «Pendiente» y «Hecho»
   quedaban más altas que «En curso» y «Por validar» — y con ellas empezaba
   más abajo la primera tarjeta de esas columnas.
   El `min-height` fija la banda a la altura que tiene CON botón, y entonces
   la presencia del botón deja de mover nada. El alto del botón vive en UN
   token (--tab-mas-h) que leen los dos: si alguien lo cambia, la banda lo
   sigue sola. Dos números iguales escritos en dos lugares se separan el día
   que alguien toca uno. */
#view-tablero .tab-col-h{display:flex;align-items:center;justify-content:space-between;
  gap:var(--s2);margin:calc(-1 * var(--s4)) calc(-1 * var(--s4)) 0;
  padding:var(--s3) var(--s4);background:var(--tab-real);box-sizing:border-box;
  min-height:calc(var(--tab-mas-h) + (var(--s3) * 2));
  border-radius:calc(var(--tab-r) - 1px) calc(var(--tab-r) - 1px) 0 0}
#view-tablero .tab-col-t{font-family:var(--mono);font-size:10px;letter-spacing:.12em;
  text-transform:uppercase;color:var(--tab-celeste);font-weight:500;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* EL «VER MÁS» DE LA COLUMNA, EN EL LUGAR DONDE ESTABA LA PASTILLA DEL NÚMERO.
   Edna, 2026-10-13: "quiero un botón en lugar del 23 que diga ver más y lo
   mismo en las otras celdas de las tareas".
   Es EL MISMO control que el «ver más» de los proyectos (.tab-proy-mas) —
   borde punteado, letra apagada, Real sólo al pasar el puntero—, y eso es la
   decisión de paleta, no una casualidad: en esta pantalla Real es "aquí
   estás / esto está activo" y Naranja es "haz esto ahora". Un "ver más" no es
   ninguna de las dos cosas: es navegación, y va en gris con borde. Pintarlo
   de Real sólido —que es lo que parecía antes, sin estilo— lo ponía al mismo
   nivel visual que el estado activo y competía con las tarjetas. */
#view-tablero .tab-col-mas{flex:0 0 auto;height:var(--tab-mas-h);padding:0 var(--s3);
  background:none;border:1px solid rgba(244,241,236,.45);border-radius:var(--tab-br);
  font-size:11px;font-weight:500;color:var(--tab-sobre-real);cursor:pointer;white-space:nowrap;
  transition:background-color 120ms ease,border-color 120ms ease}
@media(hover:hover){#view-tablero .tab-col-mas:hover{background:rgba(244,241,236,.14);
  border-color:var(--tab-sobre-real)}}
#view-tablero .tab-col-mas:focus-visible{outline:2px solid var(--tab-sobre-real);outline-offset:2px}
#view-tablero .tab-col-b{display:flex;flex-direction:column;gap:var(--s2);min-height:48px}
#view-tablero .tab-col-v{font-size:12px;color:var(--tab-tx2);padding:var(--s3) 0;text-align:center;line-height:1.5}

#view-tablero .tab-tar{background:var(--tab-sup);border:1px solid var(--tab-borde);
  border-radius:var(--r2);padding:var(--s3);display:flex;flex-direction:column;gap:var(--s2);
  min-width:0;position:relative}
#view-tablero .tab-tar.tab-puedo{cursor:grab}
#view-tablero .tab-tar.tab-arrastrando{opacity:.45}
/* Una tarjeta que NO se puede mover se ve distinta DESDE EL PRINCIPIO: sin
   asa de arrastre, con un borde izquierdo apagado y el cursor normal. No se
   deja que la persona la arrastre para estrellarse contra un 403. */
#view-tablero .tab-tar.tab-no-puedo{border-left:3px solid var(--tab-arena);background:var(--tab-fondo)}
/* El título se recorta a TRES RENGLONES. Sin esto, una tarea de doce
   renglones —las hay— estiraba su columna y, con la rejilla, estiraba a las
   cuatro. El texto completo no se pierde: está en el diálogo de «Ver más»,
   que es justamente donde los títulos van enteros. */
#view-tablero .tab-tar-t{font-size:13px;line-height:1.4;color:var(--tab-tx);overflow-wrap:anywhere;
  display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;line-clamp:3;overflow:hidden}
#view-tablero .tab-tar-m{display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap;
  font-size:11px;color:var(--tab-tx2)}
#view-tablero .tab-tar-pr{display:inline-flex;align-items:center;gap:4px;font-weight:500}
#view-tablero .tab-tar-pr i{width:6px;height:6px;border-radius:999px;background:var(--tab-arena)}
/* El segundo y último naranja de la pantalla: una prioridad "urgente" es un
   pendiente real, no decoración. */
#view-tablero .tab-tar-pr.tab-urgente i{background:var(--tab-naranja)}
#view-tablero .tab-tar-pr.tab-urgente{color:var(--warn-c)}
#view-tablero .tab-tar-pr.tab-proximo i{background:var(--tab-real)}
#view-tablero .tab-tar-pe{display:inline-flex;align-items:center;gap:4px;min-width:0}
#view-tablero .tab-tar-pe .tab-proy-pt{width:7px;height:7px}
#view-tablero .tab-tar-pe span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:110px}
#view-tablero .tab-tar-pe.tab-sin{color:var(--warn-c)}
#view-tablero .tab-tar-f{display:flex;align-items:center;justify-content:space-between;gap:var(--s2)}
#view-tablero .tab-tar .tab-av{width:22px;height:22px;font-size:9px}
#view-tablero .tab-tar-asa{font-size:11px;color:var(--tab-tx2);cursor:grab;user-select:none}
#view-tablero .tab-tar-mas{width:24px;height:24px;display:grid;place-items:center;border:0;
  background:none;color:var(--tab-tx2);border-radius:999px;cursor:pointer;font-size:15px;
  line-height:1;flex-shrink:0}
@media(hover:hover){#view-tablero .tab-tar-mas:hover{background:var(--tab-t-hover);color:var(--tab-tx)}}

/* ───────── estados de carga y de vacío ─────────
   Mientras llega el dato hay esqueletos, no una pantalla en blanco. El
   esqueleto no se anima con un barrido: un movimiento permanente en una
   pantalla operativa cansa, y la dirección de diseño pide precisión, no
   adorno. Es un bloque gris con el alto que va a tener el dato. */
#view-tablero .tab-esq{background:var(--tab-esq);border-radius:var(--r2);height:12px;display:block}
#view-tablero .tab-esq.tab-esq-g{height:28px}
#view-tablero .tab-esq.tab-esq-c{height:176px;width:176px;max-width:100%;border-radius:999px}
#view-tablero .tab-esq-l{display:flex;flex-direction:column;gap:var(--s2)}
#view-tablero .tab-vacio{padding:var(--s4) var(--s3);text-align:center;color:var(--tab-tx2);
  font-size:13px;line-height:1.55;display:flex;flex-direction:column;align-items:center;gap:var(--s3)}
#view-tablero .tab-vacio b{display:block;color:var(--tab-tx);font-size:14px;font-weight:600}
#view-tablero .tab-vacio p{margin:0;max-width:34ch}
#view-tablero .tab-vacio svg{width:30px;height:30px;stroke:var(--tab-tx2);fill:none;stroke-width:1.5;
  stroke-linecap:round;stroke-linejoin:round;opacity:.7}
#view-tablero .tab-falla{padding:var(--s8) var(--s4)}

/* ───────── diálogos ─────────
   Sin sombra suave y sin esquinas muy redondeadas: un velo Marino y una caja
   con el mismo radio de 10px que el resto. */
#view-tablero .tab-modal,
#view-tablero .tab-menu{position:fixed;inset:0;z-index:60;background:var(--tab-velo);
  display:grid;place-items:center;padding:var(--s4)}
#view-tablero .tab-modal-caja,
#view-tablero .tab-menu-caja{width:100%;max-width:520px;max-height:84dvh;overflow-y:auto;
  background:var(--tab-sup);border:1px solid var(--tab-borde);border-radius:var(--tab-r);
  padding:var(--s4);display:flex;flex-direction:column;gap:var(--s3)}
#view-tablero .tab-menu-caja{max-width:340px}
#view-tablero .tab-modal-h{display:flex;align-items:center;justify-content:space-between;gap:var(--s3)}
#view-tablero .tab-modal-h h2{font-size:16px;font-weight:600}
#view-tablero .tab-menu-t{font-size:14px;font-weight:600;line-height:1.4;overflow-wrap:anywhere}
#view-tablero .tab-modal-b,
#view-tablero .tab-menu-b{display:flex;flex-direction:column;gap:var(--s3)}
#view-tablero .tab-modal-f{display:flex;gap:var(--s2);justify-content:space-between;
  padding-top:var(--s3);border-top:1px solid var(--tab-borde)}
#view-tablero .tab-modal .tab-aviso,
#view-tablero .tab-menu .tab-aviso{margin:0}

/* una fila de proyecto en el administrador */
#view-tablero .tab-ed{display:flex;flex-direction:column;gap:var(--s2);padding:var(--s3);
  background:var(--tab-fondo);border:1px solid var(--tab-borde);border-radius:var(--r2)}
#view-tablero .tab-ed-r{display:flex;gap:var(--s2);flex-wrap:wrap;align-items:flex-end}
#view-tablero .tab-ed-r .tab-campo{flex:1 1 140px}
#view-tablero .tab-ed-r .tab-campo.tab-col-chico{flex:0 0 auto}
#view-tablero .tab-ed-a{display:flex;gap:var(--s2);flex-wrap:wrap}

/* los botones de "mover a…" del menú sin arrastre */
#view-tablero .tab-menu-b .tab-mv{display:flex;align-items:center;justify-content:space-between;
  gap:var(--s2);width:100%;height:36px;padding:0 var(--s4);background:var(--tab-sup);
  border:1px solid var(--tab-borde);border-radius:var(--tab-br);font-size:13px;color:var(--tab-tx);
  cursor:pointer;text-align:left}
@media(hover:hover){#view-tablero .tab-menu-b .tab-mv:hover{background:var(--tab-t-real);border-color:var(--tab-real)}}
#view-tablero .tab-menu-b .tab-mv[aria-current="true"]{background:var(--tab-real);
  border-color:var(--tab-real);color:var(--tab-sobre-real);cursor:default}
#view-tablero .tab-menu-b .tab-mv i{font-family:var(--mono);font-size:10px;letter-spacing:.08em;
  text-transform:uppercase;font-style:normal;opacity:.7}
#view-tablero .tab-menu-nota{font-size:12px;line-height:1.55;color:var(--tab-tx2);
  padding:var(--s2) var(--s3);background:var(--tab-fondo);border-left:3px solid var(--tab-arena);
  border-radius:0 var(--r2) var(--r2) 0}

/* =====================================================================
   DETALLE DE UN PROYECTO
   Edna, 2026-10-12: "cuando le piques a un proyecto … te va a llevar a las
   tareas específicas que se tienen de ese proyecto" y "tiene que darnos un
   reporte de cómo va el proceso y qué falta para terminarlo al 100".
   Son DOS preguntas y en ese orden: ¿cómo va? y ¿qué falta para el 100?
   El acomodo las contesta en ese orden y nada más: primero el resumen (el
   avance, por persona, la más vieja abierta, las sin dueño), después "qué
   falta", que son las tareas abiertas por prioridad y antigüedad. Esa lista
   NO es "otra lista más": ES la respuesta, y por eso lleva ese título y va
   numerada.
   No es un diálogo: es una vista dentro de la sección, que oculta #tab-cuerpo
   y se pinta en su lugar. Así el selector de rango y el ámbito se quedan
   donde están, en variables del módulo, y volver no vuelve a pedir nada ni
   pierde lo que Edna había elegido.
   ===================================================================== */
#view-tablero .tab-det{display:flex;flex-direction:column;gap:var(--s3)}
#view-tablero .tab-det-h{display:flex;flex-wrap:wrap;align-items:center;gap:var(--s3);
  justify-content:space-between}
#view-tablero .tab-det-t{display:flex;align-items:center;gap:var(--s2);min-width:0}
#view-tablero .tab-det-t h2{font-size:18px;font-weight:600;line-height:1.3;min-width:0;
  overflow-wrap:anywhere}
#view-tablero .tab-det-t .tab-proy-pt{width:12px;height:12px}
/* Las dos preguntas, cada una en su panel y en su orden. */
#view-tablero .tab-det-q{font-family:var(--mono);font-size:10px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--tab-tx2);display:block;margin-bottom:var(--s2)}
#view-tablero .tab-det-g{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--s4)}

/* "¿cómo va?" — el número grande y los cuatro estados en chips.
   El chip lleva TEXTO ENCIMA del color del estado, y por eso cada color de
   estado tiene su token `-tx` con lo que devuelve sobre(): aquí es donde ese
   contraste de 4.5:1 se gasta de verdad. */
#view-tablero .tab-det-pct{font-variant-numeric:tabular-nums;
  font-size:34px;font-weight:700;letter-spacing:-.025em;line-height:1.05;color:var(--tab-tx);display:block}
#view-tablero .tab-det-pct small{font-size:13px;font-weight:400;color:var(--tab-tx2);
  letter-spacing:.04em;display:block;margin-top:var(--s1)}
/* Aquí vivían los chips de estado del detalle («Hecho 21 · En curso 0 …»).
   Se fueron con ellos el 2026-10-14: Edna los quitó de la pantalla y dejar su
   CSS sería dejar instrucciones para pintar algo que ya nadie pinta. */
#view-tablero .tab-det-l{display:flex;flex-direction:column;gap:var(--s1);margin-top:var(--s2);
  padding-top:var(--s2);border-top:1px solid var(--tab-borde)}
#view-tablero .tab-det-l div{display:flex;justify-content:space-between;gap:var(--s3);
  font-size:12px;color:var(--tab-tx2);min-width:0}
#view-tablero .tab-det-l div b{font-weight:600;color:var(--tab-tx);
  text-align:right;min-width:0;overflow-wrap:anywhere}

/* "¿qué falta para el 100?" — las tareas abiertas por prioridad y antigüedad.
   Numeradas, porque el orden ES el dato: es la cola de trabajo, no un
   inventario. */
#view-tablero .tab-falta{display:flex;flex-direction:column;gap:var(--s1);margin:0;padding:0;
  list-style:none;counter-reset:falta}
#view-tablero .tab-falta li{display:grid;grid-template-columns:auto 1fr;gap:var(--s2);
  align-items:baseline;padding-bottom:var(--s1);border-bottom:1px solid var(--tab-borde);min-width:0}
#view-tablero .tab-falta li:last-child{border-bottom:0;padding-bottom:0}
#view-tablero .tab-falta li::before{counter-increment:falta;content:counter(falta);
  font-variant-numeric:tabular-nums;font-size:12px;font-weight:600;color:var(--tab-tx2);
  min-width:2ch;text-align:right}
#view-tablero .tab-falta-t{font-size:13px;line-height:1.45;color:var(--tab-tx);overflow-wrap:anywhere}
#view-tablero .tab-falta-m{display:flex;flex-wrap:wrap;gap:var(--s2);margin-top:3px;
  font-size:11px;color:var(--tab-tx2)}
#view-tablero .tab-falta-m .tab-urgente{color:var(--warn-c)}
/* El tope de la lista se DICE cuando hay más de las que caben, en vez de
   hacer creer que eso es todo lo que falta. */
#view-tablero .tab-falta-v{font-size:12px;color:var(--tab-tx2);padding-top:var(--s2);line-height:1.5}


/* =====================================================================
   EL EXPEDIENTE DEL PROYECTO (Edna, 2026-10-14)
   ─────────────────────────────────────────────────────────────────────
   Tres secciones debajo de las dos preguntas del detalle: cliente y
   facturación, costos y documentos. Son los MISMOS paneles (.tab-panel) y
   los MISMOS controles (.tab-btn, .tab-campo) que el resto de la pantalla:
   aquí no entra ni un color literal, ni un radio nuevo, ni Naranja —que ya
   tiene sus dos usos, el botón de compromiso y los avisos de pendiente— ni
   una sombra. Lo único propio es el acomodo.
   Los estados de una línea de dinero se distinguen por PALABRA y por SIGNO
   (+ entra / − sale), no por color: es lo que se lee igual de lejos, en
   blanco y negro y sin distinguir colores.
   ===================================================================== */
#view-tablero .tab-exp{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--s4)}
#view-tablero .tab-exp-q{font-family:var(--mono);font-size:10px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--tab-tx2);display:block;margin-bottom:var(--s3)}
/* La línea que explica qué es esta parte, o cuándo se tocó por última vez. */
#view-tablero .tab-exp-v{font-size:12px;line-height:1.55;color:var(--tab-tx2);
  margin-bottom:var(--s3)}
/* La nota chica que acompaña a un botón: dice qué va a pasar ANTES de
   picarlo, que es cuando sirve. */
#view-tablero .tab-exp-n{font-size:11.5px;line-height:1.45;color:var(--tab-tx2);min-width:0}
#view-tablero .tab-exp-a{display:flex;flex-wrap:wrap;align-items:center;gap:var(--s3);
  margin-top:var(--s3);padding-top:var(--s3);border-top:1px solid var(--tab-borde)}
#view-tablero .tab-exp-a .tab-exp-n{flex:1 1 200px}
/* Los campos de la ficha. Una columna en el teléfono y dos en cuanto hay
   ancho: un campo de texto más angosto que su etiqueta no se puede leer. */
#view-tablero .tab-exp-g{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--s3)}
#view-tablero .tab-exp-g2{margin-top:var(--s3);padding-top:var(--s3);
  border-top:1px solid var(--tab-borde)}
#view-tablero .tab-campo.tab-campo-an{grid-column:1 / -1}
#view-tablero .tab-campo.tab-campo-min{min-width:120px}
#view-tablero .tab-exp a.tab-btn,
#view-tablero .tab-modal a.tab-btn{text-decoration:none}

/* Los totales, UN BLOQUE POR MONEDA. Nunca se suman entre sí: el bloque es
   justamente lo que hace visible que son cuentas separadas. */
#view-tablero .tab-tot{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--s3);
  margin-bottom:var(--s4)}
#view-tablero .tab-tot-b{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:var(--s2) var(--s3);padding:var(--s3);background:var(--tab-fondo);
  border:1px solid var(--tab-borde);border-radius:var(--r2)}
#view-tablero .tab-tot-m{grid-column:1 / -1;font-family:var(--mono);font-size:10px;
  letter-spacing:.12em;color:var(--tab-tx2)}
#view-tablero .tab-tot-b div{display:flex;flex-direction:column;gap:2px;min-width:0}
#view-tablero .tab-tot-b div span{font-size:11px;color:var(--tab-tx2)}
#view-tablero .tab-tot-b div b{font-variant-numeric:tabular-nums;font-size:15px;font-weight:600;
  color:var(--tab-tx);overflow-wrap:anywhere}

/* Una línea —de dinero o de documento—. El mismo renglón para las dos:
   lo que las distingue es lo que dicen, no la caja. */
#view-tablero .tab-lin{display:flex;flex-direction:column;gap:var(--s2);margin:0;padding:0;
  list-style:none}
#view-tablero .tab-lin-i{display:grid;grid-template-columns:minmax(0,1fr) auto;
  gap:var(--s2) var(--s3);align-items:start;padding-bottom:var(--s3);
  border-bottom:1px solid var(--tab-borde);min-width:0}
#view-tablero .tab-lin-i:last-child{border-bottom:0;padding-bottom:0}
#view-tablero .tab-lin-d{min-width:0}
#view-tablero .tab-lin-t{font-size:13px;line-height:1.45;color:var(--tab-tx);overflow-wrap:anywhere}
#view-tablero .tab-lin-m{display:flex;flex-wrap:wrap;align-items:center;gap:var(--s2);
  margin-top:3px;font-size:11px;color:var(--tab-tx2);min-width:0}
#view-tablero .tab-lin-m span{overflow-wrap:anywhere}
#view-tablero .tab-lin-n{font-variant-numeric:tabular-nums;font-size:14px;font-weight:600;
  color:var(--tab-tx);white-space:nowrap;text-align:right}
/* Lo que sale se apaga un punto; el signo − delante es lo que de verdad lo
   dice, y por eso no hace falta un rojo que gritaría "error". */
#view-tablero .tab-lin-n.tab-lin-sale{color:var(--tab-tx2)}
#view-tablero .tab-lin-a{grid-column:1 / -1;display:flex;flex-wrap:wrap;align-items:flex-end;
  gap:var(--s2);justify-content:flex-end}
/* La etiqueta de un tipo o de un estado: una pastilla con filo, sin relleno
   de color — los cuatro colores de dato son de los estados de TAREA y
   repetirlos aquí haría creer que significan lo mismo. */
#view-tablero .tab-eti{display:inline-flex;align-items:center;padding:1px var(--s2);
  border:1px solid var(--tab-borde);border-radius:999px;font-size:11px;color:var(--tab-tx2);
  white-space:nowrap}
#view-tablero .tab-eti.tab-eti-liq{color:var(--tab-verde);border-color:var(--tab-verde)}
#view-tablero .tab-eti.tab-eti-pen{color:var(--tab-tx)}
#view-tablero .tab-eti.tab-eti-can{text-decoration:line-through}
/* Un documento cuyo archivo ya no está en Documentos. Se APAGA el renglón y
   se dice qué pasó: esconderlo sería perder la única prueba de que este
   proyecto tuvo ese documento. */
#view-tablero .tab-doc-no{font-size:11.5px;line-height:1.5;color:var(--tab-tx);margin-top:var(--s2);
  padding:var(--s2);background:var(--warn-bg);border-left:3px solid var(--warn-c);
  border-radius:var(--r2);overflow-wrap:anywhere}
#view-tablero .tab-lin-i.tab-doc-ido .tab-lin-t{color:var(--tab-tx2)}

/* El árbol de Documentos del selector. Es el MISMO árbol de la sección de
   Documentos; aquí sólo se navega y se pica. */
#view-tablero .tab-arb-h{display:flex;align-items:center;justify-content:space-between;
  gap:var(--s3);min-width:0}
#view-tablero .tab-arb-ruta{font-family:var(--mono);font-size:11px;color:var(--tab-tx2);
  min-width:0;overflow-wrap:anywhere}
#view-tablero .tab-arb{display:flex;flex-direction:column;gap:2px;margin:0;padding:0;list-style:none}
#view-tablero .tab-arb-i{display:flex;align-items:center;justify-content:space-between;gap:var(--s3);
  width:100%;padding:var(--s2) var(--s3);background:none;color:var(--tab-tx);
  border:1px solid transparent;border-radius:var(--tab-br);font-size:13px;text-align:left;
  cursor:pointer;min-width:0;overflow-wrap:anywhere}
@media(hover:hover){#view-tablero .tab-arb-i:hover{background:var(--tab-t-real)}}
#view-tablero .tab-arb-i.tab-arb-dir{font-weight:500}
#view-tablero .tab-arb-i.tab-arb-dir::before{content:'/';font-family:var(--mono);
  color:var(--tab-tx2);margin-right:var(--s2)}
#view-tablero .tab-arb-i.tab-arb-sel{background:var(--tab-t-real);border-color:var(--tab-real);
  font-weight:600}
#view-tablero .tab-arb-t{font-variant-numeric:tabular-nums;font-size:11px;color:var(--tab-tx2);
  white-space:nowrap}

/* ───────── pantallas anchas ─────────
   Cuatro indicadores en una fila, la fila de tres y la fila de dos. El panel
   de proyectos es el más ancho de los tres porque sus barras necesitan largo
   para leerse; la dona y "esta semana" piden menos. */
/* Dos columnas en cuanto hay ancho para dos, y las cuatro en cuanto hay para
   cuatro. Nunca una barra horizontal: lo que no cabe se apila. */
@media(min-width:560px){
  #view-tablero .tab-kanban{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media(min-width:1000px){
  #view-tablero .tab-kanban{grid-template-columns:repeat(4,minmax(0,1fr))}
}
@media(min-width:720px){
  #view-tablero .tab-kpis{grid-template-columns:repeat(4,minmax(0,1fr))}
  #view-tablero .tab-f2{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
}
@media(min-width:720px){
  /* "¿cómo va?" y "¿qué falta?" lado a lado, con la respuesta a la segunda
     más ancha: es una lista de títulos de tarea y necesita largo para
     leerse. */
  #view-tablero .tab-det-g{grid-template-columns:minmax(0,1fr) minmax(0,1.4fr)}
  #view-tablero .tab-leyenda{grid-template-columns:repeat(2,minmax(0,1fr))}
  /* Los campos de la ficha en dos columnas, y los totales de cada moneda en
     cuatro: los cuatro números de una moneda se comparan de un vistazo o no
     se comparan. El domicilio y las notas siguen ocupando el ancho entero
     (.tab-campo-an), que es lo que necesitan para leerse. */
  #view-tablero .tab-exp-g{grid-template-columns:repeat(2,minmax(0,1fr))}
  #view-tablero .tab-tot-b{grid-template-columns:repeat(4,minmax(0,1fr))}
  #view-tablero .tab-lin-i{grid-template-columns:minmax(0,1fr) auto auto}
  #view-tablero .tab-lin-a{grid-column:auto}
}
@media(min-width:1024px){
  #view-tablero .tab-f3{grid-template-columns:minmax(0,1.3fr) minmax(0,1fr) minmax(0,1fr)}
  /* El expediente en dos columnas —costos y documentos— con la ficha
     completa arriba: la ficha es un formulario y se lee en renglones, las
     otras dos son listas y caben lado a lado. */
  #view-tablero .tab-exp{grid-template-columns:repeat(2,minmax(0,1fr))}
  #view-tablero .tab-exp .tab-exp-ancho{grid-column:1 / -1}
  #view-tablero .tab-exp .tab-exp-ancho .tab-exp-g{grid-template-columns:repeat(3,minmax(0,1fr))}
  /* Las dos celdas de una fila miden LO MISMO. Edna, 2026-10-13, sobre «Mi
     equipo» y «Actividad»: "que las dos queden del mismo tamaño". Antes la
     segunda era 1.15 para darle aire a la gráfica; con el panel de equipo ya
     sin descripciones, la asimetría sólo se notaba como descuido. */
  #view-tablero .tab-f2{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
}

/* ───────── menos movimiento ───────── */
@media(prefers-reduced-motion:reduce){
  #view-tablero *{transition-duration:0ms!important;animation:none!important}
}

/* =====================================================================
   MODO OSCURO
   La misma condición de medios y el mismo [data-theme] que usa app.css
   (líneas 19-34) y que repite cal.css: el bloque de medios lleva
   :root:not([data-theme="light"]) para que elegir "claro" a mano gane sobre
   el sistema, y el bloque [data-theme="dark"] para que elegir "oscuro" a
   mano gane sobre un sistema en claro. Los dos bloques son idénticos a
   propósito — no hay forma de agruparlos sin :is() anidado, y duplicarlos
   es lo que ya hacen app.css y cal.css.
   Qué cambia y por qué:
     · Real a #223382 sobre fondo oscuro no se lee. Sube al mismo realce que
       app.css le da en su bloque oscuro (--edna-h: #3D5FA8).
     · Los cuatro colores de estado NO se invierten: son los mismos cuatro
       tonos (ámbar, teal, azul, violeta) levantados en luminancia, porque el
       tono es el que lleva el significado y voltearlo cambiaría de color un
       estado al cambiar de tema. Lo que se levanta es la claridad, para que
       el más oscuro de los cuatro no se pierda contra la superficie oscura.
       Ver el bloque de tokens oscuros, más abajo.
     · Los velos de Real al 5-12% desaparecen sobre una superficie oscura:
       pasan a ser velos CLAROS de Celeste. Mismo criterio que cal.css.
     · Marfil y Arena eran superficies secundarias: en oscuro son las de la
       Console.
     · Naranja NO cambia: es la acción, y la acción se ve igual en los dos
       temas. El color de cada proyecto y de cada persona tampoco cambia: es
       identidad, la manda el API, y voltearla sería inventarle otro dato.
   ===================================================================== */
@media (prefers-color-scheme:dark){
:root:not([data-theme="light"]) #view-tablero{
  --tab-tinta:var(--text-1);
  --tab-real:#3D5FA8;
  --tab-papel:var(--surface2);
  --tab-arena:var(--surface2);
  /* Los cuatro estados en OSCURO · la misma paleta de marca (2026-10-13).
     Tres de los cuatro no se mueven —Arena, Celeste y Naranja son claros y se
     ven igual de bien contra la superficie oscura de la Console (#111328)—.
     El que cambia es `hecho`: Real #223382 (luminancia 0.0432) contra #111328
     (0.0074) queda a 1.62:1 y desaparece. En oscuro, `hecho` pasa a MARFIL
     #F4F1EC, que es de la misma tabla de marca.
     No es inconsistencia: el papel de `hecho` es el mismo en los dos temas —
     la marca MÁS PESADA contra el fondo de la página—, y lo que cambia es
     cuál de los seis colores de marca cumple ese papel cuando el fondo se
     invierte. Es exactamente lo que app.css ya hace con los colores de
     persona (--fernando-h pasa de #111144 a #223382 en oscuro).
     OSCURO · luminancia · texto encima · contra #111328
       hecho       #F4F1EC  0.8820  Marino  15.70:1  16.24:1
       pendiente   #DAD1C8  0.6468  Marino  11.74:1  12.14:1
       por validar #9BACD8  0.4143  Marino   7.82:1   8.09:1
       en curso    #F98513  0.3696  Marino   7.07:1   7.31:1
     Pares en gris: hecho/pend 1.338 · hecho/valida 2.007 · hecho/curso 2.221
                    pend/valida 1.501 · pend/curso 1.660 · valida/curso 1.107
     EL PAR MÁS PARECIDO: en curso / por validar, 1.107:1 — el mismo que en
     claro, y separado por la misma forma (sólido contra rayado). En oscuro
     aparece un segundo par flojo, hecho/pendiente a 1.338:1, y también va
     separado por forma: hecho es sólido y pendiente es rayado.
     Los cuatro se ven de sobra contra la superficie oscura (lo peor es 7.31:1
     contra 2.650:1 de piso), así que en oscuro no hay nada que compensar por
     ese lado: el problema de este tema es sólo la separación entre ellos. */
  --tab-g-pend:#DAD1C8;    --tab-g-pend-tx:#111144;
  --tab-g-hecho:#F4F1EC;   --tab-g-hecho-tx:#111144;
  --tab-g-curso:#F98513;   --tab-g-curso-tx:#111144;
  --tab-g-valida:#9BACD8;  --tab-g-valida-tx:#111144;
  --tab-raya:#111144;
  --tab-t-real:rgba(155,172,216,.07);
  --tab-t-hover:rgba(155,172,216,.12);
  --tab-t-naranja:rgba(249,133,19,.14);
  --tab-pista:rgba(155,172,216,.14);
  --tab-rejilla:rgba(155,172,216,.18);
  --tab-drop:rgba(155,172,216,.1);
  --tab-esq:rgba(155,172,216,.09);
  --tab-velo:rgba(0,0,0,.66);
  --tab-rec-velo:rgba(0,0,0,.66);
  --tab-rec-filo:rgba(155,172,216,.5);
}
/* Arena como BORDE de una tarjeta que no se puede mover tiene que seguir
   siendo visible: --tab-arena pasó a ser superficie oscura, así que el
   borde se declara aparte contra el borde de la Console. */
:root:not([data-theme="light"]) #view-tablero .tab-tar.tab-no-puedo{border-left-color:var(--text-3)}
:root:not([data-theme="light"]) #view-tablero .tab-tar-pr i{background:var(--text-3)}
:root:not([data-theme="light"]) #view-tablero .tab-menu-nota{border-left-color:var(--text-3)}
/* El rotulo de la columna va en Celeste sobre Real, que es el uso aprobado
   de Celeste. En OSCURO, Real aclara a #3D5FA8 y Celeste encima se queda en
   2.8:1 — ilegible para una etiqueta de 10px. Ahi el rotulo pasa a Marfil
   (5.7:1), que es el mismo papel con otro color de la misma tabla. */
:root:not([data-theme="light"]) #view-tablero .tab-col-t{color:var(--tab-sobre-real)}
/* El naranja de compromiso lleva texto Marino en los dos temas: es un botón
   naranja sólido, y Marino sobre naranja es la combinación aprobada. */
:root:not([data-theme="light"]) #view-tablero .tab-btn.tab-pri{color:var(--depths)}
}

:root[data-theme="dark"] #view-tablero{
  --tab-tinta:var(--text-1);
  --tab-real:#3D5FA8;
  --tab-papel:var(--surface2);
  --tab-arena:var(--surface2);
  /* Los cuatro estados en OSCURO · la misma paleta de marca (2026-10-13).
     Tres de los cuatro no se mueven —Arena, Celeste y Naranja son claros y se
     ven igual de bien contra la superficie oscura de la Console (#111328)—.
     El que cambia es `hecho`: Real #223382 (luminancia 0.0432) contra #111328
     (0.0074) queda a 1.62:1 y desaparece. En oscuro, `hecho` pasa a MARFIL
     #F4F1EC, que es de la misma tabla de marca.
     No es inconsistencia: el papel de `hecho` es el mismo en los dos temas —
     la marca MÁS PESADA contra el fondo de la página—, y lo que cambia es
     cuál de los seis colores de marca cumple ese papel cuando el fondo se
     invierte. Es exactamente lo que app.css ya hace con los colores de
     persona (--fernando-h pasa de #111144 a #223382 en oscuro).
     OSCURO · luminancia · texto encima · contra #111328
       hecho       #F4F1EC  0.8820  Marino  15.70:1  16.24:1
       pendiente   #DAD1C8  0.6468  Marino  11.74:1  12.14:1
       por validar #9BACD8  0.4143  Marino   7.82:1   8.09:1
       en curso    #F98513  0.3696  Marino   7.07:1   7.31:1
     Pares en gris: hecho/pend 1.338 · hecho/valida 2.007 · hecho/curso 2.221
                    pend/valida 1.501 · pend/curso 1.660 · valida/curso 1.107
     EL PAR MÁS PARECIDO: en curso / por validar, 1.107:1 — el mismo que en
     claro, y separado por la misma forma (sólido contra rayado). En oscuro
     aparece un segundo par flojo, hecho/pendiente a 1.338:1, y también va
     separado por forma: hecho es sólido y pendiente es rayado.
     Los cuatro se ven de sobra contra la superficie oscura (lo peor es 7.31:1
     contra 2.650:1 de piso), así que en oscuro no hay nada que compensar por
     ese lado: el problema de este tema es sólo la separación entre ellos. */
  --tab-g-pend:#DAD1C8;    --tab-g-pend-tx:#111144;
  --tab-g-hecho:#F4F1EC;   --tab-g-hecho-tx:#111144;
  --tab-g-curso:#F98513;   --tab-g-curso-tx:#111144;
  --tab-g-valida:#9BACD8;  --tab-g-valida-tx:#111144;
  --tab-raya:#111144;
  --tab-t-real:rgba(155,172,216,.07);
  --tab-t-hover:rgba(155,172,216,.12);
  --tab-t-naranja:rgba(249,133,19,.14);
  --tab-pista:rgba(155,172,216,.14);
  --tab-rejilla:rgba(155,172,216,.18);
  --tab-drop:rgba(155,172,216,.1);
  --tab-esq:rgba(155,172,216,.09);
  --tab-velo:rgba(0,0,0,.66);
  --tab-rec-velo:rgba(0,0,0,.66);
  --tab-rec-filo:rgba(155,172,216,.5);
}
:root[data-theme="dark"] #view-tablero .tab-tar.tab-no-puedo{border-left-color:var(--text-3)}
:root[data-theme="dark"] #view-tablero .tab-tar-pr i{background:var(--text-3)}
:root[data-theme="dark"] #view-tablero .tab-menu-nota{border-left-color:var(--text-3)}
:root[data-theme="dark"] #view-tablero .tab-col-t{color:var(--tab-sobre-real)}
:root[data-theme="dark"] #view-tablero .tab-btn.tab-pri{color:var(--depths)}

/* ───────── tareas sin asignar · su propia celda (2026-10-13) ─────────
   Edna: "estas tareas … deben de estar en una celda completamente diferente
   … con el botón de clasificar, para que cada quien cuando no tenga algo que
   hacer o ya tenga sus tareas hechas de ahí pueda jalar tareas y hacerlas".
   Un renglón por tarea, el botón de tomarla a la derecha, y al pie —con su
   propia línea— la OTRA deuda, la de clasificación. */
#view-tablero .tab-sa{display:flex;flex-direction:column;gap:var(--s2)}
#view-tablero .tab-sa-f{display:flex;align-items:flex-start;gap:var(--s3);padding:var(--s3);
  background:var(--tab-fondo);border:1px solid var(--tab-borde);border-radius:var(--r2)}
#view-tablero .tab-sa-c{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:var(--s2)}
/* Dos renglones y punto: en una celda de media página, un título de doce
   renglones es la misma plaga que ya se cortó en las tarjetas del flujo. */
#view-tablero .tab-sa-t{font-size:13px;line-height:1.4;color:var(--tab-tx);overflow-wrap:anywhere;
  display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden}
/* EL RENGLÓN ES PICABLE Y ES UN <button> DE VERDAD (Edna, 2026-10-13: "en
   tareas por asignar deberían de ser picables y debería de llevarme a la
   ventana de clasificar"). La parte picable es .tab-sa-c —el bloque del
   título y la metadata— y «Tomarla» queda como su hermano, no como su hijo:
   un botón dentro de otro botón es marcado inválido.
   Aquí sólo se le quita al <button> lo que el navegador le pone de fábrica
   (fondo, borde, centrado, la tipografía del sistema) para que siga
   leyéndose como un renglón. Lo que NO se le quita es el foco: el filo de
   foco de app.css es lo que hace que se pueda llegar con el tabulador, y es
   justo lo que un div con onclick no tendría. */
#view-tablero button.tab-sa-c{background:none;border:0;padding:0;margin:0;
  font:inherit;color:inherit;text-align:left;cursor:pointer;align-items:flex-start}
@media(hover:hover){#view-tablero button.tab-sa-c:hover .tab-sa-t{color:var(--tab-real)}}
#view-tablero .tab-sa-f .tab-btn{flex:0 0 auto}
#view-tablero .tab-sa-pie{display:flex;align-items:center;justify-content:space-between;gap:var(--s3);
  margin-top:var(--s3);padding-top:var(--s3);border-top:1px solid var(--tab-borde);
  font-size:12px;color:var(--tab-tx2)}

/* ───────── clasificar: responsable, resuelta y el filtro (2026-10-13) ─────────
   Edna: "las asignas a un proyecto, pero no a un responsable … debería de
   venir también la opción de responsable y realizada" y "hay tareas de esa
   lista que ya están resueltas". */
#view-tablero .tab-sin-cab{display:flex;align-items:center;justify-content:space-between;
  gap:var(--s3);flex-wrap:wrap;margin-bottom:var(--s3);padding-bottom:var(--s2);
  border-bottom:1px solid var(--tab-borde);font-size:12px;color:var(--tab-tx2)}
#view-tablero .tab-sin-ok{display:inline-flex;align-items:center;gap:var(--s2);
  margin-top:var(--s2);font-size:12px;color:var(--tab-tx2);cursor:pointer}
#view-tablero .tab-sin-ok input{width:15px;height:15px;accent-color:var(--tab-real);cursor:pointer}
/* Una que ya está resuelta se ve resuelta: no se esconde el dato, se dice con
   forma —filo Real a la izquierda— y no con un color más. */
#view-tablero .tab-sin-f.tab-sin-hecha{border-left:3px solid var(--tab-real)}
#view-tablero .tab-sin-f.tab-sin-hecha .tab-sin-t{color:var(--tab-tx2)}

/* ───────── agregar tarea (Edna, 2026-10-14) ─────────
   "Necesito un botón de agregar tarea y cuando lo pique me abra una pestaña
   para agregar tareas … que destine una jefatura en automático que se pueda
   corregir … y también el proyecto destinado."

   DOS BOTONES EN LA CABECERA DE LOS INDICADORES. El `margin-left:auto` de
   arriba empuja al primero hasta la derecha; el segundo tiene que quedar
   pegado a él y no empujar otra vez, o la pareja se parte en dos extremos.
   Los dos son del mismo gris: el naranja sigue siendo de un solo botón por
   pantalla, el de compromiso de un diálogo. */
#view-tablero .tab-kpis-h .tab-btn + .tab-btn{margin-left:var(--s2)}

/* El formulario. Dos columnas en cuanto hay ancho (proyecto + jefatura,
   prioridad + responsable) y una sola en teléfono, con el MISMO .tab-campo
   del resto de la sección: ni un control nuevo, ni una altura nueva. */
#view-tablero .tab-nt{display:flex;flex-direction:column;gap:var(--s3)}
#view-tablero .tab-nt-r{display:flex;gap:var(--s3);flex-wrap:wrap;align-items:flex-start}
#view-tablero .tab-nt-r .tab-campo{flex:1 1 180px}
/* La columna que junta un campo con su porqué. Existe porque el porqué NO
   puede vivir dentro del <label> (se volvería parte del nombre accesible del
   desplegable y se reescribiría en cada tecla): va como hermano, ligado por
   aria-describedby. */
#view-tablero .tab-nt-c{display:flex;flex-direction:column;gap:var(--s1);
  flex:1 1 180px;min-width:0}

/* EL PORQUÉ DE CADA SUGERENCIA, debajo de su campo. Es el renglón que
   convierte una propuesta en algo que se puede revisar: sin él, un
   desplegable que se mueve solo no se distingue de un error. Va en el gris
   secundario y en cursiva —no es una etiqueta ni un control— y cuando no hay
   nada que explicar desaparece en vez de dejar su hueco. */
#view-tablero .tab-nt-por{font-size:11px;line-height:1.45;color:var(--tab-tx2);
  font-style:italic;overflow-wrap:anywhere}
#view-tablero .tab-nt-por:empty{display:none}

/* ───────── subir un documento desde el expediente (2026-10-14) ─────────
   Edna: "habrá documentos que no estarán ahí porque son contratos que se
   tienen que escanear; dame la opción de subir archivos". Va DEBAJO del
   árbol y separado por una línea: primero se busca lo que ya existe —que es
   el caso común— y sólo si no está, se sube. */
#view-tablero .tab-subir{margin-top:var(--s3);padding-top:var(--s3);
  border-top:1px dashed var(--tab-borde);display:flex;flex-direction:column;gap:var(--s2)}
/* Los dos botones en una fila, con el nombre de lo elegido al lado y
   envolviendo en pantalla angosta. El campo nativo no se estiliza —se
   esconde con .sr y lo abre el botón— porque cada navegador lo pinta a su
   manera y en ninguno se parece a los botones de esta pantalla. */
#view-tablero .tab-subir-r{display:flex;flex-wrap:wrap;align-items:center;gap:var(--s2) var(--s3)}
#view-tablero .tab-subir-n{font-size:12px;color:var(--tab-tx2);min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ───────── la casilla de «terminada» en «¿qué falta?» (2026-10-14) ─────────
   Edna: "las tareas que están abajo con la casilla de marcar como
   terminada". Va ANTES del número de orden, que es donde la mano la busca, y
   la que no se puede picar se ve deshabilitada en vez de esconderse: una
   casilla ausente haría pensar que esa tarea no se puede cerrar nunca, y lo
   que pasa es que no es tuya. */
#view-tablero .tab-falta li{grid-template-columns:auto auto 1fr}
#view-tablero .tab-falta-ok{display:inline-flex;align-items:center;cursor:pointer}
#view-tablero .tab-falta-ok input{width:15px;height:15px;accent-color:var(--tab-real);cursor:pointer}
#view-tablero .tab-falta-ok.tab-falta-no{cursor:not-allowed;opacity:.5}
#view-tablero .tab-falta-ok.tab-falta-no input{cursor:not-allowed}

/* =====================================================================
   BIENVENIDA Y RECORRIDO DEL TABLERO (Edna, 2026-10-15)
   ─────────────────────────────────────────────────────────────────────
   "Como le hicimos para el calendario, necesito que hagas una bienvenida y
   hagas un recorrido de todo lo que hay en este nuevo módulo y cómo se usa."

   Son DOS piezas y se ven distinto a propósito:
     · LA PORTADA (.tab-bv) es Marino a sangre, con el logo en grande. No es
       un diálogo: es portada, igual que la del Calendario. Se permite ese
       volumen porque se ve UNA VEZ por persona — máximo brillo, mínima
       repetición. Es la única pantalla de esta sección que no respeta el
       tema claro/oscuro: Marino y Marfil son tokens de marca que no voltean
       (app.css no los redeclara en ninguno de sus dos bloques oscuros), y
       una portada de bienvenida que cambia de color según la hora del día
       deja de ser la portada de la empresa.
     · EL RECORRIDO (.tab-rec) es lo contrario: no tapa, RECORTA. Velo con un
       hueco, anillo de un pelo en el borde del hueco y una tarjeta chica al
       lado. Lo que se explica tiene que seguir a la vista mientras se lee la
       explicación, o el texto se vuelve un folleto.

   NARANJA SIGUE TENIENDO DOS USOS, no tres. La portada usa .tab-btn.tab-pri,
   que es el uso que ya existía (el botón de compromiso) y ahí es literalmente
   lo único que hay en pantalla. Dentro del recorrido NO hay naranja: la
   jerarquía de la tarjeta la carga la forma — «Siguiente» con caja y borde,
   «Atrás» en fantasma, «Saltar» en texto.

   MOVIMIENTO. Todo es opacity, transform y clip-path, nada de geometría
   animada. El bloque de prefers-reduced-motion de más arriba ya apaga las
   transiciones de TODO #view-tablero, así que aquí no se repite — y tablero.js
   además acorta sus esperas a cero cuando esa preferencia está puesta, para
   que el recorrido no se sienta lento en vez de sentirse quieto.
   ===================================================================== */

/* ───────── la portada ───────── */
#view-tablero .tab-bv{position:fixed;inset:0;z-index:85;background:var(--depths);color:var(--luster);
  display:grid;place-items:center;padding:var(--s6) var(--s4);overflow-y:auto}
#view-tablero .tab-bv[hidden]{display:none}
#view-tablero .tab-bv-c{width:100%;max-width:560px;text-align:center;
  display:flex;flex-direction:column;align-items:center}
#view-tablero .tab-bv-logo{width:300px;max-width:100%;height:150px;flex:none;margin-bottom:var(--s2)}
#view-tablero .tab-bv-hola{font-size:50px;line-height:1.05;font-weight:700;letter-spacing:-.03em;
  margin:0 0 14px;color:var(--luster)}
#view-tablero .tab-bv-l{font-size:16px;line-height:1.55;color:var(--aster);margin:0 0 26px;max-width:46ch}
/* El CTA crece sobre el botón normal de la sección: mismo control, mismo
   radio, más aire. No es un botón nuevo. */
#view-tablero .tab-bv-cta{height:auto;font-size:16px;padding:13px 34px}
/* La salida controlada. Es un <button> porque hace una acción, pero se ve
   como un enlace de texto chico: la dirección de diseño pide justamente que
   no compita con el CTA. */
#view-tablero .tab-bv-salir{margin-top:var(--s2);border:0;background:none;padding:6px 10px;
  font-size:13px;color:var(--aster);text-decoration:underline;text-underline-offset:3px;cursor:pointer}
@media(hover:hover){#view-tablero .tab-bv-salir:hover{color:var(--luster)}}
@media(max-width:600px){
  #view-tablero .tab-bv-logo{width:230px;height:115px}
  #view-tablero .tab-bv-hola{font-size:34px}
  #view-tablero .tab-bv-l{font-size:15px}
}

/* ───────── el recorrido: las cuatro capas ─────────
   .tab-rec no recibe eventos; cada capa dice si los recibe ella. */
#view-tablero .tab-rec{position:fixed;inset:0;z-index:80;pointer-events:none}
#view-tablero .tab-rec[hidden]{display:none}
/* El velo lleva el hueco en un clip-path de regla par-impar que pone
   tablero.js: el rectángulo de la pantalla y, dentro, el del destino. */
#view-tablero .tab-rec-velo{position:fixed;inset:0;background:var(--tab-rec-velo);opacity:0;
  transition:opacity 200ms var(--ease-out),clip-path 200ms var(--ease-out)}
#view-tablero .tab-rec.tab-rec-on .tab-rec-velo{opacity:1}
#view-tablero .tab-rec.tab-rec-sale .tab-rec-velo{transition-duration:120ms}
#view-tablero .tab-rec.tab-rec-fin .tab-rec-velo{opacity:0;transition-duration:120ms}
/* El atrapador deja la página inerte: un clic sobre el velo no hace nada y,
   sobre todo, NO salta el recorrido — picar fuera por accidente no puede
   costarte la explicación. */
#view-tablero .tab-rec-atrapa{position:fixed;inset:0;pointer-events:auto;touch-action:none;z-index:1}
/* Al cambiar el tamaño de la ventana el hueco se recoloca SIN movimiento: un
   hueco que viaja mientras alguien arrastra el borde se ve roto, no vivo. */
#view-tablero .tab-rec.tab-rec-quieto *{transition-duration:0ms!important}
#view-tablero .tab-rec-anillo{position:fixed;z-index:2;box-sizing:border-box;
  border:1px solid var(--tab-rec-filo);border-radius:var(--r2);opacity:0;pointer-events:none;
  transition:opacity 200ms var(--ease-out)}
#view-tablero .tab-rec-anillo.tab-rec-ver{opacity:1}
#view-tablero .tab-rec.tab-rec-sale .tab-rec-anillo,
#view-tablero .tab-rec.tab-rec-fin .tab-rec-anillo{opacity:0;transition-duration:120ms}

/* ───────── la tarjeta ─────────
   En escritorio flota pegada al hueco (tablero.js decide de qué lado cabe);
   en teléfono es una hoja fija abajo, que es donde el pulgar la alcanza. */
#view-tablero .tab-rec-caja{position:fixed;z-index:3;width:340px;max-width:calc(100vw - 32px);
  background:var(--tab-sup);color:var(--tab-tx);border:1px solid var(--tab-borde);
  border-radius:var(--tab-r);padding:var(--s4);pointer-events:auto;
  display:flex;flex-direction:column;gap:var(--s2);
  opacity:0;transform:var(--tab-rec-de,translateY(8px));
  transition:opacity 200ms var(--ease-out),transform 200ms var(--ease-out)}
#view-tablero .tab-rec-caja.tab-rec-ver{opacity:1;transform:none}
#view-tablero .tab-rec.tab-rec-sale .tab-rec-caja,
#view-tablero .tab-rec.tab-rec-fin .tab-rec-caja{opacity:0;transform:none;transition-duration:120ms}
#view-tablero .tab-rec-h{display:flex;align-items:center;justify-content:space-between;gap:var(--s3)}
#view-tablero .tab-rec-n{font-family:var(--mono);font-size:10px;letter-spacing:.12em;
  text-transform:uppercase;color:var(--tab-tx2);font-variant-numeric:tabular-nums}
#view-tablero .tab-rec-saltar{border:0;background:none;padding:6px var(--s2);margin-right:calc(-1 * var(--s2));
  font-size:12px;color:var(--tab-tx2);text-decoration:underline;text-underline-offset:3px;cursor:pointer}
@media(hover:hover){#view-tablero .tab-rec-saltar:hover{color:var(--tab-tx)}}
#view-tablero .tab-rec-caja h2{font-size:16px;line-height:1.3;font-weight:600;margin:0;color:var(--tab-tx)}
/* Tres renglones reservados: la tarjeta NO salta de alto entre un paso y el
   siguiente, que es lo que hace que un recorrido se sienta tembloroso. */
#view-tablero .tab-rec-caja p{font-size:13.5px;line-height:1.55;color:var(--tab-tx);margin:0;min-height:63px}
#view-tablero .tab-rec-f{display:flex;justify-content:flex-end;gap:var(--s2);margin-top:var(--s2)}
/* «Atrás» en el primer paso no se quita: se vuelve invisible, para que
   «Siguiente» no cambie de lugar entre el paso 1 y el 2. */
#view-tablero .tab-rec-atras{background:none;border-color:transparent;color:var(--tab-tx2)}
@media(hover:hover){#view-tablero .tab-rec-atras:hover{background:var(--tab-t-real);border-color:var(--tab-borde)}}
#view-tablero .tab-rec-atras.tab-rec-nada{visibility:hidden}

@media (max-width:767px){
  #view-tablero .tab-rec-caja{left:0;right:0;bottom:0;top:auto!important;width:auto;max-width:none;
    border-left:0;border-right:0;border-bottom:0;border-radius:var(--tab-r) var(--tab-r) 0 0;
    padding:var(--s4) var(--s4) calc(var(--s4) + env(safe-area-inset-bottom));
    opacity:1;transform:translateY(100%);
    transition:transform 260ms var(--ease-drawer)}
  #view-tablero .tab-rec-caja.tab-rec-ver{transform:none}
  /* La hoja se queda puesta entre pasos (sólo cambia el texto); al cerrar,
     baja. */
  #view-tablero .tab-rec.tab-rec-sale .tab-rec-caja{opacity:1;transform:none}
  #view-tablero .tab-rec.tab-rec-fin .tab-rec-caja{opacity:1;transform:translateY(100%);transition-duration:200ms}
  #view-tablero .tab-rec-f .tab-rec-sig{flex:1}
}

/* ───────── el botón que lo vuelve a abrir ─────────
   Sin esto el recorrido es de un solo uso y nadie lo encuentra otra vez.
   Va en el saludo, que es el único renglón fijo de la pantalla y lo primero
   que se lee; es el mismo control gris chico que «Agregar tarea», no uno
   nuevo. El saludo pasa a envolver para que en teléfono el botón se vaya al
   renglón de abajo en vez de apretar el nombre. */
#view-tablero .tab-saludo{flex-wrap:wrap}
#view-tablero .tab-saludo .tab-rec-abrir{flex:0 0 auto;margin-left:auto}
