/* ============================================================================
   EL PANEL — ESTILO
   ============================================================================

   Se apoya en los tokens de marca.css y no redeclara ni un color de marca. Lo
   que hay aquí es la maqueta de un panel: barra superior, cajón de navegación,
   tablas densas, formularios.

   DESDE EL 28 SEP 2026 USA EL SISTEMA DE DISEÑO DE LA WEB (skill
   diseno-trufas, muestrario en somostrufas.org/muestra): los tamaños son
   `--tipo-*`, los textos `--texto-1/2/3`, los espacios grandes `--esp-*` con
   nombre, los biseles y aros los de marca.css por escalones de alto, y NO HAY
   SOMBRAS: las cajas se separan por tono. La escala propia que tenía
   (`--tx-*`, `--tit-*`, `--elev-*`, un `--filo-xs` de 6 px que pisaba el de
   5 de marca) se retiró ese día. Lo único que se queda es lo que la web no
   tiene: los pasos de 4 px de dentro de un control (`--esp-1…4`, apuntados
   como excepción en la skill), alturas de control y duraciones.

   POR QUÉ NO SE REUSA base.css, QUE ES LA HOJA DE LA WEB PÚBLICA. Porque no
   sirve para esto: ahí viven el nav, el hero y las tarjetas de una web de
   cara al público, y ninguno se parece a un panel. Y porque en base.css
   `.panel` es el desplegable del menú móvil — el mismo nombre para dos cosas
   distintas es el bug que aún no ha pasado.

   Lo que sí comparten los dos sitios está en DOS hojas de assets/, que el
   panel recibe copiadas al publicarse (scripts/comun-panel.mjs):
   marca.css —las tipografías y el :root de tokens— y componentes.css
   —botones, píldoras, `.caja`, el menú de cuenta y `.reveal`—. Esta hoja se
   carga después y solo añade lo que es del panel.

   EL RESET VA AQUÍ Y NO EN marca.css, a propósito: marca.css es la marca, no
   la maqueta, y quien la cargue debe recibir colores y letras, no reglas que
   le muevan el layout.

   ============================================================================
   LO QUE HAY QUE SABER ANTES DE TOCAR NADA: `clip-path` SE COME TRES COSAS
   ============================================================================

   El bisel de la marca es un `clip-path`, y un clip recorta TODO lo que pinta
   el elemento. Eso explica tres cosas que parecían decisiones y eran
   consecuencias:

     · EL BORDE DESAPARECE en las dos esquinas cortadas. Se veía en cualquier
       ficha: el marco se interrumpía justo en el chaflán.
     · LA SOMBRA EXTERIOR NO SE VE NUNCA, que es por qué en 322 líneas no había
       ni una: no es que no se quisiera profundidad, es que no se habría visto.
     · EL `outline` DEL FOCO TAMPOCO SE VE. Ningún botón ni entrada de la barra
       enseñaba dónde estaba el teclado. Era un fallo de accesibilidad real.

   Las tres salidas, y se usan en todo el archivo:

     · marco → en una caja opaca grande, la CAPA DOBLE de `.caja`
       (componentes.css); en lo pequeño o translúcido, UN pseudo con forma de
       aro (`--filo-xs`, `--filo-sm` en marca.css) del escalón de su alto,
     · sombra → ninguna. La skill lo prohíbe: la profundidad es de tono
       (`--surface` sobre `--ink`). Hasta el 28 sep 2026 aquí iba un
       `filter: drop-shadow()`,
     · foco → el aro de 2 px (`--filo-foco-*`), por DENTRO del recorte.
   ========================================================================== */

*{box-sizing:border-box;margin:0;padding:0}

/* ============================================================================
   LOS TOKENS DEL PANEL
   ============================================================================
   marca.css es la frontera compartida con la web pública y ahí no se toca
   nada: un color de más allí cambia los dos sitios. Lo de aquí es lo que solo
   tiene sentido en un panel —alturas de control, pasos pequeños, duraciones—
   y por eso vive aquí. Los tamaños de letra, los niveles de texto y los
   espacios grandes NO: son los de marca.css.

   LOS VALORES VAN CALCULADOS A MANO Y NO CON color-mix(). Sin build, lo que se
   escribe es lo que se sirve, y un color-mix() que un navegador no entienda
   deja la variable inválida y el elemento SIN COLOR. Un rgba() no falla.
   ========================================================================== */
:root{
  /* Que los calendarios nativos de finanzas, las barras de scroll y las
     casillas nazcan oscuros. Una línea, y se acabaron los date-pickers
     blancos en mitad de un formulario negro. */
  color-scheme:dark;

  /* ESPACIO DENTRO DE UN CONTROL — pasos de 4 px. La web no los tiene porque
     no tiene tablas densas ni formularios de diecisiete campos; lo grande
     (caja, bloque, rejilla, cabecera) es de marca.css: `--esp-caja`,
     `--esp-bloque`, `--esp-rejilla`, `--esp-cabecera`. Excepción escrita en
     la skill diseno-trufas. */
  --esp-1:.25rem; --esp-2:.5rem;  --esp-3:.75rem; --esp-4:1rem;
  /* El relleno de una tarjeta de ficha (P.tarjeta): 24 px. `--esp-caja` (40)
     es el de una caja de formulario; en una rejilla de tarjetas inflaba la
     ficha muy por encima del artifact que le sirve de modelo (3 oct 2026). */
  --esp-tarjeta:1.5rem;

  /* SUPERFICIES — el lienzo, la tarjeta, lo elevado, lo que destaca */
  --sup-0:var(--ink);        /* #17110D · el fondo de la página      */
  --sup-1:var(--surface);    /* #241A15 · ficha, barra, aviso        */
  --sup-2:var(--surface-2);  /* #2E211A · hover, pestaña activa      */

  /* VELADURAS — crema con alfa. Suben cualquier superficie sin saber cuál es,
     que es lo que hace que sirvan igual sobre la barra que sobre una tabla. */
  --velo-1:rgba(242,232,220,.045);
  --velo-2:rgba(242,232,220,.08);
  --velo-3:rgba(242,232,220,.025);     /* la cebra de las tablas */
  --velo-vivo:rgba(255,198,33,.10);    /* amarillo al 10 % */
  --velo-alerta:rgba(154,147,141,.12); /* --gris-3 al 12 % */
  --linea-suave:rgba(74,54,43,.6);     /* --line al 60 %   */
  --borde-vivo:rgba(255,198,33,.45);
  --borde-alerta:rgba(154,147,141,.45);

  /* EL TEXTO SOBRE AMARILLO. marca.css lo declara con el mismo nombre y el
     mismo valor; se repite aquí como literal para que el botón amarillo se
     lea aunque no llegue la hoja de somostrufas.org. NO puede escribirse
     como `var(--sobre-amarillo, …)`: una propiedad que se refiere a sí misma
     es un ciclo y el navegador la tira entera. El amarillo encendido del
     hover ya es `--yellow-alto`, de marca.css. */
  --sobre-amarillo:#1A1207;

  /* MOVIMIENTO — esto es una herramienta de trabajo, no una web de producto:
     nada rebota y nada pasa de 300 ms. */
  --t-rapido:.12s; --t-medio:.2s; --t-lento:.3s;
  --curva:cubic-bezier(.22,.61,.36,1);   /* frena al final, sin rebote */

  /* Una sola altura para TODO lo que se pulsa o se rellena. Hoy un input, un
     select y un input[type=date] medían tres cosas distintas porque cada
     navegador les pone su padding, y en una fila de cuatro campos se nota. */
  --alto-control:2.5rem;

  /* Medidas del armazón, en un solo sitio: las leen la rejilla, el hueco que
     deja la barra superior y el borde de arriba del cajón. */
  --topbar:3.5rem;
  --barra-entera-w:15.5rem;
  --barra-w:var(--barra-entera-w);   /* lo que mide la columna AHORA */
  --barra-plegada-w:4.5rem;          /* el riel: 72 px, como el de la web */

  /* LA FLECHA DEL SELECT, dibujada aquí (es el `flecha-abajo` de la
     iconografía común, a 1,8 de trazo; los avisos, `check-circulo` y
     `aviso-error`). La CSP del panel permite `data:` en
     img-src, que es quien gobierna background-image. Sin esto la flecha la
     pone el sistema, en gris de sistema, y rompe el tema. */
  --flecha:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23B09781' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><path d='M6.5 9.25 12 14.75l5.5-5.5'/></svg>");
  --flecha-viva:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23FFC621' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><path d='M6.5 9.25 12 14.75l5.5-5.5'/></svg>");
}

/* ---------- BASE ---------- */
body{
  background:var(--sup-0);
  color:var(--texto-1);
  font-family:'Poppins',system-ui,sans-serif;
  font-weight:300;
  font-size:var(--tipo-cuerpo);
  line-height:1.55;
  -webkit-font-smoothing:antialiased;
}
a{color:inherit;text-decoration:none}
img{max-width:100%;display:block}
[hidden]{display:none !important}

/* El cinturón, por encima de los tirantes de min-width: lo que se desborde,
   que se desborde dentro de su caja. La página nunca se mueve de lado.
   `clip` y no `hidden`: con `hidden` en html y body, el body pasa a ser un
   contenedor de scroll que no se desplaza, y la barra (`position:sticky`) se
   iba con la página (CEO, 21 oct 2026). */
html,body{overflow-x:clip;max-width:100%}

/* EL CORTE TIPOGRÁFICO (CEO, 21 oct 2026; muestrario «Textos 1»): la familia la
   decide el tamaño. ≥ 32 px, Dharma M; por debajo de 32, Poppins 600. El panel usa la escala grande (sin `escala-compacta`), así que
   subtítulo (34→42), numeral (44) y dato (32) son siempre M, y cada regla lo
   pide por su token (`--fuente-subtitulo`/`-numeral`/`-dato` + su
   `--tracking-*`) en vez de nombrar la Dharma a pelo. Lo que baja de 32 px
   (números del calendario, del embudo y del resumen de permisos) va en
   Poppins 600. */
h1,h2{text-transform:uppercase;letter-spacing:.01em}
h1{
  font-family:var(--fuente-display);font-weight:800;
  font-size:var(--tipo-titulo);line-height:.9;
}
h2{
  font-family:var(--fuente-subtitulo);font-weight:700;
  font-size:var(--tipo-subtitulo);line-height:1;letter-spacing:calc(.01em + var(--tracking-subtitulo))
}
/* El titular a dos colores: la segunda parte en amarillo y en su línea. */
h1 em{font-style:normal;color:var(--yellow);display:block}

/* EL ANTETÍTULO es el de componentes.css («03 / Finanzas»); aquí solo el
   aire hasta el titular. */
.eyebrow{margin-bottom:var(--esp-3)}

/* Para el lector de pantalla y para nadie más. `clip` y 1 px, no display:none,
   porque lo que no se pinta tampoco se lee. */
.solo-lectores{
  position:absolute;width:1px;height:1px;overflow:hidden;
  clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;
}

/* ---------- EL FOCO SE VE ----------
   Dos familias: sobre lo plano vale un `outline`; sobre lo biselado el anillo
   va por DENTRO, con el aro de 2 px del mismo escalón que el recorte
   (`--filo-foco-xs/-sm/` en marca.css), porque el `clip-path` se come
   cualquier `outline`. El doble `box-shadow` inset de abajo es solo la reserva
   del navegador que no entiende el `evenodd` del aro.

   `:focus-visible` y no `:focus`, para no dibujarlo al hacer clic con ratón. */
:where(a,button,input,select,summary,[tabindex]):focus-visible{
  outline:2px solid var(--yellow);
  outline-offset:2px;
}
.btn-menu:focus-visible,
.pestana:focus-visible{
  outline:none;
  box-shadow:inset 0 0 0 2px var(--sup-0), inset 0 0 0 4px var(--yellow);
}
/* El contenido recibe el foco al cambiar de pantalla; eso no es una parada de
   tabulación y no debe dibujar un marco alrededor de media página. */
.contenido:focus{outline:none}

/* ============================================================================
   LOS CONTENEDORES, LOS DE LA WEB
   ============================================================================
   Las cajas grandes (ficha, métrica, tarjeta de Inicio, caja de aviso, la de
   entrar y el menú de la cuenta) llevan la clase `.caja` de componentes.css:
   CAPA DOBLE, el fondo del color del contorno y el relleno 1 px por dentro.
   El porqué está allí. Aquí solo los estados y los retoques del panel.

   HASTA EL 28 SEP 2026 esas cajas llevaban el aro `--filo` en un `::after`, y
   el contorno se veía incompleto: en medio píxel los cantos perdían fuerza
   (medido: 55 de 74) y, sin `evenodd`, los chaflanes salían sin raya.

   Lo pequeño —botones, píldoras, chips, hamburguesa— sigue con el aro
   `--filo-*` del escalón de su alto: los botones y las píldoras lo traen de
   componentes.css; aquí van solo los que son del panel. */

/* ⚠ El `@supports` no es decorativo: sin él, un navegador que no entienda el
   `fill-rule` dejaría el `clip-path` del pseudo en `none` y taparía la pieza
   con un rectángulo macizo. */
@supports (clip-path: polygon(evenodd, 0 0, 1px 1px, 0 1px)){
  .btn-menu,.chip,.pestana-activa{position:relative}
  .btn-menu::after,.chip::after{
    content:'';position:absolute;inset:0;pointer-events:none;
    background:var(--filo-color,transparent);
  }
  .btn-menu::after{clip-path:var(--filo-sm)}
  /* El chip mide 32–36 px: su corte es el compacto de 7 px y su aro TIENE que
     ser el mismo (hasta el 28 sep 2026 llevaba 5 px y el contorno no casaba;
     hasta el 16 oct 2026, 9). */
  .chip::after{clip-path:var(--filo-compacto)}

  /* EL FOCO DE LO BISELADO, CON LA FORMA DEL BISEL: el aro pasa a 2 px y a
     amarillo. El de los botones lo pone componentes.css. */
  .btn-menu:focus-visible,.pestana:focus-visible{box-shadow:none}
  .pestana:focus-visible::after{
    content:'';position:absolute;inset:0;pointer-events:none;
    clip-path:var(--filo-foco-sm);background:var(--yellow);
  }
  .btn-menu:focus-visible::after{clip-path:var(--filo-foco-sm);--filo-color:var(--yellow)}
  .chip:has(input:focus-visible)::after{clip-path:var(--filo-foco-compacto)}
}

/* EL FOCO DE UNA CAJA PULSABLE (el atajo del Resumen): contorno amarillo y
   el relleno se retira a 2 px, así se lee como anillo. No necesita
   `evenodd`: es la misma capa doble. */
a.atajo:focus-visible::before{inset:2px}

/* ---------- BOTONES ----------
   Son los de la web (`.btn`, `.btn-primary`, `.btn-ghost`, `.btn-sm` en
   componentes.css). El panel solo les fija la altura de sus controles, para
   que un botón y un campo de la misma fila midan lo mismo. */
.btn{justify-content:center;min-height:var(--alto-control)}
.btn-sm{min-height:var(--btn-sm-alto, auto)}   /* 32: el suelo del botón pequeño (16 oct 2026) */
/* Mientras guarda, el JS ya le cambia el texto a «Guardando…»; esto le añade
   el latido que dice que sigue vivo. */
.btn:disabled{cursor:progress;filter:grayscale(.4) brightness(.8);animation:latido 1.2s ease-in-out infinite}
.btn-discord{width:100%;min-height:3rem}
/* El logo de Discord hereda la tinta del botón (sobre el amarillo, oscura):
   `.ico-discord` de componentes.css lo pinta en --texto-2 para un texto suelto. */
.btn-discord .ico-discord{color:inherit;width:1.5em;height:1.5em}

/* ============================================================================
   EL ARMAZÓN
   ============================================================================
   ⚠ `.app` ES UNA REJILLA CON ÁREAS NOMBRADAS, y todo hijo EN FLUJO se coloca
   en una celda. Los tres que no son la barra superior, la lateral, la
   cabecera delgada ni el contenido —el salto, el velo y el anuncio— están
   FUERA DE FLUJO (fixed o absolute) y por eso no participan. Quitarle el `position` a cualquiera de
   ellos, o añadir un hijo nuevo en flujo, parte el escritorio en columnas
   fantasma. Está avisado también en el HTML.
   ========================================================================== */
.app{
  display:grid;
  grid-template-columns:var(--barra-w) 1fr;
  grid-template-rows:auto auto 1fr;
  grid-template-areas:
    "topbar topbar"
    "barra  cab"
    "barra  contenido";
  min-height:100dvh;
}
/* LA CABECERA DELGADA (CEO, 22 oct 2026; navegacion.js, LATERAL.cabecera):
   la banda de 48 encima del contenido, a la derecha del lateral, con el
   icono y el nombre del módulo. Se pega bajo lo que haya arriba (la franja
   de la demo, o la barra superior donde se ve) y se esconde al bajar. Es su
   propia celda (`cab`): dentro de `.contenido` su `overflow-x` rompería el
   `sticky` e `ir()` la borraría. En el móvil no se pinta (lateral.css): la
   barra superior hace de cabecera. */
.app > .lat-cab{grid-area:cab;--lat-cab-arriba:var(--topbar)}

/* LA COLUMNA DE LA BARRA LLEGA HASTA ABAJO. La barra es pegajosa y mide lo
   que la ventana; en una pantalla más larga que eso, debajo quedaba el lienzo
   y la raya de la derecha se cortaba a media página. El fondo de la columna
   lo pinta la rejilla, en --ink (donde acaba el degradado del lateral). Solo
   en escritorio y solo si hay barra. */
/* SIN BARRA DE ARRIBA CON LATERAL (20 oct 2026, CEO: todo menú lateral
   hereda del home). En escritorio y con barra lateral, la marca es la cabeza
   del lateral y la cuenta está en su pie (navegacion.js), así que la barra
   superior no se pinta y el lateral va a toda la altura. --topbar baja a lo
   que mida la franja de la demo (0 sin demo): lo que se pegaba debajo de la
   barra (el lateral, las cabeceras de las tablas) sube solo. Si algún día
   vuelve el menú de secciones (#areas con dos o más), la barra se queda. */
