/* ============================================================
   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';

  /* v1.22.1 — Tipografías nuevas (Google Fonts), listas para usar con var(--fuente-…).
     Todas están cargadas en el <link> de Google Fonts de cada página, salvo Orbitron (ver nota abajo). */
  --fuente-orbitron: 'Orbitron', sans-serif;             /* títulos (<h>) futuristas; solo peso 900 en el enlace de Google Fonts */
  --fuente-oxanium: 'Oxanium', sans-serif;               /* párrafos (<p>); pesos 200 a 800 */
  --fuente-bungee-hairline: 'Bungee Hairline', sans-serif;   /* decorativa: letras de línea fina para titulares grandes */
  --fuente-geist-pixel: 'Geist Pixel', sans-serif;       /* estilo píxel */
  --fuente-geo: 'Geo', sans-serif;                       /* geométrica (normal y cursiva) */
  --fuente-geostar: 'Geostar', sans-serif;               /* decorativa geométrica */
  --fuente-ibm-plex-mono: 'IBM Plex Mono', monospace;    /* monoespaciada, pesos 100 a 700 (con cursiva) */
  --fuente-jetbrains-mono: 'JetBrains Mono', monospace;  /* monoespaciada, pesos 100 a 800 (con cursiva) */
  --fuente-major-mono: 'Major Mono Display', monospace;  /* monoespaciada decorativa para titulares */
  --fuente-monda: 'Monda', sans-serif;                   /* sans clara, pesos 400 a 700 */
  --fuente-quantico: 'Quantico', sans-serif;             /* futurista; 400 y 700 (con cursiva) */
  --fuente-saira-condensed: 'Saira Condensed', sans-serif;   /* condensada, pesos 100 a 900 */
  --fuente-turret-road: 'Turret Road', sans-serif;       /* futurista, pesos 200 a 800 */

  /* ---- 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-warning-texto);     /* v1.15.0: colores invertidos con "Seguridad" (antes azul) */
  --color-etiqueta-arreglo: var(--color-error-texto);
  --color-etiqueta-seguridad: var(--color-info-texto);     /* v1.15.0: colores invertidos con "Mejora" (antes amarillo) */
  --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;

  /* ---- v1.15.0: formulario completado (verde), teléfono con banderas, avisos a los que se responde, campanita de notificaciones y ventajas de crear cuenta ---- */
  --color-verde: #22C55E;                 /* los detalles morados de un formulario enviado con éxito pasan a estos verdes (misma función que --color-morado*) */
  --color-verde-claro: #4ADE80;
  --color-verde-medio: #16A34A;
  --color-verde-oscuro: #14532D;
  --color-verde-acento: #15803D;
  --mov-verde: 650ms;                     /* duración del paso de morado a verde */
  --radio-bandera: 4px;                   /* esquinas redondeadas de las banderas */
  --color-bandera-borde: color-mix(in srgb, var(--color-blanco) 18%, transparent);   /* filo sutil alrededor de cada bandera (se nota en las banderas blancas) */
  --color-vibra: var(--color-error);      /* borde rojo del teléfono al pasarse del máximo de dígitos */
  --color-campana-contador: var(--color-error);              /* círculo rojo con los avisos sin leer */
  --color-campana-contador-texto: var(--color-blanco);
  --color-notif-nueva: var(--color-morado-suave);            /* fondo de un aviso sin leer */
  --color-notif-punto: var(--color-morado-claro);            /* punto de "sin leer" */
  --ancho-panel-notif: 380px;
  --color-ventajas-fondo: color-mix(in srgb, var(--color-morado) 10%, var(--color-tarjeta-2));
  --color-ventajas-icono: var(--color-morado-claro);

  /* ---- v1.16.0: textos sobre fotos y videos, botón de grabar de la cámara, audios que no se pueden reproducir y borrar la cuenta ---- */
  --fuente-edicion-1: 'Space Grotesk', sans-serif;       /* Clásica */
  --fuente-edicion-2: 'Oxanium', sans-serif;             /* Moderna */
  --fuente-edicion-3: 'Playwrite ID', cursive;           /* A mano */
  --fuente-edicion-4: 'Graduate', serif;                 /* Impacto */
  --fuente-edicion-5: 'Turret Road', sans-serif;         /* Futurista */
  --fuente-edicion-6: 'Cutive Mono', monospace;          /* Máquina */
  --color-edicion-1: #FFFFFF;   /* blanco */
  --color-edicion-2: #000000;   /* negro */
  --color-edicion-3: #EF4444;   /* rojo */
  --color-edicion-4: #FB923C;   /* naranja */
  --color-edicion-5: #FACC15;   /* amarillo */
  --color-edicion-6: #22C55E;   /* verde */
  --color-edicion-7: #22D3EE;   /* cian */
  --color-edicion-8: #3B82F6;   /* azul */
  --color-edicion-9: #B83DBA;   /* morado de ÉLIX */
  --color-edicion-10: #F472B6;  /* rosa */
  --color-edicion-velo: rgba(0, 0, 0, 0.55);             /* fondo "oscuro suave" detrás del texto */
  --color-edicion-sombra: rgba(0, 0, 0, 0.75);           /* sombra del texto sin fondo (se lee sobre fotos claras) */
  --color-edicion-fondo: #050507;                        /* fondo del editor de textos */
  --color-edicion-papelera: var(--color-error);
  --color-grabar-borde: var(--color-blanco);             /* aro del botón de grabar */
  --color-grabar-centro: var(--color-blanco);            /* centro en reposo (blanco) */
  --color-grabar-activo: var(--color-error);             /* centro al grabar (rojo, cuadrado) */
  --color-rep-error-fondo: color-mix(in srgb, var(--color-error) 12%, var(--color-tarjeta-2));
  --color-rep-error-borde: color-mix(in srgb, var(--color-error) 45%, transparent);
  --color-borrar-cuenta: var(--color-error-texto);

  /* ---- v1.17.0: barra de escribir nueva, vista previa de videos, corazones y campanita con fotos ---- */
  --color-entrada-caja: var(--color-tarjeta-2);                                           /* "píldora" de la barra de escribir */
  --color-entrada-borde: var(--color-gris);
  --color-entrada-icono: var(--color-texto-suave);                                        /* emojis, adjuntar y cámara dentro de la píldora */
  --radio-entrada: 26px;                                                                  /* esquinas redondas de la píldora */
  --video-previa-max: 133.34%;                                                            /* vista previa de un video en el chat: como mucho 4:3 de alto (alto = 4/3 del ancho) */
  --color-video-previa-fondo: var(--color-negro);
  --color-corazon: #FF3B6B;                                                               /* corazones a los perfiles */
  --color-corazon-claro: #FF7A9C;
  --color-corazon-suave: color-mix(in srgb, var(--color-corazon) 16%, transparent);
  --color-corazon-borde: color-mix(in srgb, var(--color-corazon) 50%, transparent);
  --sombra-corazon: 0 0 22px color-mix(in srgb, var(--color-corazon) 45%, transparent);
  --gradiente-corazon: linear-gradient(135deg, var(--color-corazon), var(--color-morado));   /* pantalla de corazón mutuo */
  --color-mutuo-velo: color-mix(in srgb, var(--color-negro) 78%, transparent);
  --color-notif-aro: var(--color-tarjeta-2);                                              /* aro del iconito montado sobre la foto en la campanita */
  /* v1.18.0 — Listas de cosas por hacer (verde al 100 %, rojo si vencen), "en línea", notificación de ÉLIX, vista previa de enlaces y configuración avanzada */
  --color-lista-ok: var(--color-success);
  --color-lista-ok-texto: var(--color-success-texto);
  --color-lista-ok-suave: var(--color-success-suave);
  --color-lista-mal: var(--color-error);
  --color-lista-mal-texto: var(--color-error-texto);
  --color-lista-mal-suave: var(--color-error-suave);
  --color-en-linea: var(--color-success);
  --color-notif-elix-fondo: color-mix(in srgb, var(--color-tarjeta-2) 94%, transparent);
  --color-notif-elix-borde: color-mix(in srgb, var(--color-morado) 40%, transparent);
  --sombra-notif-elix: 0 12px 34px color-mix(in srgb, var(--color-negro) 60%, transparent);
  --color-previa-enlace-fondo: color-mix(in srgb, var(--color-negro) 22%, transparent);
  --color-previa-enlace-borde: color-mix(in srgb, currentColor 22%, transparent);
  --color-config-marca: var(--color-warning-texto);
  --color-config-marca-fondo: var(--color-warning-suave);
  /* v1.19.0 — Palabras censuradas en rojo, configuración avanzada en GRIS (Información del grupo) y estado de conexión (no molestar / fantasma) */
  --color-censurado: #FF5C5C;                                                             /* los •••• que tapan una palabra prohibida */
  --color-censurado-fondo: color-mix(in srgb, var(--color-error) 18%, transparent);       /* tinte detrás de los •••• (se leen sobre la burbuja morada) */
  --color-censurado-fondo-fuerte: color-mix(in srgb, var(--color-negro) 45%, transparent); /* dentro de la ventana roja de advertencia */
  --color-config-gris: #A3A3AE;                                                           /* acento gris de la configuración avanzada (en lugar del morado) */
  --color-config-gris-claro: #C4C4CC;
  --color-config-gris-borde: color-mix(in srgb, var(--color-config-gris) 45%, transparent);
  --color-config-gris-suave: color-mix(in srgb, var(--color-config-gris) 15%, transparent);
  --color-btn-gris-fondo: var(--color-tarjeta-2);
  --color-btn-gris-borde: var(--color-gris-claro);
  --color-no-molestar: var(--color-error);                                                /* puntito y texto de "no molestar" */
  --color-no-molestar-texto: var(--color-error-texto);
  --color-fantasma: var(--color-texto-suave);
  /* v1.20.0 — Palabra censurada que se ve SIN CENSURAR (solo en tu advertencia), estado de conexión actual y "Eliminar cuenta" en Ajustes */
  --color-censurado-revelado: var(--color-blanco);                                        /* texto de la palabra original dentro de la advertencia roja */
  --color-censurado-revelado-fondo: color-mix(in srgb, var(--color-error) 70%, transparent);
  --color-presencia-normal: var(--color-en-linea);
  --color-presencia-no-molestar: var(--color-no-molestar);
  --color-presencia-fantasma: var(--color-fantasma);
  --color-ajuste-peligro: var(--color-error-texto);
  --color-ajuste-peligro-borde: var(--color-error-borde);
  --color-ajuste-peligro-fondo: var(--color-error-suave);
}

