FastComments.com

Adicionar Comentários Inline em Tempo Real a Documentos, Livros, Etc

O FastComments Collab Chat permite que os usuários destaquem e anotem qualquer conteúdo de texto no seu site, criando discussões em tópicos vinculadas a seleções de texto específicas. Os usuários podem selecionar palavras, frases ou parágrafos inteiros para iniciar conversas colaborativas diretamente dentro do seu conteúdo.

Esse recurso é perfeito para feedback editorial, ambientes de leitura colaborativa, plataformas educacionais, revisão de documentos e qualquer cenário em que você deseje discussões contextuais ancoradas a um texto específico.

Observe que esta documentação é específica da funcionalidade Collab Chat. Você pode adicionar comentários para conteúdo com muitas páginas, como Livros, com thread-per-page, sem usar collab chat. O FastComments também não cobra por página ou por thread. Collab Chat é especificamente quando você quer permitir que os usuários selecionem texto e comentem na seção de texto destacada.

Você pode ver um exemplo aqui.

Exemplos Internal Link

Exemplo Básico

A maneira mais simples de usar o Collab Chat é direcionar um único contêiner de conteúdo. Este exemplo mostra como habilitar anotações de texto em um artigo:

Exemplo básico de Collab Chat
Copy CopyRun External Link
1
2<!DOCTYPE html>
3<html>
4<head>
5 <title>My Article with Collab Chat</title>
6</head>
7<body>
8 <div id="article-content" style="min-height: 500px">
9 <h1>My Article Title</h1>
10 <p>This is a paragraph that users can annotate. Simply highlight any text to start a discussion!</p>
11 <p>You can have multiple paragraphs, and users can highlight text across any of them.</p>
12 </div>
13
14 <script src="https://cdn.fastcomments.com/js/embed-collab-chat.min.js"></script>
15 <script>
16 FastCommentsCollabChat(document.getElementById('article-content'), {
17 tenantId: 'demo'
18 });
19 </script>
20</body>
21</html>
22

Exemplo com ID de URL Personalizado (por página de livro, artigo, etc.)

Por padrão, o Collab Chat usa a URL da página combinada com o caminho do elemento e o intervalo de texto para identificar conversas. Você pode fornecer um urlId personalizado para ter mais controle sobre como as conversas são agrupadas:

Collab Chat com ID de URL Personalizado
Copy Copy
1
2<script src="https://cdn.fastcomments.com/js/embed-collab-chat.min.js"></script>
3<script>
4 FastCommentsCollabChat(document.getElementById('article-content'), {
5 tenantId: 'demo',
6 urlId: 'book-one-page-2'
7 });
8</script>
9

Isso é útil se a estrutura da sua URL mudar, mas você quiser manter as mesmas conversas, ou se quiser compartilhar as mesmas anotações de conversa em várias páginas.

Exemplo com Modo Escuro

Se seu site tiver um fundo escuro, ative o suporte ao modo escuro para garantir que a interface do chat apareça corretamente:

Collab Chat com Modo Escuro
Copy CopyRun External Link
1
2<!DOCTYPE html>
3<html>
4<head>
5 <title>My Article with Collab Chat - Dark Mode</title>
6 <style>
7 body {
8 background-color: #1a1a1a !important;
9 color: #e0e0e0 !important;
10 font-family: system-ui, -apple-system, sans-serif;
11 padding: 20px;
12 margin: 0;
13 }
14 #article-content {
15 max-width: 800px;
16 margin: 0 auto;
17 background-color: #2d2d2d;
18 padding: 20px;
19 border-radius: 8px;
20 }
21 h1 {
22 color: #ffffff !important;
23 }
24 p {
25 color: #e0e0e0 !important;
26 line-height: 1.6;
27 }
28 .fastcomments-collab-chat-top-bar {
29 background-color: #2d2d2d !important;
30 color: #e0e0e0 !important;
31 border-bottom: 1px solid #444 !important;
32 }
33 </style>
34</head>
35<body>
36 <div id="article-content" style="min-height: 500px">
37 <h1>My Article Title</h1>
38 <p>This is a paragraph that users can annotate. Simply highlight any text to start a discussion!</p>
39 <p>You can have multiple paragraphs, and users can highlight text across any of them.</p>
40 </div>
41
42 <script src="https://cdn.fastcomments.com/js/embed-collab-chat.min.js"></script>
43 <script>
44 FastCommentsCollabChat(document.getElementById('article-content'), {
45 tenantId: 'demo',
46 hasDarkBackground: true
47 });
48 </script>
49</body>
50</html>
51

Exemplo com Barra Superior Desativada