@media (min-width:960px){
  .app:not(:has(#modulos:empty)){
    background:linear-gradient(90deg,
      var(--ink) calc(var(--barra-w) - 1px), var(--line) 0 var(--barra-w), transparent 0);
  }
  .app:not(:has(#modulos:empty)):has(#areas:empty){--topbar:var(--franja-h, 0px);padding-top:var(--topbar)}
  .app:not(:has(#modulos:empty)):has(#areas:empty) .topbar{display:none}
  html.lateral-visible .topbar-marca{display:none}
}

/* SIN MÓDULOS QUE NAVEGAR, NO HAY BARRA. Las tres pantallas de bloqueo —sin
   alta, sin 2FA y fallo técnico— vacían `#modulos`, y una columna de 15.5rem
   vacía al lado de un mensaje que dice «no puedes pasar» se lee como que el
   panel se quedó a medio cargar. Sin ella, el mensaje ocupa la pantalla y es lo
   único que hay, que es exactamente lo que es. */
/* Y LO MISMO CON UNA SECCIÓN DE UN SOLO MÓDULO (Bot de Discord): panel.js no
   le pinta barra lateral (ver pintarBarra), así que la pantalla va entera.
   En móvil el cajón se queda si tiene el menú de secciones: es la única forma
   de cambiar de sección en un teléfono. */
.app:has(#modulos:empty){grid-template-columns:1fr;grid-template-areas:"topbar" "cab" "contenido"}
@media (min-width:960px){ .app:has(#modulos:empty) .barra{display:none} }
@media (max-width:959.98px){ .app:has(#modulos:empty):has(#areas-cajon:empty) .barra{display:none} }

/* `min-width:0` EN LOS HIJOS DE LA REJILLA, Y NO ES DECORATIVO.
   Un hijo de grid vale `min-width:auto` por defecto, o sea «al menos lo que
   mida mi contenido»: así, un `overflow-x:auto` de dentro no llega a
   dispararse nunca — la columna crece en vez de recortar, y lo que se desborda
   es la PÁGINA. Se vio midiendo el documento a 390 px de ancho: 934 px, con la
   barra de ocho módulos empujando por debajo. Con esto, cada uno recorta lo
   suyo y el `body` no se mueve. */
.barra,
.contenido,
.topbar{min-width:0}

/* ---------- SALTAR AL CONTENIDO ----------
   Primer foco de la página. Con ocho módulos en la barra, llegar al contenido
   tabulando son nueve pulsaciones cada vez. Nace fuera de pantalla con un
   transform —no con display:none, que lo sacaría del orden de tabulación— y
   aparece al enfocarlo. */
.salto{
  position:fixed;z-index:60;
  top:max(var(--esp-2),env(safe-area-inset-top));left:var(--esp-2);
  background:var(--yellow);color:var(--sobre-amarillo);
  font-size:var(--tipo-control);font-weight:600;letter-spacing:.1em;text-transform:uppercase;
  padding:var(--esp-3) var(--esp-4);clip-path:var(--bevel-sm);
  transform:translateY(-250%);transition:transform var(--t-rapido) ease;
}
.salto:focus{transform:none}

/* ---------- LA BARRA SUPERIOR ----------
   Solo donde no hay lateral (20 oct 2026: en escritorio con lateral no se
   pinta, ver «SIN BARRA DE ARRIBA CON LATERAL»):

     · En ESCRITORIO SIN LATERAL (las pantallas de bloqueo, una sección de un
       solo módulo) es la banda de identidad y de sesión: la marca y la
       cuenta (el avatar con su menú, ver cuenta.js), que ahí es la salida.
     · En MÓVIL lleva además la hamburguesa.

   Va por encima del cajón (z-index) a propósito: con el cajón abierto la X
   sigue visible y pulsable, que es mejor salida que una franja de velo. */
.topbar{
  grid-area:topbar;
  position:sticky;top:0;z-index:45;
  display:flex;align-items:center;gap:var(--esp-3);
  height:calc(var(--topbar) + env(safe-area-inset-top));
  padding:env(safe-area-inset-top) max(var(--esp-4),env(safe-area-inset-right))
          0 max(var(--esp-4),env(safe-area-inset-left));
  background:var(--sup-1);
  box-shadow:inset 0 -1px 0 var(--line);
}
/* El imagotipo a la altura del de la barra de la web, sin sello (20 oct
   2026: el «PANEL» de al lado se fue, el home no lo lleva). */
.topbar-marca{
  display:flex;align-items:center;flex:0 0 auto;
}
.topbar-marca img{height:1.5rem;width:auto}
/* EL MENÚ DE SECCIONES (Administración · Bot de Discord): el `.nav-paginas`
   de la web (componentes.css), con la raya amarilla en la sección en la que
   estás. Ocupa el alto de la barra para que la raya caiga en su canto, y
   empuja la cuenta a la derecha. En móvil se esconde y aparece arriba del
   cajón (`.barra-areas`). */
.topbar-areas{margin-left:calc(var(--esp-4) * 2)}
.topbar-areas:empty{display:none}
.cuenta{margin-left:auto}
.barra-areas{display:none}
/* LA CAMPANA DE LA CABECERA (S3, 20 oct 2026; modulos/bandeja.js): solo con la
   barra convertida en cajón, donde el número de la fila no se ve. En
   escritorio la fila de la barra ya lleva la cifra: dos campanas a la vez
   serían lo mismo dos veces. Va pegada a la cuenta. */
.campana-cab.es-movil{margin-left:auto}
.campana-cab.es-movil + .cuenta{margin-left:0}
/* Desde el corte del móvil (960), no desde 896: entre los dos no había ni
   lateral ni campana, y con el dock la Bandeja solo está aquí. */
@media (min-width:960px){ .campana-cab.es-movil{display:none} }
/* En un teléfono estrecho la barra no da para la marca con su etiqueta, la
   campana y el avatar: se va la etiqueta «Panel» (la marca ya dice dónde
   estás) y el aire de los bordes baja un escalón. Sin esto el avatar se
   salía de la pantalla. */
@media (max-width:26rem){
  .topbar-sello{display:none}
  .topbar{padding-left:max(var(--esp-3),env(safe-area-inset-left));padding-right:max(var(--esp-3),env(safe-area-inset-right))}
}

/* ---------- LA CUENTA: EL AVATAR Y SU MENÚ ----------
   El botón y el menú son los del home: `.cuenta-*` en componentes.css, con el
   menú en caja biselada de capa doble y sin sombra. Aquí solo lo que el panel
   añade: el nombre de pila en el chip (la barra tiene sitio y trabajan varias
   personas), la inicial si no hay avatar, y la leyenda bajo «Cerrar sesión»,
   que aquí cierra todas las sesiones (ver sesion.js). */
.topbar{--btn-h:var(--alto-control)}
.cuenta{min-width:0}
.cuenta-boton{gap:var(--esp-2);padding:0 var(--esp-3) 0 var(--esp-2)}
.cuenta-boton[aria-expanded="true"]{--filo-color:var(--yellow)}
.cuenta-inicial{
  width:1.625rem;height:1.625rem;border-radius:50%;flex:none;
  display:grid;place-items:center;background:var(--sup-2);
  font-size:var(--tipo-leyenda);font-weight:600;color:var(--yellow);
}
.cuenta-corto{max-width:9rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cuenta-menu{min-width:15rem;max-width:calc(100vw - 2 * var(--esp-4))}
/* Sin outline, el foco del teclado se ve por el fondo y por la raya. */
.cuenta-item:focus-visible{box-shadow:inset 3px 0 0 var(--yellow)}
.cuenta-salir{border-top:1px solid var(--line);margin-top:var(--esp-1)}

/* La hamburguesa. El mismo dibujo que la de la web pública (base.css): tres
   barras de 2 px con 5 de hueco, y por eso el translateY(7px) de la X cuadra.
   44×44 porque es el mínimo que se acierta con el pulgar sin mirar. */
.btn-menu{
  display:none;flex-direction:column;justify-content:center;gap:5px;
  width:2.75rem;height:2.75rem;padding:0 var(--esp-3);flex:0 0 auto;
  background:var(--velo-1);--filo-color:var(--line);box-shadow:inset 0 0 0 1px var(--filo-borde, var(--filo-color));
  clip-path:var(--bevel-sm);border:0;cursor:pointer;
}
.btn-menu span{
  display:block;height:2px;width:100%;background:var(--texto-1);
  transition:transform var(--t-lento) var(--curva),opacity var(--t-medio) ease;
}
.btn-menu[aria-expanded="true"] span:nth-child(1){transform:translateY(7px) rotate(45deg)}
.btn-menu[aria-expanded="true"] span:nth-child(2){opacity:0}
.btn-menu[aria-expanded="true"] span:nth-child(3){transform:translateY(-7px) rotate(-45deg)}

/* ---------- EL VELO ----------
   Solo en móvil. `visibility` y no `display`, para que la opacidad se pueda
   animar; y la visibility con retardo igual a la transición, para que no
   desaparezca de golpe a mitad del cierre. Cerrado, no lo alcanza ni el dedo
   ni el tabulador. */
.velo{
  position:fixed;inset:0;z-index:30;
  background:rgba(23,17,13,.72);
  opacity:0;visibility:hidden;
  transition:opacity var(--t-medio) ease,visibility 0s linear var(--t-medio);
}

/* EL FONDO NO SE MUEVE MIENTRAS EL CAJÓN ESTÁ ABIERTO. La clase la pone
   navegacion.js, que además guarda y devuelve la posición: `overflow:hidden` a
   secas no basta en Safari, que sigue arrastrando el documento por debajo. */
body.sin-scroll{position:fixed;left:0;right:0;width:100%;overflow:hidden}

/* ---------- LA BARRA LATERAL · la del home (20 oct 2026, CEO) ----------
   Todo menú lateral hereda del home (/muestra, «Maquetación 7»): el fondo,
   el filo, la cabeza, el pie, la pestaña «/», los títulos, las filas y la
   marca son los comunes (`.lat` y `.lat-*` de assets/comun/lateral.css,
   copia de assets/lateral.css). Aquí, la columna (248 entera, 72 en riel),
   lo que va en el pie (la cuenta) y el cajón del móvil. La lista se
   desplaza DENTRO (#modulos, .lat-nav) con la barra de la marca, y la barra
   no recorta: la pestaña asoma por el filo. Las filas encogen con la
   columna y recortan su nombre: el icono no se mueve (x 26–46). */
.barra{
  grid-area:barra;
  display:flex;flex-direction:column;
  position:sticky;top:var(--topbar);
  height:calc(100dvh - var(--topbar));
}
.barra .lat-nav{padding:.5rem 0 .75rem}

/* PLEGAR LA BARRA (16 oct 2026, regla del COO: todo menú lateral se
   pliega, igual que el de la web). Lo lleva assets/comun/lateral.js, que
   deja en el <html> `lateral-entero` o `lateral-riel` antes de pintar: riel
   de serie por debajo de 1366, fijarlo abierto solo desde 1152 (por debajo,
   la pestaña y la tecla «[» lo abren ENCIMA), y nada en móvil, que tiene su
   cajón. --barra-w se registra como longitud; ya NO se anima (17 oct 2026:
   la columna cambia de golpe, el ancho de la barra se anima con su
   `transition` y el contenido vuelve a su sitio en el compositor, ver
   assets/comun/lateral.js). */
@property --barra-w{syntax:'<length>';inherits:true;initial-value:15.5rem}
@media (min-width:960px){
  html.lateral-riel{--barra-w:var(--barra-plegada-w)}
  .barra{width:var(--barra-w);z-index:25;transition:width var(--t-medio) var(--curva);
    /* LA ESCALA DEL LATERAL ES LA DEL HOME: el panel no lleva `escala-compacta`,
       pero `.barra` está en la lista de su regla en marca.css (los ocho tamaños
       de lo pequeño, sin copia aquí). Solo el dato, que es de otro escalón. */
    --tipo-dato:1.125rem;
    --fuente-dato:var(--fuente-titular);--tracking-dato:var(--tracking-titular)}
  html.lateral-riel .barra.desplegado{width:var(--barra-entera-w)}
  /* El fondo de la marca empieza donde acaba la columna de la barra, que
     es opaca: si no, las piezas de la izquierda quedarían debajo. */
  html.lateral-visible .fondo-marca{--fondo-izq:var(--barra-w)}
}
/* En móvil el cajón no lleva cabeza ni pie: la marca y la cuenta están en la
   barra de arriba. */
@media (max-width:959.98px){ .barra .barra-cabeza,.barra .barra-pie{display:none} }

/* ---------- LA CUENTA EN EL PIE DEL LATERAL (20 oct 2026) ----------
   El chip de 56 del home (`.mc-boton`, assets/marco.css): el retrato de 44
   (sin anillo de XP: el panel no tiene niveles; un aro --line en su lugar),
   el nombre entero y la flecha; el menú se abre HACIA ARRIBA, a lo ancho del
   pie. Plegado, el chip se queda en 56 con el retrato en el centro del riel
   (x 14–58), el nombre sale en la etiqueta amarilla y el menú se abre AL
   LADO. El pie mide lo mismo en los dos modos. Fuera del pie (arriba a la
   derecha), el retrato y el nombre largo no existen como caja. */
.cuenta-retrato{display:contents}
.cuenta-largo{display:none}
.barra-pie .cuenta{display:block;position:relative;width:100%;margin:0}
.barra-pie .cuenta-boton{
  width:100%;height:3.5rem;gap:.625rem;justify-content:flex-start;
  padding:.375rem .625rem .375rem .375rem;
  font-size:var(--tipo-descripcion);font-weight:600;letter-spacing:0;text-transform:none;color:var(--texto-1);
  background:rgba(242,232,220,.04);overflow:hidden;white-space:nowrap;
}
.barra-pie .cuenta-boton:hover,.barra-pie .cuenta-boton[aria-expanded="true"]{background:rgba(242,232,220,.08);--filo-color:var(--yellow-bajo)}
.barra-pie .cuenta-retrato{display:grid;place-items:center;flex:none;width:2.75rem;height:2.75rem;border-radius:50%;
  box-shadow:inset 0 0 0 2px var(--line)}
.barra-pie .cuenta-retrato .cuenta-avatar,.barra-pie .cuenta-retrato .cuenta-inicial{width:2.1875rem;height:2.1875rem}
.barra-pie .cuenta-retrato .cuenta-inicial{font-size:var(--tipo-descripcion)}
.barra-pie .cuenta-corto{display:none}
/* La cabecera de la hoja de la cuenta en el móvil (assets/lateral.css): el
   mismo retrato de 44 y el nombre largo que el chip del pie. */
.lat-hoja-cabecera .cuenta-retrato{display:grid;place-items:center;flex:none;width:2.75rem;height:2.75rem;border-radius:50%;
  box-shadow:inset 0 0 0 2px var(--line)}
.lat-hoja-cabecera .cuenta-avatar,.lat-hoja-cabecera .cuenta-inicial{width:2.1875rem;height:2.1875rem}
.lat-hoja-cabecera .cuenta-inicial{font-size:var(--tipo-descripcion)}
.lat-hoja-cabecera .cuenta-corto{display:none}
.lat-hoja-cabecera .cuenta-largo{display:block;flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis}
.barra-pie .cuenta-largo{display:block;flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;text-align:left;
  transition:opacity .18s ease var(--lat-retraso, 0s)}
.barra-pie .cuenta-boton .cuenta-chevron{transform:rotate(180deg);transition:opacity .18s ease var(--lat-retraso, 0s)}
.barra-pie .cuenta-boton[aria-expanded="true"] .cuenta-chevron{transform:none}
.barra-pie .cuenta-menu{top:auto;bottom:calc(100% + .5rem);left:0;right:0;min-width:0}
@media (min-width:960px){
  html.lateral-riel .barra:not(.desplegado) .cuenta-largo,
  html.lateral-riel .barra:not(.desplegado) .barra-pie .cuenta-chevron{opacity:0;transition:none}
  html.lateral-riel .barra:not(.desplegado) .barra-pie .cuenta-menu{left:calc(100% + .75rem);right:auto;bottom:0;width:13.5rem}
}
@media (prefers-reduced-motion: reduce){ .barra-pie .cuenta-largo,.barra-pie .cuenta-chevron{transition:none} }

/* El icono del módulo (14 oct 2026) en su sitio; sin icono, el número. */
.mod-num{display:inline-flex;align-items:center;justify-content:center;
  font-weight:600;font-variant-numeric:tabular-nums;font-size:var(--tipo-control)}

/* El sello de los módulos que aún no existen. En la barra, para que se sepa
   antes de entrar; dentro, la pantalla lo explica. */
/* Una etiqueta secundaria (el muestrario, «Componentes 1»): el tamaño de
   todas, el corte de 5 px, y el nivel lo da el estilo, nunca el tamaño. */
.mod-sello{
  font-size:var(--tipo-etiqueta);font-weight:600;text-transform:uppercase;letter-spacing:.14em;
  color:var(--texto-3);background:var(--sup-0);
  padding:var(--esp-1) var(--esp-2);clip-path:var(--bevel-xs);
}

/* El margen lateral, un 25 % más (CEO, 21 oct 2026; antes 40 · 16): 50 · 20.
   ARRIBA, --inicio-pagina (CEO, 22 oct 2026): de la cabecera al antetítulo,
   lo mismo que en la web y en el Dashboard. */
.contenido{
  grid-area:contenido;
  padding:var(--inicio-pagina) 3.125rem var(--esp-bloque);
  overflow-x:hidden;
}
/* Sin tope de ancho (14 oct 2026): con `max-width:80rem` el módulo se quedaba
   a la izquierda y en una pantalla ancha dejaba media pantalla vacía a la
   derecha. Ahora ocupa todo lo que deja la barra; los textos largos siguen
   cortados por su propio `ch`, así que no se hacen ilegibles. */

/* ---------- PANTALLAS ----------
   La cabecera de cada módulo es la de cualquier sección de la web:
   antetítulo numerado → titular → bajada, con sus tres tokens (la arma
   P.cabecera() en panel.js). Hasta el 28 sep 2026 era un trazo amarillo sin
   texto encima del nombre del módulo, que repetía lo que ya decía la barra. */
.pantalla-cabecera{margin-bottom:var(--esp-cabecera)}
.pantalla-cabecera h1{color:var(--texto-1)}
.pantalla-sub{
  color:var(--texto-2);font-size:var(--tipo-descripcion);line-height:1.6;
  margin-top:var(--esp-3);max-width:60ch;
}

/* Las pestañas dejan de ser un subrayado y ganan cuerpo: la activa tiene
   fondo, bisel y la raya dentro. La raya va en box-shadow inset y no en
   border-bottom porque el bisel se comería el borde justo en la esquina
   cortada. En móvil se deslizan, sin barra de scroll a la vista: son cuatro
   botones, no una región de desplazamiento. */
.pestanas{
  display:flex;gap:var(--esp-1);
  border-bottom:1px solid var(--line);
  margin-bottom:var(--esp-rejilla);
  overflow-x:auto;scrollbar-width:none;
}
.pestanas::-webkit-scrollbar{display:none}
/* Una sola pestaña no es una elección: repetía el título de la ficha que
   tiene debajo («Consultar» y «CONSULTAR»). Se esconde. */
.pestanas:has(> .pestana:only-child){display:none}

.pestana{
  position:relative;flex:0 0 auto;
  font-family:inherit;font-size:var(--tipo-control);font-weight:500;
  letter-spacing:.1em;text-transform:uppercase;
  background:transparent;border:0;color:var(--texto-2);
  padding:0 var(--esp-4);min-height:var(--alto-control);cursor:pointer;
  transition:background var(--t-rapido) var(--curva),
             color      var(--t-rapido) var(--curva);
}
.pestana:hover{background:var(--velo-1);color:var(--texto-1)}
/* 40 px de alto: el escalón del chip, `--bevel-sm` (antes 6 px). */
.pestana-activa{
  color:var(--yellow);background:var(--sup-2);font-weight:600;
  clip-path:var(--bevel-sm);
  box-shadow:inset 0 -3px 0 var(--yellow);
}
.pestanas .pestana-activa:focus-visible{box-shadow:inset 0 -3px 0 var(--yellow)}

/* ---------- CARGANDO: LA PIEZA COMÚN (16 oct 2026, CEO) ----------
   Ya no son barras que respiran ni «Un momento…»: es assets/carga.js (la
   Trufacoin que gira, en /assets/comun/), con sus estilos en componentes.css.
   panel.js la envuelve en dos tamaños (P.cargando y P.cargandoMini): aquí
   solo va el hueco que ocupa cada uno. El de módulo se centra en el área
   libre como cualquier estado (ver «EL ESTADO QUE OCUPA LA PANTALLA»). */
.cargando{display:flex;flex-direction:column;margin:var(--esp-rejilla) 0}
.cargando > .carga{--estado-alto:14rem}
.cargando-fila{display:flex;justify-content:center;margin:var(--esp-rejilla) 0}
.cargando-fila .carga-texto{font-size:var(--tipo-leyenda)}

/* ---------- EL ESTADO QUE OCUPA LA PANTALLA (16 oct 2026, CEO) ----------
   Bloqueos («Vuelve a entrar», 2FA, sin alta…), «Próximamente» y la carga
   del arranque van centrados EN LOS DOS EJES del área libre (bajo la barra
   y al lado del lateral), como la pantalla de entrar, nunca pegados arriba.
   `.contenido` ya mide todo el alto que deja la barra (la fila 1fr de
   `.app`): con un estado dentro se vuelve columna y el estado se estira a lo
   que quede debajo del antetítulo. */
.contenido:has(> .estado-centro, > .cargando:only-child){display:flex;flex-direction:column}
/* Abajo, el mismo aire que arriba: con el relleno grande de serie el
   centro quedaba unos píxeles por encima del de la pantalla. */
.contenido:has(> .estado-centro, > .cargando:only-child){padding-bottom:var(--esp-caja)}
@media (max-width:959.98px){
  .contenido:has(> .estado-centro, > .cargando:only-child){
    padding-bottom:calc(var(--esp-rejilla) + env(safe-area-inset-bottom))}
}
.contenido > .estado-centro{--estado-alto:0px;padding-inline:0}
.contenido > .cargando:only-child{flex:1 1 auto;margin:0}
.contenido > .cargando:only-child > .carga{--estado-alto:0px;flex:1 1 auto}

/* ---------- AVISOS ----------
   LOS ERRORES NO DESAPARECEN SOLOS. Los mensajes de error de este panel
   vienen de Postgres —«No puedes cambiar tus propios roles…»— y están
   escritos para leerse. Un aviso que se esfuma en tres segundos obliga a
   repetir la acción para volver a leerlo. Se cierran con ✕ o Escape, o al
   cambiar de módulo. Los buenos («Guardado») sí se van solos, a los 4 s.
   Desde el 3 oct 2026 flotan abajo: ver «LOS AVISOS FLOTAN», más abajo.

   El icono va en `data:` —legal con la CSP por `img-src … data:`— y no en
   emoji, que cambia de dibujo en cada sistema operativo. */
.aviso-zona:empty{display:none}
.aviso-error,.aviso-ok{
  display:grid;grid-template-columns:1.15rem 1fr;gap:.7rem;align-items:start;
  /* Un mensaje del servidor puede traer una cadena larga sin espacios (un
     código, una URL); sin esto la cortaba `.contenido{overflow-x:hidden}`. */
  overflow-wrap:anywhere;
  font-size:var(--tipo-descripcion);line-height:1.55;color:var(--texto-1);
  padding:var(--esp-3) var(--esp-4);margin-bottom:var(--esp-4);
  background:var(--sup-1);
  border-left:3px solid var(--gris-3);
  animation:entra-aviso var(--t-medio) var(--curva) both;
}
/* El error vive en la gama gris (el muestrario, «Color y ambiente 1 · Color»): avisa y no
   se pulsa. El bueno, con la raya en amarillo. */
.aviso-error{background:var(--gris-1);border-left-color:var(--gris-3)}
.aviso-ok{border-left-color:var(--yellow)}
.aviso-error::before,.aviso-ok::before{
  content:'';width:1.15rem;height:1.15rem;margin-top:.1rem;
  background-repeat:no-repeat;background-size:contain;
}
.aviso-error::before{
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%239A938D' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='9'/><path d='M12 7.5v5M12 16.2h.01'/></svg>");
}
.aviso-ok::before{
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23FFC621' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='9'/><path d='M8 11.7l3 3 5-5.4'/></svg>");
}

/* LOS AVISOS FLOTAN (3 oct 2026). P.avisar (panel.js) ya no los pone arriba
   del módulo ni sube la página: van en una pila abajo a la derecha (en el
   móvil, abajo y a lo ancho), dentro de un popover para verse también sobre
   un <dialog> abierto. Cada uno es una `.caja` (contorno completo en los
   chaflanes) con el `.aviso-ok`/`.aviso-error` de siempre dentro, sin su
   margen ni su fondo, y un ✕. El bueno se va solo; el error, con ✕ o Esc. */
.avisos{
  /* Encima del dock del móvil (--dock-h, assets/comun/lateral.css; 0 sin él). */
  position:fixed;inset:auto var(--esp-4) calc(var(--esp-4) + max(env(safe-area-inset-bottom), var(--dock-h, 0px))) auto;
  margin:0;padding:0;border:0;background:none;overflow:visible;color:inherit;
  width:min(26rem, calc(100vw - 2 * var(--esp-4)));z-index:90;
  display:flex;flex-direction:column;gap:var(--esp-2);pointer-events:none;
}
.avisos:not(:popover-open):empty{display:none}
.aviso-flota{
  pointer-events:auto;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:start;
  --caja-fondo:var(--sup-2);
  animation:sube-aviso var(--t-medio) var(--curva) both;
  transition:opacity var(--t-medio) var(--curva),translate var(--t-medio) var(--curva);
}
.aviso-flota:has(.aviso-ok){--filo-color:var(--yellow-bajo)}
.aviso-flota .aviso-ok,.aviso-flota .aviso-error{margin:0;background:none;border-left:0;animation:none;
  padding:var(--esp-3) 0 var(--esp-3) var(--esp-4)}
.aviso-flota.aviso-sale{opacity:0;translate:0 var(--esp-2)}
.aviso-cerrar{
  background:none;border:0;cursor:pointer;color:var(--texto-3);font:inherit;font-size:var(--tipo-descripcion);
  line-height:1;padding:var(--esp-3) var(--esp-4);
}
/* Un aviso con acción («Deshacer»): el texto, la acción en amarillo y el ✕. */
.aviso-flota.aviso-con-accion{grid-template-columns:minmax(0,1fr) auto auto;align-items:center}
.aviso-accion{
  background:none;border:0;cursor:pointer;font:inherit;font-size:var(--tipo-descripcion);font-weight:600;
  color:var(--yellow);padding:var(--esp-3) var(--esp-2);white-space:nowrap;clip-path:var(--bevel-xs);
}
.aviso-acciones{display:flex;align-items:center}
.aviso-accion:hover{background:var(--velo-2)}
.aviso-accion:focus-visible{outline:2px solid var(--yellow);outline-offset:-4px}
.aviso-cerrar:hover{color:var(--texto-1)}
.aviso-cerrar:focus-visible{outline:2px solid var(--yellow);outline-offset:-6px}
@media (max-width:520px){
  .avisos{inset:auto var(--esp-4) calc(var(--esp-4) + max(env(safe-area-inset-bottom), var(--dock-h, 0px))) var(--esp-4);width:auto}
}
@media (prefers-reduced-motion: reduce){
  .aviso-flota{animation:none;transition:none}
}

/* ---------- FICHAS (los formularios) ---------- */
.ficha{padding:var(--esp-caja);margin-bottom:var(--esp-bloque)}
/* La cabecera de la ficha se separa del cuerpo con una regla, y el título deja
   de flotar sobre catorce campos. Es un título de caja: la M a
   `--tipo-subtitulo` (panel), como el de una tarjeta de evento en la web. */
.ficha > h2{
  color:var(--texto-1);
  padding-bottom:var(--esp-3);margin-bottom:var(--esp-4);
  border-bottom:1px solid var(--linea-suave);
}
.ficha-nota{color:var(--texto-2);font-size:var(--tipo-descripcion);line-height:1.55;margin-bottom:var(--esp-4);max-width:62ch}
.ficha > h2 + .ficha-nota{margin-top:calc(var(--esp-3) * -1)}
/* Un párrafo suelto en el cuerpo de la pantalla —los de Permisos y Accesos en
   personal.js— deja de parecer una nota al pie perdida. */
.pantalla-cuerpo > .ficha-nota{
  max-width:62ch;margin-bottom:var(--esp-rejilla);
  padding-left:var(--esp-3);border-left:2px solid var(--line);
}

/* DE FLEX A REJILLA, y no es cosmético. Con flex-wrap, catorce campos de
   anchos distintos dejan una fila con dos columnas anchas y la siguiente con
   cuatro estrechas; en rejilla las columnas coinciden de fila a fila y el
   formulario de finanzas se lee como una tabla en vez de como un muro. */
.ficha-fila{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));
  gap:var(--esp-3);
  align-items:end;
  margin-bottom:var(--esp-4);
}
.ficha-fila:last-child{margin-bottom:0}
/* Una fila que solo lleva un botón no necesita una columna de 11rem. */
.ficha-fila:has(> .btn:only-child){grid-template-columns:auto;justify-content:start}
/* Y un botón que comparte fila con campos —el «Dar de alta» de personal.js—
   ocupa lo que mide, no la columna entera: un botón de 30 cm de ancho parece
   un error de maqueta. */
.ficha-fila > .btn{justify-self:start}

.campo{display:flex;flex-direction:column;gap:var(--esp-1);min-width:0}
/* Un rótulo (`--tipo-rotulo`), no un antetítulo: el nombre de un campo. */
.campo-nombre{
  font-size:var(--tipo-rotulo);font-weight:600;text-transform:uppercase;
  letter-spacing:.12em;color:var(--texto-3);
  transition:color var(--t-rapido) var(--curva);
}
/* El nombre del campo se enciende con el campo: ayuda a ubicarse en un
   formulario de diecisiete. */
.campo:focus-within .campo-nombre{color:var(--yellow)}

.ficha-fila input:where(:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color])),.ficha-fila select,
.campo input:where(:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color])),.campo select,.celda-campo{
  font-family:inherit;font-size:var(--tipo-descripcion);
  color:var(--texto-1);background-color:var(--sup-0);
  border:1px solid var(--line);
  height:var(--alto-control);padding:0 var(--esp-3);
  width:100%;min-width:0;
  transition:border-color var(--t-rapido) var(--curva),
             background   var(--t-rapido) var(--curva),
             box-shadow   var(--t-rapido) var(--curva);
}
.ficha-fila input:where(:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color]))::placeholder{color:var(--brown)}   /* decorativo, no es dato */
.ficha-fila input:where(:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color])):hover,.campo input:where(:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color])):hover,.celda-campo:hover,
.ficha-fila select:hover,.campo select:hover{border-color:var(--texto-3)}

/* `:focus` y no `:focus-visible` en los campos, a propósito: quien hace clic
   en una caja espera ver dónde está escribiendo. El halo amarillo es lo que
   hace que el campo activo destaque en una fila de cuatro. */
.ficha-fila input:where(:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color])):focus,.campo input:where(:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color])):focus,.celda-campo:focus,
.ficha-fila select:focus,.campo select:focus{
  outline:none;
  border-color:var(--yellow);
  background-color:var(--sup-1);
  box-shadow:0 0 0 3px var(--velo-vivo);
}

/* INVÁLIDO SOLO DESPUÉS DE TOCARLO. `:invalid` a secas marca los ocho
   campos obligatorios de finanzas nada más abrir el formulario, que es
   exactamente el regaño que nadie pidió. `:user-invalid` solo salta cuando la
   persona ya intentó enviar o ya salió del campo. */
.ficha-fila input:where(:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color])):user-invalid,.campo input:where(:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color])):user-invalid,.celda-campo:user-invalid,
.ficha-fila select:user-invalid,.campo select:user-invalid{
  border-color:var(--gris-3);
  box-shadow:0 0 0 3px var(--velo-alerta);
}

/* Un campo de solo lectura se ve distinto sin dejar de leerse: en finanzas el
   importe en dólares se copia solo cuando el comprobante ya viene en dólares, y
   quien mira tiene que entender por qué no lo deja escribir. */
