/* ============================================================================
   Bandeja de WhatsApp — aspecto fiel a WhatsApp Web.
   ----------------------------------------------------------------------------
   Decisión de Mario (2026-09-01): que se parezca a WhatsApp aunque rompa con la
   paleta de Ubold. El motivo es de uso, no de gusto: quien atiende la bandeja
   viene de usar WhatsApp todo el día y no debería tener que aprender otra cosa.

   Va en su PROPIO archivo y no en `personalizados.css` porque estos colores son
   agresivos y `personalizados.css` lo carga TODA pantalla del sistema: una
   variable mal puesta acá teñiría facturación.

   Paleta oficial de WhatsApp Web:
     #008069 verde de acento   #efeae2 fondo del chat   #d9fdd3 burbuja propia
     #f0f2f5 barras            #ffffff burbuja ajena    #667781 texto secundario
   ============================================================================ */

/* ⚠ La paleta va en `:root`, no en `.wa-app`. Las modales de Bootstrap se pintan FUERA de ese
   contenedor, así que declarada ahí les llegaba vacía: `color:var(--wa-verde)` quedaba inválido y
   el ícono heredaba el gris del tema. Esta hoja solo la carga la pantalla de WhatsApp, de modo que
   `:root` no se le filtra a ninguna otra. */
:root{
  --wa-verde:#008069; --wa-fondo:#efeae2; --wa-propia:#d9fdd3; --wa-barra:#f0f2f5;
  --wa-sec:#667781; --wa-borde:#e9edef; --wa-tick:#53bdeb;
  /* Altura compartida por las DOS cabeceras: si difieren, la línea que separa el
     encabezado del contenido se ve quebrada justo en el medio de la pantalla. */
  --wa-head-h:60px;
}

/* La maquetación se queda en el contenedor: en `:root` le pondría `display:flex` y un borde
   al <html> de la página entera. */
.wa-app{
  /* ⚠ 118 px: 70 de la barra superior, 24 del `mt-3` —la bandeja estaba pegada a la barra, lo
     notó Mario el 2026-09-10— y 24 de aire abajo, los mismos de arriba.
     Eran 168 mientras la pantalla tuvo pie. Desde que no lo lleva —pedido de Mario, ver el
     comentario en `whatsapp/index.php`— esos 70 px se los queda el chat, que es donde hacen
     falta: la lista de mensajes crece hasta el borde de la ventana. */
  /* ⚠ Las DOS declaraciones, en este orden. `dvh` es el alto que de verdad se ve —descuenta la
     barra del navegador del teléfono— y `vh` no; el navegador que no entienda `dvh` se queda con
     la primera y el que sí, con la segunda. Ver el bloque del teléfono, más abajo. */
  display:flex; min-height:460px;
  /* ⚠ 70 px: solo la barra superior. Antes eran 118 —70 de barra, 24 del `mt-3` y 24 de aire
     abajo—; Mario pidió el 100 % de la pantalla, así que el `mt-3` se fue del markup y el aire
     de abajo con él. Medido a 1440×900: la bandeja pasa de 1152×782 a 1200×830. */
  height:calc(100vh - 70px);
  height:calc(100dvh - 70px);
  /* Sin borde ni esquinas redondeadas: pegada a los bordes, un recuadro dibujaría una caja
     dentro de otra. Se conserva la línea de arriba para separarla de la barra superior. */
  border-top:1px solid var(--wa-borde); overflow:hidden; background:#fff;
}

/* ⚠ Los dos contenedores del tema ponen 12 px de relleno a cada lado y 0 abajo; acá se los
   quita para que la bandeja llegue a los bordes. Va por clase y NO tocando `.content-page`:
   esa clase la usan todas las pantallas del sistema. */
.content-page.wa-pantalla, .container-fluid.wa-pantalla{ padding-left:0; padding-right:0; }

