# Logotipos de compañías El formulario de alta y edición permite seleccionar, sustituir y quitar el logotipo al guardar. Sin logotipo, o si su descarga falla, se mantienen las iniciales y colores deterministas. ## Límites y almacenamiento `COMPANY_LOGO_LIMITS` centraliza los límites: PNG, JPEG y WebP estáticos, hasta 2 MiB y 4096 × 4096 píxeles. El servidor verifica la firma y decodificación real, rechaza animaciones y limita el tiempo de procesamiento. Sharp normaliza orientación, elimina metadatos y genera WebP de hasta 128 × 128 px y 64 KiB, conservando proporciones y transparencia sin recortar. Sharp es una dependencia nueva justificada por la validación real y transformación segura en servidor; las APIs nativas de Node no ofrecen esta operación. La migración idempotente añade `companies.logoVersion` y `company_logos`. Solo se conserva la imagen optimizada; el original se descarta. Una transacción actualiza imagen y versión. No se incorporan binarios ni base64 a las respuestas de listados. Las imágenes requieren la sesión existente y las escrituras conservan la protección CSRF/origen de la aplicación. La URL lleva el hash de contenido; caché privada y ETag permiten reutilizarla sin mostrar versiones antiguas tras una sustitución. Los datos generales y el logotipo se guardan en dos peticiones. Si falla la segunda, el formulario informa del guardado parcial y conserva el identificador y el archivo para reintentar sin duplicar la compañía. ## Componentes - `CompanyAvatar`: logotipo con carga diferida y dimensiones reservadas; iniciales como alternativa. Usa la consulta compartida de compañías cuando un listado solo aporta identificador y nombre. - `CompanyIdentity`: avatar y nombre alineados, utilizado en directorio, dashboard, tickets, intervenciones, búsqueda y detalle. El tamaño se ajusta mediante clases existentes. - `CompanySelect`: opciones y selección de compañías con avatar, reutilizando los controles shadcn/ui y conservando etiquetas de texto para búsquedas por teclado. - `CompanyLogoField`: selección con validación local de peso y MIME, mensajes accesibles y acciones de quitar/deshacer. No decodifica el original en el navegador; la imagen optimizada aparece después de guardar. Se conserva la estructura de navegación, el shell y los componentes shadcn/ui existentes, sin modificar código vendor.