- нет зашитых доменов: help-домен по умолчанию localhost (задаёт установщик через
CHATBALLS_HELP_BASE_DOMAIN), фронт определяет портал помощи пробой /api/v1/help/,
ALLOWED_HOSTS без вендорских хостов, CI environment url — из CHATBALLS_APP_DOMAIN
- DEFAULT_FROM_EMAIL по умолчанию no-reply@localhost; JWT-аудитория support-токена
chatballs.support; загрузчик виджета: window.ChatballsChat, события chatballs-chat-*
- «Контакты»: продукты берутся из данных организации ({code, name}), цвет —
детерминированно по коду; зашитый список продуктов вендора убран
- npm-скоупы @chatballs/*, тема chatballsTheme/buildTheme
- тестовый bootstrap: организация demo, сотрудник staff.member@example.org,
продукты site/app; фикстуры на example.com
- убрана мёртвая привязка Shell к e-mail сотрудника вендора
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- поле ui_theme (светлая/тёмная/системная) и ui_accent (HEX) на пользователе,
эндпоинт /auth/profile/appearance/, значения в session-payload;
- применение через data-theme на <html> и переменную --primary; производные
оттенки (hover/bg/border/text) считаются color-mix'ом и работают в обеих
темах с любым акцентом; antd переключается на darkAlgorithm;
- полный dark-набор токенов из дизайн-базлайна v2 в base.css (нейтрали,
поверхности, статусные полутона, тени) + токены surface-*/border-strong;
- массовая токенизация: ~1050 захардкоженных цветов в 45+ CSS-файлах и все
TSX-словари статусов переведены на var(--…); осознанно остались белый текст
на насыщенных фонах, QR-код, фирменные цвета каналов, аватары, iframe писем;
- карточка «Внешний вид» в настройках: три темы, четыре пресета акцента из
макета и произвольный HEX.
tsc 0, vitest 67 OK, build OK; backend-прогон зелёный (2 падения — артефакт
параллельного редактирования, воспроизведены и закрыты следующим прогоном).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Introduce a call kind (AUDIO default, VIDEO) so dialogs support both audio
and video calls. Video path is unchanged; audio is a separate full-screen
component built 1:1 on the «Аудиозвонок.dc.html» baseline.
Backend
- CallSession.kind (CallKind AUDIO|VIDEO, default AUDIO) + migration 0005
- create_call_request(kind), CallCreateView validates kind from request body
- serializers expose kind in call_payload, public_invite_payload,
public_call_state_payload (drop stale hardcoded capabilities)
- timeline system message reflects kind («аудио-/видеозвонок»)
- tests updated for the kind field and new message wording
@edevs/ui
- useCallRtcSession gains videoEnabled (default true; video unchanged);
audio requests audio-only getUserMedia, no camera fallback
- AudioCallView, AudioCallWaveform (live AnalyserNode oscilloscope),
AudioCallIcons (mic/speaker/phone/status), audioCallStates, audio-call.css
- exported via index.ts
internal-ui
- two call buttons in the conversation header (audio + video)
- CallOverlay becomes a kind dispatcher: VideoCallOverlay (unchanged) /
AudioCallOverlay; kind threaded through model/hook/workspace
web-chat
- CallInfo.kind; invite banner shows audio vs video title and icon
- CallApp dispatches to AudioCallStage for audio; audio resolve/build in model
Infra
- compose.yaml: widen Coturn relay UDP range to 49160-49999 (~420 relay
calls) with explanatory comment
Прошлый padding-bottom двигал буквы вверх — направление было неверным. По
факту flex ставит baseline в центр круга, а заглавные без нижних выносных
сидят на baseline и уходят вверх на ~0.37em. Сдвиг вниз padding-top:0.75em
(замерено попиксельно по факту рендера: big +0.25px, small -0.25px).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- поток собеседника монтируется всё время активного звонка, а не только при
включённой камере — иначе в аудиозвонке (камера выключена) не было звука
- :fullscreen раскладывает карточку колонкой (media flex:1) — нижняя панель
кнопок больше не уходит за край экрана
- кнопка полного экрана стала тумблером; крестик в полноэкранном режиме
сначала выходит из fullscreen, а не завершает звонок
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- .hub-call-avatar: padding-bottom 0.1em компенсирует ассиметрию метрик
Segoe UI (ink уходил на ~1.5px ниже центра круга при flex-центрировании)
- @media <=480px: клиентская вьюха звонка разворачивается на весь экран
(height 100dvh, media flex:1, aspect-ratio снят) вместо squat 16:9
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>