Por padrão, o Collab Chat exibe uma barra superior com a contagem de usuários e de discussões. Você pode desativá-la:

Collab Chat com Barra Superior Desativada
Copy CopyRun External Link
1
2<!DOCTYPE html>
3<html>
4<head>
5 <title>My Article with Collab Chat - No Top Bar</title>
6</head>
7<body>
8 <div id="article-content" style="min-height: 500px">
9 <h1>My Article Title</h1>
10 <p>This is a paragraph that users can annotate. Simply highlight any text to start a discussion!</p>
11 <p>You can have multiple paragraphs, and users can highlight text across any of them.</p>
12 </div>
13
14 <script src="https://cdn.fastcomments.com/js/embed-collab-chat.min.js"></script>
15 <script>
16 FastCommentsCollabChat(document.getElementById('article-content'), {
17 tenantId: 'demo',
18 topBarTarget: null
19 });
20 </script>
21</body>
22</html>
23

Exemplo com Callback de Contagem de Comentários

Você pode rastrear quando comentários são adicionados ou atualizados usando o callback commentCountUpdated:

Collab Chat com Callback de Contagem de Comentários
Copy Copy
1
2<script src="https://cdn.fastcomments.com/js/embed-collab-chat.min.js"></script>
3<script>
4 FastCommentsCollabChat(document.getElementById('article-content'), {
5 tenantId: 'demo',
6 commentCountUpdated: function(count) {
7 console.log('Total comments:', count);
8 document.getElementById('comment-badge').textContent = count;
9 }
10 });
11</script>
12

Exemplo com Múltiplas Seções

Você pode inicializar o Collab Chat em várias seções separadas da sua página. Cada seção terá suas próprias anotações independentes:

Collab Chat em Múltiplas Seções
Copy Copy
1
2<div id="intro-section">
3 <h2>Introduction</h2>
4 <p>Content for the introduction...</p>
5</div>
6
7<div id="main-section">
8 <h2>Main Content</h2>
9 <p>Content for the main article...</p>
10</div>
11
12<script src="https://cdn.fastcomments.com/js/embed-collab-chat.min.js"></script>
13<script>
14 // Initialize on intro section
15 FastCommentsCollabChat(document.getElementById('intro-section'), {
16 tenantId: 'demo',
17 urlId: 'my-article-intro'
18 });
19
20 // Initialize on main section
21 FastCommentsCollabChat(document.getElementById('main-section'), {
22 tenantId: 'demo',
23 urlId: 'my-article-main'
24 });
25</script>
26

Adicionando comentários em tempo real a livros online Internal Link

Você pode inicializar o Collab Chat por página, se desejar, e ter threads separadas por página; basta passar ao parâmetro urlId um valor como book-one-page1. Essa configuração também funciona para o widget de comentários normal.

Comportamento da seleção de texto Internal Link

Como a Seleção de Texto Funciona

Quando os usuários selecionam texto dentro do contêiner do Collab Chat, o widget captura essa seleção e permite que eles iniciem uma discussão. A seleção pode ser tão pequena quanto uma única palavra ou tão grande quanto vários parágrafos que abrangem diferentes elementos.

Atraso na Seleção

Em desktops, há um atraso de 3,5 segundos entre o momento em que um usuário seleciona o texto e quando o prompt de discussão aparece. Isso evita que a interface pisque quando os usuários estão apenas destacando texto para copiar ou ler. Em dispositivos móveis, o prompt aparece imediatamente, já que a seleção de texto é mais intencional em telas sensíveis ao toque.

IDs exclusivos de conversa

Cada conversa recebe um urlId único que combina a URL da página, o caminho do elemento no DOM e o intervalo de texto serializado. Isso garante que cada seleção de texto crie uma conversa distinta que possa ser encontrada novamente depois.

Se você fornecer um urlId personalizado na sua configuração, ele será combinado com o caminho do elemento e o intervalo de texto para criar o identificador final.

Destaques Visuais

Quando existe uma discussão para uma seleção de texto específica, esse texto recebe um destaque visual. O destaque é implementado usando cores de fundo e aparece ao passar o cursor ou quando a janela de chat associada está aberta.

O sistema de destaque funciona envolvendo o texto selecionado em um elemento especial que pode ser estilizado. Essa abordagem garante que os destaques permaneçam precisos mesmo quando a estrutura HTML subjacente é complexa.

Posicionamento da Janela de Chat

Quando um usuário clica em um destaque ou cria uma nova anotação, uma janela de chat aparece perto do texto selecionado. O widget calcula automaticamente a melhor posição para essa janela com base no espaço disponível na viewport.