/* ---- Tema claro: solo cambia valores de variables; se activa con <html data-tema="claro"> ---- */
:root[data-tema="claro"] {
  color-scheme: light;
  /* v1.19.0: rojo y gris con más contraste sobre fondo claro */
  --color-censurado: #D11A1A;
  --color-config-gris: #6E6E7A;
  --color-config-gris-claro: #55555F;
  --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);
  /* v1.15.0: verdes del formulario completado con contraste en el tema claro y filo de las banderas */
  --color-verde: #16A34A;
  --color-verde-claro: #15803D;
  --color-verde-medio: #15803D;
  --color-verde-oscuro: #14532D;
  --color-verde-acento: #166534;
  --color-bandera-borde: color-mix(in srgb, var(--color-negro) 14%, transparent);
  /* v1.17.0: corazones con contraste en el tema claro y píldora de escribir blanca */
  --color-corazon: #E11D48;
  --color-corazon-claro: #BE123C;
  --color-entrada-caja: var(--color-tarjeta);
  --color-mutuo-velo: color-mix(in srgb, var(--color-negro) 60%, transparent);
  /* v1.18.0 */
  --color-notif-elix-fondo: color-mix(in srgb, var(--color-tarjeta) 96%, transparent);
  --sombra-notif-elix: 0 12px 30px color-mix(in srgb, var(--color-morado-oscuro) 22%, transparent);
  --color-previa-enlace-fondo: color-mix(in srgb, var(--color-blanco) 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); }
/* v1.22.0 — Requisitos de la contraseña (Comun.requisitosClave): "[icono] Texto"; rojo con "cancel" si falta, verde con "check_circle" si se cumple. Solo usa variables del :root */
.miembro__real { color: var(--color-texto-suave); font-size: .8125rem; }   /* v1.22.0: nombre real junto al apodo en la lista de miembros */
.foto-grande__real {   /* v1.22.0: "Nombre real: …" en el perfil de alguien a quien le puse apodo */
  display: flex; align-items: center; gap: 6px; justify-content: center; color: var(--color-texto-suave); font-size: .875rem; margin-top: 4px;
}
.foto-grande__real .icono { font-size: 1.1rem; }
.requisitos-clave { list-style: none; margin: 6px 0 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
.requisito { display: flex; align-items: center; gap: 6px; font-size: 13px; transition: color .2s ease; }
.requisito .material-symbols-rounded { font-size: 18px; font-variation-settings: 'FILL' 1; }
.requisito--mal { color: var(--color-error-texto); }
.requisito--ok { color: var(--color-success-texto); }
.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; }
/* v1.18.0: el recuadro arranca cubriendo TODA la foto (antes el 90 %). Para que sus asideros de las esquinas se vean enteros, la foto tiene 14 px de aire alrededor:
   el recorte de la sombra oscura lo hace ahora .recorte (antes .recorte__marco, que cortaba los asideros por la mitad) */
.recorte { display: flex; justify-content: center; padding: 14px; overflow: hidden; border-radius: var(--radio-sm); }
.recorte__marco { position: relative; overflow: visible; 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: la recorta .recorte */
.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); }

/* ============================================================
   v1.15.0 — Formularios completados en verde, teléfono con banderas, responder avisos del chat, spam solo sobre el chat, perfil al tocar la fila,
   banner vacío que se puede tocar, ventajas de crear cuenta, barra de formato del celular sobre el teclado, @todos y campanita de notificaciones.
   Todos los colores y tipografías salen de las variables del :root.
   ============================================================ */

/* ---------- Formulario completado: los morados pasan a verde con una animación ----------
   Qué hace: se REGISTRAN los colores morados como colores animables (@property) y la clase .form-completo los lleva a los verdes del :root. Las variables que se
   derivan del morado (tintes, bordes, halos, sombras, degradado del botón) se vuelven a declarar dentro del formulario para que sigan al color mientras cambia.
   Para qué sirve: una confirmación clara y linda de que el formulario salió bien (comun.js → Comun.formularioCompleto). */
