/* ============================================================================
   panel.css — lo que el panel necesita y ni Tabler ni la marca cubren.

   QUÉ NO VA ACÁ: nada de la marca. Los colores, radios, sombras y la escala
   tipográfica viven en wedo.css, que es el único archivo que traduce el
   brandbook a variables `--tblr-*`. Si una regla de acá necesita un color,
   lo pide por token — no lo escribe.

   DE DÓNDE SALE: es el residuo de las 957 líneas que estaban pegadas adentro
   de base.html más static/css/style.css. De todo eso sobrevivieron TRES
   clases: las que las pantallas todavía usan de verdad (`addproject`,
   `margin20`, `toprow`). El resto —`boxxes`, `tablefo`, `marginb20`,
   `.message/.success/.error`, `.sidebar-cta`, `a.nav-links` y un bloque de
   SCSS sin compilar con variables `$sidebar-*`— no lo referenciaba ninguna
   plantilla. Se comprobó una por una antes de borrar.
   ========================================================================== */

/* ── El shell ────────────────────────────────────────────────────────────── */

/* El nombre al lado del símbolo. Se esconde en pantallas chicas porque ahí la
   barra lateral colapsa y el símbolo solo ya identifica la marca. */
.panel-marca-texto {
  margin-left: .55rem;
  font-weight: 600;
  font-size: var(--fs-body);
  letter-spacing: -.01em;
  color: var(--wedo-fg-1);
}
@media (max-width: 575.98px) {
  .panel-marca-texto { display: none; }
}

/* El código de idioma en la topbar: es una etiqueta, no texto de lectura. */
.panel-idioma {
  font-size: var(--fs-caption);
  font-weight: 600;
  letter-spacing: var(--ls-caption);
}

/* ── Lo que sobrevivió del panel viejo ───────────────────────────────────────
   Estas tres las usan add_project.html, edit_project.html y las cinco
   pantallas con `toprow`. Se conservan con el MISMO nombre para no tocar las
   plantillas —eso es la fase F4— pero pidiendo los valores por token en vez de
   traer los hexadecimales de Bootstrap 4 que tenían adentro. */

.addproject {
  display: inline-block;
  padding: .5rem .9rem;
  border: 0;
  border-radius: var(--r-md);
  background: var(--tblr-primary);
  color: var(--wedo-white);
  font-weight: 500;
  text-decoration: none;
}
.addproject:hover { color: var(--wedo-white); text-decoration: none; }

.margin20, .toprow { margin-top: 20px; }

/* Los PNG de la marca son cuadrados OPACOS (sin alfa): sin radio se ven como
   un recorte pegado sobre la barra. El radio chico los vuelve una ficha. */
.navbar-brand .wedo-simbolo { border-radius: var(--r-sm); }

/* ── La barra de carga ──────────────────────────────────────────────────────
   Entre el click y la pantalla nueva hay un hueco donde no pasa nada visible.
   Esto lo llena. Va arriba de todo y no ocupa espacio: no empuja el contenido
   ni cambia la altura, así que no puede romper ninguna maqueta. */
.panel-cargando {
  position: fixed;
  inset-block-start: 0;
  inset-inline-start: 0;
  block-size: 3px;
  inline-size: 0;
  background: var(--tblr-primary);
  box-shadow: 0 0 8px rgba(var(--tblr-primary-rgb), .6);
  z-index: 2000;
  transition: inline-size .12s linear;
}

/* Quien pidió menos movimiento no ve ni la barra ni los números creciendo. */
@media (prefers-reduced-motion: reduce) {
  .panel-cargando { display: none; }
}

/* ── La barra lateral plegada ────────────────────────────────────────────────
   LO QUE NO HAY QUE ESCRIBIR, Y POR QUÉ. Tabler 1.5.1 ya trae el modo angosto
   entero: `data-bs-sidebar="folded"` en el `<html>` cambia `--tblr-sidebar-
   width` por `--tblr-sidebar-folded-width` (4rem), le pone `width:0;opacity:0`
   a los `.nav-link-title` y deja los iconos. Se leyó su CSS real antes de
   escribir una línea — no está en la documentación visible, pero está.

   Todo lo de acá abajo es SÓLO lo que Tabler no cubre: la marca, el centrado
   del icono y el texto para quien navega con teclado.

   Y TODO va dentro de este `@media`, igual que las reglas de Tabler: por
   debajo de 992px la barra no es lateral —es un menú que abre el toggler de
   Bootstrap, con los textos a la vista— y plegarla no significa nada. Una
   regla suelta acá afuera le borraría el nombre de las secciones al que entra
   desde el teléfono. */