O sistema de posicionamento usa classes CSS como to-right, to-left, to-top e to-bottom para indicar em que direção a janela de chat deve se estender a partir do destaque. Em dispositivos móveis (telas com menos de 768px de largura), a janela de chat sempre aparece em tela cheia para melhor usabilidade.

Dimensões da Janela de Chat

As janelas de chat têm 410px de largura em desktops, com espaçamento de 20px e uma seta visual de 16px apontando para o texto destacado. Essas dimensões são fixas para garantir comportamento consistente, mas você pode personalizar a aparência com CSS.

Seleções entre Elementos

Os usuários podem selecionar texto que abrange múltiplos elementos HTML, como destacar do meio de um parágrafo até o início de outro. O sistema de serialização de intervalo lida com isso corretamente e destacará todo o texto selecionado mesmo através das fronteiras dos elementos.

Compatibilidade com Navegadores

O sistema de seleção de texto usa a API padrão window.getSelection(), que é suportada em todos os navegadores modernos. Para versões antigas do Internet Explorer, ele recorre a document.selection para compatibilidade.

Persistência da Seleção

Uma vez que uma conversa é criada para uma seleção de texto, essa anotação persiste mesmo se a página for recarregada. O intervalo serializado e o caminho no DOM permitem que o widget restaure os destaques exatamente na mesma localização quando os usuários retornarem à página.

Isso funciona de forma confiável desde que o conteúdo da sua página permaneça estável. Se você alterar o conteúdo de texto ou reestruturar seu HTML, as anotações existentes podem não mais se alinhar corretamente com o texto. Por esse motivo, é melhor evitar mudanças significativas no conteúdo em páginas com anotações ativas, ou considerar migrar as anotações quando alterações no conteúdo forem necessárias.

Personalização Internal Link

Suporte ao Modo Escuro

Modo Escuro Dinâmico

Se o modo escuro do seu site é controlado adicionando a classe .dark ao elemento body, a UI do Collab Chat respeitará isso automaticamente sem exigir reinicialização. Os estilos do widget são projetados para responder à presença dessa classe.

Exemplo de CSS para Modo Escuro
Copy Copy
1
2/* Seu CSS de modo escuro */
3body.dark {
4 background: #1a1a1a;
5 color: #ffffff;
6}
7

Estilização personalizada com CSS

Você pode personalizar a aparência dos destaques, janelas de chat e outros elementos usando CSS. O widget adiciona classes específicas que você pode direcionar em sua folha de estilo.

Os destaques de texto usam o sistema de estilização de balões de comentário do FastComments, então quaisquer personalizações aplicadas ao widget de comentários padrão também afetarão o Collab Chat.

Personalização da Barra Superior

A barra superior mostra o número de usuários online e o número de discussões. Você pode personalizar sua posição fornecendo um elemento personalizado como topBarTarget:

Localização personalizada da barra superior
Copy Copy
1
2FastCommentsCollabChat(element, {
3 tenantId: 'demo',
4 topBarTarget: document.getElementById('my-custom-header')
5});
6

Ou desativá-la completamente definindo-a como null:

Desativar barra superior
Copy Copy
1
2FastCommentsCollabChat(element, {
3 tenantId: 'demo',
4 topBarTarget: null
5});
6

Comportamento em dispositivos móveis

Em telas com largura inferior a 768px, o Collab Chat alterna automaticamente para um layout otimizado para dispositivos móveis. As janelas de chat aparecem em tela cheia em vez de flutuarem ao lado do texto, e a demora na seleção é removida para uma interação mais imediata.

Esse comportamento é embutido e não requer nenhuma configuração. O widget detecta o tamanho da tela automaticamente e ajusta-se conforme necessário.

Aparência das janelas de chat

As janelas de chat têm 410px de largura no desktop com uma seta de 16px apontando para o texto destacado. As janelas se posicionam automaticamente com base no espaço disponível na viewport, usando classes de posicionamento como to-right, to-left, to-top e to-bottom.

Você pode adicionar CSS personalizado para ajustar cores, fontes, espaçamento ou outras propriedades visuais dessas janelas. As janelas de chat usam a mesma estrutura de componentes que o widget padrão do FastComments, portanto herdam quaisquer personalizações globais que você aplicou.

Localização

O Collab Chat oferece todas as mesmas opções de localização que o widget padrão do FastComments. Defina a opção locale para exibir o texto da UI em diferentes idiomas:

Definir localidade
Copy Copy
1
2FastCommentsCollabChat(element, {
3 tenantId: 'demo',
4 locale: 'es' // Espanhol
5});
6