/* ---------- Lista de conversaciones ---------- */
.wa-lista{ width:380px; min-width:300px; display:flex; flex-direction:column;
           border-right:1px solid var(--wa-borde); background:#fff; }
/* La barra va BLANCA y el buscador gris, como en WhatsApp Web — no al revés. El contraste
   invertido hacía que la cabecera pesara más que la lista que la sigue. */
.wa-lista-head{ background:#fff; padding:0 10px 0 12px; height:var(--wa-head-h);
                display:flex; align-items:center; gap:6px;
                border-bottom:1px solid var(--wa-borde); }
.wa-lista-head .wa-buscar{ flex:1; min-width:0; }
.wa-lista-head .badge{ flex-shrink:0; }
.wa-buscar{ position:relative; }
.wa-buscar input{ width:100%; border:0; border-radius:8px; background:var(--wa-barra);
                  padding:8px 12px 8px 44px; font-size:14px; outline:none; color:#111b21; }
.wa-buscar input::placeholder{ color:var(--wa-sec); }
.wa-buscar input:focus{ background:#fff; box-shadow:inset 0 0 0 1px var(--wa-borde); }
.wa-buscar .ti{ position:absolute; left:14px; top:50%; transform:translateY(-50%); color:var(--wa-sec); font-size:17px; }
.wa-convs{ flex:1; overflow-y:auto; }

.wa-conv{ display:flex; gap:13px; padding:11px 14px; cursor:pointer; border-bottom:1px solid #f5f6f6;
          align-items:center; }
.wa-conv:hover{ background:#f5f6f6; }
.wa-conv.activa{ background:#f0f2f5; }
.wa-avatar{ width:44px; height:44px; min-width:44px; border-radius:50%; background:#d1d7db; color:#fff;
            display:flex; align-items:center; justify-content:center; font-weight:600; font-size:15px; }
.wa-conv-cuerpo{ flex:1; min-width:0; }
.wa-conv-fila{ display:flex; align-items:baseline; gap:8px; }
.wa-conv-nombre{ font-size:14.5px; color:#111b21; flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.wa-conv-hora{ font-size:12px; color:var(--wa-sec); white-space:nowrap; }
.wa-conv-prev{ font-size:14px; color:var(--wa-sec); overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
                /* Ocupa el sobrante para empujar al globito y a la palomita contra el borde
                   derecho, en la misma vertical que la hora de arriba. Sin esto quedaban pegados
                   al final del texto y la palomita, al aparecer, no desplazaba a nadie. */
                flex:1; min-width:0; }
/* Encabezado de sección en la lista («Mensajes · 3»), como el de WhatsApp al buscar. */
.wa-seccion{ font-size:12px; color:var(--wa-sec); text-transform:uppercase; letter-spacing:.04em;
             padding:14px 14px 6px; border-top:1px solid var(--wa-borde); background:#fff; }
.wa-conv-prev mark{ background:#a7f3d0; color:inherit; padding:0 1px; border-radius:2px; }
.wa-conv-prev .ti{ font-size:14px; vertical-align:-2px; }

.wa-badge{ background:#25d366; color:#fff; border-radius:999px; font-size:12px; font-weight:600;
           min-width:20px; height:20px; padding:0 6px; display:flex; align-items:center; justify-content:center; }

/* Palomita de acciones de la fila, como la de WhatsApp Web.
   Va EN EL FLUJO, al lado del globito de no leídos y no encima: escondida mide cero, y al
   aparecer empuja al globito a la izquierda en vez de taparlo. Superponerla obligaba a tapar con
   un degradado lo que quedara debajo —la hora, el globito—, y eso esconde justo el dato por el
   que uno mira la fila. */
.wa-conv-mas{ align-self:center; border:0; background:none; padding:0; line-height:0;
              color:var(--wa-sec); cursor:pointer; overflow:hidden;
              width:19px; flex:0 0 auto; }
.wa-conv-mas .ti{ font-size:19px; }

/* Con ratón se esconde del todo —ancho cero y sin el hueco del `gap`— y aparece al pasar por la
   fila. Eso devuelve esos 27 px al último mensaje en todas las filas que nadie está mirando. */
@media (hover:hover){
  .wa-conv-mas{ width:0; opacity:0; margin-left:-8px;
                transition:width .12s, opacity .12s, margin-left .12s; }
  .wa-conv:hover .wa-conv-mas,
  .wa-conv-mas:focus-visible,
  .wa-conv-mas.abierto{ width:19px; opacity:1; margin-left:0; }
}

/* Sin ratón no hay hover que la revele, así que se queda puesta y tenue. Ocupa su lugar en la
   fila —no tapa nada— y el globito se corre solo. Ver `tooltip_title_no_funciona_en_movil`. */
@media (hover:none){
  .wa-conv-mas{ opacity:.45; }
}

/* ---------- Panel del chat ---------- */
.wa-chat{ flex:1; display:flex; flex-direction:column; min-width:0; position:relative; }

/* ── Buscador de la conversación (2026-09-12) ───────────────────────────────────────────────
   Panel propio a la derecha que ACHICA el chat, no una capa encima: hay que poder tocar un
   resultado y leerlo en su lugar sin cerrar nada. */
.wa-buscador{
  flex:0 0 340px; min-width:0; display:flex; flex-direction:column;
  background:#fff; border-left:1px solid var(--wa-borde);
}
/* ⚠ `--wa-head-h` y no un relleno propio: es la MISMA altura que la cabecera del chat y la de
   la lista, y las tres se ven una al lado de la otra. Con `padding:12px` esta medía 64 px contra
   los 60 de la de al lado y la línea que separa las cabeceras del contenido quedaba quebrada
   justo en el medio de la pantalla —4 px, suficiente para que se note; lo vio Mario el
   2026-09-12—. El relleno vertical se va: lo pone la altura, y el caño de al lado se alinea
   solo el día que la variable cambie. */
.wa-buscador-cab{
  height:var(--wa-head-h); display:flex; align-items:center; flex-shrink:0;
  padding:0 12px; border-bottom:1px solid var(--wa-borde); background:var(--wa-barra);
}
.wa-buscador-cab > *{ flex:1; min-width:0; }
.wa-buscador-caja{
  display:flex; align-items:center; gap:8px; background:#fff; border-radius:22px;
  padding:6px 12px; border:1px solid var(--wa-borde);
}
.wa-buscador-caja:focus-within{ border-color:var(--wa-verde); box-shadow:0 0 0 1px var(--wa-verde); }
.wa-buscador-caja input{ flex:1; min-width:0; border:0; outline:0; font-size:14px; padding:2px 0; }
.wa-buscador-caja button{
  border:0; background:transparent; color:var(--wa-sec); cursor:pointer; line-height:1; padding:2px;
}
.wa-buscador-caja .ti{ font-size:18px; color:var(--wa-sec); }

.wa-buscador-cuerpo{ flex:1; overflow-y:auto; }
.wa-buscador-vacio{ padding:22px 18px; color:var(--wa-sec); font-size:13.5px; text-align:center; }
.wa-buscador-vacio span{ font-size:12.5px; opacity:.8; }

/* El día, como separador de grupo: los resultados se leen por fecha, igual que en el hilo. */
.wa-res-dia{
  padding:10px 14px 4px; font-size:12px; color:var(--wa-sec); text-transform:none;
}
.wa-res{
  display:block; width:100%; text-align:left; border:0; background:transparent; cursor:pointer;
  padding:9px 14px; border-bottom:1px solid var(--wa-borde); font-size:13.5px; line-height:1.35;
}
.wa-res:hover{ background:var(--wa-barra); }
.wa-res.actual{ background:#e7f3ff; }
.wa-res .wa-res-hora{ display:block; font-size:11.5px; color:var(--wa-sec); margin-bottom:2px; }
/* ⚠ Lo encontrado va en VERDE y en negrita, no con fondo amarillo como dentro del hilo: acá la
   fila es angosta y un bloque de color por palabra la vuelve ilegible. */
.wa-res b{ color:var(--wa-verde); font-weight:600; }

/* Lo encontrado. El resaltado ACTUAL se distingue del resto: con todos iguales, al ir de uno a
   otro no se sabe en cuál se está parado. */
.wa-marca{ background:#ffe08a; border-radius:3px; }
.wa-marca.actual{ background:#ffb703; }

@media (max-width: 767.98px){
  /* ⚠ En el teléfono el panel ocupa TODO: 340 px al lado de una pantalla de 390 deja un chat de
     50 px. Se muestra el buscador y se esconde el chat, como hace WhatsApp. */
  .wa-app.buscando .wa-chat{ display:none !important; }
  .wa-app.buscando .wa-buscador{ flex:1 1 auto; border-left:0; }
}

/* Bajar al último mensaje (2026-09-12). Flota sobre el hilo, encima del compositor.
   ⚠ `position:absolute` contra `.wa-chat` —que por eso pasó a `relative`— y no dentro de
   `.wa-mensajes`: ahí sería contenido y se desplazaría junto con los mensajes.
   ⚠ El `bottom` lo pone el JS con el alto real del compositor: ese alto cambia al citar un
   mensaje o al escribir varias líneas, y un valor fijo dejaba el botón montado encima. */
.wa-bajar{
  position:absolute; right:18px; bottom:var(--wa-bajar-abajo, 90px); z-index:5;
  width:42px; height:42px; border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  background:#fff; color:var(--wa-sec); border:1px solid rgba(0,0,0,.08);
  box-shadow:0 2px 6px rgba(0,0,0,.18); cursor:pointer;
  transition:opacity .15s ease, transform .15s ease;
}
.wa-bajar:hover{ color:var(--wa-verde, #128c7e); transform:translateY(-1px); }
.wa-bajar .ti{ font-size:22px; }
.wa-chat-head{ background:#fff; padding:0 16px; height:var(--wa-head-h);
               display:flex; align-items:center; gap:12px;
               border-bottom:1px solid var(--wa-borde); }
/* El avatar de la cabecera se achica para caber en la altura compartida; el de la lista
   se queda en 49 px, que es el de WhatsApp. */
.wa-chat-head .wa-avatar{ width:40px; height:40px; min-width:40px; font-size:15px; }
.wa-chat-nombre{ font-size:16px; color:#111b21; }
.wa-chat-sub{ font-size:13px; color:var(--wa-sec); }
.wa-chat-iconos{ display:flex; gap:6px; color:#54656f; }
.wa-icono{ background:none; border:0; color:#54656f; width:36px; height:36px; border-radius:50%;
           display:flex; align-items:center; justify-content:center; font-size:19px; cursor:pointer; }
.wa-icono:hover{ background:rgba(0,0,0,.05); }
.wa-icono[disabled]{ opacity:.45; cursor:not-allowed; }

/* El fondo con textura del chat. Es un SVG embebido: la CSP prohíbe imágenes externas,
   y un data: URI cuenta como `img-src data:`, que sí está permitido. */
.wa-mensajes{
  flex:1; overflow-y:auto; padding:18px 6%; background-color:var(--wa-fondo);
  /* Papel tapiz de garabatos, como el de WhatsApp. Antes eran ocho figuras geométricas sueltas en
     un mosaico de 110 px: se leía como una trama de puntos, no como un fondo dibujado.
     Ahora son 25 figuras variadas —cámara, corazón, sobre, taza, cohete…— en un mosaico de 300 px.
     El archivo lo genera `~/goroute-seed/whatsapp_fondo_svg.py` y NO se edita a mano: cada figura está
     dibujada también corrida un mosaico en cada dirección, para que las que caen sobre el borde no
     queden cortadas y no aparezca la cuadrícula de «calles» vacías al repetir. */
  background-image:url("../images/whatsapp-fondo.svg");
  background-size:300px 300px;
}

/* ---------- Burbujas ---------- */
.wa-fila{ display:flex; margin-bottom:8px; }
.wa-fila.propia{ justify-content:flex-end; }
.wa-burbuja{ max-width:min(65%,520px); padding:6px 9px 8px; border-radius:7.5px; position:relative;
             box-shadow:0 1px .5px rgba(11,20,26,.13); font-size:14.2px; line-height:19px;
             color:#111b21; word-wrap:break-word; white-space:pre-wrap; }
.wa-fila:not(.propia) .wa-burbuja{ background:#fff; border-top-left-radius:0; }
.wa-fila.propia   .wa-burbuja{ background:var(--wa-propia); border-top-right-radius:0; }
/* Bloque del adjunto dentro de la burbuja. La etapa A solo anuncia que el archivo llegó; la B
   lo reemplazará por la imagen o por un enlace de descarga. */
.wa-adjunto{ display:flex; align-items:center; gap:8px; margin:0; padding:8px 10px;
             background:rgba(0,0,0,.045); border-radius:6px; font-size:13.5px; }
.wa-adjunto .ti{ font-size:20px; opacity:.6; flex-shrink:0; }
.wa-adjunto span{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.wa-adjunto .peso{ margin-left:auto; font-size:11.5px; color:var(--wa-sec); flex-shrink:0; }

/* La imagen ocupa la burbuja, como en WhatsApp. */
/* ⚠ `width:300px` + `max-width:100%`, NO `min(300px, 100%)`. La burbuja se ajusta a su contenido,
   así que su ancho es INDEFINIDO mientras se calcula: ahí el `100%` no resuelve, `min()` da 0 y el
   ancla queda en cero. Con la imagen ya cargada no se notaba —su tamaño natural sostenía la
   burbuja—, pero con `loading=lazy` no hay nada que la sostenga y la burbuja se encogía a sus 6 px
   de relleno hasta que bajara el archivo. El `max-width` sí funciona porque se aplica cuando el
   ancho de la burbuja ya está resuelto. */
.wa-imagen{ display:block; position:relative; margin:-2px -5px 4px; border-radius:6px;
            overflow:hidden; width:300px; max-width:100%; }
.wa-imagen img{ display:block; width:100%; height:auto; background:#e9edef;
                /* Techo de seguridad: una imagen que el recorte no alcance a domar no puede
                   ocupar más que esto. Al abrirla se ve completa. */
                max-height:440px; object-fit:cover; object-position:center top; }

/* ⚠ Solo las MUY altas o MUY anchas se recortan, y el recorte lo decide `bandeja.js` al cargarlas.
   Antes bastaba con `max-height` + `object-fit:cover`, y no servía: con una imagen de 400×1600 el
   navegador conserva la proporción y **encoge el ancho a 85 px** para respetar el alto. La caja se
   medía a partir de la imagen en vez de al revés, así que `cover` no tenía nada que recortar.
   Fijando la proporción de la caja, `cover` por fin recorta. La original se ve completa al abrirla. */
.wa-imagen img.recortada{ aspect-ratio:4/5; object-fit:cover; object-position:center top; }
.wa-imagen img.recortada-ancha{ aspect-ratio:16/9; object-fit:cover; object-position:center; }

/* ── Miniatura sola: ocupa la burbuja entera y la hora va ENCIMA ─────────────────────────────────
   Medido antes de arreglarlo: la imagen quedaba a +4 px de la izquierda pero a +14 de la derecha
   —la burbuja salía 10 px más ancha que su contenido— y debajo sobraban 35 px de blanco para una
   hora de 19. Con la imagen al ras y la hora superpuesta, como en WhatsApp, no sobra nada.
   Solo aplica cuando NO hay pie de foto: con texto, la hora vuelve abajo, que es donde se lee. */
/* Al ras: vale con pie de foto y sin él. ⚠ La galería estaba fuera de esta lista y se notaba:
   quedaba a 3 px por la izquierda y 15 por la derecha, porque su `width:min(300px,100%)` la dejaba
   más angosta que la burbuja. */
.wa-burbuja.con-media{ padding:3px; }
/* ⚠ `300px` + `max-width:100%`, no `width:100%` a secas: esta regla es MÁS específica que la de
   `.wa-imagen` y le devolvía el porcentaje contra un ancho indefinido, que es exactamente lo que
   colapsaba la burbuja a 6 px mientras la imagen no bajaba. Sigue ocupando todo el ancho de la
   burbuja, pero ahora aporta un tamaño con el que la burbuja puede dimensionarse sola. */
.wa-burbuja.con-media .wa-imagen,
.wa-burbuja.con-media .wa-galeria,
.wa-burbuja.con-media .wa-video-envoltura{ margin:0; width:300px; max-width:100%; }
/* El pie recupera el aire que la burbuja ya no tiene. */
.wa-burbuja.con-media .wa-pie-media{ padding:3px 6px 0; }
/* ⚠ La hora de las burbujas con foto Y pie queda EXACTAMENTE como la de un audio o un texto:
   5 px del borde derecho y 4 del de abajo. Medido en las tres, no ajustado a ojo.
   El problema no era solo el margen derecho: el de ABAJO daba -1, o sea que la hora colgaba por
   fuera de la burbuja. La burbuja `con-media` baja su relleno a 3 px para que la imagen vaya al
   ras, y el pie arrastra `-4px` a la derecha y abajo, pensados para una burbuja con relleno
   normal. Se compensan los dos. */
.wa-burbuja.con-media:not(.solo-media) .wa-pie-burbuja{ margin-right:2px; margin-bottom:1px; }
/* ⚠ En una burbuja de SOLO FOTO se posiciona el PIE ENTERO sobre la imagen, no solo la hora.
   Antes se posicionaba únicamente `.wa-meta`: la hora quedaba superpuesta sobre la foto y el badge
   del autor —que sigue en flujo normal— caía DEBAJO de la imagen, en otro renglón. Los dos decían
   pertenecer a la misma línea y se veían desalineados, que es justo lo que se notó en el teléfono.
   Posicionando el contenedor, el `flex` de siempre los acomoda: autor a la izquierda, hora a la
   derecha, misma línea, sobre el degradado que ya está dibujado ahí para que se lean. */
.wa-burbuja.solo-media .wa-pie-burbuja{
  position:absolute; left:9px; right:9px; bottom:9px; margin:0;
  /* Encima del degradado del `::after` de la imagen, o quedaría tapado por él. */
  z-index:2;
}
.wa-burbuja.solo-media .wa-meta{
  position:static; margin:0; float:none; color:#fff;
  /* Sombra y no fondo: un recuadro sólido tapa parte de la foto. */
  text-shadow:0 1px 3px rgba(0,0,0,.85), 0 0 8px rgba(0,0,0,.5);
}
/* ⚠ Solo la palomilla SIN estado se pinta de blanco. Con `.wa-tick` a secas —tres clases— esta
   regla le ganaba a `.wa-tick.leido`, que tiene dos, y sobre una foto la palomilla se quedaba
   blanca para siempre: nunca pasaba a celeste ni a roja. El color del contexto decide el neutro;
   el del ESTADO decide siempre el suyo. */
.wa-burbuja.solo-media .wa-meta .wa-tick:not(.leido):not(.fallido){ color:#fff; }
.wa-burbuja.solo-media .wa-meta .wa-tick.leido{ color:var(--wa-tick); }
/* Rojo claro y no el de siempre: el oscuro se pierde contra el degradado de la foto. */
.wa-burbuja.solo-media .wa-meta .wa-tick.fallido{ color:#ff8a80; }
/* Degradado suave para que la hora se lea sobre cualquier foto, clara u oscura. */
.wa-burbuja.solo-media .wa-imagen::after,
.wa-burbuja.solo-media .wa-video-envoltura::after{
  content:''; position:absolute; left:0; right:0; bottom:0; height:52px;
  background:linear-gradient(to top, rgba(0,0,0,.42), transparent); pointer-events:none;
}
/* ⚠ «Ver completa» va ARRIBA a la izquierda en las burbujas de solo foto, no abajo. La línea de
   abajo la ocupa ahora el pie —autor a la izquierda, hora a la derecha, superpuestos sobre la
   imagen—, así que el rótulo quedaba justo debajo del badge del autor y se pisaban. Arriba a la
   izquierda no estorba a nadie: el botón de acciones vive arriba a la DERECHA. */
.wa-burbuja.solo-media .expandir{ top:9px; left:9px; right:auto; bottom:auto; }

/* ── Álbum: varias fotos que llegaron juntas ──────────────────────────────────────────────────
   Las baldosas son CUADRADAS y recortadas para que la cuadrícula quede pareja: con proporciones
   mezcladas se ve como un collage desordenado. Cada una abre su original completa. */
.wa-galeria{ display:grid; gap:3px; width:300px; max-width:100%; }
.wa-galeria a{ display:block; position:relative; overflow:hidden; }
.wa-galeria img{ display:block; width:100%; height:100%; object-fit:cover; background:#e9edef; }
.wa-galeria.g2{ grid-template-columns:1fr 1fr; }
.wa-galeria.g2 a{ aspect-ratio:1; }
/* Tres: una grande a la izquierda y dos apiladas, como WhatsApp. */
.wa-galeria.g3{ grid-template-columns:2fr 1fr; grid-template-rows:1fr 1fr; }
.wa-galeria.g3 a:first-child{ grid-row:span 2; }
.wa-galeria.g3{ aspect-ratio:1; }
.wa-galeria.g4{ grid-template-columns:1fr 1fr; }
.wa-galeria.g4 a{ aspect-ratio:1; }
.wa-galeria .mas{ position:absolute; inset:0; background:rgba(0,0,0,.5); color:#fff;
                  display:flex; align-items:center; justify-content:center;
                  font-size:26px; font-weight:600; }

/* Señal de que hay más: sin esto el recorte parece la foto entera y nadie la abre. */
.wa-imagen .expandir{ position:absolute; right:6px; bottom:6px; background:rgba(0,0,0,.55);
                      color:#fff; border-radius:4px; font-size:11px; padding:2px 6px;
                      display:flex; align-items:center; gap:3px; pointer-events:none; }
.wa-imagen .expandir .ti{ font-size:13px; }
/* Nota de voz con su onda, como WhatsApp. */
.wa-audio{ display:flex; align-items:center; gap:9px; width:270px; max-width:100%;
           margin:2px 0; height:38px; }
.wa-audio .btn{ width:34px; height:34px; min-width:34px; border:0; border-radius:50%;
                background:var(--wa-verde); color:#fff; font-size:16px; cursor:pointer;
                display:flex; align-items:center; justify-content:center; padding:0; }
.wa-audio .onda{ flex:1; min-width:0; height:30px; cursor:pointer; }
.wa-audio .t{ font-size:11.5px; color:var(--wa-sec); min-width:34px; text-align:right; }
/* Velocidad: pastilla discreta, que compite poco con el botón de reproducir. */
.wa-audio .vel{ border:0; border-radius:10px; background:rgba(0,0,0,.07); color:#111b21;
                font-size:11px; font-weight:500; padding:2px 7px; cursor:pointer; line-height:15px;
                min-width:30px; }
.wa-audio .vel:hover{ background:rgba(0,0,0,.12); }
.wa-audio .vel[hidden]{ display:none; }
.wa-audio.sin-onda .vel{ display:none; }
.wa-audio audio{ display:none; }
/* Si el navegador no supo decodificarlo, se cae al reproductor nativo: sin onda, pero suena. */
.wa-audio.sin-onda{ display:block; height:auto; }
.wa-audio.sin-onda .btn,
.wa-audio.sin-onda .onda,
.wa-audio.sin-onda .t{ display:none; }
.wa-audio.sin-onda audio{ display:block; width:100%; }
/* El `<video>` ya no lleva medidas propias: las pone la envoltura. Cuando se toca la tarjeta,
   el reproductor la REEMPLAZA y hereda su sitio, así que la burbuja no salta de tamaño. */
.wa-video{ display:block; width:100%; border-radius:6px; }

/* Tarjeta de PDF con la primera página de miniatura. Mientras pdf.js la dibuja —o si el PDF no
   se puede leer— queda el ícono, así que la tarjeta nunca se ve rota ni salta de tamaño. */
/* ⚠ Ancho FIJO, no `min(300px,100%)`. La tarjeta no tiene ancho propio —es una caja vacía hasta
   que pdf.js dibuja— así que dentro de una burbuja que se ajusta a su contenido el `100%` se
   resolvía contra el texto de al lado y la tarjeta se encogía a 172 px, con la burbuja 14 px más
   ancha por la derecha y 4 por la izquierda. Con un ancho fijo la burbuja se ajusta a ELLA. */
.wa-doc{ display:block; width:300px; max-width:100%; margin:0 0 2px; border-radius:6px;
         overflow:hidden; background:rgba(0,0,0,.045); text-decoration:none; color:inherit; }
.wa-doc:hover{ background:rgba(0,0,0,.075); }
/* Proporción en vez de alto fijo: al ensanchar la tarjeta, un `height` en píxeles habría
   recortado cada vez más página. Con 4/3 se ve la misma porción a cualquier ancho. */
.wa-doc .vista{ display:flex; align-items:center; justify-content:center; aspect-ratio:4/3;
                background:#fff; overflow:hidden; color:#8696a0; font-size:44px; }
.wa-doc .vista img{ width:100%; display:block; object-fit:cover; object-position:top center;
                    height:100%; }
.wa-doc.sin-vista .vista{ aspect-ratio:auto; height:88px; }
.wa-doc .pie{ display:flex; align-items:center; gap:8px; padding:9px 11px; font-size:13px; }
.wa-doc .pie > i{ color:#d93025; font-size:19px; }
.wa-doc .nom{ flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.wa-doc .peso{ color:#8696a0; font-size:11.5px; white-space:nowrap; }
/* La hora de estas tarjetas va DEBAJO, no superpuesta: encima caería sobre el nombre, el peso o
   el rótulo. Se les quita el aire de más, y a TODAS por igual — medido el 2026-09-02, cada una
   dejaba un hueco distinto abajo (27, 31, 33, 35 y 36 px) porque cada una traía su propio
   `margin-bottom`. */
.wa-doc, .wa-mapa, .wa-contacto, .wa-audio, .wa-nosoportado, .wa-adjunto{ margin-bottom:2px; }
.wa-doc + .wa-meta,
.wa-mapa + .wa-meta,
.wa-contacto + .wa-meta,
.wa-audio + .wa-meta,
.wa-nosoportado + .wa-meta,
.wa-adjunto + .wa-meta{ margin-top:2px; }

/* Miniatura del video: el primer fotograma con el botón de reproducir encima. */
.wa-video-envoltura{ position:relative; display:block; width:min(300px,100%); margin:0 0 2px;
                     border-radius:6px; overflow:hidden; cursor:pointer; background:#0b141a; }
/* Recorte a 2:1: el clip llega en 16:9 y a lo ancho de la burbuja quedaba demasiado alto para
   ser una miniatura. `cover` recorta arriba y abajo en vez de encoger el ancho. */
.wa-video-envoltura video{ display:block; width:100%; aspect-ratio:2/1; object-fit:cover;
                           margin:0; pointer-events:none; }
.wa-video-envoltura .play{ position:absolute; top:50%; left:50%; transform:translate(-50%,-50%);
                           width:52px; height:52px; border-radius:50%; background:rgba(0,0,0,.55);
                           color:#fff; display:flex; align-items:center; justify-content:center;
                           font-size:24px; }
.wa-video-envoltura .peso-video{ position:absolute; left:8px; top:8px; background:rgba(0,0,0,.55);
                                 color:#fff; font-size:11px; padding:2px 7px; border-radius:4px; }
a.wa-adjunto{ text-decoration:none; color:inherit; }
a.wa-adjunto:hover{ background:rgba(0,0,0,.075); }

.wa-meta{ float:right; margin:8px -4px -4px 10px; font-size:11px; color:var(--wa-sec);
          display:inline-flex; align-items:center; gap:3px; }
.wa-tick{ font-size:14px; line-height:1; }
.wa-tick.leido{ color:var(--wa-tick); }
/* Los límites de una consulta dentro del hilo (2026-09-12).
   ⚠ Se parecen al separador de día a propósito —misma forma de píldora centrada— pero NO son
   iguales: el de la consulta lleva color y el del día es neutro. Si fueran idénticos, en un hilo
   largo no se distinguiría «cambió el día» de «cambió el cliente del que se habla». */
.wa-consulta{ text-align:center; margin:14px 0 10px; }
.wa-consulta span,
.wa-consulta button{
  display:inline-block; font-size:12.5px; padding:5px 12px; border-radius:8px;
  background:#e7f3ff; color:#0b5ed7; border:1px solid #cfe2ff;
}
/* El de inicio es un botón —desde ahí se corrige el cliente o se quita la marca—, pero no tiene
   que parecer un botón más de la pantalla: se comporta como la píldora que ya era. */
.wa-consulta button{ cursor:pointer; }

/* El parpadeo al saltar al inicio de una consulta: sin él no se ve a qué mensaje llegó. */
.wa-fila.wa-resaltada .wa-burbuja{ animation: waResalta 1.6s ease-out; }
@keyframes waResalta{ 0%,60%{ box-shadow:0 0 0 3px #ffe08a; } 100%{ box-shadow:none; } }
.wa-consulta button:hover{ background:#d7e9ff; }
.wa-consulta span i, .wa-consulta button i{ margin-right:5px; }
/* El cierre va más apagado: el que importa de un vistazo es dónde EMPIEZA cada tramo. */
.wa-consulta-fin span{ background:#f3f4f6; color:#6b7280; border-color:#e5e7eb; }

.wa-dia{ text-align:center; margin:14px 0; }
.wa-dia span{ background:#fff; color:var(--wa-sec); font-size:12.5px; padding:5px 12px;
              border-radius:7.5px; box-shadow:0 1px .5px rgba(11,20,26,.13); }

/* ---------- Pie: adjuntar, emojis, texto, enviar ---------- */
.wa-pie{ background:var(--wa-barra); padding:8px 16px; display:flex; align-items:flex-end; gap:8px;
         position:relative; }
/* ⚠ `min-width:0` es lo que deja que el campo se ENCOJA. Sin él vale `auto`, que en un flex
   equivale al ancho de su contenido —medido: 408 px fijos a 360, 390 y 412— y el campo empuja al
   último botón fuera de la pantalla, donde el teléfono lo recorta. Era la causa de que el
   micrófono quedara «10 px fuera» en 2026-09-11; entonces se tapó mostrando un solo botón a la
   vez, y volvió a asomar con el botón de salir de la nota (Mario, 2026-09-15: «queda muy pegado
   al borde»). Con esto el pie respeta sus 16 px de aire a los dos lados. */
.wa-pie input[type=text]{ flex:1; min-width:0; border:0; border-radius:8px; padding:10px 14px;
                          font-size:15px; outline:none; background:#fff; }
.wa-enviar{ background:var(--wa-verde); color:#fff; }
.wa-enviar:hover{ background:#017561; }
.wa-enviar[disabled]{ background:#c3cdd2; }

/* Menú de adjuntar y panel de emojis: flotan sobre el chat, anclados al pie. */
/* `bottom:100%` los apoya EXACTAMENTE sobre el borde superior del pie. Con un valor fijo en
   píxeles se montaban encima cuando el pie cambiaba de alto. */
.wa-flotante{ position:absolute; bottom:100%; margin-bottom:6px; background:#fff; border-radius:10px;
              box-shadow:0 2px 10px rgba(11,20,26,.22); z-index:5; }
.wa-adjuntar-menu{ left:12px; padding:8px 0; min-width:210px; }
.wa-adjuntar-menu .titulo{ font-size:11.5px; color:var(--wa-sec); padding:4px 16px 8px; }
.wa-adj{ display:flex; align-items:center; gap:14px; padding:10px 16px; font-size:14.5px;
         color:#3b4a54; cursor:pointer; }
/* ⚠ Estas opciones estaban al 45% de opacidad desde la etapa A, cuando el menú entero
   era un cartel de «todavía no disponible». Al activarlas siguieron apagadas: se veían
   igual que las que de verdad NO funcionan, y el gris dejaba de significar algo. */
.wa-adj:hover{ background:rgba(0,0,0,.05); }
.wa-adj .ti{ font-size:19px; }

/* Tipografía de emoji a color, como RESPALDO al final de la pila.
   ⚠ Ponerla primero fue un error: la fuente de emoji también trae glifos para espacios y dígitos,
   con métricas propias, y el texto normal salía desparramado — parecía justificado. Va después de
   la fuente de texto, así solo la usan los caracteres que la de texto no tiene. */
.wa-burbuja, .wa-conv-prev, .wa-pie input[type=text]{
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,
              "Apple Color Emoji","Segoe UI Emoji","Noto Color Emoji","Twemoji Mozilla";
}
/* En el selector solo hay emojis, así que ahí sí va primero. */
.wa-emojis button[data-emoji]{
  /* ⚠ `Noto Color Emoji` PRIMERA. Antes esta pila arrancaba con las del sistema —Apple, Segoe— y
     Noto quedaba de tercera: en Windows ganaba Segoe y el panel seguía mostrando los emojis del
     sistema mientras el hilo ya mostraba los nuestros. Dos juegos distintos en la misma pantalla. */
  font-family:"Noto Color Emoji","Apple Color Emoji","Segoe UI Emoji","Twemoji Mozilla",sans-serif;
}

.wa-emojis{ left:12px; width:352px; padding:0; overflow:hidden; }

/* Pestañas de categoría, como la fila de iconos de WhatsApp. */
.wa-emojis .tabs{ display:flex; border-bottom:1px solid var(--wa-borde); padding:4px 6px 0; }
.wa-emojis .tabs button{ flex:1; background:none; border:0; padding:8px 0 7px; font-size:18px;
                         line-height:1; cursor:pointer; border-bottom:3px solid transparent;
                         opacity:.55; }
.wa-emojis .tabs button:hover{ opacity:.85; }
.wa-emojis .tabs button.activa{ opacity:1; border-bottom-color:var(--wa-verde); }

.wa-emojis .buscar{ padding:10px 12px 6px; }
.wa-emojis .buscar input{ width:100%; border:0; border-radius:8px; background:var(--wa-barra);
                          padding:8px 12px; font-size:14px; outline:none; }
.wa-emojis .buscar input:focus{ background:#fff; box-shadow:inset 0 0 0 1px var(--wa-verde); }

.wa-emojis .grupo{ font-size:11.5px; color:var(--wa-sec); padding:8px 12px 2px;
                   text-transform:uppercase; letter-spacing:.03em; position:sticky; top:0;
                   background:#fff; }
.wa-emojis .rejilla{ display:grid; grid-template-columns:repeat(8,1fr); padding:0 6px; }
.wa-emojis button[data-emoji]{ background:none; border:0; font-size:23px; line-height:1;
                               padding:6px 0; border-radius:6px; cursor:pointer; }
.wa-emojis button[data-emoji]:hover{ background:#f0f2f5; }
.wa-emojis .cuerpo{ height:262px; overflow-y:auto; }
.wa-emojis .nada{ color:var(--wa-sec); font-size:13.5px; text-align:center; padding:28px 12px; }

/* ---------- Vacíos y avisos ---------- */
.wa-vacio{ flex:1; display:flex; flex-direction:column; align-items:center; justify-content:center;
           background:var(--wa-barra); color:var(--wa-sec); text-align:center; padding:30px; }
.wa-vacio .ti{ font-size:64px; opacity:.35; margin-bottom:10px; }
.wa-aviso{ background:#fff6d5; color:#5c4a03; font-size:13px; padding:8px 16px;
           border-bottom:1px solid #f0e2a8; }

/* ---------- Móvil: una columna por vez, como WhatsApp en el teléfono ---------- */
@media (max-width:991.98px){
    /* Los ~30 px de scroll que queda son del pie del tema y los tienen TODAS las pantallas
     (`facturar` da lo mismo). No se compensan acá: hacerlo solo recortaría la conversación
     sin quitar el scroll. */
  /* De borde a borde, como una app de chat. Los -24 px por lado cancelan EXACTAMENTE el relleno
     de los dos contenedores del tema (12 de `.content-page` + 12 de `.container-fluid`); sin esto
     la bandeja queda con 50 px de blanco a los lados en un teléfono.
     ⚠ El margen negativo solo es seguro porque esos rellenos existen y lo absorben — colgado de un
     contenedor sin relleno desbordaría, que es el error `E-footer-fuera-de-content-page`. */
  /* ⚠ En el teléfono la bandeja va de borde a borde y SIN aire arriba: es una pantalla de chat
     completa, no una tarjeta. Por eso se anula el `mt-3` que el markup trae para el escritorio —
     con `!important` porque el de la utilidad de Bootstrap también lo es— y el alto vuelve a su
     cuenta de siempre. */
  /* ⚠ En el teléfono va al ras de los cuatro bordes: sin el `mt-3` de arriba, sin aire abajo y
     sin pie, solo los 70 px de la barra superior. Antes eran 118 porque abajo estaba el pie. */
  /* ⚠ ACÁ ESTÁ EL ARREGLO DEL COMPOSITOR (pedido de Mario, 2026-09-11).
     En el teléfono `100vh` NO es lo que se ve: es el alto de la ventana COMO SI la barra del
     navegador estuviera escondida. Con la barra a la vista, la bandeja medía ~60 px más que la
     pantalla y la barra de escribir quedaba justo debajo del borde: había que desplazar para
     verla, y se movía sola al aparecer y desaparecer la barra del navegador.

     `dvh` es el alto REAL disponible y se recalcula solo. Y para el teclado —que en iOS no
     cambia `dvh`— está `--wa-alto`, que `bandeja.js` pone midiendo `visualViewport`. El orden
     importa: primero los respaldos, y la variable de último para que gane cuando exista. */
  /* ⚠ Sin márgenes negativos desde el 2026-09-12. Estaban para sacarle a la bandeja los 24 px
     de relleno que ponían los contenedores del tema; ahora ese relleno se quita por clase en la
     pantalla, y dejar además el margen la corría 24 px FUERA por cada lado —medido: quedaba en
     x = -24 y 438 px de ancho en una pantalla de 390—. */
  .wa-app{ border-radius:0;
           border-left:0; border-right:0; border-bottom:0;
           height:calc(100vh - 70px);
           height:calc(100dvh - 70px);
           height:var(--wa-alto, calc(100dvh - 70px)); }

  /* La barra de escribir, pegada al fondo de la conversación. El alto de arriba ya la deja en su
     lugar; esto es el seguro para cuando algo de adentro crece —una respuesta citada, la barra
     de grabación— y empujaría el resto hacia abajo. */
  .wa-chat .wa-pie{ position:sticky; bottom:0; z-index:3; }

  /* ⚠ Y LA CABECERA DEL CHAT, pegada arriba (pedido de Mario, 2026-09-11: «aparece oculta, debo
     ir hasta arriba para que se muestre»). Es el mismo seguro que el del pie, del otro lado.
     La cabecera es lo que tiene el botón de volver: si se va de la pantalla, no hay forma de
     salir del chat sin desplazar a ciegas. */
  .wa-chat .wa-chat-head{ position:sticky; top:0; z-index:4; }

  /* ⚠ Y LA CAUSA DE FONDO: mientras la bandeja está abierta, la PÁGINA no se desplaza. Lo único
     que scrollea es la lista de mensajes.
     En el teléfono el navegador corre la página por su cuenta —al abrir el teclado, al mostrar
     u ocultar su barra, o con el rebote del gesto— y al correrla se lleva para arriba la barra
     del sistema y la cabecera del chat. Con el documento quieto eso no puede pasar: no hay
     hacia dónde correrlo.
     La clase la pone `bandeja.js` solo en esta pantalla y solo en el teléfono; en el escritorio
     la página tiene que poder desplazarse como siempre. */
  body.wa-sin-scroll{ overflow:hidden; overscroll-behavior:none; }
  body.wa-sin-scroll .content-page{ overflow:hidden; }
  /* Una columna por vez, como WhatsApp en el teléfono.
     ⚠ El estado vacío («Elegí una conversación de la izquierda») se esconde SIEMPRE en móvil: no
     hay «izquierda», y al tener `flex:1` se quedaba al lado de la lista partiendo la pantalla en
     dos. Esconder solo `.wa-chat` no alcanzaba. */
  .wa-lista{ width:100%; min-width:0; flex:1 1 100%; }
  .wa-vacio{ display:none !important; }
  .wa-app.viendo-chat .wa-lista{ display:none; }
  .wa-app:not(.viendo-chat) .wa-chat{ display:none; }
  .wa-app.viendo-chat .wa-chat{ flex:1 1 100%; }
  .wa-mensajes{ padding:14px 12px; }
  .wa-burbuja{ max-width:82%; }
  /* En teléfonos angostos se anclan por los DOS lados y el ancho se deduce. Calcularlo con
     `100vw` fallaba porque el panel se posiciona contra el pie, que ya tiene relleno propio:
     el ancho salía bien pero arrancaba corrido. */
  .wa-emojis, .wa-adjuntar-menu{ left:6px; right:6px; width:auto; }
  /* Videollamada y llamada están desactivados y en un teléfono le robaban el ancho al nombre,
     que quedaba en «MARI…». Se esconden: la búsqueda sí se queda, que es la única útil. */
  .wa-chat-head .wa-icono[disabled]{ display:none; }
  .wa-chat-head .badge{ font-size:10px; padding:2px 6px; }
}
@media (min-width:992px){ .wa-volver{ display:none; } }


/* ── Visor de imágenes ─────────────────────────────────────────────────────────────────────────
   Abrir cada foto en una pestaña nueva no servía: con un álbum de seis, dos ni siquiera eran
   alcanzables (quedaban tras el «+2») y ver las demás obligaba a volver atrás cada vez.
   Acá la imagen se muestra COMPLETA —`contain`, nunca recortada— y se pasa de una a otra. */
.wa-visor{ position:fixed; inset:0; z-index:1090; background:rgba(11,20,26,.96);
           display:flex; align-items:center; justify-content:center; }
.wa-visor img,
.wa-visor video{ max-width:92vw; max-height:88vh; object-fit:contain; user-select:none;
                 border-radius:4px; }
/* El video se lleva todo el ancho que pueda: es lo que se vino a ver. */
.wa-visor video{ width:92vw; background:#000; }

.wa-visor .barra{ position:absolute; top:0; left:0; right:0; height:56px; display:flex;
                  align-items:center; gap:4px; padding:0 12px; color:#fff;
                  background:linear-gradient(to bottom, rgba(0,0,0,.55), transparent); }
.wa-visor .contador{ flex:1; font-size:14px; opacity:.9; }
.wa-visor .accion{ width:40px; height:40px; border:0; background:none; color:#fff; cursor:pointer;
                   border-radius:50%; display:flex; align-items:center; justify-content:center;
                   font-size:20px; text-decoration:none; }
.wa-visor .accion:hover{ background:rgba(255,255,255,.14); }

.wa-visor .flecha{ position:absolute; top:50%; transform:translateY(-50%); width:46px; height:46px;
                   border:0; border-radius:50%; background:rgba(255,255,255,.12); color:#fff;
                   font-size:26px; cursor:pointer; display:flex; align-items:center;
                   justify-content:center; }
.wa-visor .flecha:hover{ background:rgba(255,255,255,.22); }
.wa-visor .flecha.izq{ left:14px; }
.wa-visor .flecha.der{ right:14px; }
.wa-visor .flecha[hidden]{ display:none; }

/* En el teléfono las flechas estorban y se navega deslizando; se dejan más chicas y al borde. */
@media (max-width:767.98px){
  .wa-visor .flecha{ width:38px; height:38px; font-size:21px; background:rgba(255,255,255,.10); }
  .wa-visor .flecha.izq{ left:4px; }
  .wa-visor .flecha.der{ right:4px; }
  .wa-visor img{ max-width:100vw; }
}

/* Opciones de «con qué abrir». Cada una explica QUÉ va a pasar: sin eso, «Ver» y «Descargar»
   se parecen demasiado y hay que probarlas para saber cuál era la que se quería. */
.wa-opcion{ display:flex; align-items:flex-start; gap:12px; width:100%; padding:11px 12px;
            border:0; border-radius:7px; background:none; text-align:left; text-decoration:none;
            color:inherit; font:inherit; cursor:pointer; }
.wa-opcion:hover{ background:rgba(0,0,0,.05); }
.wa-opcion[disabled]{ opacity:.5; cursor:default; }
.wa-opcion > i{ font-size:21px; color:var(--wa-verde); margin-top:1px; flex-shrink:0; }
.wa-opcion b{ display:block; font-weight:500; font-size:14px; }
.wa-opcion small{ display:block; color:var(--wa-sec); font-size:12px; line-height:16px; }

/* ── Modal «con qué abrir», con la piel de WhatsApp ───────────────────────────────────────────
   TODO va bajo `#modalWaAbrir`. Las clases de Bootstrap (`.modal-content`, `.modal-header`,
   `.btn-close`) las comparten TODAS las modales del sistema: tocarlas sin acotar repintaría la
   de facturación, la de existencias y las demás. */
#modalWaAbrir .modal-content{ border:0; border-radius:14px; overflow:hidden;
                              box-shadow:0 12px 40px rgba(11,20,26,.28); }
#modalWaAbrir .modal-header{ border-bottom:0; padding:18px 20px 6px; align-items:flex-start; }
#modalWaAbrir .modal-title{ font-size:17px; font-weight:500; color:#111b21; line-height:22px; }
#modalWaAbrir .modal-header .nombre{ font-size:13px; color:var(--wa-sec); margin-top:2px; }
#modalWaAbrir .modal-body{ padding:4px 8px 12px; }
/* La ✕ de WhatsApp es discreta: la salida normal es tocar afuera. */
#modalWaAbrir .btn-close{ opacity:.4; box-shadow:none; }
#modalWaAbrir .btn-close:hover{ opacity:.75; }
#modalWaAbrir .wa-asidero{ display:none; }

/* Filas al estilo de WhatsApp: el ícono en un disco verde suave, título y explicación debajo. */
#modalWaAbrir .wa-opcion{ align-items:center; gap:14px; padding:11px 12px; border-radius:10px; }
#modalWaAbrir .wa-opcion > i{ width:40px; height:40px; border-radius:50%; margin:0; font-size:20px;
                              display:flex; align-items:center; justify-content:center;
                              background:rgba(0,128,105,.1); color:var(--wa-verde); }
#modalWaAbrir .wa-opcion:active{ background:rgba(0,0,0,.08); }

/* ── En el teléfono es una HOJA que sube desde abajo ────────────────────────────────────────
   Es como WhatsApp presenta este menú, y además pone las opciones al alcance del pulgar en vez
   de en el centro de la pantalla. En escritorio se queda arriba, como el resto de las modales
   del sistema. */
@media (max-width: 575.98px) {
  #modalWaAbrir .modal-dialog{ position:fixed; left:0; right:0; bottom:0; width:100%;
                               max-width:none; margin:0; }
  #modalWaAbrir .modal-content{ border-radius:16px 16px 0 0; }
  #modalWaAbrir .wa-asidero{ display:block; width:36px; height:4px; border-radius:2px;
                             background:#d1d7db; margin:8px auto 0; }
  #modalWaAbrir .modal-header{ padding-top:12px; }
  #modalWaAbrir .modal-body{ padding-bottom:22px; }   /* aire para la barra de gestos del sistema */
  /* Sube en vez de aparecer en el centro: el movimiento dice de dónde salió y a dónde vuelve. */
  #modalWaAbrir.fade .modal-dialog{ transform:translateY(100%); transition:transform .25s ease-out; }
  #modalWaAbrir.show .modal-dialog{ transform:none; }
}

/* Tarjeta de ubicación: el mapa arriba y el rótulo abajo, como en WhatsApp.
   ⚠ Si el mapa no se pudo dibujar el endpoint contesta 404 y el <img> queda roto; con `min-height`
   y el fondo del mapa, la tarjeta conserva su forma y el rótulo se sigue leyendo. */
.wa-mapa{ display:block; width:300px; max-width:100%; margin:0 0 2px; border-radius:6px;
          overflow:hidden; background:rgba(0,0,0,.045); text-decoration:none; color:inherit; }
.wa-mapa:hover{ background:rgba(0,0,0,.075); }
.wa-mapa img{ display:block; width:100%; aspect-ratio:2/1; object-fit:cover; background:#e8e5df; }
.wa-mapa .pie{ display:flex; align-items:center; gap:9px; padding:9px 11px; }
.wa-mapa .pie > i{ font-size:20px; color:#d62d20; flex-shrink:0; }
.wa-mapa .txt{ min-width:0; }
.wa-mapa .txt b{ display:block; font-size:13.5px; font-weight:500; overflow:hidden;
                 text-overflow:ellipsis; white-space:nowrap; }
.wa-mapa .txt small{ display:block; font-size:12px; color:var(--wa-sec); overflow:hidden;
                     text-overflow:ellipsis; white-space:nowrap; }

/* Tarjeta de contacto compartido. WhatsApp no manda la foto, así que van las iniciales. */
.wa-contacto{ width:300px; max-width:100%; margin:0 0 2px; border-radius:6px; overflow:hidden;
              background:rgba(0,0,0,.045); }
.wa-contacto + .wa-contacto{ margin-top:4px; }   /* pueden venir varios en un mismo mensaje */
.wa-contacto .cab{ display:flex; align-items:center; gap:10px; padding:11px 12px; }
.wa-contacto .ini{ width:40px; height:40px; border-radius:50%; flex-shrink:0;
                   background:var(--wa-verde); color:#fff; font-size:15px; font-weight:500;
                   display:flex; align-items:center; justify-content:center; }
.wa-contacto .cab .txt{ min-width:0; }
.wa-contacto .cab b{ display:block; font-size:14px; font-weight:500; overflow:hidden;
                     text-overflow:ellipsis; white-space:nowrap; }
.wa-contacto .cab small{ display:block; font-size:12px; color:var(--wa-sec); overflow:hidden;
                         text-overflow:ellipsis; white-space:nowrap; }
.wa-contacto .fila{ display:flex; align-items:stretch; border-top:1px solid rgba(0,0,0,.06); }
.wa-contacto .dato{ flex:1; min-width:0; display:flex; align-items:center; gap:9px;
                    padding:9px 12px; text-decoration:none; color:inherit; font-size:13.5px; }
.wa-contacto .dato:hover,
.wa-contacto .acc:hover{ background:rgba(0,0,0,.05); }
.wa-contacto .dato > i{ font-size:17px; color:var(--wa-sec); flex-shrink:0; }
.wa-contacto .dato span{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
/* El tipo del teléfono («cell», «work») es contexto, no el dato: se ve más callado. */
.wa-contacto .dato em{ font-style:normal; color:var(--wa-sec); font-size:11.5px; }
.wa-contacto .acc{ display:flex; align-items:center; padding:0 13px; color:var(--wa-verde);
                   font-size:18px; text-decoration:none; border-left:1px solid rgba(0,0,0,.06); }
.wa-contacto .aviso{ padding:9px 12px; border-top:1px solid rgba(0,0,0,.06);
                     font-size:12px; color:var(--wa-sec); }

/* Mensaje que la Cloud API no entrega (encuesta, edición, GIF…). Se ve como una nota y no como
   un error rojo: no falló nada nuestro, y quien atiende necesita saber qué hacer, no asustarse. */
.wa-nosoportado{ width:300px; max-width:100%; border-left:3px solid #e6a700; border-radius:4px;
                 background:rgba(230,167,0,.08); padding:8px 11px; }
.wa-nosoportado .que{ font-size:14px; }
.wa-nosoportado .por-que{ font-size:12px; line-height:16.5px; color:var(--wa-sec); margin-top:3px; }

/* ── Menú del clip: las opciones apagadas ────────────────────────────────────────────────────
   Se ven, pero se ven APAGADAS. Esconderlas dejaría a alguien buscando «encuesta» sin entender
   que WhatsApp no la deja mandar; el `title` de cada una explica por qué. */
/* Cada opción con su color, como WhatsApp: el color es lo que hace que se reconozcan de un
   vistazo sin leer. Las que todavía no están hechas van en gris, y ese contraste ya dice cuáles
   funcionan sin necesidad de ninguna nota. */
.wa-adj > .ti{ font-size:19px; width:24px; text-align:center; }
.wa-adj.c-doc    > .ti{ color:#7f66ff; }
.wa-adj.c-foto   > .ti{ color:#e542a3; }
.wa-adj.c-camara > .ti{ color:#ff2e74; }
.wa-adj.c-audio  > .ti{ color:#ff8c00; }
.wa-adj.apagado{ opacity:.42; cursor:default; }
.wa-adj.apagado > .ti{ color:var(--wa-sec); }
.wa-adj.apagado:hover{ background:none; }

/* ── Previsualización antes de enviar ────────────────────────────────────────────────────── */
.wa-previa{ position:fixed; inset:0; z-index:1095; background:rgba(11,20,26,.96);
            display:flex; flex-direction:column; }
.wa-previa .barra{ display:flex; align-items:center; gap:10px; padding:10px 14px; color:#fff;
                   flex-shrink:0; }
.wa-previa .accion{ width:38px; height:38px; border:0; border-radius:50%; background:none;
                    color:#fff; font-size:20px; cursor:pointer;
                    display:flex; align-items:center; justify-content:center; }
.wa-previa .accion:hover{ background:rgba(255,255,255,.14); }
.wa-previa .nombre{ flex:1; min-width:0; font-size:14px; overflow:hidden;
                    text-overflow:ellipsis; white-space:nowrap; }
.wa-previa .peso{ font-size:12px; opacity:.7; white-space:nowrap; }

.wa-previa .cuerpo{ flex:1; min-height:0; display:flex; align-items:center;
                    justify-content:center; padding:8px 16px; }
.wa-previa .cuerpo img,
.wa-previa .cuerpo video{ max-width:100%; max-height:100%; border-radius:6px; }
.wa-previa .cuerpo audio{ width:min(420px,90%); }
/* Un documento no tiene vista previa: se muestra qué es, con su nombre. */
.wa-previa .cuerpo .doc{ display:flex; flex-direction:column; align-items:center; gap:14px;
                         color:#fff; text-align:center; padding:0 24px; }
.wa-previa .cuerpo .doc i{ font-size:76px; opacity:.55; }
.wa-previa .cuerpo .doc span{ font-size:14px; word-break:break-word; }

.wa-previa .pie{ display:flex; align-items:center; gap:10px; padding:12px 14px 18px;
                 flex-shrink:0; }
.wa-previa .pie input{ flex:1; min-width:0; border:0; border-radius:9px; background:#fff;
                       padding:11px 14px; font-size:14.5px; outline:0; }
.wa-previa .enviar{ width:48px; height:48px; min-width:48px; border:0; border-radius:50%;
                    background:var(--wa-verde); color:#fff; font-size:21px; cursor:pointer;
                    display:flex; align-items:center; justify-content:center; }
.wa-previa .enviar:disabled{ opacity:.6; cursor:default; }

/* ── Emojis iguales en todos los equipos ──────────────────────────────────────────────────
   `Noto Color Emoji` va PRIMERA y `inherit` después: la fuente solo declara rangos de emoji
   (ver `emojis-locales.css`), así que las letras caen igual en la tipografía que ya heredaban.
   Anteponerla al revés no serviría — la primera que cubra el carácter es la que gana.

   Se aplica donde de verdad se ven emojis y no al `body` entero: el resto del sistema no los usa
   y no tiene por qué arrastrar la descarga. */
.wa-burbuja, .wa-reaccion, .wa-emojis, .wa-reac-rapida, .wa-previa .pie input,
.wa-conv-prev, #waTexto {
  /* ⚠ `inherit` NO vale dentro de una lista de `font-family`: la declaración entera se descarta
     y no pasa nada, en silencio. Se usa el token del tema, que es la misma pila que heredaban
     —y es `--ins-*`, no `--bs-*`: los tokens de Ubold llevan ese prefijo—. */
  font-family: 'Noto Color Emoji', var(--ins-body-font-family);
}

/* ── Dibujar sobre la imagen ──────────────────────────────────────────────────────────────
   ⚠ El lienzo ocupa TODO el cuerpo y la imagen se centra dentro; el canvas NO se estira al
   lienzo, lo coloca el JS sobre el rectángulo real de la imagen (`dibAjustarCanvas`).

   La primera versión hacía lo contrario —lienzo `inline-block` ajustado a la imagen y canvas a
   `inset:0`— y estaba mal: con `max-height:100%` en los dos, la altura del lienzo se resolvía
   contra el cuerpo y la de la imagen contra el lienzo, que todavía no tenía altura. La imagen
   terminaba con un alto y el canvas con otro. Medido: una captura de 1920×1080 mostraba la imagen
   a 1408×792 y el canvas a 1408×748, y una de 1080×1920 ni siquiera se escalaba. Los trazos caían
   corridos respecto a donde se tocaba y al fundirlos quedaban fuera de la foto: se dibujaba y se
   enviaba «sin el dibujo».

   Con el lienzo de altura completa, el `max-height:100%` de la imagen sí tiene contra qué
   resolverse, que es lo que hacía bien el CSS de antes, cuando la imagen colgaba directamente
   del cuerpo. */
.wa-previa .lienzo{ position:relative; display:flex; align-items:center; justify-content:center;
                    width:100%; height:100%; min-height:0; line-height:0; }
.wa-previa .lienzo img{ display:block; max-width:100%; max-height:100%; }
/* ⚠ `touch-action:none`: sin esto, en el teléfono el dedo desplaza la pantalla en vez de dibujar,
   y el trazo sale entrecortado o no sale. Sin `inset`/`width`: las cuatro medidas las pone el JS. */
.wa-previa .lienzo canvas{ position:absolute; border-radius:6px;
                           touch-action:none; pointer-events:none; }
.wa-previa .lienzo.dibujando canvas{ pointer-events:auto; cursor:crosshair; }

.wa-dibujo-barra{ display:flex; align-items:center; justify-content:center; flex-wrap:wrap;
                  gap:14px; padding:2px 14px 8px; flex-shrink:0; }
.wa-dibujo-barra .colores,
.wa-dibujo-barra .grosores{ display:flex; align-items:center; gap:8px; }
.wa-dibujo-barra .color{ width:26px; height:26px; border-radius:50%; border:2px solid transparent;
                         cursor:pointer; padding:0; }
/* El elegido se marca con un aro blanco separado: un borde del mismo color se pierde sobre el
   fondo oscuro, justo con los colores claros. */
.wa-dibujo-barra .color.activo{ border-color:#fff; box-shadow:0 0 0 2px rgba(0,0,0,.5); }
.wa-dibujo-barra .grosor{ width:26px; height:26px; border-radius:50%; border:0; cursor:pointer;
                          background:rgba(255,255,255,.14); padding:0;
                          display:flex; align-items:center; justify-content:center; }
.wa-dibujo-barra .grosor.activo{ background:rgba(255,255,255,.4); }
.wa-dibujo-barra .grosor span{ display:block; border-radius:50%; background:#fff; }
/* El botón del lápiz encendido, para que se vea que el modo está activo. */
.wa-previa .accion.activo{ background:rgba(255,255,255,.22); }

/* Mientras sube: el botón late y el panel no acepta más toques. Sin señal, con un archivo
   grande parece que no pasó nada y se toca otra vez. */
.wa-previa.subiendo{ pointer-events:none; }
.wa-previa.subiendo .enviar{ animation:wa-latido 1s ease-in-out infinite; }
@keyframes wa-latido{ 50%{ opacity:.45; } }

/* ── Grabar una nota de voz ──────────────────────────────────────────────────────────────── */
.wa-mic{ color:var(--wa-sec); }
/* Mientras el navegador pregunta por el permiso: se ve que algo está pasando y no acepta más
   toques. Sin esto, el botón parece muerto y la gente lo aprieta varias veces. */
.wa-mic.esperando{ animation:wa-latido 1s ease-in-out infinite; }
.wa-grabando{ display:flex; align-items:center; gap:12px; padding:8px 12px;
              background:var(--wa-barra); border-top:1px solid var(--wa-borde); }
.wa-grabando .tirar,
.wa-grabando .mandar{ width:40px; height:40px; min-width:40px; border:0; border-radius:50%;
                      cursor:pointer; font-size:19px;
                      display:flex; align-items:center; justify-content:center; }
.wa-grabando .tirar{ background:none; color:#d62d20; }
.wa-grabando .tirar:hover{ background:rgba(214,45,32,.1); }
.wa-grabando .mandar{ background:var(--wa-verde); color:#fff; margin-left:auto; }
/* El punto late: es la señal de que el micrófono está abierto AHORA. */
.wa-grabando .punto{ width:10px; height:10px; border-radius:50%; background:#d62d20;
                     animation:wa-latido 1.2s ease-in-out infinite; }
.wa-grabando .reloj{ font-variant-numeric:tabular-nums; font-size:14px; color:#111b21; }
.wa-grabando .ayuda{ font-size:13px; color:var(--wa-sec); }

/* Burbuja de un archivo que todavía está subiendo. La opacidad dice «esto no está confirmado»
   sin necesidad de leer nada; el aro dice que algo está pasando. */
.wa-fila[data-enviando] .wa-burbuja{ opacity:.72; }
.wa-subiendo{ display:inline-flex; align-items:center; gap:5px; }
/* Sobre una foto el pie va superpuesto y el texto es blanco, así que el aro también tiene que
   serlo: en gris oscuro sobre una imagen oscura no se veía girar. */
.wa-burbuja.solo-media .wa-subiendo .aro{ border-color:rgba(255,255,255,.45); border-top-color:#fff; }
.wa-subiendo .aro{ width:11px; height:11px; border-radius:50%;
                   border:2px solid rgba(0,0,0,.18); border-top-color:var(--wa-verde);
                   animation:wa-giro .8s linear infinite; }
@keyframes wa-giro{ to{ transform:rotate(360deg); } }

/* ── Lucecita del estado de la línea ─────────────────────────────────────────────────────────
   Sustituye al badge con texto («conectado» / «sin configurar»), que ocupaba media cabecera para
   decir algo que casi siempre es lo mismo. El color lleva el estado; el detalle sale al tocarla. */
.wa-luz{ width:10px; height:10px; min-width:10px; padding:0; border:0; border-radius:50%;
         background:#c3ccd2; cursor:pointer; margin:0 2px; }
.wa-luz.ok{ background:#25d366; }
/* ⚠ Solo la roja late. Un indicador que parpadea en el estado NORMAL enseña a ignorarlo, y
   entonces ya no avisa nada cuando de verdad pasa algo. */
.wa-luz.mal{ background:#f15c6d; animation:wa-luz-late 1.6s ease-in-out infinite; }
@keyframes wa-luz-late{ 50%{ opacity:.35; } }
.wa-luz:focus-visible{ outline:2px solid var(--wa-verde); outline-offset:2px; }

/* Estado de la línea en la PANTALLA de configuración. Es el mismo dato que la lucecita de 10 px
   que estaba en la cabecera de la bandeja, pero acá tiene sitio para leerse: un disco con el icono
   y un halo del color del estado, al lado de la frase que dice qué significa.
   El halo es `box-shadow` y no un borde: un borde suma tamaño y descuadra la fila. */
.wa-conexion{ width:48px; height:48px; min-width:48px; border-radius:50%;
              display:inline-flex; align-items:center; justify-content:center;
              background:#eceff1; color:#8d99a3; font-size:24px; }
.wa-conexion.ok { background:rgba(37,211,102,.14); color:#1da851;
                  box-shadow:0 0 0 6px rgba(37,211,102,.10), 0 0 18px rgba(37,211,102,.45); }
/* ⚠ Solo el rojo late, igual que la lucecita chica: un indicador que parpadea en el estado NORMAL
   enseña a ignorarlo, y entonces ya no avisa nada cuando de verdad pasa algo. */
.wa-conexion.mal{ background:rgba(241,92,109,.14); color:#e0374b;
                  box-shadow:0 0 0 6px rgba(241,92,109,.10);
                  animation:wa-luz-late 1.6s ease-in-out infinite; }

/* ⚠ Tope de ancho para las burbujas CON MINIATURA en ESCRITORIO, y solo para ellas.
   Una burbuja de texto puede crecer con la ventana; una foto no debe. En una pantalla de 1400 px
   el hilo mide 730 y el 65% dejaba las imágenes en 412 px de ancho: una vertical quedaba en 514
   de alto y se comía la pantalla. WhatsApp Web hace justo esto — la multimedia no crece.
   ⚠ Va dentro de la consulta de escritorio a propósito: puesto suelto, la mayor especificidad de
   `.wa-burbuja.con-media` le ganaba también al `max-width:82%` del teléfono y las imágenes de
   móvil pasaban de 312 a 330 px sin que nadie lo hubiera pedido. */
@media (min-width: 768px) {
  .wa-burbuja.con-media{ max-width:336px; }
}

/* ── Quién atiende la conversación ───────────────────────────────────────────────────────────
   Verde si es tuya, ámbar si es de otro. El color hace el trabajo: en una bandeja con varias
   conversaciones, leer un nombre en cada cabecera es más lento que ver un tono. */
.wa-agente{ font-size:11.5px; font-weight:500; padding:3px 9px; border-radius:11px;
            white-space:nowrap; }
.wa-agente.mia{ background:rgba(0,128,105,.12); color:var(--wa-verde); }
.wa-agente.ajena{ background:rgba(230,167,0,.15); color:#8a6100; }

/* ── La lista del «/» ──────────────────────────────────────────────────────────────────────
   Sale PEGADA al compositor, encima del campo: lo que se está escribiendo es lo que la filtra,
   así que tiene que verse el campo y la lista a la vez. */
.wa-barra-menu{ position:absolute; bottom:100%; left:12px; right:12px; z-index:30;
                max-height:16rem; overflow-y:auto; margin-bottom:6px;
                background:#fff; border:1px solid var(--wa-borde); border-radius:8px;
                box-shadow:0 6px 24px rgba(11,20,26,.18); }
.wa-barra-item{ display:flex; flex-direction:column; gap:1px; width:100%; padding:7px 14px;
                border:0; background:none; text-align:left; cursor:pointer; }
.wa-barra-item:hover,
.wa-barra-item.activa{ background:rgba(0,0,0,.05); }
.wa-barra-titulo{ font-size:13.5px; font-weight:600; color:var(--wa-txt,#111b21); }
/* El cuerpo en una línea: la lista sirve para RECONOCER la respuesta, no para leerla entera. */
.wa-barra-cuerpo{ font-size:12px; color:var(--wa-sec); overflow:hidden; text-overflow:ellipsis;
                  white-space:nowrap; }
.wa-barra-vacia{ padding:14px; text-align:center; font-size:12.5px; color:var(--wa-sec); }

/* ── El formato de WhatsApp dentro de una burbuja ──────────────────────────────────────────
   ⚠ El peso va explícito. El tema redefine `b, strong` como `--ins-font-weight-semibold`, que
   vale 600 —y en otra hoja, 500—, así que la negrita salía en 600 contra los 400 del texto
   normal: a tamaño de burbuja eso se lee casi igual y Mario reportó que no se veía. WhatsApp usa
   negrita de verdad, y acá se imita lo que el cliente ve en su teléfono, no el peso del tema. */
.wa-burbuja b,
.wa-burbuja strong{ font-weight:700; }
.wa-burbuja i,
.wa-burbuja em{ font-style:italic; }
.wa-burbuja s{ text-decoration:line-through; }
.wa-burbuja code{ font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; font-size:.92em;
                  background:rgba(0,0,0,.05); padding:1px 4px; border-radius:3px; }

/* ── Nota privada ───────────────────────────────────────────────────────────────────────────
   Una nota la escribió una persona y dice algo del cliente, así que es una burbuja con autor y
   hora. Pero en AMARILLO y con el borde marcado: confundirla con un mensaje enviado sería creer
   que el cliente la leyó, y eso no se deshace. Nada de verde acá. */
/* ⚠ Acotada a `.wa-fila.propia` y no suelta. La nota va a la derecha, y ahí el tema pinta
   `.wa-fila.propia .wa-burbuja{ background:var(--wa-propia) }` — dos clases contra una, así que
   un `.wa-nota-privada` a secas perdía y la nota salía VERDE, igual que un mensaje enviado. El
   contexto le gana al estado salvo que se lo iguale. */
.wa-fila.propia .wa-burbuja.wa-nota-privada,
.wa-nota-privada{ background:#fff8dc; border:1px solid #e8d48a; color:#5a4a1a; }
.wa-nota-cab{ display:flex; align-items:center; gap:6px; font-size:11.5px; font-weight:600;
              color:#8a6d1f; margin-bottom:3px; }
.wa-nota-cab .ti{ font-size:14px; }
.wa-nota-cuerpo{ white-space:pre-wrap; overflow-wrap:anywhere; }

/* El campo mientras se escribe una nota. Junto con el botón de salir que ocupa el lugar del
   micrófono, es lo que dice que el modo está puesto: la tira amarilla que iba sobre el compositor
   se quitó el 2026-09-15 porque le robaba dos renglones a la conversación en cada nota. */
#waTexto.en-nota{ background:#fff8dc; }

/* Sale donde está el micrófono y SOLO durante la nota privada, así que no compite con nada: es a
   la vez la salida del modo y la señal de que el modo está puesto. Va en el ámbar del campo para
   que se lean como una sola cosa. ⚠ El texto usa un ámbar oscurecido (#7a5f12 sobre #fff8dc da
   5.68:1): el del borde no llega al mínimo de 4.5:1 para texto. */
.wa-salir-nota{ color:#7a5f12; background:#fff8dc; border:1px solid #e8d48a; border-radius:50%; }
.wa-salir-nota:hover{ color:#4a3a0e; background:#fdf0bd; }
.wa-salir-nota:focus-visible{ outline:2px solid #7a5f12; outline-offset:2px; }

/* El clip apagado mientras dure la nota: un adjunto siempre sale hacia el cliente. */
#waAdjuntar[disabled]{ opacity:.4; cursor:not-allowed; }

/* Una opción del menú que está ENCENDIDA (la firma, el modo nota). */
.wa-adj.activo{ color:var(--wa-verde); font-weight:600; }
.wa-adj-estado{ margin-left:auto; font-size:11px; font-weight:600; color:var(--wa-verde); }

/* Nota del sistema («X transfirió a Y»): centrada, como el separador de día, para que no se
   confunda con un mensaje que el cliente escribió o recibió. */
.wa-nota-sistema{ display:flex; justify-content:center; margin:10px 0; }
.wa-nota-sistema span{ background:rgba(255,255,255,.92); color:var(--wa-sec); font-size:12px;
                       padding:5px 12px; border-radius:8px; text-align:center; max-width:80%;
                       box-shadow:0 1px .5px rgba(11,20,26,.08); }

/* Toast de la bandeja. Un poco más ancho que el de por defecto: varios avisos explican qué hacer
   y con el ancho estándar se parten en cinco renglones. */
.wa-toast{ width:auto; max-width:min(420px, 92vw); }
.wa-toast .swal2-title{ font-size:14.5px; }
.wa-toast .swal2-html-container{ font-size:13px; line-height:18px; margin:2px 0 0; }

/* Ventana de 24 h: un reloj y el tiempo. Reemplaza al badge «quedan 23 h», que decía en cuatro
   palabras lo que el ícono y el número dicen igual. El color lleva la urgencia. */
.wa-ventana{ display:inline-flex; align-items:center; gap:4px; font-size:11.5px; font-weight:500;
             padding:3px 9px; border-radius:11px; white-space:nowrap; }
.wa-ventana .ti{ font-size:14px; }
.wa-ventana.verde{ background:rgba(0,128,105,.12); color:var(--wa-verde); }
.wa-ventana.ambar{ background:rgba(230,167,0,.16); color:#8a6100; }
.wa-ventana.roja{ background:rgba(214,45,32,.12); color:#c0392b; }
.wa-ventana.gris{ background:rgba(0,0,0,.06); color:var(--wa-sec); }

/* Enlaces dentro de un mensaje. Subrayados: en una burbuja de color, solo cambiar el tono no
   alcanza para que se vea que es tocable. */
.wa-enlace{ color:#027eb5; text-decoration:underline; word-break:break-word; }
.wa-fila.propia .wa-enlace{ color:#046b4f; }

/* Quién respondió: badge blanco al PIE de la burbuja, a la izquierda, con la hora a la derecha.
   Es contexto de la respuesta, no su encabezado. */
/* ⚠ Autor y hora comparten un PIE con `flex`, y no se resuelven con `float`.
   Con `inline-flex` el badge quedaba pegado al final del texto, en medio del mensaje. Como bloque
   arrancaba su propio renglón pero empujaba la hora una línea más abajo. Y flotando seguían
   cayendo en renglones distintos según lo largo que fuera el texto. Un contenedor propio lo deja
   fijo: autor a la izquierda, hora a la derecha, misma línea, siempre. */
/* ⚠ `flex-end` y NO `space-between`. Con `space-between` y un solo hijo —los mensajes ENTRANTES no
   llevan autor— la hora se iba al principio, o sea a la IZQUIERDA. La hora va abajo a la derecha
   SIEMPRE, sea de quien sea el mensaje; el autor se queda a la izquierda por su `margin-right:auto`,
   que es lo que empuja la hora al otro extremo cuando existe. */
.wa-pie-burbuja{ display:flex; align-items:center; justify-content:flex-end; gap:10px;
                 margin:7px -4px -4px 0; }
.wa-pie-burbuja > .wa-meta{ float:none; margin:0; }
.wa-autor{ margin-right:auto;   /* empuja la hora al extremo derecho */
           display:flex; align-items:center; gap:4px; background:#fff; color:#027a5f;
           font-size:10.5px; font-weight:600; padding:2px 8px; border-radius:9px;
           box-shadow:0 1px .5px rgba(11,20,26,.1); flex-shrink:0; }
/* ⚠ Antes el ícono salía de un `::before` con el código de glifo `\ea79` escrito a mano, que en
   Tabler es… una BRÚJULA. Un dibujo sin relación con «quién escribió esto», que al lado de un
   nombre se lee como un adorno fuera de lugar. Ahora es un `<i class="ti ti-user">` de verdad en el
   markup: se entiende leyendo el código, lo centra el mismo `flex` que a todo lo demás, y no hay
   forma de que el código apunte a otro dibujo sin que se note.
   Regla para el resto: los íconos van por CLASE, nunca por `content` con el código del glifo. */
.wa-autor > .ti{ font-size:11px; opacity:.75; line-height:1; }
.wa-burbuja.con-media .wa-autor{ margin-left:6px; }

/* «Tomar» con el mismo peso visual que el reloj: es una acción disponible, no una alarma. */
.wa-tomar{ display:inline-flex; align-items:center; gap:4px; border:0; cursor:pointer;
           font-size:11.5px; font-weight:500; padding:3px 9px; border-radius:11px;
           background:rgba(0,128,105,.12); color:var(--wa-verde); white-space:nowrap; }
.wa-tomar:hover{ background:rgba(0,128,105,.2); }
.wa-tomar .ti{ font-size:13px; }
.wa-tomar.d-none{ display:none; }

/* Tarjeta de vista previa de un enlace. Va sobre el texto, como en WhatsApp: primero la tarjeta,
   después el mensaje. */
/* ⚠ Tope propio, no `width:100%`. La burbuja de texto crece con la ventana —y con lo largo que
   sea la URL—, así que la tarjeta se estiraba hasta media pantalla y la imagen con ella. Acá manda
   la tarjeta, no la burbuja. */
.wa-previa-enlace{ display:block; width:300px; max-width:100%; margin:0 0 5px; border-radius:6px;
                   overflow:hidden; background:rgba(0,0,0,.05); text-decoration:none;
                   color:inherit; }
.wa-previa-enlace:hover{ background:rgba(0,0,0,.08); }
.wa-previa-enlace img{ display:block; width:100%; aspect-ratio:2.4/1; object-fit:cover;
                       max-height:126px; background:#e9edef; }
.wa-previa-enlace .txt{ display:block; padding:7px 9px; }
.wa-previa-enlace b{ display:block; font-size:13px; font-weight:500; line-height:17px;
                     max-height:34px; overflow:hidden; }
.wa-previa-enlace small{ display:block; font-size:12px; line-height:16px; color:var(--wa-sec);
                         max-height:32px; overflow:hidden; margin-top:1px; }
.wa-previa-enlace .sitio{ display:block; font-size:11.5px; color:var(--wa-sec); margin-top:3px; }
/* La burbuja se ajusta a la tarjeta, que ya trae su ancho. Antes se le forzaba un mínimo y el
   resultado era el contrario: crecía de más. */
.wa-burbuja.con-enlace{ max-width:min(65%, 336px); }

/* Tres puntitos de «escribiendo…». Preparado para cuando aparezcan del lado del CLIENTE — que
   es donde significan algo. ⚠ No se usan para el lado propio: puestos ahí invierten lo que
   cualquiera entiende al verlos. */
.wa-escribiendo .wa-burbuja{ display:inline-flex; align-items:center; gap:8px; padding:9px 13px; }
.wa-escribiendo .puntitos{ display:inline-flex; gap:3px; align-items:center; }
.wa-escribiendo .puntitos i{ width:6px; height:6px; border-radius:50%; background:var(--wa-sec);
                             display:block; animation:wa-punto 1.2s ease-in-out infinite; }
.wa-escribiendo .puntitos i:nth-child(2){ animation-delay:.18s; }
.wa-escribiendo .puntitos i:nth-child(3){ animation-delay:.36s; }
@keyframes wa-punto{ 0%,60%,100%{ transform:translateY(0); opacity:.45; }
                     30%{ transform:translateY(-4px); opacity:1; } }
}

/* Mensaje que Meta rechazó. ⚠ Se muestra el motivo, no un «no se envió» a secas: la diferencia
   entre «formato no procesable» y «ventana vencida» es la diferencia entre saber qué hacer y no. */
.wa-fallo{ display:flex; align-items:flex-start; gap:6px; margin:4px 0 0; padding:6px 9px;
           background:rgba(214,45,32,.08); border-left:3px solid #d62d20; border-radius:4px;
           font-size:11.5px; line-height:16px; color:#a4291f; }
.wa-fallo .ti{ font-size:14px; flex-shrink:0; margin-top:1px; }

/* ── Cargar mensajes anteriores ──────────────────────────────────────────────────────────────
   El hilo llega de a 100 y los viejos están arriba. Se cargan solos al llegar al tope, pero el
   botón se muestra igual: es la única forma de pedirlos con teclado, y deja ver que hay más
   conversación en vez de que el hilo simplemente empiece de golpe. */
.wa-mas-viejos{ display:flex; justify-content:center; padding:12px 0 6px; }
.wa-mas-btn{ border:1px solid var(--wa-borde, #e9edef); background:#fff; color:#54656f;
             font-size:12.5px; font-weight:600; padding:6px 14px; border-radius:999px;
             cursor:pointer; box-shadow:0 1px 2px rgba(11,20,26,.08); }
.wa-mas-btn:hover{ background:#f5f6f6; }
.wa-mas-btn:disabled{ opacity:.6; cursor:default; }

/* ── Mensaje que no salió ────────────────────────────────────────────────────────────────────
   Pedido de Mario (2026-09-15): mientras siga sin enviarse, que se vea. Un tick rojo de 14 px en
   la esquina no se encuentra al repasar una conversación larga, y un mensaje que quedó a medias
   es justo el que hay que volver a mirar.
   ⚠ Acotada a `.wa-fila.propia` por lo mismo que la nota privada: el verde del tema se pinta con
   tres clases y un `.wa-fallida` suelto perdería, dejando la burbuja del color de un mensaje que
   sí salió — exactamente lo contrario de lo que tiene que decir. */
.wa-fila.propia .wa-burbuja.wa-fallida,
.wa-burbuja.wa-fallida{ background:#fdecea; border:1px solid #f3b9b0; }
/* Dentro de una burbuja ya teñida, el recuadro del motivo sobra: se queda el texto y el ícono. */
.wa-burbuja.wa-fallida .wa-fallo{ background:none; border-left:0; padding:4px 0 0; }
.wa-fallo span{ flex:1 1 auto; }
/* El botón del reintento. Contorno y no relleno: la acción principal de la pantalla sigue siendo
   escribir, y un botón sólido acá competiría con el de enviar desde dentro de una burbuja. */
.wa-reintentar{ flex:none; align-self:flex-start; border:1px solid #c0392b; background:none;
                color:#a4291f; font-size:11px; font-weight:600; line-height:1;
                padding:4px 8px; border-radius:4px; cursor:pointer; white-space:nowrap; }
.wa-reintentar:hover{ background:#c0392b; color:#fff; }
.wa-reintentar:disabled{ opacity:.55; cursor:default; }
.wa-reintentar:focus-visible{ outline:2px solid #c0392b; outline-offset:2px; }

/* Confirmaciones de entrega. El color es lo que las distingue de un vistazo; el `title` dice la
   palabra exacta para quien no las tenga interiorizadas. */
.wa-tick.leido{ color:var(--wa-tick); }
.wa-tick.fallido{ color:#d62d20; }

/* Acciones de un mensaje: aparecen al pasar por la burbuja, como en WhatsApp. En táctil no hay
   `hover`, así que ahí se dejan siempre visibles pero muy tenues. */
.wa-burbuja{ }
.wa-acciones{ position:absolute; top:2px; right:2px; width:22px; height:22px; border:0;
              border-radius:4px; background:none; color:var(--wa-sec); cursor:pointer;
              opacity:0; transition:opacity .12s; display:flex; align-items:center;
              justify-content:center; font-size:15px; padding:0; }
.wa-burbuja:hover .wa-acciones{ opacity:.75; }
.wa-acciones:hover{ opacity:1 !important; background:rgba(0,0,0,.06); }
@media (hover: none) { .wa-acciones{ opacity:.4; } }
/* Sobre una foto al ras, el gris no se ve: se le pone fondo. */
.wa-burbuja.con-media .wa-acciones{ background:rgba(255,255,255,.75); color:#3b4a54; }

/* Dos menús flotantes con la misma pinta: el del mensaje y el de la conversación. Comparten
   selector en vez de duplicarse, para que no se separen visualmente con el tiempo. */
.wa-menu-msj, .wa-menu-conv{ position:fixed; z-index:1100; background:#fff; border-radius:8px; padding:5px;
              min-width:172px; box-shadow:0 6px 22px rgba(11,20,26,.22); }
.wa-menu-msj button, .wa-menu-conv button, .wa-sel-ops button{ display:flex; align-items:center; gap:10px; width:100%; border:0;
                     background:none; padding:9px 11px; border-radius:6px; font-size:14px;
                     color:#3b4a54; cursor:pointer; text-align:left; }
.wa-menu-msj button:hover, .wa-menu-conv button:hover,
.wa-sel-ops button:not([disabled]):hover{ background:rgba(0,0,0,.05); }
.wa-menu-msj .ti, .wa-menu-conv .ti, .wa-sel-ops .ti{ font-size:17px; color:var(--wa-sec); }
.wa-menu-conv{ min-width:206px; }

/* Fila de reacción rápida, arriba del menú del mensaje.
   ⚠ Los botones de acá NO son los del menú: aquellos son filas de ancho completo con icono y
   texto, y estos son botones cuadrados en una sola línea. Por eso reinician `width` y `padding`,
   que heredarían de la regla de arriba y saldrían uno debajo de otro ocupando todo el ancho. */
.wa-reac-rapida{ display:flex; align-items:center; gap:2px; padding:2px;
                 border-bottom:1px solid var(--wa-borde); margin-bottom:4px; }
.wa-menu-msj .wa-reac-rapida button{ width:34px; min-width:34px; height:34px; padding:0;
                                     justify-content:center; border-radius:50%; font-size:19px;
                                     line-height:1; }
/* La que ya está puesta se marca con un aro: sin señal no hay forma de saber cuál mandaste, y
   tocarla otra vez es lo que la quita. */
.wa-menu-msj .wa-reac-rapida button.puesta{ background:rgba(37,211,102,.18);
                                            box-shadow:inset 0 0 0 2px var(--wa-verde); }
.wa-menu-msj .wa-reac-rapida .ti{ font-size:18px; }
/* Borrar va separado y en rojo, igual que en el menú de la cabecera del hilo: es la única del
   menú que esconde la conversación para todos, y no puede quedar pegada a las inofensivas. */
.wa-menu-conv hr{ margin:5px 6px; border:0; border-top:1px solid var(--wa-borde); opacity:1; }
.wa-menu-conv button.peligro{ color:#dc3545; }
.wa-menu-conv button.peligro .ti{ color:#dc3545; }

/* Destinos del reenvío. */
.wa-destino{ display:flex; align-items:center; gap:11px; width:100%; border:0; background:none;
             padding:9px 12px; border-radius:7px; text-align:left; cursor:pointer; }
.wa-destino:hover:not(:disabled){ background:rgba(0,0,0,.05); }
.wa-destino:disabled{ opacity:.45; cursor:default; }
.wa-destino .ini{ width:38px; height:38px; min-width:38px; border-radius:50%; color:#fff;
                  display:flex; align-items:center; justify-content:center; font-size:14px;
                  font-weight:600; }
.wa-destino .txt{ min-width:0; }
.wa-destino b{ display:block; font-size:14px; font-weight:500; overflow:hidden;
               text-overflow:ellipsis; white-space:nowrap; }
.wa-destino small{ display:block; font-size:11.5px; color:var(--wa-sec); }

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   Pestañas de estado y placeholder de carga
   ═══════════════════════════════════════════════════════════════════════════════════════════ */

/* Fila de chips bajo el buscador. Con scroll horizontal porque los estados son configurables:
   una empresa puede tener ocho columnas y a 390 px no caben ni tres. Se esconde la barra pero
   el gesto de arrastrar sigue funcionando. */
.wa-estados {
  display: flex;
  gap: 6px;
  padding: 8px 12px 10px;
  overflow-x: auto;
  border-bottom: 1px solid var(--wa-borde);
  flex: 0 0 auto;
}

/* ⚠ Acá había `scrollbar-width: none`, copiado del gesto táctil de WhatsApp. En el teléfono se
   arrastra con el dedo y no hace falta barra; con un mouse normal, sin barra **no queda forma de
   mover la fila** — la rueda vertical no desplaza en horizontal y solo funcionaba el clic del
   botón central, que no es algo que nadie deba adivinar. Barra delgada, entonces: ocupa 6 px y
   además avisa que hay más estados a la derecha. */
.wa-estados { scrollbar-width: thin; scrollbar-color: #c7ced4 transparent; }
.wa-estados::-webkit-scrollbar { height: 6px; }
.wa-estados::-webkit-scrollbar-track { background: transparent; }
.wa-estados::-webkit-scrollbar-thumb { background: #c7ced4; border-radius: 3px; }
.wa-estados::-webkit-scrollbar-thumb:hover { background: #aab4bd; }

.wa-estado-chip {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  flex: 0 0 auto;
  padding: 5px 11px;
  border: 1px solid var(--wa-borde);
  border-radius: 999px;
  background: transparent;
  color: var(--wa-sec);
  font-size: .78rem;
  line-height: 1.2;
  white-space: nowrap;
  cursor: pointer;
  transition: background .15s, color .15s, border-color .15s;
}
.wa-estado-chip:hover { background: var(--wa-barra); }

/* El ícono lleva el color de la columna. Reemplazó al puntito: el punto solo decía «son
   distintas», el ícono dice qué es cada una y se reconoce de reojo, que es como se mira una fila de
   pestañas. Se deja `.wa-estado-punto` porque el tablero todavía lo usa en su cabecera. */
.wa-estado-punto {
  width: 8px; height: 8px;
  border-radius: 50%;
  flex: 0 0 auto;
}

.wa-estado-icono {
  font-size: .95rem;
  line-height: 1;
  flex: 0 0 auto;
}

.wa-estado-chip.activo {
  background: #e7f7ef;
  border-color: transparent;
  color: var(--wa-verde);
  font-weight: 500;
}

.wa-estado-chip .wa-estado-n {
  font-size: .7rem;
  opacity: .75;
}

/* ── Placeholder (skeleton) ──────────────────────────────────────────────────────────────────
   Se muestra al cambiar de pestaña. El filtro es instantáneo —los datos ya están en memoria— así
   que sin esto la lista salta de golpe y no se percibe que cambió: el placeholder no está tapando
   una espera, está marcando la transición. Por eso dura poco y a propósito. */
.wa-esqueleto { padding: 4px 0; }

.wa-esqueleto-fila {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 11px 14px;
}

.wa-esqueleto-avatar {
  width: 44px; height: 44px;
  border-radius: 50%;
  flex: 0 0 auto;
}

.wa-esqueleto-cuerpo { flex: 1 1 auto; min-width: 0; }

.wa-esqueleto-linea {
  height: 9px;
  border-radius: 5px;
  margin-bottom: 8px;
}
.wa-esqueleto-linea:last-child { margin-bottom: 0; }

/* El brillo que recorre las barras. `background-size: 400%` con la posición animada es lo que da
   el barrido; con un degradado del tamaño del elemento el brillo aparecería y desaparecería en el
   sitio en vez de desplazarse. */
.wa-esqueleto-avatar,
.wa-esqueleto-linea {
  background: linear-gradient(90deg, #ececec 25%, #f6f6f6 37%, #ececec 63%);
  background-size: 400% 100%;
  animation: waBrillo 1.3s ease-in-out infinite;
}

@keyframes waBrillo {
  0%   { background-position: 100% 50%; }
  100% { background-position: 0 50%; }
}

/* Respeta a quien pidió menos movimiento en el sistema: se queda el bloque gris, quieto. */
@media (prefers-reduced-motion: reduce) {
  .wa-esqueleto-avatar,
  .wa-esqueleto-linea { animation: none; }
}

/* Franja de clasificación bajo la cabecera del hilo: estado y departamento. */
.wa-clasif {
  display: flex;
  gap: 6px;
  align-items: center;
  padding: 7px 12px;
  background: var(--wa-barra);
  border-bottom: 1px solid var(--wa-borde);
  flex: 0 0 auto;
  /* ⚠ Envuelve, NO scrollea. Acá hay DOS controles, no una lista abierta como las pestañas de
     estado: con `overflow-x` el chip de departamento quedaba recortado contra el borde derecho y
     se leía como una etiqueta cortada, no como algo que se puede tocar. Mario preguntó «¿qué es
     eso?» sobre su propio selector. Bajar de línea no esconde nunca nada; el costo es una segunda
     fila en pantallas angostas, que es mucho más barato que un control invisible. */
  flex-wrap: wrap;
  row-gap: 6px;
}

.wa-clasif-chip {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  flex: 0 1 auto;
  max-width: 100%;
  padding: 4px 10px;
  border: 1px solid var(--wa-borde);
  border-radius: 999px;
  background: #fff;
  color: var(--wa-sec);
  font-size: .76rem;
  line-height: 1.3;
  white-space: nowrap;
  cursor: pointer;
}
.wa-clasif-chip:hover { background: #fafafa; }
.wa-clasif-chip .ti-chevron-down { font-size: .8rem; opacity: .6; }
.wa-clasif-chip > span:not(.wa-estado-punto) { overflow: hidden; text-overflow: ellipsis; }

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   Tablero de conversaciones
   ═══════════════════════════════════════════════════════════════════════════════════════════
   ⚠ El aspecto del tablero —columnas grises de 260 px, cabecera blanca, tarjeta con borde
   punteado azul, asa que aparece al apuntar, gesto de arrastre— ya NO está acá: se mudó a
   `personalizados.css`, bajo `.kanban-app`, y lo comparte con el tablero de Tareas.
   Ya llega solo: cuelga de `kanban-app`, que esta pantalla ya tenía.

   Por qué se movió: eran dos copias iguales que se fueron separando sin que nadie lo notara —el
   hueco que deja la tarjeta al arrastrar quedó amarillo acá y gris allá—. Con una sola definición,
   arreglar uno arregla los dos, y el tablero que venga mañana nace igual a estos.

   Acá queda solo lo propio de esta pantalla: su cabecera con el filtro de departamentos. */

/* ⚠ `w-auto` NO existe en el `app.min.css` desplegado —se comprobó: cero coincidencias—, así que
   `.form-select` se queda en su `width:100%` y el selector ocupa la fila entera, empujando el resto
   de la cabecera a líneas sueltas. Regla propia en vez de la clase del tema. */
#tbDepto { width: auto; min-width: 210px; }

/* En el teléfono el título, el filtro y el botón se apilaban en tres filas: 188 px de cabecera
   sobre 844 de pantalla, alto que le hace falta a las columnas. El filtro y el botón comparten
   línea —el filtro se estira, el botón toma lo suyo—, igual que los pares de botones del resto
   del sistema. `min-width: 0` porque un `<select>` trae un ancho intrínseco que, sin esto, le
   gana al `flex-shrink` y vuelve a empujar el botón a la fila de abajo. */
@media (max-width: 575.98px) {
  .kanban-app .card-header > h4 { flex: 1 0 100%; }
  /* Base CERO, no `auto`: con `auto` la base es el ancho del texto («Todos los departamentos»,
     210 px) y 210 + 8 + 114 no entra en los 300 px útiles, así que el navegador manda el botón a
     otra fila antes de encoger nada. Con base 0 el select toma lo que sobra —unos 178 px— y el
     texto se recorta, que en un desplegable no molesta. */
  #tbDepto { flex: 1 1 0; min-width: 0; }
  .kanban-app .card-header > .btn { flex: 0 0 auto; }
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   Stickers: sueltos, sin burbuja
   ═══════════════════════════════════════════════════════════════════════════════════════════
   Un sticker ya es un dibujo recortado y con transparencia. Metido en la burbuja se le ve el marco
   alrededor y el color de fondo asomando por las zonas transparentes — parecía una foto mal
   recortada. WhatsApp lo pone suelto sobre el fondo del chat, y más chico que una foto: son
   512×512 de origen y a 300 px ocupan media pantalla del teléfono. */
.wa-burbuja.sticker {
  background: transparent !important;
  border: 0;
  box-shadow: none;
  padding: 0;
  /* Se anulan las dos puntas de la burbuja, que sin fondo quedan como una mancha suelta. */
  border-radius: 0;
}
.wa-burbuja.sticker::before,
.wa-burbuja.sticker::after { display: none; }

/* 132 px: es el tamaño al que WhatsApp los muestra y a 390 px de ancho sigue leyéndose el dibujo
   sin comerse el hilo. */
/* ⚠ El tope va en la BURBUJA, no acá: la burbuja se dimensiona con el ancho de esta ancla, así que
   un `max-width:%` puesto acá se mide contra la burbuja que él mismo acaba de definir y el dibujo se
   encogía a 79 px. Es el mismo enredo de porcentajes contra anchos indefinidos del E73. */
.wa-burbuja.sticker { max-width: 60%; }

/* ⚠ Va con `.con-media` en el selector, no por gusto: un sticker SIEMPRE lleva las dos clases, y
   `.wa-burbuja.con-media .wa-imagen` fija `width: 300px` con la MISMA especificidad que
   `.wa-burbuja.sticker .wa-imagen`. Con el empate ganaba el 300, y el `max-width: 60%` de la
   burbuja lo recortaba a 160 px — de ahí que el sticker se viera más grande que en WhatsApp por
   más que acá dijera otra cosa. Con las dos clases juntas ya no hay empate. */
.wa-burbuja.con-media.sticker .wa-imagen {
  /* 124 px, medido contra la app: ahí un sticker ocupa ~32 % del ancho en un teléfono de 390 px;
     acá salía al 41 %. */
  width: 124px;
  max-width: 100%;
  overflow: visible;      /* el `overflow:hidden` de la imagen normal recortaba el sticker */
  border-radius: 0;
  margin: 0;
}
.wa-burbuja.sticker .wa-imagen img {
  background: transparent;   /* el gris de reserva se veía por las zonas transparentes */
  /* El que manda el tamaño es la caja: sin esto el `img` se pintaba a su ancho natural y el
     `width` de arriba quedaba de adorno. */
  width: 100%;
  height: auto;
  max-height: none;
  object-fit: contain;
  border-radius: 0;
}

/* Sin degradado ni hora superpuesta: sobre un dibujo transparente no hay nada donde apoyarlas. */
.wa-burbuja.sticker .wa-imagen::after { display: none; }

.wa-burbuja.sticker .wa-meta {
  position: static;
  float: none;
  margin: 2px 0 0;
  color: var(--wa-sec);
  text-shadow: none;
  display: block;
}
/* ⚠ Acá NO va ninguna regla de color para la palomilla. La había —celeste fija, para deshacer el
   blanco de `solo-media`— y hacía lo mismo al revés: pintaba de celeste hasta la recién enviada.
   Sin regla, la palomilla del sticker hereda el gris de `.wa-meta` y `.wa-tick.leido` hace su
   trabajo, igual que en un mensaje de texto. */

/* ⚠ El pie lleva márgenes de -4px pensados para una burbuja CON relleno. El sticker no tiene
   ninguno —va suelto, sin recuadro—, así que la hora se salía del dibujo por la derecha y por
   abajo. Se anulan los dos.

   ⚠ Y se le devuelve `position: static`: un sticker sin pie de foto también recibe `solo-media`,
   que pone el pie en ABSOLUTO sobre la imagen para no dejar una franja blanca bajo una foto. Sobre
   un sticker eso deja la hora flotando ENCIMA del dibujo, tapándolo — y un sticker es transparente
   y recortado, así que no hay fondo oscuro sobre el que la sombra del texto lo haga legible.
   Acá sí conviene la franja: el sticker no llena la burbuja, y debajo hay sitio de sobra. */
.wa-burbuja.sticker .wa-pie-burbuja {
  position: static;
  margin-right: 0;
  margin-bottom: 0;
}

/* El botón de acciones queda sobre el dibujo, así que necesita su propio fondo para verse. */
.wa-burbuja.sticker .wa-acciones {
  background: rgba(255, 255, 255, .85);
  border-radius: 50%;
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   Placeholder mientras carga un adjunto del hilo
   ═══════════════════════════════════════════════════════════════════════════════════════════
   Con `loading="lazy"` y el espacio ya reservado por `width`/`height`, la burbuja tiene el tamaño
   correcto pero está VACÍA hasta que llega el archivo. Ese hueco en blanco se lee como un error
   —sobre todo en la foto que uno acaba de mandar— así que se llena con el mismo brillo de la lista
   de conversaciones: dice «viene en camino» en vez de no decir nada.

   Vale para CUALQUIER tipo: la clase la pone el JS sobre el contenedor del adjunto —imagen, video,
   PDF, mapa— y la quita cuando el elemento avisa que cargó. */
.wa-cargando {
  position: relative;
  background: #e9edef;
}

.wa-cargando::after {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, #e9edef 25%, #f4f6f7 37%, #e9edef 63%);
  background-size: 400% 100%;
  animation: waBrillo 1.3s ease-in-out infinite;
  pointer-events: none;
  /* Encima del contenido pero debajo de los controles (hora, acciones, botón de reproducir), que
     se ven desde el principio y no dependen del archivo. */
  z-index: 1;
}

/* En una burbuja propia el gris del placeholder se pelea con el verde. Se usa un verde apagado. */
.wa-fila.propia .wa-cargando { background: #cdeec6; }
.wa-fila.propia .wa-cargando::after {
  background: linear-gradient(90deg, #cdeec6 25%, #ddf5d8 37%, #cdeec6 63%);
  background-size: 400% 100%;
}

@media (prefers-reduced-motion: reduce) {
  .wa-cargando::after { animation: none; }
}

/* Globito de estado sobre el avatar de la lista. Deja ver la columna sin abrir la conversación:
   antes había que entrar al hilo o irse al tablero para saber en cuál estaba. */
.wa-avatar { position: relative; }

.wa-avatar-estado {
  position: absolute;
  right: -2px;
  bottom: -2px;
  width: 18px;
  height: 18px;
  border-radius: 50%;
  /* El anillo blanco lo despega del avatar: sin él, un estado de color parecido al del avatar se
     confunde con un recorte de la propia foto. */
  border: 2px solid #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #fff;
  /* 12 px dentro de un globo de 18: el ícono ocupa casi todo el círculo. A 10 px se leía como una
     mancha —medido— y el globito perdía el sentido, que es reconocer la columna de un vistazo. */
  font-size: 12px;
  line-height: 1;
}

/* El avatar de la fila ACTIVA está sobre fondo gris, así que el anillo toma ese color o se ve un
   halo blanco suelto. */
.wa-conv.activa .wa-avatar-estado { border-color: #f0f2f5; }

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   Panel lateral de respuestas rápidas
   ═══════════════════════════════════════════════════════════════════════════════════════════ */
.wa-resp-panel { width: 420px; max-width: 92vw; }

.wa-resp-barra {
  display: flex;
  gap: 8px;
  align-items: center;
  padding: 10px 12px;
  border-bottom: 1px solid var(--wa-borde);
  flex: 0 0 auto;
}

.wa-resp-cats {
  display: flex;
  gap: 6px;
  padding: 8px 12px;
  overflow-x: auto;
  border-bottom: 1px solid var(--wa-borde);
  flex: 0 0 auto;
  /* Barra delgada, no oculta: con el scroll escondido no hay forma de llegar a las categorías de
     la derecha con un mouse. Es la misma lección de las pestañas de estado. */
  scrollbar-width: thin;
  scrollbar-color: #c7ced4 transparent;
}
.wa-resp-cats::-webkit-scrollbar { height: 6px; }
.wa-resp-cats::-webkit-scrollbar-thumb { background: #c7ced4; border-radius: 3px; }

.wa-resp-lista { flex: 1 1 auto; overflow-y: auto; padding: 8px 12px 16px; }

.wa-resp-item {
  border: 1px solid var(--wa-borde);
  border-radius: 8px;
  padding: 10px 12px;
  margin-bottom: 8px;
  cursor: pointer;
  transition: border-color .12s, box-shadow .12s;
}
.wa-resp-item:hover {
  border-color: var(--wa-verde);
  box-shadow: 0 2px 6px rgba(0, 0, 0, .07);
}

.wa-resp-item .tit {
  font-weight: 600;
  font-size: .88rem;
  color: #111b21;
  margin-bottom: 3px;
}

/* Tres líneas y corta. El cuerpo puede ser larguísimo —la captura de Mario tenía veinte líneas— y
   sin tope una sola respuesta ocupa el panel entero y esconde las demás. */
.wa-resp-item .cuerpo {
  font-size: .8rem;
  color: var(--wa-sec);
  white-space: pre-wrap;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* Con tres pestañas los rótulos ya no caben en una línea y la tercera se caía sola abajo,
   pisando el borde del encabezado. Se aprieta el relleno en vez de acortar los nombres: «Inv.»
   ahorra espacio y obliga a adivinar qué hay adentro. */
.wa-resp-panel .nav-tabs { flex-wrap: nowrap; }
.wa-resp-panel .nav-tabs .nav-item { flex: 1 1 0; min-width: 0; }
.wa-resp-panel .nav-tabs .nav-link {
  width: 100%; white-space: nowrap; text-align: center;
  padding-left: .35rem; padding-right: .35rem; font-size: .8rem;
}
.wa-resp-panel .nav-tabs .nav-link .ti { font-size: 15px; }
/* A 390 px el panel mide 359 y con el rótulo completo la tercera pestaña se caía a otra fila,
   pisando el borde del encabezado. Se reparte el ancho en tres partes iguales y el icono deja de
   llevar margen: acortar los nombres a «Inv.» ahorraría lo mismo y obligaría a adivinar. */
@media (max-width: 480px) {
  .wa-resp-panel .nav-tabs .nav-link { font-size: .74rem; padding-left: .2rem; padding-right: .2rem; }
  .wa-resp-panel .nav-tabs .nav-link .ti { margin-right: .15rem !important; font-size: 14px; }
}

/* Fila del inventario: miniatura a la izquierda y los datos al lado. Reusa `.wa-resp-item` para
   que las tres pestañas del panel se vean iguales; lo único propio es la foto. */
.wa-inv-item { display: flex; gap: 10px; align-items: flex-start; }
.wa-inv-item .datos { min-width: 0; flex: 1; }
.wa-inv-item .mini {
  width: 46px; height: 46px; min-width: 46px; border-radius: 6px;
  object-fit: cover; background: var(--wa-barra);
}
.wa-inv-item .mini.vacia {
  display: flex; align-items: center; justify-content: center;
  color: var(--wa-sec); font-size: 19px;
}

.wa-resp-item .pie {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-top: 6px;
}

/* Editar y borrar aparecen al apuntar la tarjeta: siempre visibles compiten con el texto, que es
   lo que uno viene a leer. En táctil se quedan visibles, porque ahí no hay `:hover`. */
.wa-resp-item .acciones { margin-left: auto; display: flex; gap: 4px; opacity: 0; transition: opacity .12s; }
.wa-resp-item:hover .acciones { opacity: 1; }
@media (hover: none) { .wa-resp-item .acciones { opacity: .6; } }

.wa-resp-item .acciones button {
  border: 0; background: transparent; color: var(--wa-sec);
  padding: 2px 4px; border-radius: 4px; line-height: 1;
}
.wa-resp-item .acciones button:hover { background: var(--wa-barra); color: #111b21; }

.wa-resp-cat-chip {
  display: inline-flex; align-items: center; gap: 5px; flex: 0 0 auto;
  padding: 4px 10px; border: 1px solid var(--wa-borde); border-radius: 999px;
  background: transparent; color: var(--wa-sec); font-size: .76rem; white-space: nowrap;
  cursor: pointer;
}
.wa-resp-cat-chip.activo { background: #e7f7ef; border-color: transparent; color: var(--wa-verde); font-weight: 500; }

.wa-resp-form {
  border-top: 1px solid var(--wa-borde);
  padding: 12px;
  background: var(--wa-barra);
  flex: 0 0 auto;
}

/* ⚠ El tema aplica `backdrop-filter: blur(2px)` a `.swal2-backdrop-show`, y SweetAlert2 le pone esa
   clase al contenedor de los toasts SIEMPRE: la opción `backdrop: false` la ignora —avisa por
   consola que es incompatible con toasts—, así que el arreglo tiene que ser por CSS. Un toast de
   dos segundos desenfocaba
   la pantalla entera detrás. Un aviso no puede bloquear visualmente lo que uno está mirando.
   Se ataca por la clase propia del contenedor (`customClass.container`) y no con `:has()`, que
   dependería del soporte del navegador. Las confirmaciones SÍ conservan su fondo: ahí el bloqueo es
   intencional, porque hay que decidir algo. */
.swal2-container.wa-toast-cont {
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
  background: transparent !important;
  /* Sin esto el contenedor sigue cubriendo la pantalla y se come los clics de abajo mientras dura
     el aviso: se toca una conversación y no pasa nada. */
  pointer-events: none;
}
.swal2-container.wa-toast-cont .swal2-toast { pointer-events: auto; }

/* Aviso de conversación borrada. Rojo apagado y no el amarillo del aviso de la ventana de 24 h:
   son dos cosas distintas y pueden aparecer juntas, así que tienen que distinguirse de un vistazo. */
.wa-aviso-borrada {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 4px;
  flex-wrap: wrap;
  background: #fdecec;
  color: #a33a3a;
}

/* En solo lectura el compositor no se esconde con `d-none` desde el JS sino con esta clase en el
   contenedor: así una sola regla apaga todo lo que escribe —campo, adjuntar, emojis, micrófono— y
   no hay que acordarse de cada botón por separado. */
.wa-app.solo-lectura .wa-pie { display: none !important; }

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   Miniaturas más chicas en el teléfono
   ═══════════════════════════════════════════════════════════════════════════════════════════
   Medido a 390x844 antes de tocar nada: una foto ocupaba 294x368, o sea el 44 % del alto de la
   pantalla. Con dos fotos seguidas no queda nada del hilo a la vista y hay que desplazar mucho
   para leer una conversación.

   Acá la foto es una MINIATURA para reconocerla, no para mirarla: tocarla ya abre el visor a
   pantalla completa, que es donde se ve de verdad. Por eso se puede recortar sin perder nada.

   ⚠ Solo en teléfonos. En escritorio hay ancho de sobra y achicarlas ahí sería empeorar algo que
   nadie se quejó de que estuviera mal. */
@media (max-width: 575.98px) {
  /* El selector repite `.wa-burbuja.con-media` porque esa regla es más específica que `.wa-imagen`
     a secas y si no, gana ella y esto no hace nada. */
  .wa-imagen,
  .wa-galeria,
  .wa-video-envoltura,
  .wa-burbuja.con-media .wa-imagen,
  .wa-burbuja.con-media .wa-galeria,
  .wa-burbuja.con-media .wa-video-envoltura { width: 160px; }

  /* Techo de alto. Con el recorte 4/5 una foto vertical queda en 200 px; este máximo atrapa las
     que el recorte no domó. De 368 px a 200: casi la mitad, que es lo que se pidió. */
  .wa-imagen img { max-height: 200px; }

  /* La leyenda «ver completa» se achica con la foto, o tapa medio dibujo. */
  .wa-imagen .expandir { font-size: 9.5px; padding: 2px 6px; }
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   Etiquetas de contactos
   ═══════════════════════════════════════════════════════════════════════════════════════════ */

.wa-etiq-chip {
  display: inline-flex;
  align-items: center;
  padding: 2px 9px;
  border-radius: 999px;
  color: #fff;
  font-size: .7rem;
  font-weight: 500;
  line-height: 1.5;
  /* El catálogo admite cualquier color y algunos son claros; la sombra del texto lo mantiene
     legible sin tener que calcular contraste por etiqueta. */
  text-shadow: 0 1px 2px rgba(0, 0, 0, .35);
}

/* ── Lista del panel ─────────────────────────────────────────────────────────────────────── */
.wa-etiq-item {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 10px;
  border: 1px solid var(--wa-borde);
  border-radius: 8px;
  margin-bottom: 6px;
  cursor: pointer;
}
.wa-etiq-item:hover { background: var(--wa-barra); }
.wa-etiq-item.marcada { border-color: var(--wa-verde); background: #f2fbf7; }

.wa-etiq-item .punto { width: 12px; height: 12px; border-radius: 50%; flex: 0 0 auto; }
.wa-etiq-item .nom { flex: 1 1 auto; font-size: .85rem; min-width: 0; }

.wa-etiq-item .acciones { display: flex; gap: 4px; opacity: 0; transition: opacity .12s; }
.wa-etiq-item:hover .acciones { opacity: 1; }
@media (hover: none) { .wa-etiq-item .acciones { opacity: .6; } }
.wa-etiq-item .acciones button {
  border: 0; background: transparent; color: var(--wa-sec); padding: 2px 4px; border-radius: 4px;
}
.wa-etiq-item .acciones button:hover { background: #fff; color: #111b21; }

/* Etiquetas en la fila de la bandeja: una línea propia, solo si el contacto tiene alguna. */
.wa-conv-etiquetas { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 3px; }
.wa-conv-etiquetas .wa-etiq-chip { font-size: .62rem; padding: 1px 7px; }

/* ⚠ Las pestañas del panel se hacen columna flexible desde ACÁ y no con la clase `d-flex` del
   tema. `d-flex` es `display:flex !important` y le gana al `display:none` con el que Bootstrap
   esconde las pestañas inactivas: la de Respuestas quedaba invisible por opacidad —`.fade` sin
   `.show`— pero SEGUÍA OCUPANDO SU ALTO. Medido: 448 px de hueco encima de la pestaña de
   Etiquetas. Al limitar la regla a `.active`, la inactiva vuelve a esconderse de verdad.
   `min-height:0` para que la lista de adentro pueda desplazarse en vez de estirar el panel. */
.wa-resp-panel .tab-content > .tab-pane.active {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  min-height: 0;
}

/* ── Filtro por etiqueta en la cabecera de la bandeja ─────────────────────────────────────────── */
.wa-icono { position: relative; }

/* Contador de etiquetas puestas. Sin él, con el filtro activo faltan chats y no se ve por qué. */
.wa-filtro-n {
  position: absolute;
  top: -3px; right: -3px;
  min-width: 15px; height: 15px;
  padding: 0 3px;
  border-radius: 999px;
  background: var(--wa-verde);
  color: #fff;
  font-size: 9.5px;
  font-weight: 600;
  line-height: 15px;
  text-align: center;
}
.wa-icono.filtrando { color: var(--wa-verde); }

.wa-filtro-etiq { min-width: 230px; max-height: 340px; overflow-y: auto; padding: 6px; }

.wa-filtro-etiq .item {
  display: flex; align-items: center; gap: 8px;
  padding: 6px 8px; border-radius: 6px; cursor: pointer; font-size: .82rem;
}
.wa-filtro-etiq .item:hover { background: var(--wa-barra); }
.wa-filtro-etiq .punto { width: 11px; height: 11px; border-radius: 50%; flex: 0 0 auto; }
.wa-filtro-etiq .nom { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }

/* ── Asistente automático ─────────────────────────────────────────────────────────────────────
   Lo que escribió el bot lleva su propia firma, distinta de la de una persona. No se disimula a
   propósito: quien tome la conversación tiene que saber de un vistazo qué se contestó solo.
   ⚠ Al desinstalar el módulo estas dos reglas se pueden borrar; los mensajes viejos quedan y por
   eso conviene NO quitar la columna `origen`. */
.wa-autor-bot{ color:#6658dd; font-weight:600; }
.wa-autor-bot .ti{ font-size:13px; }

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   Quién tiene tomada la conversación, sobre el avatar de la lista
   ═══════════════════════════════════════════════════════════════════════════════════════════
   La foto de perfil del agente —o sus iniciales si no subió ninguna— en la esquina de ARRIBA del
   avatar del contacto. La de abajo ya la ocupa el globito del estado; arriba queda del lado del
   nombre, que es donde cae la vista al recorrer la lista.

   20 px y no 18 como el globito del estado: acá hay que reconocer una CARA o dos letras, no un
   ícono de una sola forma. Por debajo de 20 las iniciales dejan de leerse —medido—. */
.wa-avatar-agente {
  position: absolute;
  right: -2px;
  top: -2px;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  overflow: hidden;
  /* Mismo anillo blanco que el globito del estado: sin él, una foto de fondo claro se confunde
     con un recorte del propio avatar. */
  border: 2px solid #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #fff;
  font-size: 9px;
  font-weight: 600;
  line-height: 1;
  letter-spacing: -.2px;
}

/* La foto va ENCIMA de las iniciales, tapándolas. Si la ruta quedó rota el `onerror` la quita y
   las iniciales aparecen solas, sin ícono de imagen rota y sin un hueco. */
.wa-avatar-agente img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.wa-avatar-agente .wa-agente-ini { pointer-events: none; }

/* Igual que el globito del estado: sobre la fila activa el anillo toma el gris del fondo, o queda
   un halo blanco suelto. */
.wa-conv.activa .wa-avatar-agente { border-color: #f0f2f5; }

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   Plantillas de mensaje — la pantalla de creación
   ═══════════════════════════════════════════════════════════════════════════════════════════
   Mismo reparto que el editor de Meta, que es lo que pidió Mario: formulario a la izquierda y el
   teléfono a la derecha, actualizándose mientras se escribe. */

/* Las categorías, como tarjetas y no como un desplegable: la diferencia entre Utilidad y
   Marketing es de plata y de qué tan duro revisa Meta, así que la explicación tiene que estar a
   la vista en el momento de elegir, no escondida en una opción. */
.wa-plt .plt-cat {
  display: block;
  border: 1px solid var(--ins-border-color, #e9edef);
  border-radius: var(--bs-border-radius, .375rem);
  padding: 10px 12px;
  cursor: pointer;
  height: 100%;
  transition: border-color .12s, background .12s;
}
.wa-plt .plt-cat:hover { background: var(--ins-tertiary-bg, #f6f7fb); }
.wa-plt .plt-cat.activa {
  border-color: var(--bs-primary, #6c5ffc);
  background: var(--bs-primary-bg-subtle, #f0eeff);
}
.wa-plt .plt-cat input { display: none; }
.wa-plt .plt-cat-t { display: block; font-weight: 600; margin-bottom: 2px; }
.wa-plt .plt-cat-d { display: block; font-size: .78rem; color: var(--bs-secondary-color, #6c757d); }

/* ── El teléfono ────────────────────────────────────────────────────────────────────────────
   `sticky`: el formulario es largo y sin esto, al llegar a los botones, ya no se ve el mensaje
   que se está escribiendo — que es justo cuando uno quiere mirar la vista previa. */
.wa-plt .plt-previa-caja { position: sticky; top: 86px; }

.wa-plt .plt-telefono {
  border: 8px solid #2f3b43;
  border-radius: 26px;
  overflow: hidden;
  box-shadow: 0 8px 28px rgba(11, 20, 26, .18);
  max-width: 340px;
}
.wa-plt .plt-telefono-barra {
  display: flex; align-items: center; gap: 8px;
  background: #005e54; color: #fff; padding: 8px 10px;
}
.wa-plt .plt-telefono-barra .ti { font-size: 1.05rem; opacity: .9; }
.wa-plt .plt-avatar {
  width: 30px; height: 30px; border-radius: 50%;
  background: rgba(255,255,255,.25);
  display: flex; align-items: center; justify-content: center;
  font-size: .72rem; font-weight: 600;
}
.wa-plt .plt-telefono-nombre { font-size: .85rem; font-weight: 600; line-height: 1.1; }
.wa-plt .plt-telefono-estado { font-size: .68rem; opacity: .8; }

/* ⚠ El mismo papel tapiz y el mismo fondo del hilo real, para que la vista previa no sea una
   aproximación sino lo que de verdad se va a ver. */
.wa-plt .plt-telefono-chat {
  background-color: var(--wa-fondo);
  background-image: url("../images/whatsapp-fondo.svg");
  background-size: 300px 300px;
  padding: 14px 10px;
  min-height: 260px;
}

/* La burbuja la pone `.wa-burbuja`, compartida con el hilo. Acá solo lo propio de la plantilla. */
.wa-plt .plt-previa-enc { font-weight: 600; margin-bottom: 4px; }
.wa-plt .plt-previa-cuerpo { white-space: pre-wrap; }
.wa-plt .plt-previa-pie {
  font-size: .74rem; color: var(--bs-secondary-color, #8696a0); margin-top: 5px;
}
.wa-plt .plt-previa-vacio { color: #8696a0; font-style: italic; }
.wa-plt .plt-previa-media {
  background: rgba(11,20,26,.06); border-radius: 5px;
  height: 96px; display: flex; align-items: center; justify-content: center;
  margin-bottom: 5px;
}
.wa-plt .plt-previa-media .ti { font-size: 2rem; color: #8696a0; }

/* Los botones van FUERA de la burbuja y a todo el ancho, que es como los pinta WhatsApp. */
.wa-plt .plt-previa-botones { display: flex; flex-direction: column; gap: 2px; margin-top: 2px; }
.wa-plt .plt-previa-boton {
  background: #fff; border-radius: 7.5px; text-align: center;
  padding: 8px; color: #00a5f4; font-size: .84rem;
  box-shadow: 0 1px .5px rgba(11,20,26,.13);
}

/* La variable sin ejemplo se marca; con ejemplo se pinta el valor, para poder juzgar la frase. */
.wa-plt .plt-var {
  background: #ffe8cc; color: #d9480f; border-radius: 3px; padding: 0 3px; font-size: .82em;
}
.wa-plt .plt-var-ok { background: #d3f9d8; border-radius: 3px; padding: 0 3px; }

.wa-plt .plt-json {
  background: var(--ins-tertiary-bg, #f6f7fb);
  border: 1px solid var(--ins-border-color, #e9edef);
  border-radius: var(--bs-border-radius, .375rem);
  padding: 10px; font-size: .72rem; max-height: 300px; overflow: auto; margin: 0;
}

/* En pantalla angosta el teléfono deja de estar pegado —no hay dos columnas que seguir— y se
   centra, o queda pegado al borde izquierdo con todo el blanco a la derecha. */
@media (max-width: 1199.98px) {
  .wa-plt .plt-previa-caja { position: static; }
  .wa-plt .plt-telefono { margin: 0 auto; }
}

/* El ícono gira mientras se le pregunta a Meta. Sin señal, el botón parece no haber respondido y
   la gente lo aprieta tres veces — tres llamadas para el mismo dato. */
.wa-plt .plt-girando { animation: plt-giro .8s linear infinite; display: inline-block; }
@keyframes plt-giro { to { transform: rotate(360deg); } }

/* La hora de la última consulta, debajo del botón: es lo que dice si el estado que se está
   mirando es de ahora o de cuando se abrió la pantalla. */
.wa-plt .plt-visto { line-height: 1; margin-top: 2px; }


/* ── Reacciones ─────────────────────────────────────────────────────────────────────────────
   La píldora cuelga del borde inferior de la burbuja y lo pisa un poco, como en WhatsApp: así se
   lee como algo pegado a ESE mensaje y no como una línea suelta del hilo, que es justo lo que
   pasaba cuando una reacción se guardaba como mensaje aparte.

   La burbuja necesita `position: relative` —ya lo tiene, de la palomita de acciones— y un poco de
   margen abajo, o la píldora se montaría sobre el mensaje siguiente. */
.wa-reaccion {
  position: absolute;

  /* Esquina inferior IZQUIERDA, a caballo del borde. Propuesta de Mario, y es la correcta: en el
     centro la píldora queda flotando sin anclaje, y colgada de la esquina se lee como parte de ESE
     mensaje. Es además lo que hace WhatsApp.
     ⚠ Se había puesto en el centro por creer que la esquina chocaba con el pico de la burbuja. No
     lo hace: acá el pico no es un pseudo-elemento sino la esquina SUPERIOR sin redondear
     (`border-top-left-radius: 0` en las ajenas, `top-right` en las propias). Abajo a la izquierda
     está libre en los dos casos. */
  /* AL RAS del borde, sin sobresalir: así lo hace WhatsApp — la píldora se alinea con el lado de
     la burbuja, no cuelga por fuera. Cualquier valor negativo la hacía verse desprendida. */
  left: 0;

  /* ⚠ 7 px de vuelo y no más: entre filas hay 8 px de separación, así que sobresalir más monta la
     píldora sobre el mensaje de abajo. Agrandar ese hueco sería empujar el hilo, y la reacción no
     tiene por qué mover nada. */
  bottom: -7px;
  z-index: 3;

  display: inline-flex;
  align-items: center;
  gap: 2px;
  /* Compacta a propósito: cuanto más baja, menos tiene que sobresalir para leerse a caballo del
     borde, y más lejos queda de chocar con el mensaje siguiente. */
  padding: 0 6px;
  border-radius: 999px;

  /* Fondo propio y borde del color del hilo: sobre una foto, sin fondo, los emojis se pierden. */
  background: var(--wa-burbuja, #fff);
  border: 1px solid rgba(0, 0, 0, .08);
  box-shadow: 0 1px 2px rgba(0, 0, 0, .12);

  font-size: 12px;
  line-height: 1.25;
  white-space: nowrap;
}

/* ⚠ En las PROPIAS va del otro lado. Así lo hace WhatsApp: la reacción cuelga del lado EXTERIOR
   de cada burbuja —izquierda en las del cliente, derecha en las nuestras—, siguiendo el lado por
   el que la burbuja está alineada. Lo señaló Mario mostrando la app real.
   Y de paso resuelve el conflicto con la firma: el rótulo del autor vive abajo a la IZQUIERDA,
   así que en las propias la píldora ya no lo roza y no hace falta ningún ajuste aparte. */
/* En las propias, al ras del borde derecho por lo mismo. La hora y la palomita están en esa
   esquina pero DENTRO del pie: la píldora pasa por debajo, no hace falta sacarla. */
.wa-fila.propia .wa-reaccion { left: auto; right: 0; }

/* ⚠ La píldora NO reserva espacio: al ser absoluta no empuja el contenido de la burbuja, y el
   hueco extra que hubo un rato —`margin-bottom` en la burbuja con reacción— agrandaba el mensaje y
   movía el hilo, que es justo lo que no tiene que hacer.

   ⚠ Y NO va aquí ninguna regla de lado para las propias. La había —`.wa-msg.mio`— y `.wa-msg` no
   existe: la clase de la fila es `.wa-fila.propia`, así que nunca aplicó. Es lo que dejaba la
   píldora encima de lo que ya había en esa esquina. */

/* ══ Selección múltiple de conversaciones ═══════════════════════════════════════════════════
   ⚠ Una ventanita FLOTANTE y no una barra dentro de la lista (pedido de Mario el 2026-09-09):
   dentro de la lista, cada acción nueva le comía alto a los chats. Flotando, la lista no pierde
   nada y el panel puede crecer.

   Cuelga del buscador, alineada a la derecha —donde está el botón de tres puntos que la abre— y
   posicionada contra `.wa-lista`, que por eso es `relative`. */
.wa-lista{ position:relative; }
.wa-sel-panel{ position:absolute; z-index:1050; right:8px;
               width:262px; max-width:calc(100% - 16px);
               background:#fff; border-radius:10px; padding:6px;
               box-shadow:0 6px 22px rgba(11,20,26,.22); }
.wa-sel-cab{ display:flex; align-items:center; gap:6px; padding:4px 4px 4px 10px;
             border-bottom:1px solid var(--wa-borde); margin-bottom:4px; }
.wa-sel-n{ flex:1; min-width:0; font-size:13.5px; font-weight:600; color:#111b21; }
.wa-sel-cab .wa-icono{ width:30px; height:30px; font-size:17px; }
/* Los botones de `.wa-sel-ops` heredan del menú de la palomita (arriba, en la regla compartida):
   acá solo va lo que los distingue. */
.wa-sel-ops button[disabled]{ opacity:.45; cursor:not-allowed; }
.wa-sel-todas{ display:block; width:100%; border:0; background:none; text-align:left;
               padding:8px 11px 6px; font-size:12.5px; color:var(--wa-verde); cursor:pointer;
               border-top:1px solid var(--wa-borde); margin-top:4px; }
.wa-sel-todas:hover{ text-decoration:underline; }

/* La casilla de cada fila. ⚠ No es un `<input>`: el clic lo maneja la fila entera (ver
   `seleccion.js`), y un input de verdad hacía que cada toque contara dos veces. */
.wa-sel-caja{ width:22px; height:22px; min-width:22px; border-radius:50%; border:2px solid #c4ccd1;
              display:flex; align-items:center; justify-content:center;
              color:#fff; font-size:14px; align-self:center; }
.wa-sel-caja.marcada{ background:var(--wa-verde); border-color:var(--wa-verde); }
.wa-conv.marcada{ background:#eaf7f0; }
.wa-conv.marcada:hover{ background:#e2f3ea; }

/* Lista de etiquetas dentro de la modal de etiquetar en grupo. Con tope de alto: un catálogo
   largo empujaría los botones de la modal fuera de la pantalla del teléfono. */
.wa-sel-etiqs{ max-height:45vh; overflow-y:auto; }
.wa-etiq-punto{ width:12px; height:12px; border-radius:50%; flex:0 0 auto; display:inline-block; }

/* Mientras se selecciona: la palomita de cada fila se va —son acciones de UNA conversación— y los
   chips de estado quedan a la vista pero apagados, porque cambiar de columna cambiaría el
   conjunto que se está marcando. */
.wa-lista.seleccionando .wa-conv-mas{ display:none; }
/* ⚠ Los chips de estado y la cabecera entera —buscador, filtro de etiquetas y menú de tres
   puntos— quedan a la vista pero APAGADOS mientras dura la selección. Los tres cambian la lista
   debajo de lo que uno está marcando, así que no pueden usarse; y apagados en vez de escondidos
   —que fue como estuvieron un rato— porque esconderlos hacía saltar la lista al entrar y al salir
   del modo, y dejaba la pantalla sin el contexto de en qué columna se está. Decisión de Mario.
   Se sale con la ✕ del panel o con Escape. */
.wa-lista.seleccionando .wa-estados,
.wa-lista.seleccionando .wa-lista-head{ opacity:.45; pointer-events:none; }

/* ══ Responder citando un mensaje ═══════════════════════════════════════════════════════════
   La cita dentro de la burbuja, con la barra de color a la izquierda como en WhatsApp: el
   mensaje citado se reconoce de un vistazo sin leerlo. */
.wa-cita{ display:block; border-left:4px solid var(--wa-verde); border-radius:6px;
          background:rgba(0,0,0,.05); padding:5px 9px; margin-bottom:5px; cursor:pointer;
          max-width:100%; overflow:hidden; }
.wa-cita:hover{ background:rgba(0,0,0,.08); }
.wa-cita.propia{ border-left-color:#53bdeb; }
/* Sin destino al que ir: no es tocable y se dice con el cursor. */
.wa-cita.perdida{ border-left-color:var(--wa-sec); cursor:default; font-style:italic; }
.wa-cita-autor{ display:block; font-size:12.5px; font-weight:600; color:var(--wa-verde);
                line-height:1.3; }
.wa-cita.propia .wa-cita-autor{ color:#0e8ecf; }
.wa-cita.perdida .wa-cita-autor{ color:var(--wa-sec); }
/* Una sola línea: la cita es una referencia, no una segunda lectura del mensaje. */
.wa-cita-texto{ display:block; font-size:13px; color:var(--wa-sec); line-height:1.35;
                white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }

/* Barra «estás respondiendo a…», arriba del compositor. */
.wa-citando{ display:flex; align-items:center; gap:8px; padding:8px 12px;
             background:var(--wa-barra); border-top:1px solid var(--wa-borde); }
.wa-citando-cuerpo{ flex:1; min-width:0; border-left:4px solid var(--wa-verde);
                    padding-left:9px; }
.wa-citando-autor{ display:block; font-size:12.5px; font-weight:600; color:var(--wa-verde); }
.wa-citando-texto{ display:block; font-size:13px; color:var(--wa-sec);
                   white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }

/* El destello al saltar al mensaje citado. En un hilo largo, sin él uno llega y no sabe cuál de
   las burbujas era. */
.wa-fila.destacada .wa-burbuja{ animation:waDestello 1.6s ease-out; }
@keyframes waDestello{
  0%   { box-shadow:0 0 0 3px rgba(37,211,102,.55); }
  100% { box-shadow:0 0 0 3px rgba(37,211,102,0); }
}

/* El filtro de departamento del tablero.
   ⚠ Con `max-width` y no con `w-auto`: un `.form-select` es `display: block` y, como hijo de un
   contenedor flex, `width: auto` termina significando «llená lo que haya» —medido, 500 px—.
   Mismo tope y misma razón que `.tk-filtro` en el tablero de tickets. */
.wa-filtro { max-width: 240px; }


/* ══════════════════════════════════════════════════════════════════════════════════════════
   LAS BARRAS DE SCROLL DEL CHAT — delgadas
   ------------------------------------------------------------------------------------------
   Pedido de Mario (2026-09-12). Las verticales eran las del navegador: 15 px en Chrome sobre
   Windows, que al lado de las horizontales de acá —6 px desde las pestañas de estado— se veían
   como de otra pantalla.

   Van agrupadas y no pegadas a cada bloque a propósito: son SIETE contenedores con scroll
   —lista de conversaciones, mensajes, buscador del chat, emojis, respuestas rápidas y los dos
   selectores de etiquetas— y repetir la declaración en cada uno es la forma segura de que el
   octavo nazca con la barra gorda.

   Mismos valores que las horizontales que ya existían (`#c7ced4` sobre transparente), para que
   todas las barras de la pantalla se vean iguales; 6 px acá también, que es el ancho a partir
   del cual la barra sigue siendo agarrable con el mouse.
   ══════════════════════════════════════════════════════════════════════════════════════════ */
.wa-convs,
.wa-mensajes,
.wa-buscador-cuerpo,
.wa-emojis .cuerpo,
.wa-resp-lista,
.wa-filtro-etiq,
.wa-sel-etiqs {
  scrollbar-width: thin;                        /* Firefox */
  scrollbar-color: #c7ced4 transparent;
}

.wa-convs::-webkit-scrollbar,
.wa-mensajes::-webkit-scrollbar,
.wa-buscador-cuerpo::-webkit-scrollbar,
.wa-emojis .cuerpo::-webkit-scrollbar,
.wa-resp-lista::-webkit-scrollbar,
.wa-filtro-etiq::-webkit-scrollbar,
.wa-sel-etiqs::-webkit-scrollbar {
  width: 6px;
}

.wa-convs::-webkit-scrollbar-track,
.wa-mensajes::-webkit-scrollbar-track,
.wa-buscador-cuerpo::-webkit-scrollbar-track,
.wa-emojis .cuerpo::-webkit-scrollbar-track,
.wa-resp-lista::-webkit-scrollbar-track,
.wa-filtro-etiq::-webkit-scrollbar-track,
.wa-sel-etiqs::-webkit-scrollbar-track {
  background: transparent;
}

.wa-convs::-webkit-scrollbar-thumb,
.wa-mensajes::-webkit-scrollbar-thumb,
.wa-buscador-cuerpo::-webkit-scrollbar-thumb,
.wa-emojis .cuerpo::-webkit-scrollbar-thumb,
.wa-resp-lista::-webkit-scrollbar-thumb,
.wa-filtro-etiq::-webkit-scrollbar-thumb,
.wa-sel-etiqs::-webkit-scrollbar-thumb {
  background: #c7ced4;
  border-radius: 3px;
}

.wa-convs::-webkit-scrollbar-thumb:hover,
.wa-mensajes::-webkit-scrollbar-thumb:hover,
.wa-buscador-cuerpo::-webkit-scrollbar-thumb:hover,
.wa-emojis .cuerpo::-webkit-scrollbar-thumb:hover,
.wa-resp-lista::-webkit-scrollbar-thumb:hover,
.wa-filtro-etiq::-webkit-scrollbar-thumb:hover,
.wa-sel-etiqs::-webkit-scrollbar-thumb:hover {
  background: #aab4bd;
}