@media (min-width: 992px) {

  /* El nombre «Panel WeDo» no entra en 4rem: queda el símbolo solo, centrado.
     El padding se pide por la variable que Tabler expone para eso en vez de
     redeclarar su `padding`, que es la diferencia entre pasarle un valor al
     framework y pelearse con él. */
  html[data-bs-sidebar="folded"] .navbar-vertical.navbar-expand-lg .navbar-brand {
    --tblr-sidebar-brand-padding-x: 0;
    justify-content: flex-start;
  }
  html[data-bs-sidebar="folded"] .navbar-vertical.navbar-expand-lg .navbar-brand .wedo-simbolo {
    margin-inline: calc((var(--tblr-sidebar-folded-width) - 32px) / 2);
  }
  html[data-bs-sidebar="folded"] .panel-marca-texto { display: none; }

  /* Sin el texto al lado, el icono queda pegado al borde izquierdo: centrarlo
     es lo que vuelve la columna una columna y no una lista recortada. Tabler
     centra el `.nav-link` por defecto y lo vuelve a `start` justo en la barra
     vertical de escritorio — acá se le devuelve el valor que él mismo usa.

     El `position` es el ancla de la etiqueta de abajo. Tabler ya lo declara,
     pero se repite A PROPÓSITO: si mañana lo saca, la etiqueta no se
     descoloca un poco, se va al borde de la ventana. Una regla que depende
     de un detalle no documentado de otro paquete se cae sin avisar. */
  /* LOS-ICONOS-EN-UNA-COLUMNA (23-sep, pedido del usuario). Centrar el item
     entero se veía bien plegado, pero al abrirse por hover el icono se corría
     al medio y el texto quedaba flotando: feo, y cada icono en una x distinta.
     Ahora el icono vive en una columna FIJA del ancho de la barra plegada y
     el texto se suma a su derecha: plegado o abierto, cada icono queda en el
     mismo lugar y nada salta. */
  html[data-bs-sidebar="folded"] .navbar-vertical.navbar-expand-lg .nav-link {
    position: relative;
    justify-content: flex-start;
    padding-inline: 0;
  }
  html[data-bs-sidebar="folded"] .navbar-vertical.navbar-expand-lg .nav-link-icon {
    inline-size: var(--tblr-sidebar-folded-width);
    display: inline-flex;
    justify-content: center;
    flex: 0 0 auto;
    margin: 0;
  }

  /* EL TEXTO PARA EL TECLADO. Plegada, el que usa el mouse tiene el `title`
     del enlace y el lector de pantalla tiene el nombre accesible intacto
     —Tabler esconde el título con `width:0`, que lo saca de la vista pero no
     del árbol de accesibilidad—. El que tabula con el teclado no tenía
     ninguno de los dos: veía siete iconos y un anillo de foco.

     Acá el título del item enfocado sale flotando al costado. Se puede porque
     Tabler ya le pone `overflow:visible` a la barra y al `.navbar-collapse`
     cuando está plegada —lo necesita para sus propios menús laterales—, así
     que la etiqueta no queda recortada contra el borde de 4rem.

     Se eligió esto y NO abrir la barra entera al enfocar: abrirla mueve el
     borde y tapa el contenido, y el objetivo es leer una palabra. */
  html[data-bs-sidebar="folded"] .navbar-vertical.navbar-expand-lg .nav-link:focus-visible .nav-link-title {
    position: absolute;
    inset-inline-start: calc(100% + .5rem);
    inset-block-start: 50%;
    transform: translateY(-50%);
    z-index: 1031;  /* la barra lateral de Tabler vive en 1030 */
    width: auto;
    padding: .25rem .625rem;
    opacity: 1;
    font-size: var(--fs-caption);
    color: var(--wedo-fg-1);
    background: var(--tblr-bg-surface);
    border: 1px solid var(--tblr-border-color);
    border-radius: var(--r-sm);
    box-shadow: var(--tblr-shadow-lg);
  }
}

/* ── El menú plegado se abre al acercar el cursor ────────────────────────────
   Pedido del usuario: plegado muestra sólo iconos, y al acercarse se despliega.

   TRES DECISIONES QUE NO SON DE GUSTO:

   1. **Se SUPERPONE, no empuja.** Si al desplegarse corriera el contenido, la
      pantalla entera saltaría cada vez que el cursor pasa cerca del borde
      izquierdo — y pasa todo el tiempo, sin intención de abrir el menú. Por eso
      la barra crece sobre el contenido y el `page-wrapper` no se entera.

   2. **Sólo donde hay cursor de verdad.** `hover: hover` deja fuera a las
      pantallas táctiles, donde «hover» se dispara con el primer toque y el menú
      se abriría solo al tocar cualquier cosa cerca. Ahí queda el botón, que
      sigue estando.

   3. **Sólo con la barra plegada.** Expandida no hay nada que desplegar. */
