FastComments.com

Чат для совместной работы

Добавление встроенных живых комментариев в документы, книги и т. д.

FastComments Collab Chat позволяет пользователям выделять и аннотировать любой текстовый контент на вашем сайте, создавая древовидные обсуждения, привязанные к конкретным выделениям текста. Пользователи могут выбирать слова, предложения или целые абзацы, чтобы начинать совместные обсуждения непосредственно в вашем контенте.

Эта функция идеально подходит для редакционных отзывов, сред совместного чтения, образовательных платформ, проверки документов и любых сценариев, где нужны контекстные обсуждения, привязанные к определённому фрагменту текста.

Обратите внимание, что эти документы относятся конкретно к функциональности Collab Chat. Вы можете добавить возможность комментирования для контента с большим количеством страниц, например Books, с thread-per-page, без использования collab chat. FastComments также не взимает плату за страницу или за тред. Collab Chat — это именно тогда, когда вы хотите позволить пользователям выделять текст и комментировать выделенный фрагмент текста.

Вы можете увидеть пример здесь.

Примеры Internal Link

Базовый пример

Самый простой способ использовать Collab Chat — нацелиться на один контейнер с содержимым. Этот пример показывает, как включить аннотации текста в статье:

Базовый пример 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

Пример с пользовательским URL ID (для страницы книги, статьи и т.д.)

По умолчанию Collab Chat использует URL страницы в сочетании с путём к элементу и диапазоном текста для идентификации бесед. Вы можете указать собственный urlId, чтобы лучше контролировать, как группируются беседы:

Collab Chat с пользовательским URL ID
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

Это полезно, если структура ваших URL меняется, но вы хотите сохранить те же беседы, или если вы хотите разделять одни и те же аннотации бесед между несколькими страницами.

Пример с тёмным режимом

Если на вашем сайте тёмный фон, включите поддержку тёмного режима, чтобы интерфейс чата отображался корректно:

Collab Chat в тёмном режиме
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

Пример с отключённой верхней панелью

По умолчанию Collab Chat показывает верхнюю панель с количеством пользователей и количеством обсуждений. Вы можете её отключить:

Collab Chat с отключённой верхней панелью
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

Пример с обратным вызовом подсчёта комментариев

Вы можете отслеживать добавление или обновление комментариев с помощью обратного вызова commentCountUpdated:

Collab Chat с обратным вызовом обновления количества комментариев
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

Пример с несколькими разделами

Вы можете инициализировать Collab Chat в нескольких отдельных разделах страницы. У каждого раздела будут свои независимые аннотации:

Collab Chat в нескольких разделах
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 // Инициализация для секции intro
15 FastCommentsCollabChat(document.getElementById('intro-section'), {
16 tenantId: 'demo',
17 urlId: 'my-article-intro'
18 });
19
20 // Инициализация для секции main
21 FastCommentsCollabChat(document.getElementById('main-section'), {
22 tenantId: 'demo',
23 urlId: 'my-article-main'
24 });
25</script>
26

Добавление живых комментариев в онлайн-книги Internal Link

Вы можете инициализировать Collab Chat для каждой страницы при необходимости и иметь отдельные ветки для каждой страницы — просто передайте параметру urlId значение вроде book-one-page1. Эта конфигурация также работает для обычного виджета комментариев.

Поведение выделения текста Internal Link

Как работает выделение текста

Когда пользователи выделяют текст внутри контейнера Collab Chat, виджет захватывает это выделение и позволяет начать обсуждение. Выделение может быть размером с одно слово или охватывать несколько абзацев в разных элементах.

Задержка выделения

На настольных устройствах есть задержка в 3,5 секунды между моментом выделения текста пользователем и появлением приглашения к обсуждению. Это предотвращает мерцание интерфейса, когда пользователи просто выделяют текст для копирования или чтения. На мобильных устройствах приглашение появляется сразу, так как выделение текста на сенсорных экранах более обдуманное.

Уникальные идентификаторы обсуждений

Каждое обсуждение получает уникальный urlId, который объединяет URL страницы, путь к элементу DOM и сериализованный диапазон текста. Это гарантирует, что каждое выделение текста создаёт отдельное обсуждение, которое можно найти позже.

Если вы укажете собственный urlId в конфигурации, он будет объединён с путём к элементу и текстовым диапазоном для создания итогового идентификатора.

Визуальные выделения

Когда для определённого выделения текста существует обсуждение, этот текст получает визуальное выделение. Выделение реализуется с помощью цветов фона и отображается при наведении курсора или когда открыто связанное окно чата.

Система выделения работает путём обёртывания выделенного текста в специальный элемент, который можно стилизовать. Такой подход гарантирует, что выделения остаются точными даже при сложной HTML-структуре.

