feat(web): виды сообщений, автокомплиты композера и ссылки на комнаты

- лента оформляет виды сообщений от сервера: action (/me) — имя акцентом и
  курсив, whisper — приглушённый блок с бейджем, scream — крупнее и жирнее,
  private (/ls) — рамка, замок и бейдж «лично», system — центрированная строка
  без аватара и панели действий; реакции, ответы, правка и удаление работают
  как раньше, группировка не сливает нестандартные виды с обычными;
- автокомплиты в поле ввода с навигацией ↑/↓, Enter/Tab, Escape и мышью:
  @ — участники сервера (в DM собеседник), # — видимые текстовые комнаты,
  : — словарь на 113 эмодзи, / — команды с описанием; подсказки не появляются
  внутри слова и в блоках кода, вставка восстанавливает каретку и не расходится
  со слоем подсветки;
- `<#id>` рендерится как #имя комнаты из снапшота (иначе #id);
- 287 тестов Vitest (было 262), check/lint/test/build зелёные.
This commit is contained in:
2026-09-20 12:06:22 +03:00
parent 65d0bafe0e
commit a126f50468
22 changed files with 1826 additions and 116 deletions
+8
View File
@@ -57,6 +57,14 @@ describe('группировка сообщений', () => {
);
});
it('не присоединяет обычное сообщение к действию, шёпоту и личному', () => {
const next = message({ id: 'm-2', author_id: 'user-1', created_at: at(19, 12, 1) });
for (const type of ['action', 'whisper', 'scream', 'private', 'system']) {
const previous = message({ id: 'm-1', author_id: 'user-1', created_at: at(19, 12, 0), type });
expect(canGroup(previous, next)).toBe(false);
}
});
it('строит строки ленты с разделителями дат', () => {
const rows = buildChatRows(
[