@media (min-width: 992px) and (hover: hover) and (pointer: fine) {
  html[data-bs-sidebar="folded"] .navbar-vertical.navbar-expand-lg {
    transition: width .18s ease;
    width: var(--tblr-sidebar-folded-width);
    z-index: 1030;
  }

  html[data-bs-sidebar="folded"] .navbar-vertical.navbar-expand-lg:hover,
  html[data-bs-sidebar="folded"] .navbar-vertical.navbar-expand-lg:focus-within {
    width: 16rem;
    box-shadow: var(--sh-3);
  }

  /* El texto vuelve mientras está abierta. Tabler lo esconde con
     `width:0; opacity:0`, así que se revierte exactamente eso y nada más. */
  html[data-bs-sidebar="folded"] .navbar-vertical.navbar-expand-lg:hover .nav-link-title,
  html[data-bs-sidebar="folded"] .navbar-vertical.navbar-expand-lg:focus-within .nav-link-title {
    width: auto;
    opacity: 1;
    transition: opacity .18s ease .04s;
  }

  html[data-bs-sidebar="folded"] .navbar-vertical.navbar-expand-lg:hover .panel-marca-texto,
  html[data-bs-sidebar="folded"] .navbar-vertical.navbar-expand-lg:focus-within .panel-marca-texto {
    display: inline;
  }

  /* LA-ETIQUETA-QUE-SE-IBA-DE-LA-FILA (23-sep). Con la barra abierta —por el
     cursor o porque alguien tabuló adentro— la etiqueta flotante del foco
     sobra: el texto ya está al lado, en su fila.

     La regla que intentaba apagarla apuntaba a `.nav-link:focus-visible::after`
     y ese pseudo-elemento NO EXISTE: la etiqueta se dibuja sobre el
     `.nav-link-title` de verdad, unas líneas más arriba. O sea que era una
     regla muerta, y su efecto de verdad era el contrario del que dice el
     comentario: al tabular con la barra ABIERTA, la regla de arriba —que gana
     por especificidad— le sacaba el título a su fila y lo mandaba a flotar a
     16rem del borde, encima del contenido. El item enfocado quedaba sin
     nombre y el nombre quedaba sin item.

     Sólo se revierte lo que aquella regla puso; el `width:auto` y el
     `opacity:1` los quiere también el estado abierto, así que no se tocan. */
  html[data-bs-sidebar="folded"] .navbar-vertical.navbar-expand-lg:hover .nav-link:focus-visible .nav-link-title,
  html[data-bs-sidebar="folded"] .navbar-vertical.navbar-expand-lg:focus-within .nav-link:focus-visible .nav-link-title {
    position: static;
    inset: auto;
    transform: none;
    z-index: auto;
    padding: 0;
    font-size: inherit;
    color: inherit;
    background: none;
    border: 0;
    border-radius: 0;
    box-shadow: none;
  }
}

/* Quien pidió menos movimiento: el menú se abre igual, pero sin animar. */
@media (prefers-reduced-motion: reduce) {
  html[data-bs-sidebar="folded"] .navbar-vertical.navbar-expand-lg,
  html[data-bs-sidebar="folded"] .navbar-vertical.navbar-expand-lg .nav-link-title {
    transition: none;
  }
}

/* ── El botón de plegar ──────────────────────────────────────────────────────
   Se muestra en UN solo caso: pantalla ancha (la barra es lateral de verdad) y
   SIN hover (una tablet en horizontal). Con cursor el menú se despliega
   acercándose y el botón es ruido; por debajo de 992px la barra es un menú
   desplegable y plegarla no hace nada.

   Va en negativo —oculto por defecto, visible en ese caso— para no tener que
   ganarle con `!important` a las utilidades de Bootstrap. */
.panel-plegar { display: none; }

@media (min-width: 992px) and (hover: none) {
  .panel-plegar { display: flex; }
}

/* ── El enlace de «saltar al contenido» ──────────────────────────────────────
   Está SIEMPRE en el DOM y es la primera parada del tabulador; lo que cambia
   al enfocarlo es dónde se dibuja.

   POR QUÉ `transform` Y NO `display:none` NI `visibility:hidden`: esos dos
   sacan al elemento del recorrido del tabulador, así que el enlace no se
   podría enfocar — y un enlace de salto que no se puede enfocar no existe.
   Con `position:fixed` no ocupa lugar en la maqueta y no puede empujar nada,
   y corrido hacia arriba queda fuera de la ventana sin dejar de ser
   enfocable. Tampoco se usa la utilidad de Bootstrap: ésta necesita quedar
   por encima de la cortina de carga, y eso es una regla propia.

   El z-index va por encima de la barrita de carga (2000) y de la barra
   lateral de Tabler (1030): enfocado tiene que verse sobre todo. */