.ficha-fila input:where(:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color]))[readonly],.campo input:where(:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color]))[readonly]{
  color:var(--texto-3);background:var(--velo-1);
  border-style:dashed;border-color:var(--linea-suave);
  cursor:default;box-shadow:none;
}
.ficha-fila input:where(:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color]))[readonly]:focus{box-shadow:none;border-color:var(--texto-3)}

/* EL SELECT, CON FLECHA PROPIA. `appearance:none` obliga a reservar el sitio
   de la flecha con padding. Los optgroup de las categorías de finanzas
   agradecen los dos últimos pares de reglas. */
.ficha-fila select,.campo select{
  appearance:none;-webkit-appearance:none;
  padding-right:2.2rem;
  background-image:var(--flecha);
  background-repeat:no-repeat;
  background-position:right .5rem center;
  background-size:22px 22px;
}
.ficha-fila select:hover,.campo select:hover,
.ficha-fila select:focus,.campo select:focus{background-image:var(--flecha-viva)}
/* El chevron del menú de cuenta es un `.icono` (iconos.js): `.icono` pesa lo
   mismo que `.cuenta-chevron` y viene después, así que aquí se le devuelve
   su medida. */
.cuenta-boton .cuenta-chevron{width:12px;height:12px}
.ficha-fila select option,.campo select option{background:var(--sup-1);color:var(--texto-1)}
.ficha-fila select optgroup,.campo select optgroup{background:var(--sup-0);color:var(--texto-3)}

.ficha-mas{margin:var(--esp-2) 0 var(--esp-4)}
.ficha-mas summary{
  display:inline-flex;align-items:center;gap:.45rem;
  min-height:var(--alto-control);
  cursor:pointer;color:var(--texto-2);font-size:var(--tipo-descripcion);
}
.ficha-mas summary:hover{color:var(--texto-1)}
/* EL TRIÁNGULO PROPIO, Y NO ES UN CAPRICHO: poner `display` a un <summary>
   distinto de `list-item` le quita el que dibuja el navegador, y sin marca
   ninguna «Más campos» se lee como un texto muerto en vez de como algo que se
   abre. Se dibuja con un borde girado —dos líneas— y gira 90° al abrirse. */
.ficha-mas summary::marker,
.ficha-mas summary::-webkit-details-marker{content:'';display:none}
.ficha-mas summary::before{
  content:'';flex:0 0 auto;width:.4rem;height:.4rem;
  border-right:2px solid var(--yellow);border-bottom:2px solid var(--yellow);
  transform:rotate(-45deg);margin-right:.1rem;
  transition:transform var(--t-medio) var(--curva);
}
.ficha-mas[open] summary::before{transform:rotate(45deg)}
.ficha-mas[open] summary{margin-bottom:var(--esp-2)}

/* Una casilla dentro de una fila de ficha NO es un campo de texto: ni crece ni
   reserva una columna entera. */
.ficha-fila .chip{justify-self:start;align-self:end}
.ficha-fila .chip input{flex:0 0 auto}

/* ---------- TABLAS ----------
   LA TABLA PIERDE SU CAJA, y es la decisión que hace aparecer la jerarquía sin
   añadir un solo color: sin fondo sobre el lienzo, la ficha de formulario pasa
   a ser lo único levantado de la pantalla. */
.tabla{width:100%;border-collapse:collapse;font-size:var(--tipo-descripcion);margin-bottom:var(--esp-bloque)}

/* CABECERA PEGAJOSA. El scroll es el del documento, así que `top` se mide
   contra la ventana y hay que descontar la barra superior.
   ⚠ La línea de abajo va en box-shadow inset y NO en border-bottom: con
   `border-collapse:collapse` el borde de un th pegajoso se queda atrás al
   hacer scroll y deja un hilo flotando a media tabla. */
.tabla th{
  position:sticky;top:var(--topbar);z-index:2;
  background:var(--sup-0);
  text-align:left;padding:var(--esp-3);
  font-size:var(--tipo-rotulo);font-weight:600;text-transform:uppercase;letter-spacing:.12em;
  color:var(--texto-3);
  box-shadow:inset 0 -1px 0 var(--brown);
  border-bottom:0;
}
.tabla td{text-align:left;padding:var(--esp-3);vertical-align:top;border-bottom:1px solid var(--linea-suave);
  /* Una descripción larga, una IPv6 o un código sin espacios se parten en vez
     de salirse: `.contenido{overflow-x:hidden}` los cortaba sin scroll. */
  overflow-wrap:anywhere}

/* CEBRA, SÍ, PERO AL 2,5 %. En una tabla de seis columnas con importes a la
   derecha y descripciones a la izquierda, el ojo pierde la fila. A este nivel
   no se ve como rayas: se ve como que las filas se siguen solas. */
.tabla tbody tr:nth-child(even){background:var(--velo-3)}
.tabla tbody tr{transition:background var(--t-rapido) var(--curva)}
.tabla tbody tr:hover{background:var(--velo-2)}
/* Las filas de separación por módulo no son datos y no reaccionan. */
.tabla tbody tr.fila-modulo:hover{background:var(--sup-1)}

.tabla td strong{font-weight:500;color:var(--texto-1)}
.dato-menor{display:block;color:var(--texto-3);font-size:var(--tipo-leyenda);line-height:1.4;margin-top:var(--esp-1)}
/* tabular-nums alinea las columnas de importes aunque cambien de ancho: la
   coma decimal cae siempre en el mismo sitio. */
.tabla td.num{
  text-align:right;white-space:nowrap;
  font-variant-numeric:tabular-nums;font-feature-settings:'tnum' 1;
}
.tabla td.num strong{font-weight:600;color:var(--texto-1)}

/* VACÍA CON AIRE, y con la trama diagonal de la marca. */
.tabla-vacia{
  color:var(--texto-3);font-style:normal;text-align:center;
  padding:var(--esp-bloque) var(--esp-4);
  background:repeating-linear-gradient(-45deg,var(--velo-1) 0 8px,transparent 8px 16px);
}
/* Sin el cuadrado de encima (14 oct 2026): era un bloque vacío de adorno,
   sin icono dentro, y se leía como un fallo de carga en el centro de la tabla. */

.tabla-rejilla{white-space:nowrap;
  /* También en escritorio se desliza dentro de su caja: con más roles, las
     columnas de la derecha quedaban cortadas y no había forma de llegar. */
  display:block;max-width:100%;overflow-x:auto;overscroll-behavior-x:contain}
.tabla-rejilla td{overflow-wrap:normal}
/* Dentro de una caja que se desliza, la cabecera pegajosa de `.tabla th`
   (`top: var(--topbar)`) se mide contra ESA caja y no contra la página: bajaba
   la altura de la barra y tapaba el primer módulo y su primera fila. Aquí la
   cabecera va quieta, y lo que se queda fijo al deslizar de lado es la columna
   del permiso. */
.tabla-rejilla th{position:static}
.tabla-rejilla th:first-child,
.tabla-rejilla td:first-child{position:sticky;left:0;top:auto;z-index:1;background:var(--sup-0)}
.tabla-rejilla .fila-modulo td:first-child{background:var(--sup-1)}
.th-rol{text-align:center}
.td-casilla{text-align:center}
.fila-modulo td{
  font-size:var(--tipo-rotulo);text-transform:uppercase;letter-spacing:.12em;
  color:var(--texto-3);          /* era --brown: 1.79:1 sobre surface */
  background:var(--sup-1);padding:var(--esp-2) var(--esp-3);font-weight:600;
}

/* LA CELDA DE ROLES SIGUE SIENDO UNA CELDA DE TABLA, y eso es el arreglo de un
   defecto que se veía: estaba en `display:flex`, y un <td> con display:flex
   deja de ser celda —el navegador le fabrica una celda anónima alrededor—, así
   que su raya inferior se dibujaba a la altura del contenido y no a la de la
   fila. Con seis chips, esa raya quedaba dos centímetros por encima de las
   demás y la tabla parecía descuadrada.
   Los chips ya son `inline-flex`, así que se colocan y se parten solos sin
   necesidad de flex en el contenedor. */
.celda-roles{line-height:2.2}
.celda-roles .chip{vertical-align:middle;margin:0 var(--esp-1) var(--esp-1) 0}

/* ---------- ETIQUETAS Y CHIPS ----------
   LAS ETIQUETAS SON LAS PÍLDORAS DE LA WEB (`.pill` en componentes.css), con
   sus niveles: `pill-live` la principal (relleno amarillo), `pill-normal`
   (contorno amarillo), `pill-done` la secundaria y `pill-aviso` la gris. Hasta
   el 28 sep 2026 el panel tenía las suyas, `.sello`, con otro nombre para lo
   mismo. Aquí solo su separación cuando van seguidas. */
.pill + .pill{margin-left:var(--esp-1)}

/* EL CHIP DEJA DE SER UNA CAJA CON UNA CASILLA DENTRO Y PASA A SER UN
   INTERRUPTOR. En la tabla de miembros hay seis chips por fila: hoy hay que
   mirar casilla por casilla para saber qué roles tiene alguien; con esto se ve
   de golpe cuáles están puestos. `:has()` lo resuelve sin una línea de JS, y
   donde no exista el chip se queda como estaba — degradación limpia. */
/* Un control de ~36 px: el escalón del chip (`--bevel-sm`), no el de la
   etiqueta. Antes llevaba el de 6 px. */
.chip{
  display:inline-flex;align-items:center;gap:var(--esp-2);
  font-size:var(--tipo-descripcion);color:var(--texto-2);
  padding:var(--esp-1) var(--esp-3);min-height:2.25rem;
  background:var(--velo-1);
  --filo-color:var(--line);box-shadow:inset 0 0 0 1px var(--filo-borde, var(--filo-color));
  clip-path:var(--bevel-compacto);border:0;cursor:pointer;
  transition:color      var(--t-rapido) var(--curva),
             background var(--t-rapido) var(--curva);
}
.chip:hover{color:var(--texto-1);background:var(--velo-2)}
.chip:has(input:checked){color:var(--yellow);background:var(--velo-vivo);--filo-color:var(--borde-vivo)}
.chip:has(input:disabled){opacity:.55;cursor:default}
.chip:has(input:focus-visible){--filo-color:var(--yellow)}
/* La casilla es la común (componentes.css): ya no se le pone color ni medida. */
.chip input:disabled{cursor:default}

/* ---------- MÉTRICAS ----------
   El dato más importante de la pantalla de consulta —cuánto entra, cuánto sale,
   cuánto queda— era un párrafo con puntos medios que se leía como un pie de
   foto. Aquí es lo primero que se ve, con la display de la marca: la M en su
   numeral (`--tipo-numeral`), el caso «cifra de tarjeta» que la skill tiene
   pendiente de token propio.

   El componente es genérico a propósito y su constructor vive en panel.js:
   Audiencia y Desempeño van a necesitar exactamente esto. */
.metricas{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));
  gap:var(--esp-rejilla);
  margin-bottom:var(--esp-bloque);
}
.metrica{padding:var(--esp-4) var(--esp-4) var(--esp-3)}
.metrica-nombre{
  display:block;font-size:var(--tipo-rotulo);font-weight:600;
  text-transform:uppercase;letter-spacing:.12em;color:var(--texto-3);
  margin-bottom:var(--esp-2);
}
.metrica-valor{
  display:block;
  font-family:var(--fuente-numeral);
  font-weight:800;font-size:var(--tipo-numeral);line-height:1;letter-spacing:calc(.01em + var(--tracking-numeral));
  color:var(--texto-1);font-variant-numeric:tabular-nums;
  /* UNA CIFRA NUNCA SE CORTA CON PUNTOS (5 oct 2026). Hasta ese día
     «$ 1,234,567.89» salía como «$ 1,234,5…» en una tarjeta de 160 px: un
     error de lectura, no de estética. Ahora no se parte (una cifra en dos
     renglones deja de leerse como cifra) y, si no cabe, panel.js la ENCOGE
     hasta que entre: `P.ajustarCifras()`. */
  max-width:100%;overflow:hidden;white-space:nowrap;
}
/* La tarjeta con dos cifras («+ $ X / − $ Y») sí puede saltar de línea
   entre ellas: el «$» va unido a su número con un espacio duro. */
.metrica-dos .metrica-valor{white-space:normal}
.metrica-pie{display:block;font-size:var(--tipo-leyenda);color:var(--texto-3);margin-top:var(--esp-2)}
/* El neto se distingue por el ARO, no por el fondo: solo cambia de color. */
.metrica-fuerte{--filo-color:var(--yellow)}
.metrica-fuerte .metrica-valor{color:var(--yellow)}
.metrica-sale .metrica-valor{color:var(--texto-3)}

/* ---------- EL RESUMEN (clave `inicio`; CEO, 21 oct 2026) ----------
   COPIA del Resumen del Dashboard (bot-dashboard/assets/dashboard.css,
   «RESUMEN»): `.cifras` y `.atajos` son la misma pieza; si cambia allí, se
   mira aquí. Lo propio del panel lleva `rs-`. La cabecera es la de todas las
   pantallas (.pantalla-cabecera), con el nombre en amarillo en su línea. */
.cifras{display:grid;grid-template-columns:repeat(var(--n,4),minmax(0,1fr));border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.cifra-celda{padding:var(--esp-rejilla);border-left:1px solid var(--line);min-width:0;display:flex;flex-direction:column;justify-content:space-between}
.cifra-celda:first-child{border-left:0;padding-left:0}
.cifra-nombre{display:flex;align-items:center;gap:var(--esp-2);font-size:var(--tipo-rotulo);font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--texto-3)}
.cifra-nombre .rs-ico svg{width:1rem;height:1rem;display:block}
.cifra{margin:var(--esp-2) 0 0;font-family:var(--fuente-numeral);font-weight:800;letter-spacing:calc(.01em + var(--tracking-numeral));font-size:var(--tipo-numeral);line-height:1;font-variant-numeric:tabular-nums}
/* Lo que pide atención (vencidas, por revisar, por confirmar), en amarillo:
   un acento por bloque, el dato y no la caja. */
.cifra-celda.es-aviso .cifra{color:var(--yellow)}
.atajos{display:grid;gap:var(--esp-rejilla);grid-template-columns:repeat(auto-fill,minmax(min(100%,17rem),1fr))}
.atajo{padding:var(--esp-tarjeta);display:grid;grid-template-columns:auto 1fr auto;grid-template-rows:auto auto;gap:var(--esp-1) var(--esp-3);align-items:center;color:inherit;text-decoration:none}
.atajo-ico{grid-row:1 / 3;width:1.75rem;height:1.75rem;color:var(--yellow)}
.atajo-ico svg{width:100%;height:100%;display:block}
.atajo-nombre{font-family:var(--fuente-dato);font-weight:700;letter-spacing:calc(.01em + var(--tracking-dato));text-transform:uppercase;font-size:var(--tipo-dato);line-height:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.atajo-dato{grid-column:2;font-size:var(--tipo-leyenda);color:var(--texto-3);min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.atajo-flecha{grid-row:1 / 3;grid-column:3;color:var(--texto-3);transition:transform .25s var(--mov-rebote),color .15s}
.atajo-flecha svg{width:1.25rem;height:1.25rem;display:block}
a.atajo:hover{--filo-color:var(--texto-3)}
a.atajo:hover .atajo-flecha{transform:translateX(4px);color:var(--yellow)}
a.atajo:focus-visible{outline:none;--filo-color:var(--yellow)}
/* Lo que aún no existe: igual, con la opacidad de apagado y sin enlace. */
.atajo.es-inactivo{opacity:var(--opacidad-apagado);cursor:not-allowed}
.rs-errores{display:flex;flex-direction:column;align-items:flex-start;gap:var(--esp-2);margin-top:var(--esp-rejilla)}
.rs-rejilla{display:grid;gap:var(--esp-rejilla);grid-template-columns:repeat(auto-fit,minmax(min(100%,18rem),1fr));margin-top:var(--esp-bloque)}
.rs-lista{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}
.rs-fila{display:flex;align-items:baseline;justify-content:space-between;gap:var(--esp-3);padding:var(--esp-2) 0;border-top:1px solid var(--line);min-width:0}
.rs-fila:first-child{border-top:0;padding-top:0}
.rs-fila-texto{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--texto-1)}
.rs-fila-dato{flex:none;font-size:var(--tipo-leyenda);color:var(--texto-3);white-space:nowrap}
.rs-fila-dato.es-aviso{color:var(--yellow)}
.rs-vacio{color:var(--texto-3);font-size:var(--tipo-descripcion)}
.rs-ir{align-self:flex-start}
.rs-barra{height:.5rem;background:var(--line);overflow:hidden}
.rs-barra span{display:block;height:100%;width:var(--pct,0%);background:var(--yellow)}
.rs-seccion{margin-top:var(--esp-bloque)}
.rs-seccion-cab{margin-bottom:var(--esp-4)}
.rs-seccion-bajada{margin-top:var(--esp-2);font-size:var(--tipo-descripcion);color:var(--texto-2);max-width:44rem}
@media (max-width:959.98px){
  .cifras{grid-template-columns:repeat(2,minmax(0,1fr))}
  .cifra-celda:nth-child(odd){border-left:0;padding-left:0}
  .cifra-celda:nth-child(n+3){border-top:1px solid var(--line)}
}

/* ---------- EL MARCADOR DE «PRÓXIMAMENTE» ---------- */
/* Caja biselada centrada: los módulos por hacer y las pantallas de bloqueo
   (sin alta, sin 2FA, fallo). Su titular va en `--tipo-subtitulo` (M en el
   panel): es el título de una caja, no el de una sección. */
.pronto-caja{
  width:100%;max-width:34rem;margin:0 auto;text-align:center;
  padding:var(--esp-caja);
}
.pronto-caja h1{
  color:var(--texto-1);margin-bottom:var(--esp-3);
  font-family:var(--fuente-subtitulo);font-weight:700;font-size:var(--tipo-subtitulo);line-height:1;letter-spacing:calc(.01em + var(--tracking-subtitulo))
}
/* «Próximamente»: la píldora principal (`pill pill-live`), sola en su línea. */
.pronto-texto{color:var(--texto-1);font-size:var(--tipo-cuerpo);margin-bottom:var(--esp-4)}
.pronto-pie{color:var(--texto-3);font-size:var(--tipo-descripcion);line-height:1.55}
.pronto-caja .btn{margin-top:var(--esp-rejilla)}
.pronto-caja .aviso-error{text-align:left;margin-top:var(--esp-4)}

/* ---------- LA PANTALLA DE ESTADO COMPLETA (16 oct 2026) ----------
   Los bloqueos (sin alta, suspendido, 2FA, la base no responde, «Vuelve a
   entrar»): icono · antetítulo · título en Dharma · texto · [pie] · [código]
   · acciones (principal amarilla + «Cerrar sesión» ghost). Es la misma pieza
   que `.bloqueo-caja` del dashboard del bot (bot-dashboard/assets/modulos.css):
   si cambia una, cambia la otra. Centrada con `.estado-centro`. */
.bloqueo-caja{
  width:min(100%,36rem);margin:0 auto;padding:var(--esp-caja);
  display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--esp-3);
  --caja-fondo:var(--surface);
}
.bloqueo-ico{display:inline-flex;width:2.25rem;height:2.25rem;color:var(--yellow)}
.bloqueo-ico svg{width:100%;height:100%;display:block}
.bloqueo-titulo{
  font-family:var(--fuente-display);font-weight:800;text-transform:uppercase;
  font-size:var(--tipo-titulo);line-height:.9;color:var(--texto-1);overflow-wrap:anywhere;
}
.bloqueo-texto{font-size:var(--tipo-entradilla);color:var(--texto-2)}
.bloqueo-pie{font-size:var(--tipo-descripcion);color:var(--texto-3)}
.bloqueo-codigo{
  font-family:ui-monospace,monospace;font-size:var(--tipo-leyenda);color:var(--texto-1);
  background:var(--velo-2);padding:var(--esp-2) var(--esp-3);overflow-wrap:anywhere;max-width:100%;
}
.bloqueo-botones{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--esp-3);margin-top:var(--esp-3)}
/* Los datos de la cuarentena (migración 138): desde, hasta, quién y por qué,
   como ficha de dos columnas; en el móvil, una debajo de otra. */
.bloqueo-datos{display:grid;gap:var(--esp-2);width:100%;max-width:28rem;text-align:left;margin:var(--esp-2) 0 0;
  border-top:1px solid var(--line);padding-top:var(--esp-3)}
.bloqueo-datos div{display:grid;grid-template-columns:9rem minmax(0,1fr);gap:var(--esp-3)}
.bloqueo-datos dt{font-size:var(--tipo-rotulo);font-weight:600;letter-spacing:.12em;text-transform:uppercase;color:var(--texto-3);padding-top:.15em}
.bloqueo-datos dd{margin:0;color:var(--texto-1);overflow-wrap:anywhere}
@media (max-width:520px){ .bloqueo-datos div{grid-template-columns:minmax(0,1fr);gap:0} }
@media (max-width:520px){ .bloqueo-caja{padding:var(--esp-rejilla)} }

/* ---------- LA PANTALLA DE ENTRAR ----------
   Es la única pantalla del panel que alguien ve antes de que el panel exista,
   y era una caja gris sobre un fondo liso. Sin imágenes nuevas: dos halos y
   la trama diagonal de la marca, amarillo y marrón con alfa. La caja es la
   biselada de siempre, con el aro en amarillo porque es la única puerta. */
.entrada{
  position:relative;isolation:isolate;
  min-height:100dvh;display:grid;place-items:center;
  padding:max(var(--esp-caja),env(safe-area-inset-top))    max(var(--esp-4),env(safe-area-inset-right))
          max(var(--esp-caja),env(safe-area-inset-bottom)) max(var(--esp-4),env(safe-area-inset-left));
  background:
    radial-gradient(85rem 45rem at 50% -15%, rgba(255,198,33,.09), transparent 60%),
    radial-gradient(45rem 32rem at 88% 115%, rgba(88,63,55,.5),    transparent 65%);
  /* Sin color sólido (16 oct 2026): el marrón lo pone el <body>, y así se
     ve el fondo de la marca (assets/comun/fondo.js) en los bordes. */
}
/* La trama va enmascarada para que se apague hacia los bordes: si llega hasta
   la esquina se lee como fondo de página de error. */
