Real-time & Collaboration
Real-time & Collaboration
11 reglasThrottle cursor broadcasts a intervalos de 100ms con interpolación spring
Las posiciones de cursores en multijugador deben emitirse como máximo una vez cada 100ms (10 actualizaciones/seg) para evitar saturación de red y CPU. En el receptor, animar el movimiento con física spring o transition: transform, nunca saltar a la coordenada cruda, de modo que el movimiento sea fluido pese a la tasa discreta de envio.
Ocultar cursores remotos con visibility:hidden hasta recibir la primera coordenada
El cursor de un colaborador debe permanecer invisible (visibility: hidden) hasta que el cliente reciba al menos una coordenada real de ese usuario. Sin esta guarda, los cursores fantasma aparecen en el origen (0,0) inmediatamente al conectarse, antes de que llegue cualquier dato de movimiento.
visibility:hidden hasta primer movimientoLimitar el avatar stack a 4 avatares con contador +N de desbordamiento
Los stacks de presencia deben mostrar máximo 4 avatares individuales antes de colapsar participantes adicionales en un indicador "+N". Ordenar con usuarios activos (online ahora) primero. El contador de desbordamiento debe ser interactivo: click o hover revela la lista completa de participantes.
GitHub Primer Design System · Atlassian Design SystemMostrar badge de sync-status persistente con tres estados: Guardando, Guardado, Sin conexion
Todo editor colaborativo debe mostrar un indicador de estado de sincronización con exactamente tres estados visibles: "Guardando" (escritura en vuelo), "Guardado" (última escritura confirmada) y "Sin conexion" (sin conectividad). Nunca usar rojo para el estado "Sin conexion", implica error irrecuperable en lugar de condición temporal.
Google Open Health Stack · Liveblocks useSyncStatus · 2024Asignar colores por usuario de forma determinista desde paleta de 12 tonos
Cada colaborador recibe un color de cursor y resaltado derivado deterministicamente de su user ID mediante hash, no asignado aleatoriamente por sesión. Pre-definir una paleta de al menos 12 tonos perceptualmente distintos (360° a ~30° de incremento) para que hasta 12 usuarios simultaneos tengan cero colisiones. Al superar 12 participantes, ciclar la paleta.
Figma multiplayer design system · color-hash npm · Liveblocks 2025Aplicar actualizaciones optimistas inmediatamente y revertir con copy de error inline en menos de 500ms
Todas las operaciones de escritura colaborativas (enviar comentario, resolver hilo, cambiar permiso) deben aplicarse de forma optimista al UI local sin demora, y luego reconciliar con la respuesta del servidor. Si el servidor devuelve error o conflicto (HTTP 409), revertir el cambio y mostrar un mensaje de error inline en menos de 500ms. Nunca descartar silenciosamente una acción del usuario.
React 19 useOptimistic · FreeCodeCamp 2024 · 7tech.co.in 2025Mostrar indicadores de escritura solo después de 300ms de actividad continua y limpiarlos tras 3s de inactividad
Los indicadores de "escribiendo..." en campos de texto colaborativos deben hacer debounce: mostrarse solo después de 300ms de actividad de teclas sostenida, evitando parpadeo en pulsaciones sueltas. Limpiar el indicador exactamente 3 segundos después de la última tecla. Nunca mostrar el indicador de escritura al propio usuario.
WhatsApp typing indicator · UX Matters 2018 · industria 300-500msAnclar comentarios a coordenadas de contenido y reposicionarlos en reflow, nunca a offsets de píxel fijo
Los comentarios inline y pines de anotación deben anclarse al elemento de contenido objetivo (nodo de párrafo, layer de diseño o línea de código) usando identificadores semánticos, no a coordenadas de píxel absolutas. Cuando el documento hace reflow, los comentarios anclados deben seguir a su elemento objetivo. Los comentarios que pierden su ancla (porque fue eliminada) deben aparecer en un sidebar de "comentarios huerfanos".
CKEditor 5 Comments · Figma layer-ID anchoring · Google Docs character-offset 2023node#p-4f2a · pin sigue al párrafo tras cualquier reflow
Liberar locks de elementos automáticamente tras 30s de inactividad o al desconectarse
Cuando la herramienta colaborativa implementa bloqueo pesimista de elementos (un editor a la vez), los locks deben auto-liberarse después de 30 segundos de inactividad del titular, o inmediatamente al desconectarse. Mostrar un badge "Bloqueado por [Nombre]" en el elemento, y un contador de cuenta regresiva en los últimos 10 segundos antes de la liberación automática.
Ably, Collaboration UX Best Practices 2024 · MagicDraw 2024x Locking ModelDefaultear el scope del share-dialog a "restringido" y requerir escalación explicita a "cualquiera con el link"
Cuando un usuario abre un dialogo de compartir y copia un link, el scope de permiso por defecto debe ser "Restringido" (solo personas invitadas explicitamente), nunca "Cualquiera con el link" como default. Si el usuario cambia el scope a publico, mostrar un paso de confirmación con el permiso exacto en lenguaje claro antes de copiar al portapapeles.
Microsoft 365 Next-Gen Sharing 2025 · Box invite-only default 2024 · Google DriveUsar aria-live="polite" para presencia y actividad; aria-live="assertive" solo para conflictos
Los eventos de colaboración en tiempo real, usuario nuevo, comentario agregado, documento guardado, deben anunciarse a los lectores de pantalla usando aria-live="polite", que encola anuncios sin interrumpir. Reservar aria-live="assertive" exclusivamente para alertas de conflicto y advertencias de perdida de datos. Agrupar actualizaciones de presencia en anuncios únicos dentro de una ventana de 2 segundos.
- R-1415 Throttle cursor broadcasts a intervalos de 100ms con interpolación spring
- R-1416 Ocultar cursores remotos con visibility:hidden hasta recibir la primera coordenada
- R-1417 Limitar el avatar stack a 4 avatares con contador +N de desbordamiento
- R-1418 Mostrar badge de sync-status persistente con tres estados: Guardando, Guardado, Sin conexion
- R-1419 Asignar colores por usuario de forma determinista desde paleta de 12 tonos
- R-1420 Aplicar actualizaciones optimistas inmediatamente y revertir con copy de error inline en menos de 500ms
- R-1421 Mostrar indicadores de escritura solo después de 300ms de actividad continua y limpiarlos tras 3s de inactividad
- R-1422 Anclar comentarios a coordenadas de contenido y reposicionarlos en reflow, nunca a offsets de píxel fijo
- R-1423 Liberar locks de elementos automáticamente tras 30s de inactividad o al desconectarse
- R-1424 Defaultear el scope del share-dialog a "restringido" y requerir escalación explicita a "cualquiera con el link"
- R-1425 Usar aria-live="polite" para presencia y actividad; aria-live="assertive" solo para conflictos