Позиционирование окна чата

Когда пользователь нажимает на выделение или создаёт новую аннотацию, окно чата появляется рядом с выделенным текстом. Виджет автоматически рассчитывает наилучшее положение для этого окна на основе доступного пространства области просмотра.

Система позиционирования использует CSS-классы, такие как to-right, to-left, to-top и to-bottom, чтобы указать, в каком направлении окно чата должно расширяться от выделения. На мобильных устройствах (экраны шириной менее 768px) окно чата всегда отображается на весь экран для удобства использования.

Размеры окна чата

Окна чата имеют ширину 410px на настольных устройствах с отступом 20px и визуальной стрелкой 16px, указывающей на выделенный текст. Эти размеры фиксированы для обеспечения согласованного поведения, но вы можете настроить внешний вид с помощью CSS.

Выделения между элементами

Пользователи могут выделять текст, охватывающий несколько HTML-элементов, например, выделяя от середины одного абзаца до начала другого. Система сериализации диапазонов корректно обрабатывает такие случаи и выделяет весь выбранный текст даже через границы элементов.

Совместимость с браузерами

Система выделения текста использует стандартный API window.getSelection(), который поддерживается во всех современных браузерах. Для старых версий Internet Explorer используется резервный механизм document.selection для совместимости.

Сохранение выделений

После создания обсуждения для выделенного текста аннотация сохраняется даже при перезагрузке страницы. Сериализованный диапазон и путь DOM позволяют виджету восстановить выделения точно в том же месте, когда пользователи возвращаются на страницу.

Это работает надёжно, пока содержимое вашей страницы остаётся стабильным. Если вы измените текстовое содержимое или реструктурируете HTML, существующие аннотации могут больше не соответствовать тексту. По этой причине лучше избегать серьёзных изменений контента на страницах с активными аннотациями или рассмотреть возможность миграции аннотаций, когда изменения контента необходимы.

Настройка Internal Link

Поддержка тёмного режима

Динамический тёмный режим

Если тёмный режим на вашем сайте управляется добавлением класса .dark к элементу body, интерфейс Collab Chat будет автоматически учитывать это без необходимости повторной инициализации. Стили виджета разработаны так, чтобы реагировать на наличие этого класса.

Пример CSS для тёмного режима
Copy Copy
1
2/* Ваш CSS для тёмного режима */
3body.dark {
4 background: #1a1a1a;
5 color: #ffffff;
6}
7

Пользовательская стилизация с помощью CSS

Вы можете настраивать внешний вид подсветок, окон чата и других элементов с помощью CSS. Виджет добавляет специальные классы, которые вы можете таргетировать в своей таблице стилей.

Подсветки текста используют систему оформления пузырьков комментариев FastComments, поэтому любые изменения, которые вы применили к стандартному виджету комментариев, также повлияют на Collab Chat.

Настройка верхней панели

Верхняя панель показывает количество пользователей онлайн и количество обсуждений. Вы можете настроить её позицию, предоставив пользовательский элемент в качестве topBarTarget:

Пользовательское расположение верхней панели
Copy Copy
1
2FastCommentsCollabChat(element, {
3 tenantId: 'demo',
4 topBarTarget: document.getElementById('my-custom-header')
5});
6

Или полностью отключить, установив null:

Отключить верхнюю панель
Copy Copy
1
2FastCommentsCollabChat(element, {
3 tenantId: 'demo',
4 topBarTarget: null
5});
6

Поведение на мобильных устройствах

На экранах шириной меньше 768px Collab Chat автоматически переключается на оптимизированную для мобильных устройств раскладку. Окна чата появляются на весь экран вместо плавающих рядом с текстом, а задержка при выделении убирается для более мгновенного взаимодействия.

Это поведение встроено и не требует никакой конфигурации. Виджет автоматически определяет размер экрана и соответствующим образом подстраивается.

Внешний вид окна чата

Окна чата имеют ширину 410px на десктопах с указателем-стрелкой 16px, указывающим на выделенный текст. Окна автоматически позиционируются в зависимости от доступного пространства в окне просмотра, используя классы позиционирования, такие как to-right, to-left, to-top и to-bottom.

Вы можете добавить пользовательский CSS, чтобы настроить цвета, шрифты, отступы или другие визуальные свойства этих окон. Окна чата используют ту же структуру компонентов, что и стандартный виджет FastComments, поэтому они наследуют любые глобальные настройки, которые вы применили.

Локализация

Collab Chat поддерживает все те же параметры локализации, что и стандартный виджет FastComments. Установите опцию locale, чтобы отображать текст интерфейса на разных языках:

Установить локаль
Copy Copy
1
2FastCommentsCollabChat(element, {
3 tenantId: 'demo',
4 locale: 'es' // Испанский
5});
6