.entrada::before{
  content:'';position:absolute;inset:0;z-index:-1;pointer-events:none;
  background:repeating-linear-gradient(-45deg, rgba(255,198,33,.05) 0 10px, transparent 10px 20px);
  -webkit-mask-image:radial-gradient(55rem 38rem at 50% 42%, #000 15%, transparent 72%);
          mask-image:radial-gradient(55rem 38rem at 50% 42%, #000 15%, transparent 72%);
}
.entrada-caja{
  width:100%;max-width:26rem;text-align:center;
  padding:var(--esp-caja);
  --filo-color:var(--yellow);
}
.entrada-logo{margin:0 auto var(--esp-rejilla);width:11.25rem;height:auto}
.entrada-caja h1{color:var(--texto-1);margin-bottom:var(--esp-4)}
.entrada-texto{color:var(--texto-2);font-size:var(--tipo-cuerpo);margin-bottom:var(--esp-rejilla)}
.entrada-pie{
  color:var(--texto-3);font-size:var(--tipo-leyenda);line-height:1.55;
  margin-top:var(--esp-rejilla);padding-top:var(--esp-4);
  border-top:1px solid var(--linea-suave);
}
.entrada .aviso-error{text-align:left;margin-top:var(--esp-4);margin-bottom:0}

/* ============================================================================
   MOVIMIENTO
   ============================================================================
   Dos familias, y no se mezclan:

     · LA ENTRADA de lo que aparece al llegar a una pantalla es la común de
       la web: `.reveal` (componentes.css) + colocar.js, con los tokens --mov-*,
       las dos cosas copiadas al publicar. La llevan las tarjetas de Inicio, las
       métricas y las cajas de «próximamente». Hasta el 28 sep 2026 aquí había
       entradas propias (`entra-cuerpo`, `entra-fila`) y la skill dice que no
       se escribe otro @keyframes de entrada.
     · LA RESPUESTA a lo que hace quien trabaja —el aviso que llega, el botón
       que guarda, el esqueleto que carga— es corta y sin rebote: dice qué
       acaba de cambiar, y nada más.

   Las tablas no llevan entrada: se repintan al guardar, y una fila que salta
   cada vez que se toca un número es un parpadeo, no una entrada.
   ========================================================================== */
@keyframes entra-aviso {from{opacity:0;transform:translateY(-4px)} to{opacity:1;transform:none}}
@keyframes sube-aviso  {from{opacity:0;transform:translateY(8px)} to{opacity:1;transform:none}}
@keyframes latido      {0%,100%{opacity:1} 50%{opacity:.6}}
@keyframes brillo      {from{background-position:200% 0} to{background-position:-200% 0}}

/* ============================================================================
   EN EL MÓVIL LA BARRA SE GUARDA EN UN CAJÓN
   ============================================================================
   ANTES ERA UNA FILA QUE SE DESLIZABA, y la decisión escrita aquí decía que
   ocho entradas cabían y que un desplegable era un componente más que
   mantener. Lo que costaba de verdad, mirándolo en un teléfono de 390 px:

     · con la fila desplazada, ninguna entrada visible decía en cuál estabas;
     · las ocho medían ~34 px de alto, por debajo de los 44 que hacen falta
       para acertar con el pulgar;
     · el sello «pronto» se escondía porque no cabía, así que en móvil no se
       distinguía un módulo hecho de uno por hacer;
     · y ese desplazamiento horizontal competía con el de las tablas anchas que
       hay justo debajo.

   El cajón cuesta un archivo (navegacion.js) y devuelve las cuatro cosas. Y la
   barra NO se duplica: el cajón ES el mismo <aside>, con otro CSS. Por eso la
   navegación móvil no puede acabar diciendo menos que la de escritorio.
   ========================================================================== */

@media (max-width:959.98px){
  :root{--alto-control:2.75rem}

  .app{grid-template-columns:1fr;grid-template-areas:"topbar" "cab" "contenido"}

  .btn-menu{display:flex}
  /* ES LA CABECERA DEL MÓVIL (CEO, 22 oct 2026): se esconde al bajar y vuelve
     al subir (navegacion.js, LATERAL.cabecera), por detrás de la franja. */
  .topbar{position:fixed;top:0;left:0;right:0;gap:var(--esp-2);transition:transform .3s cubic-bezier(.22,1,.36,1)}
  .topbar.oculta{transform:translateY(-100%)}
  /* En el teléfono la barra lleva la hamburguesa, la marca con su etiqueta
     «Panel» —la misma en todas las páginas— y el avatar. El menú de
     secciones no cabe: se muda arriba del cajón. Dónde estás lo dicen el
     antetítulo de la pantalla y la entrada marcada del cajón. Y de la cuenta
     queda solo el avatar: el nombre está en su menú. */
  .topbar-marca img{height:1.25rem}
  .topbar-areas{display:none}
  .cuenta-corto,.cuenta-chevron{display:none}
  .cuenta-boton{padding:0 var(--esp-2)}
  .cuenta-menu{position:fixed;top:calc(var(--topbar) + env(safe-area-inset-top) + var(--esp-1));
    right:max(var(--esp-4),env(safe-area-inset-right))}

  /* EL CAJÓN. Es la barra de escritorio movida a fija y sacada de pantalla, así
     que casi todas sus reglas de arriba siguen valiendo tal cual. */
  .barra{
    position:fixed;top:0;bottom:0;left:0;z-index:40;
    width:min(82vw,17.5rem);height:100dvh;
    box-shadow:inset -1px 0 0 var(--line);
    padding:calc(var(--topbar) + env(safe-area-inset-top) + var(--esp-3))
            0
            calc(var(--esp-4) + env(safe-area-inset-bottom));
    overflow-y:auto;overscroll-behavior:contain;
    transform:translateX(-100%);
    visibility:hidden;                      /* cerrado: ni dedo ni tabulador */
    transition:transform var(--t-lento) var(--curva),visibility 0s linear var(--t-lento);
  }
  /* LAS SECCIONES, ARRIBA DEL CAJÓN: una por fila (lado a lado, «Bot de
     Discord» y «Administración» no caben en 280 px sin partirse), con la
     raya amarilla a la izquierda en la actual, como las entradas de la barra.
     Alto táctil de 44 px. Un filete las separa de los módulos de debajo. */
  .barra-areas{
    display:flex;flex-direction:column;align-items:stretch;gap:0;flex:0 0 auto;
    margin:0 var(--esp-3) var(--esp-3);padding-bottom:var(--esp-3);
    border-bottom:1px solid var(--line);
  }
  .barra-areas:empty{display:none}
  .barra-areas:has(+ #modulos:empty){border-bottom:0}
  .barra-areas .nav-pagina{min-height:2.75rem;padding:0 var(--esp-3)}
  .barra-areas .nav-pagina[aria-current="page"]{
    color:var(--yellow);background:var(--sup-2);box-shadow:inset 3px 0 0 var(--yellow);
  }
  body.nav-abierta .barra{
    transform:none;visibility:visible;
    transition:transform var(--t-lento) var(--curva),visibility 0s;
  }
  body.nav-abierta .velo{
    opacity:1;visibility:visible;
    transition:opacity var(--t-medio) ease,visibility 0s;
  }
  /* CON EL DOCK DE LA WEB (CEO, 21 oct 2026; LATERAL.dock, que pone
     `con-dock` en el <html>): el dock es el menú y la cuenta vive en su hoja
     (navegacion.js), así que ni hamburguesa ni cajón. Arriba quedan la marca
     y la campana, como en la barra fina de la web. Sin dock (una sección de
     un solo módulo) sigue el cajón de siempre. */
  html.con-dock .btn-menu,html.con-dock .barra{display:none}

  .barra .lat-fila{height:2.75rem}
  .btn-sm{min-height:2.75rem}
  /* El de solo icono sigue cuadrado con el suelo táctil (44 × 44). */
  .btn-icono{inline-size:2.75rem;min-block-size:2.75rem}

  .contenido{
    padding:calc(var(--topbar) + env(safe-area-inset-top) + var(--inicio-pagina))
            max(1.25rem,env(safe-area-inset-right))
            calc(var(--esp-bloque) + env(safe-area-inset-bottom))
            max(1.25rem,env(safe-area-inset-left));
  }

  .pestana{min-height:2.75rem;padding:0 var(--esp-4)}
  /* A 360 px las cuatro de Personal no cabían con ese relleno y «Accesos»
     salía cortado en «Ac», sin nada que dijera que se podía deslizar. En lo
     más estrecho se aprieta el relleno (no la letra ni el alto táctil); si aun
     así no caben (fuente grande), personal.js lleva la activa a la vista. */
  .pestanas{gap:0}
  .chip{min-height:2.75rem;padding:var(--esp-2) var(--esp-3)}

  /* iOS HACE ZOOM AL ENFOCAR UN CAMPO DE MENOS DE 16 px, y ya no lo deshace:
     te quedas con el formulario de finanzas ampliado y desplazado de lado. No
     hay que desactivar el zoom del usuario para arreglarlo —eso es quitarle una
     ayuda de accesibilidad a quien la usa—: basta con que el campo mida 16. */
  /* 1rem literal: es el umbral de iOS, no un tamaño de la escala. */
  .ficha-fila input,.ficha-fila select,.campo input,.campo select,.celda-campo{font-size:1rem}
  .celda-campo[type=email]{width:100%}

  /* ---------- LAS TABLAS SE LEEN COMO FICHAS ----------
     Una tabla de seis columnas en 390 px no se lee: o se aprieta hasta que las
     palabras se parten letra a letra, o se desliza de lado y hay que ir y venir
     para cruzar una fecha con su importe. Aquí cada fila se convierte en una
     ficha con los nombres de columna delante.

     EL NOMBRE SALE DE `data-etq`, Y LO PONE EL ARMAZÓN, NO LOS MÓDULOS:
     `P.etiquetarTabla()` en panel.js lee el <thead> y lo estampa en cada celda
     por posición. Así ningún módulo tiene que acordarse de etiquetar celda por
     celda, y los que falten lo heredan gratis.

     La etiqueta va ENCIMA del valor y no al lado, que era lo primero que se
     probó: al lado hay que fijar un ancho de columna, y en cuanto una celda
     lleva dos líneas —las hay con un <strong> y un .dato-menor debajo, y las
     hay con seis chips— el valor se desalinea. Encima funciona con cualquier
     contenido. */
  .tabla:not(.tabla-rejilla),
  .tabla:not(.tabla-rejilla) tbody,
  .tabla:not(.tabla-rejilla) tr{display:block;width:100%}
  .tabla:not(.tabla-rejilla) thead{
    position:absolute;width:1px;height:1px;overflow:hidden;
    clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;
  }
  .tabla:not(.tabla-rejilla) tbody tr{
    position:relative;isolation:isolate;
    background:transparent;
    padding:var(--esp-4);margin-bottom:var(--esp-3);
  }
  .tabla:not(.tabla-rejilla) tbody tr::before{
    content:'';position:absolute;inset:0;z-index:-2;
    background:var(--line);clip-path:var(--bevel);   /* la fila-ficha mide > 60 px */
  }
  .tabla:not(.tabla-rejilla) tbody tr::after{
    content:'';position:absolute;inset:1px;z-index:-1;
    background:var(--sup-1);clip-path:var(--bevel);
  }
  /* La cebra y el hover no tienen sentido cuando cada fila es una ficha. */
  .tabla:not(.tabla-rejilla) tbody tr:nth-child(even),
  .tabla:not(.tabla-rejilla) tbody tr:hover{background:transparent}

  .tabla:not(.tabla-rejilla) td{
    display:block;width:auto;
    padding:.5rem 0;border-bottom:1px solid var(--linea-suave);
    text-align:left;white-space:normal;
  }
  .tabla:not(.tabla-rejilla) td:last-child{border-bottom:0;padding-bottom:0}
  .tabla:not(.tabla-rejilla) td::before{
    content:attr(data-etq);display:block;
    font-size:var(--tipo-etiqueta);font-weight:600;text-transform:uppercase;letter-spacing:.14em;
    color:var(--texto-3);margin-bottom:var(--esp-1);
  }
  /* La primera celda es el título de la ficha: ni etiqueta ni raya encima. */
  .tabla:not(.tabla-rejilla) td:first-child{padding-top:0;font-size:var(--tipo-cuerpo)}
  .tabla:not(.tabla-rejilla) td:first-child::before{display:none}
  .tabla:not(.tabla-rejilla) td:first-child strong{font-size:var(--tipo-cuerpo);font-weight:600}
  /* Sin columna que alinear, el importe vuelve a la izquierda como todo lo
     demás; lo que lo distingue es su etiqueta, no su posición. */
  .tabla:not(.tabla-rejilla) td.num{text-align:left}
  /* La fila vacía no es una ficha de datos: no lleva etiqueta ni marco. */
  .tabla:not(.tabla-rejilla) tbody tr:has(> .tabla-vacia)::before,
  .tabla:not(.tabla-rejilla) tbody tr:has(> .tabla-vacia)::after{display:none}
  .tabla:not(.tabla-rejilla) tbody tr:has(> .tabla-vacia){padding:0}
  .tabla:not(.tabla-rejilla) td.tabla-vacia{border-bottom:0}
  .tabla:not(.tabla-rejilla) td.tabla-vacia::before{
    content:'';display:block;width:2.75rem;height:2.75rem;margin:0 auto var(--esp-3);
    background:var(--velo-2);clip-path:var(--bevel-sm);
  }
  .tabla:not(.tabla-rejilla) .celda-roles{line-height:2.4}


  /* LA REJILLA DE PERMISOS SE QUEDA COMO TABLA, y es lo correcto: es una
     matriz de permisos por roles, y una matriz partida en fichas deja de
     significar nada. Se desliza dentro de su propia caja, y la primera columna
     se queda quieta — una casilla sin su nombre de permiso a la vista es una
     casilla que se marca a ciegas. */
  .tabla-rejilla{display:block;overflow-x:auto;overscroll-behavior-x:contain}
  .tabla-rejilla th{position:static}
  .tabla-rejilla th:first-child,
  .tabla-rejilla td:first-child{position:sticky;left:0;z-index:1;background:var(--sup-0)}
  .tabla-rejilla .fila-modulo td:first-child{background:var(--sup-1)}
  /* La casilla, más grande y con más aire. No llega a los 44 px a propósito:
     en una matriz de quince columnas, 44 por celda son cinco pantallas de
     ancho. El objetivo real son ~22 px de casilla con ~10 de margen. */
  .td-casilla{padding:.7rem .55rem}
  .td-casilla input[type=checkbox]{width:1.375rem;height:1.375rem}

}

/* ---------- TELÉFONO ESTRECHO ----------
   Un segundo corte, y no por gusto: con columnas de 11rem mínimas, a 390 px
   entran dos campos por fila de unos 176 px cada uno, y un selector de fecha
   en 176 px no se lee. Por debajo de 36rem, un campo por fila. */
@media (max-width:36rem){
  .ficha-fila{grid-template-columns:1fr}
  .metricas{grid-template-columns:repeat(auto-fit,minmax(8.5rem,1fr));gap:var(--esp-3)}
  .metrica{padding:var(--esp-3)}
  .metrica-valor{font-size:var(--tipo-dato)}
}

/* ---------- QUIEN PIDE MENOS MOVIMIENTO ----------
   Se amplía a `animation`, que antes no estaba: el esqueleto, la entrada de
   pantalla y el latido del botón son animaciones y se colaban por el hueco.

   Y se apagan con `duration:.001ms` y NO con `animation:none`, que es lo que
   parece obvio y es la trampa: con `none`, todo lo que entra desde
   `from{opacity:0}` con fill `both` se queda INVISIBLE PARA SIEMPRE. Con
   duración cero el fotograma final se aplica igual y todo se ve, sin moverse. */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    transition:none !important;
    animation-duration:.001ms !important;
    animation-iteration-count:1 !important;
    animation-delay:0s !important;
    scroll-behavior:auto !important;
  }
}

/* ---------- LA FICHA DE UN MOVIMIENTO (Finanzas, 5 oct 2026) ----------
   Rejilla abierta de dato y valor: filetes y nada de cajas dentro de la caja. */
.ficha-datos{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(14rem,1fr));
  gap:0 var(--esp-caja);margin:0 0 var(--esp-4);
}
.ficha-datos > div{padding:var(--esp-3) 0;border-bottom:1px solid var(--linea-suave)}
.ficha-datos dt{
  font-size:var(--tipo-rotulo);font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  color:var(--texto-3);margin-bottom:var(--esp-1);
}
.ficha-datos dd{margin:0;color:var(--texto-1);font-size:var(--tipo-descripcion);overflow-wrap:anywhere}
/* El archivo del comprobante (migracion-48): «Abrir» y «Adjuntar/Reemplazar» en
   fila, y en el formulario un botón del panel en vez del «Choose File» nativo. */
/* El contacto de Personal (132): Gmail y celular editables en la propia fila,
   del ancho de su dato. */
.celda-campo{width:var(--campo-s);max-width:100%}
.celda-campo[type=email]{width:calc(var(--campo-s) * 1.5)}
.celda-campo::placeholder{color:var(--brown)}
.archivo-campo{display:flex;flex-wrap:wrap;align-items:center;gap:var(--esp-3);min-height:var(--alto-control)}
.comprobante-acciones{display:flex;flex-wrap:wrap;align-items:center;gap:var(--esp-3)}
.ficha-datos a{color:var(--yellow);text-underline-offset:3px}
.historial{list-style:none;margin:0;padding:0}
.historial > li{padding:var(--esp-3) 0;border-bottom:1px solid var(--linea-suave)}
.historial > li > strong{color:var(--texto-1);font-weight:500}
.historial-cambio{margin:var(--esp-1) 0 0;font-size:var(--tipo-descripcion);color:var(--texto-2);overflow-wrap:anywhere}
.historial-cambio del{color:var(--texto-3)}
.historial-cambio ins{text-decoration:none;color:var(--texto-1)}

/* ---------- CONTRAPARTES (Finanzas, 29 sep 2026) ----------
   Una fila de botones o chips que se envuelve, para lo que no es un campo. */
.fila-botones{display:flex;flex-wrap:wrap;align-items:center;gap:var(--esp-3);margin-bottom:var(--esp-4)}
.fila-botones:last-child{margin-bottom:0}
.volver-lista{margin-bottom:var(--esp-4)}
.confirmar{margin-top:var(--esp-4)}
.confirmar-zona{padding:var(--esp-4);background:var(--velo-1);max-width:62ch}
.confirmar-zona .ficha-nota{color:var(--texto-1)}
.confirmar-si{--filo-color:var(--borde-vivo);color:var(--yellow)}
.contacto-form{margin-top:var(--esp-caja);padding-top:var(--esp-4);border-top:1px solid var(--line)}
.fila-edicion .contacto-form{margin-top:0;padding-top:0;border-top:0}
.contacto-titulo{font-size:var(--tipo-entradilla);font-weight:600;color:var(--texto-1);margin-bottom:var(--esp-3)}
.tabla td .pill + .pill{margin-left:var(--esp-1)}
/* Un contacto desactivado sigue a la vista, un escalón más apagado: es un
   estado (excepción de la skill), no un nivel de texto. */
.fila-inactiva td{color:var(--texto-3)}
.fila-inactiva td strong{color:var(--texto-2)}

/* ============================================================================
   EL MANUAL (28 sep 2026) — el botón y el panel lateral de manual.js
   ============================================================================
   El antetítulo y el botón comparten fila: «03 / Finanzas» a la izquierda y
   «Manual» a la derecha, el mismo sitio en todas las pantallas. */
.antetitulo-fila{
  display:flex;align-items:center;justify-content:space-between;
  gap:var(--esp-3);margin-bottom:var(--esp-3);
}
.antetitulo-fila .eyebrow{margin-bottom:0}
/* EL ANTETÍTULO, A --inicio-pagina DE LA CABECERA (CEO, 22 oct 2026): la
   fila mide lo que el botón «Manual» (32; 44 en el móvil), más que el
   antetítulo (su línea, --tipo-antetitulo × 1,55), y lo centra: el
   antetítulo bajaba 5 (11 en el móvil). La fila sube la mitad de esa
   diferencia y el antetítulo cae donde en la web y en el Dashboard. */
.antetitulo-fila{--manual-alto:var(--btn-sm-alto);margin-top:calc((var(--tipo-antetitulo) * 1.55 - var(--manual-alto)) / 2)}
@media (max-width:959.98px){ .antetitulo-fila{--manual-alto:2.75rem} }
.manual-boton{flex:0 0 auto;gap:var(--esp-2)}
.manual-boton svg{width:1.25rem;height:1.25rem;flex:0 0 auto}
/* APAGADO: existe, pero ese módulo todavía no tiene manual. La opacidad es
   la del estado apagado (`--opacidad-apagado`, como «Autocuarentena»); y se le
   quita el latido y el gris de `.btn:disabled`, que dicen «cargando». */
.manual-boton.es-inactivo,
.manual-boton.es-inactivo:hover{
  opacity:var(--opacidad-apagado);cursor:not-allowed;animation:none;filter:none;transform:none;
  background:var(--velo-1);
}

/* EL PANEL LATERAL. Un <dialog> modal pegado a la derecha, de alto completo y
   nunca de ancho completo: siempre queda una franja del panel a la vista.
   Es una `.caja` (capa doble): el contorno completo sale de ahí. No hace
   scroll él mismo —el relleno del ::before se quedaría atrás al desplazar—:
   desplaza su cuerpo. */
.manual{
  position:fixed;inset:0 0 0 auto;margin:0;padding:0;border:0;
  width:min(46rem, calc(100vw - 3rem));height:100dvh;max-height:none;max-width:none;
  color:var(--texto-1);--caja-fondo:var(--sup-1);
  display:none;flex-direction:column;overflow:hidden;isolation:isolate;
}
.manual[open]{display:flex;animation:manual-entra var(--t-lento) var(--curva)}
.manual::backdrop{background:rgba(23,17,13,.72)}
@keyframes manual-entra{from{translate:2rem 0;opacity:.4}}

.manual-cabeza{
  display:flex;align-items:flex-start;justify-content:space-between;gap:var(--esp-4);
  padding:calc(var(--esp-caja) * .75 + env(safe-area-inset-top, 0px)) var(--esp-caja) var(--esp-4);
  border-bottom:1px solid var(--line);
}
.manual-antetitulo{margin-bottom:var(--esp-2)}
.manual-titulo{
  font-family:var(--fuente-subtitulo);font-weight:700;letter-spacing:calc(.01em + var(--tracking-subtitulo));
  font-size:var(--tipo-subtitulo);line-height:1;text-transform:uppercase;color:var(--texto-1);
}
.manual-cerrar{flex:0 0 auto;gap:var(--esp-2)}
.manual-cerrar svg{width:1.25rem;height:1.25rem}

.manual-cuerpo{
  flex:1 1 auto;overflow-y:auto;overscroll-behavior:contain;
  padding:var(--esp-4) var(--esp-caja) calc(var(--esp-bloque) + env(safe-area-inset-bottom, 0px));
  font-size:var(--tipo-cuerpo);line-height:1.65;color:var(--texto-2);
}
.manual-cuerpo:focus{outline:none}
.manual-estado{display:flex;flex-direction:column;align-items:flex-start;gap:var(--esp-4)}

/* LA PROSA DEL MANUAL. Las secciones son h3 en `--tipo-subtitulo` (M en el
   panel; título de caja, muestrario «Textos 1»); lo de dentro, h4 en Poppins 600. */
.manual-cuerpo section{padding-top:var(--esp-bloque);scroll-margin-top:var(--esp-4)}
.manual-cuerpo section:first-of-type{padding-top:var(--esp-4)}
.manual-cuerpo h3{
  font-family:var(--fuente-subtitulo);font-weight:700;letter-spacing:calc(.01em + var(--tracking-subtitulo));
  font-size:var(--tipo-subtitulo);line-height:1;text-transform:uppercase;
  color:var(--texto-1);margin-bottom:var(--esp-4);text-wrap:balance;
}
.manual-cuerpo h3 .manual-num{color:var(--yellow);margin-right:.35em}
.manual-cuerpo h4{
  font-size:var(--tipo-entradilla);font-weight:600;color:var(--texto-1);
  margin:var(--esp-caja) 0 var(--esp-2);
}
.manual-cuerpo p{margin-bottom:var(--esp-3);max-width:62ch}
.manual-cuerpo ul,.manual-cuerpo ol{margin:0 0 var(--esp-4) 1.2rem;max-width:62ch}
.manual-cuerpo li{margin-bottom:var(--esp-2)}
.manual-cuerpo li::marker{color:var(--texto-3)}
.manual-cuerpo strong{font-weight:600;color:var(--texto-1)}
.manual-cuerpo em{font-style:normal;color:var(--yellow)}
.manual-cuerpo code{
  font-size:.88em;background:var(--velo-2);color:var(--texto-1);
  padding:0 var(--esp-1);overflow-wrap:anywhere;
}
.manual-cuerpo a{color:var(--yellow);text-underline-offset:3px}

/* El índice de arriba: una rejilla abierta de enlaces, numerada como las
   secciones. */
.manual-cuerpo .manual-indice{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(14rem,1fr));
  gap:0 var(--esp-4);margin:0 0 var(--esp-4);padding:0;list-style:none;
  border-top:1px solid var(--line);
}
.manual-cuerpo .manual-indice li{margin:0;border-bottom:1px solid var(--linea-suave)}
.manual-cuerpo .manual-indice a{
  display:flex;gap:var(--esp-3);padding:var(--esp-3) 0;
  font-size:var(--tipo-descripcion);color:var(--texto-2);text-decoration:none;
}
.manual-cuerpo .manual-indice a span{color:var(--texto-3);font-variant-numeric:tabular-nums}
.manual-cuerpo .manual-indice a:hover{color:var(--texto-1)}

/* Las tablas del manual se desplazan en su propia caja si no caben. */
.manual-tabla{overflow-x:auto;margin:var(--esp-2) 0 var(--esp-4)}
.manual-tabla table{width:100%;min-width:30rem;border-collapse:collapse;font-size:var(--tipo-descripcion)}
.manual-tabla th{
  text-align:left;font-size:var(--tipo-rotulo);font-weight:600;letter-spacing:.14em;
  text-transform:uppercase;color:var(--texto-3);
  padding:var(--esp-2) var(--esp-3) var(--esp-2) 0;border-bottom:1px solid var(--line);
}
.manual-tabla td{
  padding:var(--esp-3) var(--esp-3) var(--esp-3) 0;vertical-align:top;
  border-bottom:1px solid var(--linea-suave);
}
.manual-tabla td:first-child{color:var(--texto-1);font-weight:500}

/* Los pasos del flujo: numeral en M 800 y texto al lado. */
.manual-cuerpo .manual-pasos{list-style:none;margin:var(--esp-2) 0 var(--esp-4);padding:0;counter-reset:paso}
.manual-cuerpo .manual-pasos > li{
  counter-increment:paso;display:grid;grid-template-columns:3rem 1fr;gap:0 var(--esp-3);
  padding:var(--esp-4) 0;border-bottom:1px solid var(--linea-suave);margin:0;
}
.manual-cuerpo .manual-pasos > li::before{
  content:counter(paso,decimal-leading-zero);
  font-family:var(--fuente-dato);font-weight:800;letter-spacing:calc(.01em + var(--tracking-dato));
  font-size:var(--tipo-dato);line-height:1;color:var(--yellow);
}
.manual-cuerpo .manual-pasos > li > *:last-child{margin-bottom:0}

/* Sí / No: dos columnas que caen a una en estrecho. */
.manual-sino{display:grid;grid-template-columns:repeat(auto-fit,minmax(15rem,1fr));gap:var(--esp-rejilla);margin:var(--esp-2) 0 var(--esp-4)}
.manual-sino > div{--caja-fondo:var(--sup-2);padding:var(--esp-4) var(--esp-4) var(--esp-2)}
.manual-sino h4{margin-top:0}
.manual-cuerpo .manual-sino ul{margin-left:1.1rem}

/* LOS AVISOS DEL MANUAL. «Regla» en amarillo: lo que no se negocia. «Por
   confirmar» en gris: una decisión que todavía no se ha tomado y que el manual
   no puede dar por hecha. */