O FastComments suporta dezenas de idiomas. A configuração de locale afeta todos os textos da UI, incluindo prompts, botões e texto de espaço reservado.

Opções de personalização herdadas

Como o Collab Chat estende o widget de comentários padrão, ele herda todas as opções de personalização do widget base. Isso inclui classes CSS personalizadas, traduções personalizadas, personalização de avatar, formatação de datas e muito mais.

Consulte a documentação principal de personalização do FastComments para a lista completa de opções de personalização disponíveis.

Trabalhando com fontes personalizadas

Se o seu site usa fontes personalizadas, a UI do Collab Chat herdará essas fontes do CSS da sua página. Pode ser necessário criar uma regra de personalização do widget e @import quaisquer fontes no CSS personalizado nessa regra se você quiser que a janela de chat flutuante use as mesmas fontes.

Sincronização em tempo real Internal Link

Atualizações em Tempo Real

Collab Chat usa conexões WebSocket para sincronizar todas as conversas em tempo real entre todos os usuários conectados. Quando alguém cria uma nova anotação, adiciona um comentário ou exclui uma discussão, todos os outros usuários visualizando a mesma página veem a atualização imediatamente sem precisar atualizar.

Como a Sincronização via WebSocket Funciona

Quando você inicializa o Collab Chat, o widget estabelece uma conexão WebSocket com os servidores do FastComments. Essa conexão permanece aberta durante a sessão do usuário e escuta por atualizações relacionadas à página atual.

O sistema WebSocket usa três tipos de mensagens de broadcast para o Collab Chat. O evento new-text-chat é disparado quando alguém cria uma nova anotação na página. O evento updated-text-chat é disparado quando alguém atualiza uma conversa existente. O evento deleted-text-chat é disparado quando alguém exclui uma anotação.

Sistema de ID de Broadcast

Para evitar efeitos de eco onde os usuários veem suas próprias ações sendo transmitidas de volta para eles, cada atualização inclui um broadcastId único. Quando um usuário cria ou atualiza uma anotação, seu cliente gera um UUID para essa operação. Quando o WebSocket retransmite a atualização para todos os clientes, o cliente de origem ignora a atualização porque ela corresponde ao seu próprio broadcastId.

Isso garante uma interação suave em que os usuários veem suas alterações imediatamente na interface sem esperar a ida e volta pelo servidor, enquanto ainda assegura que todos os outros usuários recebam a atualização.

Contagem de Usuários em Tempo Real

A barra superior exibe o número de usuários atualmente visualizando a página. Essa contagem é atualizada em tempo real conforme os usuários entram e saem. A contagem de usuários é fornecida pela mesma conexão WebSocket e incrementa/decrementa automaticamente com base nos eventos de conexão e desconexão.

Resiliência de Conexão

Se a conexão WebSocket cair devido a problemas de rede ou manutenção do servidor, o widget tenta se reconectar automaticamente. Durante o período de reconexão, os usuários ainda podem interagir com as anotações existentes, mas não verão atualizações em tempo real de outros usuários até que a conexão seja restabelecida.

Uma vez reconectado, o widget ressincroniza para garantir que nenhuma atualização tenha sido perdida. Isso acontece de forma transparente sem exigir intervenção do usuário.

Considerações sobre Largura de Banda

As mensagens WebSocket são leves e contêm apenas as informações essenciais necessárias para sincronizar o estado. Criar uma nova anotação normalmente usa menos de 1KB de largura de banda. O sistema também inclui agrupamento inteligente para reduzir a frequência de mensagens durante períodos de alta atividade.

Suas métricas de uso no painel do FastComments acompanham pubSubMessageCount e pubSubBandwidth para que você possa monitorar a atividade de sincronização em tempo real em seus sites.

Sincronização entre Abas

Se um usuário tiver a mesma página aberta em múltiplas abas do navegador, as atualizações em uma aba aparecem imediatamente nas outras. Isso funciona através do mesmo mecanismo de sincronização via WebSocket e não requer nenhuma configuração adicional.

Segurança

As mensagens WebSocket são transmitidas por conexões seguras (WSS) e incluem validação do tenant para garantir que os usuários recebam apenas atualizações de conversas que estão autorizados a ver. O servidor valida todas as operações antes de retransmiti-las para prevenir acesso ou manipulação não autorizados.


Tem perguntas?

Isso é tudo sobre o FastComments Collab Chat! Se você tiver alguma pergunta, precisar de ajuda com a implementação ou tiver sugestões de recursos, por favor nos avise abaixo ou entre em contato com nossa equipe de suporte.

Para ver exemplos ao vivo, confira Govscent.org, que usa o Collab Chat em produção.