@property --color-morado { syntax: '<color>'; inherits: true; initial-value: #B83DBA; }
@property --color-morado-claro { syntax: '<color>'; inherits: true; initial-value: #CF5AD1; }
@property --color-morado-medio { syntax: '<color>'; inherits: true; initial-value: #AF39B1; }
@property --color-morado-oscuro { syntax: '<color>'; inherits: true; initial-value: #651866; }
@property --color-acento { syntax: '<color>'; inherits: true; initial-value: #9200D1; }
@keyframes form-a-verde {
  to { --color-morado: var(--color-verde); --color-morado-claro: var(--color-verde-claro); --color-morado-medio: var(--color-verde-medio); --color-morado-oscuro: var(--color-verde-oscuro); --color-acento: var(--color-verde-acento); }
}
@keyframes form-destello { 0% { box-shadow: none; } 45% { box-shadow: 0 0 34px color-mix(in srgb, var(--color-verde) 55%, transparent); } 100% { box-shadow: var(--sombra-tarjeta); } }
.form-completo {
  animation: form-a-verde var(--mov-verde) var(--ease-suave) forwards;
  --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-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-morado-fuerte: 0 0 30px color-mix(in srgb, var(--color-morado) 55%, transparent);
  --gradiente-principal: linear-gradient(135deg, var(--color-morado), var(--color-morado-oscuro));
  --color-editor-foco: var(--color-morado);
  --color-subida-avance: var(--color-morado);
  --color-mencion-texto: var(--color-morado-claro);
  accent-color: var(--color-morado);
}
:root[data-tema="claro"] .form-completo { --color-halo: color-mix(in srgb, var(--color-morado) 18%, transparent); --sombra-morado: 0 4px 18px color-mix(in srgb, var(--color-morado) 30%, transparent); }
.tarjeta.form-completo, form.form-completo > .tarjeta { animation: form-a-verde var(--mov-verde) var(--ease-suave) forwards, form-destello calc(var(--mov-verde) * 1.6) var(--ease-suave); }
form.form-completo > .tarjeta { animation-name: none, form-destello; }   /* las tarjetas de adentro solo destellan: el color ya lo heredan del formulario */
.form-completo .icono-titulo .material-symbols-rounded { animation: pop var(--mov-lento) var(--ease-rebote); }
.form-completo .mensaje-form--ok { animation: pop var(--mov-medio) var(--ease-rebote); }

/* ---------- Teléfono: bandera + prefijo, lista de países con buscador y vibración roja ---------- */
.bandera { display: inline-block; width: 1.4em; height: 1.05em; border-radius: var(--radio-bandera); background-size: cover; background-position: center; box-shadow: 0 0 0 1px var(--color-bandera-borde); flex-shrink: 0; overflow: hidden; }
.telefono > .telefono__pais { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 6px; width: auto; min-width: 0; padding-inline: 10px 6px; cursor: pointer; font-family: var(--fuente-mono); color: var(--color-texto); text-align: left; }
.telefono__bandera { display: inline-flex; font-size: 20px; }
.telefono__prefijo { font-size: 15px; }
.telefono__flecha { font-size: 20px; color: var(--color-texto-suave); transition: transform var(--mov-rapido) var(--ease-suave); }
.telefono__pais[aria-expanded="true"] .telefono__flecha { transform: rotate(180deg); }
.telefono__pais[aria-expanded="true"] { border-color: var(--color-morado); }
.telefono--vibra { animation: sacudir 420ms var(--ease-suave); }
.telefono--vibra .telefono__numero, .telefono--vibra .telefono__numero:focus { border-color: var(--color-vibra); box-shadow: 0 0 0 3px var(--color-error-suave); color: var(--color-error-texto); }
.paises { position: fixed; z-index: 150; display: flex; flex-direction: column; gap: 6px; padding: 6px; min-width: 250px; 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); }
.paises__buscar { flex-shrink: 0; padding: 9px 12px; font-size: 15px; }
.paises__items { overflow-y: auto; overscroll-behavior: contain; display: flex; flex-direction: column; }
.paises__item { display: flex; align-items: center; gap: 10px; width: 100%; padding: 10px; border-radius: var(--radio-sm); font-size: 15px; text-align: left; color: var(--color-texto); transition: background-color var(--mov-rapido) var(--ease-suave); }
.paises__item .bandera { font-size: 20px; }
.paises__item:hover, .paises__item:focus-visible { background: var(--color-morado-suave); }
.paises__item--activo { background: var(--color-morado-suave); color: var(--color-morado-claro); font-weight: 700; }
.paises__nombre { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.paises__prefijo { font-family: var(--fuente-mono); font-size: 13px; color: var(--color-texto-suave); }
.paises .nota { padding: 10px; }

/* ---------- Responder a los avisos del chat ---------- */
.sistema--responder { position: relative; touch-action: pan-y; user-select: none; -webkit-user-select: none; }
.sistema__deslizar { position: absolute; left: -30px; top: 50%; margin-top: -12px; width: 24px; height: 24px; 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(.6 + var(--prog, 0) * .4)); pointer-events: none; }
.sistema__deslizar .material-symbols-rounded { font-size: 15px; }
.sistema:not(.sistema--responder) .sistema__deslizar { display: none; }
.sistema__responder { display: none; width: 26px; height: 26px; margin-left: 2px; border-radius: 50%; align-items: center; justify-content: center; color: var(--color-morado-claro); background: var(--color-morado-suave); flex-shrink: 0; font-style: normal; transition: transform var(--mov-rapido) var(--ease-rebote), background-color var(--mov-rapido); }
.sistema__responder .material-symbols-rounded { font-size: 16px; }
.sistema__responder:hover { background: var(--color-morado); color: var(--color-blanco); transform: scale(1.1); }
/* En la computadora el botón aparece a la derecha SOLO al pasar el mouse por encima del aviso (o al llegar con el teclado) */
@media (hover: hover) and (pointer: fine) {
  .sistema--responder .sistema__responder { display: inline-flex; visibility: hidden; opacity: 0; transform: translateX(-4px); transition: opacity var(--mov-rapido) var(--ease-suave), transform var(--mov-rapido) var(--ease-suave), visibility 0s var(--mov-rapido); }
  .sistema--responder:hover .sistema__responder, .sistema__responder:focus-visible { visibility: visible; opacity: 1; transform: none; transition-delay: 0s; }
}

/* ---------- Suspensión por spam: la ventana roja tapa SOLO el chat (la barra superior sigue libre) ---------- */
.modal-fondo--dentro { position: absolute; left: 0; right: 0; bottom: 0; z-index: 25; }

/* ---------- Información del grupo: toda la fila de una persona abre su perfil ---------- */
.miembro--tocable { cursor: pointer; }
.miembro--tocable:focus-visible { outline: 2px solid var(--color-morado-claro); outline-offset: -2px; }
.miembro--tocable:active { background: var(--color-morado-borde); }

/* ---------- Banner vacío: se puede tocar para elegirlo ---------- */
.banner--elegible { cursor: pointer; transition: border-color var(--mov-rapido) var(--ease-suave), background-color var(--mov-rapido) var(--ease-suave); }
.banner--elegible:hover, .banner--elegible:focus-visible { border-color: var(--color-morado); background: color-mix(in srgb, var(--color-morado) 8%, var(--color-banner-fondo)); outline: none; }
.banner--elegible:hover .banner__vacio, .banner--elegible:focus-visible .banner__vacio { color: var(--color-morado-claro); }
.banner--elegible:active { transform: scale(.995); }

/* ---------- Ventajas de crear cuenta ---------- */
.ventajas-cuenta { display: flex; flex-direction: column; gap: 10px; padding: 14px; border: 1px solid var(--color-morado-borde); border-radius: var(--radio-md); background: var(--color-ventajas-fondo); }
.ventajas-cuenta__titulo { display: flex; align-items: center; gap: 8px; font-family: var(--fuente-titulo); font-size: 16px; font-weight: 800; color: var(--color-texto); letter-spacing: .02em; }
.ventajas-cuenta__titulo .material-symbols-rounded { color: var(--color-ventajas-icono); }
.ventajas-cuenta__lista { list-style: none; display: flex; flex-direction: column; gap: 9px; }
.ventajas-cuenta__item { display: flex; align-items: flex-start; gap: 10px; animation: entrar var(--mov-medio) var(--ease-salida) backwards; animation-delay: calc(var(--i, 0) * 60ms); }
.ventajas-cuenta__item > div { display: flex; flex-direction: column; gap: 1px; font-size: 13px; color: var(--color-texto-suave); line-height: 1.35; }
.ventajas-cuenta__item strong { font-size: 14px; color: var(--color-texto); }
.ventajas-cuenta__icono { flex-shrink: 0; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; border-radius: var(--radio-md); background: var(--color-morado-suave); color: var(--color-ventajas-icono); font-size: 19px; }
.ventajas-cuenta__pie { display: flex; align-items: center; gap: 6px; font-size: 12px; font-family: var(--fuente-hud); color: var(--color-success-texto); }
.ventajas-cuenta__pie .material-symbols-rounded { font-size: 16px; }

/* ---------- Editor de descripciones en el celular: barra de formato flotando sobre el teclado ---------- */
.editor-rico__dock { display: flex; flex-direction: column; gap: 6px; }
.editor-rico__dock--flotante { position: fixed; left: 0; right: 0; bottom: 0; z-index: 140; padding: 6px max(8px, env(safe-area-inset-right)) calc(6px + env(safe-area-inset-bottom)) max(8px, env(safe-area-inset-left)); background: var(--color-tarjeta); border-top: 1px solid var(--color-morado-borde); box-shadow: 0 -6px 20px color-mix(in srgb, var(--color-negro) 40%, transparent); animation: panel-sube var(--mov-rapido) var(--ease-salida); }
.editor-rico__dock--flotante .editor-rico__barra { flex-wrap: nowrap; overflow-x: auto; justify-content: space-between; scrollbar-width: none; }
.editor-rico__dock--flotante .editor-rico__barra::-webkit-scrollbar { display: none; }
.editor-rico__dock--flotante .editor-rico__emojis { height: min(260px, 38dvh); }
body.con-dock-editor { padding-bottom: calc(var(--alto-dock-editor, 56px) + 12px); }
.editor-rico--dock .editor-rico__area { scroll-margin-bottom: calc(var(--alto-dock-editor, 56px) + 16px); }

/* ---------- @todos / @all ---------- */
.mencion--todos { cursor: default; }
.menciones__item--todos { border-bottom: 1px dashed var(--color-gris); border-radius: var(--radio-sm) var(--radio-sm) 0 0; }
.menciones__todos-icono { width: 32px; height: 32px; flex-shrink: 0; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: var(--gradiente-principal); color: var(--color-blanco); }
.menciones__todos-icono .material-symbols-rounded { font-size: 19px; }
.menciones__nota { margin-left: auto; font-size: 12px; color: var(--color-texto-suave); white-space: nowrap; }

/* ---------- Campanita de notificaciones (Mis grupos) ---------- */
.campana { position: relative; }
.campana__contador { position: absolute; top: 3px; right: 2px; min-width: 18px; height: 18px; padding: 0 5px; border-radius: 9px; display: flex; align-items: center; justify-content: center;
  background: var(--color-campana-contador); color: var(--color-campana-contador-texto); font-family: var(--fuente-hud); font-size: 11px; line-height: 1; box-shadow: 0 0 0 2px var(--color-tarjeta); animation: pop var(--mov-medio) var(--ease-rebote); pointer-events: none; }
.campana--con-avisos .campana__icono { color: var(--color-morado-claro); font-variation-settings: 'FILL' 1; }
@keyframes campana-sacude { 0%, 100% { transform: rotate(0); } 15% { transform: rotate(16deg); } 30% { transform: rotate(-14deg); } 45% { transform: rotate(10deg); } 60% { transform: rotate(-6deg); } 75% { transform: rotate(3deg); } }
.campana--sacude .campana__icono { animation: campana-sacude 900ms var(--ease-suave); transform-origin: 50% 10%; }
.notif-panel { position: fixed; z-index: 120; right: max(10px, env(safe-area-inset-right)); width: min(var(--ancho-panel-notif), calc(100vw - 20px)); max-height: min(72dvh, 560px); display: flex; flex-direction: column; gap: 8px; padding: 12px;
  background: var(--color-tarjeta); 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-medio) var(--ease-salida); transform-origin: top right; }
.notif-panel--sale { animation: menu-sale 180ms var(--ease-entrada) forwards; }
.notif-panel__cabecera { display: flex; align-items: center; gap: 8px; }
.notif-panel__icono { color: var(--color-morado-claro); }
.notif-panel__titulo { flex: 1; font-family: var(--fuente-titulo); font-size: 17px; font-weight: 800; letter-spacing: .03em; }
.notif-panel__todas { align-self: flex-end; }
.notif-panel__todas:disabled { opacity: .45; cursor: default; }
.notif-panel__lista { list-style: none; overflow-y: auto; overscroll-behavior: contain; display: flex; flex-direction: column; gap: 4px; margin: 0 -4px; padding: 0 4px; }
.notif-panel__vacio { display: flex; flex-direction: column; align-items: center; gap: 6px; padding: 26px 10px; text-align: center; color: var(--color-texto-suave); }
.notif-panel__vacio .material-symbols-rounded { font-size: 44px; color: var(--color-gris-claro); }
.notif { animation: item-entra var(--mov-medio) var(--ease-salida) backwards; }
.notif__boton { position: relative; display: flex; align-items: flex-start; gap: 10px; width: 100%; padding: 10px; border-radius: var(--radio-md); text-align: left; color: var(--color-texto); transition: background-color var(--mov-rapido) var(--ease-suave), transform var(--mov-rapido) var(--ease-suave); }
.notif__boton:hover { background: var(--color-morado-suave); }
.notif__boton:active { transform: scale(.98); }
.notif--nueva .notif__boton { background: var(--color-notif-nueva); }
.notif--nueva .notif__texto { font-weight: 700; }
.notif--cerrada .notif__boton { opacity: .72; }
.notif__icono { flex-shrink: 0; width: 36px; height: 36px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 20px; }
.notif__icono .material-symbols-rounded { font-size: 20px; }
.notif__icono--morado { background: var(--color-morado-suave); color: var(--color-morado-claro); }
.notif__icono--ok { background: var(--color-success-suave); color: var(--color-success-texto); }
.notif__icono--error { background: var(--color-error-suave); color: var(--color-error-texto); }
.notif__icono--aviso { background: var(--color-warning-suave); color: var(--color-warning-texto); }
.notif__cuerpo { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.notif__texto { font-size: 14px; line-height: 1.35; overflow-wrap: anywhere; }
.notif__meta { display: flex; flex-wrap: wrap; gap: 4px 8px; font-size: 12px; color: var(--color-texto-suave); }
.notif__grupo { font-weight: 700; color: var(--color-morado-claro); max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.notif__hora { font-family: var(--fuente-hud); }
.notif__punto { flex-shrink: 0; align-self: center; width: 9px; height: 9px; border-radius: 50%; background: var(--color-notif-punto); box-shadow: 0 0 8px var(--color-notif-punto); }
@media (max-width: 480px) { .notif-panel { left: 10px; right: 10px; width: auto; } }


/* ============================================================
   v1.16.0 — Textos sobre fotos y videos, botón de grabar (blanco → cuadrado rojo) y tiempo arriba, audios que no se pueden reproducir,
   borrar la cuenta (casillas) y botón "Aa" de las miniaturas. Todos los colores y tipografías salen de las variables del :root.
   ============================================================ */

/* ---------- Cámara: botón de grabar y tiempo de grabación ---------- */
.camara .camara__disparo { border-color: var(--color-grabar-borde); }
.camara[data-modo="video"] .camara__disparo-centro { background: var(--color-grabar-centro); }   /* en reposo el botón es BLANCO */
.camara__disparo-centro { transition: width var(--mov-medio) var(--ease-rebote), height var(--mov-medio) var(--ease-rebote), border-radius var(--mov-medio) var(--ease-salida), background-color var(--mov-medio) var(--ease-suave); }
.camara.camara--grabando .camara__disparo-centro { width: 30px; height: 30px; border-radius: var(--radio-md); background: var(--color-grabar-activo); animation: grabar-late 1.4s var(--ease-suave) infinite; }
.camara.camara--grabando .camara__disparo { border-color: var(--color-grabar-activo); }
@keyframes grabar-late { 0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--color-grabar-activo) 55%, transparent); } 50% { box-shadow: 0 0 0 10px transparent; } }
.camara__tiempo { position: absolute; z-index: 3; top: calc(14px + env(safe-area-inset-top)); left: 50%; transform: translateX(-50%); display: inline-flex; align-items: center; gap: 8px; font-size: 20px; letter-spacing: 1px; padding: 6px 14px; animation: aparecer var(--mov-medio) var(--ease-suave); }
.camara__punto { width: 10px; height: 10px; border-radius: 50%; background: var(--color-camara-texto); animation: latido 1s steps(2, jump-none) infinite; }
.camara__girar--gira .material-symbols-rounded { animation: girar-camara 450ms var(--ease-salida); }
@keyframes girar-camara { from { transform: rotateY(0); } to { transform: rotateY(180deg); } }

/* ---------- Audio que no se puede reproducir ---------- */
.rep.rep--error { flex-wrap: wrap; background: var(--color-rep-error-fondo); border: 1px solid var(--color-rep-error-borde); border-radius: var(--radio-md); padding: 8px; }
.rep--error > .rep__btn, .rep--error > .rep__centro { display: none; }
.rep-error { display: flex; align-items: flex-start; gap: 10px; width: 100%; animation: entrar var(--mov-medio) var(--ease-salida); }
.rep-error__icono { flex-shrink: 0; width: 38px; height: 38px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: var(--color-error-suave); color: var(--color-error-texto); }
.rep-error__datos { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.rep-error__titulo { font-size: 13px; color: var(--color-texto); }
.rep-error__texto { font-size: 12px; line-height: 1.35; color: var(--color-texto-suave); }
.fila--propia .rep-error__titulo, .fila--propia .rep-error__texto { color: var(--color-blanco); }
.rep-error__acciones { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 4px; }
.rep-error__btn { display: inline-flex; align-items: center; gap: 4px; padding: 4px 10px; border-radius: 999px; font-family: var(--fuente-titulo); font-size: 12px; font-weight: 700; color: var(--color-texto); background: var(--color-velo-suave); border: 1px solid var(--color-gris); }
.rep-error__btn .material-symbols-rounded { font-size: 16px; }
.rep-error__btn:hover { border-color: var(--color-morado); color: var(--color-morado-claro); }

/* ---------- Miniaturas del chat: botón "Aa" (agregar texto) ---------- */
.adjunto__texto { position: absolute; left: 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); }
.adjunto__texto::after { content: ''; position: absolute; inset: -4px; }
.adjunto__texto:hover { background: var(--color-morado); }
.adjunto__aa { font-family: var(--fuente-titulo); font-size: 11px; font-weight: 800; letter-spacing: -.02em; }

/* ---------- Editor de textos (textos.js) ---------- */
.textos { position: fixed; inset: 0; z-index: 170; display: flex; flex-direction: column; background: var(--color-edicion-fondo); color: var(--color-blanco); animation: aparecer var(--mov-medio) var(--ease-suave); }
.textos--saliendo { animation: desvanecer 180ms var(--ease-entrada) forwards; }
.textos__cabecera { display: flex; align-items: center; gap: 8px; padding: calc(8px + env(safe-area-inset-top)) max(10px, env(safe-area-inset-right)) 8px max(10px, env(safe-area-inset-left)); }
.textos__cabecera .btn-icono { color: var(--color-blanco); background: var(--color-visor-barra); }
.textos__titulo { flex: 1; font-family: var(--fuente-titulo); font-weight: 700; font-size: 15px; letter-spacing: .03em; }
.textos__agregar { width: 42px; height: 42px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: var(--color-visor-barra); border: 1px solid color-mix(in srgb, var(--color-blanco) 30%, transparent); color: var(--color-blanco); transition: transform var(--mov-rapido) var(--ease-rebote), background-color var(--mov-rapido); }
.textos__agregar:hover { background: var(--color-morado); transform: scale(1.06); }
.textos__aa { font-family: var(--fuente-titulo); font-size: 17px; font-weight: 800; }
.textos__listo { padding: 9px 16px; }
.textos__area { touch-action: none; position: relative; flex: 1; min-height: 0; display: flex; align-items: center; justify-content: center; overflow: hidden; padding: 6px; }
.textos__escenario { position: relative; overflow: hidden; border-radius: var(--radio-md); box-shadow: var(--sombra-tarjeta); }
.textos__fondo { display: block; width: 100%; height: 100%; object-fit: fill; user-select: none; -webkit-user-drag: none; pointer-events: auto; }
.textos__capas { position: absolute; inset: 0; }
.textos__capa { position: absolute; cursor: grab; touch-action: none; user-select: none; -webkit-user-select: none; max-width: none; outline: none; }
.textos__capa:active { cursor: grabbing; }
.textos__texto { display: block; white-space: pre; text-align: center; }
.textos__capa--elegida .textos__texto { outline: 1.5px dashed color-mix(in srgb, var(--color-blanco) 85%, transparent); outline-offset: 6px; }
.textos__capa--nueva { animation: pop var(--mov-medio) var(--ease-rebote); }
.textos__asa { position: absolute; right: -16px; bottom: -16px; width: 26px; height: 26px; border-radius: 50%; display: none; align-items: center; justify-content: center; background: var(--color-blanco); color: var(--color-negro); box-shadow: var(--sombra-tarjeta); cursor: nwse-resize; touch-action: none; }
.textos__asa .material-symbols-rounded { font-size: 15px; transform: rotate(90deg); }
@media (hover: hover) and (pointer: fine) { .textos__capa--elegida .textos__asa { display: flex; } }
.textos__papelera { position: absolute; left: 50%; bottom: 14px; transform: translateX(-50%) scale(.6); width: 54px; height: 54px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: var(--color-visor-barra); border: 2px solid color-mix(in srgb, var(--color-blanco) 50%, transparent); color: var(--color-blanco); opacity: 0; pointer-events: none; transition: opacity var(--mov-rapido), transform var(--mov-rapido) var(--ease-rebote), background-color var(--mov-rapido); }
.textos--moviendo .textos__papelera { opacity: 1; transform: translateX(-50%) scale(1); }
.textos__papelera--encima { background: var(--color-edicion-papelera); transform: translateX(-50%) scale(1.2) !important; }
.textos__ayuda { text-align: center; font-size: 13px; color: color-mix(in srgb, var(--color-blanco) 70%, transparent); padding: 8px 16px calc(14px + env(safe-area-inset-bottom)); }
.textos__panel { display: flex; flex-direction: column; gap: 10px; padding: 10px max(12px, env(safe-area-inset-right)) calc(12px + env(safe-area-inset-bottom)) max(12px, env(safe-area-inset-left)); background: var(--color-visor-barra); border-top: 1px solid color-mix(in srgb, var(--color-blanco) 14%, transparent); animation: panel-sube var(--mov-rapido) var(--ease-salida); }
.textos__panel-fila { display: flex; gap: 8px; align-items: flex-start; }
.textos__entrada { flex: 1; min-width: 0; resize: none; padding: 9px 12px; border-radius: var(--radio-md); border: 1px solid color-mix(in srgb, var(--color-blanco) 25%, transparent); background: color-mix(in srgb, var(--color-negro) 40%, transparent); color: var(--color-blanco); font-family: var(--fuente-texto); font-size: 16px; }
.textos__entrada:focus { outline: none; border-color: var(--color-morado-claro); }
.textos__borrar { color: var(--color-blanco); background: color-mix(in srgb, var(--color-error) 30%, transparent); }
.textos__borrar:hover { background: var(--color-error); }
.textos__fuentes, .textos__colores, .textos__fondos { display: flex; gap: 8px; overflow-x: auto; scrollbar-width: none; padding-bottom: 2px; }
.textos__fuentes::-webkit-scrollbar, .textos__colores::-webkit-scrollbar, .textos__fondos::-webkit-scrollbar { display: none; }
.textos__fuente { flex-shrink: 0; padding: 6px 12px; border-radius: 999px; font-size: 15px; color: var(--color-blanco); background: color-mix(in srgb, var(--color-blanco) 10%, transparent); border: 1px solid transparent; transition: background-color var(--mov-rapido), border-color var(--mov-rapido); }
.textos__fuente--activa { background: var(--color-blanco); color: var(--color-negro); }
.textos__color { flex-shrink: 0; width: 30px; height: 30px; border-radius: 50%; background: var(--c); border: 2px solid color-mix(in srgb, var(--color-blanco) 35%, transparent); transition: transform var(--mov-rapido) var(--ease-rebote); }
.textos__color--activo { transform: scale(1.18); border-color: var(--color-blanco); box-shadow: 0 0 0 2px var(--color-morado); }
.textos__fondo-btn { flex-shrink: 0; display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; border-radius: 999px; font-size: 13px; color: var(--color-blanco); background: color-mix(in srgb, var(--color-blanco) 10%, transparent); }
.textos__fondo-btn .material-symbols-rounded { font-size: 18px; }
.textos__fondo-btn--activo { background: var(--color-morado); }

/* ---------- Borrar la cuenta ---------- */
.btn--borrar-cuenta { color: var(--color-borrar-cuenta); border-color: transparent; margin-top: 4px; }
.btn--borrar-cuenta:hover { border-color: var(--color-error-borde); background: var(--color-error-suave); }
.borrar-cuenta__lista { list-style: none; display: flex; flex-direction: column; gap: 8px; font-size: 14px; color: var(--color-texto-suave); }
.borrar-cuenta__lista li { display: flex; align-items: flex-start; gap: 8px; }
.borrar-cuenta__lista .material-symbols-rounded { font-size: 20px; color: var(--color-error-texto); flex-shrink: 0; }
.casilla { display: flex; align-items: flex-start; gap: 10px; cursor: pointer; padding: 10px; border-radius: var(--radio-md); border: 1px solid var(--color-gris); transition: border-color var(--mov-rapido), background-color var(--mov-rapido); }
.casilla:hover { border-color: var(--color-error-borde); }
.casilla__entrada { position: absolute; opacity: 0; width: 1px; height: 1px; }
.casilla__caja { flex-shrink: 0; width: 22px; height: 22px; border-radius: var(--radio-sm); border: 2px solid var(--color-gris-claro); display: flex; align-items: center; justify-content: center; color: transparent; transition: background-color var(--mov-rapido), border-color var(--mov-rapido), transform var(--mov-rapido) var(--ease-rebote); }
.casilla__caja .material-symbols-rounded { font-size: 18px; }
.casilla__texto { font-size: 14px; line-height: 1.35; }
.casilla:has(.casilla__entrada:checked) { border-color: var(--color-error); background: var(--color-error-suave); }
.casilla__entrada:checked + .casilla__caja { background: var(--color-error); border-color: var(--color-error); color: var(--color-blanco); transform: scale(1.08); }
.casilla__entrada:focus-visible + .casilla__caja { outline: 2px solid var(--color-morado-claro); outline-offset: 2px; }

/* ============================================================
   v1.17.0 — BARRA DE ESCRIBIR NUEVA
   Qué hace: la fila de escribir pasa a ser una "píldora" redondeada con [emojis] [texto] [adjuntar] [cámara] y, afuera a la derecha, el botón redondo del
   micrófono (se vuelve "enviar" al escribir). La barra flota sobre el fondo del chat (sin franja ni borde arriba). La cámara se esconde mientras hay texto.
   Todos los colores salen de las variables del :root (bloque v1.17.0).
   ============================================================ */
.entrada-envoltorio { background: transparent; border-top: none; }
.entrada { align-items: flex-end; gap: 6px; padding: 6px 8px 8px; }
.entrada__caja { flex: 1; min-width: 0; display: flex; align-items: flex-end; gap: 0; min-height: 48px; padding: 2px 4px; background: var(--color-entrada-caja); border: 1px solid var(--color-entrada-borde); border-radius: var(--radio-entrada); box-shadow: var(--sombra-tarjeta); transition: border-color var(--mov-rapido) var(--ease-suave), box-shadow var(--mov-rapido) var(--ease-suave); }
.entrada__caja:focus-within { border-color: var(--color-morado-borde); box-shadow: var(--sombra-morado); }
.entrada__caja .entrada__texto { flex: 1; min-width: 0; background: transparent; border: none; border-radius: 0; box-shadow: none; padding: 11px 4px; line-height: 1.4; }
.entrada__caja .entrada__texto:focus { border: none; box-shadow: none; }
.entrada__btn { flex-shrink: 0; width: 42px; height: 42px; color: var(--color-entrada-icono); }
.entrada__btn:hover { color: var(--color-morado-claro); }
.entrada__btn--adjuntar .material-symbols-rounded { transform: rotate(30deg); }            /* clip apenas inclinado */
.entrada > .btn-enviar { width: 48px; height: 48px; margin-bottom: 0; }
.entrada .btn-enviar .material-symbols-rounded { font-size: 24px; }
/* Paneles que ahora quedan sobre el fondo del chat: su propia tarjeta */
.solo-lectura { margin: 6px 8px 8px; background: var(--color-entrada-caja); border: 1px solid var(--color-entrada-borde); border-radius: var(--radio-entrada); }
.respuesta-barra:not([hidden]), .adjuntos-previa:not([hidden]) { margin: 6px 8px 0; padding: 8px 10px; background: var(--color-entrada-caja); border: 1px solid var(--color-entrada-borde); border-radius: var(--radio-lg); }
.aviso-envio:not([hidden]) { margin: 6px 8px 0; padding: 6px 12px; background: var(--color-entrada-caja); border-radius: 999px; width: fit-content; }
/* La barra de grabación también es una píldora (el micrófono sigue afuera, a la derecha) */
.grabando { inset: 6px 64px 8px 8px; border-radius: var(--radio-entrada); background: var(--color-entrada-caja); border: 1px solid var(--color-entrada-borde); padding: 6px 10px; }
.grabando[data-modo="fijado"] { right: 8px; }
@media (pointer: coarse) {
  .entrada__btn { width: 42px; height: 44px; }
  .entrada > .btn-enviar { width: 50px; height: 50px; }
}

/* ============================================================
   v1.17.0 — VIDEOS: VISTA PREVIA COMO MUCHO 4:3 Y VISOR EN SU PROPORCIÓN ORIGINAL
   Qué hace: en el chat el video se ve en un recuadro con su proporción, pero nunca más alto que 4:3 (un video vertical se recorta arriba y abajo con
   object-fit: cover; el que ya es más bajo se ve entero). Al tocarlo se abre a pantalla completa ocupando todo el lugar en su proporción ORIGINAL.
   ============================================================ */
.rep-video--previa { cursor: pointer; }
.rep-video--previa video { aspect-ratio: var(--proporcion, 16 / 9); max-height: none; height: auto; object-fit: cover; background: var(--color-video-previa-fondo); pointer-events: auto; }
.rep-video--previa .rep-video__grande { z-index: 1; }
/* Visor a pantalla completa: el video llena la zona sin deformarse (bandas negras donde sobra) */
.visor-medios__reproductor--video { width: 100%; height: 100%; padding: 0; display: flex; }
.visor-medios__reproductor--video .rep-video { width: 100%; max-width: none; height: 100%; margin: 0; border: none; border-radius: 0; box-shadow: none; display: flex; align-items: center; justify-content: center; }
.visor-medios__reproductor--video .rep-video::before, .visor-medios__reproductor--video .rep-video::after { display: none; }
.visor-medios__reproductor--video .rep-video video { width: 100%; height: 100%; max-height: none; object-fit: contain; }

/* ============================================================
   v1.17.0 — LA FOTO EN GRANDE SIEMPRE POR DELANTE
   Qué pasaba: el visor de fotos tenía una capa (z-index) MENOR que las ventanas, así que al tocar la foto de un perfil (que se abre desde una ventana) la foto en
   grande quedaba detrás. Ahora el visor y las ventanas comparten capa: la que se abrió último queda siempre adelante (y una ventana abierta desde el visor, también).
   ============================================================ */
.visor-medios { z-index: 100; }
/* v1.17.0: video que ya no está en el servidor (se borró con el ciclo): aviso en lugar del botón de reproducir */
.rep-video--no-disponible .rep-video__grande, .rep-video--no-disponible .rep-video__etiqueta, .rep-video--no-disponible .rep-video__descargar { display: none; }
.rep-video__aviso { position: absolute; inset: 0; z-index: 2; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; padding: 12px; text-align: center; font-size: 13px; color: var(--color-texto-suave); background: var(--color-tarjeta-2); }
.rep-video__aviso .material-symbols-rounded { font-size: 32px; color: var(--color-gris-claro); }

/* ============================================================
   v1.17.0 — SELECCIONAR MENSAJES MANTENIENDO PRESIONADO
   Qué hace: en el celular, mantener presionado un mensaje lo SELECCIONA (fondo morado) y los demás se eligen con un toque. El menú del mensaje (reacciones,
   responder, fijar, copiar…) ahora se abre con la flechita de la esquina de cada burbuja, que en pantallas táctiles queda siempre a la vista.
   ============================================================ */
@media (pointer: coarse) {
  /* La flechita va abajo a la izquierda, en la línea de la hora (así no tapa el nombre, el texto ni el botón de descargar de fotos y videos) */
  .burbuja__menu { display: flex; opacity: .8; width: 28px; height: 24px; top: auto; bottom: 4px; left: 4px; right: auto; background: transparent; }
  .burbuja__pie { padding-left: 26px; }
  .chat--seleccionando .burbuja__menu { opacity: 0; pointer-events: none; }            /* seleccionando: la flechita no molesta */
}

/* ============================================================
   v1.17.0 — CORAZONES A LOS PERFILES
   Qué hace: botón de corazón en cada persona de Información del grupo (lleno y rosado = ya le diste), contador de corazones recibidos junto al nombre y en el
   perfil, aviso de cuántos te quedan, lluvia de corazones para quien recibe uno (en el chat) y la pantalla de "corazón mutuo" que invita a un chat privado.
   Todos los colores salen de las variables del :root (bloque v1.17.0). El relleno del icono usa el eje FILL de Material Symbols.
   ============================================================ */
.btn-corazon { color: var(--color-texto-suave); transition: color var(--mov-rapido) var(--ease-suave), transform var(--mov-rapido) var(--ease-rebote); }
.btn-corazon:hover { color: var(--color-corazon); }
.btn-corazon--dado { color: var(--color-corazon); }
.btn-corazon--dado .material-symbols-rounded { font-variation-settings: 'FILL' 1; filter: drop-shadow(0 0 6px var(--color-corazon-borde)); }
.btn-corazon--latido .material-symbols-rounded { animation: corazon-late 700ms var(--ease-rebote) infinite; }
@keyframes corazon-late { 0%, 100% { transform: scale(1); } 40% { transform: scale(1.3); } 60% { transform: scale(.92); } }
.miembro__corazones { display: inline-flex; align-items: center; gap: 2px; padding: 1px 7px 1px 5px; border-radius: 999px; font-family: var(--fuente-hud); font-size: 12px; color: var(--color-corazon); background: var(--color-corazon-suave); border: 1px solid var(--color-corazon-borde); }
.miembro__corazones .material-symbols-rounded { font-size: 14px; font-variation-settings: 'FILL' 1; }
.corazones-info { display: flex; align-items: center; gap: 8px; padding: 8px 12px; font-size: 13px; color: var(--color-texto-suave); background: var(--color-corazon-suave); border: 1px solid var(--color-corazon-borde); border-radius: var(--radio-md); }
.corazones-info > .material-symbols-rounded { font-size: 20px; color: var(--color-corazon); font-variation-settings: 'FILL' 1; flex-shrink: 0; }
.corazones-info--agotados { background: transparent; border-color: var(--color-gris); }
.corazones-info--agotados > .material-symbols-rounded { color: var(--color-gris-claro); font-variation-settings: 'FILL' 0; }
.foto-grande__corazones { display: inline-flex; align-self: center; align-items: center; gap: 4px; padding: 3px 12px 3px 8px; border-radius: 999px; font-size: 13px; font-weight: 600; color: var(--color-corazon); background: var(--color-corazon-suave); border: 1px solid var(--color-corazon-borde); }
.foto-grande__corazones .material-symbols-rounded { font-size: 18px; font-variation-settings: 'FILL' 1; }
.btn--corazon { background: var(--gradiente-corazon); color: var(--color-blanco); border: none; box-shadow: var(--sombra-corazon); }
.btn--corazon .material-symbols-rounded { font-variation-settings: 'FILL' 1; }
.btn--corazon:hover:not(:disabled) { box-shadow: var(--sombra-corazon), var(--sombra-morado); }

/* Lluvia de corazones (quien recibe uno, en el chat): suben desde abajo, se balancean y se desvanecen; el cartel aparece en el centro */
.lluvia-corazones { position: fixed; inset: 0; z-index: 180; pointer-events: none; overflow: hidden; }
.lluvia-corazones--sale { animation: desvanecer 400ms var(--ease-entrada) forwards; }
.lluvia-corazones__c { position: absolute; left: var(--x); bottom: -60px; color: var(--color-corazon); animation: corazon-sube var(--t) var(--ease-salida) var(--d) forwards; opacity: 0; }
.lluvia-corazones__c:nth-child(3n) { color: var(--color-corazon-claro); }
.lluvia-corazones__c:nth-child(4n) { color: var(--color-morado-claro); }
.lluvia-corazones__c .material-symbols-rounded { font-size: calc(34px * var(--s)); font-variation-settings: 'FILL' 1; filter: drop-shadow(0 0 8px var(--color-corazon-borde)); }
@keyframes corazon-sube {
  0% { transform: translate(0, 0) rotate(var(--r)) scale(.6); opacity: 0; }
  12% { opacity: 1; }
  70% { opacity: .95; }
  100% { transform: translate(var(--dx), -115dvh) rotate(calc(var(--r) * -1)) scale(1); opacity: 0; }
}
.lluvia-corazones__texto { position: absolute; left: 50%; top: 42%; transform: translate(-50%, -50%); display: flex; align-items: center; gap: 8px; max-width: calc(100% - 32px); padding: 12px 18px; border-radius: 999px; font-family: var(--fuente-titulo); font-weight: 700; font-size: 16px; color: var(--color-blanco); background: var(--gradiente-corazon); box-shadow: var(--sombra-corazon); animation: cartel-entra var(--mov-lento) var(--ease-rebote) backwards; }
@keyframes cartel-entra { from { opacity: 0; transform: translate(-50%, -50%) scale(.8); } }
.lluvia-corazones__texto .material-symbols-rounded { font-variation-settings: 'FILL' 1; animation: corazon-late 900ms var(--ease-rebote) infinite; }

/* Pantalla de corazón mutuo */
.modal-fondo:has(.modal--mutuo) { align-items: center; padding: 16px; background: var(--color-mutuo-velo); }
.modal--mutuo { border-radius: var(--radio-lg); border-color: var(--color-corazon-borde); box-shadow: var(--sombra-corazon); }
.modal--mutuo::before, .modal--mutuo::after { border-color: var(--color-corazon); }
.modal--mutuo .modal__titulo { color: var(--color-corazon); }
.mutuo { display: flex; flex-direction: column; align-items: center; gap: 12px; text-align: center; }
.mutuo__fotos { display: flex; align-items: center; justify-content: center; gap: 0; padding: 6px 0; }
.mutuo__fotos > .avatar { box-shadow: 0 0 0 3px var(--color-corazon-borde); }
.mutuo__fotos > .avatar:first-child { transform: rotate(-6deg); animation: mutuo-izq var(--mov-lento) var(--ease-rebote) backwards; }
.mutuo__fotos > .avatar:last-child { transform: rotate(6deg); animation: mutuo-der var(--mov-lento) var(--ease-rebote) backwards; }
@keyframes mutuo-izq { from { transform: translateX(-40px) rotate(-20deg); opacity: 0; } }
@keyframes mutuo-der { from { transform: translateX(40px) rotate(20deg); opacity: 0; } }
.mutuo__corazon { position: relative; z-index: 1; margin: 0 -14px; width: 52px; height: 52px; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: var(--color-blanco); background: var(--gradiente-corazon); box-shadow: var(--sombra-corazon); }
.mutuo__corazon .material-symbols-rounded { font-size: 28px; font-variation-settings: 'FILL' 1; animation: corazon-late 1s var(--ease-rebote) infinite; }
.mutuo__titulo { font-family: var(--fuente-titulo); font-size: 20px; font-weight: 700; }
.mutuo__texto { color: var(--color-texto-suave); font-size: 14px; }
.mutuo__btn { background: var(--gradiente-corazon); box-shadow: var(--sombra-corazon); border: none; }
.mutuo__nota { display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--color-privado); }

/* ============================================================
   v1.17.0 — CAMPANITA: FOTO DE QUIEN PROVOCÓ EL AVISO
   Qué hace: los avisos de una persona (te invitó a un chat privado, te respondió, te dio un corazón, pidió entrar…) muestran su foto con un iconito del tipo
   de aviso en la esquina; las menciones siguen con la @ y las advertencias y expulsiones con su icono en ROJO. Los corazones van en rosa.
   ============================================================ */
.notif__foto { position: relative; flex-shrink: 0; width: 40px; height: 40px; }
.notif__foto > .avatar { width: 40px; height: 40px; font-size: 15px; }
.notif__insignia { position: absolute; right: -4px; bottom: -4px; width: 20px; height: 20px; border-radius: 50%; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 0 2px var(--color-notif-aro); background: var(--color-tarjeta-2); }
.notif__insignia .material-symbols-rounded { font-size: 13px; }
.notif__icono--corazon { background: var(--color-corazon-suave); color: var(--color-corazon); }
.notif__icono--corazon .material-symbols-rounded { font-variation-settings: 'FILL' 1; }
.notif__insignia.notif__icono--morado { background: color-mix(in srgb, var(--color-morado) 30%, var(--color-tarjeta-2)); }
.notif__insignia.notif__icono--ok { background: color-mix(in srgb, var(--color-success) 30%, var(--color-tarjeta-2)); }
.notif__insignia.notif__icono--error { background: color-mix(in srgb, var(--color-error) 30%, var(--color-tarjeta-2)); }
.notif__insignia.notif__icono--aviso { background: color-mix(in srgb, var(--color-warning) 30%, var(--color-tarjeta-2)); }
.notif__insignia.notif__icono--corazon { background: color-mix(in srgb, var(--color-corazon) 30%, var(--color-tarjeta-2)); }
.notif__icono--error .material-symbols-rounded { font-variation-settings: 'FILL' 1; }   /* rojas y llenas: se notan más */


/* ============================================================
   v1.18.0 — Configuración avanzada, ventanas que se minimizan, listas de cosas por hacer, reenviar, vista previa de enlaces, "quién leyó", "en línea",
   notificación de ÉLIX (código de seguridad), campanita con filtro leídas / no leídas, responder a estados y descripciones y palabras censuradas.
   Todos los colores y tipografías salen de las variables del :root.
   ============================================================ */

/* ---------- Ventanas que se minimizan ("Tu perfil en el grupo" y "Configuración avanzada") ---------- */
.plegable { gap: 0; }
.plegable__cabecera { display: flex; align-items: center; gap: 10px; width: 100%; text-align: left; color: var(--color-texto); padding: 2px 0; }
.plegable__icono { color: var(--color-morado-claro); font-size: 22px; }
.plegable__titulo { flex: 1; min-width: 0; font-family: var(--fuente-titulo); font-size: 16px; font-weight: 700; letter-spacing: .02em; }
.plegable__flecha { color: var(--color-texto-suave); transition: transform var(--mov-medio) var(--ease-salida); }
.plegable--abierto .plegable__flecha { transform: rotate(180deg); }
.plegable__cuerpo { margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--color-gris); }
.plegable__cuerpo:not([hidden]) { animation: aparecer var(--mov-medio) var(--ease-salida); }
.plegable__cabecera:focus-visible { outline: 2px solid var(--color-morado-claro); outline-offset: 4px; border-radius: var(--radio-sm); }