.manual-nota{padding:var(--esp-4);margin:var(--esp-2) 0 var(--esp-4);--caja-fondo:var(--sup-2)}
.manual-nota > *:last-child{margin-bottom:0}
.manual-nota .pill{margin-bottom:var(--esp-2)}
.manual-nota-regla{--filo-color:var(--borde-vivo)}
.manual-nota-pendiente{--filo-color:var(--borde-alerta)}

/* LAS NOTAS PARA DESARROLLO (clase `solo-staff`, COO, 18 oct 2026). Ocultas
   salvo que manual.js ponga `es-staff` en el <dialog>: la ven el staff de
   Trufas (en el panel, todos). Con `!important` porque se esconden también
   filas, <li> y <span>, que tienen su propio `display`. Al verse, una raya a
   la izquierda y la etiqueta «Para desarrollo» (el texto sale de la variable
   --manual-dev, que pone manual.js ya traducido). Ver la cabecera de manual.js. */
.manual:not(.es-staff) .solo-staff{display:none !important}
.manual.es-staff .solo-staff{--dev-marca:var(--texto-3)}
.manual.es-staff :is(p,ul,ol,div,section,details,h4,.manual-tabla,.manual-nota).solo-staff{
  border-left:2px solid var(--line);padding-left:var(--esp-3);
}
.manual.es-staff :is(p,ul,ol,div,section,details,h4,.manual-tabla,.manual-nota).solo-staff::before{
  content:var(--manual-dev, "Para desarrollo");display:block;margin-bottom:var(--esp-1);
  font-size:var(--tipo-rotulo);font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--dev-marca);
}
.manual.es-staff li.solo-staff::before{
  content:var(--manual-dev, "Para desarrollo");margin-right:var(--esp-2);
  font-size:var(--tipo-rotulo);font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--dev-marca);
}
.manual.es-staff tr.solo-staff > td,.manual.es-staff tr.solo-staff > th{background:var(--velo-2)}
.manual.es-staff span.solo-staff{background:var(--velo-2);box-shadow:inset 0 -1px 0 var(--line)}
.manual-aviso-staff{
  margin:var(--esp-4) 0 var(--esp-4);padding:var(--esp-2) var(--esp-3);max-width:62ch;
  background:var(--velo-2);color:var(--texto-3);font-size:var(--tipo-leyenda);
}

.manual-pie{
  margin-top:var(--esp-bloque);padding-top:var(--esp-4);border-top:1px solid var(--line);
  font-size:var(--tipo-leyenda);color:var(--texto-3);
}

@media (max-width:36rem){
  .manual{width:calc(100vw - 2.5rem)}
  .manual-cabeza{padding-inline:var(--esp-4)}
  .manual-cuerpo{padding-inline:var(--esp-4)}
  .manual-cerrar span,.manual-boton-texto{
    position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;
  }
  .manual-cerrar,.manual-boton{min-width:var(--alto-control);padding-inline:var(--esp-3)}
}

/* Ver «A 360 px las cuatro de Personal», en el bloque de móvil. */
@media (max-width:420px){
  .pestana{padding:0 .55rem}
}

/* ---------- EVENTOS (29 sep 2026) ---------- */
/* El <textarea> de las descripciones: mismo aspecto que un campo, sin la
   altura fija de los inputs. */
.campo textarea{
  font-family:inherit;font-size:var(--tipo-descripcion);line-height:1.5;
  color:var(--texto-1);background:var(--sup-0);
  border:1px solid var(--line);padding:var(--esp-2) var(--esp-3);
  width:100%;min-width:0;min-height:5.5rem;resize:vertical;
  transition:border-color var(--t-rapido) var(--curva),
             background   var(--t-rapido) var(--curva),
             box-shadow   var(--t-rapido) var(--curva);
}
.campo textarea:hover{border-color:var(--texto-3)}
.campo textarea:focus{
  outline:none;border-color:var(--yellow);background:var(--sup-1);
  box-shadow:0 0 0 3px var(--velo-vivo);
}
/* La miniatura del banner: 16:9, como se sirve en la tarjeta. */
.banner-vista{margin-bottom:var(--esp-4)}
.banner-vista img{display:block;width:min(20rem,100%);height:auto;aspect-ratio:16/9;
  object-fit:cover;border:1px solid var(--line)}
/* «Avanzado» se abre a demanda para no alargar el formulario. */
.ficha-avanzado{margin:var(--esp-4) 0}
.ficha-avanzado > summary{cursor:pointer;color:var(--texto-2);margin-bottom:var(--esp-3);
  font-size:var(--tipo-rotulo);font-weight:600;text-transform:uppercase;letter-spacing:.12em}
.ficha-avanzado > summary:hover{color:var(--texto-1)}
.ficha-avanzado > summary:focus-visible{outline:2px solid var(--yellow);outline-offset:2px}
/* Las tres acciones de una fila, juntas y sin romperse a media palabra. */
.td-acciones{white-space:nowrap}
.td-acciones .btn + .btn{margin-left:var(--esp-1)}

/* ---------- EL CALENDARIO DE EVENTOS (29 sep 2026) ----------
   La pantalla de Eventos ES un calendario de pared: el mes a todo el ancho y
   debajo «Lo que viene». Editar va aparte, en el panel lateral que abre
   «Editar eventos» (las clases del manual, `.manual`).

   Cada tipo de evento lleva su color de la paleta del calendario (abajo), y
   un evento oculto va a trazos. Las celdas no llevan clip-path: son la
   rejilla abierta, filetes de 1 px. */

/* LA PALETA DEL CALENDARIO (29 sep 2026). La única excepción al «dicromático»
   de la marca, y solo aquí: el calendario necesita un color único por tipo de
   evento para reconocerlo de un vistazo (el muestrario, «Color y ambiente 1 · Color», paleta del calendario).
   Ocho colores para el fondo marrón, validados con la skill dataviz:
     · se distinguen todos entre sí, también con daltonismo (ΔE ≥ 8 protan y
       deutan) y con visión normal (ΔE ≥ 15);
     · el texto oscuro de la marca se lee encima de todos (≥ 5,5:1);
     · todos destacan sobre el fondo (≥ 5:1).
   Van más claros de lo que la skill pide para trazos finos, a propósito: cada
   etiqueta lleva su nombre escrito encima, en tinta oscura. El orden es el de
   PALETA en eventos.js, y la base solo admite estos nombres (migración 30). */
:root{
  --cal-oro:#F5C24A;        /* Sorteo: más cálido y dorado que el amarillo de los botones */
  --cal-mandarina:#E17F08;  /* Reto */
  --cal-celeste:#60D0FE;    /* Transmisión */
  --cal-orquidea:#CD67B7;   /* Fechas especiales */
  --cal-pervinca:#7986F2;   /* Comunidad */
  --cal-esmeralda:#2EB370;  /* Torneo */
  --cal-menta:#7CE695;      /* Patrocinios (fijo, no es un tipo) */
  --cal-chicle:#FE9DD0;     /* Cumpleaños (fijo, no es un tipo) */
}

/* Los dos botones de la fila del antetítulo: «Editar eventos» y «Manual». */
.antetitulo-acciones{display:flex;align-items:center;gap:var(--esp-2);flex:0 0 auto}
.editor-boton{gap:var(--esp-2)}
.editor-boton svg{width:1.15em;height:1.15em;flex:0 0 auto}

/* ---------- EL CALENDARIO POR ÍCONOS (5 oct 2026) ----------
   Artifact «Calendario de Eventos Trufas». Cada cosa es un ícono de su color
   (la paleta de arriba), y solo se PINTAN los días importantes: torneo o
   esports, destacado, cumpleaños o patrocinio. Las celdas no llevan
   clip-path: son la rejilla abierta, filetes de 1 px. */

/* LOS FILTROS: dos filas de chips (fechas · qué se ve) y el resumen. */
.cal-filtros{display:grid;gap:var(--esp-3);margin-bottom:var(--esp-4)}
.cal-filtro-fila{display:flex;flex-wrap:wrap;align-items:center;gap:var(--esp-2) var(--esp-3)}
.cal-filtro-nombre{flex:0 0 5rem;font-size:var(--tipo-rotulo);font-weight:600;letter-spacing:.12em;
  text-transform:uppercase;color:var(--texto-3)}
.cal-chips{display:flex;flex-wrap:wrap;gap:var(--esp-2);align-items:center;min-width:0}
.cal-chip{font:inherit;font-size:var(--tipo-leyenda);min-height:2rem}
.cal-chip[aria-pressed="true"]{color:var(--yellow);background:var(--velo-vivo);--filo-color:var(--borde-vivo)}
.cal-chip-ico{padding-left:var(--esp-1)}
.cal-chip-ico[aria-pressed="false"] .cal-ico{opacity:.35}
.cal-chip-ico[aria-pressed="true"]{color:var(--texto-1);background:var(--velo-2);--filo-color:var(--line)}
.cal-chip-n{color:var(--texto-3);font-variant-numeric:tabular-nums}
.cal-chip:focus-visible{outline:none}
@supports (clip-path: polygon(evenodd, 0 0, 1px 1px, 0 1px)){
  .cal-chip:focus-visible::after{clip-path:var(--filo-foco-compacto);--filo-color:var(--yellow)}
}
.cal-rango{display:flex;flex-wrap:wrap;gap:var(--esp-2)}
.cal-rango-campo{display:flex;align-items:center;gap:var(--esp-2);font-size:var(--tipo-leyenda);color:var(--texto-3)}
.cal-rango-campo input{font:inherit;font-size:var(--tipo-leyenda);color:var(--texto-1);background:var(--sup-0);
  border:1px solid var(--line);padding:var(--esp-1) var(--esp-2);min-height:2rem}
.cal-rango-campo input:focus{outline:none;border-color:var(--yellow)}
.cal-resumen{font-size:var(--tipo-leyenda);color:var(--texto-3)}
.cal-resumen strong{color:var(--texto-1);font-weight:500}

.cal-mes{padding:var(--esp-4);margin-bottom:var(--esp-4)}
.cal-barra{display:flex;align-items:center;flex-wrap:wrap;gap:var(--esp-2);margin-bottom:var(--esp-4)}
.cal-titulo{flex:1;text-align:center;color:var(--texto-1)}
.cal-flecha{min-width:var(--alto-control);font-size:var(--tipo-entradilla)}

/* LA REJILLA: una fila por semana, para poder poner de fondo el logo de un
   patrocinio a lo ancho de sus días. */
.cal-dias{display:grid;gap:1px;background:var(--linea-suave);border:1px solid var(--linea-suave)}
.cal-semana{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:1px;position:relative;isolation:isolate}
.cal-cab{
  background:var(--sup-1);text-align:center;padding:var(--esp-2) 0;
  font-size:var(--tipo-rotulo);font-weight:600;letter-spacing:.12em;color:var(--texto-3);
}
.cal-dia{
  position:relative;z-index:1;
  display:flex;flex-direction:column;align-items:flex-start;gap:var(--esp-1);
  min-height:7.5rem;min-width:0;padding:var(--esp-2);
  background:var(--sup-0);color:var(--texto-2);cursor:pointer;
  border:0;font:inherit;text-align:left;
  transition:background var(--t-rapido) var(--curva);
}
.cal-dia:hover{background:var(--sup-2)}
.cal-dia:focus-visible{outline:2px solid var(--yellow);outline-offset:-2px}
.cal-dia[aria-pressed="true"]{box-shadow:inset 0 0 0 2px var(--texto-1)}
.cal-fuera{background:var(--sup-1)}
.cal-fuera .cal-num,.cal-pasado .cal-num{color:var(--texto-3);font-weight:300}
.cal-num{
  min-width:1.75rem;padding:var(--esp-1);line-height:1;text-align:center;
  font-family:var(--fuente-titular);font-weight:var(--peso-titular);font-size:var(--tipo-entradilla);
  line-height:var(--interlinea-titular);font-variant-numeric:tabular-nums;color:var(--texto-1);
}
.cal-hoy .cal-num{background:var(--yellow);color:var(--sobre-amarillo)}
/* Lo que ya pasó o queda fuera del filtro se apaga: es un ESTADO, no un
   nivel de texto (excepción de la skill). */
.cal-pasado .cal-icos{opacity:.55}
.cal-sin-rango{opacity:.3}
/* El día importante: un velo de su color y el número en ese color. */
.cal-dia.es-imp{background:color-mix(in srgb, var(--imp) 16%, var(--sup-0));
  box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--imp) 65%, transparent)}
.cal-dia.es-imp:hover{background:color-mix(in srgb, var(--imp) 24%, var(--sup-0))}
.cal-dia.es-imp[aria-pressed="true"]{box-shadow:inset 0 0 0 2px var(--texto-1)}
.cal-dia.es-imp:not(.cal-hoy) .cal-num{color:var(--imp)}
.cal-etq{
  font-size:var(--tipo-leyenda);font-weight:500;line-height:1.25;color:var(--texto-1);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere;
}
.cal-icos{display:flex;flex-wrap:wrap;gap:var(--esp-1);margin-top:auto}

/* EL ÍCONO: cuadrado biselado (escalón ≤30 px, `--bevel-xs`) del color de su
   categoría, con el dibujo como máscara en la tinta oscura de la marca. El
   número va fuera del recorte, para que el chaflán no se lo coma. */
.cal-ico{position:relative;display:inline-flex;flex:none}
.cal-ico-caja{
  width:1.625rem;height:1.625rem;display:inline-grid;place-items:center;
  background:var(--c, var(--sup-2));color:var(--sobre-amarillo);clip-path:var(--bevel-xs);
}
.cal-ico-dibujo{
  width:1rem;height:1rem;background:currentColor;
  -webkit-mask:var(--ico) center / contain no-repeat;mask:var(--ico) center / contain no-repeat;
}
.cal-ico-logo{background:var(--texto-1)}
.cal-ico-logo img{width:100%;height:100%;object-fit:contain;padding:2px}
.cal-ico-n{
  position:absolute;right:-.35rem;bottom:-.3rem;min-width:1rem;padding:0 2px;
  font-size:var(--tipo-etiqueta);font-weight:600;line-height:1rem;text-align:center;
  background:var(--sup-0);color:var(--texto-1);box-shadow:inset 0 0 0 1px var(--line);
}
.cal-ico.es-borrador{opacity:.45}

/* EL LOGO DEL PARTNER, de fondo a lo ancho de sus días, una vez por
   patrocinio. `contain`: la marca nunca se deforma. Los días con logo dejan
   la celda translúcida para que se vea. */
.cal-patro-logo{
  position:absolute;top:0;bottom:0;z-index:0;pointer-events:none;
  left:calc(var(--desde) * (100% + 1px) / 7);
  width:calc(var(--dias) * (100% + 1px) / 7 - 1px);
  background-repeat:no-repeat;background-position:center 60%;background-size:auto 48%;
}
.cal-dia.cal-con-logo{background:color-mix(in srgb, var(--sup-0) 74%, transparent)}
.cal-dia.cal-con-logo.es-imp{background:color-mix(in srgb, color-mix(in srgb, var(--imp) 16%, var(--sup-0)) 74%, transparent)}

.cal-leyenda{
  display:flex;flex-wrap:wrap;gap:var(--esp-2) var(--esp-4);
  margin-top:var(--esp-3);list-style:none;padding:0;
  font-size:var(--tipo-leyenda);color:var(--texto-3);
}
.cal-leyenda li{display:flex;align-items:center;gap:var(--esp-2)}
.cal-muestra-imp{display:inline-block;width:1.375rem;height:.875rem;
  background:color-mix(in srgb, var(--imp) 16%, var(--sup-0));box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--imp) 65%, transparent)}

/* EL DÍA ELEGIDO, debajo del calendario. */
.cal-detalle-dia{padding:var(--esp-4);margin-bottom:var(--esp-4);display:grid;gap:var(--esp-3)}
.cal-detalle-cab{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:var(--esp-2)}
.cal-detalle-titulo{font-family:var(--fuente-dato);font-weight:700;letter-spacing:calc(.01em + var(--tracking-dato));
  font-size:var(--tipo-dato);line-height:1;text-transform:uppercase;color:var(--texto-1);margin-top:var(--esp-1)}
.cal-detalle-dia .cal-lista{margin:0}
.cal-sinfecha{display:flex;flex-wrap:wrap;align-items:center;gap:var(--esp-2);margin-bottom:var(--esp-bloque)}
.cal-sinfecha .cal-item{width:auto}

/* LO QUE VIENE: una franja de tarjetas que se desliza sola, sin mover la
   página. */
.cal-viene > h2{color:var(--texto-1);margin-bottom:var(--esp-2)}
.cal-franja{
  display:grid;grid-auto-flow:column;grid-auto-columns:minmax(14rem,16rem);gap:var(--esp-2);
  list-style:none;padding:0 0 var(--esp-2);margin:0 0 var(--esp-bloque);
  overflow-x:auto;overscroll-behavior-x:contain;scroll-snap-type:x proximity;
}
.cal-franja li{scroll-snap-align:start;min-width:0}
.cal-tarjeta{
  display:flex;flex-direction:column;gap:var(--esp-1);width:100%;height:100%;
  padding:var(--esp-3);background:var(--velo-1);border:0;
  font:inherit;color:var(--texto-1);text-align:left;cursor:pointer;
  box-shadow:inset 0 2px 0 var(--line);
  transition:background var(--t-rapido) var(--curva);
}
.cal-tarjeta:hover{background:var(--velo-2)}
.cal-tarjeta:focus-visible,.cal-item:focus-visible{outline:2px solid var(--yellow);outline-offset:-2px}
.cal-tarjeta-ahora{box-shadow:inset 0 2px 0 var(--yellow)}
.cal-tarjeta-cuando{
  font-size:var(--tipo-rotulo);font-weight:600;text-transform:uppercase;letter-spacing:.12em;color:var(--texto-3);
}
.cal-tarjeta-ahora .cal-tarjeta-cuando{color:var(--yellow)}
.cal-tarjeta-titulo{display:flex;align-items:center;gap:var(--esp-2);min-width:0}
.cal-tarjeta-titulo strong{font-weight:500;font-size:var(--tipo-descripcion);overflow-wrap:anywhere}
.cal-tarjeta .dato-menor{margin-top:0}

/* En el móvil la celda no cabe con textos: solo número e íconos, y lo que hay
   se lee al tocar el día. */
@media (max-width:40rem){
  .cal-mes{padding:var(--esp-2)}
  .cal-barra .cal-nuevo{order:5;flex:1 0 100%}
  .cal-dia{min-height:4.25rem;padding:var(--esp-1);gap:2px}
  .cal-num{padding:2px;min-width:1.25rem;font-size:var(--tipo-descripcion)}
  .cal-etq{display:none}
  .cal-icos{gap:2px}
  .cal-ico-caja{width:1rem;height:1rem}
  .cal-ico-dibujo{width:.7rem;height:.7rem}
  .cal-ico-n{display:none}
  .cal-filtro-nombre{flex-basis:100%}
  .antetitulo-acciones .manual-boton-texto{display:none}
  .editor-boton-mas{display:none}
}

/* ---------- EL EDITOR A PANTALLA COMPLETA (5 oct 2026) ----------
   /eventos/nuevo y /eventos/<id>: arriba el tipo, a la izquierda cómo se verá
   (la celda y la tarjeta de la web) y a la derecha el formulario. */
.ed-tipos{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,9.5rem),1fr));
  gap:var(--esp-2);margin-bottom:var(--esp-bloque)}
.ed-tipo{
  position:relative;display:flex;align-items:center;gap:var(--esp-2);min-height:var(--alto-control);
  padding:var(--esp-2) var(--esp-3);border:0;cursor:pointer;
  font:inherit;font-size:var(--tipo-descripcion);font-weight:500;color:var(--texto-2);text-align:left;
  background:var(--velo-1);clip-path:var(--bevel-sm);
  transition:background var(--t-rapido) var(--curva),color var(--t-rapido) var(--curva);
}
.ed-tipo:hover{background:var(--velo-2);color:var(--texto-1)}
.ed-tipo[aria-pressed="true"]{background:var(--velo-vivo);color:var(--yellow)}
@supports (clip-path:polygon(evenodd,0 0,0 0,0 0)){
  .ed-tipo::after{content:'';position:absolute;inset:0;pointer-events:none;background:var(--line);clip-path:var(--filo-sm)}
  .ed-tipo[aria-pressed="true"]::after{background:var(--borde-vivo)}
  .ed-tipo:focus-visible{outline:none}
  .ed-tipo:focus-visible::after{background:var(--yellow);clip-path:var(--filo-foco-sm)}
}

.ed-grid{display:grid;grid-template-columns:minmax(0,22rem) minmax(0,1fr);gap:var(--esp-bloque);align-items:start}
.ed-previa{display:grid;gap:var(--esp-3);position:sticky;top:calc(var(--alto-barra, 4rem) + var(--esp-4))}
.ed-previa .eyebrow{margin:0}
.ed-previa-celda{width:10.5rem}
.ed-previa-celda .cal-dia{width:100%;cursor:default}
.ed-previa-logo{height:5rem;background:no-repeat center / contain}

.ed-tarjeta{display:grid}
.ed-banner{aspect-ratio:16/9;display:grid;place-items:center;align-content:center;gap:var(--esp-2);overflow:hidden;
  background:repeating-linear-gradient(135deg,var(--velo-1) 0 14px,transparent 14px 28px)}
.ed-banner img{width:100%;height:100%;object-fit:cover}
.ed-banner .cal-ico-caja{width:3rem;height:3rem}
.ed-banner .cal-ico-dibujo{width:1.75rem;height:1.75rem}
.ed-tarjeta-cuerpo{padding:var(--esp-4);display:grid;gap:var(--esp-1);box-shadow:inset 0 2px 0 var(--c)}
.ed-tarjeta-meta{font-size:var(--tipo-etiqueta);font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--texto-3)}
.ed-tarjeta-titulo{font-family:var(--fuente-dato);font-weight:700;letter-spacing:calc(.01em + var(--tracking-dato));text-transform:uppercase;
  font-size:var(--tipo-dato);line-height:.95;color:var(--texto-1);overflow-wrap:anywhere}
.ed-tarjeta-sub{font-size:var(--tipo-leyenda);color:var(--texto-2)}
.ed-tarjeta-desc{font-size:var(--tipo-leyenda);color:var(--texto-2);line-height:1.5}
.ed-tarjeta-pie{display:flex;justify-content:space-between;align-items:center;gap:var(--esp-2);
  margin-top:var(--esp-2);padding-top:var(--esp-2);border-top:1px solid var(--line);
  font-size:var(--tipo-etiqueta);font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--texto-3)}
.ed-tarjeta-cta{background:var(--yellow);color:var(--sobre-amarillo);padding:var(--esp-1) var(--esp-2);clip-path:var(--bevel-xs)}
.ed-tarjeta-cta.es-mudo{background:var(--sup-2);color:var(--texto-3)}

.ed-form{margin:0}
.idiomas{display:flex;gap:var(--esp-1);border-bottom:1px solid var(--line);margin-bottom:var(--esp-2)}
.idioma{display:inline-flex;align-items:center;gap:var(--esp-2);padding:var(--esp-2) var(--esp-3);margin-bottom:-1px;
  background:none;border:0;border-bottom:2px solid transparent;cursor:pointer;
  font:inherit;font-size:var(--tipo-control);font-weight:500;letter-spacing:.1em;text-transform:uppercase;color:var(--texto-3)}
.idioma:hover{color:var(--texto-1)}
.idioma[aria-selected="true"]{color:var(--texto-1);border-bottom-color:var(--yellow)}
.idioma:focus-visible{outline:2px solid var(--yellow);outline-offset:-2px}
.idioma-estado{font-size:var(--tipo-etiqueta);font-weight:600;letter-spacing:.14em;padding:2px var(--esp-1);
  box-shadow:inset 0 0 0 1px var(--line);color:var(--texto-3)}
.idioma-estado.es-listo{color:var(--yellow);box-shadow:inset 0 0 0 1px var(--borde-vivo)}
.campo-ancho{grid-column:1 / -1}
.ed-requisitos .ficha-nota{margin:var(--esp-4) 0 0}
.ed-acciones-pie{display:flex;flex-wrap:wrap;gap:var(--esp-2);margin-top:var(--esp-4);
  padding-top:var(--esp-4);border-top:1px solid var(--linea-suave)}
.ed-logo{display:flex;flex-wrap:wrap;align-items:center;gap:var(--esp-3);margin-bottom:var(--esp-4)}
.ed-logo-img{height:3.5rem;width:auto;max-width:12rem;object-fit:contain;background:var(--texto-1);padding:var(--esp-1)}
.ed-subir{position:relative;overflow:hidden}
.ed-subir-input{position:absolute;inset:0;opacity:0;cursor:pointer;width:100%}
.ed-subir:focus-within{outline:2px solid var(--yellow);outline-offset:2px}
.tipo-icono-muestra{flex:none;color:var(--texto-1)}
.tipo-iconos .tipo-color:has(input:checked){box-shadow:inset 0 0 0 2px var(--yellow)}

@media (max-width:959.98px){
  .ed-grid{grid-template-columns:1fr}
  .ed-previa{position:static;grid-template-columns:auto minmax(0,1fr);align-items:start}
  .ed-previa > .eyebrow{grid-column:1 / -1}
}
@media (max-width:40rem){
  .ed-previa{grid-template-columns:1fr}
  .ed-previa-celda{width:8rem}
}