FastComments поддерживает десятки языков. Настройка локали влияет на весь текст интерфейса, включая подсказки, кнопки и текст-плейсхолдеры.

Унаследованные параметры настройки

Поскольку Collab Chat расширяет стандартный виджет комментариев, он наследует все параметры настройки базового виджета. Это включает пользовательские CSS-классы, пользовательские переводы, настройку аватаров, форматирование дат и многое другое.

См. основную документацию по настройке FastComments для полного списка доступных параметров настройки.

Работа с пользовательскими шрифтами

Если на вашем сайте используются пользовательские шрифты, интерфейс Collab Chat унаследует эти шрифты из CSS вашей страницы. Возможно, вам придётся создать правило кастомизации виджета и @import все шрифты в пользовательском CSS в этом правиле, если вы хотите, чтобы плавающее окно чата использовало те же шрифты.

Живая синхронизация Internal Link

Обновления в реальном времени

Collab Chat использует WebSocket-соединения для синхронизации всех разговоров в реальном времени между всеми подключёнными пользователями. Когда кто-то создаёт новую аннотацию, добавляет комментарий или удаляет обсуждение, все остальные пользователи, просматривающие ту же страницу, видят обновление мгновенно без перезагрузки.

Как работает синхронизация WebSocket

Когда вы инициализируете Collab Chat, виджет устанавливает WebSocket-соединение с серверами FastComments. Это соединение остаётся открытым на протяжении сессии пользователя и слушает обновления, связанные с текущей страницей.

Система WebSocket использует три типа широковещательных сообщений для Collab Chat. Событие new-text-chat срабатывает, когда кто-то создаёт новую аннотацию на странице. Событие updated-text-chat срабатывает, когда кто-то обновляет существующую беседу. Событие deleted-text-chat срабатывает, когда кто-то удаляет аннотацию.

Система Broadcast ID

Чтобы предотвратить эффект эха, когда пользователи видят свои собственные действия, транслируемые обратно им, каждое обновление включает уникальный broadcastId. Когда пользователь создаёт или обновляет аннотацию, его клиент генерирует UUID для этой операции. Когда WebSocket транслирует обновление обратно всем клиентам, исходный клиент игнорирует обновление, потому что оно совпадает с его собственным broadcastId.

Это обеспечивает плавное взаимодействие: пользователи видят свои изменения сразу в интерфейсе без ожидания кругового прохода через сервер, при этом все остальные пользователи получают обновление.

Количество пользователей в реальном времени

В верхней панели отображается количество пользователей, которые в данный момент просматривают страницу. Это число обновляется в реальном времени по мере присоединения и выхода пользователей. Количество пользователей передаётся через то же WebSocket-соединение и автоматически увеличивается/уменьшается на основе событий подключения и отключения.

Устойчивость соединения

Если WebSocket-соединение прерывается из‑за проблем с сетью или обслуживания сервера, виджет автоматически пытается переподключиться. В период переподключения пользователи всё ещё могут взаимодействовать с существующими аннотациями, но они не будут видеть обновления в реальном времени от других пользователей до восстановления соединения.

После восстановления соединения виджет повторно синхронизируется, чтобы убедиться, что никакие обновления не были пропущены. Это происходит прозрачно и не требует действий со стороны пользователя.

Требования к пропускной способности

Сообщения WebSocket лёгкие и содержат только необходимую информацию для синхронизации состояния. Создание новой аннотации обычно использует меньше 1KB трафика. Система также включает интеллектуальную пакетную отправку, чтобы уменьшить частоту сообщений в периоды высокой активности.

Ваши метрики использования на панели управления FastComments отслеживают pubSubMessageCount и pubSubBandwidth, чтобы вы могли контролировать активность синхронизации в реальном времени на ваших сайтах.

Синхронизация между вкладками

Если пользователь открыл одну и ту же страницу в нескольких вкладках браузера, обновления в одной вкладке появляются сразу в других вкладках. Это работает через тот же механизм синхронизации WebSocket и не требует дополнительной настройки.

Безопасность

Сообщения WebSocket передаются по защищённым соединениям (WSS) и включают проверку арендатора, чтобы пользователи получали только те обновления, на просмотр которых они авторизованы. Сервер проверяет все операции перед их трансляцией, чтобы предотвратить несанкционированный доступ или манипуляции.

Есть вопросы?

На этом всё по FastComments Collab Chat! Если у вас есть вопросы, нужна помощь с реализацией или есть предложения по функционалу, пожалуйста, сообщите нам ниже или свяжитесь с нашей службой поддержки.

Для примеров вживую посмотрите Govscent.org, на котором используется Collab Chat в продакшене.