/* ---------- Configuración avanzada ---------- */
.config-cambios { font-family: var(--fuente-hud); font-size: 12px; padding: 2px 8px; border-radius: 999px; color: var(--color-config-marca); background: var(--color-config-marca-fondo); }
.config-intro { text-align: left; }
.config-seccion { display: flex; flex-direction: column; }
.config-seccion + .config-seccion { margin-top: 10px; }
.config-seccion__titulo { display: flex; align-items: center; gap: 8px; font-family: var(--fuente-titulo); font-size: 14px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; color: var(--color-morado-claro); padding: 8px 0 4px; }
.config-seccion__titulo .material-symbols-rounded { font-size: 19px; }
.config-op { width: 100%; }
.config-op:disabled { cursor: default; opacity: .55; }
.config-op--chips, .config-op--num, .config-op--texto { display: flex; flex-direction: column; gap: 6px; padding: 12px 0; border-top: 1px solid var(--color-gris); }
.config-op--chips .chip:disabled { opacity: .5; cursor: default; }
.config-num__fila { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.config-num { width: 92px; flex: 0 0 auto; font-family: var(--fuente-hud); text-align: center; }
.config-num__fila .campo__entrada:not(.config-num) { flex: 1; min-width: 160px; }
.config-grupo-num { display: flex; flex-direction: column; padding-left: 14px; border-left: 2px solid var(--color-morado-borde); margin-left: 8px; }
.config-marca { margin-left: 6px; font-family: var(--fuente-texto); font-size: 11px; font-weight: 700; padding: 1px 7px; border-radius: 999px; color: var(--color-config-marca); background: var(--color-config-marca-fondo); }
.config-restablecer { display: flex; flex-direction: column; gap: 6px; margin-top: 16px; padding-top: 16px; border-top: 1px dashed var(--color-error-borde); }
.config-restablecer .btn:disabled { opacity: .45; }

/* ---------- "En línea" / "últ. vez" ---------- */
.avatar-en-linea { position: relative; flex-shrink: 0; display: inline-flex; }
.avatar-en-linea__punto { position: absolute; right: 0; bottom: 0; width: 12px; height: 12px; border-radius: 50%; background: var(--color-en-linea); box-shadow: 0 0 0 2px var(--color-tarjeta); }
.miembro__conexion { font-size: 12px; color: var(--color-texto-suave); }
.miembro__conexion--en-linea { color: var(--color-success-texto); font-weight: 700; }
.foto-grande__conexion { display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--color-texto-suave); }
.foto-grande__conexion .material-symbols-rounded { font-size: 14px; }
.foto-grande__conexion--en-linea { color: var(--color-success-texto); font-weight: 700; }
.foto-grande__conexion--en-linea .material-symbols-rounded { font-variation-settings: 'FILL' 1; color: var(--color-en-linea); }