/* EL PANEL DE EDICIÓN. Es el del manual (`.manual`); aquí solo lo suyo. */
.editor .pestanas{margin-top:0}
.ficha-editor{padding:0;margin:0 0 var(--esp-bloque)}
.ficha-editor > h2{
  font-size:var(--tipo-dato);color:var(--texto-1);
  margin:var(--esp-bloque) 0 var(--esp-3);padding-bottom:var(--esp-2);border-bottom:1px solid var(--linea-suave);
}
.ficha-editor > h2:first-child{margin-top:var(--esp-2)}
.editor-cuerpo .tabla{font-size:var(--tipo-descripcion)}
/* La lista de eventos del panel: una ficha por evento, sus botones debajo. */
.editor-cuerpo .ed-lista,.editor-cuerpo .cal-lista{list-style:none;padding:0;margin:0 0 var(--esp-bloque);max-width:none}
.ed-lista{border-top:1px solid var(--linea-suave)}
.editor-cuerpo .ed-fila{margin:0}
.ed-fila{
  display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:var(--esp-2) var(--esp-3);
  padding:var(--esp-3) 0;border-bottom:1px solid var(--linea-suave);
}
.ed-info strong{display:block;font-weight:500;color:var(--texto-1);font-size:var(--tipo-descripcion)}
.ed-id{overflow-wrap:anywhere}
.ed-acciones{grid-column:1 / -1;display:flex;flex-wrap:wrap;gap:var(--esp-1)}
.cal-detalle{margin-bottom:var(--esp-4)}
.cal-detalle > .btn{margin-top:var(--esp-2)}
.cal-festividad{padding-left:var(--esp-3);margin-bottom:var(--esp-4);box-shadow:inset 2px 0 0 var(--c, var(--gris-2))}
.cal-festividad-clave{box-shadow:inset 4px 0 0 var(--c, var(--gris-4))}
.cal-festividad strong{font-weight:500;color:var(--texto-1)}
.cal-festividad p{color:var(--texto-2);font-size:var(--tipo-descripcion);line-height:1.5;margin-top:var(--esp-1)}
.cal-lista{display:grid;gap:var(--esp-1);list-style:none;padding:0;margin:0 0 var(--esp-3)}
.cal-item{
  display:flex;align-items:center;gap:var(--esp-3);width:100%;
  padding:var(--esp-2) var(--esp-3);background:var(--velo-1);border:0;
  font:inherit;color:var(--texto-1);text-align:left;cursor:pointer;
  transition:background var(--t-rapido) var(--curva);
}
.cal-item:hover{background:var(--velo-2)}
.cal-item:disabled{cursor:default}
.cal-item-txt{flex:1;min-width:0}
.cal-item-txt strong{display:block;font-weight:500;font-size:var(--tipo-descripcion);overflow-wrap:anywhere}
.cal-item-txt .dato-menor{margin-top:0}
.cal-item .pill{flex:none}

.cal-vista-regla{color:var(--texto-1)}
.nota-lectura .pill{margin-right:var(--esp-1);vertical-align:middle}

/* El selector de color de un tipo: ocho fichas, una por color. */
.tipo-colores{border:0;padding:0;margin:0 0 var(--esp-4);display:grid;
  grid-template-columns:repeat(auto-fill,minmax(10rem,1fr));gap:var(--esp-2)}
.tipo-colores legend{margin-bottom:var(--esp-2);padding:0}
.tipo-color{display:flex;align-items:center;gap:var(--esp-2);padding:var(--esp-2) var(--esp-3);
  background:var(--velo-1);cursor:pointer;font-size:var(--tipo-descripcion);color:var(--texto-2);
  transition:background var(--t-rapido) var(--curva)}
.tipo-color:hover{background:var(--velo-2)}
.tipo-color input{position:absolute;opacity:0;width:1px;height:1px}
.tipo-color-muestra{flex:none;width:1.25rem;height:1.25rem;background:var(--c)}
.tipo-color:has(input:checked){color:var(--texto-1);box-shadow:inset 0 0 0 2px var(--c)}
.tipo-color:has(input:focus-visible){outline:2px solid var(--yellow);outline-offset:2px}
.tipo-color.es-ocupado{cursor:default;color:var(--texto-3)}
.tipo-color.es-ocupado .tipo-color-muestra{opacity:.35}
.fila-apagada td,.fila-apagada td strong{color:var(--texto-3)}

@media (prefers-reduced-motion:reduce){
  .cal-dia,.cal-item,.cal-tarjeta,.ed-tipo{transition:none}
}
/* El pie de los formularios del panel de edición: los botones juntos. */
.ficha-editor > .ficha-fila:last-child{display:flex;flex-wrap:wrap;gap:var(--esp-2)}

/* ---------- CRM (29 sep 2026) ----------
   El embudo son cinco columnas, una por etapa. En escritorio caben las cinco;
   por debajo se desliza de lado DENTRO de su caja, sin mover la página. Las
   tarjetas de trato son `.caja` (capa doble): el contorno llega entero a los
   chaflanes y pasa a amarillo al pasar el cursor o con el foco. */
.embudo{
  display:grid;grid-template-columns:repeat(5,minmax(10.5rem,1fr));
  gap:var(--esp-rejilla);margin-bottom:var(--esp-bloque);
  overflow-x:auto;overscroll-behavior-x:contain;
  /* Aire arriba y abajo: la caja que se desliza de lado también recorta en
     vertical, y se comía la subida de la tarjeta al pasar el cursor y el
     salto de `.reveal` al colocarse. */
  padding-block:var(--esp-2) var(--esp-rejilla);
  scroll-snap-type:x proximity;
}
.embudo-col{display:flex;flex-direction:column;gap:var(--esp-3);min-width:0;scroll-snap-align:start;
  padding-top:var(--esp-3);border-top:2px solid var(--line)}
.embudo-negociacion{border-top-color:var(--yellow-bajo)}
.embudo-ganado{border-top-color:var(--yellow)}
.embudo-cab{display:flex;align-items:baseline;justify-content:space-between;gap:var(--esp-2)}
.embudo-cab h3{font-size:var(--tipo-rotulo);font-weight:600;text-transform:uppercase;letter-spacing:.12em;color:var(--texto-2)}
.embudo-n{font-family:var(--fuente-titular);font-weight:var(--peso-titular);font-size:var(--tipo-entradilla);
  line-height:var(--interlinea-titular);color:var(--texto-3);font-variant-numeric:tabular-nums}
.embudo-suma{font-size:var(--tipo-leyenda);color:var(--texto-3);margin-top:calc(var(--esp-2) * -1)}
.embudo-vacia{font-size:var(--tipo-leyenda);color:var(--texto-3);padding:var(--esp-4) 0;text-align:center;
  background:repeating-linear-gradient(-45deg,var(--velo-1) 0 8px,transparent 8px 16px)}

.trato-tarjeta{
  display:flex;flex-direction:column;align-items:flex-start;gap:var(--esp-2);
  padding:var(--esp-4);text-align:left;cursor:pointer;
  font-family:inherit;color:inherit;border:0;
  transition:transform var(--t-medio) var(--curva);
}
.trato-tarjeta:hover{transform:translateY(-3px);--caja-fondo:var(--sup-2);--filo-color:var(--yellow)}
.trato-tarjeta:focus-visible{outline:none;--filo-color:var(--yellow)}
.trato-tarjeta:focus-visible::before{inset:2px}
@media (prefers-reduced-motion: no-preference){
  .colocar .trato-tarjeta.reveal{
    transition:translate var(--mov-colocar) var(--mov-rebote),transform var(--t-medio) var(--curva);
    transition-delay:calc(var(--i, 0) * var(--mov-escalon)),0s;
  }
}
/* MOVER UN TRATO DE ETAPA (crm.js, arrastrable). La columna que acepta se
   tiñe y su filete de arriba pasa a amarillo; la que no (cerrar sin permiso)
   se apaga. Las columnas no llevan clip-path, así que el filete va entero.
   La tarjeta que viaja es una copia fija que sigue al puntero. */
.trato-tarjeta.es-movible{cursor:grab;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}
.crm-arrastrando,.crm-arrastrando *{cursor:grabbing !important;-webkit-user-select:none;user-select:none}
.embudo-col{transition:background-color var(--t-rapido) var(--curva),opacity var(--t-rapido) var(--curva)}
.embudo.arrastrando .embudo-col{background:var(--velo-1)}
.embudo.arrastrando .embudo-col.es-destino{background:var(--velo-vivo);border-top-color:var(--yellow)}
.embudo.arrastrando .embudo-col.no-acepta{opacity:.4}
.trato-tarjeta.es-origen{opacity:.35}
.trato-tarjeta.es-guardando{opacity:.5;cursor:progress}
.trato-tarjeta.trato-fantasma{position:fixed;left:0;top:0;z-index:1000;pointer-events:none;margin:0;
  --filo-color:var(--yellow);--caja-fondo:var(--sup-2)}
@media (prefers-reduced-motion: reduce){ .embudo-col{transition:none} }

/* El «¿seguro?» al cerrar o reabrir un trato. El <dialog> es solo el marco
   transparente; la caja va dentro (ver confirmar() en crm.js). */
.crm-confirmar{margin:auto;padding:0;border:0;background:none;color:inherit;max-width:min(26rem,calc(100vw - 2rem));width:100%}
.crm-confirmar::backdrop{background:rgba(23,17,13,.72)}
.crm-confirmar-caja{padding:var(--esp-caja);display:flex;flex-direction:column;gap:var(--esp-3);--caja-fondo:var(--sup-2)}
.crm-confirmar-pregunta{font-size:var(--tipo-descripcion);font-weight:600;color:var(--texto-1);overflow-wrap:anywhere}
.crm-confirmar-detalle{font-size:var(--tipo-leyenda);color:var(--texto-2)}
.crm-confirmar-acciones{display:flex;justify-content:flex-end;flex-wrap:wrap;gap:var(--esp-2);margin-top:var(--esp-2)}

.trato-titulo{font-size:var(--tipo-descripcion);font-weight:600;color:var(--texto-1);line-height:1.35;overflow-wrap:anywhere}
.trato-cuenta{font-size:var(--tipo-leyenda);color:var(--texto-2)}
.trato-marcas{display:flex;flex-wrap:wrap;gap:var(--esp-1)}
.trato-pie{font-size:var(--tipo-leyenda);color:var(--texto-3);font-variant-numeric:tabular-nums}

/* Vacío: centrado en los dos ejes de su caja (.estado-centro.en-caja). */
.crm-vacio{gap:var(--esp-3);margin-bottom:var(--esp-bloque);color:var(--texto-2);font-size:var(--tipo-descripcion)}
.crm-vacio > p{max-width:44ch}
.crm-contacto{display:flex;flex-wrap:wrap;align-items:center;gap:var(--esp-2);margin-bottom:var(--esp-1)}
.crm-contacto:last-child{margin-bottom:0}
.crm-contacto-canal{font-size:var(--tipo-rotulo);font-weight:600;text-transform:uppercase;letter-spacing:.12em;color:var(--texto-3)}

/* La línea de tiempo: un filete a la izquierda y un punto por nota. */
.linea-tiempo{list-style:none;margin:var(--esp-4) 0 0;padding:0 0 0 var(--esp-4);border-left:1px solid var(--line);
  display:flex;flex-direction:column;gap:var(--esp-4)}
.actividad{position:relative;display:flex;flex-direction:column;gap:var(--esp-2);min-width:0}
.actividad::before{content:'';position:absolute;left:calc(var(--esp-4) * -1 - 4px);top:.35rem;width:7px;height:7px;
  background:var(--line);clip-path:var(--bevel-xs)}
.actividad:has(.es-vencido)::before{background:var(--gris-3)}
.actividad:has(.actividad-paso:not(.es-hecho):not(.es-vencido))::before{background:var(--yellow)}
.actividad-cab{display:flex;flex-wrap:wrap;align-items:center;gap:var(--esp-2)}
.actividad-meta{font-size:var(--tipo-leyenda);color:var(--texto-3)}
.actividad-texto{color:var(--texto-1);font-size:var(--tipo-descripcion);line-height:1.55;white-space:pre-line;
  overflow-wrap:anywhere;max-width:70ch}
.actividad-cuenta{align-self:flex-start;background:none;border:0;padding:0;cursor:pointer;font:inherit;
  font-size:var(--tipo-descripcion);font-weight:600;color:var(--yellow);text-align:left}
.actividad-cuenta:hover{color:var(--yellow-alto);text-decoration:underline}
.actividad-cuenta:focus-visible{outline:2px solid var(--yellow);outline-offset:2px}
.actividad-paso{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:var(--esp-1) var(--esp-3);
  padding:var(--esp-2) var(--esp-3);background:var(--velo-vivo);max-width:70ch}
.actividad-paso.es-vencido{background:var(--velo-alerta)}
.actividad-paso.es-hecho{background:var(--velo-1)}
.actividad-paso-rotulo{font-size:var(--tipo-etiqueta);font-weight:600;text-transform:uppercase;letter-spacing:.14em;color:var(--yellow)}
.actividad-paso.es-vencido .actividad-paso-rotulo{color:var(--gris-3)}
.actividad-paso.es-hecho .actividad-paso-rotulo{color:var(--texto-3)}
.actividad-paso-texto{color:var(--texto-1);font-size:var(--tipo-descripcion);overflow-wrap:anywhere}
.actividad-paso.es-hecho .actividad-paso-texto{color:var(--texto-3);text-decoration:line-through}
.actividad-paso-meta{grid-column:2;font-size:var(--tipo-leyenda);color:var(--texto-3)}
.actividad-paso .btn{grid-column:2;justify-self:start}
@media (max-width:30rem){
  .actividad-paso{grid-template-columns:minmax(0,1fr)}
  .actividad-paso-meta,.actividad-paso .btn{grid-column:1}
}

.seguimientos{margin-bottom:var(--esp-bloque)}
.seguimientos-cab{display:flex;align-items:baseline;gap:var(--esp-3);font-size:var(--tipo-rotulo);font-weight:600;
  text-transform:uppercase;letter-spacing:.12em;color:var(--texto-2)}
@media (prefers-reduced-motion:reduce){ .trato-tarjeta{transition:none} }

/* ---------- CRM: propuesta, cumplimiento y metas (30 sep 2026) ---------- */
.crm-sub{font-size:var(--tipo-rotulo);font-weight:600;text-transform:uppercase;letter-spacing:.14em;
  color:var(--texto-2);margin:var(--esp-4) 0 var(--esp-2)}
.crm-prog{height:6px;background:var(--line);position:relative;max-width:32rem}
.crm-prog i{position:absolute;inset:0 auto 0 0;background:var(--yellow);
  transition:width var(--t-medio) var(--curva)}
.crm-enlace-nuevo{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:end;gap:var(--esp-3);
  margin:var(--esp-3) 0 var(--esp-4)}
@media (max-width:36rem){.crm-enlace-nuevo{grid-template-columns:1fr}}
@media (prefers-reduced-motion: reduce){.crm-prog i{transition:none}}
.crm-compartir{align-items:end}
.tabla select{
  font-family:inherit;font-size:var(--tipo-leyenda);color:var(--texto-1);background-color:var(--sup-0);
  border:1px solid var(--line);padding:var(--esp-1) var(--esp-2);min-width:0;max-width:100%;
}
.tabla select:hover{border-color:var(--texto-3)}
.tabla select:focus{outline:none;border-color:var(--yellow);box-shadow:0 0 0 3px var(--velo-vivo)}
/* El desplegable de marca dentro de una celda: no se encoge hasta cortar el texto. */
.tabla .dp-boton{min-width:9rem}
/* El estado de un miembro («invitado», «activo») es una palabra: no se parte. */
.tabla td.td-estado{white-space:nowrap;overflow-wrap:normal}
/* La cuarentena en la columna Estado (138): el estado, sus datos y el botón,
   uno debajo de otro; el formulario del motivo sí parte líneas. */
.td-estado .estado-texto,.td-estado .pill{display:inline-flex;margin-bottom:var(--esp-1)}
.tabla td.td-estado .dato-menor{white-space:normal;max-width:13rem}
.td-estado .btn{display:flex;margin-top:var(--esp-2)}
.td-estado .btn.es-inactivo{opacity:var(--opacidad-apagado);cursor:not-allowed}
.cuarentena-form{display:grid;gap:var(--esp-2);margin-top:var(--esp-2);white-space:normal;min-width:min(13rem,100%);max-width:16rem}
.cuarentena-form .dato-menor{white-space:normal}
.cuarentena-acciones{display:flex;flex-wrap:wrap;gap:var(--esp-2)}
.cuarentena-acciones .btn{margin-top:0}

/* ============================================================================
   LA TARJETA QUE SE EDITA CON UN LÁPIZ (1 oct 2026) — P.tarjeta en panel.js
   ============================================================================
   Una `.caja` que se lee como en la web pública —título en M, una cifra a
   la derecha, el contenido— y que, si se puede cambiar, lleva un ✎ en la
   esquina. Al pulsarlo el cuerpo pasa a ser su formulario ahí mismo y el
   contorno se pone amarillo: se ve qué se está editando sin abrir nada.
   `.tarjeta-plana` es la misma pieza sin caja (una línea de datos con su
   lápiz al lado). `.tarjeta-nueva` nace cerrada: solo el «+ Añadir…». */
.tarjeta{display:flex;flex-direction:column;gap:var(--esp-3);min-width:0;padding:var(--esp-tarjeta)}
.tarjeta.es-editando{--filo-color:var(--yellow)}
.tarjeta.es-inactiva .tarjeta-titulo{color:var(--texto-3)}
.tarjeta-cab{display:flex;align-items:flex-start;gap:var(--esp-3);min-width:0}
.tarjeta-cab[hidden]{display:none}
.tarjeta-titulo{
  flex:1;min-width:0;margin:0;
  font-family:var(--fuente-dato);font-weight:700;font-size:var(--tipo-dato);
  line-height:1;letter-spacing:calc(.01em + var(--tracking-dato));text-transform:uppercase;color:var(--texto-1);
  overflow-wrap:anywhere;
}
.tarjeta-cuenta,.crm-cuenta{
  flex:none;white-space:nowrap;
  font-family:var(--fuente-dato);font-weight:800;font-size:var(--tipo-dato);
  line-height:1;letter-spacing:calc(.01em + var(--tracking-dato));color:var(--yellow);font-variant-numeric:tabular-nums;
}
.crm-cuenta small{font-size:.55em;color:var(--texto-3)}
.tarjeta-cuerpo{display:flex;flex-direction:column;gap:var(--esp-3);min-width:0}

/* EL LÁPIZ: un control de 36 px, así que corte, aro y foco del escalón
   compacto (7 px). Discreto en reposo y amarillo al apuntarlo. */
.lapiz{
  flex:none;position:relative;display:grid;place-items:center;
  width:2.25rem;height:2.25rem;margin:calc(var(--esp-1) * -1) calc(var(--esp-1) * -1) 0 0;
  background:var(--velo-1);color:var(--texto-2);border:0;cursor:pointer;
  clip-path:var(--bevel-compacto);
  --filo-color:var(--line);box-shadow:inset 0 0 0 1px var(--filo-borde, var(--filo-color));
  transition:color var(--t-rapido) var(--curva),background var(--t-rapido) var(--curva);
}
.lapiz svg{width:1.1rem;height:1.1rem}
.lapiz:hover{color:var(--yellow);background:var(--velo-vivo);--filo-color:var(--borde-vivo)}
.lapiz[hidden]{display:none}
@supports (clip-path: polygon(evenodd, 0 0, 1px 1px, 0 1px)){
  .lapiz::after{content:'';position:absolute;inset:0;pointer-events:none;
    clip-path:var(--filo-compacto);background:var(--filo-color)}
  .lapiz:focus-visible{outline:none;box-shadow:none}
  .lapiz:focus-visible::after{clip-path:var(--filo-foco-compacto);background:var(--yellow)}
}

.tarjeta-form{display:flex;flex-direction:column;gap:var(--esp-4);min-width:0}
.tarjeta-form .ficha-fila{margin:0}
.tarjeta-form > .chip{align-self:flex-start}
.tarjeta-pie{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:var(--esp-2);
  padding-top:var(--esp-3);border-top:1px solid var(--linea-suave)}
.tarjeta-pie-aparte{margin-right:auto}

.tarjeta-plana{padding:0;flex-direction:row-reverse;justify-content:flex-end;align-items:center;gap:var(--esp-3)}
.tarjeta-plana .lapiz{margin:0}
.tarjeta-plana.es-editando{flex-direction:column;align-items:stretch;
  padding:var(--esp-4);background:var(--sup-1);box-shadow:inset 0 0 0 1px var(--yellow)}

.tarjeta-nueva{--caja-fondo:var(--sup-0)}
.tarjeta-nueva:not(.es-editando){padding:0}
.tarjeta-nueva.es-editando{--caja-fondo:var(--sup-1)}
.tarjeta-nueva:not(.es-editando):hover{--filo-color:var(--yellow)}
.tarjeta-nueva-boton{
  display:flex;align-items:center;justify-content:center;width:100%;min-height:100%;
  padding:var(--esp-tarjeta);background:transparent;border:0;cursor:pointer;
  font-family:inherit;font-size:var(--tipo-control);font-weight:600;letter-spacing:.1em;text-transform:uppercase;
  color:var(--texto-2);transition:color var(--t-rapido) var(--curva);
}
.tarjeta-nueva-boton:hover{color:var(--yellow)}
.tarjeta-nueva-boton:focus-visible{outline:2px solid var(--yellow);outline-offset:-6px}
.tarjeta-nueva .tarjeta-cuerpo{flex:1}

/* LA CASILLA DE ENTREGA, la del artifact: 28 px, corte de etiqueta (5 px) y
   capa doble, así el contorno da la vuelta entera. Marcada, amarilla. */
.chk{
  flex:none;position:relative;isolation:isolate;display:grid;place-items:center;
  width:1.75rem;height:1.75rem;padding:0;border:0;cursor:pointer;
  background:var(--gris-3);color:var(--sobre-amarillo);clip-path:var(--bevel-xs);
  transition:transform var(--t-medio) var(--curva);
}
.chk::before{content:'';position:absolute;inset:1px;z-index:-1;background:var(--sup-1);clip-path:var(--bevel-xs)}
.chk svg{width:1rem;height:1rem;opacity:0;transition:opacity var(--t-rapido) var(--curva)}
.chk[aria-checked="true"],.chk[aria-checked="true"]::before{background:var(--yellow)}
.chk[aria-checked="true"] svg{opacity:1}
button.chk:hover{transform:scale(1.08)}
button.chk:focus-visible{outline:none;background:var(--yellow)}
button.chk:focus-visible::before{inset:2px}
button.chk:disabled{cursor:progress}
.chk-muda{cursor:default;background:var(--line)}

/* ---------- CLIENTES CON CARA DE PÚBLICO (1 oct 2026) ----------
   La ficha de una cuenta se lee como /acuerdo/ y como el artifact «Patrocinio
   Aurea GG»: el nombre en grande, las cifras, y secciones numeradas
   (antetítulo → titular → bajada) con rejillas de tarjetas. */
.crm-hero{margin-bottom:var(--esp-4)}
.crm-cuenta-estado{margin-bottom:var(--esp-3)}
/* El representante de la empresa, debajo de la línea de estado (3 oct 2026). */
.crm-representante{margin-bottom:var(--esp-bloque)}
.crm-representante-linea{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--esp-1) var(--esp-3);
  font-size:var(--tipo-descripcion);color:var(--texto-2);margin:0}
.crm-representante-linea strong{font-weight:600;color:var(--texto-1)}
.crm-representante-rot{font-size:var(--tipo-rotulo);font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--texto-3)}
.crm-representante-contacto{display:inline-flex;align-items:baseline;gap:var(--esp-2)}
.crm-cuenta-estado + .crm-cifras,.crm-cuenta-estado + .metricas{margin-top:var(--esp-bloque)}
.crm-nueva-rep{border:0;margin:0 0 var(--esp-4);padding:var(--esp-3) 0 0;border-top:1px solid var(--linea-suave);min-width:0}
.crm-nueva-rep legend{float:left;width:100%;padding:0;margin-bottom:var(--esp-3);
  font-size:var(--tipo-rotulo);font-weight:600;letter-spacing:.12em;text-transform:uppercase;color:var(--texto-3)}
.crm-nueva-rep > .ficha-fila{clear:both}
.crm-nueva-rep[hidden]{display:none}
.crm-marcas{display:flex;flex-wrap:wrap;align-items:center;gap:var(--esp-2);margin:0}
.crm-marcas .pill + .pill{margin-left:0}
/* En edición, la tarjeta ocupa la fila entera: el formulario tiene sitio y
   no estira a sus vecinas. */
.crm-rejilla > .es-editando{grid-column:1 / -1}
.crm-marcas-dato{font-size:var(--tipo-descripcion);color:var(--texto-2)}
.crm-cifras .crm-prog{margin-top:var(--esp-3)}
.crm-notas{margin-bottom:0}
.crm-texto{color:var(--texto-2);font-size:var(--tipo-cuerpo);line-height:1.6;overflow-wrap:anywhere;max-width:70ch}
/* TEXTO CON FORMATO (P.conFormato en panel.js): subtítulos, listas y negrita
   dentro de una nota. Los huecos los pone el contenedor, no cada pieza. */
