Commit Graph
11 Commits
Author SHA1 Message Date
AndreyandClaude Fable 5.1 a891947016 🧹 chore!: продукт без привязок к вендору — домены, почта, продукты, скоупы, события виджета
- нет зашитых доменов: 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>
2026-09-06 00:33:22 +03:00
AndreyandClaude Fable 5 670091935b ✨ feat(ui): темизация — тёмная тема и акцент per-user (SPEC-HUB-0031 §7)
- поле 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>
2026-09-04 23:48:06 +03:00
Andrey bb7ed5e8f9 fix(call): fix audio calls 2026-08-01 00:37:24 +03:00
Andrey e78eb9f17d ✨ feat(calls): add audio calls alongside video calls
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
2026-07-31 01:35:29 +03:00
Andrey 2b9946776a ✨ feat(calls): add audio alerts and widget indicators 2026-07-12 08:10:05 +03:00
AndreyandClaude Opus 4.8 58925e3036 fix(calls): инициалы точно по центру круга
Прошлый 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>
2026-07-12 06:22:01 +03:00
AndreyandClaude Opus 4.8 8cf8f72799 fix(calls): звук аудиозвонка, полноэкранный режим и крестик
- поток собеседника монтируется всё время активного звонка, а не только при
  включённой камере — иначе в аудиозвонке (камера выключена) не было звука
- :fullscreen раскладывает карточку колонкой (media flex:1) — нижняя панель
  кнопок больше не уходит за край экрана
- кнопка полного экрана стала тумблером; крестик в полноэкранном режиме
  сначала выходит из fullscreen, а не завершает звонок

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 05:33:40 +03:00
AndreyandClaude Opus 4.8 ddde6e07d7 fix(calls): центрирование инициалов и full-screen звонок на мобильном
- .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>
2026-07-12 04:23:11 +03:00
Andrey bba6f17557 feat(calls): Step B 2026-07-12 01:17:17 +03:00
Andrey 7d4c4ba6ef Implement internal Hub baseline and auth flow 2026-06-17 20:47:58 +03:00
Andrey aacdd422b3 Initialize Edevs Hub repository 2026-06-17 18:14:16 +03:00