/* ---------- Responder al estado / a la descripción ---------- */
.btn-responder-perfil { margin-left: auto; flex-shrink: 0; display: inline-flex; align-items: center; gap: 4px; padding: 4px 10px; border-radius: 999px; font-size: 12px; font-weight: 700; color: var(--color-morado-claro); border: 1px solid var(--color-morado-borde); background: transparent; }
.btn-responder-perfil .material-symbols-rounded { font-size: 16px; }
.btn-responder-perfil:hover { background: var(--color-morado-suave); }
.foto-grande__descripcion + .btn-responder-perfil { align-self: flex-end; }
.cita--estado .cita__texto .material-symbols-rounded, .cita--descripcion .cita__texto .material-symbols-rounded, .cita--externo .cita__texto .material-symbols-rounded { color: var(--color-morado-claro); }
.cita--externo { border-left-style: dashed; }

/* ---------- Mensaje reenviado ---------- */
.burbuja__reenviado { display: flex; align-items: center; gap: 4px; font-size: 12px; font-style: italic; opacity: .75; margin-bottom: 4px; }
.burbuja__reenviado .material-symbols-rounded { font-size: 16px; }
.reenviar-lista { display: flex; flex-direction: column; gap: 4px; max-height: min(52dvh, 420px); overflow-y: auto; }
.reenviar-item { display: flex; align-items: center; gap: 10px; width: 100%; padding: 8px; border-radius: var(--radio-md); text-align: left; color: var(--color-texto); border: 1px solid transparent; transition: background-color var(--mov-rapido) var(--ease-suave), border-color var(--mov-rapido) var(--ease-suave); }
.reenviar-item:hover { background: var(--color-morado-suave); }
.reenviar-item__nombre { flex: 1; min-width: 0; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.reenviar-item__tipo { display: inline-flex; align-items: center; gap: 3px; font-size: 12px; color: var(--color-texto-suave); }
.reenviar-item__tipo .material-symbols-rounded { font-size: 14px; }
.reenviar-item__marca { color: var(--color-gris-claro); }
.reenviar-item--elegido { border-color: var(--color-morado); background: var(--color-morado-suave); }
.reenviar-item--elegido .reenviar-item__marca { color: var(--color-morado-claro); font-variation-settings: 'FILL' 1; animation: pop var(--mov-medio) var(--ease-rebote); }

/* ---------- "Quién leyó" (el ojo se puede tocar) ---------- */
button.burbuja__visto { font: inherit; background: none; border: none; cursor: pointer; padding: 0; }
button.burbuja__visto:hover { text-decoration: underline; }

/* ---------- Vista previa de enlaces ---------- */
.con-previa { display: flex; flex-direction: column; gap: 6px; }
.previa-enlace__boton { display: flex; flex-direction: column; width: 100%; max-width: 340px; overflow: hidden; text-align: left; color: inherit; border-radius: var(--radio-md); background: var(--color-previa-enlace-fondo); border: 1px solid var(--color-previa-enlace-borde); animation: aparecer var(--mov-medio) var(--ease-salida); }
.previa-enlace__img { width: 100%; max-height: 180px; object-fit: cover; display: block; }
.previa-enlace__datos { display: flex; flex-direction: column; gap: 3px; padding: 8px 10px; min-width: 0; }
.previa-enlace__sitio { display: flex; align-items: center; gap: 4px; font-size: 11px; text-transform: uppercase; letter-spacing: .05em; opacity: .75; }
.previa-enlace__sitio .material-symbols-rounded { font-size: 14px; }
.previa-enlace__titulo { font-weight: 700; font-size: 14px; line-height: 1.3; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.previa-enlace__desc { font-size: 12px; opacity: .85; line-height: 1.35; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }

/* ---------- Documentos sin descarga ---------- */
.archivo--bloqueado { opacity: .7; cursor: not-allowed; }

/* ---------- Encuestas anónimas ---------- */
.encuesta__anonima { display: flex; align-items: center; gap: 4px; font-size: 12px; opacity: .8; }
.encuesta__anonima .material-symbols-rounded { font-size: 15px; }
.encuesta__ver--fijo { text-decoration: none; cursor: default; }

/* ---------- Listas de cosas por hacer ---------- */
.lista { display: flex; flex-direction: column; gap: 8px; --lista-acento: currentColor; transition: color var(--mov-lento) var(--ease-suave); }
.lista__cab { display: flex; align-items: flex-start; gap: 6px; font-weight: 700; font-size: 15px; }
.lista__cab .material-symbols-rounded { font-size: 21px; margin-top: 1px; color: var(--lista-acento); }
.lista__titulo { flex: 1; min-width: 0; overflow-wrap: anywhere; }
.lista__desc-caja { display: flex; flex-direction: column; gap: 4px; }
.lista__desc-btn { align-self: flex-start; display: inline-flex; align-items: center; gap: 2px; font-size: 12px; color: inherit; opacity: .7; padding: 0; }
.lista__desc-btn .material-symbols-rounded { font-size: 16px; }
.lista__desc { font-size: 13px; opacity: .72; line-height: 1.4; padding-left: 8px; border-left: 2px solid var(--color-previa-enlace-borde); animation: aparecer var(--mov-medio) var(--ease-salida); }
.lista__items { display: flex; flex-direction: column; gap: 4px; }
.lista__item { display: flex; align-items: flex-start; gap: 8px; padding: 7px 8px; border-radius: var(--radio-sm); background: var(--color-velo-suave); cursor: pointer; transition: background-color var(--mov-rapido) var(--ease-suave), transform var(--mov-rapido) var(--ease-suave); }
.lista__item:hover { background: color-mix(in srgb, currentColor 8%, transparent); }
.lista__item:active { transform: scale(.98); }
.lista__item:focus-visible { outline: 2px solid var(--color-morado-claro); outline-offset: 1px; }
.lista__item--bloqueado { cursor: default; }
.lista__item--bloqueado:active { transform: none; }
.lista__casilla { font-size: 21px; flex-shrink: 0; }
.lista__item--hecho .lista__casilla { color: var(--lista-acento); font-variation-settings: 'FILL' 1; }
.lista__texto { flex: 1; min-width: 0; font-size: 14px; line-height: 1.35; overflow-wrap: anywhere; }
.lista__item--hecho .lista__texto { text-decoration: line-through; opacity: .7; }
.lista__quien { flex-shrink: 0; align-self: center; font-size: 11px; opacity: .7; max-width: 90px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.lista__item--pop .lista__casilla { animation: pop var(--mov-medio) var(--ease-rebote); }
.lista__progreso { display: flex; flex-direction: column; gap: 4px; }
.lista__cuenta { display: flex; justify-content: space-between; gap: 8px; font-size: 12px; opacity: .85; }
.lista__pct { font-family: var(--fuente-hud); font-size: 13px; }
.lista__barra { height: 6px; border-radius: 999px; background: color-mix(in srgb, currentColor 18%, transparent); overflow: hidden; }
.lista__relleno { height: 100%; width: var(--pct, 0%); border-radius: inherit; background: var(--lista-acento); animation: barra-crece var(--mov-lento) var(--ease-suave) backwards; transition: width var(--mov-medio) var(--ease-suave), background-color var(--mov-lento) var(--ease-suave); }
.lista__pie { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 4px 10px; font-size: 12px; opacity: .85; }
.lista__estado, .lista__quien-marca { display: inline-flex; align-items: center; gap: 4px; }
.lista__estado .material-symbols-rounded, .lista__quien-marca .material-symbols-rounded { font-size: 15px; }
/* 100 % → TODOS los detalles en verde */
.lista--completa { --lista-acento: var(--color-lista-ok); }
.lista--completa .lista__cab, .lista--completa .lista__pct, .lista--completa .lista__estado { color: var(--color-lista-ok-texto); }
.lista--completa .lista__item { background: var(--color-lista-ok-suave); }
.lista--completa .lista__barra { background: var(--color-lista-ok-suave); }
.burbuja:has(.lista--completa) { border-color: var(--color-lista-ok); box-shadow: 0 0 0 1px var(--color-lista-ok); }
.lista--festejo { animation: pop var(--mov-lento) var(--ease-rebote); }
/* Vencida sin llegar al 100 % → TODOS los detalles en rojo */
.lista--vencida { --lista-acento: var(--color-lista-mal); }
.lista--vencida .lista__cab, .lista--vencida .lista__pct, .lista--vencida .lista__estado { color: var(--color-lista-mal-texto); }
.lista--vencida .lista__item { background: var(--color-lista-mal-suave); }
.lista--vencida .lista__barra { background: var(--color-lista-mal-suave); }
.burbuja:has(.lista--vencida) { border-color: var(--color-lista-mal); box-shadow: 0 0 0 1px var(--color-lista-mal); }
.fila-opcion__icono { color: var(--color-texto-suave); font-size: 20px; }
/* @menciones en los campos de una ventana (lista flotante, arriba de las ventanas) */
.menciones--flotante { position: fixed; bottom: auto; right: auto; z-index: 260; border: 1px solid var(--color-morado-borde); border-radius: var(--radio-md); max-height: min(260px, 40dvh); }

/* ---------- Modo lento ---------- */
.aviso-envio--lento { color: var(--color-warning-texto); }

/* ---------- Palabras censuradas ---------- */
.censura { display: flex; flex-direction: column; align-items: center; gap: 8px; text-align: center; }
.censura__icono { font-size: 44px; color: var(--color-warning-texto); }
.censura__texto { font-size: 15px; }

/* ---------- Notificación de ÉLIX (código de seguridad en modo prueba) ---------- */
.notif-elix { position: fixed; z-index: 400; top: max(10px, env(safe-area-inset-top)); left: 50%; transform: translateX(-50%); width: min(420px, calc(100vw - 20px)); display: flex; align-items: center; gap: 4px; padding: 10px 8px 10px 12px;
  border-radius: 18px; background: var(--color-notif-elix-fondo); border: 1px solid var(--color-notif-elix-borde); box-shadow: var(--sombra-notif-elix); backdrop-filter: blur(12px); animation: notif-elix-entra var(--mov-medio) var(--ease-salida); touch-action: pan-x; }
.notif-elix--sale { animation: notif-elix-sale 240ms var(--ease-entrada) forwards; }
.notif-elix__cuerpo { flex: 1; min-width: 0; display: flex; align-items: center; gap: 10px; text-align: left; color: var(--color-texto); }
.notif-elix__icono { width: 38px; height: 38px; border-radius: 10px; flex-shrink: 0; }
.notif-elix__textos { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.notif-elix__app { font-size: 12px; color: var(--color-texto-suave); }
.notif-elix__app strong { font-family: var(--fuente-logo); color: var(--color-morado-claro); letter-spacing: .04em; }
.notif-elix__texto { font-size: 15px; font-weight: 600; overflow-wrap: anywhere; }
.notif-elix__accion { flex-shrink: 0; }
@keyframes notif-elix-entra { from { transform: translate(-50%, -120%); opacity: 0; } }
@keyframes notif-elix-sale { to { transform: translate(-50%, -120%); opacity: 0; } }

/* ---------- Campanita: leídas mucho más apagadas y pestañas No leídas / Leídas ---------- */
.notif-panel__pestanas { flex-shrink: 0; }
.notif--leida .notif__boton { opacity: .38; filter: grayscale(.85) brightness(.8); }
.notif--leida .notif__boton:hover { opacity: .6; }
.notif--leida .notif__texto { font-weight: 400; }

/* ---------- Borrar la cuenta: frase exacta ---------- */
.frase-confirmar { font-family: var(--fuente-mono); color: var(--color-error-texto); user-select: none; }
.campo__entrada--ok { border-color: var(--color-success); }

/* ---------- Vista previa de una invitación: contraseña ---------- */
.previa__dato--clave { display: inline-flex; align-items: center; gap: 4px; color: var(--color-warning-texto); }
.previa__dato--clave .material-symbols-rounded { font-size: 16px; }

/* ============================================================
   v1.19.0
   ============================================================ */
/* ---------- Palabras censuradas en ROJO (chat, listas, encuestas y ventana de advertencia) ---------- */
.censurado { color: var(--color-censurado); font-weight: 700; letter-spacing: .04em; padding: 0 2px; border-radius: var(--radio-sm); background: var(--color-censurado-fondo); }
.modal--advertencia .censurado { background: var(--color-censurado-fondo-fuerte); }

/* ---------- Advertencia AUTOMÁTICA (palabras censuradas): misma ventana roja que la de un administrador ---------- */
.modal--advertencia-auto .advertencia__icono { font-variation-settings: 'FILL' 1; }
.modal--advertencia-auto .modal__acciones .btn { width: 100%; }

/* ---------- Botón GRIS (Configuración avanzada en Información del grupo) ---------- */
.btn--gris { background: var(--color-btn-gris-fondo); border-color: var(--color-btn-gris-borde); color: var(--color-texto); }
.btn--gris .material-symbols-rounded { color: var(--color-config-gris-claro); }
.btn--gris:hover { border-color: var(--color-config-gris); }
.btn--gris:focus-visible { outline: 2px solid var(--color-config-gris); outline-offset: 2px; }
.btn--gris .config-cambios { margin-left: 8px; color: var(--color-config-gris-claro); background: var(--color-config-gris-suave); }   /* el contador de cambios también en gris */

/* ---------- Configuración avanzada en GRIS (ventana de Información del grupo) ----------
   Se cambian dentro del panel las variables del morado por grises: títulos de sección, interruptores encendidos, chips elegidos y bordes */
.config-panel--gris {
  --color-morado: var(--color-config-gris);
  --color-morado-claro: var(--color-config-gris-claro);
  --color-morado-borde: var(--color-config-gris-borde);
  --color-morado-suave: var(--color-config-gris-suave);
  --color-config-marca: var(--color-config-gris-claro);
  --color-config-marca-fondo: var(--color-config-gris-suave);
}
.modal--config { max-width: 560px; }
.modal--config .modal__titulo { color: var(--color-config-gris-claro); }
.modal--config .modal__acciones .btn { width: 100%; }
.config-panel .config-op:disabled { opacity: .8; }   /* solo lectura: se lee bien aunque no se pueda tocar */
.config-panel .chip:disabled { opacity: .75; }
.config-panel .chip--activo:disabled { opacity: 1; }

/* ---------- Estado de conexión: Normal / No molestar / Fantasma ---------- */
.presencias { display: flex; flex-direction: column; gap: 8px; }
.presencia { display: flex; align-items: center; gap: 12px; width: 100%; text-align: left; padding: 10px 12px; border: 1px solid var(--color-gris); border-radius: var(--radio-md); background: var(--color-fondo);
  transition: border-color var(--mov-rapido) var(--ease-suave), background-color var(--mov-rapido) var(--ease-suave); }
.presencia:disabled { opacity: .45; cursor: default; }
.presencia__icono { font-size: 24px; color: var(--color-texto-suave); }
.presencia__texto { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.presencia__titulo { font-family: var(--fuente-titulo); font-weight: 700; font-size: 15px; }
.presencia__sub { font-size: 12px; color: var(--color-texto-suave); }
.presencia--activa { border-color: var(--color-morado); background: var(--color-morado-suave); }
.presencia--normal.presencia--activa .presencia__icono { color: var(--color-en-linea); }
.presencia--no_molestar.presencia--activa { border-color: var(--color-no-molestar); background: var(--color-error-suave); }
.presencia--no_molestar.presencia--activa .presencia__icono { color: var(--color-no-molestar); font-variation-settings: 'FILL' 1; }
.presencia--fantasma.presencia--activa { border-color: var(--color-fantasma); background: var(--color-config-gris-suave); }
.presencia--fantasma.presencia--activa .presencia__icono { color: var(--color-texto); }
.avatar-en-linea__punto--no-molestar { background: var(--color-no-molestar); }
.miembro__conexion--no-molestar { color: var(--color-no-molestar-texto); font-weight: 700; }
.foto-grande__conexion--no-molestar { color: var(--color-no-molestar-texto); font-weight: 700; }
.foto-grande__conexion--no-molestar .material-symbols-rounded { font-variation-settings: 'FILL' 1; color: var(--color-no-molestar); }

/* ============================================================
   v1.20.0 — NOVEDADES Y ARREGLOS
   ============================================================ */
/* PALABRAS CENSURADAS con símbolos (# ! ¡ @ $ / '): se pueden tocar para ver la ventanita que explica qué son */
.censurado[data-censura] { cursor: help; }
.censurado[data-censura]:focus-visible { outline: 2px solid var(--color-censurado); outline-offset: 1px; }
/* La palabra ORIGINAL (sin censurar) en tu advertencia automática: resaltada en rojo para que sepas cuál se tapó */
.censurado--revelado { color: var(--color-censurado-revelado); background: var(--color-censurado-revelado-fondo); text-decoration: underline wavy; text-underline-offset: 3px; letter-spacing: normal; }
.modal--advertencia .censurado--revelado { background: var(--color-censurado-revelado-fondo); }
.advertencia__censura-nota { display: block; margin-top: 8px; font-size: 12px; color: var(--color-texto-suave); }
.advertencia__censura-nota > .material-symbols-rounded { font-size: 16px; vertical-align: -3px; margin-right: 4px; }
.advertencia__censura-grupo { display: block; margin-top: 4px; font-size: 14px; }
.advertencia__censura-grupo { color: var(--color-texto); white-space: pre-wrap; overflow-wrap: anywhere; }

/* TU ESTADO DE CONEXIÓN (Información del grupo): el icono de la izquierda del título muestra el estado actual con su color */
.presencia-actual { transition: color var(--mov-rapido); }
.presencia-actual--normal { color: var(--color-presencia-normal); }
.presencia-actual--no_molestar { color: var(--color-presencia-no-molestar); font-variation-settings: 'FILL' 1; }
.presencia-actual--fantasma { color: var(--color-presencia-fantasma); }

/* ELIMINAR CUENTA en Ajustes: abajo de todo y en rojo */
.ajustes-peligro { margin-top: 6px; padding-top: 14px; border-top: 1px solid var(--color-gris); }
.ajuste-fila--peligro { width: 100%; text-align: left; color: var(--color-ajuste-peligro); border-color: var(--color-ajuste-peligro-borde); }
.ajuste-fila--peligro:hover { border-color: var(--color-ajuste-peligro); background: var(--color-ajuste-peligro-fondo); }
.ajuste-fila--peligro .ajuste-fila__titulo { color: var(--color-ajuste-peligro); }

/* FOTOS DEL CHAT COMO MUCHO 4:3 (como los videos). chat.js pone --proporcion (ancho / alto, nunca menos de 3/4) cuando la foto cargó:
   las más altas se recortan centradas en ese recuadro; las más bajas se ven enteras. Al abrirla se ve completa y en su proporción original */
.medio--recortable { aspect-ratio: var(--proporcion); height: auto; object-fit: cover; object-position: center; }

/* ARREGLO: en el celular, el botón de emojis (y los demás de la barra de escribir) se quedaba RESALTADO después de tocarlo (por ejemplo, al buscar un emoji y volver
   al teclado): en pantallas táctiles el "pasar el mouse" se queda pegado. Allí no se resaltan al pasar por encima */
@media (hover: none) {
  .entrada__btn:hover { background: transparent; color: var(--color-entrada-icono); transform: none; }
}

/* ARREGLO: la PORTADA ya no se puede desplazar cuando todo entra en la pantalla (index.js pone .sin-scroll en <html> solo si el contenido cabe; si aparecen
   "Tus grupos en este dispositivo" y no entran, se vuelve a poder desplazar) */
html.sin-scroll, html.sin-scroll body { overflow: hidden; }
html.sin-scroll body { height: 100dvh; min-height: 0; }

/* ---- v1.22.1: clases de tipografía para títulos y párrafos ----
   .orbitron-titulo → para los <h1>…<h6> (Orbitron, peso 900 que es el cargado)
   .oxanium-texto   → para los <p>; el peso se elige con la variable --peso-texto (de 200 a 800, por defecto 400), p. ej. style="--peso-texto: 600" */
.orbitron-titulo {
  font-family: var(--fuente-orbitron);
  font-optical-sizing: auto;
  font-weight: 900;
  font-style: normal;
}
.oxanium-texto {
  font-family: var(--fuente-oxanium);
  font-optical-sizing: auto;
  font-weight: var(--peso-texto, 400);
  font-style: normal;
}