.texto-formato{display:flex;flex-direction:column;gap:var(--esp-3);min-width:0}
.texto-formato > *{margin:0}
.texto-formato h4{font-family:inherit;font-weight:600;font-size:var(--tipo-rotulo);line-height:1.3;
  letter-spacing:.14em;text-transform:uppercase;color:var(--yellow);margin-top:var(--esp-2)}
.texto-formato h4:first-child{margin-top:0}
.texto-formato strong{font-weight:600;color:var(--texto-1)}
.texto-formato ul,.texto-formato ol{padding-left:1.25em;display:flex;flex-direction:column;gap:var(--esp-1)}
.texto-formato ul{list-style:none;padding-left:1em}
.texto-formato ul > li{position:relative}
.texto-formato ul > li::before{content:'';position:absolute;left:-1em;top:.65em;width:.4em;height:.4em;background:var(--yellow);
  clip-path:polygon(0 0,70% 0,100% 30%,100% 100%,30% 100%,0 70%)}
.texto-formato ol > li::marker{color:var(--yellow);font-weight:600}
.texto-formato h4 + ul,.texto-formato h4 + ol,.texto-formato h4 + p{margin-top:calc(var(--esp-1) - var(--esp-3))}
.campo-ayuda{display:block;margin-top:var(--esp-1);font-size:var(--tipo-leyenda);color:var(--texto-3)}
.crm-texto a,.crm-contacto a{color:var(--yellow);text-decoration:underline;text-underline-offset:3px}
.crm-texto a:hover,.crm-contacto a:hover{color:var(--yellow-alto)}
.crm-dato{color:var(--texto-2);font-size:var(--tipo-descripcion);line-height:1.5}
.crm-nada{color:var(--texto-3);font-size:var(--tipo-descripcion);margin:0}

.crm-seccion{margin-top:var(--esp-bloque)}
.crm-seccion-cab{margin-bottom:var(--esp-rejilla);display:flex;flex-direction:column;align-items:flex-start}
.crm-seccion-cab h2{
  font-family:var(--fuente-subtitulo);font-weight:700;font-size:var(--tipo-subtitulo);line-height:1;
  color:var(--texto-1);margin-top:var(--esp-2);letter-spacing:calc(.01em + var(--tracking-subtitulo))
}
.crm-seccion-bajada{color:var(--texto-2);font-size:var(--tipo-descripcion);line-height:1.6;max-width:60ch;margin-top:var(--esp-2)}
.crm-seccion-cab > .btn{margin-top:var(--esp-4)}

.crm-rejilla{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,18rem),1fr));gap:var(--esp-rejilla);
  list-style:none;padding:0;margin:0}
.crm-beneficios,.crm-metas{grid-template-columns:repeat(auto-fill,minmax(min(100%,22rem),1fr))}
/* «+ Nuevo…» cerrada mide lo que su botón: estirada a la altura de su
   vecina era una caja vacía que pesaba como una tarjeta. */
.crm-rejilla > .tarjeta-nueva:not(.es-editando){align-self:start}

.crm-elige{display:flex;flex-wrap:wrap;align-items:center;gap:var(--esp-2);margin-top:var(--esp-bloque)}
.crm-elige-rotulo{font-size:var(--tipo-rotulo);font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--texto-3)}
.crm-elige + .crm-seccion{margin-top:var(--esp-rejilla)}

/* LAS FECHAS EN LÍNEA: rejilla abierta, solo filetes. */
.crm-calendario .tarjeta-cuerpo{flex:1}
.crm-calendario{align-items:flex-start}
.crm-fechas{list-style:none;margin:0;padding:0;display:grid;
  grid-template-columns:repeat(auto-fit,minmax(min(100%,11rem),1fr));border-top:1px solid var(--line)}
.crm-fechas li{display:flex;flex-direction:column;gap:var(--esp-1);padding:var(--esp-3) var(--esp-3) var(--esp-3) 0;
  border-bottom:1px solid var(--line);min-width:0}
.crm-fechas-rot{font-size:var(--tipo-rotulo);font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--texto-3)}
.crm-fechas-num{font-family:var(--fuente-dato);font-weight:800;font-size:var(--tipo-dato);line-height:1;
  letter-spacing:calc(.01em + var(--tracking-dato));text-transform:uppercase;color:var(--yellow)}
.crm-fechas-q{font-size:var(--tipo-descripcion);font-weight:500;color:var(--texto-1);overflow-wrap:anywhere}
.crm-fechas .es-pasado .crm-fechas-num{color:var(--texto-3)}
.crm-fechas .es-pasado .crm-fechas-q{color:var(--texto-2)}

/* LA LISTA DE DENTRO DE UNA TARJETA: casilla, texto, etiqueta. */
.crm-lista{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}
.crm-item{display:flex;align-items:center;gap:var(--esp-3);padding:var(--esp-3) 0;border-top:1px solid var(--line);min-width:0}
.crm-item-txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.crm-item-t{font-size:var(--tipo-descripcion);font-weight:400;color:var(--texto-1);overflow-wrap:anywhere}
.crm-item-f{font-size:var(--tipo-leyenda);color:var(--texto-3);overflow-wrap:anywhere}
.crm-item .pill,.crm-item .btn{flex:none}
.crm-item.es-hecho .crm-item-t{color:var(--texto-3);text-decoration:line-through;text-decoration-color:var(--line)}
.crm-meta .crm-item.es-hecho .crm-item-t{text-decoration:none}
.crm-item.es-apagado .crm-item-t{color:var(--texto-3)}
@media (max-width:30rem){
  .crm-item{flex-wrap:wrap}
  .crm-item-txt{flex-basis:calc(100% - 2.5rem)}
  .crm-item .pill{margin-left:calc(1.75rem + var(--esp-3))}
  .crm-enlaces .crm-item .pill{margin-left:0}
}

/* Anotar el avance de una meta sin abrir nada. */
.crm-avance{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr) auto;align-items:end;gap:var(--esp-3);
  padding-top:var(--esp-3);border-top:1px solid var(--line)}
@media (max-width:30rem){ .crm-avance{grid-template-columns:minmax(0,1fr) minmax(0,1fr)} .crm-avance .btn{grid-column:1 / -1} }

/* LA ESTRATEGIA (migración 47): el equipo, con su contador de hoy. */
.crm-equipo{grid-template-columns:repeat(auto-fill,minmax(min(100%,16rem),1fr))}
.crm-persona .crm-marcas{margin-bottom:var(--esp-2)}
.crm-persona .crm-prog{margin:var(--esp-2) 0}
.crm-contador{display:flex;align-items:center;gap:var(--esp-3);margin-top:var(--esp-3);padding-top:var(--esp-3);border-top:1px solid var(--line)}
.crm-contador-rot{font-size:var(--tipo-rotulo);font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--texto-3);margin-right:auto}
.crm-contador-n{font-family:var(--fuente-dato);font-weight:800;font-size:var(--tipo-dato);line-height:1;
  min-width:2ch;text-align:center;font-variant-numeric:tabular-nums;color:var(--texto-1);letter-spacing:var(--tracking-dato)}
.crm-contador-b{min-width:var(--alto-control);justify-content:center;font-size:var(--tipo-entradilla)}
.crm-encargo-como{font-size:var(--tipo-descripcion);margin-top:var(--esp-1)}
.crm-encargos .crm-item{align-items:flex-start}
.crm-encargos .tarjeta-form > .crm-edita-item{grid-template-columns:minmax(0,1fr)}

/* LAS FILAS QUE SE EDITAN DENTRO DE UNA TARJETA (3 oct 2026): campos a la
   izquierda y «Eliminar» a la derecha. Una fila eliminada se apaga y se tacha
   hasta que se guarda o se deshace. */
.crm-lista-edita{display:flex;flex-direction:column;gap:var(--esp-3);min-width:0}
.crm-edita-item{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:var(--esp-3);
  padding-top:var(--esp-3);border-top:1px solid var(--line);min-width:0}
.crm-edita-campos{display:flex;flex-direction:column;gap:var(--esp-3);min-width:0}
.crm-edita-campos .ficha-fila{margin:0}
.crm-edita-campos .ficha-fila:has(> :nth-child(3)){grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1.3fr)}
/* Una fila eliminada es un estado, no un nivel de texto: se apaga entera. */
.crm-edita-item.es-eliminada .crm-edita-campos{opacity:.45}
.crm-edita-item.es-eliminada input{text-decoration:line-through}
.crm-eliminar{
  display:inline-flex;align-items:center;gap:var(--esp-1);margin-top:calc(var(--tipo-rotulo) * 1.4 + var(--esp-1));
  min-height:var(--alto-control);padding:0 var(--esp-2);background:transparent;border:0;cursor:pointer;
  font-family:inherit;font-size:var(--tipo-rotulo);font-weight:600;letter-spacing:.12em;text-transform:uppercase;
  color:var(--texto-3);transition:color var(--t-rapido) var(--curva);
}
.crm-eliminar svg{width:1rem;height:1rem}
.crm-eliminar:hover{color:var(--texto-1)}
.es-eliminada .crm-eliminar{color:var(--yellow)}
.crm-eliminar-no{margin-top:calc(var(--tipo-rotulo) * 1.4 + var(--esp-3));font-size:var(--tipo-leyenda);color:var(--texto-3)}
.crm-anadir{align-self:flex-start}
.crm-pie-nota{font-size:var(--tipo-leyenda);color:var(--texto-3)}
/* Eliminar un bloque, una meta o una persona: gris (lo que avisa), y al
   armarse pide el segundo clic. */
.crm-peligro.es-armado{background:var(--gris-1);color:var(--texto-1);--filo-color:var(--gris-3)}
@media (max-width:30rem){
  .crm-edita-item{grid-template-columns:minmax(0,1fr)}
  .crm-edita-campos .ficha-fila:has(> :nth-child(3)){grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
  .crm-edita-campos .ficha-fila:has(> :nth-child(3)) > :first-child{grid-column:1 / -1}
  .crm-eliminar,.crm-eliminar-no{margin-top:0;justify-self:start}
}

.crm-enlaces .crm-compartir{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:end;gap:var(--esp-3)}
.crm-enlaces .crm-enlace-nuevo{margin:0}
@media (max-width:30rem){ .crm-enlaces .crm-compartir{grid-template-columns:1fr} .crm-enlaces .crm-compartir .btn{justify-self:start} }

.crm-contactos{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--esp-2)}
.crm-contactos .crm-contacto{margin:0;overflow-wrap:anywhere}
.crm-anotar{margin-bottom:var(--esp-4)}

/* LA BARRA DE ENCIMA DE UNA LISTA: filtros y la acción, sin caja. */
.crm-barra{display:flex;flex-wrap:wrap;align-items:flex-end;gap:var(--esp-3);margin-bottom:var(--esp-bloque)}
.crm-barra .campo{flex:1 1 11rem;max-width:20rem}
.crm-barra .chip{min-height:var(--alto-control)}
.crm-barra-accion{margin-left:auto}

/* LA TARJETA DE UNA CUENTA EN LA LISTA: se pulsa entera. */
.cuenta-tarjeta{
  display:flex;flex-direction:column;align-items:flex-start;gap:var(--esp-3);width:100%;
  padding:var(--esp-tarjeta);text-align:left;cursor:pointer;font-family:inherit;color:inherit;border:0;
  transition:transform var(--t-medio) var(--curva);
}
.cuenta-tarjeta:hover{transform:translateY(-3px);--caja-fondo:var(--sup-2);--filo-color:var(--yellow)}
.cuenta-tarjeta:focus-visible{outline:none;--filo-color:var(--yellow)}
.cuenta-tarjeta:focus-visible::before{inset:2px}
.cuenta-tarjeta-sub{font-size:var(--tipo-rotulo);font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--texto-3)}
.cuenta-tarjeta-nombre{font-family:var(--fuente-dato);font-weight:700;font-size:var(--tipo-dato);line-height:1;
  letter-spacing:calc(.01em + var(--tracking-dato));text-transform:uppercase;color:var(--texto-1);overflow-wrap:anywhere}
.cuenta-tarjeta.es-inactiva .cuenta-tarjeta-nombre{color:var(--texto-3)}
.cuenta-tarjeta-avance{display:flex;flex-direction:column;gap:var(--esp-2);width:100%;
  font-size:var(--tipo-leyenda);color:var(--texto-2)}
.cuenta-tarjeta-avance .crm-prog{max-width:none}
.trato-monto{font-family:var(--fuente-dato);font-weight:700;font-size:var(--tipo-dato);line-height:1;letter-spacing:calc(.01em + var(--tracking-dato));color:var(--yellow)}
.trato-marcas .pill + .pill{margin-left:0}

/* SEGUIMIENTOS: cada paso, una tarjeta. */
.seguimientos-lista{margin-top:var(--esp-3)}
.actividad-tarjeta{display:flex;flex-direction:column;gap:var(--esp-2);min-width:0;padding:var(--esp-4)}

@media (prefers-reduced-motion:reduce){
  .chk,.chk svg,.lapiz,.cuenta-tarjeta,.tarjeta-nueva-boton{transition:none}
  button.chk:hover{transform:none}
}

/* ---------- HITOS (2 oct 2026) ----------
   La trayectoria y las metas en rejillas de tarjetas, como Clientes: el año
   (o la fecha de la meta) de título en M, el texto debajo. */
.hitos-rejilla{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,21rem),1fr));gap:var(--esp-rejilla);
  margin-top:var(--esp-4)}
.hitos-rejilla > .es-editando{grid-column:1 / -1}
.hitos-texto{color:var(--texto-1);font-size:var(--tipo-cuerpo);line-height:1.6;margin:0;overflow-wrap:anywhere}
.hitos-en{color:var(--texto-3);font-size:var(--tipo-descripcion);line-height:1.6;margin:0;overflow-wrap:anywhere}
.hitos-dato{color:var(--texto-3);font-size:var(--tipo-leyenda);margin:0}
.hitos-nada{color:var(--texto-3);font-size:var(--tipo-descripcion);margin:0}
.hitos-acciones{display:flex;flex-wrap:wrap;gap:var(--esp-2);margin-top:auto}
.hitos-tarjeta .tarjeta-cuerpo{flex:1}
.hitos-tarjeta.es-inactiva .tarjeta-titulo{color:var(--texto-3)}

/* El código legible y el tipo, en una línea encima del texto. */
.hitos-marcas{display:flex;flex-wrap:wrap;align-items:center;gap:var(--esp-2)}
.hitos-marcas .pill + .pill{margin-left:0}
.hitos-codigo{font-size:var(--tipo-rotulo);font-weight:600;letter-spacing:.14em;color:var(--texto-3);
  font-variant-numeric:tabular-nums}

/* El filtro por tipo: la misma fila que «Plan de» en Clientes. */
.hitos-filtro{display:flex;flex-wrap:wrap;align-items:center;gap:var(--esp-2);margin-top:var(--esp-4)}
.hitos-filtro-rotulo{font-size:var(--tipo-rotulo);font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--texto-3)}

.hitos-archivados{margin-top:var(--esp-bloque)}
.hitos-archivados summary{cursor:pointer;font-size:var(--tipo-rotulo);font-weight:600;letter-spacing:.14em;
  text-transform:uppercase;color:var(--texto-3)}
.hitos-archivados summary:hover{color:var(--texto-1)}
.hitos-archivados summary:focus-visible{outline:none;color:var(--yellow)}
.hitos-lista{list-style:none;margin:var(--esp-3) 0 0;padding:0}
.hitos-item{display:flex;align-items:center;gap:var(--esp-3);padding:var(--esp-3) 0;border-top:1px solid var(--line);min-width:0}
.hitos-item-txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.hitos-item-t{font-size:var(--tipo-descripcion);color:var(--texto-2);overflow-wrap:anywhere}
.hitos-item-f{font-size:var(--tipo-leyenda);color:var(--texto-3)}
.hitos-item .btn{flex:none}

/* ---------- FINANZAS (5 oct 2026) ---------- */
/* Lo obligatorio lleva «*» (F-21). Lo pone el CSS y no el JavaScript para
   que siga al `required` cuando cambia al vuelo (la fecha efectiva y la
   cuenta lo son solo si el movimiento está ejecutado). Solo en los
   formularios que lo explican con su leyenda. */
form:has(.campo-leyenda) .campo:has(:required) .campo-nombre::after{content:' *';color:var(--yellow)}
.campo-leyenda{margin-top:0}
/* Los atajos de fechas de Consultar: el elegido se marca como el filtro. */
.atajos{margin-bottom:var(--esp-3)}
.atajos .btn[aria-pressed="true"]{--filo-color:var(--yellow);color:var(--yellow)}
/* «Por mes»: un desplegable con su tabla, entre las tarjetas y la lista. */
.por-mes{padding-top:var(--esp-2);padding-bottom:var(--esp-2)}
.por-mes > summary{font-weight:600}
.por-mes .tabla{margin-top:var(--esp-2)}
.tabla th[scope="row"]{font-weight:600;text-align:left}
/* La fila de pestañas que no cabe se desvanece por el lado donde hay más
   (Finanzas tiene cuatro y a 360 px se desliza). */
.pestanas.mas-dcha{-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 2.5rem),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 2.5rem),transparent)}
.pestanas.mas-izq{-webkit-mask-image:linear-gradient(to left,#000 calc(100% - 2.5rem),transparent);mask-image:linear-gradient(to left,#000 calc(100% - 2.5rem),transparent)}
.pestanas.mas-izq.mas-dcha{-webkit-mask-image:linear-gradient(to right,transparent,#000 2.5rem,#000 calc(100% - 2.5rem),transparent);mask-image:linear-gradient(to right,transparent,#000 2.5rem,#000 calc(100% - 2.5rem),transparent)}

/* ---------- TAREAS (5 oct 2026) ----------
   El módulo de tareas: cifras que filtran, alta rápida, lista y un cajón a
   la derecha con Detalle, Notas, Comentarios y Chat. Sigue la propuesta
   «Tareas Trufas». Ver modulos/tareas.js. */
.tar-cifras{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--esp-3);margin-bottom:var(--esp-rejilla)}
.tar-cifra{
  display:flex;flex-direction:column;gap:var(--esp-1);text-align:left;cursor:pointer;
  padding:var(--esp-3) var(--esp-4);border:0;color:inherit;font-family:inherit;
  --filo-color:var(--line);
}
.tar-cifra-valor{font-family:var(--fuente-dato);font-size:var(--tipo-dato);font-weight:700;line-height:1.1;color:var(--texto-1);font-variant-numeric:tabular-nums;letter-spacing:var(--tracking-dato)}
.tar-cifra-nombre{font-size:var(--tipo-rotulo);font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--texto-3)}
.tar-cifra-vencidas .tar-cifra-valor{color:var(--yellow)}
.tar-cifra[aria-pressed="true"]{--filo-color:var(--yellow);background:var(--velo-vivo)}
.tar-cifra[aria-pressed="true"] .tar-cifra-nombre{color:var(--yellow)}
@media (max-width:560px){.tar-cifras{grid-template-columns:repeat(2,minmax(0,1fr))}}

.tar-alta{display:flex;flex-wrap:wrap;gap:var(--esp-2);align-items:center;padding:var(--esp-2);margin-bottom:var(--esp-rejilla)}
.tar-alta-titulo{flex:1 1 15rem;min-width:0;border:0;background:transparent;color:var(--texto-1);font-family:inherit;font-size:var(--tipo-cuerpo);padding:var(--esp-2)}
.tar-alta-titulo:focus{outline:none}
.tar-alta select,.tar-alta input[type=date],.tar-barra select,.tar-barra input{
  font-family:inherit;font-size:var(--tipo-descripcion);color:var(--texto-1);
  background:var(--sup-0);border:1px solid var(--line);height:var(--alto-control);padding:0 var(--esp-3);min-width:0;
}
.tar-barra{display:flex;flex-wrap:wrap;gap:var(--esp-2);align-items:center;margin-bottom:var(--esp-3)}
.tar-barra input[type=search]{flex:1 1 12rem}
/* El desplegable y el calendario de marca (17 oct 2026) ocupan el ancho
   entero por defecto (width:100%); en estas barras van a su medida, como iban
   los controles nativos. */
.tar-alta .dp-boton,.tar-alta .cc-boton,.tar-barra .dp-boton{width:auto;flex:0 1 13rem}
@media (max-width:560px){.tar-alta .dp-boton,.tar-alta .cc-boton,.tar-barra .dp-boton{flex:1 1 10rem}}

.tar-lista{display:flex;flex-direction:column;padding:0;overflow:hidden}
.tar-fila{
  position:relative;display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:var(--esp-3);align-items:center;
  padding:var(--esp-3) var(--esp-4);border-top:1px solid var(--line);cursor:pointer;
  transition:background var(--t-rapido) var(--curva);
}
.tar-fila:first-child{border-top:0}
.tar-fila:hover{background:var(--velo-1)}
.tar-fila:focus-visible{outline:2px solid var(--yellow);outline-offset:-2px}
.tar-sel{background:var(--velo-vivo)}
.tar-pri{position:absolute;left:0;top:.6rem;bottom:.6rem;width:3px}
.tar-pri-alta{background:var(--yellow)}
.tar-pri-media{background:var(--texto-3)}
.tar-pri-baja{background:var(--brown)}
.tar-check{width:1.4rem;height:1.4rem;padding:0;display:grid;place-items:center;border:2px solid var(--line);background:transparent;cursor:pointer;color:var(--sobre-amarillo)}
.tar-check svg{width:.9rem;height:.9rem;opacity:0}
.tar-check-on{background:var(--yellow);border-color:var(--yellow)}
.tar-check-on svg{opacity:1}
.tar-check:disabled{cursor:default;opacity:.5}
.tar-texto{min-width:0;display:flex;flex-direction:column;gap:var(--esp-1)}
.tar-texto strong{font-weight:600;color:var(--texto-1);overflow-wrap:anywhere}
.tar-hecha .tar-texto strong{text-decoration:line-through;color:var(--texto-3)}
.tar-meta{display:flex;flex-wrap:wrap;gap:var(--esp-1)}
.tar-chip{font-size:var(--tipo-leyenda);padding:.1rem var(--esp-2);background:var(--velo-1);color:var(--texto-2);white-space:nowrap;clip-path:var(--bevel-xs)}
.tar-st-en_progreso{background:var(--velo-vivo);color:var(--yellow)}
.tar-st-completada{color:var(--texto-3)}
.tar-tarde{background:var(--yellow);color:var(--sobre-amarillo);font-weight:600}
.tar-dcha{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--esp-2);font-size:var(--tipo-leyenda);color:var(--texto-3);text-align:right}
.tar-quien{color:var(--texto-2)}
@media (max-width:560px){
  .tar-fila{grid-template-columns:auto minmax(0,1fr)}
  .tar-dcha{grid-column:2;justify-content:flex-start}
}
.tar-vacio{padding:var(--esp-bloque) var(--esp-4);text-align:center;display:flex;flex-direction:column;gap:var(--esp-1);align-items:center;color:var(--texto-3);font-size:var(--tipo-descripcion)}
.tar-vacio strong{font-family:var(--fuente-dato);font-weight:700;font-size:var(--tipo-dato);text-transform:uppercase;color:var(--texto-1);letter-spacing:var(--tracking-dato)}

/* El cajón: un <dialog> modal pegado a la derecha. */
.tar-cajon{
  position:fixed;inset:0 0 0 auto;margin:0;height:100dvh;max-height:none;width:min(32rem,100vw);max-width:none;
  padding:0;border:0;border-left:1px solid var(--line);background:var(--sup-1);color:var(--texto-1);
  display:none;flex-direction:column;overflow:hidden;
}
.tar-cajon[open]{display:flex;animation:manual-entra var(--t-lento) var(--curva)}
.tar-cajon::backdrop{background:rgba(23,17,13,.72)}
.tar-cajon-cab{display:flex;align-items:center;justify-content:space-between;gap:var(--esp-2);padding:var(--esp-2) var(--esp-3);border-bottom:1px solid var(--line)}
.tar-tabs{margin-bottom:0;border-bottom:0;flex:1;min-width:0}
.tar-tabs .pestana{padding:0 var(--esp-3)}
.tar-panel{flex:1;min-height:0;overflow:auto;padding:var(--esp-4);display:flex;flex-direction:column;gap:var(--esp-3)}
.tar-panel[hidden]{display:none}
.tar-d-titulo{
  font-family:var(--fuente-subtitulo);font-weight:700;font-size:var(--tipo-subtitulo);text-transform:uppercase;line-height:1;
  color:var(--texto-1);background:transparent;border:0;border-bottom:1px solid transparent;padding:var(--esp-1) 0;width:100%;letter-spacing:calc(.01em + var(--tracking-subtitulo))
}
.tar-d-titulo:focus{outline:none;border-bottom-color:var(--yellow)}
.tar-rejilla{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--esp-3)}
.tar-panel .campo textarea{min-height:6rem}
.tar-d-notas{min-height:18rem!important;flex:1}
.tar-pie{font-size:var(--tipo-leyenda);color:var(--texto-3);margin:0}
.tar-cajon-pie{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:var(--esp-2);padding:var(--esp-3) var(--esp-4);border-top:1px solid var(--line);font-size:var(--tipo-descripcion)}
.tar-cajon-pie[hidden],.tar-enviar[hidden]{display:none}
.tar-grupo{display:flex;gap:var(--esp-2);justify-content:flex-end;flex-wrap:wrap;margin-left:auto}
.tar-devolver{display:flex;flex-direction:column;gap:var(--esp-2);width:100%}