.panel-saltar {
  position: fixed;
  inset-block-start: .5rem;
  inset-inline-start: .5rem;
  z-index: 2100;
  padding: .5rem .9rem;
  border-radius: var(--r-sm);
  /* SUPERFICIE Y NO EL AZUL DE MARCA, y es el único detalle discutible de esta
     regla. Blanco sobre `--tblr-primary` da 2.8:1 en modo oscuro, por debajo
     del 4.5:1 que pide texto normal — el resto del panel lo hace igual (los
     botones primarios de Tabler, `.addproject`) y ahí es una decisión de marca
     tomada. Acá no: esto es JUSTAMENTE la pieza para quien no puede usar el
     mouse, y que se lea mal sería el chiste al revés. Sobre la superficie, con
     el color de texto del tema, contrasta en los dos y el borde azul lo
     mantiene inconfundible. */
  background: var(--tblr-bg-surface);
  color: var(--wedo-fg-1);
  border: 2px solid var(--tblr-primary);
  box-shadow: var(--sh-3);
  font-weight: 600;
  text-decoration: none;
  transform: translateY(-200%);
}

.panel-saltar:focus {
  transform: translateY(0);
  color: var(--wedo-fg-1);
}

/* El destino del salto recibe el foco por programa y no es un control: el
   anillo ahí no dice nada que el salto no haya dicho ya, y encuadra la
   pantalla entera. El foco SÍ se mueve — que es lo único que importaba. */
#contenido:focus {
  outline: none;
}

/* ── «Afinar un proyecto» ────────────────────────────────────────────────────
   Diez reglas, y ninguna es un color: todo sale de los tokens de wedo.css. Lo
   que Tabler no cubre acá es geometría — una miniatura que no se deforme, una
   URL larga que no rompa la tarjeta, y una fila marcada para borrar que se
   distinga de una viva sin desaparecer. */

/* La fila de una lista editable. El borde es lo que la vuelve una unidad: sin
   él, ocho campos seguidos se leen como un formulario de cuarenta. */
.afinar-fila {
  padding: .75rem;
  border: 1px solid var(--tblr-border-color);
  border-radius: var(--r-md);
  background: var(--tblr-bg-surface);
}
.afinar-lista .afinar-fila + .afinar-fila { margin-top: .5rem; }

/* Quitada: se ve que se va, pero se sigue leyendo — hay que poder arrepentirse
   mirando lo que se está por perder. Los campos ya están `disabled`, así que
   el navegador los atenúa solo; esto es lo que marca la FILA.
   `opacity` y no `display:none` a propósito: una fila que desaparece no tiene
   dónde poner el botón de deshacer. */
.afinar-fila-quitada {
  opacity: .5;
  border-style: dashed;
  border-color: var(--tblr-danger, var(--wedo-fg-3));
}

/* Un hijo de flex no se recorta si no se le permite achicarse por debajo de su
   contenido. Sin esto, `text-truncate` no trunca: estira la fila.
   El piso de 10rem es para el teléfono: con miniatura, nombre y cuatro botones
   en 360px el nombre quedaba en tres letras. Con este mínimo, el nombre se
   trunca hasta ahí y los botones bajan de línea (la fila tiene `flex-wrap`);
   en escritorio sobra ancho y nada se mueve. */
.afinar-recorte { min-width: min(100%, 10rem); }

/* La miniatura de cada imagen. `object-fit: cover` la recorta en vez de
   deformarla — las URLs vienen con proporciones distintas de tres orígenes. */
.afinar-miniatura {
  inline-size: 72px;
  block-size: 48px;
  flex: 0 0 auto;
  object-fit: cover;
  border-radius: var(--r-sm);
  background: var(--tblr-bg-surface-secondary);
}
/* Una URL caída deja el icono de imagen rota, que se lee como un error de la
   pantalla. Queda un rectángulo vacío, que se lee como lo que es: esa imagen
   no está. El JS sólo agrega la clase; qué se ve lo decide el CSS. */
.afinar-miniatura-rota { visibility: hidden; }

.afinar-fachada {
  inline-size: 100%;
  max-block-size: 220px;
  object-fit: cover;
  border-radius: var(--r-md);
}

.afinar-mapa {
  padding: .75rem;
  border: 1px solid var(--tblr-border-color);
  border-radius: var(--r-md);
  background: var(--tblr-bg-surface-secondary);
}

