/* ============================================================
   style.css — Estilos compartidos de ÉLIX (v2: HUD + tema claro/oscuro)
   - TODOS los colores viven como variables en :root (tema oscuro AMOLED por defecto
     y tema claro en :root[data-tema="claro"])
   - TODAS las tipografías vienen de Google Fonts (se cargan con <link> en el <head>
     de cada página) y son variables en :root
   - TODOS los iconos son Material Symbols (fonts.google.com/icons)
   ============================================================ */

:root {
  color-scheme: dark; /* controles nativos (scroll, inputs) acordes al tema */

  /* ---- Tipografías (Google Fonts) ---- */
  --fuente-logo: 'Turret Road', 'Oxanium', sans-serif;   /* marca ÉLIX */
  --fuente-titulo: 'Oxanium', sans-serif;                /* títulos y botones (estilo HUD) */
  --fuente-texto: 'Space Grotesk', sans-serif;           /* texto general y chat */
  --fuente-mono: 'JetBrains Mono', monospace;            /* códigos de 6 dígitos y link */
  --fuente-hud: 'Share Tech Mono', monospace;            /* relojes y lecturas tipo HUD */
  --fuente-codigo: 'Cutive Mono', monospace;             /* texto en formato "código" de los mensajes y descripciones */
  --fuente-iconos: 'Material Symbols Rounded';

  /* ---- Paleta base, tema oscuro AMOLED (negro + morado de ÉLIX) ---- */
  --color-fondo: #000000;
  --color-fondo-2: #14001F;
  --color-tarjeta: #0B0B10;
  --color-tarjeta-2: #15151C;
  --color-morado: #B83DBA;
  --color-morado-claro: #CF5AD1;
  --color-morado-medio: #AF39B1;
  --color-morado-oscuro: #651866;
  --color-acento: #9200D1;
  --color-texto: #E6E6EA;
  --color-texto-suave: #9A9AA6;
  --color-gris: #2B2B36;
  --color-gris-claro: #666672;
  --color-blanco: #FFFFFF;
  --color-negro: #000000;

  /* ---- Colores de estado (definidos por el proyecto) ---- */
  --color-success: #22c55e;
  --color-warning: #facc15;
  --color-error: #ef4444;
  --color-info: #3b82f6;
  /* Versión para TEXTO (en el tema claro se oscurecen para tener contraste) */
  --color-success-texto: var(--color-success);
  --color-warning-texto: var(--color-warning);
  --color-error-texto: var(--color-error);
  --color-info-texto: var(--color-info);
  /* Tintes de fondo para avisos e insignias */
  --color-success-suave: color-mix(in srgb, var(--color-success) 14%, transparent);
  --color-warning-suave: color-mix(in srgb, var(--color-warning) 14%, transparent);
  --color-error-suave: color-mix(in srgb, var(--color-error) 14%, transparent);
  --color-info-suave: color-mix(in srgb, var(--color-info) 14%, transparent);

  /* ---- Colores extra para avatares por defecto (iniciales) ---- */
  --color-azul: #3D7BBA;
  --color-turquesa: #3DBAA8;
  --color-naranja: #BA7A3D;
  /* Paleta de colores de texto de las descripciones (rojo/verde/amarillo/azul usan los colores de estado de arriba) */
  --color-rosa-texto: #F472B6;
  --color-cian-texto: #22D3EE;
  --color-naranja-texto: #FB923C;
  --avatar-1: var(--color-morado);
  --avatar-2: var(--color-azul);
  --avatar-3: var(--color-turquesa);
  --avatar-4: var(--color-naranja);
  --avatar-5: var(--color-morado-oscuro);
  --avatar-6: var(--color-acento);

  /* ---- QR: módulos oscuros sobre fondo claro (en ambos temas, para que se pueda escanear) ---- */
  --color-qr-oscuro: #0D0D0D;
  --color-qr-claro: #FFFFFF;

  /* ---- Transparencias y efectos HUD ---- */
  --color-velo: color-mix(in srgb, var(--color-negro) 65%, transparent);
  --color-velo-suave: color-mix(in srgb, var(--color-negro) 25%, transparent);
  --color-morado-suave: color-mix(in srgb, var(--color-morado) 15%, transparent);
  --color-morado-borde: color-mix(in srgb, var(--color-morado) 45%, transparent);
  --color-cuadricula: color-mix(in srgb, var(--color-morado) 8%, transparent);
  --color-halo: color-mix(in srgb, var(--color-acento) 30%, transparent);
  --sombra-morado: 0 0 22px color-mix(in srgb, var(--color-morado) 38%, transparent);
  --sombra-tarjeta: 0 6px 22px color-mix(in srgb, var(--color-negro) 55%, transparent);

  /* ---- Degradados ---- */
  --gradiente-principal: linear-gradient(135deg, var(--color-morado), var(--color-morado-oscuro));
  --gradiente-fondo: linear-gradient(160deg, var(--color-fondo), var(--color-fondo-2));
  /* Logo: brillo blanco que barre una sola vez al cargar la bienvenida */
  --gradiente-logo: linear-gradient(100deg, var(--color-morado-claro) 0%, var(--color-acento) 42%, var(--color-blanco) 50%, var(--color-acento) 58%, var(--color-morado-claro) 100%);

  /* ---- Radios (esquinas más rectas, estilo HUD) ---- */
  --radio-sm: 4px;
  --radio-md: 8px;
  --radio-lg: 12px;

  /* ---- Movimiento: duraciones y curvas usadas por TODAS las animaciones ---- */
  --mov-rapido: 150ms;                                   /* micro-interacciones (hover, pulsación) */
  --mov-medio: 260ms;                                    /* aperturas, entradas, cambios de estado */
  --mov-lento: 480ms;                                    /* momentos destacados (llenado, destello) */
  --ease-salida: cubic-bezier(0.16, 1, 0.3, 1);          /* arranca rápido y frena suave (entradas) */
  --ease-entrada: cubic-bezier(0.7, 0, 0.84, 0);         /* acelera al final (salidas) */
  --ease-suave: cubic-bezier(0.4, 0, 0.2, 1);            /* transiciones de color/borde */
  --ease-rebote: cubic-bezier(0.34, 1.56, 0.64, 1);      /* pequeño rebote (pop, selección) */
  --color-prueba-emoji: #FF00FF;                          /* solo para detectar qué emojis dibuja el dispositivo (no se ve) */
  --ancho-contenedor: 520px;                            /* ancho de las pantallas (crece en tablets y escritorio) */
  --sombra-morado-fuerte: 0 0 30px color-mix(in srgb, var(--color-morado) 55%, transparent);

  /* ---- v1.5.0: errores de formulario y advertencias (rojo) + resaltado de la búsqueda en el chat (amarillo) ---- */
  --color-error-borde: color-mix(in srgb, var(--color-error) 55%, transparent);            /* contorno tenue rojo */
  --color-error-fondo: color-mix(in srgb, var(--color-error) 9%, var(--color-tarjeta));   /* fondo de la ventana de advertencia */
  --color-velo-error: color-mix(in srgb, var(--color-error) 20%, transparent);            /* tinte rojo detrás de la advertencia */
  --sombra-error: 0 0 26px color-mix(in srgb, var(--color-error) 38%, transparent);
  --sombra-error-fuerte: 0 0 40px color-mix(in srgb, var(--color-error) 60%, transparent);
  --color-resaltado: color-mix(in srgb, var(--color-warning) 42%, transparent);           /* coincidencias de la búsqueda */
  --color-resaltado-activo: var(--color-warning);                                         /* la coincidencia seleccionada */

  /* ---- v1.8.0: recortador de imágenes y reproductor de video ---- */
  --color-recorte-borde: var(--color-morado-claro);                                       /* borde y asideros del recuadro de recorte */
  --color-recorte-guia: color-mix(in srgb, var(--color-blanco) 38%, transparent);         /* líneas guía (tercios) dentro del recuadro */
  --color-video-barra: color-mix(in srgb, var(--color-negro) 82%, transparent);           /* fondo de los controles del video */
  --color-video-etiqueta: color-mix(in srgb, var(--color-negro) 62%, transparent);        /* fondo de la etiqueta con la duración */
  /* v1.9.0 — Selector de emojis, "visto por", votación, menciones y visor protegido */
  --emoji-ancho: 42px;                                                                    /* ancho mínimo de cada emoji del selector (define cuántos caben por fila) */
  --emoji-alto: 42px;                                                                     /* alto de cada emoji (46 px en pantallas táctiles: ver el final del archivo) */
  --color-visto: color-mix(in srgb, var(--color-blanco) 62%, var(--color-gris-claro));    /* ojo y contador de "visto por": gris claro que se lee sobre la burbuja morada */
  --color-sobre-error: var(--color-blanco);                                               /* texto sobre un fondo rojo (botón "Sí, expulsar" elegido) */
  --color-sobre-exito: var(--color-negro);                                                /* texto sobre un fondo verde (botón "No" elegido) */
  --color-mencion-texto: var(--color-morado-claro);                                       /* @menciones en los mensajes de otras personas (v1.10.0: moradas) */
  --color-mencion-fondo: color-mix(in srgb, var(--color-morado) 24%, transparent);
  --color-mencion-borde: var(--color-morado-claro);                                       /* borde de la burbuja donde te mencionaron */
  --color-marca-agua: var(--color-blanco);                                                /* marca de agua del visor de mensajes de 1 vez */
  --color-visor-fondo: color-mix(in srgb, var(--color-negro) 92%, transparent);           /* fondo del visor de mensajes de 1 vez */
  /* v1.9.1 — Animaciones de carga (esqueletos con brillo) */
  --color-esqueleto: color-mix(in srgb, var(--color-morado) 22%, var(--color-tarjeta-2));            /* base del marcador de carga (un poco más clara que las tarjetas para que se note) */
  --color-esqueleto-brillo: color-mix(in srgb, var(--color-morado) 50%, var(--color-tarjeta-2));     /* franja de luz que lo recorre */
  --mov-esqueleto: 1.4s;                                                                  /* vuelta completa del brillo */
  /* v1.10.0 — Mensajes "apagados" (mensaje de 1 vez ya abierto, encuesta finalizada), enlaces y tarjeta de biografía (negro y rojo) */
  --color-apagado-fondo: color-mix(in srgb, var(--color-gris) 70%, var(--color-tarjeta));  /* burbuja en gris */
  --color-apagado-borde: color-mix(in srgb, var(--color-gris) 55%, var(--color-texto-suave));
  --color-apagado-texto: var(--color-texto-suave);
  --color-enlace-otro: var(--color-morado-claro);                                         /* enlaces en mensajes de otras personas (moradas y subrayadas) */
  --color-enlace-propio: var(--color-blanco);                                             /* enlaces en mis mensajes (blancos) */
  --color-bio-negro: #060607;
  --color-bio-negro-2: #121216;
  --color-bio-rojo: #E01B2F;
  --color-bio-rojo-claro: #FF5A69;
  --color-bio-rojo-oscuro: #6E0A14;
  --color-bio-texto: #EDEDF0;
  --color-bio-suave: #A7A7B0;
  --sombra-bio: 0 0 26px color-mix(in srgb, var(--color-bio-rojo) 40%, transparent);
  /* v1.12.0 — Lista de chats (no leídos, borrador, escribiendo), visto por todos, selección múltiple, fragmentos, visor con zoom, cámara, editor de video y tarjeta morada */
  --color-no-leidos: var(--color-morado);                                                 /* burbuja con la cantidad de mensajes no vistos */
  --color-no-leidos-texto: var(--color-blanco);
  --color-no-leidos-silenciado: var(--color-gris-claro);                                  /* la misma burbuja en un grupo silenciado */
  --color-escribiendo-lista: var(--color-morado-claro);                                   /* "Escribiendo…" y "[Borrador]" en las listas */
  --color-visto-todos: #F3C6FF;                                                          /* ojo + contador cuando TODOS vieron tu mensaje: morado muy claro que se lee sobre la burbuja morada */
  --color-visto-todos-fondo: color-mix(in srgb, var(--color-negro) 34%, transparent);     /* pastilla oscura detrás del ojo morado (contraste en ambos temas) */
  --sombra-visto-todos: 0 0 10px color-mix(in srgb, var(--color-visto-todos) 55%, transparent);
  --color-seleccion: color-mix(in srgb, var(--color-morado) 24%, transparent);            /* fondo de los mensajes elegidos (selección múltiple) */
  --color-seleccion-borde: color-mix(in srgb, var(--color-morado-claro) 55%, transparent);
  --color-subrayado: var(--color-warning);                                                /* subrayado del fragmento / voto al que se respondió */
  --color-subrayado-fondo: color-mix(in srgb, var(--color-warning) 22%, transparent);
  --color-reaccion-fondo: var(--color-tarjeta-2);                                         /* pastilla de las reacciones montadas sobre el borde de la burbuja */
  --color-reaccion-borde: var(--color-gris);
  --color-visor-medios: color-mix(in srgb, var(--color-negro) 94%, transparent);          /* fondo del visor a pantalla completa (fotos con zoom) */
  --color-visor-barra: color-mix(in srgb, var(--color-negro) 55%, transparent);
  --color-camara-fondo: var(--color-negro);
  --color-camara-texto: var(--color-blanco);
  --color-camara-disparo: var(--color-blanco);
  --color-camara-grabando: var(--color-error);
  --color-camara-flash: var(--color-blanco);
  --color-subida: color-mix(in srgb, var(--color-negro) 55%, transparent);                /* velo de la miniatura mientras se sube */
  --color-bio2-negro: #07030C;                                                           /* tarjeta del segundo programador: paleta morado oscuro */
  --color-bio2-negro-2: #140A22;
  --color-bio2-morado: #6D28D9;
  --color-bio2-morado-claro: #A78BFA;
  --color-bio2-morado-oscuro: #2E1065;
  --color-bio2-texto: #EDE9FE;
  --color-bio2-suave: #A79BC4;
  --sombra-bio2: 0 0 26px color-mix(in srgb, var(--color-bio2-morado) 45%, transparent);
  /* v1.13.0 — Descripciones (editor visual), banners, botón para bajar, anti-spam, chats privados y notas del parche */
  --color-desc-vacia: var(--color-gris-claro);                                            /* "Sin descripción" (gris oscuro, en cursiva) */
  --color-editor-fondo: var(--color-tarjeta-2);                                           /* área del editor visual */
  --color-editor-borde: var(--color-gris);
  --color-editor-foco: var(--color-morado);
  --color-banner-fondo: var(--color-tarjeta-2);                                           /* banner vacío o mientras carga */
  --color-banner-borde: var(--color-gris);
  --color-bajar-fondo: var(--color-tarjeta-2);                                            /* botón redondo para bajar al final del chat */
  --color-bajar-icono: var(--color-morado-claro);
  --color-bajar-borde: var(--color-morado-borde);
  --color-bajar-contador: var(--color-no-leidos);                                         /* burbuja morada con los no leídos */
  --color-bajar-contador-texto: var(--color-no-leidos-texto);
  --sombra-bajar: 0 4px 16px color-mix(in srgb, var(--color-negro) 45%, transparent);
  --color-spam: var(--color-error-texto);                                                 /* aviso "suspendido por Spam" y pantalla roja */
  --color-aceptar: var(--color-success);                                                  /* cuadrado verde "Aceptar" (chat privado) */
  --color-aceptar-fondo: var(--color-success-suave);
  --color-rechazar: var(--color-error);                                                   /* cuadrado rojo "Rechazar" */
  --color-rechazar-fondo: var(--color-error-suave);
  --color-privado: var(--color-morado-claro);                                             /* candado y separador de los chats privados */
  --color-accion-morada: var(--color-morado-claro);                                       /* opciones de menú en morado ("Hacer Admin", "Invitar a chat privado") */
  --color-nota-actual: var(--color-morado);                                               /* versión actual en las notas del parche */
  --color-subida-avance: var(--color-morado);                                             /* barra de subida de las imágenes del editor */

  /* ---- v1.14.0: foto sobre el banner, chats privados temporales, códigos por SMS, notas del parche y programadores nuevos ---- */
  --color-anillo-foto: var(--color-tarjeta);                                              /* aro alrededor de la foto montada sobre el banner (separa la foto del banner) */
  --tam-foto-banner: 96px;                                                                /* tamaño de la foto sobre el banner en las pantallas (avatar xl) */
  --tam-foto-banner-grande: 120px;                                                        /* tamaño de la foto sobre el banner al tocar una foto (avatar xxl) */
  --color-privado-temporal: var(--color-warning-texto);                                   /* aviso "Chat temporal" del chat privado */
  --color-privado-temporal-fondo: var(--color-warning-suave);
  --color-privado-temporal-borde: color-mix(in srgb, var(--color-warning) 55%, transparent);
  --color-privado-guardado: var(--color-success-texto);                                   /* aviso "Chat guardado" (los 2 se registraron) */
  --color-privado-guardado-fondo: var(--color-success-suave);
  --color-privado-guardado-borde: color-mix(in srgb, var(--color-success) 55%, transparent);
  --color-codigo-prueba: var(--color-warning-texto);                                      /* código mostrado en modo prueba (sin proveedor de SMS) */
  --color-boton-lleno: var(--color-gris);                                                 /* "Crear grupo (3/3)": botón apagado */
  /* Etiquetas de las notas del parche */
  --color-etiqueta-nuevo: var(--color-success-texto);
  --color-etiqueta-mejora: var(--color-info-texto);
  --color-etiqueta-arreglo: var(--color-error-texto);
  --color-etiqueta-seguridad: var(--color-warning-texto);
  --color-etiqueta-diseno: var(--color-rosa-texto);
  --color-etiqueta-servidor: var(--color-cian-texto);
  /* Tarjetas de los programadores 3 a 6 (Centro de ayuda): VERDE, AZUL, CELESTE y AMARILLO (mismos papeles que --color-bio-*: fondo, fondo 2, principal, claro, oscuro, texto, suave) */
  --color-bio3-negro: #030A05;  --color-bio3-negro-2: #0B1F12;  --color-bio3-principal: #16A34A;  --color-bio3-claro: #4ADE80;  --color-bio3-oscuro: #14532D;  --color-bio3-texto: #E8FBEF;  --color-bio3-suave: #9CC7AB;
  --color-bio4-negro: #03050D;  --color-bio4-negro-2: #0B1433;  --color-bio4-principal: #2563EB;  --color-bio4-claro: #60A5FA;  --color-bio4-oscuro: #1E3A8A;  --color-bio4-texto: #E7EEFF;  --color-bio4-suave: #9DB0D9;
  --color-bio5-negro: #020A0D;  --color-bio5-negro-2: #082029;  --color-bio5-principal: #0EA5E9;  --color-bio5-claro: #7DD3FC;  --color-bio5-oscuro: #0C4A6E;  --color-bio5-texto: #E6F8FF;  --color-bio5-suave: #97C4D6;
  --color-bio6-negro: #0B0902;  --color-bio6-negro-2: #221B06;  --color-bio6-principal: #EAB308;  --color-bio6-claro: #FDE047;  --color-bio6-oscuro: #713F12;  --color-bio6-texto: #FFFBE6;  --color-bio6-suave: #D2C58F;
}

/* ---- Tema claro: solo cambia valores de variables; se activa con <html data-tema="claro"> ---- */
:root[data-tema="claro"] {
  color-scheme: light;
  --color-fondo: #F5F3F8;
  --color-fondo-2: #E9DDF3;
  --color-tarjeta: #FFFFFF;
  --color-tarjeta-2: #F1EEF5;
  --color-morado: #A62FA8;
  --color-morado-claro: #8F2A91;
  --color-morado-medio: #9A3299;
  --color-acento: #7A00B0;
  --color-texto: #1B1722;
  --color-texto-suave: #5B5566;
  --color-gris: #D5CFDD;
  --color-gris-claro: #8B8596;
  --color-success-texto: #15803d;
  --color-warning-texto: #a16207;
  --color-error-texto: #dc2626;
  --color-info-texto: #1d4ed8;
  --color-rosa-texto: #be185d;
  --color-cian-texto: #0e7490;
  --color-naranja-texto: #c2410c;
  --color-halo: color-mix(in srgb, var(--color-morado) 18%, transparent);
  --color-cuadricula: color-mix(in srgb, var(--color-morado) 9%, transparent);
  --color-velo: color-mix(in srgb, var(--color-negro) 45%, transparent);
  --sombra-tarjeta: 0 6px 20px color-mix(in srgb, var(--color-morado-oscuro) 14%, transparent);
  --sombra-morado: 0 4px 18px color-mix(in srgb, var(--color-morado) 30%, transparent);
}

/* ---------- Base ---------- */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { -webkit-text-size-adjust: 100%; }
body {
  font-family: var(--fuente-texto);
  /* Fondo HUD: cuadrícula tenue + halo morado superior + degradado */
  background:
    linear-gradient(var(--color-cuadricula) 1px, transparent 1px) 0 0 / 34px 34px,
    linear-gradient(90deg, var(--color-cuadricula) 1px, transparent 1px) 0 0 / 34px 34px,
    radial-gradient(ellipse 80% 45% at 50% -8%, var(--color-halo), transparent),
    var(--gradiente-fondo);
  background-attachment: fixed;
  color: var(--color-texto);
  min-height: 100dvh;
  line-height: 1.45;
  display: flex;
  flex-direction: column;
}
a { color: var(--color-morado-claro); text-decoration: none; }
button { font-family: inherit; cursor: pointer; border: none; background: none; color: inherit; }
input, textarea, select { font-family: inherit; color: inherit; }
[hidden] { display: none !important; }
:focus-visible { outline: 2px solid var(--color-morado-claro); outline-offset: 2px; }

/* Icono Material Symbols: <span class="material-symbols-rounded">nombre</span> */
.material-symbols-rounded {
  font-family: var(--fuente-iconos);
  font-weight: normal; font-style: normal; font-size: 24px; line-height: 1;
  letter-spacing: normal; text-transform: none; display: inline-block; white-space: nowrap;
  direction: ltr; -webkit-font-smoothing: antialiased; font-feature-settings: 'liga'; user-select: none;
}

/* ---------- Estructura ---------- */
/* Márgenes que respetan los bordes seguros (notch, esquinas redondeadas y barra de gestos) */
.contenedor { width: 100%; max-width: var(--ancho-contenedor); margin: 0 auto; padding: 20px max(16px, env(safe-area-inset-right)) calc(32px + env(safe-area-inset-bottom)) max(16px, env(safe-area-inset-left)); flex: 1; }
.contenedor--centrado { display: flex; flex-direction: column; justify-content: center; gap: 20px; }
.pila { display: flex; flex-direction: column; gap: 14px; }
/* Dos columnas iguales; si un elemento está oculto ([hidden]) el visible ocupa todo el ancho (ej. "Tomar foto" / "Repetir foto") */
.fila-2 { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); gap: 12px; }
.btn { white-space: nowrap; }                                   /* los botones no parten su texto en dos líneas */
.separador { display: flex; align-items: center; gap: 12px; color: var(--color-texto-suave); font-size: 13px; }
.separador::before, .separador::after { content: ''; flex: 1; height: 1px; background: var(--color-gris); }
.nota { font-size: 12px; color: var(--color-texto-suave); text-align: center; }
.pie { text-align: center; padding: 14px; font-family: var(--fuente-hud); font-size: 12px; color: var(--color-texto-suave); display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 6px 10px; }  /* v1.5.0: fila para la etiqueta Beta */
.vacio { text-align: center; color: var(--color-texto-suave); padding: 40px 16px; display: flex; flex-direction: column; align-items: center; gap: 10px; }
.vacio .material-symbols-rounded { font-size: 64px; color: var(--color-gris-claro); }

/* Tarjeta y modal con esquinas "HUD": dos corchetes morados en esquinas opuestas */
.tarjeta, .modal { position: relative; background: var(--color-tarjeta); border: 1px solid var(--color-gris); border-radius: var(--radio-md); box-shadow: var(--sombra-tarjeta); }
.tarjeta { padding: 20px; }
.tarjeta::before, .tarjeta::after, .modal::before, .modal::after { content: ''; position: absolute; width: 16px; height: 16px; border: 2px solid var(--color-morado); pointer-events: none; }
.tarjeta::before, .modal::before { top: -1px; left: -1px; border-right: none; border-bottom: none; border-top-left-radius: var(--radio-md); }
.tarjeta::after, .modal::after { bottom: -1px; right: -1px; border-left: none; border-top: none; border-bottom-right-radius: var(--radio-md); }

/* ---------- Marca ---------- */
.logo { font-family: var(--fuente-logo); font-weight: 800; font-size: 68px; letter-spacing: 0.10em; text-align: center; background: var(--gradiente-logo); background-size: 260% 100%; -webkit-background-clip: text; background-clip: text; color: transparent; filter: drop-shadow(0 0 14px var(--color-halo)); animation: barrido 1.8s ease-out 0.2s 1 both; }
.hero { text-align: center; padding-top: 24px; }
.hero__lema { font-family: var(--fuente-hud); font-size: 15px; color: var(--color-texto-suave); margin-top: 6px; letter-spacing: 0.06em; }
.icono-titulo { display: flex; justify-content: center; }
.icono-titulo .material-symbols-rounded { font-size: 88px; color: var(--color-morado); filter: drop-shadow(0 0 12px var(--color-halo)); }
/* Título de sección con barra lateral (indica dónde empieza cada bloque) */
.titulo-seccion { font-family: var(--fuente-titulo); font-size: 16px; font-weight: 700; color: var(--color-texto); border-left: 3px solid var(--color-morado); padding-left: 10px; letter-spacing: 0.02em; }

/* ---------- Barra superior ---------- */
.appbar { position: sticky; top: 0; z-index: 20; display: flex; align-items: center; gap: 8px; padding: calc(10px + env(safe-area-inset-top)) max(12px, env(safe-area-inset-right)) 10px max(12px, env(safe-area-inset-left)); background: var(--color-tarjeta); border-bottom: 1px solid var(--color-gris); }
.appbar::after { content: ''; position: absolute; left: 0; bottom: -1px; width: 88px; height: 1px; background: var(--color-morado); box-shadow: var(--sombra-morado); }
.appbar__titulo { flex: 1; font-family: var(--fuente-titulo); font-weight: 700; font-size: 17px; text-align: center; letter-spacing: 0.04em; }
.appbar__espacio { min-width: 40px; height: 40px; display: inline-flex; align-items: center; justify-content: center; gap: 4px; }  /* v1.5.0: min-width (antes width fijo) para que quepan la foto de la cuenta y el engranaje */
.ajustes-flotante { position: fixed; top: calc(12px + env(safe-area-inset-top)); right: max(12px, env(safe-area-inset-right)); z-index: 30; display: flex; align-items: center; gap: 4px; }  /* v1.5.0: fila (foto de cuenta + engranaje) */