.tar-enviar{display:flex;gap:var(--esp-2);padding:var(--esp-3) var(--esp-4);border-top:1px solid var(--line);align-items:flex-end}
.tar-com-form{flex-direction:column;align-items:stretch}
.tar-enviar textarea,.tar-com textarea,.tar-devolver textarea{
  flex:1;min-width:0;font-family:inherit;font-size:var(--tipo-descripcion);color:var(--texto-1);
  background:var(--sup-0);border:1px solid var(--line);padding:var(--esp-2) var(--esp-3);resize:vertical;min-height:2.75rem;width:100%;
}
.tar-chat-form textarea{resize:none}
.tar-enviar textarea:focus,.tar-com textarea:focus,.tar-devolver textarea:focus{outline:none;border-color:var(--yellow)}
.tar-enviar-pie{display:flex;justify-content:space-between;align-items:center;gap:var(--esp-2)}

.tar-coms{display:flex;flex-direction:column;gap:var(--esp-2)}
.tar-com{display:flex;flex-direction:column;gap:var(--esp-2);padding:var(--esp-3);background:var(--sup-0);border:1px solid var(--line)}
.tar-com-dev{border-color:var(--yellow);background:var(--velo-vivo)}
.tar-com-cab{display:flex;flex-wrap:wrap;align-items:center;gap:var(--esp-2);font-size:var(--tipo-leyenda);color:var(--texto-3)}
.tar-com-cab b{color:var(--texto-1);font-weight:600}
.tar-com p,.tar-msg p{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;font-size:var(--tipo-descripcion)}
.tar-acts{margin-left:auto;display:flex;gap:var(--esp-1)}
.tar-sello-dev{font-size:var(--tipo-etiqueta)}

.tar-chat{display:flex;flex-direction:column;gap:var(--esp-2)}
.tar-msg{align-self:flex-start;max-width:88%;padding:var(--esp-2) var(--esp-3);background:var(--sup-0);clip-path:var(--bevel-xs);display:flex;flex-direction:column;gap:2px}
.tar-msg-mio{align-self:flex-end;background:var(--velo-vivo)}
.tar-msg-quien{display:flex;justify-content:space-between;gap:var(--esp-2);font-size:var(--tipo-leyenda);color:var(--texto-3)}
/* Editar y Borrar de comentarios y mensajes: texto, no botón macizo. */
.tar-enlace.btn{min-height:0;padding:0;background:none;box-shadow:none;clip-path:none;
  font-size:var(--tipo-leyenda);letter-spacing:.06em;color:var(--texto-3)}
.tar-enlace.btn:hover{color:var(--yellow);background:none}
.tar-cerrar.btn{flex:none;min-width:var(--alto-control);min-height:var(--alto-control);padding:0}

/* ---------- FINANZAS · MOVIMIENTOS VINCULADOS (6 oct 2026) ---------- */
/* Qué se registra: el elegido se marca como un filtro activo. */
.modo-alta{margin-bottom:var(--esp-4)}
.modo-alta .btn[aria-pressed="true"]{--filo-color:var(--yellow);color:var(--yellow)}
/* Cada parte de un pago: cuenta, importe, método y «Quitar» al pie. */
.partes{margin-top:var(--esp-3)}
.parte-fila{align-items:end}
.parte-fila > .btn{align-self:end}
/* El grupo en la ficha de un movimiento. */
.vinculados{margin-top:var(--esp-4)}
.vinculados-lista{list-style:none;margin:var(--esp-2) 0 0;padding:0;display:grid;gap:var(--esp-2)}
.vinculados-lista li{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:var(--esp-2) var(--esp-3);
  padding:var(--esp-2) 0;border-bottom:1px solid var(--line);min-width:0}
.vinculados-lista li > span{flex:1 1 14rem;min-width:0;overflow-wrap:anywhere}
.vinculados-lista li > .pill,.vinculados-lista li > .btn{flex:0 0 auto}
.vinculados-lista .dato-menor{display:block}

/* ---------- LA REJILLA DE PERMISOS, POR MÓDULOS (personal.js, 8 oct 2026) ----------
   Eran 50 filas iguales con una banda gris por módulo y se leía como una hoja
   de cálculo. Ahora cada módulo es un bloque: un hueco antes, una cabecera con
   su nombre en M y el resumen «x/N» por rol (Poppins 600), y sus filas plegadas debajo.
   Control total va aparte, arriba, con el filo amarillo. */
.permisos-barra{display:flex;justify-content:flex-end;margin-bottom:var(--esp-3)}
.tabla-permisos .grupo-hueco td{padding:0;height:var(--esp-4);border:0;background:var(--sup-0)}
.tabla-permisos .grupo-hueco:hover,
.tabla-permisos .grupo-hueco{background:transparent}
.tabla-permisos .grupo-permisos td{
  background:var(--sup-1);border-bottom:1px solid var(--line);vertical-align:middle;
  padding-top:var(--esp-3);padding-bottom:var(--esp-3);
}
.tabla-permisos .grupo-permisos td:first-child{
  background:var(--sup-1);box-shadow:inset 3px 0 0 var(--line);
}
.tabla-permisos .grupo-permisos:hover{background:transparent}
.grupo-boton{
  display:inline-flex;align-items:baseline;gap:var(--esp-2);
  background:none;border:0;padding:0;color:var(--texto-1);cursor:pointer;text-align:left;
}
.grupo-boton:focus-visible{outline:2px solid var(--yellow);outline-offset:var(--esp-1)}
.grupo-boton:hover .grupo-nombre{color:var(--yellow)}
.grupo-flecha{color:var(--texto-3);font-size:var(--tipo-descripcion);width:1em}
.grupo-nombre{
  font-family:var(--fuente-dato);font-weight:700;letter-spacing:calc(.01em + var(--tracking-dato));
  font-size:var(--tipo-dato);line-height:1;text-transform:uppercase;color:var(--texto-1);
  transition:color var(--t-rapido) var(--curva);
}
.grupo-cuenta{font-size:var(--tipo-leyenda);color:var(--texto-3);white-space:nowrap}
.grupo-resumen{
  font-family:var(--fuente-titular);font-weight:var(--peso-titular);line-height:var(--interlinea-titular);
  font-size:var(--tipo-entradilla);color:var(--texto-3);
}
.grupo-resumen-alguno{color:var(--texto-1)}
/* El bloque abierto lleva el mismo filo a la izquierda que su cabecera, para
   que se vea dónde empieza y dónde acaba. */
.tabla-permisos .grupo-filas td:first-child{box-shadow:inset 3px 0 0 var(--line)}
.tabla-permisos .grupo-sub td{
  font-size:var(--tipo-rotulo);font-weight:600;text-transform:uppercase;letter-spacing:.12em;
  color:var(--texto-3);padding-top:var(--esp-4);background:transparent;
}
.tabla-permisos .grupo-sub:hover{background:transparent}

/* Administrador: el filo y el nombre en amarillo, y una bajada que dice qué es. */
.tabla-permisos .grupo-admin .grupo-permisos td:first-child{box-shadow:inset 3px 0 0 var(--yellow)}
.tabla-permisos .grupo-admin .grupo-nombre{color:var(--yellow);margin-right:var(--esp-3)}
.grupo-bajada{display:block;max-width:20rem;margin-top:var(--esp-2);font-size:var(--tipo-descripcion);color:var(--texto-2);white-space:normal}
.tabla-permisos .grupo-admin tr:not(.grupo-permisos) td:first-child{box-shadow:inset 3px 0 0 var(--yellow)}
.tabla-permisos .grupo-admin tr:not(.grupo-permisos){background:var(--velo-vivo)}

/* La casilla que ya da Control total: marcada, apagada y sin pulsarse. */
.td-casilla input.casilla-incluida{opacity:.4;cursor:not-allowed}

/* ---------- PERSONAL: PERSONAS Y ROLES (F4, COO, 27 oct 2026) ----------
   La pantalla de accesos, rehecha para leerse sin la matriz (muestrario,
   «Formularios 13»): listas de filas que se abren en su ficha, una frase por
   rol y, dentro del rol, una tarjeta por módulo con el control de tres
   posiciones. La matriz sigue en la pestaña Tabla (arriba, `.tabla-permisos`).

   EL SEGMENTADO es copia del del Dashboard (bot-dashboard/assets/dashboard.css,
   «EL SEGMENTADO»): el mismo aspecto en los dos sitios. Si se toca allí, aquí. */
.segmentado{display:flex;flex-wrap:wrap;gap:var(--esp-2)}
.segmento{
  position:relative;display:inline-flex;align-items:center;justify-content:center;gap:var(--esp-2);
  padding:var(--esp-2) var(--esp-4);min-height:2.3rem;border:0;cursor:pointer;
  font-family:inherit;font-size:var(--tipo-control);font-weight:500;color:var(--texto-3);
  background:var(--velo-1);clip-path:var(--bevel-sm);--filo-color:var(--line);
  box-shadow:inset 0 0 0 1px var(--filo-borde, var(--filo-color));transition:color .15s,background .15s;
}
.segmento:hover:not(:disabled){color:var(--texto-1)}
.segmento[aria-checked="true"]{color:var(--texto-1);background:var(--velo-vivo);--filo-color:var(--yellow)}
@supports (clip-path:polygon(evenodd,0 0,1px 1px,0 1px)){
  .segmento::after{content:'';position:absolute;inset:0;pointer-events:none;clip-path:var(--filo-sm);background:var(--filo-color)}
  .segmento:focus-visible{outline:none;--filo-color:var(--yellow)}
  .segmento:focus-visible::after{clip-path:var(--filo-foco-sm)}
}
.segmento:disabled{cursor:default}
/* Las tres posiciones juntas, como un solo control. Sin permiso para
   cambiarlo: los mismos colores con la opacidad de lo apagado (CEO, 21 oct
   2026: nunca en gris). Incluido en Control total: la elegida, entera. */
.pr-seg{gap:0;flex-wrap:nowrap;flex:none}
.pr-seg .segmento{min-width:3.25rem;padding-inline:var(--esp-3)}
.pr-seg .segmento + .segmento{margin-left:-1px}
.pr-seg:has(.segmento:disabled){opacity:var(--opacidad-apagado)}
/* «—» elegido no es un acento: el amarillo queda para lo que sí da algo. */
.pr-seg .segmento[data-nivel="0"][aria-checked="true"]{color:var(--texto-2);background:var(--velo-2);--filo-color:var(--texto-3)}
.pr-seg.es-incluido{opacity:1}
.pr-seg.es-incluido .segmento:not([aria-checked="true"]){opacity:var(--opacidad-apagado)}

/* Volver a la lista. */
.pr-volver{margin-bottom:var(--esp-4);gap:var(--esp-2)}
.pr-ico{display:inline-flex;flex:none;width:1.15em;height:1.15em}
.pr-ico svg{width:100%;height:100%}

/* LAS LISTAS (personas y roles): una fila por elemento, toda ella un botón que
   abre la ficha. Sin tabla: así el móvil no la convierte en un muro de fichas. */
.pr-lista{list-style:none;margin:0 0 var(--esp-bloque);padding:0;border-top:1px solid var(--linea-suave)}
.pr-fila{
  display:flex;align-items:center;gap:var(--esp-4);width:100%;min-width:0;
  padding:var(--esp-3);border:0;border-bottom:1px solid var(--linea-suave);
  background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;
  transition:background var(--t-rapido) var(--curva);
}
.pr-fila:hover{background:var(--velo-2)}
.pr-fila:focus-visible{outline:2px solid var(--yellow);outline-offset:-2px}
.pr-fila:hover .pr-fila-nombre{color:var(--yellow)}
.pr-fila-quien{display:flex;flex-direction:column;gap:.15rem;flex:1 1 auto;min-width:0}
.pr-fila-nombre{font-weight:600;color:var(--texto-1);transition:color var(--t-rapido) var(--curva)}
.pr-fila-sub{font-size:var(--tipo-descripcion);color:var(--texto-3);overflow-wrap:anywhere}
.pr-fila-frase{font-size:var(--tipo-descripcion);color:var(--texto-2);line-height:1.45;max-width:70ch}
.pr-fila-lado{display:flex;align-items:center;flex-wrap:wrap;justify-content:flex-end;gap:var(--esp-2);flex:none;max-width:45%}
.pr-fila-lado .pill + .pill{margin-left:0}
.pr-fila-cuando{font-size:var(--tipo-descripcion);color:var(--texto-3)}
.pr-fila-flecha{color:var(--texto-3)}
.pr-fila-ico{color:var(--yellow);width:1.4em;height:1.4em}
.pr-vacia{list-style:none}
/* Las iniciales: un cuadro biselado, no un círculo (lo redondo es el radio). */
.pr-ini{
  display:inline-flex;align-items:center;justify-content:center;flex:none;
  width:2.5rem;height:2.5rem;clip-path:var(--bevel-compacto);object-fit:cover;
  background:var(--sup-2);color:var(--yellow);
  font-family:var(--fuente-titular);font-weight:var(--peso-titular);font-size:var(--tipo-descripcion);letter-spacing:.04em;
}
.pr-ini-g{width:3.5rem;height:3.5rem;font-size:var(--tipo-entradilla)}

.pr-nota{color:var(--texto-3);font-size:var(--tipo-descripcion);line-height:1.5;margin:0}
.pr-barra{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--esp-3);margin-bottom:var(--esp-rejilla)}

/* DAR DE ALTA: el buscador arriba y, debajo, el ID y el nombre que rellena. */
.pr-alta .pr-busca{margin-bottom:var(--esp-4);max-width:32rem}
.pr-busca input[type=search]{width:100%}
.pr-resultados{list-style:none;margin:var(--esp-2) 0 0;padding:0;display:grid;gap:var(--esp-1)}
.pr-resultados:empty{display:none}
.pr-resultado-b{
  display:flex;align-items:center;gap:var(--esp-3);width:100%;padding:var(--esp-2) var(--esp-3);
  border:0;background:var(--velo-1);color:inherit;font:inherit;text-align:left;cursor:pointer;clip-path:var(--bevel-compacto);
}
.pr-resultado-b:hover{background:var(--velo-2)}
.pr-resultado-b:focus-visible{outline:2px solid var(--yellow);outline-offset:-2px}
.pr-resultado.es-inactivo{opacity:var(--opacidad-apagado)}
.pr-resultado.es-inactivo .pr-resultado-b{cursor:default}
.pr-resultado .pr-ini{width:2rem;height:2rem}

/* LA FICHA: cabecera, tres tarjetas y lo que puede hacer. */
.pr-cab{display:flex;align-items:flex-start;gap:var(--esp-4);flex-wrap:wrap;margin-bottom:var(--esp-rejilla)}
.pr-cab-t{flex:1 1 16rem;min-width:0}
.pr-cab-nombre{color:var(--texto-1);margin:0 0 var(--esp-2)}
.pr-cab-sub{display:flex;align-items:center;flex-wrap:wrap;gap:var(--esp-3);margin:var(--esp-2) 0 0;color:var(--texto-3);font-size:var(--tipo-descripcion);overflow-wrap:anywhere}
.pr-cab-sub .pill + .pill{margin-left:0}
.pr-cab-ico{color:var(--yellow);width:2.25rem;height:2.25rem}
.pr-cab-accion{flex:none}
.pr-resumen{color:var(--texto-2);font-size:var(--tipo-cuerpo);line-height:1.55;margin:0;max-width:70ch}

.pr-ficha-rejilla{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,19rem),1fr));gap:var(--esp-rejilla);margin-bottom:var(--esp-bloque);align-items:start}
.pr-tarjeta{padding:var(--esp-caja);display:grid;gap:var(--esp-3);min-width:0}
.pr-tarjeta-t{
  font-family:var(--fuente-titular);font-weight:var(--peso-titular);letter-spacing:var(--tracking-titular);
  font-size:var(--tipo-rotulo);text-transform:uppercase;color:var(--texto-3);margin:0;
}
.pr-tarjeta .campo input{width:100%}
.pr-chips{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:var(--esp-2)}
.pr-chip{
  display:inline-flex;align-items:center;gap:var(--esp-1);min-height:2.25rem;padding:0 var(--esp-1) 0 var(--esp-3);
  color:var(--yellow);background:var(--velo-vivo);clip-path:var(--bevel-compacto);
  box-shadow:inset 0 0 0 1px var(--borde-vivo);font-size:var(--tipo-descripcion);font-weight:500;
}
.pr-chip:not(:has(.pr-chip-x)){padding-right:var(--esp-3)}
.pr-chip-x{
  display:inline-flex;align-items:center;justify-content:center;width:1.9rem;height:1.9rem;
  border:0;background:transparent;color:var(--texto-2);cursor:pointer;
}
.pr-chip-x:hover{color:var(--texto-1);background:var(--velo-2)}
.pr-chip-x:focus-visible{outline:2px solid var(--yellow);outline-offset:-2px}
.pr-chip-x .pr-ico{width:1rem;height:1rem}
.pr-anadir{max-width:20rem}
.pr-datos{display:grid;grid-template-columns:auto 1fr;gap:var(--esp-2) var(--esp-4);margin:0;font-size:var(--tipo-descripcion)}
.pr-datos dt{color:var(--texto-3)}
.pr-datos dd{margin:0;color:var(--texto-1);min-width:0;overflow-wrap:anywhere}
.pr-datos dd .dato-menor{margin-top:var(--esp-1)}
.pr-cuarentena:empty{display:none}
.pr-cuarentena .btn{display:inline-flex}
.tabla td.td-estado .dato-menor,.pr-cuarentena .dato-menor{white-space:normal;max-width:none}

/* QUÉ PUEDE HACER: por módulo, cada permiso con su «Viene de». */
.pr-seccion-t{color:var(--texto-1);margin:0 0 var(--esp-3)}
.pr-puede{margin-bottom:var(--esp-bloque)}
.pr-puede > .pr-resumen{margin-bottom:var(--esp-rejilla)}
.pr-puede-lista{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,22rem),1fr));gap:var(--esp-3) var(--esp-rejilla)}
.pr-puede-g{border-top:1px solid var(--linea-suave);padding-top:var(--esp-3);min-width:0}
.pr-puede-mod{
  font-family:var(--fuente-titular);font-weight:var(--peso-titular);letter-spacing:var(--tracking-titular);
  font-size:var(--tipo-descripcion);text-transform:uppercase;color:var(--texto-1);margin:0 0 var(--esp-2);
}
.pr-puede-filas{list-style:none;margin:0;padding:0;display:grid;gap:var(--esp-2)}
.pr-puede-f{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:var(--esp-1) var(--esp-3)}
.pr-puede-que{display:inline-flex;align-items:center;flex-wrap:wrap;gap:var(--esp-2);color:var(--texto-1);font-size:var(--tipo-descripcion);min-width:0}
.pr-puede-que .pill + .pill{margin-left:0}
.pr-viene{color:var(--texto-3);font-size:var(--tipo-descripcion)}
.pr-todo{display:flex;align-items:flex-start;gap:var(--esp-3);padding:var(--esp-caja);--caja-fondo:var(--velo-vivo);color:var(--texto-2)}
.pr-todo > .pr-ico{color:var(--yellow);width:1.6rem;height:1.6rem}
.pr-todo p{margin:0;line-height:1.55}
.pr-todo strong{color:var(--yellow)}
.pr-todo .pr-viene{display:block;margin-top:var(--esp-1)}

/* EL ROL ABIERTO: Administrador arriba y una tarjeta por módulo. */
.pr-admin{padding:var(--esp-caja);margin-bottom:var(--esp-rejilla)}
.pr-admin.es-todo{--caja-fondo:var(--velo-vivo)}
.pr-admin-l{display:flex;align-items:flex-start;gap:var(--esp-4);cursor:pointer}
.pr-admin-l input{flex:none;margin-top:.15rem}
.pr-admin-t{display:grid;gap:var(--esp-1)}
.pr-admin-t strong{color:var(--texto-1);font-weight:600}
.pr-admin.es-todo .pr-admin-t strong{color:var(--yellow)}
.pr-leyenda{margin-bottom:var(--esp-4);max-width:75ch}
.pr-modulos{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,24rem),1fr));grid-auto-flow:dense;align-items:start;gap:var(--esp-3);margin-bottom:var(--esp-bloque)}
.pr-mod{padding:var(--esp-3) var(--esp-4);display:grid;gap:var(--esp-3);min-width:0;align-content:start}
.pr-mod.es-ancha{grid-column:1/-1}
.pr-mod.es-nada .pr-mod-t{color:var(--texto-3)}
.pr-mod-cab{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--esp-2) var(--esp-3);min-height:2.3rem}
.pr-mod-t{
  font-family:var(--fuente-titular);font-weight:var(--peso-titular);letter-spacing:var(--tracking-titular);
  font-size:var(--tipo-descripcion);text-transform:uppercase;color:var(--texto-1);margin:0;
}
.pr-lineas{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,21rem),1fr));gap:var(--esp-2) var(--esp-rejilla)}
.pr-linea{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--esp-2) var(--esp-3);padding-top:var(--esp-2);border-top:1px solid var(--linea-suave);min-width:0}
.pr-linea-t{color:var(--texto-2);font-size:var(--tipo-descripcion)}
.pr-sueltos{display:flex;flex-wrap:wrap;align-items:center;gap:var(--esp-2);border-top:1px solid var(--linea-suave);padding-top:var(--esp-3)}
.pr-mod-cab + .pr-sueltos:only-of-type{border-top:0;padding-top:0}
.pr-sueltos-t{font-size:var(--tipo-rotulo);font-weight:600;text-transform:uppercase;letter-spacing:.12em;color:var(--texto-3);margin-right:var(--esp-1)}
.pr-suelto{font-size:var(--tipo-descripcion)}

/* En el móvil la fila se apila: nombre arriba y estado debajo. */
@media (max-width:36rem){
  .pr-fila{flex-wrap:wrap;gap:var(--esp-2) var(--esp-3)}
  .pr-fila-quien{flex-basis:calc(100% - 5rem)}
  .pr-fila-lado{max-width:none;justify-content:flex-start;order:3;flex-basis:100%;padding-left:calc(2.5rem + var(--esp-3))}
  .pr-fila-rol .pr-fila-lado{padding-left:calc(1.4em + var(--esp-3))}
  .pr-fila-flecha{order:2;margin-left:auto}
}

/* ============================================================================
   LA DEMO (?demo, 17 oct 2026, COO)
   La franja gris de arriba, la misma que la demo del bot (dashboard.css): avisa
   y no se pulsa, salvo «Salir de la demo». La crea DEMO.franja()
   (assets/demo-datos.js) y solo existe con html.modo-demo (assets/demo.js).

   CÓMO SE HACE SITIO SIN TOCAR EL ARMAZÓN: --topbar crece lo que mide la
   franja, y la barra superior lo gasta en relleno de arriba, que queda debajo
   de la franja. Todo lo que ya se medía con --topbar (el lateral pegajoso, el
   cajón móvil, el menú de la cuenta, las cabeceras pegajosas de las tablas y
   el hueco del contenido en el teléfono) baja solo, en los dos anchos.
   ========================================================================== */
html.modo-demo{--franja-h:1.75rem;--topbar:calc(3.5rem + var(--franja-h))}
html.modo-demo .topbar{padding-top:calc(env(safe-area-inset-top) + var(--franja-h))}
.franja{
  position:fixed;top:0;left:0;right:0;z-index:90;
  height:calc(var(--franja-h) + env(safe-area-inset-top));
  padding:env(safe-area-inset-top) var(--esp-4) 0;
  display:flex;align-items:center;justify-content:center;
  background:var(--gris-4);color:var(--ink);
  font-size:var(--tipo-etiqueta);font-weight:600;letter-spacing:.14em;text-transform:uppercase;
}
.franja-in{display:inline-flex;gap:var(--esp-2);align-items:center;white-space:nowrap}
.franja b{font-weight:600}
.franja-salir{
  margin-left:var(--esp-4);padding:0 var(--esp-2);border:0;background:transparent;
  color:var(--ink);font:inherit;letter-spacing:inherit;text-transform:inherit;
  text-decoration:underline;text-underline-offset:2px;cursor:pointer;white-space:nowrap;
}
.franja-salir:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
/* En el móvil, sin «nada se guarda» y con la letra al 80 % de la etiqueta y
   menos aire (COO, 27 oct 2026, al subir la letra pequeña): con 13,5 px y
   .14em, «Demo · datos de ejemplo» + «Salir de la demo» no caben en 360. */
@media (max-width:36rem){
  .franja-mas{display:none}
  .franja{font-size:calc(var(--tipo-etiqueta) * .8);letter-spacing:.06em}
  .franja-salir{margin-left:var(--esp-2)}
}

/* «Ver la demo» en la pantalla de entrar: secundaria, debajo de Discord. */
.entrada-demo{width:100%;margin-top:var(--esp-3)}
