Compare commits
4 Commits
f4e8f91839
...
v0.0.24
| Author | SHA1 | Date | |
|---|---|---|---|
| 8b63c24332 | |||
| cd5399f88a | |||
| 2be799b19d | |||
| 6b9d0b833e |
@@ -122,7 +122,7 @@ SMTP_TIMEOUT_S=30
|
|||||||
# --- Версия инстанса (релиз v0.0.1) ---
|
# --- Версия инстанса (релиз v0.0.1) ---
|
||||||
# install.sh копирует значение из корневого файла VERSION при каждой
|
# install.sh копирует значение из корневого файла VERSION при каждой
|
||||||
# установке/обновлении — руками менять не нужно.
|
# установке/обновлении — руками менять не нужно.
|
||||||
VIDCONF_VERSION=0.0.23
|
VIDCONF_VERSION=0.0.24
|
||||||
|
|
||||||
# --- Профили compose. Дефолт ниже (`media,monitoring`) — только для ручного
|
# --- Профили compose. Дефолт ниже (`media,monitoring`) — только для ручного
|
||||||
# `docker compose up` БЕЗ install.sh: медиа (LiveKit+coturn) + мониторинг,
|
# `docker compose up` БЕЗ install.sh: медиа (LiveKit+coturn) + мониторинг,
|
||||||
|
|||||||
26
CHANGELOG.md
26
CHANGELOG.md
@@ -3,6 +3,32 @@
|
|||||||
Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/),
|
Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/),
|
||||||
проект придерживается [семантического версионирования](https://semver.org/lang/ru/).
|
проект придерживается [семантического версионирования](https://semver.org/lang/ru/).
|
||||||
|
|
||||||
|
## [0.0.24] — 2026-08-03
|
||||||
|
|
||||||
|
Три артефакта вёрстки, вылезающие за границы блоков (эмодзи-поповер чата,
|
||||||
|
заголовок брендовой панели, чат в Firefox) + аудит похожих мест.
|
||||||
|
|
||||||
|
### Исправлено
|
||||||
|
- Заголовок «Ваша инфраструктура» на странице входа вылезал за край
|
||||||
|
брендовой панели на широком окне с узкой панелью (`.layout` — flex
|
||||||
|
42/58) — старый фикс уменьшал кегль только по ширине ОКНА (`@media`),
|
||||||
|
а не панели. Кегль `.brand-headline` теперь считается через container
|
||||||
|
query (`container-type: inline-size` + `cqw`) — тот же приём, что у
|
||||||
|
аватара участника в комнате. Тем же механизмом обрезались плашки
|
||||||
|
статистики («AI-саммари») — `.brand-stats` теперь переносит их на
|
||||||
|
мобильном и десктопе одинаково.
|
||||||
|
- Эмодзи-поповер в чате комнаты: последняя (5-я) колонка вылезала за
|
||||||
|
правый край поповера. Причина — гонка CSS-специфичности: правило
|
||||||
|
круглой кнопки «Отправить» (`.chat-input-row button`, 42×42px)
|
||||||
|
продолжало красить размер и кнопкам эмодзи внутри поповера (та же
|
||||||
|
гонка чинилась для цвета в 0.0.19, но не для размера). Добавлены явные
|
||||||
|
`width`/`height: auto` нужной специфичности + `max-width` на попап как
|
||||||
|
общая страховка.
|
||||||
|
- Чат комнаты вылезал за границы панели в Firefox: `.chat-messages`
|
||||||
|
(flex-колонка) без `min-height: 0` не сжималась в Firefox, `textarea`
|
||||||
|
поля ввода без `min-width: 0` упиралась в автоматическую минимальную
|
||||||
|
ширину (Firefox считает её от атрибута `cols`, жёстче Chrome/Safari).
|
||||||
|
|
||||||
## [0.0.23] — 2026-08-02
|
## [0.0.23] — 2026-08-02
|
||||||
|
|
||||||
Документация по сайзингу под медиа-нагрузку + видимость TURN-аллокаций в логах.
|
Документация по сайзингу под медиа-нагрузку + видимость TURN-аллокаций в логах.
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ services:
|
|||||||
MEDIA_ROOT: ${MEDIA_ROOT:-/app/media}
|
MEDIA_ROOT: ${MEDIA_ROOT:-/app/media}
|
||||||
# Версия инстанса (релиз v0.0.1) — install.sh копирует значение
|
# Версия инстанса (релиз v0.0.1) — install.sh копирует значение
|
||||||
# из файла VERSION (корень репозитория) в .env; отдаётся в GET /api/health.
|
# из файла VERSION (корень репозитория) в .env; отдаётся в GET /api/health.
|
||||||
VIDCONF_VERSION: ${VIDCONF_VERSION:-0.0.23}
|
VIDCONF_VERSION: ${VIDCONF_VERSION:-0.0.24}
|
||||||
# Число процессов uvicorn (см. backend/Dockerfile). Дефолт 2 рассчитан
|
# Число процессов uvicorn (см. backend/Dockerfile). Дефолт 2 рассчитан
|
||||||
# на 4-ядерный сервер, где ядра делятся с LiveKit. Поднимая значение,
|
# на 4-ядерный сервер, где ядра делятся с LiveKit. Поднимая значение,
|
||||||
# проверьте бюджет соединений с БД: каждый воркер держит свой пул
|
# проверьте бюджет соединений с БД: каждый воркер держит свой пул
|
||||||
|
|||||||
@@ -16,6 +16,11 @@
|
|||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
border-right: 1px solid var(--color-border);
|
border-right: 1px solid var(--color-border);
|
||||||
|
/* Запрос по ширине САМОЙ панели, а не окна: `.layout` — flex 42/58, и на
|
||||||
|
широком окне с узкой панелью `vw` (см. .brand-headline) не отражает
|
||||||
|
реальную доступную ширину — тот же паттерн, что у `.room-tile-avatar`
|
||||||
|
(container-type:size + cqmin, room.css) для аватара участника. */
|
||||||
|
container-type: inline-size;
|
||||||
}
|
}
|
||||||
.brand-panel::after {
|
.brand-panel::after {
|
||||||
content: "";
|
content: "";
|
||||||
@@ -41,6 +46,12 @@
|
|||||||
.brand-headline {
|
.brand-headline {
|
||||||
font: var(--text-display-lg);
|
font: var(--text-display-lg);
|
||||||
font-family: var(--font-display);
|
font-family: var(--font-display);
|
||||||
|
/* `cqw` — от ширины `.brand-panel` (её `container-type: inline-size` выше),
|
||||||
|
а не окна: длинное слово «инфраструктура» иначе не помещается именно
|
||||||
|
тогда, когда окно широкое, а панель (42% от него) — узкая. Раньше кегль
|
||||||
|
уменьшался только в @media по ширине ОКНА (узкие экраны) — не спасало
|
||||||
|
от этого случая. */
|
||||||
|
font-size: clamp(20px, 8cqw, 34px);
|
||||||
color: var(--color-ink-700);
|
color: var(--color-ink-700);
|
||||||
margin: 0 0 var(--space-4);
|
margin: 0 0 var(--space-4);
|
||||||
max-width: 460px;
|
max-width: 460px;
|
||||||
@@ -51,7 +62,11 @@
|
|||||||
max-width: 420px;
|
max-width: 420px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
.brand-stats { display: flex; gap: var(--space-4); z-index: 1; margin-top: var(--space-8); }
|
/* `flex-wrap` не только на мобильном медиа-запросе (см. ниже) — та же
|
||||||
|
природа бага, что у заголовка: узкая ПАНЕЛЬ (а не узкое окно) не даёт
|
||||||
|
двум плашкам поместиться в ряд, а `overflow:hidden` у `.brand-panel`
|
||||||
|
обрезал вторую вместо переноса. */
|
||||||
|
.brand-stats { display: flex; flex-wrap: wrap; gap: var(--space-4); z-index: 1; margin-top: var(--space-8); }
|
||||||
.stat-glass {
|
.stat-glass {
|
||||||
background: var(--color-surface-glass);
|
background: var(--color-surface-glass);
|
||||||
backdrop-filter: blur(16px);
|
backdrop-filter: blur(16px);
|
||||||
@@ -248,10 +263,10 @@
|
|||||||
right: -90px;
|
right: -90px;
|
||||||
bottom: -90px;
|
bottom: -90px;
|
||||||
}
|
}
|
||||||
/* clamp() — на узких экранах слово «инфраструктура» иначе вылезает за
|
/* Кегль теперь считает `.brand-headline` сама (cqw от ширины панели, см.
|
||||||
край брендовой панели (см. .brand-panel padding ниже и её overflow:hidden,
|
базовое правило) — здесь снимаем только `max-width:460px`: в сложенной
|
||||||
обрезающий текст без переноса вместо уменьшения кегля). */
|
колонкой раскладке панель может стать шире 460px, а дизайн этого хочет. */
|
||||||
.brand-headline { max-width: none; font-size: clamp(22px, 6.2vw, 34px); }
|
.brand-headline { max-width: none; }
|
||||||
.brand-sub { max-width: none; }
|
.brand-sub { max-width: none; }
|
||||||
.brand-stats { flex-wrap: wrap; }
|
.brand-stats { flex-wrap: wrap; }
|
||||||
.stat-glass { flex: 1 1 140px; min-width: 0; }
|
.stat-glass { flex: 1 1 140px; min-width: 0; }
|
||||||
|
|||||||
@@ -497,8 +497,14 @@ video[data-lk-source='screen_share'] { object-fit: contain; background: #000; }
|
|||||||
|
|
||||||
.chat-empty { font: var(--text-body); color: var(--color-room-text-tertiary); margin: auto; text-align: center; }
|
.chat-empty { font: var(--text-body); color: var(--color-room-text-tertiary); margin: auto; text-align: center; }
|
||||||
|
|
||||||
|
/* `min-height: 0` обязателен — тот же приём, что у `.stage-side` (комментарий
|
||||||
|
выше): без него `.chat-panel` (flex-колонка) в Firefox не сжимает
|
||||||
|
`.chat-messages` до высоты `flex:1`, а даёт ей вырасти по контенту
|
||||||
|
(список сообщений) и вылезти за пределы панели — Chrome в этой ситуации
|
||||||
|
более снисходителен, Firefox — нет. */
|
||||||
.chat-messages {
|
.chat-messages {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
min-height: 0;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
padding: var(--space-5);
|
padding: var(--space-5);
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -540,6 +546,13 @@ video[data-lk-source='screen_share'] { object-fit: contain; background: #000; }
|
|||||||
}
|
}
|
||||||
.chat-input-row textarea {
|
.chat-input-row textarea {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
/* Firefox даёт `<textarea>` большую автоматическую минимальную ширину,
|
||||||
|
завязанную на атрибут `cols` (умолчание 20 символов моноширинной
|
||||||
|
метрики), и как flex-item без `min-width:0` отказывается сжиматься
|
||||||
|
ниже нее — панель шириной 320px раздувается вправо. Chrome/Safari
|
||||||
|
считают минимальную ширину textarea мягче, поэтому баг был виден
|
||||||
|
только в Firefox. */
|
||||||
|
min-width: 0;
|
||||||
resize: none;
|
resize: none;
|
||||||
background: var(--color-room-tile);
|
background: var(--color-room-tile);
|
||||||
border: 1px solid var(--color-room-tile-border);
|
border: 1px solid var(--color-room-tile-border);
|
||||||
@@ -592,13 +605,18 @@ video[data-lk-source='screen_share'] { object-fit: contain; background: #000; }
|
|||||||
.chat-emoji-wrap .chat-emoji-trigger:disabled { opacity: 0.5; cursor: default; }
|
.chat-emoji-wrap .chat-emoji-trigger:disabled { opacity: 0.5; cursor: default; }
|
||||||
|
|
||||||
/* 5 колонок × 6 строк — ровно 30 эмодзи в EMOJI_OPTIONS (ChatPanel.tsx), без
|
/* 5 колонок × 6 строк — ровно 30 эмодзи в EMOJI_OPTIONS (ChatPanel.tsx), без
|
||||||
неполной последней строки. */
|
неполной последней строки. `max-width` — страховка на случай совсем узкого
|
||||||
|
viewport: фикс-ширина 220px без потолка сама по себе не переполняется при
|
||||||
|
текущей раскладке (триггер у левого края панели, попап растёт вправо в
|
||||||
|
свободное место — проверено геометрией и вживую), но фиксированный размер
|
||||||
|
совсем без ограничителя — плохая практика сама по себе. */
|
||||||
.chat-emoji-popover {
|
.chat-emoji-popover {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: calc(100% + var(--space-2));
|
bottom: calc(100% + var(--space-2));
|
||||||
left: 0;
|
left: 0;
|
||||||
z-index: 50;
|
z-index: 50;
|
||||||
width: 220px;
|
width: 220px;
|
||||||
|
max-width: calc(100vw - 2 * var(--space-4));
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(5, 1fr);
|
grid-template-columns: repeat(5, 1fr);
|
||||||
gap: 4px;
|
gap: 4px;
|
||||||
@@ -609,14 +627,30 @@ video[data-lk-source='screen_share'] { object-fit: contain; background: #000; }
|
|||||||
box-shadow: var(--shadow-room-panel);
|
box-shadow: var(--shadow-room-panel);
|
||||||
}
|
}
|
||||||
.chat-emoji-popover .chat-emoji-option {
|
.chat-emoji-popover .chat-emoji-option {
|
||||||
|
/* Настоящая причина переполнения (найдена по факту, не по догадке —
|
||||||
|
`getBoundingClientRect` показал кнопки 42×42px при колонке ~36px):
|
||||||
|
`.chat-input-row button` (специфичность 0,1,1) задаёт ВСЕМ кнопкам
|
||||||
|
формы `width/height: 42px` — это правило круглой кнопки «Отправить»,
|
||||||
|
а кнопки эмодзи в поповере тоже лежат внутри `.chat-input-row`
|
||||||
|
(см. комментарий выше про гонку специфичности, она чинилась для
|
||||||
|
цвета в 0.0.19, но не для размера). Без явного `width`/`height` здесь
|
||||||
|
побеждает тот 42px, сетка на 5 колонок раздувается за 220px попапа,
|
||||||
|
и последняя колонка уезжает вправо за рамку. `min-width: 0` сам по
|
||||||
|
себе НЕ помогает — конфликт не в авто-минимуме грида, а в explicit
|
||||||
|
width, который обязательно нужно перебить явно. */
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
min-width: 0;
|
||||||
aspect-ratio: 1;
|
aspect-ratio: 1;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
overflow: hidden;
|
||||||
background: none;
|
background: none;
|
||||||
border: none;
|
border: none;
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
|
white-space: nowrap;
|
||||||
border-radius: var(--radius-md);
|
border-radius: var(--radius-md);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user