# Изменения Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/), проект придерживается [семантического версионирования](https://semver.org/lang/ru/). ## [0.0.29] — 2026-08-04 Кнопка «демонстрация экрана» в мини-окне конференции. ### Добавлено - В мини-окне (Document PiP) рядом с кнопкой микрофона появилась кнопка демонстрации экрана: начать и остановить показ можно, не разворачивая основное окно. Кнопка и кнопка основного тулбара отражают одно состояние — обе читают его из комнаты, а не из разметки. - Своя демонстрация показывается в мини-окне по обычным правилам сцены: забирает крупную плитку при старте, держится, пока говорят другие, и уступает говорящему либо закреплённому участнику после остановки. ### Примечания - Кнопка есть только там, где мини-окно — настоящее окно со своей разметкой, то есть в Chrome и Edge. В Safari мини-окно выводится средствами системы (нативный «картинка в картинке»), собственных кнопок в нём быть не может; в Firefox мини-окна нет вовсе. Это ограничение браузеров, а не недоработка. - При выборе «весь экран» мини-окно попадает в собственную демонстрацию — как и у всех остальных участников. Чтобы этого избежать, показывайте конкретное окно, а не экран целиком. ## [0.0.28] — 2026-08-04 Очередь поднятых рук видна всем участникам + отключаемый модуль. ### Добавлено - Очередь поднятых рук больше не спрятана от обычных участников — её видит любой, кто в конференции, не только организатор. Опустить чужую руку по-прежнему может только организатор: сервер это уже проверял (`api/chat.py`, задача B1), правки — только на фронте, кнопка «Опустить» показывается у записи, если это своя рука либо пользователь сам организатор. - «Поднятие руки» (кнопка «Рука» + очередь целиком) — отключаемый модуль в админке (`instance_settings.hand_queue`, дефолт `enabled=true` — поведение существующих инсталляций не меняется). Настройка едет участнику в `JoinOut` (как `chat_enabled`) до входа в комнату. Выключенный модуль гасит кнопки на фронте и отклоняет `raise_hand`/`lower_hand` на сервере кодом `hand_queue_disabled` — вторая линия защиты для клиента со старым `JoinOut` на руках. Переключение применяется со следующего входа в комнату (та же застылость на время жизни соединения, что и у `chat_enabled`). ## [0.0.27] — 2026-08-04 Разрыв связи больше не выбрасывает участника из конференции. ### Исправлено - Телефон с погасшим экраном выпадал из конференции, а при возвращении мог оказаться в лобби вместо комнаты. Причина установлена по логам прода: Chrome срезает ресурсы фоновой вкладке, телефон перестаёт отвечать по ICE, и LiveKit закрывает участника через 5 с после потери соединения (замерено: 37 с после блокировки экрана, 23 с после сворачивания браузера — то есть достаточно просто убрать вкладку в фон, гасить экран не обязательно). Восстановить сессию после этого нельзя — участника на сервере уже нет; нужен полный повторный вход, и `livekit-client` пытается сделать его сам, но его бюджет повторов (10 попыток за ~44 с) в фоновой вкладке успевает сгореть. Тогда приходило событие `Disconnected`, и страница комнаты уводила пользователя в лобби. Теперь непреднамеренный разрыв не уводит со страницы: сбрасывается состояние входа, и работает уже имевшийся путь авто-перезахода — резолв конференции, свежий токен, вход заново. Намеренный выход отличается по нажатию кнопки «Выйти», а не по коду причины: причину `CLIENT_INITIATED` присылает и кнопка, и сам `livekit-client`, который при заморозке вкладки (событие `freeze`) вызывает `disconnect()` самостоятельно. Разрывы, после которых возвращаться нельзя (участника выгнал организатор, конференция закрыта, вход той же личностью с другого устройства), уводят в лобби как раньше. От цикла «вошёл — сразу выбросило» защищает лимит в 5 перезаходов подряд; соединение, прожившее дольше 30 с, счётчик обнуляет. ## [0.0.26] — 2026-08-04 Мобильная комната: свайп шторки настроек и полноэкранный режим. ### Исправлено - Шторка «Настройки» на мобильном не закрывалась свайпом вниз почти никогда: обработчики висели только на ручке-волоске (`.room-sheet-handle`, 40×4px) — палец в неё практически невозможно попасть, и палец почти всегда приземлялся на панель, где обработчиков не было вовсе. Теперь свайп закрывает шторку при жесте по любому месту панели, но только когда её содержимое проскроллено в самый верх (`scrollTop === 0` на начало жеста) — иначе свайп вниз листает список устройств, как и должен стандартный bottom sheet. ### Добавлено - Полноэкранный режим комнаты — на мобильном кнопка «Экран» в тулбаре (как на десктопе), при активации топбар и тулбар уходят из потока и лежат оверлеем поверх сцены: показываются по тапу/клику по сцене вне элементов управления и сами прячутся через несколько секунд бездействия. На десктопе — та же логика (топбар/тулбар тоже прячутся в полноэкранном режиме), дополнительный способ вернуть их — навести мышь в нижнюю полосу экрана. ### Изменено - Кнопка настроек устройств в тулбаре на мобильном подписана «Настройки» вместо «Устройства». - Раскладка кнопок мобильного тулбара, когда они не помещаются в один ряд (7 и больше — с полноэкранным режимом и «Очередью» у организатора это обычный случай), стала равномерной сеткой на 4 колонки (7 → 4+3, 8 → 4+4) вместо переноса «как получится» через `flex-wrap`. - `deploy/render-templates.sh` умеет читать значения из файла, заданного переменной `ENV_FILE`, а не только из корневого `.env` (см. коммит `3847476`, вошёл в этот релиз) — для локальных стендов, где корневой `.env` указывает на боевые адреса. ## [0.0.25] — 2026-08-03 Два дефекта мини-окна конференции (Document PiP), оба видны только в Chrome. ### Исправлено - В Chrome пропадал звук других участников после возврата сцены из мини-окна в основное. `RoomAudioRenderer` жил внутри `RoomStage` и рендерился в обеих её ветках, поэтому скрытые `