/* ---------- Botones ---------- */
.btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; padding: 12px 20px; border-radius: var(--radio-sm); font-family: var(--fuente-titulo); font-weight: 700; font-size: 15px; letter-spacing: 0.04em; border: 1px solid transparent; text-align: center; transition: transform var(--mov-rapido), filter var(--mov-rapido), background var(--mov-rapido), box-shadow var(--mov-rapido); }
.btn:active { transform: scale(.97); }
.btn:disabled { opacity: .45; cursor: not-allowed; }
.btn--primario { background: var(--gradiente-principal); color: var(--color-blanco); border-color: var(--color-morado-claro); box-shadow: var(--sombra-morado); }
.btn--primario:hover:not(:disabled) { filter: brightness(1.15); }
.btn--secundario { background: var(--color-tarjeta-2); border-color: var(--color-morado-borde); color: var(--color-texto); }
.btn--secundario:hover { background: var(--color-morado-suave); border-color: var(--color-morado); }
.btn--fantasma { color: var(--color-morado-claro); }
.btn--fantasma:hover { background: var(--color-morado-suave); }
.btn--peligro { background: var(--color-error-suave); border-color: var(--color-error); color: var(--color-error-texto); }
.btn--exito { background: var(--color-success-suave); border-color: var(--color-success); color: var(--color-success-texto); }
.btn--grande { padding: 16px 24px; font-size: 16px; }
.btn--bloque { width: 100%; }
.btn-icono { width: 40px; height: 40px; border-radius: var(--radio-sm); display: inline-flex; align-items: center; justify-content: center; color: var(--color-texto); flex-shrink: 0; transition: background var(--mov-rapido), color var(--mov-rapido); }
.btn-icono:hover { background: var(--color-morado-suave); color: var(--color-morado-claro); }

/* ---------- Formularios ---------- */
.campo { display: flex; flex-direction: column; gap: 6px; }
.campo__etiqueta { font-size: 13px; color: var(--color-texto-suave); font-weight: 500; }
.campo__entrada { width: 100%; background: var(--color-fondo); border: 1px solid var(--color-gris); border-radius: var(--radio-md); padding: 12px 14px; font-size: 16px; outline: none; transition: border-color var(--mov-rapido), box-shadow var(--mov-rapido); }  /* 16 px: evita el zoom automático de iPhone al enfocar */
.campo__entrada:focus { border-color: var(--color-morado); box-shadow: var(--sombra-morado); }
.campo__entrada--error { border-color: var(--color-error); }
textarea.campo__entrada { resize: vertical; min-height: 96px; }
.campo__ayuda { font-size: 12px; color: var(--color-texto-suave); }
.campo__contador { align-self: flex-end; font-family: var(--fuente-hud); font-size: 12px; color: var(--color-texto-suave); }
.campo__envoltorio { position: relative; display: flex; align-items: center; }
.campo__ojo { position: absolute; right: 4px; }
.mensaje-form { font-size: 13px; min-height: 18px; text-align: center; }
.mensaje-form--error { color: var(--color-error-texto); }
.mensaje-form--ok { color: var(--color-success-texto); }
.buscador { position: relative; flex: 1; }
.buscador > .material-symbols-rounded { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); color: var(--color-texto-suave); }
.buscador .campo__entrada { padding-left: 44px; padding-right: 44px; }

/* Avisos en línea (info, aviso, error, éxito) con los colores de estado */
.aviso { display: flex; align-items: flex-start; gap: 10px; padding: 12px 14px; border-radius: var(--radio-md); border: 1px solid; font-size: 14px; }
.aviso .material-symbols-rounded { font-size: 22px; flex-shrink: 0; }
.aviso__cuerpo { flex: 1; display: flex; flex-direction: column; gap: 8px; }
.aviso--info { background: var(--color-info-suave); border-color: var(--color-info); }
.aviso--info .material-symbols-rounded { color: var(--color-info-texto); }
.aviso--warning { background: var(--color-warning-suave); border-color: var(--color-warning); }
.aviso--warning .material-symbols-rounded { color: var(--color-warning-texto); }
.aviso--error { background: var(--color-error-suave); border-color: var(--color-error); }
.aviso--error .material-symbols-rounded { color: var(--color-error-texto); }
.aviso--success { background: var(--color-success-suave); border-color: var(--color-success); }
.aviso--success .material-symbols-rounded { color: var(--color-success-texto); }
/* Urgencia del tiempo restante: menos de 1 hora (aviso) y menos de 5 minutos (error) */
.urgencia--aviso { color: var(--color-warning-texto); }
.urgencia--error { color: var(--color-error-texto); }

/* Chips de duración */
.chips { display: flex; flex-wrap: wrap; gap: 8px; }
.chip { padding: 8px 14px; border-radius: var(--radio-sm); border: 1px solid var(--color-gris); background: var(--color-fondo); font-size: 14px; }
.chip--activo { background: var(--color-morado-suave); border-color: var(--color-morado); color: var(--color-morado-claro); }

/* Tarjetas de opción (radio visual) */
.opcion { display: flex; gap: 12px; align-items: flex-start; padding: 14px; border: 1px solid var(--color-gris); border-radius: var(--radio-md); cursor: pointer; text-align: left; width: 100%; background: var(--color-tarjeta); transition: border-color var(--mov-rapido); }
.opcion:hover { border-color: var(--color-morado-borde); }
.opcion .material-symbols-rounded { color: var(--color-morado-claro); margin-top: 2px; }
.opcion--activa { border-color: var(--color-morado); background: var(--color-morado-suave); }
.opcion__titulo { font-family: var(--fuente-titulo); font-weight: 700; color: var(--color-texto); }
.opcion__texto { font-size: 13px; color: var(--color-texto-suave); }

/* ---------- Insignias ---------- */
.insignia { display: inline-flex; align-items: center; gap: 4px; font-family: var(--fuente-titulo); font-size: 12px; font-weight: 600; padding: 3px 8px; border-radius: var(--radio-sm); background: var(--color-morado-suave); color: var(--color-morado-claro); }
.insignia .material-symbols-rounded { font-size: 14px; }
.insignia--gris { background: var(--color-gris); color: var(--color-texto); }
.insignia--exito { background: var(--color-success-suave); color: var(--color-success-texto); }
.insignia--error { background: var(--color-error-suave); color: var(--color-error-texto); }
.insignia--aviso { background: var(--color-warning-suave); color: var(--color-warning-texto); }
.insignia--info { background: var(--color-info-suave); color: var(--color-info-texto); }

/* ---------- Avatares ---------- */
.avatar { border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; overflow: hidden; flex-shrink: 0; font-family: var(--fuente-titulo); font-weight: 700; color: var(--color-blanco); text-transform: uppercase; }
.avatar img { width: 100%; height: 100%; object-fit: cover; }
.avatar--sm { width: 32px; height: 32px; font-size: 13px; }
.avatar--md { width: 40px; height: 40px; font-size: 15px; }
.avatar--lg { width: 56px; height: 56px; font-size: 20px; }
.avatar--xl { width: 96px; height: 96px; font-size: 34px; }
.avatar--c1 { background: var(--avatar-1); } .avatar--c2 { background: var(--avatar-2); }
.avatar--c3 { background: var(--avatar-3); } .avatar--c4 { background: var(--avatar-4); }
.avatar--c5 { background: var(--avatar-5); } .avatar--c6 { background: var(--avatar-6); }
.avatar--grupo { background: var(--gradiente-principal); }
.avatar--grupo .material-symbols-rounded { font-size: 1.5em; }