/* El link de Maps es largo y no tiene espacios: sin esto empuja la tarjeta y
   aparece una barra horizontal en toda la pantalla. */
.afinar-url {
  display: block;
  padding: .375rem .5rem;
  border-radius: var(--r-sm);
  background: var(--tblr-bg-surface);
  font-size: var(--fs-caption);
  overflow-wrap: anywhere;
}

/* Las directivas se MIRAN, no se editan acá: monoespaciada, con su salto de
   línea, y con tope de alto para que un bloque de 700 caracteres no empuje el
   riel entero fuera de la pantalla. */
.afinar-directivas {
  max-block-size: 18rem;
  overflow: auto;
  margin: 0;
  font-size: var(--fs-caption);
  white-space: pre-wrap;
  overflow-wrap: anywhere;
  color: var(--wedo-fg-2);
}

/* El riel queda a la vista mientras se baja por las siete secciones: es el
   índice de lo que falta, y sirve justamente mientras se trabaja lejos de él.
   Sólo en escritorio: en una columna única, pegarlo arriba taparía el
   contenido en vez de acompañarlo. */
@media (min-width: 1200px) {
  .afinar-riel {
    position: sticky;
    inset-block-start: 1rem;
  }
}

/* ── Las listas de asesores e inmobiliarias (F9) ─────────────────────────────
   Un menú de acciones por fila, y adentro cada acción sigue siendo su propio
   <form> con su CSRF: el botón ES el ítem del menú. Tres reglas de geometría,
   ningún color. */

/* Un <form> adentro del desplegable no puede sumar alto ni margen: si lo
   suma, los ítems que son formularios quedan más separados que los que son
   links y el menú se lee desparejo. */
.dropdown-menu form { margin: 0; }

/* La nota bajo un ítem deshabilitado —por qué no se puede— envuelve en vez
   de estirar el menú a lo ancho de una oración entera. */
.panel-menu-nota {
  max-inline-size: 18rem;
  white-space: normal;
}

/* Un hijo de flex no se recorta si no se le permite achicarse por debajo de
   su contenido: sin esto, `text-truncate` no trunca el nombre largo de un
   asesor, estira la celda. Es el mismo caso que `.afinar-recorte`, sin el piso
   de 10rem porque acá la fila no envuelve. */
.panel-recorte { min-width: 0; }

/* La lista de proyectos asignados del formulario de asesores: tope de alto y
   scroll, para que veinte proyectos no empujen el resto de la tarjeta. Antes
   era un `style="max-height: 12rem"` incrustado en el HTML. */
.panel-lista-corta { max-block-size: 12rem; }

/* ── Las secciones plegables de los formularios ──────────────────────────────
   Un `<details>` con la cabecera de tarjeta como `<summary>`. Nativo: ni
   JavaScript ni librería deciden si se ve. Lo único que se estila es lo que
   el navegador pone por defecto y acá no va: el triángulo del marcador, y el
   `display` de lista del summary. */

/* Tabler pone `.card` en flex-columna; un <details> tiene que ser bloque para
   que el navegador maneje el plegado sin sorpresas entre motores. */
.panel-seccion { display: block; }

/* La cabecera entera es el control: cursor de mano, sin marcador nativo, y
   con el foco de teclado visible (Enter o espacio la abre). */
.panel-seccion-cabecera {
  display: flex;
  align-items: center;
  gap: .75rem;
  list-style: none;
  cursor: pointer;
  user-select: none;
}
.panel-seccion-cabecera::-webkit-details-marker { display: none; }
.panel-seccion-cabecera:focus-visible {
  outline: 2px solid var(--tblr-primary);
  outline-offset: -2px;
}

/* El título crece y se puede recortar; la flecha queda a la derecha. */
.panel-seccion-titulo { flex: 1 1 auto; min-width: 0; }
.panel-seccion-flecha {
  flex: 0 0 auto;
  color: var(--wedo-fg-3);
  transition: transform .2s ease;
}
.panel-seccion[open] > .panel-seccion-cabecera .panel-seccion-flecha { transform: rotate(180deg); }
@media (prefers-reduced-motion: reduce) {
  .panel-seccion-flecha { transition: none; }
}

/* Cerrada, la cabecera es lo único que hay: sin la línea de abajo, que
   quedaría pegada al borde inferior de la tarjeta. */
.panel-seccion:not([open]) > .panel-seccion-cabecera { border-bottom: 0; }

/* ── Los gráficos del dashboard ─────────────────────────────────────────────
   Chart.js dimensiona el canvas contra su CONTENEDOR, no contra la ventana. Sin
   un alto acá, `maintainAspectRatio: false` deja el canvas en cero y el gráfico
   no aparece — y con `true` la tarjeta crece a lo alto en cada pantalla
   distinta. El alto va en el contenedor y el canvas lo llena.

   `position: relative` es requisito de Chart.js para el redimensionado: sin él
   el canvas crece en cada `resize` y nunca vuelve a achicarse. */