/* ---------- Lista de grupos ---------- */
.grupo-item { display: flex; align-items: center; gap: 14px; padding: 14px; background: var(--color-tarjeta); border: 1px solid var(--color-gris); border-left: 3px solid var(--color-morado); border-radius: var(--radio-md); color: var(--color-texto); transition: border-color var(--mov-rapido), box-shadow var(--mov-rapido); }
.grupo-item:hover { border-color: var(--color-morado); box-shadow: var(--sombra-morado); }
.grupo-item__datos { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.grupo-item__nombre { font-weight: 700; font-family: var(--fuente-titulo); font-size: 16px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.grupo-item__meta { font-size: 12px; color: var(--color-texto-suave); display: flex; flex-wrap: wrap; gap: 6px 12px; align-items: center; }
.encabezado-lista { display: flex; align-items: center; gap: 12px; }
.contador-lista { font-family: var(--fuente-hud); font-size: 14px; color: var(--color-texto); white-space: nowrap; }

/* ---------- Pestañas / selector segmentado ---------- */
.pestanas { display: flex; background: var(--color-fondo); border: 1px solid var(--color-gris); border-radius: var(--radio-md); padding: 4px; gap: 4px; }
.pestana { flex: 1; padding: 8px; border-radius: var(--radio-sm); font-family: var(--fuente-titulo); font-size: 13px; font-weight: 700; color: var(--color-texto-suave); display: flex; align-items: center; justify-content: center; gap: 6px; }
.pestana .material-symbols-rounded { font-size: 18px; }
.pestana--activa { background: var(--gradiente-principal); color: var(--color-blanco); }

/* ---------- Ajustes ---------- */
.ajuste-fila { display: flex; align-items: center; gap: 12px; padding: 12px; border: 1px solid var(--color-gris); border-radius: var(--radio-md); color: var(--color-texto); transition: border-color var(--mov-rapido); }
.ajuste-fila:hover { border-color: var(--color-morado); }
.ajuste-fila__datos { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.ajuste-fila__titulo { font-family: var(--fuente-titulo); font-weight: 700; }
.ajuste-fila__sub { font-size: 12px; color: var(--color-texto-suave); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* ---------- Código de 6 dígitos ---------- */
.cajas-codigo { display: flex; gap: 8px; justify-content: center; }
.caja-codigo { width: 46px; height: 58px; text-align: center; font-family: var(--fuente-mono); font-size: 26px; font-weight: 700; background: var(--color-fondo); border: 1px solid var(--color-gris); border-radius: var(--radio-md); outline: none; }
.caja-codigo:focus { border-color: var(--color-morado); box-shadow: var(--sombra-morado); }
.codigo-grande { font-family: var(--fuente-mono); font-weight: 700; font-size: 38px; letter-spacing: 0.15em; color: var(--color-success-texto); text-align: center; }

/* ---------- Visor de cámara (QR y foto de perfil) ---------- */
.visor { position: relative; aspect-ratio: 1; width: 100%; max-width: 340px; margin: 0 auto; border-radius: var(--radio-lg); overflow: hidden; background: var(--color-negro); border: 2px solid var(--color-morado); }
.visor video, .visor img { width: 100%; height: 100%; object-fit: cover; display: block; }
.visor--espejo video { transform: scaleX(-1); }
.visor__marco { position: absolute; inset: 18%; border: 3px solid var(--color-morado-claro); border-radius: var(--radio-md); pointer-events: none; }
.visor__vacio { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; color: var(--color-texto-suave); text-align: center; padding: 16px; font-size: 14px; }
.visor__vacio .material-symbols-rounded { font-size: 56px; }
#contenedorQR { display: flex; justify-content: center; padding: 14px; background: var(--color-qr-claro); border-radius: var(--radio-md); width: fit-content; margin: 0 auto; }

/* ---------- Vista previa de grupo ---------- */
.previa { display: flex; flex-direction: column; align-items: center; gap: 8px; text-align: center; }
.previa__nombre { font-family: var(--fuente-titulo); font-size: 26px; font-weight: 800; color: var(--color-texto); overflow-wrap: anywhere; }
.previa__dato { font-size: 14px; color: var(--color-texto-suave); }
.previa__descripcion { text-align: left; white-space: pre-wrap; overflow-wrap: anywhere; width: 100%; padding-top: 12px; border-top: 1px solid var(--color-gris); }

/* ---------- Reloj del grupo ---------- */
.reloj { font-family: var(--fuente-hud); font-size: 38px; letter-spacing: 0.06em; color: var(--color-morado-claro); text-shadow: 0 0 14px var(--color-halo); }
.progreso { height: 6px; background: var(--color-gris); border-radius: var(--radio-sm); overflow: hidden; }
.progreso__barra { height: 100%; width: var(--valor, 0%); background: var(--gradiente-principal); box-shadow: var(--sombra-morado); transition: width 1s linear; }

/* ---------- Miembros ---------- */
.miembro { display: flex; align-items: center; gap: 12px; padding: 10px 0; border-bottom: 1px solid var(--color-gris); }
.miembro:last-child { border-bottom: none; }
.miembro__datos { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.miembro__nombre { font-weight: 500; color: var(--color-texto); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.miembro__insignias { display: flex; flex-wrap: wrap; gap: 4px; }

/* ---------- Modal ---------- */
.modal-fondo { position: fixed; inset: 0; z-index: 100; background: var(--color-velo); display: flex; align-items: flex-end; justify-content: center; animation: aparecer var(--mov-rapido) ease-out; }
.modal { width: 100%; max-width: 460px; max-height: 92dvh; overflow: auto; border-radius: var(--radio-lg) var(--radio-lg) 0 0; padding: 18px; display: flex; flex-direction: column; gap: 14px; }
.modal__cabecera { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.modal__titulo { font-family: var(--fuente-titulo); font-size: 18px; font-weight: 700; }
.modal__cuerpo { display: flex; flex-direction: column; gap: 12px; }
.modal__acciones { display: flex; gap: 10px; justify-content: flex-end; flex-wrap: wrap; }
.medio--grande { max-width: 100%; max-height: 70dvh; border-radius: var(--radio-md); margin: 0 auto; display: block; }
@media (min-width: 600px) {
  .modal-fondo { align-items: center; padding: 16px; }
  .modal { border-radius: var(--radio-md); }
}

/* ---------- Menú flotante (acciones de mensaje y miembro) ---------- */
.menu-flotante { position: fixed; z-index: 120; min-width: 190px; background: var(--color-tarjeta-2); border: 1px solid var(--color-gris); border-radius: var(--radio-md); box-shadow: var(--sombra-tarjeta); overflow: hidden; }
.menu-flotante__item { display: flex; align-items: center; gap: 10px; width: 100%; padding: 12px 14px; font-size: 14px; text-align: left; color: var(--color-texto); }
.menu-flotante__item:hover { background: var(--color-morado-suave); }
.menu-flotante__item--peligro { color: var(--color-error-texto); }

/* ---------- Avisos breves (toast) ---------- */
.toasts { position: fixed; left: 0; right: 0; bottom: calc(84px + env(safe-area-inset-bottom)); z-index: 200; display: flex; flex-direction: column; align-items: center; gap: 8px; pointer-events: none; }
.toast { background: var(--color-tarjeta-2); border: 1px solid var(--color-info); color: var(--color-texto); padding: 10px 18px; border-radius: var(--radio-md); font-size: 14px; max-width: 90vw; box-shadow: var(--sombra-tarjeta); animation: aparecer var(--mov-medio) ease-out; }
.toast--info { border-color: var(--color-info); }
.toast--ok { border-color: var(--color-success); }
.toast--aviso { border-color: var(--color-warning); }
.toast--error { border-color: var(--color-error); }

/* ---------- Bloqueo de pantalla completa (grupo eliminado / expulsado) ---------- */
.bloqueo { position: fixed; inset: 0; z-index: 300; background: var(--color-fondo); display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 14px; text-align: center; padding: 24px; }
.bloqueo .material-symbols-rounded { font-size: 72px; color: var(--color-morado); }

/* ---------- Chat ---------- */
.body-chat { height: 100dvh; overflow: hidden; }
.chat { height: var(--alto-visual, 100dvh); width: 100%; max-width: 900px; margin: 0 auto; display: flex; flex-direction: column; background: var(--gradiente-fondo); border-left: 1px solid var(--color-gris); border-right: 1px solid var(--color-gris); }
.chat__cabecera { display: flex; align-items: center; gap: 10px; padding: 8px 12px; background: var(--color-tarjeta); border-bottom: 1px solid var(--color-gris); }
.chat__info { flex: 1; min-width: 0; cursor: pointer; }
.chat__nombre { font-family: var(--fuente-titulo); font-weight: 700; color: var(--color-texto); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.chat__estado { font-family: var(--fuente-hud); font-size: 13px; color: var(--color-texto-suave); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.chat__cuerpo { flex: 1; overflow-y: auto; padding: 14px 12px; display: flex; flex-direction: column; gap: 3px; }
.fecha-sep { align-self: center; background: var(--color-tarjeta-2); border: 1px solid var(--color-gris); color: var(--color-texto-suave); font-family: var(--fuente-hud); font-size: 12px; padding: 3px 12px; border-radius: var(--radio-sm); margin: 10px 0 6px; }
.sistema { align-self: center; font-size: 12px; font-style: italic; color: var(--color-texto-suave); padding: 4px 12px; text-align: center; }
.sistema--entra { color: var(--color-success-texto); }
.sistema--sale { color: var(--color-error-texto); }
.fila { display: flex; align-items: flex-end; gap: 8px; max-width: 86%; }
.fila--propia { align-self: flex-end; flex-direction: row-reverse; }
.fila--otra { align-self: flex-start; }
.fila__hueco { width: 32px; flex-shrink: 0; }
.burbuja { position: relative; padding: 7px 10px 5px; border-radius: var(--radio-lg); min-width: 84px; max-width: 100%; overflow-wrap: anywhere; }
.fila--propia .burbuja { background: var(--gradiente-principal); color: var(--color-blanco); border-bottom-right-radius: var(--radio-sm); }
.fila--otra .burbuja { background: var(--color-tarjeta); border: 1px solid var(--color-gris); border-bottom-left-radius: var(--radio-sm); }
.burbuja__autor { font-family: var(--fuente-titulo); font-size: 12px; font-weight: 700; color: var(--color-morado-claro); margin-bottom: 2px; }
.burbuja__texto { white-space: pre-wrap; font-size: 15px; }
.burbuja__eliminada { display: flex; align-items: center; gap: 6px; font-style: italic; opacity: .75; font-size: 14px; }
.burbuja__eliminada .material-symbols-rounded { font-size: 18px; }
.burbuja__pie { display: flex; justify-content: flex-end; font-family: var(--fuente-hud); font-size: 11px; opacity: .7; margin-top: 2px; }
.burbuja__menu { position: absolute; top: 2px; right: 2px; width: 26px; height: 26px; border-radius: var(--radio-sm); display: flex; align-items: center; justify-content: center; opacity: 0; background: var(--color-velo-suave); color: inherit; transition: opacity var(--mov-rapido); }
.burbuja:hover .burbuja__menu, .burbuja__menu:focus-visible { opacity: 1; }
@media (hover: none) { .burbuja__menu { opacity: .8; } }
.medio { display: block; width: 100%; max-width: 280px; border-radius: var(--radio-md); margin-bottom: 4px; }
.medio--imagen { cursor: zoom-in; }
.burbuja audio { width: 240px; max-width: 100%; display: block; }
.archivo { display: flex; align-items: center; gap: 10px; padding: 8px; background: var(--color-velo-suave); border-radius: var(--radio-md); color: inherit; min-width: 200px; }
.archivo .material-symbols-rounded { font-size: 32px; }
.archivo__datos { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.archivo__nombre { font-size: 14px; font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.archivo__tam { font-size: 12px; opacity: .75; }

/* Barra de entrada del chat */
.entrada-envoltorio { position: relative; background: var(--color-tarjeta); border-top: 1px solid var(--color-gris); padding-bottom: env(safe-area-inset-bottom); }
.entrada { display: flex; align-items: flex-end; gap: 6px; padding: 10px; }
.entrada__texto { flex: 1; background: var(--color-fondo); border: 1px solid var(--color-gris); border-radius: var(--radio-lg); padding: 10px 16px; max-height: 120px; resize: none; outline: none; font-size: 16px; line-height: 1.4; }
.entrada__texto:focus { border-color: var(--color-morado); box-shadow: var(--sombra-morado); }
.btn-enviar { width: 44px; height: 44px; border-radius: 50%; background: var(--gradiente-principal); color: var(--color-blanco); display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; box-shadow: var(--sombra-morado); }
.adjuntar-menu { position: absolute; bottom: 100%; left: 10px; margin-bottom: 8px; display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; padding: 12px; background: var(--color-tarjeta-2); border: 1px solid var(--color-gris); border-radius: var(--radio-md); box-shadow: var(--sombra-tarjeta); }
.adjuntar-menu button { display: flex; flex-direction: column; align-items: center; gap: 4px; font-size: 12px; color: var(--color-texto); min-width: 62px; }
.adjuntar-menu .material-symbols-rounded { width: 46px; height: 46px; border-radius: 50%; background: var(--gradiente-principal); color: var(--color-blanco); display: flex; align-items: center; justify-content: center; }
/* v1.7.0: la barra de grabación se SUPERPONE a la fila de escribir (.entrada-fila) en vez de ocultar el formulario, para que el botón del micrófono
   siga bajo el dedo mientras se mantiene presionado. data-modo="sostenido" (dedo puesto): deja libre el hueco del micrófono a la derecha;
   data-modo="fijado" (manos libres): ocupa toda la fila. Cada modo muestra solo sus controles (.grabando__solo-fijado / .grabando__solo-sostenido). */
.entrada-fila { position: relative; }
.grabando { position: absolute; inset: 0; z-index: 2; display: flex; align-items: center; gap: 10px; padding: 10px; background: var(--color-tarjeta); transition: right var(--mov-medio) var(--ease-salida); }
.grabando[data-modo="sostenido"] { right: 64px; }
.grabando[data-modo="sostenido"] .grabando__solo-fijado, .grabando[data-modo="fijado"] .grabando__solo-sostenido { display: none; }
.grabando__punto { width: 12px; height: 12px; border-radius: 50%; background: var(--color-error); animation: latido 1s infinite; flex-shrink: 0; }
.grabando__tiempo { font-family: var(--fuente-hud); font-size: 18px; }
.grabando__pista { margin-left: auto; display: inline-flex; align-items: center; gap: 2px; font-size: 13px; color: var(--color-texto-suave); white-space: nowrap; }   /* "Desliza para cancelar" */
.grabando__pista .material-symbols-rounded { font-size: 20px; }
.grabando .btn-una-vez { margin-left: auto; }   /* con la grabación fijada, "1 vez" y enviar quedan a la derecha */

/* ---------- v1.7.0: botón "1 vez" ----------
   Qué hace: interruptor (aria-pressed) que se usa en la previsualización de adjuntos y en la barra de grabación.
   Para qué sirve: enviar el audio, la foto o el video para que se puedan ver/escuchar una sola vez. Comparte estado con el "1 vez" del menú de adjuntar. */
.btn-una-vez { flex-shrink: 0; display: inline-flex; align-items: center; gap: 4px; height: 36px; padding: 0 12px 0 8px; border: 1px solid var(--color-gris); border-radius: var(--radio-md); background: transparent; color: var(--color-texto-suave); font-family: var(--fuente-titulo); font-size: 13px; font-weight: 700; white-space: nowrap; cursor: pointer; transition: color var(--mov-rapido) var(--ease-suave), background-color var(--mov-rapido) var(--ease-suave), border-color var(--mov-rapido) var(--ease-suave), box-shadow var(--mov-rapido) var(--ease-suave); }
.btn-una-vez .material-symbols-rounded { font-size: 20px; }
.btn-una-vez:hover { color: var(--color-morado-claro); border-color: var(--color-morado-borde); }
.btn-una-vez[aria-pressed="true"] { color: var(--color-morado-claro); border-color: var(--color-morado); background: var(--color-morado-suave); box-shadow: var(--sombra-morado); }

/* ---------- v1.7.0: previsualización de adjuntos (arriba del cuadro de texto) ----------
   Qué hace: muestra, antes de enviar, cada foto/video (miniatura) o audio/documento (ficha con nombre y tamaño), cada uno con su X para quitarlo.
   Para qué sirve: revisar lo que se va a mandar; los archivos solo se envían al tocar Enviar. */
.adjuntos-previa { display: flex; align-items: center; gap: 8px; padding: 10px 10px 0; }
.adjuntos-previa--enviando { opacity: .6; pointer-events: none; }   /* mientras se envían no se puede quitar nada */
.adjuntos-previa__lista { flex: 1; min-width: 0; display: flex; gap: 8px; overflow-x: auto; padding-bottom: 4px; scrollbar-width: thin; }
.adjunto { position: relative; flex: 0 0 auto; height: 72px; border-radius: var(--radio-md); overflow: hidden; background: var(--color-tarjeta-2); border: 1px solid var(--color-gris); animation: pop var(--mov-medio) var(--ease-rebote) backwards; }
.adjunto--medio { width: 72px; display: flex; align-items: center; justify-content: center; color: var(--color-texto-suave); }   /* foto / video */
.adjunto__miniatura { display: block; width: 100%; height: 100%; object-fit: cover; }
.adjunto--archivo { width: 176px; display: flex; align-items: center; gap: 8px; padding: 0 34px 0 10px; color: var(--color-texto); }   /* audio / documento */
.adjunto--archivo > .material-symbols-rounded { font-size: 28px; color: var(--color-morado-claro); flex-shrink: 0; }
.adjunto__datos { display: flex; flex-direction: column; min-width: 0; }
.adjunto__nombre { font-size: 13px; font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.adjunto__tam { font-size: 11px; color: var(--color-texto-suave); }
.adjunto__quitar { position: absolute; top: 4px; right: 4px; width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; border-radius: 50%; background: var(--color-velo); color: var(--color-blanco); transition: background-color var(--mov-rapido) var(--ease-suave); }
.adjunto__quitar::after { content: ''; position: absolute; inset: -4px; }   /* zona de toque más grande que el círculo visible */
.adjunto__quitar .material-symbols-rounded { font-size: 16px; }
.adjunto__quitar:hover { background: var(--color-error); }
.adjunto__insignia { position: absolute; left: 4px; bottom: 4px; display: flex; color: var(--color-blanco); filter: drop-shadow(0 0 3px var(--color-negro)); pointer-events: none; }   /* marca de "video" */
.adjunto__insignia .material-symbols-rounded { font-size: 22px; }

/* ---------- v1.7.0: notas de voz estilo WhatsApp ----------
   Qué hace: el micrófono admite gestos (mantener presionado, deslizar arriba para fijar, izquierda para cancelar): no debe desplazar la pantalla ni
   seleccionar texto. Mientras se mantiene presionado (.btn-mic--sostenido) se agranda (el tamaño lo pone chat.js con transform) y sigue al dedo.
   El candado aparece sobre el micrófono: deslizar hasta él fija la grabación. */
.btn-mic { touch-action: none; -webkit-user-select: none; user-select: none; -webkit-touch-callout: none; }
.btn-enviar.btn-mic--sostenido { z-index: 3; transition: none; box-shadow: var(--sombra-morado-fuerte); }
.candado-grab { position: absolute; right: 10px; bottom: calc(100% + 10px); z-index: 3; width: 44px; padding: 8px 0; display: flex; flex-direction: column; align-items: center; gap: 2px; border-radius: var(--radio-lg); background: var(--color-tarjeta-2); border: 1px solid var(--color-morado-borde); color: var(--color-morado-claro); box-shadow: var(--sombra-tarjeta); transform: translateY(calc(var(--prog, 0) * -8px)); pointer-events: none; }
.candado-grab .material-symbols-rounded { font-size: 22px; }
@media (pointer: coarse) { .candado-grab { width: 48px; } .btn-una-vez { height: 44px; } }   /* el micrófono mide 48 px en pantallas táctiles; objetivos de toque de 44 px */
@media (max-width: 359px) { .grabando .onda-grab { display: none; } }   /* en pantallas muy angostas el ecualizador no cabe junto a "1 vez" */

/* ============================================================
   MOVIMIENTO — animaciones de todas las interacciones (v3)
   Qué hace: define las entradas de pantalla, hover/pulsación, ondas al tocar, apertura y cierre de
   modales/menús/paneles, avisos, mensajes del chat, cámara/QR y estados del tiempo.
   Para qué sirve: dar respuesta visual a cada acción de la persona.
   Todo usa los tokens --mov-* y --ease-* del :root y se desactiva con prefers-reduced-motion.
   ============================================================ */

/* ---------- Keyframes ---------- */
@keyframes aparecer { from { opacity: 0; } to { opacity: 1; } }
@keyframes desvanecer { to { opacity: 0; } }
@keyframes latido { 50% { opacity: .25; } }
@keyframes pulso { 50% { opacity: .55; } }
@keyframes barrido { from { background-position: 100% 0; } to { background-position: 0% 0; } }  /* brillo único del logo */
@keyframes entrar { from { opacity: 0; transform: translateY(10px); } }                           /* aparece subiendo */
@keyframes pop { 0% { opacity: 0; transform: scale(.85); } 60% { opacity: 1; transform: scale(1.06); } 100% { transform: scale(1); } }
@keyframes seleccion { 0% { transform: scale(.94); } 60% { transform: scale(1.03); } 100% { transform: scale(1); } }
@keyframes sacudir { 20%, 60% { transform: translateX(-6px); } 40%, 80% { transform: translateX(6px); } }
@keyframes onda { to { transform: scale(1); opacity: 0; } }
@keyframes extender { from { width: 0; } }
@keyframes llenar { from { width: 0; } }
@keyframes menu-entra { from { opacity: 0; transform: scale(.92) translateY(-4px); } }
@keyframes panel-sube { from { opacity: 0; transform: translateY(12px); } }
@keyframes modal-entra { from { opacity: 0; transform: translateY(40px); } }                       /* móvil: sube desde abajo */
@keyframes modal-entra-centro { from { opacity: 0; transform: scale(.94) translateY(8px); } }       /* escritorio: escala al centro */
@keyframes modal-sale { to { opacity: 0; transform: translateY(24px) scale(.98); } }
@keyframes toast-entra { from { opacity: 0; transform: translateY(16px) scale(.96); } }
@keyframes toast-sale { to { opacity: 0; transform: translateY(8px); } }
@keyframes entrar-derecha { from { opacity: 0; transform: translateX(18px) scale(.96); } }
@keyframes entrar-izquierda { from { opacity: 0; transform: translateX(-18px) scale(.96); } }
@keyframes destello { 0% { transform: scale(1.05); box-shadow: var(--sombra-morado-fuerte); } 100% { transform: scale(1); } }
@keyframes flash { from { opacity: .9; } to { opacity: 0; } }
@keyframes escanear { from { top: 0; } to { top: calc(100% - 2px); } }
@keyframes ecualizador { 0%, 100% { transform: scaleY(.25); } 50% { transform: scaleY(1); } }
@keyframes vt-salir { to { opacity: 0; } }
@keyframes vt-entrar { from { opacity: 0; } }

/* ---------- Cambio de pantalla y de tema: fundido cruzado (navegadores con View Transitions) ---------- */
@view-transition { navigation: auto; }
::view-transition-old(root) { animation: vt-salir var(--mov-medio) var(--ease-suave) both; }
::view-transition-new(root) { animation: vt-entrar var(--mov-medio) var(--ease-suave) both; }
/* Alternativa para el cambio de tema cuando no hay View Transitions: colores que se funden */
:root.tema-cambiando, :root.tema-cambiando *, :root.tema-cambiando *::before, :root.tema-cambiando *::after {
  transition: background-color var(--mov-medio) var(--ease-suave), color var(--mov-medio) var(--ease-suave), border-color var(--mov-medio) var(--ease-suave), box-shadow var(--mov-medio) var(--ease-suave) !important;
}

/* ---------- Entrada de pantalla: los bloques suben en cascada (también al cambiar de paso en Unirme) ---------- */
.contenedor > *, .contenedor > form.pila > :not(.mensaje-form) { animation: entrar var(--mov-medio) var(--ease-salida) backwards; animation-delay: calc(var(--i, 0) * 60ms); }
.contenedor > :nth-child(2), .contenedor > form.pila > :nth-child(2) { --i: 1; }
.contenedor > :nth-child(3), .contenedor > form.pila > :nth-child(3) { --i: 2; }
.contenedor > :nth-child(4), .contenedor > form.pila > :nth-child(4) { --i: 3; }
.contenedor > :nth-child(5), .contenedor > form.pila > :nth-child(5) { --i: 4; }
.contenedor > :nth-child(n+6), .contenedor > form.pila > :nth-child(n+6) { --i: 5; }
.contenedor > section[id^="paso"] { --i: 0; }              /* los pasos de Unirme entran sin demora */
.appbar::after { animation: extender var(--mov-lento) var(--ease-salida) backwards; }   /* la línea morada de la barra se extiende */
/* Utilidad para listas: JS le pone la clase y el índice (style="--i:n") solo cuando corresponde animar */
.anim-entra { animation: entrar var(--mov-medio) var(--ease-salida) backwards; animation-delay: calc(var(--i, 0) * 40ms); }

/* ---------- Hover, pulsación y ondas ---------- */
/* Elementos "tocables": posición relativa + recorte para que la onda no se salga */
.btn, .btn-icono, .opcion, .chip, .pestana, .select__opcion, .menu-flotante__item, .grupo-item, .ajuste-fila, .btn-enviar, .emoji, .adjuntar-menu button { position: relative; overflow: hidden; }
.btn-icono.campo__ojo, .buscador__limpiar { position: absolute; }
/* Onda que nace en el punto donde se toca (la crea comun.js); usa el color del texto del propio elemento */
.onda { position: absolute; border-radius: 50%; background: currentColor; opacity: .28; transform: scale(0); pointer-events: none; animation: onda var(--mov-lento) var(--ease-salida) forwards; }

.btn, .btn-icono, .chip, .opcion, .pestana, .grupo-item, .ajuste-fila, .btn-enviar, .miembro, .menu-flotante__item, .emoji {
  transition: transform var(--mov-rapido) var(--ease-suave), background-color var(--mov-rapido) var(--ease-suave), border-color var(--mov-rapido) var(--ease-suave), box-shadow var(--mov-rapido) var(--ease-suave), color var(--mov-rapido) var(--ease-suave), filter var(--mov-rapido) var(--ease-suave);
}
.btn:hover:not(:disabled) { transform: translateY(-1px); }
.btn:active:not(:disabled) { transform: translateY(0) scale(.97); }
.btn--primario:hover:not(:disabled) { box-shadow: var(--sombra-morado-fuerte); }
.btn-icono:hover { transform: scale(1.08); }
.btn-icono:active { transform: scale(.92); }
.chip:hover, .pestana:hover:not(.pestana--activa) { transform: translateY(-1px); }
.chip:active, .opcion:active, .pestana:active, .ajuste-fila:active { transform: scale(.97); }
.grupo-item:hover { transform: translateX(3px); }
.grupo-item:active { transform: scale(.985); }
.btn-enviar:hover { transform: translateY(-1px) scale(1.06); box-shadow: var(--sombra-morado-fuerte); }
.btn-enviar:active { transform: scale(.92); }
.emoji:hover { transform: scale(1.25); }
.emoji:active { transform: scale(.9); }
.miembro { margin: 0 -8px; padding: 10px 8px; border-radius: var(--radio-md); }
.miembro:hover { background: var(--color-morado-suave); }
.menu-flotante__item:hover { padding-left: 18px; }

/* Iconos: cada uno reacciona a su botón */
.material-symbols-rounded { transition: transform var(--mov-medio) var(--ease-rebote); }
.btn:hover .material-symbols-rounded { transform: scale(1.14); }
[aria-label="Ajustes"]:hover .material-symbols-rounded { transform: rotate(60deg); }
[aria-label^="Volver"]:hover .material-symbols-rounded { transform: translateX(-3px); }
.btn-enviar:hover .material-symbols-rounded { transform: translateX(2px) rotate(-10deg); }
[aria-label^="Grabar"]:hover .material-symbols-rounded { transform: scale(1.2); }
.grupo-item:hover > .material-symbols-rounded:last-child, .ajuste-fila:hover > .material-symbols-rounded:last-child { transform: translateX(4px); }
.opcion:hover > .material-symbols-rounded { transform: scale(1.15) rotate(-6deg); }
.campo__ojo:hover .material-symbols-rounded { transform: scale(1.15); }
.adjuntar-menu button:hover .material-symbols-rounded { transform: translateY(-3px) scale(1.06); }

/* Tarjetas HUD: los corchetes de las esquinas se abren al pasar el mouse */
.tarjeta::before, .tarjeta::after, .modal::before, .modal::after { transition: width var(--mov-medio) var(--ease-salida), height var(--mov-medio) var(--ease-salida); }
.tarjeta:hover::before, .tarjeta:hover::after { width: 26px; height: 26px; }

/* Campos: la etiqueta se ilumina al enfocar */
.campo__etiqueta { transition: color var(--mov-rapido) var(--ease-suave); }
.campo:focus-within .campo__etiqueta { color: var(--color-morado-claro); }
.caja-codigo { transition: transform var(--mov-rapido) var(--ease-suave), border-color var(--mov-rapido) var(--ease-suave), box-shadow var(--mov-rapido) var(--ease-suave); }
.caja-codigo:focus { transform: translateY(-2px); }
.caja-codigo:not(:placeholder-shown) { animation: pop var(--mov-rapido) var(--ease-rebote); border-color: var(--color-morado-borde); }   /* el dígito escrito "salta" */

/* ---------- Selección (chips, opciones, pestañas, tema) ---------- */
.chip--activo, .opcion--activa, .pestana--activa { animation: seleccion var(--mov-medio) var(--ease-rebote); }

/* ---------- Errores y avisos en línea ---------- */
.efecto-sacudir { animation: sacudir 420ms var(--ease-suave); }                     /* validación fallida (mensaje y tarjeta) */
.efecto-pop { animation: pop var(--mov-medio) var(--ease-rebote); }                 /* confirmación correcta */
.aviso:not([hidden]) { animation: entrar var(--mov-medio) var(--ease-salida) backwards; }

/* ---------- Modales, menús, paneles y avisos flotantes ---------- */
.modal-fondo { animation: aparecer var(--mov-rapido) var(--ease-suave) both; }
.modal { animation: modal-entra var(--mov-medio) var(--ease-salida) backwards; }
@media (min-width: 600px) { .modal { animation-name: modal-entra-centro; } }
.modal-fondo--salir { animation: desvanecer var(--mov-rapido) var(--ease-entrada) forwards; }              /* comun.js quita el modal al terminar */
.modal-fondo--salir .modal { animation: modal-sale var(--mov-rapido) var(--ease-entrada) forwards; }
.menu-flotante { transform-origin: top right; animation: menu-entra var(--mov-rapido) var(--ease-salida) backwards; }
.emoji-panel:not([hidden]), .grabando:not([hidden]) { animation: panel-sube var(--mov-medio) var(--ease-salida) backwards; }
.adjuntar-menu:not([hidden]) { animation: panel-sube var(--mov-medio) var(--ease-salida) backwards; }
.adjuntar-menu:not([hidden]) button { animation: pop var(--mov-medio) var(--ease-rebote) backwards; animation-delay: calc(var(--i, 0) * 45ms); }
.adjuntar-menu button:nth-child(2) { --i: 1; } .adjuntar-menu button:nth-child(3) { --i: 2; } .adjuntar-menu button:nth-child(4) { --i: 3; }
.toast { animation: toast-entra var(--mov-medio) var(--ease-rebote) backwards, toast-sale var(--mov-medio) var(--ease-entrada) 2.8s forwards; }
.bloqueo { animation: aparecer var(--mov-medio) var(--ease-suave) backwards; }
.bloqueo .material-symbols-rounded { animation: pop var(--mov-lento) var(--ease-rebote) 120ms backwards; }

/* ---------- Chat ---------- */
/* Mensajes nuevos: los propios entran desde la derecha y los ajenos desde la izquierda (chat.js pone .nuevo) */
.fila.nuevo.fila--propia { transform-origin: bottom right; animation: entrar-derecha var(--mov-medio) var(--ease-salida) backwards; }
.fila.nuevo.fila--otra { transform-origin: bottom left; animation: entrar-izquierda var(--mov-medio) var(--ease-salida) backwards; }
.sistema.nuevo, .fecha-sep.nuevo { animation: aparecer var(--mov-medio) var(--ease-suave) backwards; }
.fila--transformada .burbuja { animation: destello var(--mov-lento) var(--ease-salida); }             /* mensaje recién eliminado */
.medio--imagen { transition: transform var(--mov-medio) var(--ease-salida); }
.medio--imagen:hover { transform: scale(1.03); }
.btn-enviar:not([hidden]) { animation: pop var(--mov-medio) var(--ease-rebote) backwards; }          /* alterna enviar / micrófono */
.burbuja__menu { transition: opacity var(--mov-rapido) var(--ease-suave), transform var(--mov-rapido) var(--ease-suave); }
.burbuja__menu:hover { transform: scale(1.12); }
/* Ecualizador mientras se graba una nota de voz */
.onda-grab { display: inline-flex; align-items: center; gap: 3px; height: 24px; }
.onda-grab i { display: block; width: 3px; height: 100%; border-radius: 2px; background: var(--color-morado-claro); animation: ecualizador 900ms ease-in-out infinite; animation-delay: calc(var(--i, 0) * 110ms); }

/* ---------- Cámara y escáner ---------- */
.visor--flash::after { content: ''; position: absolute; inset: 0; background: var(--color-blanco); pointer-events: none; animation: flash var(--mov-lento) ease-out forwards; }   /* destello al sacar la foto */
.visor img:not([hidden]) { animation: pop var(--mov-medio) var(--ease-rebote); }
.visor--escaneo .visor__marco::after { content: ''; position: absolute; left: 0; right: 0; top: 0; height: 2px; background: var(--color-morado-claro); box-shadow: var(--sombra-morado); animation: escanear 2s ease-in-out infinite alternate; }   /* línea que recorre el marco */
.previa--anim > * { animation: entrar var(--mov-medio) var(--ease-salida) backwards; animation-delay: calc(var(--i, 0) * 50ms); }
.previa--anim > :nth-child(2) { --i: 1; } .previa--anim > :nth-child(3) { --i: 2; } .previa--anim > :nth-child(4) { --i: 3; } .previa--anim > :nth-child(n+5) { --i: 4; }
.previa--anim > .avatar { animation-name: pop; animation-timing-function: var(--ease-rebote); }

/* ---------- Tiempo del grupo ---------- */
.progreso__barra { animation: llenar 900ms var(--ease-salida) backwards; }                            /* la barra se llena al abrir Info */
.reloj.urgencia--error, .tiempo.urgencia--error, .chat__estado.urgencia--error { animation: pulso 1.2s ease-in-out infinite; }   /* menos de 5 minutos */

/* Colores de urgencia sobre el reloj y el estado del chat (más específicos que sus colores base) */
.reloj.urgencia--aviso, .chat__estado.urgencia--aviso { color: var(--color-warning-texto); }
.reloj.urgencia--error, .chat__estado.urgencia--error { color: var(--color-error-texto); }

/* ---------- Animaciones reducidas: lo decide tema.js (Ajustes > Animaciones, o el sistema en modo Automático) ---------- */
:root[data-movimiento="reducido"] *, :root[data-movimiento="reducido"] *::before, :root[data-movimiento="reducido"] *::after { animation: none !important; transition: none !important; scroll-behavior: auto !important; }
:root[data-movimiento="reducido"]::view-transition-group(*), :root[data-movimiento="reducido"]::view-transition-old(*), :root[data-movimiento="reducido"]::view-transition-new(*) { animation: none !important; }

/* ============================================================
   ELEMENTOS DEL SISTEMA CON LA ESTÉTICA DE ÉLIX (v4)
   Barras de desplazamiento, selección de texto, cursor, autocompletado, listas desplegables,
   números, buscadores, reproductores de audio/video y barras de progreso.
   ============================================================ */
:root { accent-color: var(--color-morado); }
html { -webkit-tap-highlight-color: transparent; }
/* Barras de desplazamiento finas, del color de la app (Firefox/Chrome nuevos: scrollbar-*; Chrome/Safari: ::-webkit-scrollbar) */
* { scrollbar-width: thin; scrollbar-color: var(--color-morado-borde) transparent; }
::-webkit-scrollbar { width: 8px; height: 8px; }
::-webkit-scrollbar-track, ::-webkit-scrollbar-corner { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--color-morado-borde); border-radius: 8px; border: 2px solid transparent; background-clip: padding-box; }
::-webkit-scrollbar-thumb:hover { background: var(--color-morado); background-clip: padding-box; }
::-webkit-scrollbar-button { display: none; }                /* sin flechas de las barras clásicas */
::selection { background: var(--color-morado-borde); color: var(--color-texto); }
input, textarea { caret-color: var(--color-morado-claro); }
::placeholder { color: var(--color-texto-suave); opacity: .75; }
/* Autocompletado del navegador (fondo amarillo/azul por defecto) con los colores de la app */
input:-webkit-autofill, input:-webkit-autofill:hover, input:-webkit-autofill:focus, textarea:-webkit-autofill {
  -webkit-text-fill-color: var(--color-texto); caret-color: var(--color-morado-claro);
  box-shadow: 0 0 0 1000px var(--color-fondo) inset; transition: background-color 9999s ease-out;
}
/* Números sin flechitas del navegador; buscadores sin la "x" nativa (ÉLIX pone la suya) */
input[type="number"] { -moz-appearance: textfield; appearance: textfield; }
input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }
input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-results-button { -webkit-appearance: none; appearance: none; display: none; }
.buscador__limpiar { right: 4px; top: 50%; transform: translateY(-50%); width: 36px; height: 36px; border-radius: var(--radio-sm); display: flex; align-items: center; justify-content: center; color: var(--color-texto-suave); }
.buscador__limpiar:hover { color: var(--color-morado-claro); background: var(--color-morado-suave); }
.buscador__limpiar .material-symbols-rounded { position: static; transform: none; font-size: 20px; color: inherit; }

/* ---------- Lista desplegable propia (reemplaza al <select> nativo) ---------- */
.select { position: relative; }
.select__nativo { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; overflow: hidden; }
.select__boton { width: 100%; display: flex; align-items: center; justify-content: space-between; gap: 8px; background: var(--color-fondo); border: 1px solid var(--color-gris); border-radius: var(--radio-md); padding: 12px 14px; font-size: 16px; text-align: left; color: var(--color-texto); transition: border-color var(--mov-rapido) var(--ease-suave), box-shadow var(--mov-rapido) var(--ease-suave); }
.select__boton:hover { border-color: var(--color-morado-borde); }
.select__boton:focus-visible, .select__boton[aria-expanded="true"] { border-color: var(--color-morado); box-shadow: var(--sombra-morado); outline: none; }
.select__flecha { color: var(--color-morado-claro); transition: transform var(--mov-medio) var(--ease-rebote); }
.select__boton[aria-expanded="true"] .select__flecha { transform: rotate(180deg); }
.select__lista { position: fixed; z-index: 150; overflow-y: auto; overscroll-behavior: contain; padding: 4px; background: var(--color-tarjeta-2); border: 1px solid var(--color-morado-borde); border-radius: var(--radio-md); box-shadow: var(--sombra-tarjeta), var(--sombra-morado); animation: menu-entra var(--mov-rapido) var(--ease-salida) backwards; }
.select__opcion { display: flex; align-items: center; justify-content: space-between; gap: 8px; width: 100%; padding: 12px; border-radius: var(--radio-sm); font-size: 15px; text-align: left; color: var(--color-texto); transition: background-color var(--mov-rapido) var(--ease-suave), color var(--mov-rapido) var(--ease-suave); }
.select__opcion:hover, .select__opcion--foco { background: var(--color-morado-suave); }
.select__opcion--activa { color: var(--color-morado-claro); font-weight: 700; }
.select__opcion .material-symbols-rounded { font-size: 20px; }

/* ---------- Barras de progreso deslizables (reproductores) ---------- */
.rep__barra { -webkit-appearance: none; appearance: none; width: 100%; height: 18px; margin: 0; background: transparent; cursor: pointer; color: inherit; }
.rep__barra::-webkit-slider-runnable-track { height: 4px; border-radius: 2px; background: linear-gradient(to right, currentColor var(--pct, 0%), color-mix(in srgb, currentColor 28%, transparent) var(--pct, 0%)); }
.rep__barra::-webkit-slider-thumb { -webkit-appearance: none; width: 12px; height: 12px; margin-top: -4px; border-radius: 50%; background: currentColor; border: none; transition: transform var(--mov-rapido) var(--ease-rebote); }
.rep__barra:hover::-webkit-slider-thumb, .rep__barra:active::-webkit-slider-thumb { transform: scale(1.35); }
.rep__barra::-moz-range-track { height: 4px; border-radius: 2px; background: color-mix(in srgb, currentColor 28%, transparent); }
.rep__barra::-moz-range-progress { height: 4px; border-radius: 2px; background: currentColor; }
.rep__barra::-moz-range-thumb { width: 12px; height: 12px; border-radius: 50%; background: currentColor; border: none; }
.rep__barra:focus-visible { outline: 2px solid var(--color-morado-claro); outline-offset: 3px; border-radius: 4px; }
/* Audio */
.rep { display: flex; align-items: center; gap: 10px; width: 250px; max-width: 100%; }
.rep__btn { width: 42px; height: 42px; flex-shrink: 0; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: var(--gradiente-principal); color: var(--color-blanco); transition: transform var(--mov-rapido) var(--ease-rebote); }
.fila--propia .rep__btn { background: color-mix(in srgb, var(--color-blanco) 26%, transparent); }
.rep__btn:hover { transform: scale(1.08); } .rep__btn:active { transform: scale(.92); }
.rep__centro { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.rep__pie { display: flex; align-items: center; justify-content: space-between; }
.rep__tiempo { font-family: var(--fuente-hud); font-size: 12px; opacity: .85; }
.rep__vel { font-family: var(--fuente-titulo); font-size: 11px; font-weight: 700; padding: 1px 7px; border-radius: var(--radio-sm); border: 1px solid currentColor; opacity: .8; }
/* Video */
.rep-video { position: relative; width: 100%; max-width: 280px; border-radius: var(--radio-md); overflow: hidden; background: var(--color-negro); color: var(--color-blanco); margin-bottom: 4px; }
.rep-video video { display: block; width: 100%; max-height: 60dvh; object-fit: contain; background: var(--color-negro); cursor: pointer; }
.rep-video__grande { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; }
.rep-video__circulo { width: 56px; height: 56px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: color-mix(in srgb, var(--color-negro) 55%, transparent); border: 2px solid var(--color-blanco); transition: transform var(--mov-medio) var(--ease-rebote); }
.rep-video__circulo .material-symbols-rounded { font-size: 34px; }
.rep-video__grande:hover .rep-video__circulo { transform: scale(1.12); }
.rep-video__controles { position: absolute; left: 0; right: 0; bottom: 0; display: flex; align-items: center; gap: 2px; padding: 4px 6px; background: linear-gradient(transparent, color-mix(in srgb, var(--color-negro) 78%, transparent)); transition: opacity var(--mov-medio) var(--ease-suave); }
.rep-video__controles .btn-icono { width: 34px; height: 34px; color: var(--color-blanco); }
.rep-video__controles .btn-icono .material-symbols-rounded { font-size: 22px; }
.rep-video__controles .rep__barra { flex: 1; min-width: 40px; }
.rep-video--oculto .rep-video__controles { opacity: 0; pointer-events: none; }
.rep-video:fullscreen { max-width: none; border-radius: 0; display: flex; align-items: center; }
.rep-video:fullscreen video { max-height: 100dvh; height: 100%; }

/* ---------- Selector de emojis ---------- */
.emoji-panel { position: absolute; bottom: 100%; left: 0; right: 0; height: min(360px, 48dvh); display: flex; flex-direction: column; background: var(--color-tarjeta); border-top: 1px solid var(--color-gris); box-shadow: var(--sombra-tarjeta); }
.emoji-panel__cab { position: relative; display: flex; align-items: center; gap: 6px; padding: 8px 8px 4px; }
.emoji-tono { font-size: 20px; }
.emoji-tonos { position: absolute; right: 8px; top: calc(100% - 2px); z-index: 3; display: flex; gap: 2px; padding: 4px; background: var(--color-tarjeta-2); border: 1px solid var(--color-morado-borde); border-radius: var(--radio-md); box-shadow: var(--sombra-tarjeta); animation: menu-entra var(--mov-rapido) var(--ease-salida) backwards; }
.emoji-tonos .btn-icono { font-size: 20px; }
.emoji-tonos__activo { background: var(--color-morado-suave); box-shadow: inset 0 0 0 1px var(--color-morado); }
.emoji-panel__cats { display: flex; gap: 2px; padding: 0 8px; overflow-x: auto; flex-shrink: 0; scrollbar-width: none; border-bottom: 1px solid var(--color-gris); }
.emoji-panel__cats::-webkit-scrollbar { display: none; }
.emoji-panel__cats .emoji-cat { flex: 1 0 40px; width: auto; min-width: 40px; color: var(--color-texto-suave); border-radius: var(--radio-sm) var(--radio-sm) 0 0; }   /* se reparten el ancho: caben las 9 en un celular */
.emoji-cat--activa { color: var(--color-morado-claro); background: var(--color-morado-suave); box-shadow: inset 0 -2px 0 var(--color-morado); }
.emoji-panel__lista { position: relative; flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: 0 8px 8px; }
.emoji-seccion__titulo { position: sticky; top: 0; z-index: 1; background: var(--color-tarjeta); padding: 8px 4px 4px; font-family: var(--fuente-titulo); font-size: 12px; font-weight: 700; color: var(--color-texto-suave); }
.emoji-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(var(--emoji-ancho), 1fr)); }   /* v1.9.0: el ancho sale de --emoji-ancho (selector-emojis.js lo lee para calcular las alturas) */
.emoji { display: flex; align-items: center; justify-content: center; height: var(--emoji-alto); font-size: 26px; line-height: 1; border-radius: var(--radio-sm); }
.emoji:hover { background: var(--color-morado-suave); }

/* ---------- Foto de perfil editable ---------- */
.avatar-editable { position: relative; display: inline-flex; }
.avatar-editable__cam { position: absolute; right: -4px; bottom: -4px; width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: var(--gradiente-principal); color: var(--color-blanco); border: 3px solid var(--color-tarjeta); box-shadow: var(--sombra-morado); transition: transform var(--mov-rapido) var(--ease-rebote); }
.avatar-editable__cam:hover { transform: scale(1.1); }
.avatar-editable__cam .material-symbols-rounded { font-size: 20px; }
.mi-perfil { display: flex; align-items: center; gap: 14px; }
.mi-perfil__datos { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 6px; }

/* ---------- Modal: sin barras de desplazamiento propias; solo el cuerpo se desplaza si hace falta ---------- */
.modal { overflow: hidden; max-height: min(92dvh, 720px); }
.modal::before { top: 0; left: 0; } .modal::after { bottom: 0; right: 0; }     /* los corchetes quedan adentro: ya no crean desborde */
.modal__cabecera, .modal__acciones { flex-shrink: 0; }
.modal__cuerpo { flex: 1 1 auto; min-height: 0; overflow-y: auto; overflow-x: hidden; overscroll-behavior: contain; }
.modal__cuerpo > * { min-width: 0; }
.pestanas .pestana { min-width: 0; }
.pestana span:not(.material-symbols-rounded) { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ============================================================
   RESPONSIVE (v4) — pensado primero para celulares
   Estrategia: la base ya es de una columna para móvil; se agregan ajustes para pantallas muy chicas,
   pantallas táctiles (objetivos de 44 px), celulares horizontales, tablets y escritorio.
   ============================================================ */
/* Sin scroll horizontal accidental, textos largos que se parten y sin zoom por doble toque */
html, body { max-width: 100%; }
body { overflow-wrap: anywhere; }
button, a, label, .btn, summary { touch-action: manipulation; }
button, .btn, .chip, .pestana { -webkit-user-select: none; user-select: none; }
img, video, canvas, svg { max-width: 100%; }
/* Casillas del código: se reparten el ancho disponible (caben en 320 px) */
.cajas-codigo { gap: clamp(4px, 1.8vw, 8px); }
.caja-codigo { flex: 1 1 0; min-width: 0; width: auto; max-width: 52px; height: clamp(50px, 14vw, 58px); font-size: clamp(20px, 6vw, 26px); }
.codigo-grande { font-size: clamp(26px, 9vw, 38px); }
.previa__nombre { font-size: clamp(21px, 6.5vw, 26px); }
.reloj { font-size: clamp(30px, 10vw, 38px); }
.fila { max-width: min(86%, 560px); }

/* Pantallas muy chicas (iPhone SE, Android compactos) */
@media (max-width: 360px) {
  .logo { font-size: 52px; }
  .contenedor { padding-top: 14px; }
  .tarjeta { padding: 16px; }
  .btn { padding-inline: 14px; }
  .pestana { font-size: 12px; padding-inline: 4px; }
  .pestana .material-symbols-rounded { display: none; }
  .fila-2 { gap: 8px; }
  .modal { padding: 14px; }
}
/* Selectores de opciones (Ajustes): en pantallas angostas solo texto, para que no se corten los nombres */
@media (max-width: 420px) { .pestanas[role="radiogroup"] .pestana .material-symbols-rounded { display: none; } }
/* Celulares: el chat ocupa toda la pantalla, sin bordes laterales */
@media (max-width: 640px) {
  .chat { border-left: none; border-right: none; }
  .fila { max-width: 92%; }
  .modal { border-radius: var(--radio-lg) var(--radio-lg) 0 0; padding-bottom: calc(18px + env(safe-area-inset-bottom)); }
  .aviso { font-size: 13px; }
}
/* Pantallas táctiles: objetivos de al menos 44 px y sin efectos que quedan "pegados" al tocar */
@media (pointer: coarse) {
  .btn { min-height: 48px; }
  .btn-icono { width: 44px; height: 44px; }
  .appbar__espacio { min-width: 44px; height: 44px; }   /* v1.5.0: min-width para que quepan foto de cuenta + engranaje */
  .chip { min-height: 44px; padding-inline: 16px; }
  .pestana { min-height: 44px; }
  .select__boton, .campo__entrada { min-height: 48px; }
  .select__opcion, .menu-flotante__item { min-height: 48px; }
  .btn-enviar { width: 48px; height: 48px; }
  .adjuntar-menu button { min-width: 68px; }
  .burbuja__menu { display: none; }                     /* en el celular el menú del mensaje se abre manteniéndolo presionado */
  .fila--propia .burbuja, .fila--otra .burbuja { -webkit-touch-callout: none; -webkit-user-select: none; user-select: none; }
}
@media (hover: none) {
  .btn:hover:not(:disabled), .btn-icono:hover, .chip:hover, .pestana:hover:not(.pestana--activa), .grupo-item:hover, .btn-enviar:hover, .emoji:hover, .medio--imagen:hover, .rep__btn:hover { transform: none; }
  .btn:hover .material-symbols-rounded, .opcion:hover > .material-symbols-rounded, .adjuntar-menu button:hover .material-symbols-rounded, [aria-label="Ajustes"]:hover .material-symbols-rounded, [aria-label^="Volver"]:hover .material-symbols-rounded { transform: none; }
  .tarjeta:hover::before, .tarjeta:hover::after { width: 16px; height: 16px; }
  .btn--primario:hover:not(:disabled), .btn-enviar:hover { box-shadow: var(--sombra-morado); }
}
/* Celular acostado: poco alto disponible */
@media (max-height: 520px) and (orientation: landscape) {
  .hero { padding-top: 4px; }
  .logo { font-size: 44px; }
  .icono-titulo .material-symbols-rounded { font-size: 52px; }
  .contenedor { padding-top: 12px; padding-bottom: 20px; }
  .modal { max-height: 96dvh; }
  .emoji-panel { height: 60dvh; }
  .visor { max-width: 200px; }
}
/* Tablets */
@media (min-width: 768px) { :root { --ancho-contenedor: 600px; } .logo { font-size: 84px; } .contenedor { padding-top: 32px; } }
/* Escritorio */
@media (min-width: 1100px) { :root { --ancho-contenedor: 640px; } }

/* ============================================================
   AYUDA FLOTANTE DE RANGOS (Big Admin / Admin / Persist)
   Cuadro que aparece junto a la insignia al pasar el mouse, enfocarla o tocarla.
   ============================================================ */
.insignia--ayuda { cursor: help; border: 1px solid transparent; transition: border-color var(--mov-rapido) var(--ease-suave), box-shadow var(--mov-rapido) var(--ease-suave); }
.insignia--ayuda:hover, .insignia--ayuda[aria-expanded="true"] { border-color: currentColor; }
.insignia--ayuda:focus-visible { outline: 2px solid var(--color-morado-claro); outline-offset: 2px; }
/* Área de toque ampliada (~45 px de alto) sin cambiar cómo se ve la insignia: es un botón pequeño y en el celular costaría acertarle */
.insignia--ayuda { position: relative; }
.insignia--ayuda::after { content: ''; position: absolute; inset: -11px -3px; }
.ayuda { position: fixed; z-index: 170; width: max-content; max-width: min(290px, calc(100vw - 16px)); padding: 12px 14px; display: flex; flex-direction: column; gap: 6px; background: var(--color-tarjeta-2); border: 1px solid var(--color-morado-borde); border-radius: var(--radio-md); box-shadow: var(--sombra-tarjeta), var(--sombra-morado); pointer-events: none; animation: menu-entra var(--mov-rapido) var(--ease-salida) backwards; }
.ayuda::after { content: ''; position: absolute; left: var(--flecha-x, 50%); width: 10px; height: 10px; background: var(--color-tarjeta-2); border: 1px solid var(--color-morado-borde); transform: translateX(-50%) rotate(45deg); }   /* flecha hacia la insignia */
.ayuda--arriba::after { bottom: -6px; border-top: none; border-left: none; }
.ayuda--abajo::after { top: -6px; border-bottom: none; border-right: none; }
.ayuda--sinflecha::after { display: none; }                /* pantalla baja: el cuadro no apunta a la insignia, solo se ve completo */
.ayuda__titulo { display: flex; align-items: center; gap: 6px; font-family: var(--fuente-titulo); font-size: 15px; font-weight: 700; color: var(--color-morado-claro); }
.ayuda__titulo .material-symbols-rounded { font-size: 18px; }
.ayuda__texto { margin: 0; font-size: 13px; line-height: 1.4; }
.ayuda__etiqueta { margin-top: 2px; font-family: var(--fuente-titulo); font-size: 11px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--color-texto-suave); }
.ayuda__lista { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 3px; font-size: 13px; line-height: 1.35; }
.ayuda__lista li { position: relative; padding-left: 14px; }
.ayuda__lista li::before { content: ''; position: absolute; left: 2px; top: 0.55em; width: 5px; height: 5px; border-radius: 50%; background: var(--color-morado); }
.ayuda__nota { margin: 2px 0 0; padding-top: 6px; border-top: 1px solid var(--color-gris); font-size: 12px; line-height: 1.4; color: var(--color-texto-suave); }
.ayuda--exito .ayuda__titulo { color: var(--color-success-texto); }
.ayuda--exito .ayuda__lista li::before { background: var(--color-success); }

/* ============================================================
   NOVEDADES v1.4.0: formato de texto, respuestas, reacciones, encuestas, votación de expulsión,
   mensajes de 1 vez, "escribiendo…", mensajes eliminados y foto de grupo
   ============================================================ */

/* ---------- Cuadro de escritura: la barra de desplazamiento solo aparece cuando el texto ya no entra (chat.js activa overflow-y) ---------- */
.entrada__texto { overflow-y: hidden; }

/* ---------- Formato de texto en mensajes y descripciones ---------- */
code { font-family: var(--fuente-codigo); font-size: 1.05em; padding: 0 0.3em; border-radius: 4px; background: color-mix(in srgb, currentColor 14%, transparent); }
.txt-color--morado { color: var(--color-morado-claro); }
.txt-color--rojo { color: var(--color-error-texto); }
.txt-color--naranja { color: var(--color-naranja-texto); }
.txt-color--amarillo { color: var(--color-warning-texto); }
.txt-color--verde { color: var(--color-success-texto); }
.txt-color--cian { color: var(--color-cian-texto); }
.txt-color--azul { color: var(--color-info-texto); }
.txt-color--rosa { color: var(--color-rosa-texto); }

/* Barra flotante que aparece al seleccionar texto (negrita, cursiva, tachado, código y —en descripciones— colores) */
.formato-contenedor { position: relative; }
.formato-barra { position: absolute; left: 50%; bottom: calc(100% + 6px); transform: translateX(-50%); z-index: 60; display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 4px; background: var(--color-tarjeta-2); border: 1px solid var(--color-morado-borde); border-radius: var(--radio-lg); box-shadow: var(--sombra-tarjeta), var(--sombra-morado); animation: menu-entra var(--mov-rapido) var(--ease-salida) backwards; }
.formato-barra[hidden], .formato-paleta[hidden] { display: none; }
.formato-barra__fila { display: flex; gap: 2px; }
.formato-btn { width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: var(--color-texto); transition: background-color var(--mov-rapido) var(--ease-suave), color var(--mov-rapido) var(--ease-suave); }
.formato-btn:hover { background: var(--color-morado-suave); color: var(--color-morado-claro); }
.formato-paleta { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; padding: 4px 8px 8px; max-width: 200px; }
.formato-punto { width: 26px; height: 26px; border-radius: 50%; border: 2px solid var(--color-tarjeta-2); box-shadow: 0 0 0 1px var(--color-gris); display: flex; align-items: center; justify-content: center; }
.formato-punto .material-symbols-rounded { font-size: 16px; color: var(--color-texto-suave); }
.formato-punto--morado { background: var(--color-morado-claro); } .formato-punto--rojo { background: var(--color-error-texto); }
.formato-punto--naranja { background: var(--color-naranja-texto); } .formato-punto--amarillo { background: var(--color-warning-texto); }
.formato-punto--verde { background: var(--color-success-texto); } .formato-punto--cian { background: var(--color-cian-texto); }
.formato-punto--azul { background: var(--color-info-texto); } .formato-punto--rosa { background: var(--color-rosa-texto); }
.vista-previa { border: 1px dashed var(--color-gris); border-radius: var(--radio-md); padding: 10px 12px; white-space: pre-wrap; overflow-wrap: anywhere; font-size: 14px; }
.vista-previa__etiqueta { font-family: var(--fuente-hud); font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--color-texto-suave); }

/* ---------- Responder a un mensaje ---------- */
.burbuja { touch-action: pan-y; }                          /* permite deslizar hacia la derecha para responder sin bloquear el scroll vertical */
.cita { display: block; width: 100%; text-align: left; color: inherit; cursor: pointer; margin-bottom: 6px; padding: 5px 8px; border-left: 3px solid var(--color-morado); border-radius: var(--radio-sm); background: var(--color-velo-suave); }
.fila--propia .cita { border-left-color: var(--color-blanco); background: color-mix(in srgb, var(--color-negro) 22%, transparent); }
.cita__autor { display: block; font-family: var(--fuente-titulo); font-size: 12px; font-weight: 700; color: var(--color-morado-claro); }
.fila--propia .cita__autor { color: var(--color-blanco); }
.cita__texto { display: flex; align-items: center; gap: 4px; font-size: 13px; opacity: .88; overflow: hidden; }
.cita__texto span:not(.material-symbols-rounded) { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cita__texto .material-symbols-rounded { font-size: 16px; flex-shrink: 0; }
.respuesta-barra { display: flex; align-items: center; gap: 8px; padding: 8px 10px 0; }
.respuesta-barra .cita { flex: 1; min-width: 0; margin: 0; cursor: default; }
.aviso-envio { display: flex; align-items: center; gap: 8px; padding: 6px 12px 0; font-size: 13px; color: var(--color-morado-claro); }
.aviso-envio .material-symbols-rounded { font-size: 18px; }
.fila { position: relative; }
.fila__responder { position: absolute; left: -38px; top: 50%; margin-top: -14px; width: 28px; height: 28px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: var(--color-morado-suave); color: var(--color-morado-claro); opacity: var(--prog, 0); transform: scale(calc(0.5 + var(--prog, 0) * 0.5)); pointer-events: none; }
.fila--resaltada .burbuja { animation: resaltar-mensaje 1.4s var(--ease-suave); }
@keyframes resaltar-mensaje { 0%, 40% { box-shadow: 0 0 0 3px var(--color-morado-claro), 0 0 18px var(--color-halo); } 100% { box-shadow: 0 0 0 0 transparent; } }

/* ---------- Reacciones ---------- */
.reacciones { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; }
.reaccion { display: inline-flex; align-items: center; gap: 3px; padding: 1px 8px; min-height: 26px; border-radius: 999px; background: var(--color-velo-suave); border: 1px solid transparent; font-size: 14px; color: inherit; transition: transform var(--mov-rapido) var(--ease-rebote); }
.reaccion span { font-family: var(--fuente-hud); font-size: 12px; }
.reaccion:hover { transform: scale(1.08); }
.reaccion--mia { border-color: var(--color-morado-claro); background: var(--color-morado-suave); }
.fila--propia .reaccion--mia { border-color: var(--color-blanco); background: color-mix(in srgb, var(--color-negro) 25%, transparent); }
.reacciones-rapidas { display: flex; gap: 2px; padding: 6px 8px; border-bottom: 1px solid var(--color-gris); }
.reaccion-rapida { width: 40px; height: 40px; border-radius: 50%; font-size: 24px; line-height: 1; display: flex; align-items: center; justify-content: center; transition: transform var(--mov-rapido) var(--ease-rebote), background-color var(--mov-rapido); }
.reaccion-rapida:hover { transform: scale(1.25); background: var(--color-morado-suave); }
.reaccion-rapida--mia { background: var(--color-morado-suave); box-shadow: inset 0 0 0 1px var(--color-morado); }
.reaccion-rapida .material-symbols-rounded { font-size: 22px; color: var(--color-texto-suave); }
.emoji-panel--modal { position: static; height: min(360px, 55dvh); border: 1px solid var(--color-gris); border-radius: var(--radio-md); box-shadow: none; }
.lista-reacciones { display: flex; flex-direction: column; gap: 4px; }
.lista-reacciones__fila { display: flex; align-items: center; gap: 10px; padding: 6px 4px; border-radius: var(--radio-sm); text-align: left; width: 100%; }
.lista-reacciones__fila span.emo { margin-left: auto; font-size: 22px; }

/* ---------- Encuestas ---------- */
.burbuja--tarjeta { min-width: min(270px, calc(100vw - 104px)); }   /* las tarjetas (encuesta/votación) nunca se pasan del borde en pantallas angostas */
.encuesta { display: flex; flex-direction: column; gap: 6px; }
.encuesta__cab { display: flex; align-items: flex-start; gap: 6px; font-weight: 700; font-size: 15px; }
.encuesta__cab .material-symbols-rounded { font-size: 20px; margin-top: 1px; }
.encuesta__tipo { font-size: 12px; opacity: .75; }
.encuesta__opcion { position: relative; display: flex; align-items: center; gap: 8px; width: 100%; padding: 8px 10px 10px; text-align: left; color: inherit; border: 1px solid transparent; border-radius: var(--radio-sm); background: var(--color-velo-suave); overflow: hidden; }
.encuesta__opcion--mia { border-color: currentColor; }
.encuesta__opcion .material-symbols-rounded { font-size: 20px; flex-shrink: 0; }
.encuesta__texto { flex: 1; min-width: 0; font-size: 14px; }
.encuesta__cuenta { font-family: var(--fuente-hud); font-size: 13px; }
.encuesta__barra { position: absolute; left: 0; bottom: 0; height: 3px; width: var(--pct, 0%); background: currentColor; opacity: .75; transition: width var(--mov-medio) var(--ease-suave); }
.encuesta__ver { align-self: center; font-size: 12px; padding: 4px 8px; color: inherit; opacity: .85; text-decoration: underline; }
.fila-opcion { display: flex; align-items: center; gap: 6px; }
.fila-opcion .campo__entrada { flex: 1; min-width: 0; }
.interruptor { display: flex; align-items: center; gap: 10px; width: 100%; text-align: left; padding: 8px 0; }
.interruptor__caja { width: 40px; height: 22px; border-radius: 11px; background: var(--color-gris); position: relative; flex-shrink: 0; transition: background-color var(--mov-rapido); }
.interruptor__caja::after { content: ''; position: absolute; top: 3px; left: 3px; width: 16px; height: 16px; border-radius: 50%; background: var(--color-blanco); transition: transform var(--mov-medio) var(--ease-rebote); }
.interruptor[aria-checked="true"] .interruptor__caja { background: var(--color-morado); }
.interruptor[aria-checked="true"] .interruptor__caja::after { transform: translateX(18px); }

/* ---------- Votación para expulsar ---------- */
.votacion { display: flex; flex-direction: column; gap: 8px; }
.votacion__cab { display: flex; align-items: flex-start; gap: 6px; font-family: var(--fuente-titulo); font-weight: 700; font-size: 15px; }
.votacion__cab .material-symbols-rounded { font-size: 22px; color: var(--color-error-texto); }
.votacion__sub { font-size: 12px; opacity: .85; }
.votacion__barra { position: relative; height: 8px; border-radius: 4px; background: color-mix(in srgb, currentColor 22%, transparent); margin: 6px 0 2px; }
.votacion__relleno { height: 100%; width: var(--pct, 0%); border-radius: 4px; background: var(--color-error); transition: width var(--mov-medio) var(--ease-suave); }
.votacion__marca { position: absolute; left: 70%; top: -4px; bottom: -4px; width: 2px; background: currentColor; }
.votacion__cuentas { display: flex; justify-content: space-between; gap: 8px; font-family: var(--fuente-hud); font-size: 12px; }
.votacion__botones { display: flex; gap: 8px; }
.votacion__btn { flex: 1; display: flex; align-items: center; justify-content: center; gap: 4px; padding: 8px; min-height: 40px; border-radius: var(--radio-sm); font-family: var(--fuente-titulo); font-weight: 700; font-size: 13px; color: inherit; border: 1px solid currentColor; background: transparent; }
.votacion__btn--activo { background: var(--color-blanco); color: var(--color-negro); border-color: var(--color-blanco); }
.fila--otra .votacion__btn--activo { background: var(--color-morado); color: var(--color-blanco); border-color: var(--color-morado); }
.votacion__estado { display: flex; align-items: center; gap: 6px; padding: 6px 8px; border-radius: var(--radio-sm); font-size: 13px; font-weight: 600; background: var(--color-velo-suave); }
.votacion__estado--aprobada { color: var(--color-error-texto); }

/* ---------- Mensajes de 1 vez ---------- */
.unavez { display: flex; align-items: center; gap: 10px; width: 100%; text-align: left; padding: 8px 10px; border-radius: var(--radio-md); color: inherit; border: 1px dashed currentColor; background: var(--color-velo-suave); }
.unavez--abrible { cursor: pointer; transition: transform var(--mov-rapido) var(--ease-rebote), background-color var(--mov-rapido); }
.unavez--abrible:hover { background: var(--color-morado-suave); }
.unavez > .material-symbols-rounded { font-size: 28px; flex-shrink: 0; }
.unavez__datos { display: flex; flex-direction: column; min-width: 0; }
.unavez__titulo { font-family: var(--fuente-titulo); font-weight: 700; font-size: 14px; }
.unavez__sub { font-size: 12px; opacity: .8; }
.unavez .insignia { margin-left: auto; flex-shrink: 0; }
.adjuntar-menu { grid-template-columns: repeat(3, 1fr); }
.adjuntar-menu button[aria-pressed="true"] { color: var(--color-morado-claro); box-shadow: inset 0 0 0 1px var(--color-morado); border-radius: var(--radio-md); }

/* ---------- "Escribiendo…" ---------- */
.escribiendo { align-self: flex-start; display: flex; align-items: center; gap: 8px; padding: 6px 12px 6px 8px; border-radius: var(--radio-lg); border-bottom-left-radius: var(--radio-sm); background: var(--color-tarjeta); border: 1px solid var(--color-gris); font-size: 13px; color: var(--color-texto-suave); animation: menu-entra var(--mov-medio) var(--ease-salida) backwards; }
.escribiendo__avatares { display: flex; }
.escribiendo__avatares .avatar { border: 2px solid var(--color-tarjeta); }
.escribiendo__avatares .avatar + .avatar { margin-left: -10px; }
.escribiendo[hidden] { display: none; }
.insignia--flotante { align-self: flex-start; }
.puntos { display: inline-flex; gap: 3px; align-items: center; }
.puntos i { width: 6px; height: 6px; border-radius: 50%; background: var(--color-morado-claro); animation: punto-salta 1s ease-in-out infinite; animation-delay: calc(var(--i, 0) * 0.15s); }
@keyframes punto-salta { 0%, 60%, 100% { transform: translateY(0); opacity: .45; } 30% { transform: translateY(-5px); opacity: 1; } }

/* ---------- Mensajes eliminados: rojo con la estética HUD de la app ---------- */
.fila--propia .burbuja--eliminada, .fila--otra .burbuja--eliminada { background: var(--color-error-suave); border: 1px solid var(--color-error); color: var(--color-error-texto); box-shadow: inset 3px 0 0 var(--color-error), 0 0 12px color-mix(in srgb, var(--color-error) 18%, transparent); }
.burbuja--eliminada::before, .burbuja--eliminada::after { content: ''; position: absolute; width: 10px; height: 10px; border: 2px solid var(--color-error); pointer-events: none; }
.burbuja--eliminada::before { top: -1px; left: -1px; border-right: none; border-bottom: none; border-top-left-radius: var(--radio-md); }
.burbuja--eliminada::after { bottom: -1px; right: -1px; border-left: none; border-top: none; border-bottom-right-radius: var(--radio-sm); }
.burbuja__eliminada { font-family: var(--fuente-titulo); font-style: normal; font-weight: 700; font-size: 13px; letter-spacing: 0.06em; text-transform: uppercase; opacity: 1; }
.burbuja__eliminada .material-symbols-rounded { font-size: 18px; }
.burbuja--eliminada .burbuja__pie { opacity: .8; }
.burbuja--eliminada .burbuja__autor { color: var(--color-error-texto); }

/* ---------- Foto de grupo ---------- */
.avatar--grupo img { width: 100%; height: 100%; object-fit: cover; }
.ayuda--error .ayuda__titulo { color: var(--color-error-texto); }
.ayuda--error .ayuda__lista li::before { background: var(--color-error); }
.grupo-form-foto { display: flex; align-items: center; gap: 14px; }
.grupo-form-foto__acciones { display: flex; flex-direction: column; gap: 6px; align-items: flex-start; }

/* Un [hidden] debe ganar siempre, aunque la regla del elemento tenga display */
.tarjeta[hidden], .aviso[hidden] { display: none; }

/* Etiquetas con ayuda dentro de burbujas propias (fondo morado): se leen en claro sobre un velo oscuro */
.fila--propia .insignia { background: color-mix(in srgb, var(--color-negro) 28%, transparent); color: var(--color-blanco); }
/* Pantallas muy angostas: la barra de reacciones rápidas (6 emojis + "+") cabe en 320 px */
@media (max-width: 360px) { .reaccion-rapida { width: 34px; height: 36px; font-size: 21px; } .reacciones-rapidas { padding: 6px 6px; } }


/* ============================================================
   NOVEDADES v1.5.0
   Errores animados en formularios, ventana de advertencia, botón de 5 pulsaciones, edición de mensajes ("Editado"),
   búsqueda en el chat, fotos en info-grupo, foto de la cuenta arriba a la derecha, etiqueta Beta y centro de ayuda.
   (Todos los colores salen de las variables del :root.)
   ============================================================ */

/* ---------- Errores de formulario ---------- */
/* Las esquinas de la tarjeta (o ventana) se ponen rojas, se agrandan y vuelven a su estado original (comun.js pone .efecto-error) */
@keyframes esquinas-error {
  0%   { border-color: var(--color-morado); width: 16px; height: 16px; }
  25%  { border-color: var(--color-error); width: 16px; height: 16px; }
  50%, 70% { border-color: var(--color-error); width: 36px; height: 36px; filter: drop-shadow(0 0 6px var(--color-error)); }
  100% { border-color: var(--color-morado); width: 16px; height: 16px; }
}
.efecto-error::before, .efecto-error::after { animation: esquinas-error 1100ms var(--ease-suave); }
/* El contorno del campo con error se pone rojo con un pulso y se queda rojo hasta que la persona lo corrige */
@keyframes campo-error {
  0%   { border-color: var(--color-gris); box-shadow: 0 0 0 0 var(--color-error-borde); }
  35%  { border-color: var(--color-error); box-shadow: 0 0 0 7px var(--color-error-suave); }
  100% { border-color: var(--color-error); box-shadow: 0 0 0 3px var(--color-error-suave); }
}
.campo__entrada.campo-error, .campo__entrada.campo-error:focus, .caja-codigo.campo-error, .caja-codigo.campo-error:focus, .visor.campo-error, .select__boton.campo-error {
  border-color: var(--color-error); box-shadow: 0 0 0 3px var(--color-error-suave); animation: campo-error 700ms var(--ease-salida);
}
.chips.campo-error { border-radius: var(--radio-md); outline: 1px solid var(--color-error); outline-offset: 6px; animation: campo-error 700ms var(--ease-salida); }
.campo:has(.campo-error) .campo__etiqueta { color: var(--color-error-texto); }        /* la etiqueta también se pone roja */
/* El sacudón de la tarjeta también funciona dentro de formularios en pila y en ventanas (las reglas de entrada de pantalla y de modal lo tapaban) */
.contenedor > form.pila > .tarjeta.efecto-sacudir, .modal-fondo:not(.modal-fondo--salir) .modal.efecto-sacudir { animation: sacudir 420ms var(--ease-suave); }

/* ---------- Botón de varias pulsaciones (advertencia y eliminar grupo) ---------- */
.btn--pulsaciones { position: relative; overflow: hidden; }
.btn__relleno { position: absolute; left: 0; top: 0; bottom: 0; width: var(--pct, 0%); background: currentColor; opacity: .22; pointer-events: none; transition: width var(--mov-medio) var(--ease-salida); }   /* barra de avance dentro del botón */
.btn--pulsaciones > .material-symbols-rounded, .btn__texto { position: relative; }

/* ---------- Ventana de advertencia (roja, con la estética HUD) ---------- */
@keyframes alerta-brillo { 0%, 100% { box-shadow: var(--sombra-tarjeta), var(--sombra-error); } 50% { box-shadow: var(--sombra-tarjeta), var(--sombra-error-fuerte); } }
.modal-fondo:has(.modal--advertencia) { align-items: center; padding: 16px; background: linear-gradient(var(--color-velo-error), var(--color-velo-error)), var(--color-velo); }   /* siempre centrada y con tinte rojo */
.modal--advertencia { max-width: 440px; border-color: var(--color-error); border-radius: var(--radio-md); background: var(--color-error-fondo); animation: modal-entra-centro var(--mov-medio) var(--ease-salida) backwards, alerta-brillo 2.4s ease-in-out infinite; }
.modal--advertencia::before, .modal--advertencia::after { border-color: var(--color-error); width: 22px; height: 22px; }
.modal--advertencia .modal__titulo { color: var(--color-error-texto); text-transform: uppercase; letter-spacing: 0.16em; }
.advertencia { display: flex; flex-direction: column; align-items: center; gap: 10px; text-align: center; }
.advertencia__icono { font-size: 72px; color: var(--color-error-texto); filter: drop-shadow(0 0 12px var(--color-error)); animation: pulso 1.4s ease-in-out infinite; }
.advertencia__titulo { font-family: var(--fuente-titulo); font-size: 20px; font-weight: 800; color: var(--color-error-texto); }
.advertencia__texto { font-size: 14px; }
.advertencia__mensaje { width: 100%; text-align: left; padding: 10px 12px; border-left: 3px solid var(--color-error); border-radius: var(--radio-sm); background: var(--color-error-suave); }
.advertencia__de { font-family: var(--fuente-titulo); font-size: 12px; font-weight: 700; color: var(--color-error-texto); }
.advertencia__cita { margin-top: 4px; font-size: 14px; white-space: pre-wrap; overflow-wrap: anywhere; }
.menu-flotante__item--aviso { color: var(--color-warning-texto); }              /* opción "Advertir" de los menús */

/* ---------- Mensajes: "Editado" y eliminado por un administrador ---------- */
.burbuja__pie { align-items: center; gap: 6px; }
.burbuja__editado { display: inline-flex; align-items: center; gap: 2px; font-style: italic; }
.burbuja__editado .material-symbols-rounded { font-size: 12px; }

/* ---------- Búsqueda de mensajes en el chat ---------- */
.chat__buscar { display: flex; align-items: center; gap: 2px; padding: 6px 8px; background: var(--color-tarjeta); border-bottom: 1px solid var(--color-gris); animation: panel-sube var(--mov-medio) var(--ease-salida) backwards; }
.chat__buscar .buscador { flex: 1; min-width: 0; }
.chat__buscar .campo__entrada { padding-top: 8px; padding-bottom: 8px; padding-right: 12px; }
.chat__buscar-cuenta { min-width: 46px; text-align: center; font-family: var(--fuente-hud); font-size: 12px; color: var(--color-texto-suave); white-space: nowrap; }
.resaltado { background: var(--color-resaltado); color: inherit; border-radius: 3px; padding: 0 1px; }                /* coincidencia */
.resaltado--activo { background: var(--color-resaltado-activo); color: var(--color-negro); box-shadow: 0 0 0 2px var(--color-resaltado-activo); }   /* la seleccionada */

/* ---------- Fotos del grupo (info-grupo) ---------- */
.galeria { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 4px; }
.galeria--modal { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.galeria__foto { position: relative; aspect-ratio: 1; padding: 0; overflow: hidden; border-radius: var(--radio-sm); border: 1px solid var(--color-gris); background: var(--color-tarjeta-2); transition: border-color var(--mov-rapido) var(--ease-suave); }
.galeria__foto img { display: block; width: 100%; height: 100%; object-fit: cover; transition: transform var(--mov-medio) var(--ease-salida); }
.galeria__foto:hover { border-color: var(--color-morado); }
.galeria__foto:hover img { transform: scale(1.08); }
.visor-foto { display: flex; flex-direction: column; gap: 10px; }
.visor-foto__nav { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.visor-foto__cuenta { font-family: var(--fuente-hud); font-size: 13px; color: var(--color-texto-suave); }

/* ---------- Reloj del grupo con segundos (más largo: se achica para caber en 320 px) ---------- */
.reloj--completo { font-size: clamp(17px, 5.8vw, 36px); }

/* ---------- Foto de la cuenta arriba a la derecha ---------- */
.btn-icono--cuenta { padding: 0; border-radius: 50%; box-shadow: 0 0 0 2px var(--color-morado-borde); }
.btn-icono--cuenta .avatar { width: 100%; height: 100%; }
.btn-icono--cuenta:hover { box-shadow: 0 0 0 2px var(--color-morado), var(--sombra-morado); }
@media (min-width: 420px) { .appbar--cuenta .appbar__titulo { padding-left: 44px; } }   /* compensa el ancho extra de la derecha para que el título siga centrado */
@media (pointer: coarse) and (min-width: 420px) { .appbar--cuenta .appbar__titulo { padding-left: 48px; } }

/* ---------- Centro de ayuda ---------- */
.ayuda-hero { display: flex; flex-direction: column; align-items: center; gap: 8px; text-align: center; }
.ayuda-indice { display: flex; flex-wrap: wrap; gap: 8px; }
.ayuda-indice .chip { display: inline-flex; align-items: center; gap: 6px; }
.ayuda-indice .chip .material-symbols-rounded { font-size: 18px; }
.ayuda-seccion { scroll-margin-top: 76px; }
.faq { border: 1px solid var(--color-gris); border-radius: var(--radio-md); background: var(--color-fondo); transition: border-color var(--mov-rapido) var(--ease-suave); }
.faq[open] { border-color: var(--color-morado-borde); }
.faq > summary { list-style: none; display: flex; align-items: center; gap: 10px; padding: 12px 14px; cursor: pointer; font-family: var(--fuente-titulo); font-weight: 700; font-size: 15px; border-radius: var(--radio-md); }
.faq > summary::-webkit-details-marker { display: none; }
.faq > summary:hover { background: var(--color-morado-suave); }
.faq__flecha { margin-left: auto; flex-shrink: 0; color: var(--color-morado-claro); }
.faq[open] .faq__flecha { transform: rotate(180deg); }
.faq__respuesta { padding: 4px 14px 14px; display: flex; flex-direction: column; gap: 8px; font-size: 14px; }
.faq[open] .faq__respuesta { animation: entrar var(--mov-medio) var(--ease-salida) backwards; }
.faq__respuesta ul, .faq__respuesta ol { padding-left: 20px; display: flex; flex-direction: column; gap: 4px; }
.faq__respuesta li::marker { color: var(--color-morado-claro); }
.faq__ic { font-size: 18px; vertical-align: middle; color: var(--color-morado-claro); }   /* icono dentro de una frase */
.tecla { font-family: var(--fuente-hud); font-size: 12px; padding: 1px 6px; border: 1px solid var(--color-gris); border-bottom-width: 2px; border-radius: var(--radio-sm); background: var(--color-tarjeta-2); }

/* ---------- Centro de ayuda (v1.5.0): complementos de la página paginas/ayuda.html ----------
   Qué hace: da forma a la portada con buscador, la barra de acciones, los iconos de cada sección y la tabla de permisos.
   Para qué sirve: que la ayuda siga la estética ÉLIX (HUD morado) usando solo variables del :root. */
.ayuda-hero__icono { font-size: 44px; color: var(--color-morado-claro); filter: drop-shadow(0 0 10px var(--color-halo)); }   /* icono grande de la portada de ayuda */
.ayuda-hero__titulo { font-family: var(--fuente-titulo); font-size: 22px; font-weight: 700; }
.ayuda-hero__texto { font-size: 14px; color: var(--color-texto-suave); }
.ayuda-hero .buscador { flex: none; width: 100%; margin-top: 4px; }   /* el buscador ocupa todo el ancho de la tarjeta */
.ayuda-acciones { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }   /* contador de preguntas + abrir/cerrar todas */
.ayuda-seccion .titulo-seccion .faq__ic { margin-right: 6px; font-size: 20px; }   /* icono al inicio del título de cada sección */
.faq > summary:focus-visible { outline: 2px solid var(--color-morado-claro); outline-offset: 2px; }   /* foco visible al navegar con teclado */
.faq__respuesta p { margin: 0; line-height: 1.5; }
.faq__respuesta a { color: var(--color-morado-claro); text-decoration: underline; text-underline-offset: 2px; }
.faq__respuesta .nota { text-align: left; }
/* Tabla de permisos por rango: se desplaza sola en pantallas angostas para no romper el ancho de la página */
.tabla-ayuda-caja { overflow-x: auto; border: 1px solid var(--color-gris); border-radius: var(--radio-md); }
.tabla-ayuda { width: 100%; border-collapse: collapse; font-size: 13px; min-width: 300px; }
.tabla-ayuda th, .tabla-ayuda td { padding: 8px 6px; text-align: center; border-bottom: 1px solid var(--color-gris); }
.tabla-ayuda tr:last-child td { border-bottom: none; }
.tabla-ayuda th:first-child, .tabla-ayuda td:first-child { text-align: left; }
.tabla-ayuda th { font-family: var(--fuente-titulo); font-size: 12px; letter-spacing: 0.02em; color: var(--color-morado-claro); background: var(--color-tarjeta-2); white-space: nowrap; }
.tabla-ayuda__si { font-size: 20px; color: var(--color-success-texto); }   /* ✓ puede */
.tabla-ayuda__no { font-size: 20px; color: var(--color-texto-suave); }     /* — no puede */
.tabla-ayuda__solo { font-size: 11px; line-height: 1.25; color: var(--color-texto); }         /* “puede, pero solo a…” */

/* ---------- v1.7.0: etiquetas clickeables dentro de la ayuda ----------
   Qué hace: las etiquetas que crea ayuda.js (Comun.insigniaAyuda) quedan alineadas con el texto, sin partirse en dos renglones y sin agrandar el interlineado;
   en la tabla de permisos son un poco más compactas. Para qué sirve: que las etiquetas se lean como parte de la frase. Los colores salen de .insignia (variables del :root). */
.faq .insignia, #cierreAyuda .insignia { vertical-align: middle; white-space: nowrap; line-height: 1.2; padding: 2px 8px; margin: 0 1px; }
.tabla-ayuda .insignia { font-size: 11px; padding: 1px 6px; margin: 0; }
.tabla-ayuda .insignia .material-symbols-rounded { font-size: 13px; }
[data-insignia] { font-weight: 700; }   /* sin JavaScript el marcador se lee como texto resaltado */

/* ============================================================
   v1.8.0 — Recortador, foto en grande, pie de foto, video HUD, perfil (estado y descripción), advertencia por mensaje, F1/F2 y barra de formato en el celular
   Todos los colores salen de variables del :root.
   ============================================================ */

/* ---------- Recortador de imágenes (recortador.js) ---------- */
.modal--recorte { max-width: 520px; }
.modal--recorte .modal__cuerpo { min-height: 0; overflow-y: auto; }
.recorte { display: flex; justify-content: center; }
.recorte__marco { position: relative; overflow: hidden; touch-action: none; -webkit-user-select: none; user-select: none; border-radius: var(--radio-sm); background: var(--color-negro); }   /* el recuadro oscurece lo de afuera con una sombra enorme: overflow lo recorta */
.recorte__img { display: block; width: 100%; height: 100%; pointer-events: none; }
.recorte__caja { position: absolute; cursor: move; border: 2px solid var(--color-recorte-borde); box-shadow: 0 0 0 9999px var(--color-velo);
  background:   /* líneas guía de los tercios */
    linear-gradient(var(--color-recorte-guia), var(--color-recorte-guia)) 33.33% 0 / 1px 100% no-repeat,
    linear-gradient(var(--color-recorte-guia), var(--color-recorte-guia)) 66.66% 0 / 1px 100% no-repeat,
    linear-gradient(var(--color-recorte-guia), var(--color-recorte-guia)) 0 33.33% / 100% 1px no-repeat,
    linear-gradient(var(--color-recorte-guia), var(--color-recorte-guia)) 0 66.66% / 100% 1px no-repeat; }
.recorte__caja--circulo { border-radius: 50%; background: none; }   /* fotos de perfil: guía redonda, como se verá el avatar */
.recorte__asa { position: absolute; width: 28px; height: 28px; margin: -14px 0 0 -14px; }   /* zona de toque de 28 px */
.recorte__asa::after { content: ''; position: absolute; left: 50%; top: 50%; width: 12px; height: 12px; margin: -6px 0 0 -6px; border-radius: 2px; background: var(--color-recorte-borde); }
.recorte__asa--nw { left: 0; top: 0; cursor: nwse-resize; } .recorte__asa--ne { left: 100%; top: 0; cursor: nesw-resize; }
.recorte__asa--se { left: 100%; top: 100%; cursor: nwse-resize; } .recorte__asa--sw { left: 0; top: 100%; cursor: nesw-resize; }
.recorte__asa--n { left: 50%; top: 0; cursor: ns-resize; } .recorte__asa--s { left: 50%; top: 100%; cursor: ns-resize; }
.recorte__asa--e { left: 100%; top: 50%; cursor: ew-resize; } .recorte__asa--w { left: 0; top: 50%; cursor: ew-resize; }
.recorte__caja--fija .recorte__asa--n, .recorte__caja--fija .recorte__asa--s, .recorte__caja--fija .recorte__asa--e, .recorte__caja--fija .recorte__asa--w { display: none; }   /* con proporción fija solo se usan las esquinas */
.recorte__barra { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; }
.recorte__barra .chips { flex: 1; }
.recorte__ayuda { text-align: center; }

/* ---------- Foto de perfil o de grupo en grande ---------- */
.avatar--ampliable { cursor: zoom-in; transition: box-shadow var(--mov-rapido) var(--ease-suave); }
.avatar--ampliable:hover { box-shadow: 0 0 0 2px var(--color-morado-borde), var(--sombra-morado); }
.avatar--ampliable:focus-visible { outline: 2px solid var(--color-morado-claro); outline-offset: 2px; }
.modal--foto { max-width: 460px; }
.foto-grande__img { display: block; width: min(100%, 58dvh); aspect-ratio: 1; margin: 0 auto; object-fit: cover; border-radius: var(--radio-md); border: 1px solid var(--color-morado-borde); }
.foto-grande__img--vacia { display: flex; align-items: center; justify-content: center; background: var(--color-tarjeta-2); }
.foto-grande__img--vacia .avatar { width: 55%; height: 55%; font-size: clamp(40px, 16vw, 84px); }
.foto-grande__insignias { justify-content: center; }
.foto-grande__estado { display: flex; align-items: center; gap: 8px; padding: 8px 12px; border-radius: var(--radio-md); background: var(--color-morado-suave); color: var(--color-morado-claro); font-size: 14px; overflow-wrap: anywhere; }
.foto-grande__estado .material-symbols-rounded { font-size: 18px; flex-shrink: 0; }
.foto-grande__descripcion { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; font-size: 14px; line-height: 1.45; }

/* ---------- Pie de foto en el chat y en la previsualización ---------- */
.con-pie { display: flex; flex-direction: column; gap: 6px; }
.con-pie .medio, .con-pie .rep-video { margin-bottom: 0; }
.adjunto { cursor: pointer; transition: border-color var(--mov-rapido) var(--ease-suave), box-shadow var(--mov-rapido) var(--ease-suave); }
.adjunto--activo { border-color: var(--color-morado-claro); box-shadow: var(--sombra-morado); }   /* la miniatura cuyo pie se está escribiendo */
.adjunto__recortar { position: absolute; right: 4px; bottom: 4px; width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; border-radius: 50%; background: var(--color-velo); color: var(--color-blanco); transition: background-color var(--mov-rapido) var(--ease-suave); }
.adjunto__recortar::after { content: ''; position: absolute; inset: -4px; }
.adjunto__recortar .material-symbols-rounded { font-size: 16px; }
.adjunto__recortar:hover { background: var(--color-morado); }
.adjunto__insignia { color: var(--color-morado-claro); }

/* ---------- Reproductor de video con la estética HUD (reproductores.js) ---------- */
.rep-video { border: 1px solid var(--color-morado-borde); box-shadow: var(--sombra-tarjeta); }
.rep-video::before, .rep-video::after { content: ''; position: absolute; z-index: 2; width: 16px; height: 16px; border: 2px solid var(--color-morado); pointer-events: none; transition: width var(--mov-medio) var(--ease-salida), height var(--mov-medio) var(--ease-salida); }   /* esquinas como las de las tarjetas */
.rep-video::before { top: 0; left: 0; border-right: none; border-bottom: none; }
.rep-video::after { bottom: 0; right: 0; border-left: none; border-top: none; }
.rep-video:hover::before, .rep-video:hover::after { width: 26px; height: 26px; }
.rep-video__circulo { position: relative; width: 60px; height: 60px; background: var(--gradiente-principal); border-color: var(--color-morado-claro); box-shadow: var(--sombra-morado-fuerte); }
.rep-video__circulo::before { content: ''; position: absolute; inset: -2px; border-radius: 50%; border: 2px solid var(--color-morado-claro); animation: anillo 1.8s ease-out infinite; pointer-events: none; }   /* anillo que late */
@keyframes anillo { from { transform: scale(1); opacity: .7; } to { transform: scale(1.6); opacity: 0; } }
.rep-video__controles { background: linear-gradient(transparent, var(--color-video-barra)); }
.rep-video__controles .btn-icono:hover { background: var(--color-morado-suave); color: var(--color-morado-claro); }
.rep-video__controles .rep__barra { color: var(--color-morado-claro); }   /* la barra usa currentColor: relleno y perilla morados */
.rep-video__controles .rep__tiempo { font-family: var(--fuente-hud); font-size: 12px; color: var(--color-blanco); opacity: 1; }
.rep-video__controles .rep__vel { color: var(--color-morado-claro); border-color: var(--color-morado-borde); opacity: 1; }
.rep-video__etiqueta { position: absolute; top: 8px; left: 10px; z-index: 1; display: flex; align-items: center; gap: 4px; padding: 2px 8px 2px 6px; border: 1px solid var(--color-morado-borde); border-radius: var(--radio-sm); background: var(--color-video-etiqueta); color: var(--color-morado-claro); font-family: var(--fuente-hud); font-size: 12px; pointer-events: none; }
.rep-video__etiqueta .material-symbols-rounded { font-size: 15px; }

/* ---------- Perfil: estado y descripción ---------- */
.miembro__estado { font-size: 13px; color: var(--color-texto-suave); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }   /* estado bajo el nombre en la lista de miembros */
.previa__dato--descripcion { max-width: 100%; text-align: center; white-space: pre-wrap; overflow-wrap: anywhere; }

/* ---------- Advertencia por un mensaje ---------- */
.cita--estatica { cursor: default; }
.advertencia__mensaje--ref .cita { margin: 4px 0 0; }
.modal--advertencia .cita { border-left-color: var(--color-error); }   /* dentro de la ventana roja la cita también es roja */

/* ---------- Votación: atajo de teclado ---------- */
.votacion__atajo { display: flex; align-items: center; flex-wrap: wrap; gap: 4px; font-size: 12px; color: var(--color-texto-suave); }

/* ---------- Barra de formato en pantallas táctiles: anclada bajo el cuadro para que el menú del sistema no la tape ---------- */
.formato-dock { display: flex; justify-content: center; }
.formato-barra--anclada { position: static; left: auto; bottom: auto; transform: none; margin: 6px auto 8px; }

/* ---------- App instalable (v1.6.0) ----------
   Qué hace: estilos del botón "Instalar app" de Ajustes (es un <button> con el aspecto de .ajuste-fila) y de la lista de pasos
   de la ventana "Instalar ÉLIX" (iPhone/Android). Para qué sirve: que la instalación se vea igual que el resto de la app. */
button.ajuste-fila { width: 100%; text-align: left; font: inherit; cursor: pointer; background: transparent; }   /* fila de ajustes que es un botón */
.pasos-instalar { padding-left: 22px; display: flex; flex-direction: column; gap: 8px; font-size: 14px; line-height: 1.45; }
.pasos-instalar li::marker { color: var(--color-morado-claro); font-family: var(--fuente-hud); }

/* ============================================================
   v1.9.0 — Mensajes fijados, control de ingreso, modo anuncios, exportar el chat, menciones, "visto por", descargas, visor protegido y sala de espera.
   Todos los colores y tipografías salen de las variables del :root.
   ============================================================ */

/* ---------- Correcciones: la duración del video tapaba a los emojis y el selector hacía lenta la pantalla ---------- */
/* Las esquinas (z-index 2) y la etiqueta con la duración (z-index 1) del video vivían en la misma "capa" que el resto del chat, así que quedaban POR ENCIMA del panel de emojis y
   del menú de adjuntar. isolation: isolate encierra esas capas dentro del propio video; y el panel y el menú tienen su z-index para ganar siempre. */
.rep-video { isolation: isolate; }
.emoji-panel, .adjuntar-menu { z-index: 5; }
/* Cada emoji era un botón con recorte, onda y 6 transiciones (x ~1.900). Ahora es liviano: solo anima su tamaño y su fondo, y se aísla del resto (contain) */
.emoji { position: static; overflow: visible; contain: layout paint style; transition: transform var(--mov-rapido) var(--ease-suave), background-color var(--mov-rapido) var(--ease-suave); }
@media (pointer: coarse) { :root { --emoji-alto: 46px; } }   /* objetivos táctiles de 46 px */
/* Con el selector de emojis abierto se detienen las animaciones decorativas infinitas de la pantalla (anillo del botón de reproducir de cada video) */
.chat--panel-abierto .rep-video__circulo::before { animation: none; }

/* ---------- Avisos del sistema con icono (entra, sale, expulsado, fijado, opciones…) ---------- */
.sistema { display: flex; align-items: center; justify-content: center; gap: 6px; max-width: 94%; }
.sistema .material-symbols-rounded { font-size: 16px; font-style: normal; flex-shrink: 0; }
.sistema--expulsado { color: var(--color-error-texto); }
/* fijado, anuncios, espera, exportar y exporta usan el gris cursivo de siempre (.sistema) */

/* ---------- "Visto por": ojo gris y cuántas personas vieron tu mensaje ---------- */
.burbuja__visto { display: inline-flex; align-items: center; gap: 2px; color: var(--color-visto); }
.burbuja__visto .material-symbols-rounded { font-size: 14px; }
.burbuja__fijado { display: inline-flex; align-items: center; }
.burbuja__fijado .material-symbols-rounded { font-size: 13px; }

/* ---------- Menciones (@nombre) ---------- */
.mencion { font-weight: 700; color: var(--color-mencion-texto); background: var(--color-mencion-fondo); border-radius: var(--radio-sm); padding: 0 3px; }
.fila--propia .mencion { color: var(--color-blanco); background: color-mix(in srgb, var(--color-blanco) 24%, transparent); }
.mencion--yo { box-shadow: 0 0 0 1px currentColor; }                                   /* si te nombran a ti, la mención lleva contorno */
.burbuja--mencion { border-color: var(--color-mencion-borde); box-shadow: 0 0 14px color-mix(in srgb, var(--color-mencion-borde) 30%, transparent); }
.menciones { position: absolute; bottom: 100%; left: 0; right: 0; z-index: 6; max-height: min(240px, 36dvh); overflow-y: auto; overscroll-behavior: contain; padding: 4px; background: var(--color-tarjeta); border-top: 1px solid var(--color-morado-borde); box-shadow: var(--sombra-tarjeta); }
.menciones__item { display: flex; align-items: center; gap: 10px; width: 100%; padding: 8px; border-radius: var(--radio-sm); text-align: left; color: var(--color-texto); }
.menciones__item:hover, .menciones__item--foco { background: var(--color-morado-suave); }
.menciones__nombre { flex: 1; min-width: 0; font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.menciones__vacio { padding: 10px 12px; font-size: 13px; color: var(--color-texto-suave); }

/* ---------- Mensajes fijados (barra bajo la cabecera del chat) ---------- */
.chat__fijado { display: flex; align-items: center; gap: 6px; padding: 6px 6px 6px 12px; background: var(--color-tarjeta-2); border-bottom: 1px solid var(--color-gris); }
.chat__fijado-abrir { flex: 1; min-width: 0; display: flex; align-items: center; gap: 10px; padding: 2px 0 2px 10px; border-left: 3px solid var(--color-morado); text-align: left; color: inherit; }
.chat__fijado-abrir > .material-symbols-rounded { font-size: 20px; color: var(--color-morado-claro); flex-shrink: 0; }
.chat__fijado-texto { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.chat__fijado-titulo { font-family: var(--fuente-titulo); font-size: 12px; font-weight: 700; color: var(--color-morado-claro); }
.chat__fijado-resumen { display: flex; align-items: center; gap: 4px; font-size: 13px; color: var(--color-texto); overflow: hidden; }
.chat__fijado-resumen .material-symbols-rounded { font-size: 16px; flex-shrink: 0; }
.chat__fijado-resumen span:not(.material-symbols-rounded) { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ---------- Solicitudes de ingreso (aviso para el Big Admin en el chat) y modo anuncios (aviso para quien no puede escribir) ---------- */
.chat__solicitudes { display: flex; align-items: center; gap: 10px; padding: 8px 12px; background: var(--color-info-suave); border-bottom: 1px solid var(--color-info); font-size: 14px; }
.chat__solicitudes > .material-symbols-rounded { color: var(--color-info-texto); }
.chat__solicitudes > span:not(.material-symbols-rounded) { flex: 1; min-width: 0; }
.solo-lectura { display: flex; align-items: center; gap: 12px; padding: 14px 16px; font-size: 14px; color: var(--color-texto-suave); }
.solo-lectura > .material-symbols-rounded { font-size: 26px; color: var(--color-morado-claro); flex-shrink: 0; }

/* ---------- Votación de expulsión: "Sí, expulsar" en rojo y "No" en verde al elegirlos ---------- */
.votacion .votacion__btn--si.votacion__btn--activo { background: var(--color-error); border-color: var(--color-error); color: var(--color-sobre-error); }
.votacion .votacion__btn--no.votacion__btn--activo { background: var(--color-success); border-color: var(--color-success); color: var(--color-sobre-exito); }

/* ---------- Interruptores con explicación (opciones del grupo) ---------- */
.interruptor--opcion { align-items: flex-start; padding: 12px 0; border-top: 1px solid var(--color-gris); cursor: pointer; }
.interruptor--opcion .interruptor__caja { margin-top: 3px; }
.interruptor__texto { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.interruptor__titulo { display: flex; align-items: center; gap: 6px; font-family: var(--fuente-titulo); font-weight: 700; color: var(--color-texto); }
.interruptor__titulo .material-symbols-rounded { font-size: 20px; color: var(--color-morado-claro); }
.interruptor__sub { font-size: 13px; color: var(--color-texto-suave); }
.interruptor:focus-visible { outline: 2px solid var(--color-morado-claro); outline-offset: 2px; border-radius: var(--radio-sm); }

/* ---------- Descargar fotos, videos y audios del chat ---------- */
.medio-envoltorio { position: relative; width: 100%; max-width: 280px; margin-bottom: 4px; }
.medio-envoltorio .medio { margin-bottom: 0; }
.con-pie .medio-envoltorio { margin-bottom: 0; }
.medio__descargar { position: absolute; right: 6px; bottom: 6px; width: 32px; height: 32px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: var(--color-velo); color: var(--color-blanco); opacity: 0; transition: opacity var(--mov-rapido) var(--ease-suave), background-color var(--mov-rapido) var(--ease-suave); }
.medio__descargar::after { content: ''; position: absolute; inset: -6px; }                 /* zona de toque más grande */
.medio__descargar .material-symbols-rounded { font-size: 20px; }
.medio-envoltorio:hover .medio__descargar, .medio__descargar:focus-visible { opacity: 1; }
.medio__descargar:hover { background: var(--color-morado); }
@media (hover: none) { .medio__descargar { opacity: .92; } }
.rep__pie-der { display: inline-flex; align-items: center; gap: 6px; }
.rep__descargar { width: 24px; height: 24px; display: inline-flex; align-items: center; justify-content: center; border-radius: 50%; color: inherit; opacity: .8; transition: opacity var(--mov-rapido) var(--ease-suave), color var(--mov-rapido) var(--ease-suave); position: relative; }
.rep__descargar::after { content: ''; position: absolute; inset: -8px; }
.rep__descargar .material-symbols-rounded { font-size: 18px; }
.rep__descargar:hover { opacity: 1; }
.rep-video__descargar { position: absolute; top: 8px; right: 10px; z-index: 1; width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; border: 1px solid var(--color-morado-borde); border-radius: var(--radio-sm); background: var(--color-video-etiqueta); color: var(--color-morado-claro); transition: opacity var(--mov-medio) var(--ease-suave), background-color var(--mov-rapido) var(--ease-suave); }
.rep-video__descargar .material-symbols-rounded { font-size: 18px; }
.rep-video__descargar:hover { background: var(--color-morado-suave); }
.rep-video--oculto .rep-video__descargar { opacity: 0; pointer-events: none; }

/* ---------- Visor protegido de mensajes de 1 vez (visor-seguro.js) ---------- */
.visor-seguro, .visor-seguro * { -webkit-user-select: none; user-select: none; -webkit-touch-callout: none; }
.visor-seguro { position: fixed; inset: 0; z-index: 250; display: flex; align-items: center; justify-content: center; padding: 12px; background: var(--color-visor-fondo); animation: aparecer var(--mov-rapido) var(--ease-suave) both; }
.visor-seguro__marco { position: relative; width: min(100%, 560px); max-height: 100%; display: flex; flex-direction: column; gap: 10px; padding: 14px; background: var(--color-tarjeta); border: 1px solid var(--color-morado-borde); border-radius: var(--radio-md); box-shadow: var(--sombra-morado-fuerte); }
.visor-seguro__cab { display: flex; align-items: center; gap: 8px; font-family: var(--fuente-titulo); font-weight: 700; }
.visor-seguro__cab > .material-symbols-rounded { color: var(--color-morado-claro); }
.visor-seguro__titulo { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.visor-seguro__sello { display: inline-flex; align-items: center; gap: 4px; padding: 3px 8px; border-radius: var(--radio-sm); background: var(--color-success-suave); color: var(--color-success-texto); font-size: 12px; font-weight: 600; }
.visor-seguro__sello .material-symbols-rounded { font-size: 14px; }
.visor-seguro__cuerpo { position: relative; overflow: hidden; min-height: 96px; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 8px; border-radius: var(--radio-md); background: var(--color-fondo); }
.visor-seguro__cuerpo--oculto > :not(.visor-seguro__marca) { visibility: hidden; }
.visor-seguro__cuerpo img { display: block; max-width: 100%; max-height: 60dvh; border-radius: var(--radio-sm); pointer-events: none; -webkit-user-drag: none; }
.visor-seguro .medio { margin-bottom: 0; max-width: 100%; }
.visor-seguro .rep-video { max-width: 100%; margin-bottom: 0; }
.visor-seguro .rep { width: 100%; }
.visor-seguro .burbuja__texto { font-size: 17px; line-height: 1.45; color: var(--color-texto); align-self: stretch; }
.visor-seguro .con-pie { align-self: stretch; align-items: center; }
.visor-seguro__marca { position: absolute; inset: -40% -20%; z-index: 5; display: flex; flex-direction: column; justify-content: space-around; transform: rotate(-24deg); pointer-events: none; mix-blend-mode: difference; color: var(--color-marca-agua); opacity: .22; font-family: var(--fuente-hud); font-size: 14px; white-space: nowrap; }
.visor-seguro__nota { font-size: 12px; color: var(--color-texto-suave); text-align: center; }
.visor-seguro__cubierta { position: absolute; inset: 0; z-index: 10; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; padding: 24px; text-align: center; background: var(--color-negro); color: var(--color-blanco); border-radius: var(--radio-md); }
.visor-seguro__cubierta .material-symbols-rounded { font-size: 56px; color: var(--color-morado-claro); }
.visor-seguro__cubierta-titulo { font-family: var(--fuente-titulo); font-weight: 700; font-size: 17px; }
@media print { .visor-seguro { display: none !important; } }                            /* al imprimir, el visor no sale */

/* ---------- Pantalla de espera (sala de espera) ---------- */
.espera { align-items: center; text-align: center; }
.espera__icono { font-size: 76px; color: var(--color-morado); filter: drop-shadow(0 0 12px var(--color-halo)); animation: espera-gira 2.6s var(--ease-suave) infinite; }
.espera__icono--fijo { animation: none; }
.espera__icono--ok { color: var(--color-success-texto); }
.espera__icono--error { color: var(--color-error-texto); }
@keyframes espera-gira { 0%, 45% { transform: rotate(0); } 70%, 100% { transform: rotate(180deg); } }   /* el reloj de arena se da vuelta */
.espera__titulo { font-family: var(--fuente-titulo); font-size: 22px; font-weight: 800; }
.espera__texto { color: var(--color-texto-suave); overflow-wrap: anywhere; }

/* ---------- Información del grupo: reglas activas, solicitudes, fijados y multimedia ---------- */
.reglas-grupo { display: flex; flex-wrap: wrap; gap: 6px; align-self: flex-start; }
.solicitud, .fijado-fila { display: flex; align-items: center; gap: 12px; padding: 10px 0; border-bottom: 1px solid var(--color-gris); }
.solicitud:last-child, .fijado-fila:last-child { border-bottom: none; }
.solicitud__datos, .fijado-fila__datos { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.solicitud__nombre { font-weight: 600; color: var(--color-texto); overflow-wrap: anywhere; }
.solicitud__desc { font-size: 13px; color: var(--color-texto-suave); overflow-wrap: anywhere; }
.solicitud__cuando { font-family: var(--fuente-hud); font-size: 12px; color: var(--color-texto-suave); }
.solicitud__acciones { display: flex; gap: 4px; flex-shrink: 0; }
.btn-icono--exito { color: var(--color-success-texto); }
.btn-icono--exito:hover { background: var(--color-success-suave); color: var(--color-success-texto); }
.btn-icono--peligro { color: var(--color-error-texto); }
.btn-icono--peligro:hover { background: var(--color-error-suave); color: var(--color-error-texto); }
.fijado-fila__autor { font-family: var(--fuente-titulo); font-size: 12px; font-weight: 700; color: var(--color-morado-claro); }
.fijado-fila__resumen { display: flex; align-items: center; gap: 4px; font-size: 14px; overflow: hidden; }
.fijado-fila__resumen .material-symbols-rounded { font-size: 16px; flex-shrink: 0; color: var(--color-morado-claro); }
.fijado-fila__resumen span:not(.material-symbols-rounded) { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pestana__cuenta { font-family: var(--fuente-hud); font-size: 12px; opacity: .85; }
/* Pestañas de Multimedia: icono arriba y nombre abajo (con salto de línea si hace falta) para que "Fotos y videos" quepa en pantallas angostas; la cuenta va como insignia en la esquina */
.pestanas--multimedia .pestana { position: relative; flex-direction: column; gap: 2px; padding: 6px 4px; font-size: 12px; line-height: 1.15; text-align: center; }
.pestanas--multimedia .pestana span:not(.material-symbols-rounded) { white-space: normal; overflow: visible; text-overflow: clip; }
.pestanas--multimedia .pestana .pestana__cuenta { position: absolute; top: 3px; right: 5px; font-size: 11px; }
.pestanas--multimedia { padding: 3px; gap: 2px; }
@media (max-width: 360px) { .pestanas--multimedia .pestana { font-size: 11px; padding-inline: 1px; letter-spacing: -0.02em; } }   /* en 300-360 px "Documentos" cabe entera sin partirse */
.galeria__foto video { display: block; width: 100%; height: 100%; object-fit: cover; }
.galeria__insignia { position: absolute; left: 4px; bottom: 4px; display: flex; align-items: center; padding: 1px 4px 1px 2px; border-radius: var(--radio-sm); background: var(--color-video-etiqueta); color: var(--color-morado-claro); font-family: var(--fuente-hud); font-size: 11px; }
.galeria__insignia .material-symbols-rounded { font-size: 16px; }
.multimedia-fila { display: flex; flex-direction: column; gap: 6px; padding: 10px 0; border-bottom: 1px solid var(--color-gris); }
.multimedia-fila:last-child { border-bottom: none; }
.multimedia-fila__cab { display: flex; align-items: center; gap: 10px; }
.multimedia-fila__cab > .material-symbols-rounded { font-size: 28px; color: var(--color-morado-claro); flex-shrink: 0; }
.multimedia-fila__datos { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.multimedia-fila__nombre { font-size: 14px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.multimedia-fila__sub { font-size: 12px; color: var(--color-texto-suave); }
.multimedia-fila .rep { width: 100%; }
.visor-foto__acciones { display: flex; justify-content: center; }

/* ---------- Control de ingreso (ventana de invitar) ---------- */
.control-ingreso { display: flex; flex-direction: column; gap: 10px; padding-top: 14px; border-top: 1px solid var(--color-gris); }
.control-ingreso .interruptor--opcion { border-top: none; padding: 4px 0; }
.control-ingreso__limite { display: flex; align-items: flex-end; gap: 8px; }
.control-ingreso__limite .campo { flex: 1; }
.control-ingreso__estado { font-family: var(--fuente-hud); font-size: 12px; color: var(--color-texto-suave); }

/* ============================================================
   v1.9.1 — Animaciones de carga: cuando algo todavía no llegó se ve un marcador con un brillo que lo recorre en vez de un hueco vacío (o del nombre de un icono).
   Usa las variables --color-esqueleto, --color-esqueleto-brillo y --mov-esqueleto del :root. Con "Animaciones: No" en Ajustes el brillo queda quieto.
   ============================================================ */
@keyframes esqueleto-brillo { from { background-position: 160% 0; } to { background-position: -60% 0; } }   /* la franja de luz cruza de derecha a izquierda */
@keyframes esqueleto-pulso { 0%, 100% { opacity: 1; } 50% { opacity: .45; } }                                /* latido suave (puntos de emojis, iconos) */
@keyframes medio-aparece { from { opacity: 0; } to { opacity: 1; } }                                          /* fundido de entrada de lo que acaba de cargar */

/* Contenedor que espera un medio (imagen, video, audio): comun.js (alCargar) le pone y le quita .cargando */
.cargando { position: relative; box-shadow: inset 0 0 0 1px var(--color-morado-borde); background-color: var(--color-esqueleto); background-image: linear-gradient(100deg, transparent 30%, var(--color-esqueleto-brillo) 50%, transparent 70%); background-size: 260% 100%; background-repeat: no-repeat; animation: esqueleto-brillo var(--mov-esqueleto) linear infinite; }
.cargando > img, .cargando > video, .cargando > audio { visibility: hidden; }        /* mientras carga solo se ve el marcador (sin texto alternativo ni cuadro roto) */
.medio-cargado { animation: medio-aparece var(--mov-medio) var(--ease-suave) both; }
.con-error { background: var(--color-esqueleto); }                                     /* si no se pudo cargar, queda el fondo liso */
.medio-envoltorio.cargando { min-height: 180px; border-radius: var(--radio-md); }
.medio-envoltorio.con-error { min-height: 64px; border-radius: var(--radio-md); }
.medio-grande-caja { width: 100%; }
.medio-grande-caja.cargando { min-height: 240px; border-radius: var(--radio-md); }
.rep-video.cargando { min-height: 160px; background-color: var(--color-esqueleto); }   /* gana al fondo negro del reproductor mientras se lee el video */
.rep.cargando { background-color: var(--color-esqueleto); }
.avatar.cargando { border-radius: 50%; }
img.foto-grande__img.cargando { visibility: visible; }                                  /* la foto grande ya tiene su tamaño reservado: el marcador se ve en la propia imagen */
.galeria__foto.cargando { border-color: var(--color-morado-borde); }

/* Código QR mientras llega el generador (viene de internet) */
.qr-caja { width: 220px; height: 220px; margin: 0 auto; border-radius: var(--radio-md); }

/* Categorías del selector de emojis que todavía no se dibujaron: puntos que laten en las columnas reales */
.emoji-grid--vacia { background-image: radial-gradient(circle at 50% 50%, var(--color-esqueleto) 0 14px, transparent 15px); background-size: calc(100% / var(--emoji-columnas, 8)) var(--emoji-alto); animation: esqueleto-pulso var(--mov-esqueleto) ease-in-out infinite; }

/* Iconos mientras la fuente de iconos no llegó (tema.js pone .iconos-cargando en <html>): una cajita que late en vez del nombre del icono escrito como texto */
.iconos-cargando .material-symbols-rounded { display: inline-block; width: 1em; height: 1em; overflow: hidden; color: transparent !important; background: var(--color-esqueleto); border-radius: var(--radio-sm); animation: esqueleto-pulso var(--mov-esqueleto) ease-in-out infinite; }

/* ============================================================
   v1.10.0 — Mensajes apagados (gris), encuestas con vencimiento, votación terminada, enlaces, menciones moradas, animaciones que faltaban y tarjeta de biografía
   Todos los colores y tipografías salen de las variables del :root.
   ============================================================ */

/* ---------- Más separación entre los elementos del chat ---------- */
/* Solo los mensajes SEGUIDOS de una misma persona quedan juntitos (el hueco de 3 px del contenedor). Todo lo demás se separa más: el primer mensaje de otra persona, los avisos del sistema
   y los separadores de fecha. El ancho de las filas no cambia. */
.fila--nuevo-bloque { margin-top: 16px; }
.sistema { margin-block: 8px; }
.fecha-sep { margin-block: 10px; }

/* ---------- Mensajes "apagados": mensaje de 1 vez ya abierto y encuesta finalizada se ven en GRIS ---------- */
.fila--propia .burbuja--apagada, .fila--otra .burbuja--apagada { background: var(--color-apagado-fondo); border: 1px solid var(--color-apagado-borde); color: var(--color-apagado-texto); box-shadow: none; }
.burbuja--apagada .burbuja__autor, .burbuja--apagada .burbuja__pie, .burbuja--apagada .burbuja__visto { color: var(--color-apagado-texto); }
.burbuja--apagada .unavez, .burbuja--apagada .encuesta, .burbuja--apagada .encuesta__opcion { color: var(--color-apagado-texto); }
.burbuja--apagada .insignia { background: var(--color-gris); color: var(--color-texto-suave); }
.unavez--abierto { border-color: var(--color-apagado-borde); }
.unavez--abierto > .material-symbols-rounded { opacity: .8; }

/* ---------- Encuestas: opciones vivas, vencimiento y resultados ---------- */
@keyframes barra-crece { from { width: var(--pct-desde, 0%); } }                                             /* la barra crece desde donde estaba */
.encuesta__opcion { transition: background-color var(--mov-rapido) var(--ease-suave), border-color var(--mov-rapido) var(--ease-suave), transform var(--mov-rapido) var(--ease-suave); }
button.encuesta__opcion:hover { background: color-mix(in srgb, currentColor 10%, transparent); }
button.encuesta__opcion:active { transform: scale(.97); }
.encuesta__opcion--mia { background: color-mix(in srgb, currentColor 8%, transparent); }
.encuesta__opcion--pop { animation: seleccion var(--mov-medio) var(--ease-rebote); }
.encuesta__opcion--pop .material-symbols-rounded { animation: pop var(--mov-medio) var(--ease-rebote); }        /* la casilla / círculo se marca con un pop */
.encuesta__barra { animation: barra-crece var(--mov-lento) var(--ease-suave) backwards; }
.encuesta__cuenta { transition: color var(--mov-rapido); }
.encuesta__tipo--fin { display: flex; align-items: center; gap: 4px; opacity: 1; font-weight: 600; }
.encuesta__tipo--fin .material-symbols-rounded { font-size: 16px; }
.encuesta__resultado { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: var(--radio-sm); background: var(--color-velo-suave); animation: pop var(--mov-medio) var(--ease-rebote) backwards; }
.encuesta__resultado > .material-symbols-rounded { font-size: 26px; flex-shrink: 0; }
.encuesta__resultado-texto { display: flex; flex-direction: column; min-width: 0; }
.encuesta__resultado-texto strong { font-family: var(--fuente-titulo); font-size: 14px; overflow-wrap: anywhere; }
.encuesta__resultado-texto span { font-size: 12px; opacity: .85; }
.encuesta--finalizada .encuesta__opcion--resultado { cursor: default; }
.encuesta--finalizada .encuesta__opcion--ganadora { font-weight: 700; color: var(--color-texto); border-color: var(--color-apagado-borde); }
.encuesta--finalizada .encuesta__opcion--ganadora .encuesta__barra { opacity: 1; height: 4px; }
.encuesta--finalizada .encuesta__barra { opacity: .5; }
.encuesta--finalizada .encuesta__resultado > .material-symbols-rounded, .encuesta--finalizada .encuesta__opcion--ganadora > .material-symbols-rounded { color: var(--color-warning-texto); }

/* ---------- Votación de expulsión terminada: sin línea de progreso, "Aprobada" en verde y "Rechazada" en rojo ---------- */
.votacion__btn { transition: transform var(--mov-rapido) var(--ease-suave), background-color var(--mov-rapido) var(--ease-suave), color var(--mov-rapido) var(--ease-suave), border-color var(--mov-rapido) var(--ease-suave); }
.votacion__btn:hover { transform: translateY(-1px); }
.votacion__btn:active { transform: scale(.95); }
.votacion__btn--pop { animation: seleccion var(--mov-medio) var(--ease-rebote); }
.votacion__btn--pop .material-symbols-rounded { animation: pop var(--mov-medio) var(--ease-rebote); }
.votacion__relleno { animation: barra-crece var(--mov-lento) var(--ease-suave) backwards; }
.votacion__estado { animation: pop var(--mov-medio) var(--ease-rebote) backwards; }
.votacion__estado .material-symbols-rounded { font-size: 22px; }
.votacion__estado--aprobada { color: var(--color-success-texto); background: color-mix(in srgb, var(--color-negro) 58%, transparent); box-shadow: inset 3px 0 0 var(--color-success); }
.votacion__estado--rechazada { color: var(--color-error-texto); background: color-mix(in srgb, var(--color-negro) 58%, transparent); box-shadow: inset 3px 0 0 var(--color-error); }
.votacion__estado--vencida, .votacion__estado--cancelada { color: var(--color-texto-suave); background: color-mix(in srgb, var(--color-negro) 58%, transparent); }
.votacion--aprobada .votacion__cuentas, .votacion--rechazada .votacion__cuentas, .votacion--vencida .votacion__cuentas, .votacion--cancelada .votacion__cuentas { justify-content: flex-start; gap: 14px; font-size: 13px; }

/* ---------- Enlaces: con la tipografía de código; morados y subrayados en mensajes ajenos, blancos en los míos ---------- */
.enlace { font-family: var(--fuente-codigo); font-size: 1.02em; color: var(--color-enlace-otro); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 3px; overflow-wrap: anywhere; cursor: pointer; transition: color var(--mov-rapido) var(--ease-suave), text-decoration-color var(--mov-rapido) var(--ease-suave), background-color var(--mov-rapido) var(--ease-suave); border-radius: 3px; }
.enlace:hover { background: var(--color-mencion-fondo); text-decoration-thickness: 2px; }
.enlace:active { transform: scale(.98); }
.fila--propia .enlace { color: var(--color-enlace-propio); text-decoration: none; }                  /* en mis mensajes: blanco */
.fila--propia .enlace:hover { text-decoration: underline; background: color-mix(in srgb, var(--color-blanco) 18%, transparent); }
.burbuja--apagada .enlace { color: var(--color-apagado-texto); }
.enlace-aviso { display: flex; align-items: center; gap: 8px; padding: 10px 12px; border-radius: var(--radio-sm); border: 1px dashed var(--color-warning); background: var(--color-warning-suave); }
.enlace-aviso > .material-symbols-rounded { color: var(--color-warning-texto); flex-shrink: 0; }
.enlace-aviso__url { min-width: 0; overflow-wrap: anywhere; font-family: var(--fuente-codigo); background: transparent; padding: 0; }

/* ---------- Menciones moradas y tocables ---------- */
.mencion { cursor: pointer; transition: background-color var(--mov-rapido) var(--ease-suave), transform var(--mov-rapido) var(--ease-suave); }
.mencion:hover { background: color-mix(in srgb, var(--color-morado) 38%, transparent); transform: translateY(-1px); }
.mencion:active { transform: scale(.96); }
.mencion:focus-visible { outline: 2px solid var(--color-morado-claro); outline-offset: 1px; }

/* ---------- Eliminar para mí: la fila se encoge y se desvanece ---------- */
@keyframes fila-sale { to { opacity: 0; transform: translateX(-24px) scale(.94); max-height: 0; margin-top: 0; margin-bottom: 0; } }
.fila--saliendo { overflow: hidden; animation: fila-sale 240ms var(--ease-entrada) forwards; pointer-events: none; }
.fila--propia.fila--saliendo { animation-name: fila-sale-derecha; }
@keyframes fila-sale-derecha { to { opacity: 0; transform: translateX(24px) scale(.94); max-height: 0; margin-top: 0; margin-bottom: 0; } }

/* ---------- Menús flotantes: entrada escalonada, salida animada ---------- */
@keyframes menu-sale { to { opacity: 0; transform: scale(.94) translateY(-4px); } }
@keyframes item-entra { from { opacity: 0; transform: translateX(-8px); } }
.menu-flotante--saliendo { animation: menu-sale var(--mov-rapido) var(--ease-entrada) forwards; pointer-events: none; }
.menu-flotante__item { animation: item-entra var(--mov-medio) var(--ease-salida) backwards; animation-delay: calc(var(--i, 0) * 30ms + 40ms); transition: background-color var(--mov-rapido) var(--ease-suave), padding-left var(--mov-rapido) var(--ease-suave), transform var(--mov-rapido) var(--ease-suave); }
.menu-flotante__item:active { transform: scale(.97); background: color-mix(in srgb, var(--color-morado) 26%, transparent); }
.menu-flotante__item:nth-child(2) { --i: 1; } .menu-flotante__item:nth-child(3) { --i: 2; } .menu-flotante__item:nth-child(4) { --i: 3; } .menu-flotante__item:nth-child(5) { --i: 4; }
.menu-flotante__item:nth-child(6) { --i: 5; } .menu-flotante__item:nth-child(7) { --i: 6; } .menu-flotante__item:nth-child(n+8) { --i: 7; }
.reacciones-rapidas .reaccion-rapida { animation: pop var(--mov-medio) var(--ease-rebote) backwards; animation-delay: calc(var(--i, 0) * 35ms); }
.reaccion-rapida:nth-child(2) { --i: 1; } .reaccion-rapida:nth-child(3) { --i: 2; } .reaccion-rapida:nth-child(4) { --i: 3; } .reaccion-rapida:nth-child(5) { --i: 4; } .reaccion-rapida:nth-child(6) { --i: 5; } .reaccion-rapida:nth-child(7) { --i: 6; }
.reaccion-rapida:active { transform: scale(.85); }

/* ---------- Reproductores de audio y video ---------- */
.rep__btn { position: relative; }
.rep__btn .material-symbols-rounded, .rep-video__controles .btn-icono .material-symbols-rounded { animation: pop var(--mov-rapido) var(--ease-rebote) backwards; }   /* el icono nuevo entra con un pop al cambiar entre reproducir y pausar */
.rep--sonando .rep__btn { animation: latido-boton 1.6s var(--ease-suave) infinite; }
.rep--sonando .rep__btn::after { content: ''; position: absolute; inset: -3px; border-radius: 50%; border: 2px solid currentColor; opacity: .7; animation: anillo 1.6s ease-out infinite; pointer-events: none; }
@keyframes latido-boton { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.06); } }
.rep__vel { transition: background-color var(--mov-rapido) var(--ease-suave), transform var(--mov-rapido) var(--ease-suave); }
.rep__vel:hover { background: color-mix(in srgb, currentColor 14%, transparent); }
.rep__vel:active { transform: scale(.9); }
.rep__vel--pop { animation: pop var(--mov-rapido) var(--ease-rebote); }
.rep__descargar:hover, .rep__descargar:active { transform: scale(1.15); }
.rep__descargar:active { transform: scale(.88); }
.rep--sonando .rep__tiempo { animation: pulso 1.6s ease-in-out infinite; }
.rep-video--sonando .rep-video__controles .rep__barra { transition: opacity var(--mov-medio) var(--ease-suave); }
.rep-video__controles { transition: opacity var(--mov-medio) var(--ease-suave); }
.rep-video__descargar { transition: opacity var(--mov-medio) var(--ease-suave), background-color var(--mov-rapido) var(--ease-suave), transform var(--mov-rapido) var(--ease-suave); }
.rep-video__descargar:active { transform: scale(.9); }

/* ---------- Otras cosas del chat que faltaban ---------- */
@keyframes desliza-abajo { from { opacity: 0; transform: translateY(-10px); } }
.chat__fijado:not([hidden]), .chat__solicitudes:not([hidden]), .solo-lectura:not([hidden]) { animation: desliza-abajo var(--mov-medio) var(--ease-salida) backwards; }
.chat__fijado-abrir { transition: background-color var(--mov-rapido) var(--ease-suave), transform var(--mov-rapido) var(--ease-suave); }
.chat__fijado-abrir:hover { background: var(--color-morado-suave); }
.chat__fijado-abrir:active { transform: scale(.98); }
.chat__solicitudes { transition: background-color var(--mov-rapido) var(--ease-suave); }
.chat__solicitudes:hover { background: color-mix(in srgb, var(--color-info) 22%, transparent); }
.chat__solicitudes > .material-symbols-rounded:last-child { transition: transform var(--mov-rapido) var(--ease-suave); }
.chat__solicitudes:hover > .material-symbols-rounded:last-child { transform: translateX(4px); }
.menciones:not([hidden]) { animation: panel-sube var(--mov-medio) var(--ease-salida) backwards; }
.menciones__item { transition: background-color var(--mov-rapido) var(--ease-suave), transform var(--mov-rapido) var(--ease-suave); animation: item-entra var(--mov-medio) var(--ease-salida) backwards; }
.menciones__item:active { transform: scale(.97); }
.reaccion { transition: transform var(--mov-rapido) var(--ease-suave), background-color var(--mov-rapido) var(--ease-suave), border-color var(--mov-rapido) var(--ease-suave); }
.reaccion:active { transform: scale(.9); }
.reaccion--pop { animation: pop var(--mov-medio) var(--ease-rebote); }
.unavez--abrible:active { transform: scale(.97); }
.medio__descargar:active { transform: scale(.88); }
.galeria__foto:active { transform: scale(.95); }
.insignia { transition: transform var(--mov-rapido) var(--ease-suave), filter var(--mov-rapido) var(--ease-suave); }
.insignia:hover { transform: translateY(-1px); filter: brightness(1.15); }
.avatar--ampliable:hover { transform: scale(1.06); }
.avatar--ampliable:active { transform: scale(.95); }
.solicitud, .fijado-fila, .multimedia-fila { animation: entrar var(--mov-medio) var(--ease-salida) backwards; }
.solicitud__acciones .btn-icono:hover { transform: scale(1.18); }
.solicitud__acciones .btn-icono:active { transform: scale(.85); }
.control-ingreso, .enlace-aviso { animation: entrar var(--mov-medio) var(--ease-salida) backwards; }
.interruptor:active .interruptor__caja::after { width: 20px; }                                          /* la perilla del interruptor se estira al pulsarla */
.interruptor__caja::after { transition: transform var(--mov-medio) var(--ease-rebote), width var(--mov-rapido) var(--ease-suave); }
.emoji-cat { transition: background-color var(--mov-rapido) var(--ease-suave), transform var(--mov-rapido) var(--ease-suave); }
.emoji-cat:active { transform: scale(.88); }
.modal__acciones .btn { animation: entrar var(--mov-medio) var(--ease-salida) backwards; animation-delay: 60ms; }
.foto-grande__descripcion, .foto-grande__estado { animation: entrar var(--mov-medio) var(--ease-salida) backwards; animation-delay: 80ms; }

/* ---------- Tarjeta de biografía (Centro de ayuda) — negro y rojo ---------- */
@keyframes bio-brillo { 0%, 100% { box-shadow: var(--sombra-bio), inset 0 0 0 1px var(--color-bio-rojo-oscuro); } 50% { box-shadow: 0 0 40px color-mix(in srgb, var(--color-bio-rojo) 55%, transparent), inset 0 0 0 1px var(--color-bio-rojo); } }
@keyframes bio-barrido { from { transform: translateX(-120%); } to { transform: translateX(220%); } }
@keyframes bio-anillo { to { transform: rotate(360deg); } }
.bio { display: block; margin-top: 8px; animation: entrar var(--mov-lento) var(--ease-salida) backwards; }
.bio__marco { position: relative; overflow: hidden; padding: 20px 18px 18px; border-radius: var(--radio-md); color: var(--color-bio-texto); background: radial-gradient(120% 90% at 100% 0%, color-mix(in srgb, var(--color-bio-rojo) 22%, transparent), transparent 55%), repeating-linear-gradient(135deg, transparent 0 14px, color-mix(in srgb, var(--color-bio-rojo) 5%, transparent) 14px 15px), linear-gradient(180deg, var(--color-bio-negro-2), var(--color-bio-negro)); border: 1px solid var(--color-bio-rojo-oscuro); animation: bio-brillo 4.2s ease-in-out infinite; display: flex; flex-direction: column; gap: 14px; }
.bio__marco::before, .bio__marco::after { content: ''; position: absolute; width: 22px; height: 22px; border: 2px solid var(--color-bio-rojo); pointer-events: none; transition: width var(--mov-medio) var(--ease-salida), height var(--mov-medio) var(--ease-salida); }
.bio__marco::before { top: 0; left: 0; border-right: none; border-bottom: none; }
.bio__marco::after { bottom: 0; right: 0; border-left: none; border-top: none; }
.bio__marco:hover::before, .bio__marco:hover::after { width: 34px; height: 34px; }
.bio__barrido { position: absolute; top: 0; bottom: 0; width: 40%; background: linear-gradient(100deg, transparent, color-mix(in srgb, var(--color-bio-rojo) 16%, transparent), transparent); animation: bio-barrido 5.5s ease-in-out infinite; pointer-events: none; }
.bio__cab { position: relative; display: flex; align-items: center; gap: 14px; }
.bio__avatar { position: relative; width: 68px; height: 68px; flex-shrink: 0; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: linear-gradient(145deg, var(--color-bio-rojo), var(--color-bio-rojo-oscuro)); font-family: var(--fuente-logo); font-size: 30px; font-weight: 800; color: var(--color-bio-texto); box-shadow: var(--sombra-bio); }
.bio__avatar::before { content: ''; position: absolute; inset: -6px; border-radius: 50%; border: 2px dashed var(--color-bio-rojo-claro); opacity: .7; animation: bio-anillo 12s linear infinite; }
.bio__id { display: flex; flex-direction: column; min-width: 0; }
.bio__etiqueta { font-family: var(--fuente-hud); font-size: 12px; letter-spacing: .18em; color: var(--color-bio-rojo-claro); }
.bio__nombre { margin: 0; font-family: var(--fuente-titulo); font-size: 30px; line-height: 1.05; font-weight: 800; letter-spacing: .06em; background: linear-gradient(90deg, var(--color-bio-texto), var(--color-bio-rojo-claro)); -webkit-background-clip: text; background-clip: text; color: transparent; }
.bio__real { font-family: var(--fuente-hud); font-size: 13px; color: var(--color-bio-suave); }
.bio__texto { position: relative; margin: 0; font-size: 14px; line-height: 1.55; color: var(--color-bio-texto); }
.bio__texto strong { color: var(--color-bio-rojo-claro); }
.bio__tags { position: relative; display: flex; flex-wrap: wrap; gap: 6px; margin: 0; padding: 0; list-style: none; }
.bio__tags li { padding: 3px 10px; border-radius: var(--radio-sm); border: 1px solid var(--color-bio-rojo-oscuro); background: color-mix(in srgb, var(--color-bio-rojo) 12%, transparent); font-family: var(--fuente-hud); font-size: 12px; letter-spacing: .06em; color: var(--color-bio-rojo-claro); transition: background-color var(--mov-rapido) var(--ease-suave), transform var(--mov-rapido) var(--ease-suave), border-color var(--mov-rapido) var(--ease-suave); }
.bio__tags li:hover { transform: translateY(-2px); background: color-mix(in srgb, var(--color-bio-rojo) 28%, transparent); border-color: var(--color-bio-rojo); }
.bio__pie { position: relative; margin: 0; padding-top: 12px; border-top: 1px solid var(--color-bio-rojo-oscuro); font-family: var(--fuente-hud); font-size: 12px; letter-spacing: .08em; color: var(--color-bio-suave); }


/* ============================================================
   v1.12.0 — Chat estilo WhatsApp (2.ª parte) y notificaciones
   ============================================================ */

/* ---------- "Escribiendo…" sin parpadeo ---------- */
/* Antes la burbuja tenía animación de entrada siempre y, como se reinsertaba cada segundo, parpadeaba. Ahora la entrada se anima UNA vez (clase que pone chat.js al aparecer)
   y los puntitos laten suave (menos recorrido, más lentos y sin cambios bruscos de opacidad) */
.escribiendo { animation: none; transition: opacity var(--mov-medio) var(--ease-suave); }
.escribiendo--entra { animation: menu-entra var(--mov-medio) var(--ease-salida) backwards; }
.puntos i { animation: punto-suave 1.4s ease-in-out infinite; animation-delay: calc(var(--i, 0) * 0.18s); }
@keyframes punto-suave { 0%, 70%, 100% { transform: translateY(0); opacity: .55; } 35% { transform: translateY(-3px); opacity: .95; } }

/* ---------- Lista de grupos: vista previa, hora y no leídos ---------- */
.grupo-item__previa { display: flex; align-items: center; gap: 4px; min-width: 0; font-size: 13px; color: var(--color-texto-suave); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; animation: aparecer var(--mov-medio) var(--ease-suave); }
.grupo-item__previa > span:last-child { overflow: hidden; text-overflow: ellipsis; }
.grupo-item__previa--escribiendo, .grupo-item__borrador { color: var(--color-escribiendo-lista); font-weight: 700; }
.grupo-item__previa--escribiendo strong { font-weight: 800; }
.grupo-item__previa--sistema, .grupo-item__previa--vacia { font-style: italic; }
.grupo-item__autor { flex-shrink: 0; color: var(--color-texto); opacity: .8; }
.grupo-item__ic { font-size: 16px; flex-shrink: 0; }
.grupo-item__lado { display: flex; flex-direction: column; align-items: flex-end; gap: 6px; flex-shrink: 0; }
.grupo-item__hora { font-family: var(--fuente-hud); font-size: 12px; color: var(--color-texto-suave); transition: color var(--mov-medio) var(--ease-suave); }
.grupo-item__hora--nuevo { color: var(--color-morado-claro); font-weight: 700; }
.grupo-item__marcas { display: flex; align-items: center; gap: 4px; min-height: 22px; }
.grupo-item__silencio { color: var(--color-texto-suave); display: flex; }
.grupo-item__silencio .material-symbols-rounded { font-size: 18px; }
.contador-no-leidos { min-width: 22px; height: 22px; padding: 0 7px; border-radius: 999px; display: inline-flex; align-items: center; justify-content: center; background: var(--color-no-leidos); color: var(--color-no-leidos-texto); font-family: var(--fuente-hud); font-size: 12px; font-weight: 700; box-shadow: var(--sombra-morado); animation: pop var(--mov-medio) var(--ease-rebote); }
.contador-no-leidos--silenciado { background: var(--color-no-leidos-silenciado); box-shadow: none; }

/* ---------- Reacciones montadas sobre el borde inferior de la burbuja ---------- */
/* Quedan medio adentro y medio afuera (más de la mitad hacia afuera), así una reacción no alarga tanto el mensaje */
.fila:has(> .burbuja--con-reacciones) { margin-bottom: 16px; }   /* el espacio va en la fila (no en la burbuja) para que el avatar siga alineado con la burbuja */
.reacciones--flotantes { position: absolute; bottom: -18px; z-index: 1; margin: 0; gap: 3px; flex-wrap: nowrap; max-width: calc(100% - 16px); }
.fila--otra .reacciones--flotantes { left: 10px; }
.fila--propia .reacciones--flotantes { right: 10px; }
.reacciones--flotantes .reaccion { min-height: 24px; padding: 0 7px; gap: 4px; background: var(--color-reaccion-fondo); border: 1px solid var(--color-reaccion-borde); color: var(--color-texto); box-shadow: var(--sombra-tarjeta); }
.reacciones--flotantes .reaccion--mia, .fila--propia .reacciones--flotantes .reaccion--mia { border-color: var(--color-morado-claro); background: color-mix(in srgb, var(--color-morado) 20%, var(--color-reaccion-fondo)); }
.reaccion__emoji { font-size: 14px; line-height: 1; }
.reaccion__n { font-family: var(--fuente-hud); font-size: 12px; animation: pop var(--mov-medio) var(--ease-rebote); }
.reaccion:active { transform: scale(.92); }

/* ---------- "Visto por": morado cuando lo vieron todos, y el contador salta al subir ---------- */
.burbuja__visto { transition: color var(--mov-lento) var(--ease-suave), background-color var(--mov-lento) var(--ease-suave), box-shadow var(--mov-lento) var(--ease-suave); border-radius: 999px; }
.burbuja__visto--todos { color: var(--color-visto-todos); background: var(--color-visto-todos-fondo); padding: 0 6px 0 4px; box-shadow: var(--sombra-visto-todos); font-weight: 700; }
.burbuja__pie:has(.burbuja__visto--todos) { opacity: 1; }
.burbuja__visto--sube .burbuja__visto-n, .burbuja__visto--sube .material-symbols-rounded { display: inline-block; animation: visto-sube var(--mov-lento) var(--ease-rebote); }
@keyframes visto-sube { 0% { transform: translateY(6px); opacity: 0; } 60% { transform: translateY(-2px); opacity: 1; } 100% { transform: none; } }

/* ---------- Selección múltiple ---------- */
.chat { position: relative; }
.chat__seleccion { position: absolute; top: 0; left: 0; right: 0; z-index: 8; display: flex; align-items: center; gap: 6px; padding: 8px 12px; background: var(--color-tarjeta-2); border-bottom: 1px solid var(--color-morado-borde); box-shadow: var(--sombra-morado); animation: desliza-abajo var(--mov-medio) var(--ease-salida); }
.chat__seleccion-cuenta { flex: 1; font-family: var(--fuente-titulo); font-weight: 700; color: var(--color-morado-claro); }
.fila { transition: background-color var(--mov-medio) var(--ease-suave), box-shadow var(--mov-medio) var(--ease-suave); }
.chat--seleccionando .fila { cursor: pointer; }
/* El fondo morado va de lado a lado del chat (como WhatsApp), no solo detrás de la burbuja */
.fila--seleccionada { background: var(--color-seleccion); box-shadow: 0 0 0 100vmax var(--color-seleccion); clip-path: inset(-2px -100vmax); }
.fila--seleccionada .burbuja { box-shadow: 0 0 0 2px var(--color-seleccion-borde); }

/* ---------- Responder a un fragmento / a un voto ---------- */
.btn-fragmento { position: fixed; z-index: 110; display: inline-flex; align-items: center; gap: 6px; padding: 8px 12px; border-radius: 999px; background: var(--gradiente-principal); color: var(--color-blanco); font-size: 13px; font-weight: 600; box-shadow: var(--sombra-morado-fuerte); animation: menu-entra var(--mov-rapido) var(--ease-salida); }
.btn-fragmento .material-symbols-rounded { font-size: 18px; }
.cita--fragmento .cita__texto > span:last-child { font-style: italic; }
.cita--voto .cita__texto .material-symbols-rounded { color: var(--color-morado-claro); }
.fila--propia .cita--voto .cita__texto .material-symbols-rounded { color: var(--color-blanco); }
mark.subrayado-fragmento { background: var(--color-subrayado-fondo); color: inherit; border-radius: 2px; text-decoration: underline 2px var(--color-subrayado); text-underline-offset: 3px; animation: subrayar var(--mov-lento) var(--ease-salida); transition: background-color .45s var(--ease-suave), text-decoration-color .45s var(--ease-suave); }
mark.subrayado-fragmento--sale { background: transparent; text-decoration-color: transparent; }
@keyframes subrayar { from { background: transparent; text-decoration-color: transparent; } }
.fragmento-caja { padding: 12px; border: 1px solid var(--color-morado-borde); border-radius: var(--radio-md); background: var(--color-tarjeta-2); -webkit-user-select: text; user-select: text; -webkit-touch-callout: default; white-space: pre-wrap; }
.voto-fila { border-radius: var(--radio-sm); transition: background-color var(--mov-medio) var(--ease-suave); }
.voto-fila__responder { margin-left: auto; color: var(--color-morado-claro); }
.voto-fila--resaltado { background: var(--color-subrayado-fondo); animation: voto-resaltado 3.5s var(--ease-suave) forwards; }
.voto-fila--resaltado .miembro__nombre { text-decoration: underline 2px var(--color-subrayado); text-underline-offset: 3px; }
@keyframes voto-resaltado { 0%, 75% { background: var(--color-subrayado-fondo); } 100% { background: transparent; } }
.titulo-seccion--peligro { border-left-color: var(--color-error); color: var(--color-error-texto); }
.titulo-seccion--exito { border-left-color: var(--color-success); color: var(--color-success-texto); }

/* ---------- Barras de "respondiendo a" y "editando" / avisos: entran deslizando ---------- */
.respuesta-barra:not([hidden]), .aviso-envio:not([hidden]), .adjuntos-previa:not([hidden]) { animation: panel-sube var(--mov-medio) var(--ease-salida); }

/* ---------- Adjuntos: subida con avance ---------- */
.adjunto--subiendo::after { content: ''; position: absolute; inset: 0; background: linear-gradient(90deg, transparent var(--avance, 0%), var(--color-subida) var(--avance, 0%)); pointer-events: none; transition: background var(--mov-rapido) linear; }
.adjunto--subiendo::before { content: ''; position: absolute; left: 0; bottom: 0; height: 3px; width: var(--avance, 0%); z-index: 1; background: var(--color-morado-claro); transition: width var(--mov-rapido) linear; }

/* ---------- Opción del menú en verde (Dar Persist) ---------- */
.menu-flotante__item--exito { color: var(--color-success-texto); }
.menu-flotante__item--exito .material-symbols-rounded { color: var(--color-success-texto); }

/* ---------- Visor a pantalla completa con zoom (visor-medios.js) ---------- */
.visor-medios { position: fixed; inset: 0; z-index: 90; display: flex; flex-direction: column; background: var(--color-visor-medios); color: var(--color-blanco); animation: aparecer var(--mov-medio) var(--ease-suave); }
.visor-medios--saliendo { animation: desvanecer 200ms var(--ease-entrada) forwards; }
.visor-medios__cabecera { display: flex; align-items: center; gap: 6px; padding: 8px 10px; padding-top: calc(8px + env(safe-area-inset-top)); background: var(--color-visor-barra); }
.visor-medios__cabecera .btn-icono { color: var(--color-blanco); }
.visor-medios__titulo { flex: 1; min-width: 0; font-family: var(--fuente-titulo); font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.visor-medios__zona { position: relative; flex: 1; min-height: 0; display: flex; align-items: center; justify-content: center; overflow: hidden; }
.visor-medios__zona--imagen { touch-action: none; cursor: zoom-in; -webkit-user-select: none; user-select: none; }
.visor-medios__zona--zoom { cursor: grab; }
.visor-medios__zona--zoom:active { cursor: grabbing; }
.visor-medios__img { max-width: 100%; max-height: 100%; object-fit: contain; transform-origin: center; will-change: transform; animation: pop var(--mov-medio) var(--ease-salida); }
.visor-medios__reproductor { width: min(100%, 900px); padding: 12px; }
.visor-medios__reproductor--audio { width: min(100%, 520px); }
.visor-medios__ficha { display: flex; flex-direction: column; align-items: center; gap: 8px; padding: 24px; text-align: center; }
.visor-medios__ficha .material-symbols-rounded { font-size: 64px; color: var(--color-morado-claro); }
.visor-medios__pie { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 10px 14px; padding-bottom: calc(10px + env(safe-area-inset-bottom)); background: var(--color-visor-barra); }
.visor-medios__texto { flex: 1; min-width: 0; max-height: 30dvh; overflow-y: auto; }
.visor-medios__zoom { display: flex; gap: 2px; margin-left: auto; }
.visor-medios__zoom .btn-icono { color: var(--color-blanco); }

/* ---------- Cámara (camara.js) ---------- */
.camara { position: fixed; inset: 0; z-index: 95; display: flex; flex-direction: column; background: var(--color-camara-fondo); color: var(--color-camara-texto); animation: aparecer var(--mov-medio) var(--ease-suave); }
.camara--saliendo { animation: desvanecer 200ms var(--ease-entrada) forwards; }
.camara::after { content: ''; position: absolute; inset: 0; background: var(--color-camara-flash); opacity: 0; pointer-events: none; }
.camara--flash::after { animation: flash 200ms ease-out; }
.camara__cabecera { position: absolute; top: 0; left: 0; right: 0; z-index: 2; display: flex; align-items: center; justify-content: space-between; padding: 10px; padding-top: calc(10px + env(safe-area-inset-top)); }
.camara__cabecera .btn-icono { color: var(--color-camara-texto); background: var(--color-visor-barra); }
.camara__tiempo { font-family: var(--fuente-hud); font-size: 16px; padding: 4px 10px; border-radius: 999px; background: var(--color-camara-grabando); color: var(--color-camara-texto); animation: pulso 1.2s ease-in-out infinite; }
.camara__vista { flex: 1; min-height: 0; width: 100%; object-fit: cover; background: var(--color-camara-fondo); }
.camara__vista--espejo { transform: scaleX(-1); }
.camara__pie { display: flex; flex-direction: column; align-items: center; gap: 12px; padding: 12px 16px; padding-bottom: calc(18px + env(safe-area-inset-bottom)); background: var(--color-visor-barra); }
.camara__modos { display: flex; gap: 6px; }
.camara__modo { padding: 4px 14px; border-radius: 999px; font-family: var(--fuente-titulo); font-weight: 600; color: var(--color-camara-texto); opacity: .7; transition: opacity var(--mov-rapido), background-color var(--mov-rapido); }
.camara__modo--activo { opacity: 1; background: var(--color-morado); }
.camara--grabando .camara__modos { visibility: hidden; }
.camara__botones { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; width: 100%; max-width: 360px; }
.camara__girar { justify-self: end; color: var(--color-camara-texto); }
.camara__disparo { width: 74px; height: 74px; border-radius: 50%; border: 4px solid var(--color-camara-disparo); display: flex; align-items: center; justify-content: center; transition: transform var(--mov-rapido) var(--ease-rebote); }
.camara__disparo:active { transform: scale(.92); }
.camara__disparo-centro { width: 58px; height: 58px; border-radius: 50%; background: var(--color-camara-disparo); transition: all var(--mov-medio) var(--ease-salida); }
.camara[data-modo="video"] .camara__disparo-centro { background: var(--color-camara-grabando); }
.camara--grabando .camara__disparo-centro { width: 28px; height: 28px; border-radius: var(--radio-sm); }

/* ---------- Editor de video (editor-video.js) ---------- */
.modal--editor-video { max-width: 560px; }
.editor-video__vista { position: relative; display: flex; justify-content: center; background: var(--color-negro); border-radius: var(--radio-md); overflow: hidden; cursor: pointer; }
.editor-video__video { display: block; max-width: 100%; max-height: min(46dvh, 420px); }
.editor-video__recorte { position: absolute; border: 2px solid var(--color-recorte-borde); box-shadow: 0 0 0 9999px var(--color-velo); pointer-events: none; transition: all var(--mov-medio) var(--ease-salida); }
.editor-video__controles { display: flex; align-items: center; gap: 8px; }
.editor-video__linea { flex: 1; display: flex; flex-direction: column; gap: 4px; }
.editor-video__pista { position: relative; height: 34px; border-radius: var(--radio-sm); background: var(--color-gris); }
.editor-video__tramo { position: absolute; top: 0; bottom: 0; background: var(--color-morado-suave); border: 2px solid var(--color-morado-claro); border-radius: var(--radio-sm); transition: left var(--mov-rapido), right var(--mov-rapido); }
.editor-video__cabezal { position: absolute; top: -2px; bottom: -2px; width: 2px; margin-left: -1px; background: var(--color-blanco); pointer-events: none; }
.editor-video__rango { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; background: none; pointer-events: none; -webkit-appearance: none; appearance: none; }
.editor-video__rango::-webkit-slider-thumb { pointer-events: auto; -webkit-appearance: none; width: 16px; height: 38px; border-radius: var(--radio-sm); background: var(--color-morado-claro); border: 2px solid var(--color-blanco); cursor: ew-resize; }
.editor-video__rango::-moz-range-thumb { pointer-events: auto; width: 14px; height: 36px; border-radius: var(--radio-sm); background: var(--color-morado-claro); border: 2px solid var(--color-blanco); cursor: ew-resize; }
.editor-video__rango::-webkit-slider-runnable-track, .editor-video__rango::-moz-range-track { background: transparent; }
.editor-video__tiempos { display: flex; justify-content: space-between; font-family: var(--fuente-hud); font-size: 12px; color: var(--color-texto-suave); }
.editor-video__tiempos strong { color: var(--color-morado-claro); }
.editor-video__acciones { display: flex; flex-wrap: wrap; gap: 8px; }
.editor-video__avance { display: flex; flex-direction: column; gap: 6px; animation: panel-sube var(--mov-medio) var(--ease-salida); }
.editor-video__barra { transition: width 200ms linear; animation: none; }
.editor-video--procesando .editor-video__controles, .editor-video--procesando .editor-video__acciones, .editor-video--procesando .interruptor { opacity: .5; pointer-events: none; }

/* ---------- Perfil: el campo de contraseña aparece al cambiar el correo ---------- */
.campo--aparece:not([hidden]) { animation: panel-sube var(--mov-medio) var(--ease-salida); }

/* ---------- Invitación: "Grupo creado por [Nombre]" (el nombre abre el perfil del Big Admin) ---------- */
.previa__creador { display: inline; padding: 0; font: inherit; font-weight: 700; color: var(--color-morado-claro); text-decoration: underline dotted; text-underline-offset: 3px; cursor: pointer; transition: color var(--mov-rapido); }
.previa__creador:hover { color: var(--color-acento); }

/* ---------- Información del grupo: silencios ---------- */
.silencio-estado { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--color-texto-suave); animation: aparecer var(--mov-medio) var(--ease-suave); }
.silencio-estado .material-symbols-rounded { color: var(--color-morado-claro); }
.miembro__silenciado { display: inline-flex; align-items: center; gap: 3px; font-size: 12px; color: var(--color-texto-suave); }
.miembro__silenciado .material-symbols-rounded { font-size: 15px; }
.opciones-silencio { display: grid; gap: 8px; }

/* ---------- Tarjeta del segundo programador (Centro de ayuda): paleta morado oscuro ---------- */
.bio--morado { --color-bio-negro: var(--color-bio2-negro); --color-bio-negro-2: var(--color-bio2-negro-2); --color-bio-rojo: var(--color-bio2-morado); --color-bio-rojo-claro: var(--color-bio2-morado-claro);
  --color-bio-rojo-oscuro: var(--color-bio2-morado-oscuro); --color-bio-texto: var(--color-bio2-texto); --color-bio-suave: var(--color-bio2-suave); --sombra-bio: var(--sombra-bio2); }
.bio a { font-weight: 800; color: var(--color-bio-rojo-claro); text-decoration: underline; text-underline-offset: 3px; transition: color var(--mov-rapido), text-shadow var(--mov-rapido); }
.bio a:hover { text-shadow: 0 0 10px var(--color-bio-rojo); }
.bio + .bio { margin-top: 16px; }

/* ---------- Movimiento reducido: el zoom y la selección no animan ---------- */
:root[data-movimiento="reducido"] .visor-medios__img { transition: none !important; }


/* ============================================================
   v1.13.0 — ESTILOS NUEVOS
   Todos los colores salen de variables del :root (bloque "v1.13.0" de arriba).
   ============================================================ */

/* ---------- Correcciones ---------- */
/* "Visto por todos": sin la pastilla oscura ni el brillo detrás (queda el color morado claro y la negrita) */
.burbuja__visto--todos { background: none; box-shadow: none; padding: 0; }
/* "Ver votos": icono y texto centrados en la misma línea */
.encuesta__ver { display: inline-flex; align-items: center; justify-content: center; gap: 4px; line-height: 1; }
.encuesta__ver .material-symbols-rounded { font-size: 16px; line-height: 1; }
/* Enlace de la versión en el pie de la portada (abre las Notas del Parche) */
.pie__version { color: inherit; text-decoration: underline; text-decoration-color: var(--color-morado-borde); text-underline-offset: 3px; }
.pie__version:hover { color: var(--color-morado-claro); }

/* ---------- Descripciones (desc-rica.js) ---------- */
.desc-vacia { color: var(--color-desc-vacia); font-style: italic; }   /* "Sin descripción": gris oscuro y cursiva (antes aparecía "null") */
.desc-rica { display: flex; flex-direction: column; gap: 2px; white-space: pre-wrap; overflow-wrap: anywhere; }
.desc-rica__p { display: block; min-height: 1.3em; }
.desc-rica code { font-family: var(--fuente-codigo); }
.desc-rica__figura { display: block; margin: 6px 0; padding: 0; border: 1px solid var(--color-gris); border-radius: var(--radio-md); overflow: hidden; background: var(--color-banner-fondo); cursor: zoom-in; max-width: 100%; width: fit-content; }
.desc-rica__img { display: block; max-width: 100%; max-height: 420px; width: auto; height: auto; object-fit: contain; }
.previa__descripcion--sinlinea { border-top: none; padding-top: 0; }
.previa__descripcion, .foto-grande__descripcion { white-space: normal; }   /* los saltos los maneja .desc-rica */
.foto-grande__descripcion .desc-rica, .previa__descripcion .desc-rica { white-space: pre-wrap; }

/* ---------- Editor visual (desc-rica.js) ---------- */
.editor-rico { display: flex; flex-direction: column; gap: 6px; position: relative; }
.editor-rico__barra { display: flex; flex-wrap: wrap; gap: 2px; padding: 4px; border: 1px solid var(--color-editor-borde); border-radius: var(--radio-md); background: var(--color-editor-fondo); }
.editor-rico__barra .formato-btn { width: 36px; height: 36px; }
.formato-btn--activo { background: var(--color-morado-suave); color: var(--color-morado-claro); }
.editor-rico__paleta { max-width: none; justify-content: flex-start; padding: 8px; border: 1px solid var(--color-editor-borde); border-radius: var(--radio-md); background: var(--color-editor-fondo); }
.formato-punto--ninguno { display: inline-flex; align-items: center; justify-content: center; background: transparent; border: 1px dashed var(--color-gris-claro); color: var(--color-texto-suave); }
.formato-punto--ninguno .material-symbols-rounded { font-size: 16px; }
.editor-rico__emojis { position: relative; bottom: auto; left: auto; right: auto; height: min(320px, 45dvh); border: 1px solid var(--color-editor-borde); border-radius: var(--radio-md); }
.editor-rico__emojis[hidden] { display: none; }
.editor-rico__area { position: relative; min-height: 110px; max-height: 60dvh; overflow-y: auto; padding: 10px 12px; border: 1px solid var(--color-editor-borde); border-radius: var(--radio-md); background: var(--color-editor-fondo); color: var(--color-texto);
  font-family: var(--fuente-texto); font-size: 15px; line-height: 1.45; white-space: pre-wrap; overflow-wrap: anywhere; outline: none; transition: border-color var(--mov-rapido) var(--ease-suave), box-shadow var(--mov-rapido) var(--ease-suave); }
.editor-rico__area:focus { border-color: var(--color-editor-foco); box-shadow: 0 0 0 3px var(--color-morado-suave); }
.editor-rico__area--vacia::before { content: attr(data-placeholder); color: var(--color-texto-suave); opacity: .75; pointer-events: none; position: absolute; }
.editor-rico__area a { color: var(--color-enlace-otro); text-decoration: underline; }
.editor-rico__area font[face="elix-codigo"] { font-family: var(--fuente-codigo); }   /* "código" dentro del editor */
.editor-rico__area font[face="elix-normal"] { font-family: inherit; }
.editor-rico__img { position: relative; margin: 6px 0; display: block; width: fit-content; max-width: 100%; border: 1px solid var(--color-gris); border-radius: var(--radio-md); overflow: hidden; user-select: none; }
.editor-rico__img img { display: block; max-width: 100%; max-height: 260px; object-fit: contain; }
.editor-rico__img--subiendo img { opacity: .5; }
.editor-rico__img--subiendo::after { content: ''; position: absolute; left: 0; bottom: 0; height: 4px; width: var(--avance, 0%); background: var(--color-subida-avance); transition: width var(--mov-rapido) linear; }
.editor-rico__quitar { position: absolute; top: 6px; right: 6px; width: 30px; height: 30px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: var(--color-velo); color: var(--color-blanco); }
.editor-rico__quitar:hover { background: var(--color-error); }
.editor-rico__quitar .material-symbols-rounded { font-size: 18px; }
.editor-rico__pie { display: flex; justify-content: space-between; align-items: flex-start; gap: 10px; }
.editor-rico__pie .campo__contador { flex-shrink: 0; }
.campo__contador--excedido { color: var(--color-error-texto); font-weight: 700; }
.campo__editor { width: 100%; }

/* ---------- Banners (3:1) ---------- */
.banner { position: relative; width: 100%; aspect-ratio: 3 / 1; border-radius: var(--radio-md); overflow: hidden; background: var(--color-banner-fondo); border: 1px solid var(--color-banner-borde); }
.banner[hidden] { display: none; }
.banner__img { width: 100%; height: 100%; object-fit: cover; object-position: center; display: block; }
.banner__vacio { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; gap: 8px; color: var(--color-texto-suave); font-size: 14px; }
.banner--editable { border-style: dashed; }
.banner--foto { margin-bottom: -4px; }
.banner--previa { margin-bottom: 4px; }
.tarjeta--con-banner > .banner:first-child { margin-bottom: -2px; }

/* ---------- Botón para bajar (chat) ---------- */
.chat__bajar-ancla { position: relative; height: 0; z-index: 5; }
.btn-bajar { position: absolute; right: 14px; bottom: 12px; width: 46px; height: 46px; border-radius: 50%; display: flex; align-items: center; justify-content: center;
  background: var(--color-bajar-fondo); color: var(--color-bajar-icono); border: 1px solid var(--color-bajar-borde); box-shadow: var(--sombra-bajar); cursor: pointer; animation: pop var(--mov-medio) var(--ease-rebote); }
.btn-bajar[hidden] { display: none; }
.btn-bajar:hover { background: var(--color-morado-suave); }
.btn-bajar__contador { position: absolute; top: -6px; right: -4px; min-width: 22px; height: 22px; padding: 0 6px; border-radius: 11px; display: flex; align-items: center; justify-content: center;
  background: var(--color-bajar-contador); color: var(--color-bajar-contador-texto); font-family: var(--fuente-hud); font-size: 12px; font-weight: 700; }
.btn-bajar__contador[hidden] { display: none; }

/* ---------- Anti-spam ---------- */
.sistema--spam { color: var(--color-spam); font-weight: 700; }
.modal--spam .advertencia__icono { color: var(--color-spam); }
.spam__cuenta { display: block; text-align: center; font-family: var(--fuente-hud); font-size: 44px; line-height: 1.1; color: var(--color-spam); letter-spacing: 1px; }

/* ---------- Chats privados ---------- */
.modal--privado { max-width: 420px; }
.privado-invitacion { display: flex; flex-direction: column; align-items: center; gap: 10px; text-align: center; }
.privado-invitacion__icono { font-size: 48px; color: var(--color-privado); }
.privado-invitacion__texto { margin: 0; font-size: 16px; }
.cuadros-decision { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; width: 100%; margin-top: 6px; }
.cuadro-decision { aspect-ratio: 1 / 1; max-height: 140px; border-radius: var(--radio-md); border: 2px solid; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px;
  font-family: var(--fuente-titulo); font-weight: 700; font-size: 16px; cursor: pointer; transition: transform var(--mov-rapido) var(--ease-suave), background-color var(--mov-rapido) var(--ease-suave); }
.cuadro-decision .material-symbols-rounded { font-size: 36px; }
.cuadro-decision:active { transform: scale(.96); }
.cuadro-decision:disabled { opacity: .6; cursor: default; }
.cuadro-decision--aceptar { color: var(--color-aceptar); border-color: var(--color-aceptar); background: var(--color-aceptar-fondo); }
.cuadro-decision--aceptar:hover { background: color-mix(in srgb, var(--color-aceptar) 26%, transparent); }
.cuadro-decision--rechazar { color: var(--color-rechazar); border-color: var(--color-rechazar); background: var(--color-rechazar-fondo); }
.cuadro-decision--rechazar:hover { background: color-mix(in srgb, var(--color-rechazar) 26%, transparent); }
.separador--privados { margin: 14px 0 6px; color: var(--color-privado); font-family: var(--fuente-titulo); font-weight: 700; }
.separador--privados > span { display: inline-flex; align-items: center; gap: 6px; }
.separador--privados .material-symbols-rounded { font-size: 18px; }
.grupo-item__nombre:has(.grupo-item__candado) { display: flex; align-items: center; gap: 4px; }
.grupo-item__nombre > span:not(.material-symbols-rounded) { overflow: hidden; text-overflow: ellipsis; }
.grupo-item__candado { font-size: 16px; color: var(--color-privado); flex-shrink: 0; }
.miembro__privado { display: inline-flex; align-items: center; gap: 3px; font-size: 12px; color: var(--color-privado); }
.miembro__privado .material-symbols-rounded { font-size: 15px; }
.previa__dato--estado { display: inline-flex; align-items: center; gap: 6px; }
.previa__dato .material-symbols-rounded { font-size: 16px; vertical-align: middle; }

/* ---------- Menú: opciones en morado ("Hacer Admin", "Invitar a chat privado") ---------- */
.menu-flotante__item--morado { color: var(--color-accion-morada); }
.menu-flotante__item--morado .material-symbols-rounded { color: var(--color-accion-morada); }

/* ---------- Vista previa de invitación: lista de personas ---------- */
.previa__seccion { width: 100%; display: flex; flex-direction: column; gap: 6px; text-align: left; padding-top: 12px; border-top: 1px solid var(--color-gris); }
.previa__miembros { display: flex; flex-direction: column; max-height: 360px; overflow-y: auto; }
.miembro--compacto { padding: 6px 4px; margin: 0; }
.miembro--compacto:last-child { border-bottom: none; }

/* ---------- "Entrar como [nombre]" ---------- */
.entrar-como { display: flex; align-items: center; gap: 12px; width: 100%; padding: 12px 14px; border: 1px solid var(--color-morado); border-radius: var(--radio-md); background: var(--color-morado-suave); color: var(--color-texto); text-align: left; cursor: pointer;
  transition: background-color var(--mov-rapido) var(--ease-suave), box-shadow var(--mov-rapido) var(--ease-suave); }
.entrar-como:hover { box-shadow: var(--sombra-morado); }
.entrar-como:disabled { opacity: .6; cursor: default; }
.entrar-como__texto { flex: 1; display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.entrar-como__texto strong { font-family: var(--fuente-titulo); font-size: 16px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.entrar-como__texto span { font-size: 13px; color: var(--color-texto-suave); }
.entrar-como > .material-symbols-rounded { color: var(--color-morado-claro); }

/* ---------- Notas del Parche (v1.13.0; v1.14.0: estructura nueva con títulos, secciones, iconos y etiquetas) ---------- */
.notas-parche-btn { justify-content: center; }
.nota-version { background: var(--color-tarjeta); border: 1px solid var(--color-gris); border-radius: var(--radio-lg); padding: 18px; display: flex; flex-direction: column; gap: 14px; scroll-margin-top: 70px;
  transition: box-shadow var(--mov-medio) var(--ease-suave), border-color var(--mov-medio) var(--ease-suave); }
.nota-version--actual { border-color: var(--color-nota-actual); box-shadow: var(--sombra-morado); }
.nota-version--resaltada { border-color: var(--color-morado-claro); box-shadow: var(--sombra-morado-fuerte); }
/* Cabecera: icono grande + título (versión) y lema (subtítulo) + "Actual" y fecha */
.nota-version__cabecera { display: flex; align-items: center; gap: 12px; }
.nota-version__icono { flex-shrink: 0; width: 44px; height: 44px; display: flex; align-items: center; justify-content: center; border-radius: var(--radio-md); background: var(--color-morado-suave); color: var(--color-morado-claro); font-size: 26px; }
.nota-version--actual .nota-version__icono { background: var(--gradiente-principal); color: var(--color-blanco); }
.nota-version__id { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.nota-version__titulo { margin: 0; font-family: var(--fuente-titulo); font-size: 22px; font-weight: 800; line-height: 1.1; color: var(--color-texto); }
.nota-version__prefijo { font-family: var(--fuente-hud); font-size: 13px; font-weight: 400; letter-spacing: .12em; text-transform: uppercase; color: var(--color-morado-claro); vertical-align: middle; }
.nota-version__lema { margin: 0; font-size: 14px; font-style: italic; color: var(--color-texto-suave); }
.nota-version__lado { display: flex; flex-direction: column; align-items: flex-end; gap: 6px; flex-shrink: 0; }
.nota-version__actual { font-family: var(--fuente-hud); font-size: 11px; text-transform: uppercase; letter-spacing: 1px; padding: 2px 8px; border-radius: var(--radio-sm); background: var(--color-nota-actual); color: var(--color-blanco); }
.nota-version__fecha { display: inline-flex; align-items: center; gap: 4px; font-family: var(--fuente-hud); font-size: 13px; color: var(--color-texto-suave); white-space: nowrap; }
.nota-version__fecha .material-symbols-rounded { font-size: 16px; }
/* Resumen: cuántas novedades / mejoras / correcciones / cambios de servidor */
.nota-version__resumen { display: flex; flex-wrap: wrap; gap: 6px; padding-bottom: 12px; border-bottom: 1px dashed var(--color-gris); }
.nota-version__conteo { display: inline-flex; align-items: center; gap: 4px; font-family: var(--fuente-hud); font-size: 12px; padding: 2px 8px; border-radius: var(--radio-sm); border: 1px solid currentColor; }
.nota-version__conteo .material-symbols-rounded { font-size: 14px; }
.nota-version__conteo--nuevo { color: var(--color-etiqueta-nuevo); } .nota-version__conteo--mejora { color: var(--color-etiqueta-mejora); }
.nota-version__conteo--arreglo { color: var(--color-etiqueta-arreglo); } .nota-version__conteo--servidor { color: var(--color-etiqueta-servidor); }
/* Secciones (subtítulos) */
.nota-seccion { display: flex; flex-direction: column; gap: 8px; --color-seccion: var(--color-morado-claro); }
.nota-seccion--nuevo { --color-seccion: var(--color-etiqueta-nuevo); } .nota-seccion--mejora { --color-seccion: var(--color-etiqueta-mejora); }
.nota-seccion--arreglo { --color-seccion: var(--color-etiqueta-arreglo); } .nota-seccion--servidor { --color-seccion: var(--color-etiqueta-servidor); }
.nota-seccion__titulo { margin: 0; display: flex; align-items: center; gap: 8px; font-family: var(--fuente-titulo); font-size: 15px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--color-seccion); }
.nota-seccion__titulo .material-symbols-rounded { font-size: 20px; }
.nota-seccion__cuenta { margin-left: auto; font-family: var(--fuente-hud); font-size: 12px; min-width: 22px; text-align: center; padding: 1px 6px; border-radius: 999px; background: color-mix(in srgb, var(--color-seccion) 16%, transparent); }
.nota-lista { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
/* Cada cambio: icono + título con etiquetas + explicación */
.nota-item { display: flex; gap: 10px; padding: 10px 12px; border-radius: var(--radio-md); background: var(--color-tarjeta-2); border-left: 3px solid var(--color-seccion); }
.nota-item__icono { flex-shrink: 0; font-size: 22px; color: var(--color-seccion); margin-top: 1px; }
.nota-item__cuerpo { min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.nota-item__titulo { margin: 0; display: flex; flex-wrap: wrap; align-items: center; gap: 6px; font-family: var(--fuente-titulo); font-size: 15px; font-weight: 700; color: var(--color-texto); }
.nota-item__texto { margin: 0; font-size: 14px; line-height: 1.5; color: var(--color-texto-suave); overflow-wrap: anywhere; }
.nota-item__texto strong { color: var(--color-texto); }
.nota-item__texto code { font-family: var(--fuente-mono); font-size: 12px; padding: 1px 5px; border-radius: var(--radio-sm); background: var(--color-morado-suave); color: var(--color-morado-claro); }
/* Etiquetas de color */
.etiqueta { display: inline-flex; align-items: center; gap: 3px; font-family: var(--fuente-hud); font-size: 11px; font-weight: 400; letter-spacing: .06em; text-transform: uppercase; padding: 1px 7px 1px 5px; border-radius: 999px;
  color: var(--color-etiqueta); background: color-mix(in srgb, var(--color-etiqueta) 14%, transparent); border: 1px solid color-mix(in srgb, var(--color-etiqueta) 45%, transparent); }
.etiqueta .material-symbols-rounded { font-size: 13px; }
.etiqueta--nuevo { --color-etiqueta: var(--color-etiqueta-nuevo); } .etiqueta--mejora { --color-etiqueta: var(--color-etiqueta-mejora); }
.etiqueta--arreglo { --color-etiqueta: var(--color-etiqueta-arreglo); } .etiqueta--seguridad { --color-etiqueta: var(--color-etiqueta-seguridad); }
.etiqueta--diseno { --color-etiqueta: var(--color-etiqueta-diseno); } .etiqueta--servidor { --color-etiqueta: var(--color-etiqueta-servidor); }
/* Índice de versiones y leyenda */
.nota-indice { gap: 10px; }
.nota-indice__titulo { margin: 0; display: flex; align-items: center; gap: 6px; font-family: var(--fuente-titulo); font-size: 14px; font-weight: 700; color: var(--color-morado-claro); }
.nota-indice__titulo .material-symbols-rounded { font-size: 18px; }
.nota-indice__chip { font-family: var(--fuente-hud); }
.nota-indice__chip--actual { border-color: var(--color-nota-actual); color: var(--color-morado-claro); }
.nota-indice__leyenda { display: flex; flex-wrap: wrap; gap: 6px; }
.notas-parche__pie { text-align: center; }
@media (max-width: 420px) {
  .nota-version__cabecera { flex-wrap: wrap; }
  .nota-version__lado { flex-direction: row; align-items: center; width: 100%; justify-content: space-between; }
  .nota-version__titulo { font-size: 20px; }
}

/* ---------- Animaciones "Reducidas" ----------
   Se apagan TODAS las animaciones y transiciones menos las importantes: ventanas (modales), avisos (toasts), pantallas de advertencia y de spam,
   el botón para bajar y la entrada de mensajes nuevos. */
:root[data-movimiento="esencial"] *:not(.modal-fondo, .modal, .toast, .btn-bajar, .btn-bajar__contador, .fila.nuevo, .sistema.nuevo, .fecha-sep.nuevo, .modal--advertencia *),
:root[data-movimiento="esencial"] *:not(.modal--advertencia *)::before,
:root[data-movimiento="esencial"] *:not(.modal--advertencia *)::after { animation: none !important; transition: none !important; scroll-behavior: auto !important; }
:root[data-movimiento="esencial"]::view-transition-group(*), :root[data-movimiento="esencial"]::view-transition-old(*), :root[data-movimiento="esencial"]::view-transition-new(*) { animation: none !important; }


/* ============================================================
   v1.14.0 — ESTILOS NUEVOS
   ============================================================ */

/* ---------- Botones chicos y botón "lleno" (Crear grupo 3/3) ---------- */
.btn--chico { padding: 6px 12px; font-size: 13px; min-height: 0; gap: 6px; align-self: flex-start; }
.btn--chico .material-symbols-rounded { font-size: 18px; }
.btn--lleno { background: var(--color-boton-lleno); box-shadow: none; opacity: .75; cursor: not-allowed; }
.login__olvide { align-self: flex-end; }

/* ---------- Foto montada a medias sobre el banner (como WhatsApp) ---------- */
/* 1) Información del grupo, Perfil y chats privados: el banner va seguido de la cabecera (.previa) y su primer elemento es la foto */
.banner:not([hidden]) + .previa > .avatar:first-child,
.banner:not([hidden]) + .previa > .avatar-editable:first-child { margin-top: calc(var(--tam-foto-banner) / -2 - 14px); position: relative; z-index: 1; }
.banner:not([hidden]) + .previa > .avatar:first-child,
.banner:not([hidden]) + .previa > .avatar-editable:first-child > .avatar { box-shadow: 0 0 0 4px var(--color-anillo-foto); }
/* 2) Vista previa de una invitación: banner y foto dentro de la misma columna */
.banner--previa + .avatar { margin-top: calc(var(--tam-foto-banner) / -2 - 12px); position: relative; z-index: 1; box-shadow: 0 0 0 4px var(--color-anillo-foto); }
/* 3) Al tocar una foto (ventana) y en el formulario del grupo: .perfil-banner envuelve banner + foto */
.perfil-banner { position: relative; display: flex; flex-direction: column; align-items: center; }
.perfil-banner > .banner { width: 100%; margin: 0; }
.avatar--xxl { width: var(--tam-foto-banner-grande); height: var(--tam-foto-banner-grande); font-size: 42px; }
.avatar--sobre-banner { margin-top: calc(var(--tam-foto-banner-grande) / -2); position: relative; z-index: 1; box-shadow: 0 0 0 4px var(--color-anillo-foto); }
.perfil-banner__foto { margin-top: calc(var(--tam-foto-banner) / -2); position: relative; z-index: 1; }
.perfil-banner__foto .avatar { box-shadow: 0 0 0 4px var(--color-anillo-foto); }
.modal--foto .perfil-banner { margin-bottom: 4px; }
.banner--editable .banner__vacio { align-items: flex-start; padding-top: 14px; }   /* "Sin banner" arriba: la foto tapa la mitad de abajo */
/* El banner de las tarjetas llega de borde a borde (sin márgenes), como la portada de un perfil; las esquinas decorativas quedan por encima */
.tarjeta--con-banner > .banner:first-child:not(.banner--editable) { margin: -20px -20px 0; width: auto; border-width: 0 0 1px; border-radius: var(--radio-md) var(--radio-md) 0 0; }
.tarjeta--con-banner::before, .tarjeta--con-banner::after { z-index: 2; }

/* ---------- Chat privado temporal: tarjeta de aviso dentro del chat ---------- */
.aviso-privado { flex-direction: column; align-items: stretch; gap: 8px; width: min(94%, 420px); max-width: 94%; margin-block: 10px; padding: 12px 14px; font-style: normal; font-size: 13px; text-align: left;
  color: var(--color-texto); background: var(--color-privado-temporal-fondo); border: 1px solid var(--color-privado-temporal-borde); border-radius: var(--radio-md); }
.aviso-privado__cab { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; color: var(--color-privado-temporal); font-family: var(--fuente-titulo); font-size: 15px; }
.aviso-privado__cab .material-symbols-rounded { font-size: 20px; }
.aviso-privado__tiempo { margin-left: auto; font-family: var(--fuente-hud); font-size: 12px; font-weight: 400; }
.aviso-privado__texto { margin: 0; line-height: 1.45; color: var(--color-texto); }
.aviso-privado__personas { display: flex; flex-wrap: wrap; gap: 6px; }
.aviso-privado__persona { display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px; border-radius: 999px; font-size: 12px; color: var(--color-texto-suave); background: var(--color-tarjeta-2); border: 1px solid var(--color-gris); }
.aviso-privado__persona .material-symbols-rounded { font-size: 15px; }
.aviso-privado__persona--ok { color: var(--color-privado-guardado); border-color: var(--color-privado-guardado-borde); }
.aviso-privado__btn { align-self: center; }
.aviso-privado__estado { margin: 0; display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--color-texto-suave); }
.aviso-privado__estado .material-symbols-rounded { font-size: 18px; color: var(--color-privado-temporal); }
.aviso-privado--guardado { background: var(--color-privado-guardado-fondo); border-color: var(--color-privado-guardado-borde); }
.aviso-privado--guardado .aviso-privado__cab { color: var(--color-privado-guardado); }
.sistema--mantener { color: var(--color-privado-guardado); font-weight: 700; }

/* ---------- Avisos (toasts) con botón ---------- */
.toast--con-accion { display: flex; align-items: center; gap: 12px; pointer-events: auto; animation: toast-entra var(--mov-medio) var(--ease-rebote) backwards, toast-sale var(--mov-medio) var(--ease-entrada) 6.8s forwards; }
.toast__accion { font-family: var(--fuente-titulo); font-weight: 700; font-size: 14px; color: var(--color-morado-claro); padding: 4px 8px; border-radius: var(--radio-sm); }
.toast__accion:hover { background: var(--color-morado-suave); }

/* ---------- Teléfono y códigos por SMS ---------- */
.telefono { display: flex; gap: 8px; }
.telefono > .select, .telefono > .telefono__pais { flex: 0 0 42%; min-width: 0; }
.telefono__numero { flex: 1; min-width: 0; font-family: var(--fuente-mono); }
.codigo-sms__entrada { font-family: var(--fuente-mono); font-size: 24px; letter-spacing: .5em; text-align: center; }
.codigo-sms__destino { margin: 0; }
.codigo-sms__prueba { font-size: 13px; }
.codigo-sms__prueba-codigo { font-family: var(--fuente-mono); font-size: 16px; letter-spacing: .2em; color: var(--color-codigo-prueba); }
/* Perfil → Seguridad */
.titulo-seccion .material-symbols-rounded { vertical-align: -4px; margin-right: 6px; color: var(--color-morado-claro); }
.dato-seguridad { display: flex; align-items: center; gap: 12px; padding: 10px 12px; border-radius: var(--radio-md); background: var(--color-tarjeta-2); border: 1px solid var(--color-gris); }
.dato-seguridad__icono { color: var(--color-morado-claro); }
.dato-seguridad__texto { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.dato-seguridad__etiqueta { font-size: 12px; color: var(--color-texto-suave); }
.dato-seguridad__valor { font-family: var(--fuente-mono); font-size: 15px; }

/* ---------- Editor visual: botón para volver a recortar una imagen ---------- */
.editor-rico__recortar { position: absolute; top: 6px; right: 44px; width: 32px; height: 32px; border-radius: 50%; display: flex; align-items: center; justify-content: center;
  background: var(--color-velo); color: var(--color-blanco); transition: background-color var(--mov-rapido); }
.editor-rico__recortar:hover { background: var(--color-morado); }
.editor-rico__recortar .material-symbols-rounded { font-size: 18px; }

/* ---------- Tarjetas de los programadores 3 a 6 (Centro de ayuda): verde, azul, celeste y amarillo ---------- */
.bio--verde { --color-bio-negro: var(--color-bio3-negro); --color-bio-negro-2: var(--color-bio3-negro-2); --color-bio-rojo: var(--color-bio3-principal); --color-bio-rojo-claro: var(--color-bio3-claro);
  --color-bio-rojo-oscuro: var(--color-bio3-oscuro); --color-bio-texto: var(--color-bio3-texto); --color-bio-suave: var(--color-bio3-suave); --sombra-bio: 0 0 26px color-mix(in srgb, var(--color-bio3-principal) 45%, transparent); }
.bio--azul { --color-bio-negro: var(--color-bio4-negro); --color-bio-negro-2: var(--color-bio4-negro-2); --color-bio-rojo: var(--color-bio4-principal); --color-bio-rojo-claro: var(--color-bio4-claro);
  --color-bio-rojo-oscuro: var(--color-bio4-oscuro); --color-bio-texto: var(--color-bio4-texto); --color-bio-suave: var(--color-bio4-suave); --sombra-bio: 0 0 26px color-mix(in srgb, var(--color-bio4-principal) 45%, transparent); }
.bio--celeste { --color-bio-negro: var(--color-bio5-negro); --color-bio-negro-2: var(--color-bio5-negro-2); --color-bio-rojo: var(--color-bio5-principal); --color-bio-rojo-claro: var(--color-bio5-claro);
  --color-bio-rojo-oscuro: var(--color-bio5-oscuro); --color-bio-texto: var(--color-bio5-texto); --color-bio-suave: var(--color-bio5-suave); --sombra-bio: 0 0 26px color-mix(in srgb, var(--color-bio5-principal) 45%, transparent); }
.bio--amarillo { --color-bio-negro: var(--color-bio6-negro); --color-bio-negro-2: var(--color-bio6-negro-2); --color-bio-rojo: var(--color-bio6-principal); --color-bio-rojo-claro: var(--color-bio6-claro);
  --color-bio-rojo-oscuro: var(--color-bio6-oscuro); --color-bio-texto: var(--color-bio6-texto); --color-bio-suave: var(--color-bio6-suave); --sombra-bio: 0 0 26px color-mix(in srgb, var(--color-bio6-principal) 45%, transparent); }