.panel-grafico { position: relative; height: 240px; }
.panel-grafico-alto { height: 320px; }

/* En teléfono se ganan unos píxeles de alto: una torta de 240px con su leyenda
   al lado no entra, y la leyenda se va abajo. */
@media (max-width: 575.98px) {
  .panel-grafico { height: 260px; }
  .panel-grafico-alto { height: 280px; }
}

/* ── El panorama por inmobiliaria ───────────────────────────────────────────
   El punto de color y la barrita de proporción. El COLOR lo pinta el script
   —es aleatorio por carga, ver panel-interaccion del dashboard— así que acá
   sólo va la forma. Sin JavaScript se ven en gris: la tarjeta sigue diciendo
   los cuatro números, que es lo que importa. */
.panel-tenant-punto {
  inline-size: .7rem; block-size: .7rem; border-radius: 50%;
  background: var(--tblr-border-color); flex: 0 0 auto;
}
.panel-tenant-barra {
  block-size: 4px; border-radius: 2px; margin-block-start: .4rem;
  background: var(--tblr-border-color); overflow: hidden;
}
.panel-tenant-barra > span {
  display: block; block-size: 100%;
  background: var(--tblr-border-color); border-radius: 2px;
  /* POR KEYFRAMES Y NO POR `transition`. El ancho final viene en el `style` de
     la plantilla, así que ya está puesto cuando la barra aparece: una
     transición no tiene de dónde a dónde ir y nunca dispararía. La animación
     va DESDE cero hasta el ancho calculado, y de paso funciona sin una línea
     de JavaScript. `inline-size` y no `transform` porque el borde redondeado
     se deformaría con la escala. */
  animation: panel-barra-crece .7s cubic-bezier(.22, 1, .36, 1) both;
}
@keyframes panel-barra-crece { from { inline-size: 0; } }

@media (prefers-reduced-motion: reduce) {
  .panel-tenant-barra > span { animation: none; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   EL TABLERO — las formas del dashboard neón (24-sep)

   NI UN COLOR ESCRITO ACÁ: todo sale de los tokens de wedo.css, y el brillo de
   `--neon-halo-fuerza`, que vale 0 en claro. Por eso las mismas reglas sirven
   para los dos temas sin una sola pregunta por el tema.

   TODO VA SCOPEADO A `.tablero`, el envoltorio del dashboard. El panel tiene
   nueve pantallas más con tarjetas de formulario y de tabla donde el halo es
   ruido, y encima cuesta repintado al hacer scroll. ═══════════════════════ */

.tablero .card {
  border: 1px solid var(--neon-trazo);
  box-shadow: inset 0 1px 0 var(--wedo-filo), var(--neon-halo);
  background-clip: padding-box;   /* sin esto el fondo se mete bajo el borde */
}
.tablero .card-header { border-bottom: 0; padding-block-end: .25rem; }

.tablero .card-link { transition: transform .18s ease, box-shadow .18s ease; }
.tablero .card-link:hover,
.tablero .card-link:focus-visible {
  transform: translateY(-2px);
  box-shadow: inset 0 1px 0 var(--wedo-filo), var(--neon-halo-2);
}

/* El lavado de color en la esquina. `background-image` y no `background-color`
   para no pelearse con el de Tabler. */
.tablero .panel-neon {
  background-image: radial-gradient(120% 90% at 0% 0%,
                    var(--neon-lavado) 0%, transparent 62%);
}

/* ── El título de tarjeta: MAYÚSCULAS con aire ──────────────────────────── */
.tablero .card-title {
  font-size: var(--fs-rotulo); line-height: 1.35;
  letter-spacing: var(--ls-rotulo); text-transform: uppercase;
  font-weight: 600; color: var(--wedo-fg-3);
}
/* EXCEPCIÓN: el nombre de una inmobiliaria es un NOMBRE PROPIO, no un rótulo.
   En mayúsculas chicas y gris quedaría degradado a etiqueta justo la tarjeta
   que hay que destacar. */
.tablero .tablero-nombre {
  font-size: var(--fs-h3); line-height: 1.3; letter-spacing: normal;
  font-weight: 600; color: var(--wedo-fg-1); text-transform: none;
  margin: 0; min-width: 0;
}

/* ── El KPI ─────────────────────────────────────────────────────────────────
   `--neon-acento` es una variable NUEVA y no una redefinición de `--neon-1`:
   `--neon-1: var(--neon-1)` sería un ciclo de var() y la propiedad quedaría
   inválida, dejando la tarjeta sin acento. */
.panel-kpi[data-neon="1"] { --neon-acento: var(--neon-1); }
.panel-kpi[data-neon="2"] { --neon-acento: var(--neon-2); }
.panel-kpi[data-neon="3"] { --neon-acento: var(--neon-3); }
.panel-kpi[data-neon="4"] { --neon-acento: var(--neon-4); }
.panel-kpi[data-neon="5"] { --neon-acento: var(--neon-5); }

.panel-kpi-cifra {
  font-size: var(--fs-dato); line-height: 1.05; font-weight: 700;
  color: var(--neon-cifra); font-variant-numeric: tabular-nums;
  /* En claro la fuerza es 0 → el blur queda en 0px → ninguna sombra.
     Una sola regla, los dos temas. */
  text-shadow: 0 0 calc(var(--neon-halo-fuerza) * .9px)
               color-mix(in srgb, var(--neon-cifra) 38%, transparent);
}
.panel-kpi-pie {
  font-size: var(--fs-caption); line-height: 1.4; color: var(--wedo-fg-3);
  /* Sin esto la fila de KPI salta de alto cuando a uno le falta el pie. */
  min-block-size: calc(var(--fs-caption) * 1.4);
}
.panel-kpi-pie b { color: var(--wedo-fg-2); font-weight: 600; }

/* ── El riel de composición ─────────────────────────────────────────────────
   Es el «mini-gráfico» del KPI, y va en HTML y no en un canvas por la misma
   razón que sacó al panorama de Chart.js: se lee sin JavaScript, sobrevive a
   que el CDN no llegue, y no agrega cuatro instancias de Chart.js por seis
   píxeles de alto. El riel SIEMPRE se ve: un KPI sin desglose muestra la pista
   vacía, que es el dato — no un hueco. */
.panel-rail {
  display: flex; gap: 2px; block-size: 6px; overflow: hidden;
  border-radius: var(--r-pill); margin-block-start: .6rem;
  background: var(--wedo-linea-suave);
}
.panel-rail-seg {
  flex: 1 1 0; min-inline-size: 3px; border-radius: var(--r-pill);
  background: var(--neon-seg, var(--neon-acento, var(--neon-1)));
  box-shadow: 0 0 calc(var(--neon-halo-fuerza) * .5px) currentColor;
  transform-origin: left center;
  /* Keyframes y no `transition`: el ancho lo pone `flex-grow` en el `style`,
     así que ya está puesto al aparecer y una transición nunca dispararía. Es
     el mismo motivo que `.panel-tenant-barra > span`. */
  animation: panel-rail-entra .6s cubic-bezier(.22, 1, .36, 1) both;
}
.panel-rail-seg.es-resto {
  background: color-mix(in srgb, var(--neon-acento, var(--neon-1)) 26%, transparent);
}
@keyframes panel-rail-entra { from { transform: scaleX(0); opacity: 0; } }

/* ── El panorama, subido a neón ─────────────────────────────────────────────
   El color lo sigue pintando el script (es aleatorio por carga); acá sólo se
   suma la luz, que en claro vale cero. El script escribe UNA sola propiedad
   por tarjeta (`--c`): si escribiera `background` directo, el degradado y el
   halo de acá serían imposibles. */
.tablero [data-tenant] { --c: var(--tblr-border-color); }
.tablero .panel-tenant-punto {
  background: var(--c);
  box-shadow: 0 0 calc(var(--neon-halo-fuerza) * .7px) var(--c),
              0 0 0 3px color-mix(in srgb, var(--c) 16%, transparent);
}
.tablero .panel-tenant-barra { background: var(--wedo-linea-suave); }
.tablero .panel-tenant-barra > span {
  background: linear-gradient(90deg,
              color-mix(in srgb, var(--c) 45%, var(--wedo-surface-1)), var(--c));
  box-shadow: 0 0 calc(var(--neon-halo-fuerza) * .45px) var(--c);
}

/* El lienzo respira: con 240px y la leyenda abajo, el anillo queda sin lugar
   para el total al centro. Va en ALTO, no en ancho: no es un px de layout. */
.tablero .panel-grafico { height: clamp(240px, 30vh, 300px); }
.tablero .panel-grafico-alto { height: clamp(300px, 40vh, 360px); }

/* NINGUNA animación nueva PULSA, a propósito: un halo que late es la primera
   cosa que molesta en una pantalla que se mira todo el día. */
@media (prefers-reduced-motion: reduce) {
  .panel-rail-seg { animation: none; }
  .tablero .card-link { transition: none; }
  .tablero .card-link:hover,
  .tablero .card-link:focus-visible { transform: none; }
}


/* ── MARCA-DE-AGUA (26-sep) ───────────────────────────────────────────────
   El logo de WeDo detrás del contenido de todas las pantallas. Fija al
   viewport para que siga centrada al hacer scroll, y corrida a la derecha de
   la barra lateral con la misma variable que usa Tabler para el margen del
   `page-wrapper` (así se achica sola cuando la barra se pliega). Va DEBAJO
   del contenido —`z-index:-1` dentro del contexto de apilamiento que crea el
   `page-wrapper`— así que las tarjetas la tapan y sólo se ve en el fondo.
   `pointer-events:none`: nada se hace inclickeable por tenerla encima.

   El dibujo es una máscara con alfa (static/marca/logo-wedo-mascara.png,
   generada del logo azul: blanco → transparente) y el color lo da
   `background-color`, así que el mismo archivo sirve en claro y en oscuro; la
   opacidad es lo único que cambia por tema. */
.page-wrapper { position: relative; z-index: 0; }
.panel-marca-de-agua {
  position: fixed; top: 0; bottom: 0; right: 0; left: 0;
  z-index: -1; pointer-events: none;
  background-color: var(--wedo-blue);
  opacity: .07;
  -webkit-mask: url('/static/marca/logo-wedo-mascara.png') center / min(56vw, 640px) auto no-repeat;
          mask: url('/static/marca/logo-wedo-mascara.png') center / min(56vw, 640px) auto no-repeat;
}
@media (min-width: 992px) {
  .panel-marca-de-agua { left: var(--tblr-sidebar-width, 15rem); }
}
[data-bs-theme="dark"] .panel-marca-de-agua { opacity: .10; }
@media print { .panel-marca-de-agua { display: none; } }

/* ── CERRAR-SESION-EN-EL-MENU (26-sep) ─────────────────────────────────────
   La última entrada de la barra lateral es «Cerrar sesión». En ≥992px Tabler
   hace que la lista (`.navbar-nav`) crezca hasta llenar la barra
   (`flex-grow:1`), así que `margin-top:auto` la empuja al pie; el borde la
   separa de las secciones. Por debajo la barra es un menú desplegable y queda
   simplemente al final, con el mismo borde. */
.navbar-vertical .panel-salir {
  border-top: 1px solid var(--tblr-border-color-translucent, rgba(128,128,128,.2));
  padding-top: .5rem;
}
@media (min-width: 992px) {
  .navbar-vertical.navbar-expand-lg .panel-salir { margin-top: auto; }
}


/* ── NOTIFICACIONES-EN-EL-PANEL (27-sep) ──────────────────────────────────
   La campana lleva el número naranja arriba a la derecha (Tabler:
   badge-notification); una tarjeta no leída se distingue por el fondo. */
/* El número va ABAJO A LA IZQUIERDA de la campana (pedido del usuario, 27-sep),
   chico y de tamaño fijo. No se usa `.badge-notification` de Tabler: lleva
   `top:0 !important`, así que no se puede bajar sin otro !important —y acá no
   se escribe ninguno—; con `bottom` encima de ese `top` el badge se estiraba
   hasta ocupar toda la campana. Clase propia, posición propia. */
/* NO es un `.badge` de Tabler a propósito: `.navbar .navbar-nav .nav-link
   .badge` le impone posición, y `.badge` tamaño y padding relativos a la
   fuente — por eso salía grande y estirado (v142–v144). Es un cuadrado propio
   de 16px, esquinas redondeadas, en la esquina inferior IZQUIERDA del
   recuadro del icono, a caballo del borde (pedido del usuario, 27-sep).
   Con dos cifras crece a lo ancho y nada más. */
#panel-campana .panel-campana-contador {
  position: absolute; z-index: 1;
  /* esquina inferior IZQUIERDA del recuadro, a caballo del borde: mitad
     adentro, mitad afuera (donde señaló el usuario, 27-sep). */
  left: 1px; top: calc(100% - 9px);
  box-sizing: border-box;
  width: auto; min-width: 16px; height: 16px; padding: 0 3px;
  border-radius: 4px;
  background: var(--tblr-orange, #f76707); color: #fff;
  font-size: 10px; line-height: 16px; font-weight: 600; text-align: center;
  display: inline-block; white-space: nowrap;
}
.panel-notificaciones .panel-notif-nueva { background: color-mix(in srgb, var(--wedo-blue) 6%, var(--tblr-bg-surface)); }
.panel-notif-detalle { padding-left: 1.1rem; }
.panel-notif-detalle li { margin-bottom: .35rem; overflow-wrap: anywhere; }
