Чаты: при открытии диалога фокус теперь стабильно ставится на последние сообщения, включая мобильный браузер и PWA.
Чаты: индикатор доставки/прочтения у исходящих сообщений перенесён в строку метаданных сразу после времени.
Чаты: кнопка эмодзи снова стабильно открывает библиотеку; добавлен надёжный fallback на ручной ввод эмодзи.
Чаты: улучшена работа скрепки на телефоне — устранены конфликты touch/pointer/click и ложные двойные открытия.
Чаты: добавлен индикатор состояния синхронизации (Онлайн/Офлайн/Связь/Синхр.) с ручным обновлением и мягким восстановлением после потери сети.
Technical:
views/chat.php: добавлены `focusLatestMessages()` и `historyLoadEnabled` для безопасного initial auto-scroll к низу без случайной подгрузки истории в момент открытия диалога.
views/chat.php: `.msg-read-state` переведён из absolute-overlay в inline-мету; рендер чеков синхронизирован в PHP/JS-билдерах сообщений.
views/chat.php: emoji-flow усилен через `getPicmoPopupApi()` + `toggleEmojiPicker()` + `warmupEmojiPicker()`; сохранён fallback prompt при недоступной библиотеке.
views/chat.php: добавлен sync-chip (`chatSyncBtn`) и сетевые хуки (`offline/online/focus/pageshow/visibilitychange`) с адаптацией polling и recovery UX.
v5.8.44
2026-03-05
What is new:
VPN Vault: окно создания записи свёрнуто по умолчанию и открывается только по кнопке «Добавить запись», чтобы не перегружать интерфейс.
VPN Vault: сохранён пошаговый режим 1→2→3 с понятной навигацией для новичков при создании VPN-записи.
VPN Vault: показ секрета теперь выводится как читаемые поля (ключ/логин/пароль/провайдер), вместо «сырых» JSON-блоков.
Technical:
views/vpn.php: подтверждён wizard-поток (`create_step`) и collapsible create-panel через `createExpanded`, с сохранением шага при POST-валидации.
index.php (`case vpn`): reveal/create flow оставлен совместимым с текущими правами доступа (`can_view_secret`) и шифрованным хранилищем `vpn_item_secrets`.
v5.8.43
2026-03-05
What is new:
Менеджер паролей: добавлен отдельный тип записи «Сервис» для сервисных кабинетов (например, кабинеты оператора связи).
Формы создания/редактирования стали типо-зависимыми: показываются только релевантные поля для выбранного типа записи.
Карточки телефонов расширены данными договора: на кого оформлен номер, дата договора, последняя активность и контроль отключения (90/120/150/180 дней).
В списке записей добавлен индикатор риска отключения номера на основе даты последней активности и выбранного интервала контроля.
Фильтры менеджера паролей переработаны: добавлены фильтры по стране и оператору номера, логика фильтрации связана с выбранным типом.
Technical:
app/passwords.php: расширена модель `pm_items` полями `phone_contract_holder`, `phone_contract_at`, `phone_last_activity_at`, `phone_keepalive_days`; добавлены нормализаторы и серверная валидация интервалов.
app/passwords.php: внедрена серверная типо-зависимая очистка мобильных метаданных (оператор/тариф/договорные поля хранятся только для `phone|service`).
app/migrations.php: добавлены миграции для новых колонок `pm_items` (MySQL/SQLite) и backfill `phone_keepalive_days` для старых записей.
views/passwords.php: реализован динамический UI по типам (`data-pm-kinds`), новый пресет «Сервис», типо-зависимые фильтры и отображение статуса риска отключения номера.
v5.8.42
2026-03-05
What is new:
Менеджер паролей: добавлен быстрый импорт из буфера обмена и авторазбор вставленного текста (URL, email, телефон, user:pass, login/password, vpn://).
Менеджер паролей: форма создания стала удобнее для новичков — шаги, пресеты, прогресс заполнения и генератор/оценка пароля.
Карточки телефонных записей расширены: страна, оператор, тариф и комментарий по номеру.
Добавлены фильтры по номеру и по использованию номера в сервисах (повторяется/уникальный).
В карточке записи теперь показывается «где используется номер» — список сервисов и количество вхождений.
Technical:
app/passwords.php: внедрены `pm_phone_normalize()`, расширенные поля телефона (`phone_country`, `phone_operator`, `phone_plan`, `phone_comment`) и фильтры `phone_value/phone_usage` в `pm_items_list_for_user(...)`.
app/passwords.php: добавлена `pm_phone_usage_map_for_user(...)` для построения связей по номеру между сервисами в пределах пользователя.
index.php (`case passwords`): подключены новые POST-поля и GET-фильтры, передача карты использования номера в `views/passwords.php`.
app/migrations.php: расширена схема `pm_items` (новые колонки и индексы), добавлен backfill `phone_norm` для старых записей.
views/passwords.php: добавлены UI быстрого импорта/распознавания, блок метаданных телефона в create/edit/list и фильтры по телефонному использованию.
v5.8.41
2026-03-05
What is new:
VPN Vault: добавлено управление Amnezia Premium из интерфейса — можно хранить ключ `vpn://...`, видеть срок действия и статус.
VPN Vault: доступы к записи теперь управляются без перезагрузки страницы (выдача, изменение прав, удаление доступа).
VPN Vault: раздел «Поделились со мной» стал рабочим — при праве `edit` доступны редактирование записи и работа с вложениями.
Technical:
app/vpn.php + index.php: добавлена обработка `amnezia_link` с валидацией формата `vpn://...` и включением в зашифрованный secret payload.
index.php (`case vpn` / `case vpn_api`): интегрированы permission-aware операции для shared-записей и API-действия `share_add`, `share_perm`, `share_remove`.
views/vpn.php: добавлены карточка подписки Amnezia Premium, бейджи срока действия, live-рендер access-list и AJAX-обновление шаринга/вложений без reload.
v5.8.40
2026-03-05
What is new:
Доска: кнопка «Создать доску» в форме выровнена по полям и больше не «висит» выше строки контролов.
Настройки: нижний блок сохранения стал компактнее и перестал визуально раздуваться на широких экранах.
Technical:
views/board_hub.php: для action-колонки добавлен выравнивающий spacer-label и минимальная ширина, чтобы кнопка была в одной оптической линии с input/select.
views/admin_settings.php: save-bar переведён на grid-layout (`admin-settings-savebar-meta`), уменьшены отступы/высота, обновлена адаптивная логика для мобильных.
v5.8.39
2026-03-04
What is new:
Доска: форма создания на странице инструмента выровнена по одной линии, без визуального «скачка» по вертикали.
Поля «Доступ» и «Публичность» получили одинаковую высоту и ширину, интерфейс стал ровнее и читаемее.
Technical:
views/board_hub.php: сетка формы переведена на верхнее выравнивание (`align-items-start`) и унифицирована высота контролов (`.form-control/.form-select` + `.board-create-submit`).
views/board_hub.php: добавлены классы `board-create-form`, `board-create-col-title`, `board-create-col-option`, `board-create-submit` и медиаправила для согласованной ширины колонок.
v5.8.38
2026-03-04
What is new:
PWA на мобильных стал стабильнее: вложения снова корректно открываются через единый viewer без конфликтов с fallback-переходами.
Исправлено «залипание» серого фона после закрытия модалок/viewer тапом вне окна на телефонах.
Оффлайн-контур стал надёжнее: критичные PWA-роуты продолжают отвечать корректным контентом даже при проблемах с БД-инициализацией.
Technical:
views/partials/scripts.php: добавлен глобальный cleanup modal/offcanvas backdrop-артефактов (`hide/hidden/pageshow/focus`) и исключён перехват `.js-open-viewer` ссылок в standalone file-viewer interceptor.
public/assets/js/viewer.js: обработка touch/click переработана с безопасным fallback (не блокирует обычную ссылку, если modal viewer не открылся), добавлена дополнительная очистка backdrop при hide.
index.php: добавлен ранний PWA-fallback для `service_worker`/`offline` и безопасный `manifest` fallback при недоступной БД, чтобы сохранить работоспособность установки/обновления PWA.
v5.8.34
2026-03-03
What is new:
Доска: интерфейс инструментов переработан в более чистую и интуитивную панель с логической группировкой.
Доска: добавлен встроенный чат участников с поддержкой текстовых сообщений и аудио-сообщений с микрофона.
Доска: вложения в чате открываются через единый viewer, как в остальных разделах проекта.
Доска: добавлена кнопка «Назад» (отмена одного действия) и hotkey `Ctrl/Cmd+Z`.
Technical:
views/board_canvas.php: обновлены layout/CSS панели инструментов, добавлен chat-panel с long-poll, UI/логика записи аудио через `MediaRecorder`, кнопка `btnUndo` и вызов `board_api&action=undo`.
index.php (`case board_api`): добавлены chat-экшены (`chat_all`, `chat_poll`, `chat_send`), экшен `undo`, и корректный `can_upload` через `upload_policy_check(...)`.
app/board.php: добавлены backend-функции чата доски (`board_chat_add_message`, `board_chat_get_messages`, `board_chat_poll`) и `board_undo_last_action(...)` для отката последнего действия.
app/migrations.php + app/files.php: добавлена таблица `board_messages`, upload-context `board` и проверки доступа к board-вложениям в `file_is_readable_by(...)`.
v5.8.33
2026-03-03
What is new:
Профиль: обложка снова отображается со скруглёнными углами, включая мобильную версию.
Профиль: шапка переработана по отступам — логин `@username` больше не наезжает на аватар и имя.
Настройки профиля: добавлен выбор формы аватарки (круглая/квадратная) с мгновенным предпросмотром.
Technical:
app/migrations.php + app/users.php: добавлено поле `users.avatar_shape` (`round|square`), нормализация значения и поддержка в `USER_SELECT_COLUMNS`/`user_update_profile_full()`.
index.php + app/auth.php + views/layout.php: `avatar_shape` интегрирован в сохранение профиля и сессионный снимок активного профиля.
views/profile.php + views/profile_edit.php: обновлены стили/разметка шапки профиля, скругление cover, адаптивные отступы и применение выбранной формы аватарки.
v5.8.31
2026-03-03
What is new:
Чаты: облачки сообщений возвращены к прежнему компактному виду, как в предыдущем интерфейсе.
Чаты: у исходящих сообщений индикатор доставки/прочтения снова отображается в правом верхнем круглом бейдже (как раньше).
Чаты: выровнены размеры и плотность bubble в режимах `telegram / compact / roomy`, чтобы внешний вид снова совпадал с классическим стилем.
Technical:
views/chat.php: для `.msg-bubble` возвращена компактная геометрия (`width: fit-content`), снижена «тяжесть» тени и скорректированы радиусы своих/чужих bubble.
views/chat.php: `.msg-meta` переведён на single-line layout; добавлена обрезка длинного имени отправителя без переноса времени.
views/chat.php: `.msg-read-state` у исходящих вынесен в absolute-позицию справа сверху внутри bubble и скрывается при открытии/hover меню действий, чтобы избежать визуального конфликта.
v5.8.30
2026-03-03
What is new:
Чаты: возвращён классический вид сообщений без «треугольных хвостов», пузырьки снова выглядят аккуратно в обеих темах.
Чаты: меню действий сообщения стало легче визуально, корректно позиционируется для своих/чужих сообщений и больше не уезжает за границы окна.
Чаты: убраны быстрые шаблоны ответов, чтобы освободить место у поля ввода.
Чаты: обновлена логика удаления и очистки — удаление сообщения выполняется сразу, добавлена очистка диалога «у себя» и «у всех».
Technical:
views/chat.php: удалены CSS-tail псевдоэлементы пузырьков, выровнены радиусы и переработан theme-aware стиль dropdown-меню действий.
views/chat.php: удалены quick-replies UI/JS; оставлены только рабочие действия в меню сообщения (`reply`, `copy`, `edit`, `delete`).
index.php: добавлен async-роут `chat_clear_async` и поддержка `clear_mode` (`for_me`/`for_all`) в основном POST-flow чата.
app/chat.php: добавлены `conversation_clear_for_all()` и `conversation_refresh_last_message_meta()` для корректной очистки диалога и обновления denormalized last-message полей.
v5.8.29
2026-03-03
What is new:
Настройки стали проще для ежедневной работы: добавлен режим «Базовый», который скрывает сложные блоки и оставляет только ключевые параметры.
Добавлен режим «Продвинутый» для админов: в нём доступны PWA/Push, звонки/WebRTC, health-check, база данных и расширенные RBAC-настройки.
Раздел «Политики» унифицирован с «Настройки → Доступ»: роли, регистрация и доменные политики теперь настраиваются в одном месте.
Technical:
views/admin_settings.php: введён переключатель режима интерфейса (`basic`/`advanced`) с сохранением выбора в `localStorage` и mode-aware фильтрацией секций, подпунктов и поиска.
views/admin_settings.php + index.php: RBAC/registration/domain policies интегрированы в общий settings POST-flow; `admin_policies` переведён в legacy-роут с редиректом на `settings_admin_access#settings-rbac`.
index.php + views/admin_settings.php: блок форматов профиля переведён на preset-first UX; для старых кастомных regex добавлен безопасный `legacy` режим без raw-regex в основном UI.
v5.5.0
2026-03-02
What is new:
Защита от брутфорса: ограничение попыток входа (5 за 15 мин) с автоматической блокировкой по IP+логину.
Минимальная длина пароля — 8 символов (регистрация, смена пароля, создание пользователя).
.htaccess deny для директорий `app/` и `storage/` — прямой доступ запрещён.
Утечка `admin_password_hint` в `$_SESSION['user']` устранена.
Маршрут `theme` защищён проверкой same-origin через Referer.
`setting_get()`: bulk-load всех настроек за 1 запрос + in-memory cache (устраняет N+1).
`ensure_schema()` / `ensure_mysql_utf8mb4()` / `system_assets_migrate_known_settings()` вынесены из hot-path — запускаются только при несовпадении `_schema_version` с `APP_VERSION`.
`user_ensure_first_global_admin()` оптимизирован: SELECT перед UPDATE, static guard.
index.php + app/settings.php: после `call_accept` возвращается актуальный call-state; добавлен fallback `iceTransportPolicy` при relay без TURN.
v5.8.16
2026-03-02
What is new:
Звонки в мессенджере: исправлен сценарий «Связь: ожидание» без подключения — звонки снова устанавливаются.
Мессенджер на телефоне: устранён правый зазор, чат и зона ввода снова растягиваются на всю ширину экрана.
PWA: ускорено подтягивание свежих исправлений после установки/обновления.
Technical:
index.php: call/rtc роуты добавлены в whitelist messenger-mode (`call_start/call_poll/call_signal_send/...`) — больше нет редиректа в HTML для JSON API.
app/chat.php: `call_is_participant()` получил fallback на `caller/callee` для legacy/частично мигрированных записей `rtc_call_members`.
layout.php + chat.php: мобильный canvas и колонки чата принудительно 100% ширины без скрытого ограничения контента.
service-worker.js + public/service-worker.js: `SW_VERSION` обновлён до `v13` для гарантированного обновления кэшей.
v5.8.17
2026-03-02
What is new:
Мобильный чат: устранён нижний «подбородок» и восстановлена корректная полноэкранная геометрия в mobile/PWA.
Мессенджер: новые сообщения снова появляются строго снизу, история подгружается только вверх.
Голосовые на телефоне: включён сценарий tap/tap/cancel (1-й тап старт, 2-й тап автоотправка, корзина — отмена).
Звонки 1:1: улучшена устойчивость соединения и диагностика вместо бесконечного «Связь: ожидание».
Technical:
views/chat.php: mobile fullscreen переведён на единый safe-area (компенсация только в composer), `body.chat-mobile-fullscreen` больше не дублирует нижний inset.
views/chat.php: `chatJumpBottom` вынесен из потока сообщений; `appendMessages()` всегда добавляет в конец, `prependMessages()` — только в начало.
views/chat.php: удалена ветка long-press записи; добавлен единый FSM записи голоса (`idle/starting/recording/stopping`) с защитой гонок.
views/chat.php: call transport переведён на strict JSON-парсинг с явной диагностикой redirect/HTML/invalid JSON для `call_*` endpoint-ов.
app/chat.php: `call_get()` добирает участников из `caller/callee` при неполном `rtc_call_members`; `call_incoming_for_user()` возвращает `call_id` alias.
service-worker.js + public/service-worker.js: `SW_VERSION` обновлён до `v14` для ускоренного подтягивания фиксов в PWA.
v5.8.18
2026-03-02
What is new:
Обновления больше не переключают рабочий сайт с MySQL на SQLite после распаковки релиза.
Первичный запуск корректно открывает установщик, если реальная конфигурация БД отсутствует.
Мобильный мессенджер: убран нижний «подбородок», поле ввода прижато к нижней границе экрана.
Technical:
scripts/make-release.ps1: исключено принудительное добавление `storage/config.php` в релиз (опционально только через `-IncludeRuntimeConfig`).
app/core.php: `is_installed()` переведён на валидацию конфигурации (`mysql` поля / наличие sqlite-файла), а не на простой факт существования `storage/config.php`.
views/chat.php: в mobile fullscreen отключён нижний safe-area отступ composer (`--cm-safe-bottom: 0`) для устранения лишнего пространства.
service-worker.js + public/service-worker.js: `SW_VERSION` обновлён до `v15` для быстрого применения фиксов в PWA.
v5.8.19
2026-03-02
What is new:
Мобильный мессенджер: исправлена геометрия fullscreen-чата на телефоне — убран нижний «подбородок», зона ввода прижата к низу и корректно следует за клавиатурой.
Мессенджер: устранены повторяющиеся day-divider при отправке новых сообщений в текущий день.
Звонки 1:1: стабилизирован сценарий входящего звонка, когда диалог не открыт (signal/poll продолжают работать по call_id).
Админка: нижняя панель сохранения настроек сделана компактнее по высоте.
Technical:
views/chat.php: mobile fullscreen переведён на `inset + --chat-vv-bottom` (keyboard gap) вместо `top/height`, убраны лишние `100vw` ограничения и правый зазор.
views/chat.php: day-divider логика нормализована через `normalizeDayToken()` + `lastRenderedDayToken()`; `appendMessages()` больше не создаёт лишние разделители дат.
views/chat.php: call signaling использует `callConversationId()` fallback (`activeCall.conversation_id` -> `currentCid`) для `call_poll` и `call_signal_send`.
index.php: в `call_poll` и `call_signal_send` добавлен backend fallback `conversation_id` из `call_id`, если фронт не передал `conversation_id`.
views/admin_settings.php: снижены padding/line-height у `admin-settings-savebar` для более тонкого sticky-барa.
service-worker.js + public/service-worker.js: `SW_VERSION` обновлён до `v16` для немедленного применения фиксов в PWA.
v5.8.20
2026-03-02
What is new:
Исправлен критичный сбой `CSRF token mismatch` после регистрации/авторизации в мобильных webview (включая Telegram/iOS).
Формы входа/регистрации/спец-регистрации и инсталлятора стали устойчивее к возврату из кеша страницы.
При CSRF-рассинхроне интерфейс больше не падает в «белую страницу»: пользователь получает мягкий возврат и повтор действия.
Technical:
app/bootstrap.php: CSRF переведён на rolling-пул токенов (`csrf_tokens`) + восстановление из cookie при потере session.
app/bootstrap.php: добавлен fallback по нескольким именам CSRF-cookie (`__Host-*` и non-host) для mixed HTTPS/proxy окружений.
app/bootstrap.php: `csrf_check()` теперь принимает token из `_csrf`/`csrf` и `X-CSRF-*` заголовков; усилена JSON/browser обработка ошибок.
index.php + install.php: для auth/install маршрутов добавлены no-store заголовки, чтобы не отправлять устаревшие hidden-токены.
views/login.php, views/register.php, views/friend_register.php, install.php: добавлен `pageshow` guard против stale CSRF из bfcache.
v5.8.21
2026-03-02
What is new:
Версия на сайте теперь корректно обновляется после деплоя релиза на Linux-серверы.
Тех. релиз и системная новость для текущей версии автоматически появляются в интерфейсе без ручного добавления.
Процесс обновления стал безопаснее: релиз-архив больше не ломает структуру путей при распаковке.
Technical:
scripts/make-release.ps1: сборка ZIP переписана на явное добавление файлов с POSIX-путями (`/`) вместо Windows-разделителей (`\`).
app/news.php: добавлена `news_sync_builtin_releases_for_version(APP_VERSION)` — дозапись встроенных `system/changelog` записей для текущей версии в существующие БД.
index.php: синхронизация builtin-релизов вызывается на старте (idempotent, через ключ `_news_builtin_synced_version`).
service-worker.js + public/service-worker.js: `SW_VERSION` повышен до `v18` для гарантированного обновления фронтовых ассетов.
v5.8.22
2026-03-02
What is new:
Исправлена диагностика обновлений: теперь легко проверить, какая версия реально работает на сервере.
Уточнён и зафиксирован безопасный деплой-процесс для production, чтобы версия в подвале и техрелизы всегда обновлялись.
Technical:
index.php и install.php: добавлен HTTP-заголовок `X-TSOY-Version` с текущим `APP_VERSION` для быстрой проверки фактической версии после деплоя.
README.md: добавлены инструкции проверки версии через `curl -I` и очистки артефактов старых Windows-архивов (`*\\*`) на Linux.
service-worker.js + public/service-worker.js: `SW_VERSION` повышен до `v19` для ускоренного обновления PWA-кэша.
v5.8.23
2026-03-02
What is new:
Стабилизирована работа проекта за reverse-proxy/CDN: HTTPS-ссылки и cookie теперь формируются корректно в проксированных окружениях.
Снижён риск проблем с логином/CSRF/выходом из-за неверного определения схемы запроса.
Документация синхронизирована с реальной SQLite-конфигурацией (`storage/app.sqlite`).
Technical:
app/core.php: добавлены `request_is_https()` и `request_scheme()` с поддержкой `HTTPS`, `X-Forwarded-Proto`, `X-Forwarded-SSL`, `Front-End-Https`.
.htaccess deny для директорий `app/` и `storage/` — прямой доступ запрещён.
Утечка `admin_password_hint` в `$_SESSION['user']` устранена.
Маршрут `theme` защищён проверкой same-origin через Referer.
`setting_get()`: bulk-load всех настроек за 1 запрос + in-memory cache (устраняет N+1).
`ensure_schema()` / `ensure_mysql_utf8mb4()` / `system_assets_migrate_known_settings()` вынесены из hot-path — запускаются только при несовпадении `_schema_version` с `APP_VERSION`.
`user_ensure_first_global_admin()` оптимизирован: SELECT перед UPDATE, static guard.
index.php + app/settings.php: после `call_accept` возвращается актуальный call-state; добавлен fallback `iceTransportPolicy` при relay без TURN.
v5.8.16
2026-03-02
What is new:
Звонки в мессенджере: исправлен сценарий «Связь: ожидание» без подключения — звонки снова устанавливаются.
Мессенджер на телефоне: устранён правый зазор, чат и зона ввода снова растягиваются на всю ширину экрана.
PWA: ускорено подтягивание свежих исправлений после установки/обновления.
Technical:
index.php: call/rtc роуты добавлены в whitelist messenger-mode (`call_start/call_poll/call_signal_send/...`) — больше нет редиректа в HTML для JSON API.
app/chat.php: `call_is_participant()` получил fallback на `caller/callee` для legacy/частично мигрированных записей `rtc_call_members`.
layout.php + chat.php: мобильный canvas и колонки чата принудительно 100% ширины без скрытого ограничения контента.
service-worker.js + public/service-worker.js: `SW_VERSION` обновлён до `v13` для гарантированного обновления кэшей.
v5.8.17
2026-03-02
What is new:
Мобильный чат: устранён нижний «подбородок» и восстановлена корректная полноэкранная геометрия в mobile/PWA.
Мессенджер: новые сообщения снова появляются строго снизу, история подгружается только вверх.
Голосовые на телефоне: включён сценарий tap/tap/cancel (1-й тап старт, 2-й тап автоотправка, корзина — отмена).
Звонки 1:1: улучшена устойчивость соединения и диагностика вместо бесконечного «Связь: ожидание».
Technical:
views/chat.php: mobile fullscreen переведён на единый safe-area (компенсация только в composer), `body.chat-mobile-fullscreen` больше не дублирует нижний inset.
views/chat.php: `chatJumpBottom` вынесен из потока сообщений; `appendMessages()` всегда добавляет в конец, `prependMessages()` — только в начало.
views/chat.php: удалена ветка long-press записи; добавлен единый FSM записи голоса (`idle/starting/recording/stopping`) с защитой гонок.
views/chat.php: call transport переведён на strict JSON-парсинг с явной диагностикой redirect/HTML/invalid JSON для `call_*` endpoint-ов.
app/chat.php: `call_get()` добирает участников из `caller/callee` при неполном `rtc_call_members`; `call_incoming_for_user()` возвращает `call_id` alias.
service-worker.js + public/service-worker.js: `SW_VERSION` обновлён до `v14` для ускоренного подтягивания фиксов в PWA.
v5.8.18
2026-03-02
What is new:
Обновления больше не переключают рабочий сайт с MySQL на SQLite после распаковки релиза.
Первичный запуск корректно открывает установщик, если реальная конфигурация БД отсутствует.
Мобильный мессенджер: убран нижний «подбородок», поле ввода прижато к нижней границе экрана.
Technical:
scripts/make-release.ps1: исключено принудительное добавление `storage/config.php` в релиз (опционально только через `-IncludeRuntimeConfig`).
app/core.php: `is_installed()` переведён на валидацию конфигурации (`mysql` поля / наличие sqlite-файла), а не на простой факт существования `storage/config.php`.
views/chat.php: в mobile fullscreen отключён нижний safe-area отступ composer (`--cm-safe-bottom: 0`) для устранения лишнего пространства.
service-worker.js + public/service-worker.js: `SW_VERSION` обновлён до `v15` для быстрого применения фиксов в PWA.
v5.8.19
2026-03-02
What is new:
Мобильный мессенджер: исправлена геометрия fullscreen-чата на телефоне — убран нижний «подбородок», зона ввода прижата к низу и корректно следует за клавиатурой.
Мессенджер: устранены повторяющиеся day-divider при отправке новых сообщений в текущий день.
Звонки 1:1: стабилизирован сценарий входящего звонка, когда диалог не открыт (signal/poll продолжают работать по call_id).
Админка: нижняя панель сохранения настроек сделана компактнее по высоте.
Technical:
views/chat.php: mobile fullscreen переведён на `inset + --chat-vv-bottom` (keyboard gap) вместо `top/height`, убраны лишние `100vw` ограничения и правый зазор.
views/chat.php: day-divider логика нормализована через `normalizeDayToken()` + `lastRenderedDayToken()`; `appendMessages()` больше не создаёт лишние разделители дат.
views/chat.php: call signaling использует `callConversationId()` fallback (`activeCall.conversation_id` -> `currentCid`) для `call_poll` и `call_signal_send`.
index.php: в `call_poll` и `call_signal_send` добавлен backend fallback `conversation_id` из `call_id`, если фронт не передал `conversation_id`.
views/admin_settings.php: снижены padding/line-height у `admin-settings-savebar` для более тонкого sticky-барa.
service-worker.js + public/service-worker.js: `SW_VERSION` обновлён до `v16` для немедленного применения фиксов в PWA.
v5.8.20
2026-03-02
What is new:
Исправлен критичный сбой `CSRF token mismatch` после регистрации/авторизации в мобильных webview (включая Telegram/iOS).
Формы входа/регистрации/спец-регистрации и инсталлятора стали устойчивее к возврату из кеша страницы.
При CSRF-рассинхроне интерфейс больше не падает в «белую страницу»: пользователь получает мягкий возврат и повтор действия.
Technical:
app/bootstrap.php: CSRF переведён на rolling-пул токенов (`csrf_tokens`) + восстановление из cookie при потере session.
app/bootstrap.php: добавлен fallback по нескольким именам CSRF-cookie (`__Host-*` и non-host) для mixed HTTPS/proxy окружений.
app/bootstrap.php: `csrf_check()` теперь принимает token из `_csrf`/`csrf` и `X-CSRF-*` заголовков; усилена JSON/browser обработка ошибок.
index.php + install.php: для auth/install маршрутов добавлены no-store заголовки, чтобы не отправлять устаревшие hidden-токены.
views/login.php, views/register.php, views/friend_register.php, install.php: добавлен `pageshow` guard против stale CSRF из bfcache.
v5.8.21
2026-03-02
What is new:
Версия на сайте теперь корректно обновляется после деплоя релиза на Linux-серверы.
Тех. релиз и системная новость для текущей версии автоматически появляются в интерфейсе без ручного добавления.
Процесс обновления стал безопаснее: релиз-архив больше не ломает структуру путей при распаковке.
Technical:
scripts/make-release.ps1: сборка ZIP переписана на явное добавление файлов с POSIX-путями (`/`) вместо Windows-разделителей (`\`).
app/news.php: добавлена `news_sync_builtin_releases_for_version(APP_VERSION)` — дозапись встроенных `system/changelog` записей для текущей версии в существующие БД.
index.php: синхронизация builtin-релизов вызывается на старте (idempotent, через ключ `_news_builtin_synced_version`).
service-worker.js + public/service-worker.js: `SW_VERSION` повышен до `v18` для гарантированного обновления фронтовых ассетов.
v5.8.22
2026-03-02
What is new:
Исправлена диагностика обновлений: теперь легко проверить, какая версия реально работает на сервере.
Уточнён и зафиксирован безопасный деплой-процесс для production, чтобы версия в подвале и техрелизы всегда обновлялись.
Technical:
index.php и install.php: добавлен HTTP-заголовок `X-TSOY-Version` с текущим `APP_VERSION` для быстрой проверки фактической версии после деплоя.
README.md: добавлены инструкции проверки версии через `curl -I` и очистки артефактов старых Windows-архивов (`*\\*`) на Linux.
service-worker.js + public/service-worker.js: `SW_VERSION` повышен до `v19` для ускоренного обновления PWA-кэша.
v5.8.23
2026-03-02
What is new:
Стабилизирована работа проекта за reverse-proxy/CDN: HTTPS-ссылки и cookie теперь формируются корректно в проксированных окружениях.
Снижён риск проблем с логином/CSRF/выходом из-за неверного определения схемы запроса.
Документация синхронизирована с реальной SQLite-конфигурацией (`storage/app.sqlite`).
Technical:
app/core.php: добавлены `request_is_https()` и `request_scheme()` с поддержкой `HTTPS`, `X-Forwarded-Proto`, `X-Forwarded-SSL`, `Front-End-Https`.
.htaccess deny для директорий `app/` и `storage/` — прямой доступ запрещён.
Утечка `admin_password_hint` в `$_SESSION['user']` устранена.
Маршрут `theme` защищён проверкой same-origin через Referer.
`setting_get()`: bulk-load всех настроек за 1 запрос + in-memory cache (устраняет N+1).
`ensure_schema()` / `ensure_mysql_utf8mb4()` / `system_assets_migrate_known_settings()` вынесены из hot-path — запускаются только при несовпадении `_schema_version` с `APP_VERSION`.
`user_ensure_first_global_admin()` оптимизирован: SELECT перед UPDATE, static guard.
index.php + app/settings.php: после `call_accept` возвращается актуальный call-state; добавлен fallback `iceTransportPolicy` при relay без TURN.
v5.8.16
2026-03-02
What is new:
Звонки в мессенджере: исправлен сценарий «Связь: ожидание» без подключения — звонки снова устанавливаются.
Мессенджер на телефоне: устранён правый зазор, чат и зона ввода снова растягиваются на всю ширину экрана.
PWA: ускорено подтягивание свежих исправлений после установки/обновления.
Technical:
index.php: call/rtc роуты добавлены в whitelist messenger-mode (`call_start/call_poll/call_signal_send/...`) — больше нет редиректа в HTML для JSON API.
app/chat.php: `call_is_participant()` получил fallback на `caller/callee` для legacy/частично мигрированных записей `rtc_call_members`.
layout.php + chat.php: мобильный canvas и колонки чата принудительно 100% ширины без скрытого ограничения контента.
service-worker.js + public/service-worker.js: `SW_VERSION` обновлён до `v13` для гарантированного обновления кэшей.
v5.8.17
2026-03-02
What is new:
Мобильный чат: устранён нижний «подбородок» и восстановлена корректная полноэкранная геометрия в mobile/PWA.
Мессенджер: новые сообщения снова появляются строго снизу, история подгружается только вверх.
Голосовые на телефоне: включён сценарий tap/tap/cancel (1-й тап старт, 2-й тап автоотправка, корзина — отмена).
Звонки 1:1: улучшена устойчивость соединения и диагностика вместо бесконечного «Связь: ожидание».
Technical:
views/chat.php: mobile fullscreen переведён на единый safe-area (компенсация только в composer), `body.chat-mobile-fullscreen` больше не дублирует нижний inset.
views/chat.php: `chatJumpBottom` вынесен из потока сообщений; `appendMessages()` всегда добавляет в конец, `prependMessages()` — только в начало.
views/chat.php: удалена ветка long-press записи; добавлен единый FSM записи голоса (`idle/starting/recording/stopping`) с защитой гонок.
views/chat.php: call transport переведён на strict JSON-парсинг с явной диагностикой redirect/HTML/invalid JSON для `call_*` endpoint-ов.
app/chat.php: `call_get()` добирает участников из `caller/callee` при неполном `rtc_call_members`; `call_incoming_for_user()` возвращает `call_id` alias.
service-worker.js + public/service-worker.js: `SW_VERSION` обновлён до `v14` для ускоренного подтягивания фиксов в PWA.
v5.8.18
2026-03-02
What is new:
Обновления больше не переключают рабочий сайт с MySQL на SQLite после распаковки релиза.
Первичный запуск корректно открывает установщик, если реальная конфигурация БД отсутствует.
Мобильный мессенджер: убран нижний «подбородок», поле ввода прижато к нижней границе экрана.
Technical:
scripts/make-release.ps1: исключено принудительное добавление `storage/config.php` в релиз (опционально только через `-IncludeRuntimeConfig`).
app/core.php: `is_installed()` переведён на валидацию конфигурации (`mysql` поля / наличие sqlite-файла), а не на простой факт существования `storage/config.php`.
.htaccess deny для директорий `app/` и `storage/` — прямой доступ запрещён.
Утечка `admin_password_hint` в `$_SESSION['user']` устранена.
Маршрут `theme` защищён проверкой same-origin через Referer.
`setting_get()`: bulk-load всех настроек за 1 запрос + in-memory cache (устраняет N+1).
`ensure_schema()` / `ensure_mysql_utf8mb4()` / `system_assets_migrate_known_settings()` вынесены из hot-path — запускаются только при несовпадении `_schema_version` с `APP_VERSION`.
`user_ensure_first_global_admin()` оптимизирован: SELECT перед UPDATE, static guard.
index.php + app/settings.php: после `call_accept` возвращается актуальный call-state; добавлен fallback `iceTransportPolicy` при relay без TURN.
v5.8.16
2026-03-02
What is new:
Звонки в мессенджере: исправлен сценарий «Связь: ожидание» без подключения — звонки снова устанавливаются.
Мессенджер на телефоне: устранён правый зазор, чат и зона ввода снова растягиваются на всю ширину экрана.
PWA: ускорено подтягивание свежих исправлений после установки/обновления.
Technical:
index.php: call/rtc роуты добавлены в whitelist messenger-mode (`call_start/call_poll/call_signal_send/...`) — больше нет редиректа в HTML для JSON API.
app/chat.php: `call_is_participant()` получил fallback на `caller/callee` для legacy/частично мигрированных записей `rtc_call_members`.
layout.php + chat.php: мобильный canvas и колонки чата принудительно 100% ширины без скрытого ограничения контента.
service-worker.js + public/service-worker.js: `SW_VERSION` обновлён до `v13` для гарантированного обновления кэшей.
v5.8.17
2026-03-02
What is new:
Мобильный чат: устранён нижний «подбородок» и восстановлена корректная полноэкранная геометрия в mobile/PWA.
Мессенджер: новые сообщения снова появляются строго снизу, история подгружается только вверх.
Голосовые на телефоне: включён сценарий tap/tap/cancel (1-й тап старт, 2-й тап автоотправка, корзина — отмена).
Звонки 1:1: улучшена устойчивость соединения и диагностика вместо бесконечного «Связь: ожидание».
Technical:
views/chat.php: mobile fullscreen переведён на единый safe-area (компенсация только в composer), `body.chat-mobile-fullscreen` больше не дублирует нижний inset.
views/chat.php: `chatJumpBottom` вынесен из потока сообщений; `appendMessages()` всегда добавляет в конец, `prependMessages()` — только в начало.
views/chat.php: удалена ветка long-press записи; добавлен единый FSM записи голоса (`idle/starting/recording/stopping`) с защитой гонок.
views/chat.php: call transport переведён на strict JSON-парсинг с явной диагностикой redirect/HTML/invalid JSON для `call_*` endpoint-ов.
app/chat.php: `call_get()` добирает участников из `caller/callee` при неполном `rtc_call_members`; `call_incoming_for_user()` возвращает `call_id` alias.
service-worker.js + public/service-worker.js: `SW_VERSION` обновлён до `v14` для ускоренного подтягивания фиксов в PWA.
v5.0.0
2026-03-01
What is new:
Система «Группы» переименована в «Домены» — организационные единицы теперь называются доменами.
Маршрут `admin_groups` → `admin_domains`; навигация, дашборд и все UI-тексты обновлены.
Корневой домен заменяет «Глобальную группу» — автоматически создаётся при первом запуске.
Обратная совместимость: старый адрес `?r=admin_groups` автоматически редиректит на `?r=admin_domains`.
Поддержка MySQL и SQLite: `ALTER TABLE RENAME`, `RENAME COLUMN` / `CHANGE COLUMN` в зависимости от драйвера.
`app/users.php`: все функции `group_*`/`groups_*` переименованы в `domain_*`/`domains_*` (16 функций); SQL-запросы обновлены на новые имена таблиц/колонок.
`app/auth.php`: сессионные поля `group_id`→`domain_id`, `group_role`→`domain_role`; SQL SELECT обновлён.
`app/chat.php`: SQL-запросы и сообщение об ошибке обновлены.
`app/policies.php`: ключ возможности `'groups'`→`'domains'` (5 ролей).
`index.php`: маршрут `admin_groups`→`admin_domains`; POST-обработчики `create_group`→`create_domain`, `rename_group`→`rename_domain`, `delete_group`→`delete_domain`, `set_group`→`set_domain`; аудит-логи обновлены.
`views/admin_groups.php` удалён, создан `views/admin_domains.php` с полным рефакторингом UI-текстов и переменных.
`views/admin_users.php`, `views/layout.php`, `views/staff.php`, `views/admin_policies.php` — обновлены ссылки, сессионные поля и UI-тексты.
`app/migrations.php`: код первичного создания таблиц использует новые имена; добавлена инкрементальная миграция для существующих БД с проверками `table_exists`/`column_exists`.
v5.1.0
2026-03-01
What is new:
Маршрут `dashboard` (файловый проводник) переименован в `skybox` — SkyBox, личное облачное хранилище.
Маршрут `staff` (панель администратора) переименован в `dashboard` — Дашборд.
Маршрут `admin` (хранилище проекта) переименован в `filehub` — FileHub.
Обратная совместимость: старые адреса `?r=staff` и `?r=admin` автоматически редиректят на новые.
`user_update_profile()` и `user_update_profile_full()` — сигнатуры изменены: вместо `$display_name` принимают `$first_name`, `$last_name`.
`user_display_name()` и `user_profile_title_display()` приоритизируют `first_name + last_name`.
`user_profile_set_title()` принимает `$first_name`, `$last_name` вместо `$title`.
`auth_session_apply_active_profile()` и `auth_login()` — в сессию добавлены `first_name`, `last_name`.
Все SQL-запросы SELECT для пользователей дополнены `first_name`, `last_name`.
Поиск пользователей (директория, админка) расширен на `first_name`, `last_name`.
v5.4.0
2026-03-01
What is new:
Настройка Preloader перенесена из личных настроек пользователя в глобальные настройки администратора (раздел «Дизайн»).
Push-подписки: автоматическая дедупликация устройств — при переподписке с того же устройства старая подписка заменяется.
Push-подписки: автоочистка неактивных подписок старше 30 дней.
Администратор: кнопки «Очистить неактивные» и «Очистить всё» для управления списком push-устройств.
Technical:
Preloader: параметры `preloader_mode`, `preloader_compact`, `preloader_show_text` перенесены в таблицу `settings`.
Per-user параметры `ui_preloader_mode`, `ui_preloader_compact`, `ui_preloader_show_text` больше не используются (колонки сохранены для совместимости).
`user_update_ui_prefs()` — убраны параметры preloader из сигнатуры.
`auth_login()` и `auth_session_apply_active_profile()` — убраны preloader-поля из сессии.
`layout.php` — preloader JS-конфиг читается из `setting_get()` вместо user data.
`push_subscription_save()` — дедупликация по `user_id + device_label`: при регистрации новой подписки удаляются старые с того же устройства.
`push_subscription_device_fingerprint()` — нормализация user-agent для стабильного fingerprint.
`push_subscriptions_cleanup_stale()` — автоочистка неактивных подписок старше N дней.
`push_subscriptions_delete_inactive()` и `push_subscriptions_delete_all()` — функции массовой очистки.
Route `push_subscription_cleanup` — обработчик кнопок очистки в админке.
v5.8.5
2026-03-01
What is new:
Дашборд: статистика фильтруется по домену — администратор домена видит метрики только своего домена, а не всего сервиса.
Политики: доменные политики (мосты, корневой админ, домен по умолчанию) перенесены из Настроек на страницу «Политики» для единообразного управления.
Домены: администратор домена теперь видит и может управлять (переименование, перегенерация кода) своими доменами; список доменов фильтруется по доступу.
Новая политика «Домен по умолчанию»: пользователи, зарегистрировавшиеся без кода домена, автоматически попадают в выбранный домен.
Управление новостями: три вкладки (Новости / Системные / Тех. релизы) — можно удалять и восстанавливать встроенные системные записи и тех. релизы.
Technical:
Новая функция `dashboard_stats_for_domains(array $domainIds)` в `app/health.php` — статистика, ограниченная набором доменов.
`views/dashboard.php` использует `admin_visible_domain_ids()` для выбора `dashboard_stats()` или `dashboard_stats_for_domains()`.
Доменные политики (`bridge_admin_policy`, `root_domain_admin_full_access`, `default_new_user_domain_id`) перенесены в `views/admin_policies.php` (POST + UI).
Удалён блок доменных политик из `views/admin_settings.php` и POST-обработчик из index.php → settings.
`user_default_domain_id_for_role()` теперь учитывает настройку `default_new_user_domain_id` при самостоятельной регистрации.
`views/admin_domains.php` фильтрует домены и мосты по `admin_visible_domain_ids()`; POST-обработчики `rename_domain` / `regen_domain_code` разрешены доменным админам.
Системные новости и тех. релизы перенесены из захардкоженных массивов PHP в таблицу `news` (DB): колонки `type`, `published_date`, `metadata_json`; удаление через `deleted_at` (soft-delete).
Новые функции: `news_list_system()`, `news_list_system_all()`, `app_changelog()`, `app_changelog_all()` — чтение из БД с fallback на `_news_builtin_system_entries()` / `_changelog_builtin_entries()`.
Сидер `_news_seed_builtin_entries()` заполняет таблицу `news` из захардкоженных массивов при первом запуске (флаг `_news_builtin_seeded`).
Маршруты `news_delete_system`, `news_restore_system`, `news_delete_changelog`, `news_restore_changelog` работают по ID записи в БД, а не по строке версии.
v5.8.6
2026-03-01
What is new:
Мессенджер: полная переработка интерфейса в стиле Telegram — боковой список диалогов, панель переписки, адаптивная мобильная раскладка.
Мессенджер: голосовые сообщения, эмодзи-пикер, вложения файлов из облака и устройства.
Мессенджер: WebRTC-звонки с корректным сигнальным API и индикатором качества связи.
Профиль: полная переработка в стиле Instagram/VK — обложка, центрированный инфо-блок, панель статистики.
Поддержка MySQL и SQLite: `ALTER TABLE RENAME`, `RENAME COLUMN` / `CHANGE COLUMN` в зависимости от драйвера.
`app/users.php`: все функции `group_*`/`groups_*` переименованы в `domain_*`/`domains_*` (16 функций); SQL-запросы обновлены на новые имена таблиц/колонок.
`app/auth.php`: сессионные поля `group_id`→`domain_id`, `group_role`→`domain_role`; SQL SELECT обновлён.
`app/chat.php`: SQL-запросы и сообщение об ошибке обновлены.
`app/policies.php`: ключ возможности `'groups'`→`'domains'` (5 ролей).
`index.php`: маршрут `admin_groups`→`admin_domains`; POST-обработчики `create_group`→`create_domain`, `rename_group`→`rename_domain`, `delete_group`→`delete_domain`, `set_group`→`set_domain`; аудит-логи обновлены.
`views/admin_groups.php` удалён, создан `views/admin_domains.php` с полным рефакторингом UI-текстов и переменных.
`views/admin_users.php`, `views/layout.php`, `views/staff.php`, `views/admin_policies.php` — обновлены ссылки, сессионные поля и UI-тексты.
`app/migrations.php`: код первичного создания таблиц использует новые имена; добавлена инкрементальная миграция для существующих БД с проверками `table_exists`/`column_exists`.
v5.1.0
2026-03-01
What is new:
Маршрут `dashboard` (файловый проводник) переименован в `skybox` — SkyBox, личное облачное хранилище.
Маршрут `staff` (панель администратора) переименован в `dashboard` — Дашборд.
Маршрут `admin` (хранилище проекта) переименован в `filehub` — FileHub.
Обратная совместимость: старые адреса `?r=staff` и `?r=admin` автоматически редиректят на новые.
`user_update_profile()` и `user_update_profile_full()` — сигнатуры изменены: вместо `$display_name` принимают `$first_name`, `$last_name`.
`user_display_name()` и `user_profile_title_display()` приоритизируют `first_name + last_name`.
`user_profile_set_title()` принимает `$first_name`, `$last_name` вместо `$title`.
`auth_session_apply_active_profile()` и `auth_login()` — в сессию добавлены `first_name`, `last_name`.
Все SQL-запросы SELECT для пользователей дополнены `first_name`, `last_name`.
Поиск пользователей (директория, админка) расширен на `first_name`, `last_name`.
v5.4.0
2026-03-01
What is new:
Настройка Preloader перенесена из личных настроек пользователя в глобальные настройки администратора (раздел «Дизайн»).
Push-подписки: автоматическая дедупликация устройств — при переподписке с того же устройства старая подписка заменяется.
Push-подписки: автоочистка неактивных подписок старше 30 дней.
Администратор: кнопки «Очистить неактивные» и «Очистить всё» для управления списком push-устройств.
Technical:
Preloader: параметры `preloader_mode`, `preloader_compact`, `preloader_show_text` перенесены в таблицу `settings`.
Per-user параметры `ui_preloader_mode`, `ui_preloader_compact`, `ui_preloader_show_text` больше не используются (колонки сохранены для совместимости).
`user_update_ui_prefs()` — убраны параметры preloader из сигнатуры.
`auth_login()` и `auth_session_apply_active_profile()` — убраны preloader-поля из сессии.
`layout.php` — preloader JS-конфиг читается из `setting_get()` вместо user data.
`push_subscription_save()` — дедупликация по `user_id + device_label`: при регистрации новой подписки удаляются старые с того же устройства.
`push_subscription_device_fingerprint()` — нормализация user-agent для стабильного fingerprint.
`push_subscriptions_cleanup_stale()` — автоочистка неактивных подписок старше N дней.
`push_subscriptions_delete_inactive()` и `push_subscriptions_delete_all()` — функции массовой очистки.
Route `push_subscription_cleanup` — обработчик кнопок очистки в админке.
v5.8.5
2026-03-01
What is new:
Дашборд: статистика фильтруется по домену — администратор домена видит метрики только своего домена, а не всего сервиса.
Политики: доменные политики (мосты, корневой админ, домен по умолчанию) перенесены из Настроек на страницу «Политики» для единообразного управления.
Домены: администратор домена теперь видит и может управлять (переименование, перегенерация кода) своими доменами; список доменов фильтруется по доступу.
Новая политика «Домен по умолчанию»: пользователи, зарегистрировавшиеся без кода домена, автоматически попадают в выбранный домен.
Управление новостями: три вкладки (Новости / Системные / Тех. релизы) — можно удалять и восстанавливать встроенные системные записи и тех. релизы.
Technical:
Новая функция `dashboard_stats_for_domains(array $domainIds)` в `app/health.php` — статистика, ограниченная набором доменов.
`views/dashboard.php` использует `admin_visible_domain_ids()` для выбора `dashboard_stats()` или `dashboard_stats_for_domains()`.
Доменные политики (`bridge_admin_policy`, `root_domain_admin_full_access`, `default_new_user_domain_id`) перенесены в `views/admin_policies.php` (POST + UI).
Удалён блок доменных политик из `views/admin_settings.php` и POST-обработчик из index.php → settings.
`user_default_domain_id_for_role()` теперь учитывает настройку `default_new_user_domain_id` при самостоятельной регистрации.
`views/admin_domains.php` фильтрует домены и мосты по `admin_visible_domain_ids()`; POST-обработчики `rename_domain` / `regen_domain_code` разрешены доменным админам.
Системные новости и тех. релизы перенесены из захардкоженных массивов PHP в таблицу `news` (DB): колонки `type`, `published_date`, `metadata_json`; удаление через `deleted_at` (soft-delete).
Новые функции: `news_list_system()`, `news_list_system_all()`, `app_changelog()`, `app_changelog_all()` — чтение из БД с fallback на `_news_builtin_system_entries()` / `_changelog_builtin_entries()`.
Сидер `_news_seed_builtin_entries()` заполняет таблицу `news` из захардкоженных массивов при первом запуске (флаг `_news_builtin_seeded`).
Маршруты `news_delete_system`, `news_restore_system`, `news_delete_changelog`, `news_restore_changelog` работают по ID записи в БД, а не по строке версии.
v5.8.6
2026-03-01
What is new:
Мессенджер: полная переработка интерфейса в стиле Telegram — боковой список диалогов, панель переписки, адаптивная мобильная раскладка.
Мессенджер: голосовые сообщения, эмодзи-пикер, вложения файлов из облака и устройства.
Мессенджер: WebRTC-звонки с корректным сигнальным API и индикатором качества связи.
Профиль: полная переработка в стиле Instagram/VK — обложка, центрированный инфо-блок, панель статистики.
Поддержка MySQL и SQLite: `ALTER TABLE RENAME`, `RENAME COLUMN` / `CHANGE COLUMN` в зависимости от драйвера.
`app/users.php`: все функции `group_*`/`groups_*` переименованы в `domain_*`/`domains_*` (16 функций); SQL-запросы обновлены на новые имена таблиц/колонок.
`app/auth.php`: сессионные поля `group_id`→`domain_id`, `group_role`→`domain_role`; SQL SELECT обновлён.
`app/chat.php`: SQL-запросы и сообщение об ошибке обновлены.
`app/policies.php`: ключ возможности `'groups'`→`'domains'` (5 ролей).
`index.php`: маршрут `admin_groups`→`admin_domains`; POST-обработчики `create_group`→`create_domain`, `rename_group`→`rename_domain`, `delete_group`→`delete_domain`, `set_group`→`set_domain`; аудит-логи обновлены.
`views/admin_groups.php` удалён, создан `views/admin_domains.php` с полным рефакторингом UI-текстов и переменных.
`views/admin_users.php`, `views/layout.php`, `views/staff.php`, `views/admin_policies.php` — обновлены ссылки, сессионные поля и UI-тексты.
`app/migrations.php`: код первичного создания таблиц использует новые имена; добавлена инкрементальная миграция для существующих БД с проверками `table_exists`/`column_exists`.
v5.1.0
2026-03-01
What is new:
Маршрут `dashboard` (файловый проводник) переименован в `skybox` — SkyBox, личное облачное хранилище.
Маршрут `staff` (панель администратора) переименован в `dashboard` — Дашборд.
Маршрут `admin` (хранилище проекта) переименован в `filehub` — FileHub.
Обратная совместимость: старые адреса `?r=staff` и `?r=admin` автоматически редиректят на новые.
`user_update_profile()` и `user_update_profile_full()` — сигнатуры изменены: вместо `$display_name` принимают `$first_name`, `$last_name`.
`user_display_name()` и `user_profile_title_display()` приоритизируют `first_name + last_name`.
`user_profile_set_title()` принимает `$first_name`, `$last_name` вместо `$title`.
`auth_session_apply_active_profile()` и `auth_login()` — в сессию добавлены `first_name`, `last_name`.
Все SQL-запросы SELECT для пользователей дополнены `first_name`, `last_name`.
Поиск пользователей (директория, админка) расширен на `first_name`, `last_name`.
v5.4.0
2026-03-01
What is new:
Настройка Preloader перенесена из личных настроек пользователя в глобальные настройки администратора (раздел «Дизайн»).
Push-подписки: автоматическая дедупликация устройств — при переподписке с того же устройства старая подписка заменяется.
Push-подписки: автоочистка неактивных подписок старше 30 дней.
Администратор: кнопки «Очистить неактивные» и «Очистить всё» для управления списком push-устройств.
Technical:
Preloader: параметры `preloader_mode`, `preloader_compact`, `preloader_show_text` перенесены в таблицу `settings`.
Per-user параметры `ui_preloader_mode`, `ui_preloader_compact`, `ui_preloader_show_text` больше не используются (колонки сохранены для совместимости).
`user_update_ui_prefs()` — убраны параметры preloader из сигнатуры.
`auth_login()` и `auth_session_apply_active_profile()` — убраны preloader-поля из сессии.
`layout.php` — preloader JS-конфиг читается из `setting_get()` вместо user data.
`push_subscription_save()` — дедупликация по `user_id + device_label`: при регистрации новой подписки удаляются старые с того же устройства.
`push_subscription_device_fingerprint()` — нормализация user-agent для стабильного fingerprint.
`push_subscriptions_cleanup_stale()` — автоочистка неактивных подписок старше N дней.
`push_subscriptions_delete_inactive()` и `push_subscriptions_delete_all()` — функции массовой очистки.
Route `push_subscription_cleanup` — обработчик кнопок очистки в админке.
v5.8.5
2026-03-01
What is new:
Дашборд: статистика фильтруется по домену — администратор домена видит метрики только своего домена, а не всего сервиса.
Политики: доменные политики (мосты, корневой админ, домен по умолчанию) перенесены из Настроек на страницу «Политики» для единообразного управления.
Домены: администратор домена теперь видит и может управлять (переименование, перегенерация кода) своими доменами; список доменов фильтруется по доступу.
Новая политика «Домен по умолчанию»: пользователи, зарегистрировавшиеся без кода домена, автоматически попадают в выбранный домен.
Управление новостями: три вкладки (Новости / Системные / Тех. релизы) — можно удалять и восстанавливать встроенные системные записи и тех. релизы.
Technical:
Новая функция `dashboard_stats_for_domains(array $domainIds)` в `app/health.php` — статистика, ограниченная набором доменов.
`views/dashboard.php` использует `admin_visible_domain_ids()` для выбора `dashboard_stats()` или `dashboard_stats_for_domains()`.
Доменные политики (`bridge_admin_policy`, `root_domain_admin_full_access`, `default_new_user_domain_id`) перенесены в `views/admin_policies.php` (POST + UI).
Удалён блок доменных политик из `views/admin_settings.php` и POST-обработчик из index.php → settings.
`user_default_domain_id_for_role()` теперь учитывает настройку `default_new_user_domain_id` при самостоятельной регистрации.
`views/admin_domains.php` фильтрует домены и мосты по `admin_visible_domain_ids()`; POST-обработчики `rename_domain` / `regen_domain_code` разрешены доменным админам.
Системные новости и тех. релизы перенесены из захардкоженных массивов PHP в таблицу `news` (DB): колонки `type`, `published_date`, `metadata_json`; удаление через `deleted_at` (soft-delete).
Новые функции: `news_list_system()`, `news_list_system_all()`, `app_changelog()`, `app_changelog_all()` — чтение из БД с fallback на `_news_builtin_system_entries()` / `_changelog_builtin_entries()`.
Сидер `_news_seed_builtin_entries()` заполняет таблицу `news` из захардкоженных массивов при первом запуске (флаг `_news_builtin_seeded`).
Маршруты `news_delete_system`, `news_restore_system`, `news_delete_changelog`, `news_restore_changelog` работают по ID записи в БД, а не по строке версии.
v5.8.6
2026-03-01
What is new:
Мессенджер: полная переработка интерфейса в стиле Telegram — боковой список диалогов, панель переписки, адаптивная мобильная раскладка.
Мессенджер: голосовые сообщения, эмодзи-пикер, вложения файлов из облака и устройства.
Мессенджер: WebRTC-звонки с корректным сигнальным API и индикатором качества связи.
Профиль: полная переработка в стиле Instagram/VK — обложка, центрированный инфо-блок, панель статистики.
Поддержка MySQL и SQLite: `ALTER TABLE RENAME`, `RENAME COLUMN` / `CHANGE COLUMN` в зависимости от драйвера.
`app/users.php`: все функции `group_*`/`groups_*` переименованы в `domain_*`/`domains_*` (16 функций); SQL-запросы обновлены на новые имена таблиц/колонок.
`app/auth.php`: сессионные поля `group_id`→`domain_id`, `group_role`→`domain_role`; SQL SELECT обновлён.
`app/chat.php`: SQL-запросы и сообщение об ошибке обновлены.
`app/policies.php`: ключ возможности `'groups'`→`'domains'` (5 ролей).
`index.php`: маршрут `admin_groups`→`admin_domains`; POST-обработчики `create_group`→`create_domain`, `rename_group`→`rename_domain`, `delete_group`→`delete_domain`, `set_group`→`set_domain`; аудит-логи обновлены.
`views/admin_groups.php` удалён, создан `views/admin_domains.php` с полным рефакторингом UI-текстов и переменных.
`views/admin_users.php`, `views/layout.php`, `views/staff.php`, `views/admin_policies.php` — обновлены ссылки, сессионные поля и UI-тексты.
`app/migrations.php`: код первичного создания таблиц использует новые имена; добавлена инкрементальная миграция для существующих БД с проверками `table_exists`/`column_exists`.
v5.1.0
2026-03-01
What is new:
Маршрут `dashboard` (файловый проводник) переименован в `skybox` — SkyBox, личное облачное хранилище.
Маршрут `staff` (панель администратора) переименован в `dashboard` — Дашборд.
Маршрут `admin` (хранилище проекта) переименован в `filehub` — FileHub.
Обратная совместимость: старые адреса `?r=staff` и `?r=admin` автоматически редиректят на новые.
`user_update_profile()` и `user_update_profile_full()` — сигнатуры изменены: вместо `$display_name` принимают `$first_name`, `$last_name`.
`user_display_name()` и `user_profile_title_display()` приоритизируют `first_name + last_name`.
`user_profile_set_title()` принимает `$first_name`, `$last_name` вместо `$title`.
`auth_session_apply_active_profile()` и `auth_login()` — в сессию добавлены `first_name`, `last_name`.
Все SQL-запросы SELECT для пользователей дополнены `first_name`, `last_name`.
Поиск пользователей (директория, админка) расширен на `first_name`, `last_name`.
v5.4.0
2026-03-01
What is new:
Настройка Preloader перенесена из личных настроек пользователя в глобальные настройки администратора (раздел «Дизайн»).
Push-подписки: автоматическая дедупликация устройств — при переподписке с того же устройства старая подписка заменяется.
Push-подписки: автоочистка неактивных подписок старше 30 дней.
Администратор: кнопки «Очистить неактивные» и «Очистить всё» для управления списком push-устройств.
Technical:
Preloader: параметры `preloader_mode`, `preloader_compact`, `preloader_show_text` перенесены в таблицу `settings`.
Per-user параметры `ui_preloader_mode`, `ui_preloader_compact`, `ui_preloader_show_text` больше не используются (колонки сохранены для совместимости).
`user_update_ui_prefs()` — убраны параметры preloader из сигнатуры.
`auth_login()` и `auth_session_apply_active_profile()` — убраны preloader-поля из сессии.
`layout.php` — preloader JS-конфиг читается из `setting_get()` вместо user data.
`push_subscription_save()` — дедупликация по `user_id + device_label`: при регистрации новой подписки удаляются старые с того же устройства.
`push_subscription_device_fingerprint()` — нормализация user-agent для стабильного fingerprint.
`push_subscriptions_cleanup_stale()` — автоочистка неактивных подписок старше N дней.
`push_subscriptions_delete_inactive()` и `push_subscriptions_delete_all()` — функции массовой очистки.
Route `push_subscription_cleanup` — обработчик кнопок очистки в админке.
v5.8.5
2026-03-01
What is new:
Дашборд: статистика фильтруется по домену — администратор домена видит метрики только своего домена, а не всего сервиса.
Политики: доменные политики (мосты, корневой админ, домен по умолчанию) перенесены из Настроек на страницу «Политики» для единообразного управления.
Домены: администратор домена теперь видит и может управлять (переименование, перегенерация кода) своими доменами; список доменов фильтруется по доступу.
Новая политика «Домен по умолчанию»: пользователи, зарегистрировавшиеся без кода домена, автоматически попадают в выбранный домен.
Управление новостями: три вкладки (Новости / Системные / Тех. релизы) — можно удалять и восстанавливать встроенные системные записи и тех. релизы.
Technical:
Новая функция `dashboard_stats_for_domains(array $domainIds)` в `app/health.php` — статистика, ограниченная набором доменов.
`views/dashboard.php` использует `admin_visible_domain_ids()` для выбора `dashboard_stats()` или `dashboard_stats_for_domains()`.
Доменные политики (`bridge_admin_policy`, `root_domain_admin_full_access`, `default_new_user_domain_id`) перенесены в `views/admin_policies.php` (POST + UI).
Удалён блок доменных политик из `views/admin_settings.php` и POST-обработчик из index.php → settings.
`user_default_domain_id_for_role()` теперь учитывает настройку `default_new_user_domain_id` при самостоятельной регистрации.
`views/admin_domains.php` фильтрует домены и мосты по `admin_visible_domain_ids()`; POST-обработчики `rename_domain` / `regen_domain_code` разрешены доменным админам.
Системные новости и тех. релизы перенесены из захардкоженных массивов PHP в таблицу `news` (DB): колонки `type`, `published_date`, `metadata_json`; удаление через `deleted_at` (soft-delete).
Новые функции: `news_list_system()`, `news_list_system_all()`, `app_changelog()`, `app_changelog_all()` — чтение из БД с fallback на `_news_builtin_system_entries()` / `_changelog_builtin_entries()`.
Сидер `_news_seed_builtin_entries()` заполняет таблицу `news` из захардкоженных массивов при первом запуске (флаг `_news_builtin_seeded`).
Маршруты `news_delete_system`, `news_restore_system`, `news_delete_changelog`, `news_restore_changelog` работают по ID записи в БД, а не по строке версии.
v5.8.6
2026-03-01
What is new:
Мессенджер: полная переработка интерфейса в стиле Telegram — боковой список диалогов, панель переписки, адаптивная мобильная раскладка.
Мессенджер: голосовые сообщения, эмодзи-пикер, вложения файлов из облака и устройства.
Мессенджер: WebRTC-звонки с корректным сигнальным API и индикатором качества связи.
Профиль: полная переработка в стиле Instagram/VK — обложка, центрированный инфо-блок, панель статистики.
Мессенджер: заголовок скрыт на мобильных — диалоги занимают весь экран.
Мессенджер: кнопка действий (⋯) теперь внутри облачка сообщения, а не за его пределами.
Technical:
chat.php: .chat-page-head display:none!important на @media ≤991.98px (скрыт всегда на мобильных).
chat.php: .msg-actions-btn перенесён внутрь bubble (top:.25rem right:.25rem вместо left/right:-.8rem).
v5.8.13
2026-03-01
What is new:
Мессенджер: панель ввода теперь всегда видна на экране, страница не прокручивается.
Technical:
layout.php: html/body/app-shell получают height:100dvh + overflow:hidden через :has(.content-canvas-mode).
layout.php: sidebar ограничен 100dvh с overflow-y:auto в canvas-режиме.
v4.1.0
2026-02-28
What is new:
Управление группами и мостами вынесено в отдельную страницу `Дашборд → Группы и мосты` с полным управлением: создание, переименование, удаление групп и мостов, просмотр участников.
Страница `Пользователи` очищена от группового управления, оставлены только аккаунты и создание; добавлена ссылка на новую страницу групп.
Дизайн всего проекта унифицирован: в профиле, мессенджере, контактах, страницах, уведомлениях и др. заменены хардкодные border-radius на глобальные CSS-переменные (`--bs-border-radius`, `--bs-border-radius-sm`, `--bs-border-radius-lg`).
Technical:
Добавлены backend-функции `group_rename()`, `group_delete()`, `group_bridge_delete()` в `app/users.php` для полного CRUD-управления группами и мостами.
Новый route `admin_groups` в `index.php` с POST-обработчиками: `create_group`, `rename_group`, `delete_group`, `set_bridge`, `delete_bridge`.
Новый view `views/admin_groups.php` с карточками групп (коллапс с настройками), списком мостов, статистикой и формами создания.
В layout.php и staff.php добавлена навигация на `admin_groups`. POST-обработчики `create_group`/`set_bridge` перенесены из роута `admin_users`.
Унифицированы border-radius во всех views (profile, chat, contacts, profile_edit, my_pages, notifications, admin_users) через CSS-переменные `--bs-border-radius*`, наследующие `--t-radius` из настроек.
v4.4.0
2026-02-28
What is new:
Администрирование новостей вынесено из дашборда сотрудников на отдельную страницу с полным CRUD (создание, чтение, редактирование, удаление).
Файловый проводник «Мои файлы» полностью переписан: карточный/списочный вид, drag-n-drop файлов в папки, зона загрузки, контекстное меню, иконки по типу файла, переключатель grid/list.
Профиль пользователя переработан в стиле социальных сетей: полноширинная обложка, горизонтальный блок с аватаром/именем/кнопками, липкая панель вкладок, боковая панель (инфо + сетка друзей), расширенная страница друзей.
Technical:
В `app/news.php` добавлены `news_get()` и `news_update()` для CRUD новостей.
В `index.php` добавлен маршрут `news_update` (POST, csrf, audit_log).
`views/admin_news.php` полностью переписан: page_top, хлебные крошки, режим редактирования через `?edit=ID`, форма создания/редактирования + список с кнопками.
`views/dashboard.php` полностью переписан: новый CSS (cloud-shell, cloud-file-grid/list, upload-zone, folder-tree), grid/list toggle с localStorage, drag-drop на папки через fetch, bulk-панель, контекстное меню файлов и папок.
`views/profile.php` переписан: новый CSS (~490→~410 строк), layout изменён на full-width cover banner + info-bar + sticky tabs + row (sidebar + main), друзья в sidebar (сетка 3×3 превью) + полная карточная сетка во вкладке, stat-клик переключает табы.
v4.5.0
2026-02-28
What is new:
Мессенджер переработан в стиле Telegram: кнопка «корзина» при записи голосового теперь слева, заголовок чата стал overlay поверх сообщений (больше полезной площади), упрощённый хедер (только «Назад» + имя/аватар).
Нажатие на имя/аватар в чате открывает карточку пользователя (Telegram-style slide-in панель) с действиями: звонок, ссылка, профиль, очистить чат.
Technical:
`views/chat.php` — voiceCancelBtn перемещён перед attachBtn в HTML (trash слева при записи).
`views/chat.php` — добавлена `.chat-user-info-panel` (slide-in справа) с аватаром, именем, кнопками действий; JS open/close по клику на аватар/имя + Escape + backdrop.
Кнопки callStartBtn, callLinkBtn, chatClearBtn перенесены из хедера в user-info-panel.
v4.6.0
2026-02-28
What is new:
Создана единая дизайн-система проекта (14 переиспользуемых компонентов): карточки, hover-эффекты, стеклянные панели, навигация, статусные индикаторы, зоны загрузки и др.
Unification поверхностных переменных (light/dark × soft/balanced/strong) — 6 тем теперь задаются в одном месте вместо дублирования в каждом view.
Мессенджер: кнопки смайлика и микрофона теперь одинаковой высоты (40×40px), emoji-кнопка вынесена в общий flex-ряд.
Администрирование пользователей и групп: число и подпись в стат-карточках больше не «слипаются» в одну строку.
Профиль: sidebar-карточки, hover на постах/друзьях/страницах, pills — всё унифицировано через дизайн-систему.
Файловый проводник: папки-навигация, карточки файлов, зона загрузки, точки публичности — унифицированы.
Календарь: ячейки и точки-индикаторы используют общие компоненты.
Настройки: save-bar и метки групп переведены на общие стеклянные панели.
Редактирование профиля: страница переверстана на CSS Grid — блоки «Смена пароля» и «Уведомления» теперь в боковой колонке справа (1fr + 380px).
Политики: галочки для admin и admin_tester разблокированы при редактировании global_admin.
Управление пользователями: пароли отображаются только global_admin (с размытием и кнопкой показа); настройка видимости паролей для других администраторов с учётом иерархии ролей.
Управление пользователями: убран дублирующийся select «Роль в домене» — роль в домене автоматически определяется из системной роли.
Регистрация: добавлено необязательное поле «Код домена» для привязки к домену при регистрации.
Домены: каждому домену присваивается 3-символьный буквенно-цифровой код (A-Z, 0-9); кнопка перегенерации кода в настройках домена.
Technical:
Новые функции: `user_role_rank()`, `user_can_see_password()`, `user_get_password_hint()`, `domain_get_by_code()`, `domain_generate_short_code()`, `domain_regen_code()`.
`domain_create()` генерирует уникальный 3-char код вместо slug-транслитерации.
`user_create()` / `user_set_password()` сохраняют `admin_password_hint` для административного просмотра.
Настройка `admin_show_passwords` (toggle) для управления видимостью паролей по ролям.
Действие `regen_domain_code` в маршруте admin_domains с аудит-логом.
Действие `toggle_show_passwords` в маршруте admin_users с аудит-логом.
v5.7.0
2026-02-28
What is new:
Дашборд: полностью переработанная панель с KPI-виджетами — пользователи, сообщения, файлы, контент, звонки, аудит.
Дашборд: лента последних действий (10 записей) с иконками по типу операции и карточка «Новые пользователи».
Дашборд: карточки здоровья системы с progress-bar диска и цветовыми индикаторами.
Дашборд: настраиваемая видимость 11 виджетов через панель «Настройки» (collapsible).
Дашборд: авто-обновление страницы (15с / 30с / 1м / 2м / 5м) и компактный режим карточек.
Дашборд: навигационные карточки модерации и администрирования с RBAC-проверкой и цветными иконками.
Technical:
Новая функция `dashboard_stats()` в `app/health.php` — агрегированная статистика из 15+ таблиц за один вызов.
Настройки дашборда: `dashboard_widgets_json`, `dashboard_refresh_interval`, `dashboard_show_activity`, `dashboard_compact` в `settings_defaults()`.
POST-обработчик `save_dashboard_settings` в маршруте `dashboard` с аудит-логом.
CSS-классы `.db-stat-value`, `.db-icon-circle`, `.db-activity-item`, `.db-nav-card`, `.db-compact` для стилизации виджетов.
v5.8.0
2026-02-28
What is new:
Настройки: иконки Bootstrap Icons у каждого пункта сайдбара (палитра, щит, шестерёнка, телефон, БД и др.) во цветных плашках.
Настройки: быстрый поиск по всем разделам — поле с debounce-фильтрацией, счётчик совпадений, горячая клавиша Ctrl+K.
База данных: новая опция «Подключиться без миграции» — позволяет переключить конфиг на существующую БД с данными без переноса и без удаления данных.
Предотвращает потерю данных при повторном подключении к MySQL после обновления сайта (когда конфиг сбрасывается на SQLite).
Technical:
Параметр `skip_migration` в admin_db POST-обработчике: проверяет подключение, запускает `ensure_schema()` (CREATE IF NOT EXISTS + инкрементальные миграции) и `ensure_mysql_utf8mb4()`, но НЕ вызывает `migrate_database()` / `db_truncate()`.
Разрешена отправка формы при `target === current` в режиме reconnect (для переподключения к той же БД).
UI: интерактивный чекбокс с подсказками, кнопка меняет текст/стиль в зависимости от режима.
v5.8.4
2026-02-28
What is new:
Доменная изоляция: администратор домена теперь видит в разделе «Пользователи» только пользователей своего домена, а не всех.
Новая политика «Мосты для доменных администраторов» (Настройки → Доступ): не видеть / только просмотр / полный доступ к пользователям мостовых доменов.
Новая политика «Админы корневого домена — полный доступ»: администраторы глобального домена по умолчанию видят и управляют всеми пользователями.
Пользователи из мостовых доменов помечены бейджем «мост» с указанием уровня доступа.
Technical:
`users_accounts_with_profiles()` принимает `?array $filterDomainIds` — SQL фильтрует `domain_id IN (…)`.
Новые хелперы: `is_root_domain_admin()`, `admin_bridged_domain_ids()`, `admin_visible_domain_ids()`, `admin_can_manage_user()`, `admin_can_view_user()`.
POST-обработчики admin_users защищены domain-guard: non-global admin не может управлять пользователями чужого домена.
Настройки `bridge_admin_policy` (none|view|full) и `root_domain_admin_full_access` (0|1) в `settings_defaults` и admin_settings UI.
Создание пользователя: не-global/не-root-domain админы принудительно создают пользователей в своём домене.
v4.1.0
2026-02-28
What is new:
Управление группами и мостами вынесено в отдельную страницу `Дашборд → Группы и мосты` с полным управлением: создание, переименование, удаление групп и мостов, просмотр участников.
Страница `Пользователи` очищена от группового управления, оставлены только аккаунты и создание; добавлена ссылка на новую страницу групп.
Дизайн всего проекта унифицирован: в профиле, мессенджере, контактах, страницах, уведомлениях и др. заменены хардкодные border-radius на глобальные CSS-переменные (`--bs-border-radius`, `--bs-border-radius-sm`, `--bs-border-radius-lg`).
Technical:
Добавлены backend-функции `group_rename()`, `group_delete()`, `group_bridge_delete()` в `app/users.php` для полного CRUD-управления группами и мостами.
Новый route `admin_groups` в `index.php` с POST-обработчиками: `create_group`, `rename_group`, `delete_group`, `set_bridge`, `delete_bridge`.
Новый view `views/admin_groups.php` с карточками групп (коллапс с настройками), списком мостов, статистикой и формами создания.
В layout.php и staff.php добавлена навигация на `admin_groups`. POST-обработчики `create_group`/`set_bridge` перенесены из роута `admin_users`.
Унифицированы border-radius во всех views (profile, chat, contacts, profile_edit, my_pages, notifications, admin_users) через CSS-переменные `--bs-border-radius*`, наследующие `--t-radius` из настроек.
v4.4.0
2026-02-28
What is new:
Администрирование новостей вынесено из дашборда сотрудников на отдельную страницу с полным CRUD (создание, чтение, редактирование, удаление).
Файловый проводник «Мои файлы» полностью переписан: карточный/списочный вид, drag-n-drop файлов в папки, зона загрузки, контекстное меню, иконки по типу файла, переключатель grid/list.
Профиль пользователя переработан в стиле социальных сетей: полноширинная обложка, горизонтальный блок с аватаром/именем/кнопками, липкая панель вкладок, боковая панель (инфо + сетка друзей), расширенная страница друзей.
Technical:
В `app/news.php` добавлены `news_get()` и `news_update()` для CRUD новостей.
В `index.php` добавлен маршрут `news_update` (POST, csrf, audit_log).
`views/admin_news.php` полностью переписан: page_top, хлебные крошки, режим редактирования через `?edit=ID`, форма создания/редактирования + список с кнопками.
`views/dashboard.php` полностью переписан: новый CSS (cloud-shell, cloud-file-grid/list, upload-zone, folder-tree), grid/list toggle с localStorage, drag-drop на папки через fetch, bulk-панель, контекстное меню файлов и папок.
`views/profile.php` переписан: новый CSS (~490→~410 строк), layout изменён на full-width cover banner + info-bar + sticky tabs + row (sidebar + main), друзья в sidebar (сетка 3×3 превью) + полная карточная сетка во вкладке, stat-клик переключает табы.
v4.5.0
2026-02-28
What is new:
Мессенджер переработан в стиле Telegram: кнопка «корзина» при записи голосового теперь слева, заголовок чата стал overlay поверх сообщений (больше полезной площади), упрощённый хедер (только «Назад» + имя/аватар).
Нажатие на имя/аватар в чате открывает карточку пользователя (Telegram-style slide-in панель) с действиями: звонок, ссылка, профиль, очистить чат.
Technical:
`views/chat.php` — voiceCancelBtn перемещён перед attachBtn в HTML (trash слева при записи).
`views/chat.php` — добавлена `.chat-user-info-panel` (slide-in справа) с аватаром, именем, кнопками действий; JS open/close по клику на аватар/имя + Escape + backdrop.
Кнопки callStartBtn, callLinkBtn, chatClearBtn перенесены из хедера в user-info-panel.
v4.6.0
2026-02-28
What is new:
Создана единая дизайн-система проекта (14 переиспользуемых компонентов): карточки, hover-эффекты, стеклянные панели, навигация, статусные индикаторы, зоны загрузки и др.
Unification поверхностных переменных (light/dark × soft/balanced/strong) — 6 тем теперь задаются в одном месте вместо дублирования в каждом view.
Мессенджер: кнопки смайлика и микрофона теперь одинаковой высоты (40×40px), emoji-кнопка вынесена в общий flex-ряд.
Администрирование пользователей и групп: число и подпись в стат-карточках больше не «слипаются» в одну строку.
Профиль: sidebar-карточки, hover на постах/друзьях/страницах, pills — всё унифицировано через дизайн-систему.
Файловый проводник: папки-навигация, карточки файлов, зона загрузки, точки публичности — унифицированы.
Календарь: ячейки и точки-индикаторы используют общие компоненты.
Настройки: save-bar и метки групп переведены на общие стеклянные панели.
Редактирование профиля: страница переверстана на CSS Grid — блоки «Смена пароля» и «Уведомления» теперь в боковой колонке справа (1fr + 380px).
Политики: галочки для admin и admin_tester разблокированы при редактировании global_admin.
Управление пользователями: пароли отображаются только global_admin (с размытием и кнопкой показа); настройка видимости паролей для других администраторов с учётом иерархии ролей.
Управление пользователями: убран дублирующийся select «Роль в домене» — роль в домене автоматически определяется из системной роли.
Регистрация: добавлено необязательное поле «Код домена» для привязки к домену при регистрации.
Домены: каждому домену присваивается 3-символьный буквенно-цифровой код (A-Z, 0-9); кнопка перегенерации кода в настройках домена.
Technical:
Новые функции: `user_role_rank()`, `user_can_see_password()`, `user_get_password_hint()`, `domain_get_by_code()`, `domain_generate_short_code()`, `domain_regen_code()`.
`domain_create()` генерирует уникальный 3-char код вместо slug-транслитерации.
`user_create()` / `user_set_password()` сохраняют `admin_password_hint` для административного просмотра.
Настройка `admin_show_passwords` (toggle) для управления видимостью паролей по ролям.
Действие `regen_domain_code` в маршруте admin_domains с аудит-логом.
Действие `toggle_show_passwords` в маршруте admin_users с аудит-логом.
v5.7.0
2026-02-28
What is new:
Дашборд: полностью переработанная панель с KPI-виджетами — пользователи, сообщения, файлы, контент, звонки, аудит.
Дашборд: лента последних действий (10 записей) с иконками по типу операции и карточка «Новые пользователи».
Дашборд: карточки здоровья системы с progress-bar диска и цветовыми индикаторами.
Дашборд: настраиваемая видимость 11 виджетов через панель «Настройки» (collapsible).
Дашборд: авто-обновление страницы (15с / 30с / 1м / 2м / 5м) и компактный режим карточек.
Дашборд: навигационные карточки модерации и администрирования с RBAC-проверкой и цветными иконками.
Technical:
Новая функция `dashboard_stats()` в `app/health.php` — агрегированная статистика из 15+ таблиц за один вызов.
Настройки дашборда: `dashboard_widgets_json`, `dashboard_refresh_interval`, `dashboard_show_activity`, `dashboard_compact` в `settings_defaults()`.
POST-обработчик `save_dashboard_settings` в маршруте `dashboard` с аудит-логом.
CSS-классы `.db-stat-value`, `.db-icon-circle`, `.db-activity-item`, `.db-nav-card`, `.db-compact` для стилизации виджетов.
v5.8.0
2026-02-28
What is new:
Настройки: иконки Bootstrap Icons у каждого пункта сайдбара (палитра, щит, шестерёнка, телефон, БД и др.) во цветных плашках.
Настройки: быстрый поиск по всем разделам — поле с debounce-фильтрацией, счётчик совпадений, горячая клавиша Ctrl+K.
База данных: новая опция «Подключиться без миграции» — позволяет переключить конфиг на существующую БД с данными без переноса и без удаления данных.
Предотвращает потерю данных при повторном подключении к MySQL после обновления сайта (когда конфиг сбрасывается на SQLite).
Technical:
Параметр `skip_migration` в admin_db POST-обработчике: проверяет подключение, запускает `ensure_schema()` (CREATE IF NOT EXISTS + инкрементальные миграции) и `ensure_mysql_utf8mb4()`, но НЕ вызывает `migrate_database()` / `db_truncate()`.
Разрешена отправка формы при `target === current` в режиме reconnect (для переподключения к той же БД).
UI: интерактивный чекбокс с подсказками, кнопка меняет текст/стиль в зависимости от режима.
v5.8.4
2026-02-28
What is new:
Доменная изоляция: администратор домена теперь видит в разделе «Пользователи» только пользователей своего домена, а не всех.
Новая политика «Мосты для доменных администраторов» (Настройки → Доступ): не видеть / только просмотр / полный доступ к пользователям мостовых доменов.
Новая политика «Админы корневого домена — полный доступ»: администраторы глобального домена по умолчанию видят и управляют всеми пользователями.
Пользователи из мостовых доменов помечены бейджем «мост» с указанием уровня доступа.
Technical:
`users_accounts_with_profiles()` принимает `?array $filterDomainIds` — SQL фильтрует `domain_id IN (…)`.
Новые хелперы: `is_root_domain_admin()`, `admin_bridged_domain_ids()`, `admin_visible_domain_ids()`, `admin_can_manage_user()`, `admin_can_view_user()`.
POST-обработчики admin_users защищены domain-guard: non-global admin не может управлять пользователями чужого домена.
Настройки `bridge_admin_policy` (none|view|full) и `root_domain_admin_full_access` (0|1) в `settings_defaults` и admin_settings UI.
Создание пользователя: не-global/не-root-domain админы принудительно создают пользователей в своём домене.
v4.1.0
2026-02-28
What is new:
Управление группами и мостами вынесено в отдельную страницу `Дашборд → Группы и мосты` с полным управлением: создание, переименование, удаление групп и мостов, просмотр участников.
Страница `Пользователи` очищена от группового управления, оставлены только аккаунты и создание; добавлена ссылка на новую страницу групп.
Дизайн всего проекта унифицирован: в профиле, мессенджере, контактах, страницах, уведомлениях и др. заменены хардкодные border-radius на глобальные CSS-переменные (`--bs-border-radius`, `--bs-border-radius-sm`, `--bs-border-radius-lg`).
Technical:
Добавлены backend-функции `group_rename()`, `group_delete()`, `group_bridge_delete()` в `app/users.php` для полного CRUD-управления группами и мостами.
Новый route `admin_groups` в `index.php` с POST-обработчиками: `create_group`, `rename_group`, `delete_group`, `set_bridge`, `delete_bridge`.
Новый view `views/admin_groups.php` с карточками групп (коллапс с настройками), списком мостов, статистикой и формами создания.
В layout.php и staff.php добавлена навигация на `admin_groups`. POST-обработчики `create_group`/`set_bridge` перенесены из роута `admin_users`.
Унифицированы border-radius во всех views (profile, chat, contacts, profile_edit, my_pages, notifications, admin_users) через CSS-переменные `--bs-border-radius*`, наследующие `--t-radius` из настроек.
v4.4.0
2026-02-28
What is new:
Администрирование новостей вынесено из дашборда сотрудников на отдельную страницу с полным CRUD (создание, чтение, редактирование, удаление).
Файловый проводник «Мои файлы» полностью переписан: карточный/списочный вид, drag-n-drop файлов в папки, зона загрузки, контекстное меню, иконки по типу файла, переключатель grid/list.
Профиль пользователя переработан в стиле социальных сетей: полноширинная обложка, горизонтальный блок с аватаром/именем/кнопками, липкая панель вкладок, боковая панель (инфо + сетка друзей), расширенная страница друзей.
Technical:
В `app/news.php` добавлены `news_get()` и `news_update()` для CRUD новостей.
В `index.php` добавлен маршрут `news_update` (POST, csrf, audit_log).
`views/admin_news.php` полностью переписан: page_top, хлебные крошки, режим редактирования через `?edit=ID`, форма создания/редактирования + список с кнопками.
`views/dashboard.php` полностью переписан: новый CSS (cloud-shell, cloud-file-grid/list, upload-zone, folder-tree), grid/list toggle с localStorage, drag-drop на папки через fetch, bulk-панель, контекстное меню файлов и папок.
`views/profile.php` переписан: новый CSS (~490→~410 строк), layout изменён на full-width cover banner + info-bar + sticky tabs + row (sidebar + main), друзья в sidebar (сетка 3×3 превью) + полная карточная сетка во вкладке, stat-клик переключает табы.
v4.5.0
2026-02-28
What is new:
Мессенджер переработан в стиле Telegram: кнопка «корзина» при записи голосового теперь слева, заголовок чата стал overlay поверх сообщений (больше полезной площади), упрощённый хедер (только «Назад» + имя/аватар).
Нажатие на имя/аватар в чате открывает карточку пользователя (Telegram-style slide-in панель) с действиями: звонок, ссылка, профиль, очистить чат.
Technical:
`views/chat.php` — voiceCancelBtn перемещён перед attachBtn в HTML (trash слева при записи).
`views/chat.php` — добавлена `.chat-user-info-panel` (slide-in справа) с аватаром, именем, кнопками действий; JS open/close по клику на аватар/имя + Escape + backdrop.
Кнопки callStartBtn, callLinkBtn, chatClearBtn перенесены из хедера в user-info-panel.
v4.6.0
2026-02-28
What is new:
Создана единая дизайн-система проекта (14 переиспользуемых компонентов): карточки, hover-эффекты, стеклянные панели, навигация, статусные индикаторы, зоны загрузки и др.
Unification поверхностных переменных (light/dark × soft/balanced/strong) — 6 тем теперь задаются в одном месте вместо дублирования в каждом view.
Мессенджер: кнопки смайлика и микрофона теперь одинаковой высоты (40×40px), emoji-кнопка вынесена в общий flex-ряд.
Администрирование пользователей и групп: число и подпись в стат-карточках больше не «слипаются» в одну строку.
Профиль: sidebar-карточки, hover на постах/друзьях/страницах, pills — всё унифицировано через дизайн-систему.
Файловый проводник: папки-навигация, карточки файлов, зона загрузки, точки публичности — унифицированы.
Календарь: ячейки и точки-индикаторы используют общие компоненты.
Настройки: save-bar и метки групп переведены на общие стеклянные панели.
Редактирование профиля: страница переверстана на CSS Grid — блоки «Смена пароля» и «Уведомления» теперь в боковой колонке справа (1fr + 380px).
Политики: галочки для admin и admin_tester разблокированы при редактировании global_admin.
Управление пользователями: пароли отображаются только global_admin (с размытием и кнопкой показа); настройка видимости паролей для других администраторов с учётом иерархии ролей.
Управление пользователями: убран дублирующийся select «Роль в домене» — роль в домене автоматически определяется из системной роли.
Регистрация: добавлено необязательное поле «Код домена» для привязки к домену при регистрации.
Домены: каждому домену присваивается 3-символьный буквенно-цифровой код (A-Z, 0-9); кнопка перегенерации кода в настройках домена.
Technical:
Новые функции: `user_role_rank()`, `user_can_see_password()`, `user_get_password_hint()`, `domain_get_by_code()`, `domain_generate_short_code()`, `domain_regen_code()`.
`domain_create()` генерирует уникальный 3-char код вместо slug-транслитерации.
`user_create()` / `user_set_password()` сохраняют `admin_password_hint` для административного просмотра.
Настройка `admin_show_passwords` (toggle) для управления видимостью паролей по ролям.
Действие `regen_domain_code` в маршруте admin_domains с аудит-логом.
Действие `toggle_show_passwords` в маршруте admin_users с аудит-логом.
v5.7.0
2026-02-28
What is new:
Дашборд: полностью переработанная панель с KPI-виджетами — пользователи, сообщения, файлы, контент, звонки, аудит.
Дашборд: лента последних действий (10 записей) с иконками по типу операции и карточка «Новые пользователи».
Дашборд: карточки здоровья системы с progress-bar диска и цветовыми индикаторами.
Дашборд: настраиваемая видимость 11 виджетов через панель «Настройки» (collapsible).
Дашборд: авто-обновление страницы (15с / 30с / 1м / 2м / 5м) и компактный режим карточек.
Дашборд: навигационные карточки модерации и администрирования с RBAC-проверкой и цветными иконками.
Technical:
Новая функция `dashboard_stats()` в `app/health.php` — агрегированная статистика из 15+ таблиц за один вызов.
Настройки дашборда: `dashboard_widgets_json`, `dashboard_refresh_interval`, `dashboard_show_activity`, `dashboard_compact` в `settings_defaults()`.
POST-обработчик `save_dashboard_settings` в маршруте `dashboard` с аудит-логом.
CSS-классы `.db-stat-value`, `.db-icon-circle`, `.db-activity-item`, `.db-nav-card`, `.db-compact` для стилизации виджетов.
v5.8.0
2026-02-28
What is new:
Настройки: иконки Bootstrap Icons у каждого пункта сайдбара (палитра, щит, шестерёнка, телефон, БД и др.) во цветных плашках.
Настройки: быстрый поиск по всем разделам — поле с debounce-фильтрацией, счётчик совпадений, горячая клавиша Ctrl+K.
База данных: новая опция «Подключиться без миграции» — позволяет переключить конфиг на существующую БД с данными без переноса и без удаления данных.
Предотвращает потерю данных при повторном подключении к MySQL после обновления сайта (когда конфиг сбрасывается на SQLite).
Technical:
Параметр `skip_migration` в admin_db POST-обработчике: проверяет подключение, запускает `ensure_schema()` (CREATE IF NOT EXISTS + инкрементальные миграции) и `ensure_mysql_utf8mb4()`, но НЕ вызывает `migrate_database()` / `db_truncate()`.
Разрешена отправка формы при `target === current` в режиме reconnect (для переподключения к той же БД).
UI: интерактивный чекбокс с подсказками, кнопка меняет текст/стиль в зависимости от режима.
v5.8.4
2026-02-28
What is new:
Доменная изоляция: администратор домена теперь видит в разделе «Пользователи» только пользователей своего домена, а не всех.
Новая политика «Мосты для доменных администраторов» (Настройки → Доступ): не видеть / только просмотр / полный доступ к пользователям мостовых доменов.
Новая политика «Админы корневого домена — полный доступ»: администраторы глобального домена по умолчанию видят и управляют всеми пользователями.
Пользователи из мостовых доменов помечены бейджем «мост» с указанием уровня доступа.
Technical:
`users_accounts_with_profiles()` принимает `?array $filterDomainIds` — SQL фильтрует `domain_id IN (…)`.
Новые хелперы: `is_root_domain_admin()`, `admin_bridged_domain_ids()`, `admin_visible_domain_ids()`, `admin_can_manage_user()`, `admin_can_view_user()`.
POST-обработчики admin_users защищены domain-guard: non-global admin не может управлять пользователями чужого домена.
Настройки `bridge_admin_policy` (none|view|full) и `root_domain_admin_full_access` (0|1) в `settings_defaults` и admin_settings UI.
Создание пользователя: не-global/не-root-domain админы принудительно создают пользователей в своём домене.
v4.1.0
2026-02-28
What is new:
Управление группами и мостами вынесено в отдельную страницу `Дашборд → Группы и мосты` с полным управлением: создание, переименование, удаление групп и мостов, просмотр участников.
Страница `Пользователи` очищена от группового управления, оставлены только аккаунты и создание; добавлена ссылка на новую страницу групп.
Дизайн всего проекта унифицирован: в профиле, мессенджере, контактах, страницах, уведомлениях и др. заменены хардкодные border-radius на глобальные CSS-переменные (`--bs-border-radius`, `--bs-border-radius-sm`, `--bs-border-radius-lg`).
Technical:
Добавлены backend-функции `group_rename()`, `group_delete()`, `group_bridge_delete()` в `app/users.php` для полного CRUD-управления группами и мостами.
Новый route `admin_groups` в `index.php` с POST-обработчиками: `create_group`, `rename_group`, `delete_group`, `set_bridge`, `delete_bridge`.
Новый view `views/admin_groups.php` с карточками групп (коллапс с настройками), списком мостов, статистикой и формами создания.
В layout.php и staff.php добавлена навигация на `admin_groups`. POST-обработчики `create_group`/`set_bridge` перенесены из роута `admin_users`.
Унифицированы border-radius во всех views (profile, chat, contacts, profile_edit, my_pages, notifications, admin_users) через CSS-переменные `--bs-border-radius*`, наследующие `--t-radius` из настроек.
v4.4.0
2026-02-28
What is new:
Администрирование новостей вынесено из дашборда сотрудников на отдельную страницу с полным CRUD (создание, чтение, редактирование, удаление).
Файловый проводник «Мои файлы» полностью переписан: карточный/списочный вид, drag-n-drop файлов в папки, зона загрузки, контекстное меню, иконки по типу файла, переключатель grid/list.
Профиль пользователя переработан в стиле социальных сетей: полноширинная обложка, горизонтальный блок с аватаром/именем/кнопками, липкая панель вкладок, боковая панель (инфо + сетка друзей), расширенная страница друзей.
Technical:
В `app/news.php` добавлены `news_get()` и `news_update()` для CRUD новостей.
В `index.php` добавлен маршрут `news_update` (POST, csrf, audit_log).
`views/admin_news.php` полностью переписан: page_top, хлебные крошки, режим редактирования через `?edit=ID`, форма создания/редактирования + список с кнопками.
`views/dashboard.php` полностью переписан: новый CSS (cloud-shell, cloud-file-grid/list, upload-zone, folder-tree), grid/list toggle с localStorage, drag-drop на папки через fetch, bulk-панель, контекстное меню файлов и папок.
`views/profile.php` переписан: новый CSS (~490→~410 строк), layout изменён на full-width cover banner + info-bar + sticky tabs + row (sidebar + main), друзья в sidebar (сетка 3×3 превью) + полная карточная сетка во вкладке, stat-клик переключает табы.
v4.5.0
2026-02-28
What is new:
Мессенджер переработан в стиле Telegram: кнопка «корзина» при записи голосового теперь слева, заголовок чата стал overlay поверх сообщений (больше полезной площади), упрощённый хедер (только «Назад» + имя/аватар).
Нажатие на имя/аватар в чате открывает карточку пользователя (Telegram-style slide-in панель) с действиями: звонок, ссылка, профиль, очистить чат.
Technical:
`views/chat.php` — voiceCancelBtn перемещён перед attachBtn в HTML (trash слева при записи).
`views/chat.php` — добавлена `.chat-user-info-panel` (slide-in справа) с аватаром, именем, кнопками действий; JS open/close по клику на аватар/имя + Escape + backdrop.
Кнопки callStartBtn, callLinkBtn, chatClearBtn перенесены из хедера в user-info-panel.
v4.6.0
2026-02-28
What is new:
Создана единая дизайн-система проекта (14 переиспользуемых компонентов): карточки, hover-эффекты, стеклянные панели, навигация, статусные индикаторы, зоны загрузки и др.
Unification поверхностных переменных (light/dark × soft/balanced/strong) — 6 тем теперь задаются в одном месте вместо дублирования в каждом view.
Мессенджер: кнопки смайлика и микрофона теперь одинаковой высоты (40×40px), emoji-кнопка вынесена в общий flex-ряд.
Администрирование пользователей и групп: число и подпись в стат-карточках больше не «слипаются» в одну строку.
Профиль: sidebar-карточки, hover на постах/друзьях/страницах, pills — всё унифицировано через дизайн-систему.
Файловый проводник: папки-навигация, карточки файлов, зона загрузки, точки публичности — унифицированы.
Календарь: ячейки и точки-индикаторы используют общие компоненты.
Настройки: save-bar и метки групп переведены на общие стеклянные панели.
Редактирование профиля: страница переверстана на CSS Grid — блоки «Смена пароля» и «Уведомления» теперь в боковой колонке справа (1fr + 380px).
Политики: галочки для admin и admin_tester разблокированы при редактировании global_admin.
Управление пользователями: пароли отображаются только global_admin (с размытием и кнопкой показа); настройка видимости паролей для других администраторов с учётом иерархии ролей.
Управление пользователями: убран дублирующийся select «Роль в домене» — роль в домене автоматически определяется из системной роли.
Регистрация: добавлено необязательное поле «Код домена» для привязки к домену при регистрации.
Домены: каждому домену присваивается 3-символьный буквенно-цифровой код (A-Z, 0-9); кнопка перегенерации кода в настройках домена.
Technical:
Новые функции: `user_role_rank()`, `user_can_see_password()`, `user_get_password_hint()`, `domain_get_by_code()`, `domain_generate_short_code()`, `domain_regen_code()`.
`domain_create()` генерирует уникальный 3-char код вместо slug-транслитерации.
`user_create()` / `user_set_password()` сохраняют `admin_password_hint` для административного просмотра.
Настройка `admin_show_passwords` (toggle) для управления видимостью паролей по ролям.
Действие `regen_domain_code` в маршруте admin_domains с аудит-логом.
Действие `toggle_show_passwords` в маршруте admin_users с аудит-логом.
v5.7.0
2026-02-28
What is new:
Дашборд: полностью переработанная панель с KPI-виджетами — пользователи, сообщения, файлы, контент, звонки, аудит.
Дашборд: лента последних действий (10 записей) с иконками по типу операции и карточка «Новые пользователи».
Дашборд: карточки здоровья системы с progress-bar диска и цветовыми индикаторами.
Дашборд: настраиваемая видимость 11 виджетов через панель «Настройки» (collapsible).
Дашборд: авто-обновление страницы (15с / 30с / 1м / 2м / 5м) и компактный режим карточек.
Дашборд: навигационные карточки модерации и администрирования с RBAC-проверкой и цветными иконками.
Technical:
Новая функция `dashboard_stats()` в `app/health.php` — агрегированная статистика из 15+ таблиц за один вызов.
Настройки дашборда: `dashboard_widgets_json`, `dashboard_refresh_interval`, `dashboard_show_activity`, `dashboard_compact` в `settings_defaults()`.
POST-обработчик `save_dashboard_settings` в маршруте `dashboard` с аудит-логом.
CSS-классы `.db-stat-value`, `.db-icon-circle`, `.db-activity-item`, `.db-nav-card`, `.db-compact` для стилизации виджетов.
v5.8.0
2026-02-28
What is new:
Настройки: иконки Bootstrap Icons у каждого пункта сайдбара (палитра, щит, шестерёнка, телефон, БД и др.) во цветных плашках.
Настройки: быстрый поиск по всем разделам — поле с debounce-фильтрацией, счётчик совпадений, горячая клавиша Ctrl+K.
База данных: новая опция «Подключиться без миграции» — позволяет переключить конфиг на существующую БД с данными без переноса и без удаления данных.
Предотвращает потерю данных при повторном подключении к MySQL после обновления сайта (когда конфиг сбрасывается на SQLite).
Technical:
Параметр `skip_migration` в admin_db POST-обработчике: проверяет подключение, запускает `ensure_schema()` (CREATE IF NOT EXISTS + инкрементальные миграции) и `ensure_mysql_utf8mb4()`, но НЕ вызывает `migrate_database()` / `db_truncate()`.
Разрешена отправка формы при `target === current` в режиме reconnect (для переподключения к той же БД).
UI: интерактивный чекбокс с подсказками, кнопка меняет текст/стиль в зависимости от режима.
v5.8.4
2026-02-28
What is new:
Доменная изоляция: администратор домена теперь видит в разделе «Пользователи» только пользователей своего домена, а не всех.
Новая политика «Мосты для доменных администраторов» (Настройки → Доступ): не видеть / только просмотр / полный доступ к пользователям мостовых доменов.
Новая политика «Админы корневого домена — полный доступ»: администраторы глобального домена по умолчанию видят и управляют всеми пользователями.
Пользователи из мостовых доменов помечены бейджем «мост» с указанием уровня доступа.
Technical:
`users_accounts_with_profiles()` принимает `?array $filterDomainIds` — SQL фильтрует `domain_id IN (…)`.
Новые хелперы: `is_root_domain_admin()`, `admin_bridged_domain_ids()`, `admin_visible_domain_ids()`, `admin_can_manage_user()`, `admin_can_view_user()`.
POST-обработчики admin_users защищены domain-guard: non-global admin не может управлять пользователями чужого домена.
Настройки `bridge_admin_policy` (none|view|full) и `root_domain_admin_full_access` (0|1) в `settings_defaults` и admin_settings UI.
Создание пользователя: не-global/не-root-domain админы принудительно создают пользователей в своём домене.
v4.0.0
2026-02-27
What is new:
Новый формат приложения `messenger`: отдельный упрощённый режим только для Контактов и Мессенджера с прямым открытием чата.
Страница `Админ → Пользователи` полностью переработана: аккаунт и его профили теперь управляются в одной карточке.
Добавлены группы и мосты между группами для управляемого внешнего доступа между пользователями.
Technical:
В модель пользователей добавлены `app_mode`, `group_id`, `group_role`, `allow_multiprofile`, `admin_password_hint`; добавлены таблицы `groups`, `group_members`, `group_bridges` и миграции/индексы для них.
Реализована backend-видимость по группам и мостам в `users_directory`, `contacts_list`, `conversation_get_or_create`, `conversations_for_user` и проверках `chat_start`/добавления контактов.
Файлы мессенджера отделены от общего облака: в `files` добавлен флаг `is_messenger_file`, загрузки чата идут через `context=messenger` в отдельную папку, а `files_recent_for_user` исключает чат-вложения.
Добавлен route-guard для `messenger` mode, редирект `home -> chat`, динамический `manifest.start_url` под режим пользователя и обновление session snapshot (`app_mode/group/...`) в auth/layout.
Расширены политики и админ-настройки: новые capability (`sections.app_mode`, `admin.groups`, `admin.bridges`) и `app_default_mode` в системных настройках.
v4.2.0
2026-02-27
What is new:
В мессенджере при записи голосового сообщения появляется красная кнопка-корзина для отмены записи (как в Telegram). Работает и при тапе, и при удержании.
Добавлена функция «Удалить у всех»: отправитель может удалить своё сообщение не только для себя, но и для собеседника.
Удаление сообщений теперь работает мгновенно через AJAX — без перезагрузки страницы, с плавной анимацией исчезновения.
На мобильных устройствах при фокусе на поле ввода чат автоматически прокручивается к последнему сообщению, даже если до этого был прокручен вверх.
Technical:
Добавлена кнопка `#voiceCancelBtn` (`.chat-voice-cancel-btn`) в inputbar мессенджера; появляется при `voiceTapRecording`/`voiceHoldRecording`, вызывает `voiceRecResetState()` для отмены.
В `app/chat.php` добавлена `message_delete_for_all()` — физическое удаление сообщения и его реакций; доступно только отправителю.
Новый AJAX-маршрут `chat_delete_async` в `index.php`: принимает `mode` (`for_me` / `for_all`), возвращает JSON; заменяет синхронные form POST для удаления.
В dropdown-меню сообщений (PHP-рендер и JS polling-рендер) form POST заменён на `data-action=\"delete\"` / `data-action=\"delete-all\"` кнопки с обработкой через delegated click handler.
В mobile focusin-обработчике `scrollToBottom(false)` заменён на `scrollToBottom(true)` с повторной прокруткой через 300ms для учёта анимации клавиатуры.
v4.3.0
2026-02-27
What is new:
Создана отдельная страница «Новости» со всеми админ- и системными новостями, пагинацией и кнопкой «Показать ещё».
На дашборде в блоке «Новости» теперь показываются только 2 последних записи и ссылка «Все новости →».
Добавлен пункт «Новости» в боковую навигацию (десктоп) и мобильное меню.
Новая глобальная тема «Clear Opus» — минималистичный дизайн в духе Linear/Apple: мягкие тени, тонкие границы, акцентная полоска сверху карточек, утончённая типографика и полированные элементы на всех страницах.
Тему Clear Opus можно включить в настройках → Эффект-пакет, либо через профиль оформления «Clear Opus (чистый, воздушный)».
Technical:
Создан `views/news.php` — standalone-страница новостей с `page_top`, раздельными блоками admin/system news и load-more (initial=10).
Добавлен маршрут `case "news"` в `index.php` затягивающий `views/news.php`.
В `views/home.php` блок новостей заменён на compact-preview (2 элемента) + ссылка на `?r=news`.
В `views/layout.php` добавлен `nav-item` «Новости» (иконка `bi-megaphone`) в sidebar и offcanvas-навигацию.
В `views/partials/head.php` добавлен CSS-блок ~300 строк для пресета `clear_opus`: кастомные свойства (`--co-surface`, `--co-border`, `--co-shadow-*`), стилизация `.card`, `.page-hero`, `.navbar`, `.nav-section`, `.nav-item-link`, `.btn`, `.form-control`, `.dropdown-menu`, `.modal-content`, `.offcanvas`, `.table`, `.list-group-item`, `.badge`, `.alert`, `.breadcrumb`, `.toast`, scrollbar, dark-mode overrides и анимации при `data-ui-anim="1"`.
В `app/bootstrap.php`: `ui_appearance_profiles()` дополнен профилем `clear_opus` (accent #4f6df5, plain bg, radius 12, plex font, soft surfaces, no glass); `ui_config()` preset-валидация расширена на `clear_opus`.
В `index.php` POST-обработчик `ui_style_preset` расширен валидацией на `clear_opus`.
В `views/admin_settings.php` в select «Эффект-пакет» добавлен `<option value="clear_opus">`.
v4.0.0
2026-02-27
What is new:
Новый формат приложения `messenger`: отдельный упрощённый режим только для Контактов и Мессенджера с прямым открытием чата.
Страница `Админ → Пользователи` полностью переработана: аккаунт и его профили теперь управляются в одной карточке.
Добавлены группы и мосты между группами для управляемого внешнего доступа между пользователями.
Technical:
В модель пользователей добавлены `app_mode`, `group_id`, `group_role`, `allow_multiprofile`, `admin_password_hint`; добавлены таблицы `groups`, `group_members`, `group_bridges` и миграции/индексы для них.
Реализована backend-видимость по группам и мостам в `users_directory`, `contacts_list`, `conversation_get_or_create`, `conversations_for_user` и проверках `chat_start`/добавления контактов.
Файлы мессенджера отделены от общего облака: в `files` добавлен флаг `is_messenger_file`, загрузки чата идут через `context=messenger` в отдельную папку, а `files_recent_for_user` исключает чат-вложения.
Добавлен route-guard для `messenger` mode, редирект `home -> chat`, динамический `manifest.start_url` под режим пользователя и обновление session snapshot (`app_mode/group/...`) в auth/layout.
Расширены политики и админ-настройки: новые capability (`sections.app_mode`, `admin.groups`, `admin.bridges`) и `app_default_mode` в системных настройках.
v4.2.0
2026-02-27
What is new:
В мессенджере при записи голосового сообщения появляется красная кнопка-корзина для отмены записи (как в Telegram). Работает и при тапе, и при удержании.
Добавлена функция «Удалить у всех»: отправитель может удалить своё сообщение не только для себя, но и для собеседника.
Удаление сообщений теперь работает мгновенно через AJAX — без перезагрузки страницы, с плавной анимацией исчезновения.
На мобильных устройствах при фокусе на поле ввода чат автоматически прокручивается к последнему сообщению, даже если до этого был прокручен вверх.
Technical:
Добавлена кнопка `#voiceCancelBtn` (`.chat-voice-cancel-btn`) в inputbar мессенджера; появляется при `voiceTapRecording`/`voiceHoldRecording`, вызывает `voiceRecResetState()` для отмены.
В `app/chat.php` добавлена `message_delete_for_all()` — физическое удаление сообщения и его реакций; доступно только отправителю.
Новый AJAX-маршрут `chat_delete_async` в `index.php`: принимает `mode` (`for_me` / `for_all`), возвращает JSON; заменяет синхронные form POST для удаления.
В dropdown-меню сообщений (PHP-рендер и JS polling-рендер) form POST заменён на `data-action=\"delete\"` / `data-action=\"delete-all\"` кнопки с обработкой через delegated click handler.
В mobile focusin-обработчике `scrollToBottom(false)` заменён на `scrollToBottom(true)` с повторной прокруткой через 300ms для учёта анимации клавиатуры.
v4.3.0
2026-02-27
What is new:
Создана отдельная страница «Новости» со всеми админ- и системными новостями, пагинацией и кнопкой «Показать ещё».
На дашборде в блоке «Новости» теперь показываются только 2 последних записи и ссылка «Все новости →».
Добавлен пункт «Новости» в боковую навигацию (десктоп) и мобильное меню.
Новая глобальная тема «Clear Opus» — минималистичный дизайн в духе Linear/Apple: мягкие тени, тонкие границы, акцентная полоска сверху карточек, утончённая типографика и полированные элементы на всех страницах.
Тему Clear Opus можно включить в настройках → Эффект-пакет, либо через профиль оформления «Clear Opus (чистый, воздушный)».
Technical:
Создан `views/news.php` — standalone-страница новостей с `page_top`, раздельными блоками admin/system news и load-more (initial=10).
Добавлен маршрут `case "news"` в `index.php` затягивающий `views/news.php`.
В `views/home.php` блок новостей заменён на compact-preview (2 элемента) + ссылка на `?r=news`.
В `views/layout.php` добавлен `nav-item` «Новости» (иконка `bi-megaphone`) в sidebar и offcanvas-навигацию.
В `views/partials/head.php` добавлен CSS-блок ~300 строк для пресета `clear_opus`: кастомные свойства (`--co-surface`, `--co-border`, `--co-shadow-*`), стилизация `.card`, `.page-hero`, `.navbar`, `.nav-section`, `.nav-item-link`, `.btn`, `.form-control`, `.dropdown-menu`, `.modal-content`, `.offcanvas`, `.table`, `.list-group-item`, `.badge`, `.alert`, `.breadcrumb`, `.toast`, scrollbar, dark-mode overrides и анимации при `data-ui-anim="1"`.
В `app/bootstrap.php`: `ui_appearance_profiles()` дополнен профилем `clear_opus` (accent #4f6df5, plain bg, radius 12, plex font, soft surfaces, no glass); `ui_config()` preset-валидация расширена на `clear_opus`.
В `index.php` POST-обработчик `ui_style_preset` расширен валидацией на `clear_opus`.
В `views/admin_settings.php` в select «Эффект-пакет» добавлен `<option value="clear_opus">`.
v4.0.0
2026-02-27
What is new:
Новый формат приложения `messenger`: отдельный упрощённый режим только для Контактов и Мессенджера с прямым открытием чата.
Страница `Админ → Пользователи` полностью переработана: аккаунт и его профили теперь управляются в одной карточке.
Добавлены группы и мосты между группами для управляемого внешнего доступа между пользователями.
Technical:
В модель пользователей добавлены `app_mode`, `group_id`, `group_role`, `allow_multiprofile`, `admin_password_hint`; добавлены таблицы `groups`, `group_members`, `group_bridges` и миграции/индексы для них.
Реализована backend-видимость по группам и мостам в `users_directory`, `contacts_list`, `conversation_get_or_create`, `conversations_for_user` и проверках `chat_start`/добавления контактов.
Файлы мессенджера отделены от общего облака: в `files` добавлен флаг `is_messenger_file`, загрузки чата идут через `context=messenger` в отдельную папку, а `files_recent_for_user` исключает чат-вложения.
Добавлен route-guard для `messenger` mode, редирект `home -> chat`, динамический `manifest.start_url` под режим пользователя и обновление session snapshot (`app_mode/group/...`) в auth/layout.
Расширены политики и админ-настройки: новые capability (`sections.app_mode`, `admin.groups`, `admin.bridges`) и `app_default_mode` в системных настройках.
v4.2.0
2026-02-27
What is new:
В мессенджере при записи голосового сообщения появляется красная кнопка-корзина для отмены записи (как в Telegram). Работает и при тапе, и при удержании.
Добавлена функция «Удалить у всех»: отправитель может удалить своё сообщение не только для себя, но и для собеседника.
Удаление сообщений теперь работает мгновенно через AJAX — без перезагрузки страницы, с плавной анимацией исчезновения.
На мобильных устройствах при фокусе на поле ввода чат автоматически прокручивается к последнему сообщению, даже если до этого был прокручен вверх.
Technical:
Добавлена кнопка `#voiceCancelBtn` (`.chat-voice-cancel-btn`) в inputbar мессенджера; появляется при `voiceTapRecording`/`voiceHoldRecording`, вызывает `voiceRecResetState()` для отмены.
В `app/chat.php` добавлена `message_delete_for_all()` — физическое удаление сообщения и его реакций; доступно только отправителю.
Новый AJAX-маршрут `chat_delete_async` в `index.php`: принимает `mode` (`for_me` / `for_all`), возвращает JSON; заменяет синхронные form POST для удаления.
В dropdown-меню сообщений (PHP-рендер и JS polling-рендер) form POST заменён на `data-action=\"delete\"` / `data-action=\"delete-all\"` кнопки с обработкой через delegated click handler.
В mobile focusin-обработчике `scrollToBottom(false)` заменён на `scrollToBottom(true)` с повторной прокруткой через 300ms для учёта анимации клавиатуры.
v4.3.0
2026-02-27
What is new:
Создана отдельная страница «Новости» со всеми админ- и системными новостями, пагинацией и кнопкой «Показать ещё».
На дашборде в блоке «Новости» теперь показываются только 2 последних записи и ссылка «Все новости →».
Добавлен пункт «Новости» в боковую навигацию (десктоп) и мобильное меню.
Новая глобальная тема «Clear Opus» — минималистичный дизайн в духе Linear/Apple: мягкие тени, тонкие границы, акцентная полоска сверху карточек, утончённая типографика и полированные элементы на всех страницах.
Тему Clear Opus можно включить в настройках → Эффект-пакет, либо через профиль оформления «Clear Opus (чистый, воздушный)».
Technical:
Создан `views/news.php` — standalone-страница новостей с `page_top`, раздельными блоками admin/system news и load-more (initial=10).
Добавлен маршрут `case "news"` в `index.php` затягивающий `views/news.php`.
В `views/home.php` блок новостей заменён на compact-preview (2 элемента) + ссылка на `?r=news`.
В `views/layout.php` добавлен `nav-item` «Новости» (иконка `bi-megaphone`) в sidebar и offcanvas-навигацию.
В `views/partials/head.php` добавлен CSS-блок ~300 строк для пресета `clear_opus`: кастомные свойства (`--co-surface`, `--co-border`, `--co-shadow-*`), стилизация `.card`, `.page-hero`, `.navbar`, `.nav-section`, `.nav-item-link`, `.btn`, `.form-control`, `.dropdown-menu`, `.modal-content`, `.offcanvas`, `.table`, `.list-group-item`, `.badge`, `.alert`, `.breadcrumb`, `.toast`, scrollbar, dark-mode overrides и анимации при `data-ui-anim="1"`.
В `app/bootstrap.php`: `ui_appearance_profiles()` дополнен профилем `clear_opus` (accent #4f6df5, plain bg, radius 12, plex font, soft surfaces, no glass); `ui_config()` preset-валидация расширена на `clear_opus`.
В `index.php` POST-обработчик `ui_style_preset` расширен валидацией на `clear_opus`.
В `views/admin_settings.php` в select «Эффект-пакет» добавлен `<option value="clear_opus">`.
v4.0.0
2026-02-27
What is new:
Новый формат приложения `messenger`: отдельный упрощённый режим только для Контактов и Мессенджера с прямым открытием чата.
Страница `Админ → Пользователи` полностью переработана: аккаунт и его профили теперь управляются в одной карточке.
Добавлены группы и мосты между группами для управляемого внешнего доступа между пользователями.
Technical:
В модель пользователей добавлены `app_mode`, `group_id`, `group_role`, `allow_multiprofile`, `admin_password_hint`; добавлены таблицы `groups`, `group_members`, `group_bridges` и миграции/индексы для них.
Реализована backend-видимость по группам и мостам в `users_directory`, `contacts_list`, `conversation_get_or_create`, `conversations_for_user` и проверках `chat_start`/добавления контактов.
Файлы мессенджера отделены от общего облака: в `files` добавлен флаг `is_messenger_file`, загрузки чата идут через `context=messenger` в отдельную папку, а `files_recent_for_user` исключает чат-вложения.
Добавлен route-guard для `messenger` mode, редирект `home -> chat`, динамический `manifest.start_url` под режим пользователя и обновление session snapshot (`app_mode/group/...`) в auth/layout.
Расширены политики и админ-настройки: новые capability (`sections.app_mode`, `admin.groups`, `admin.bridges`) и `app_default_mode` в системных настройках.
v4.2.0
2026-02-27
What is new:
В мессенджере при записи голосового сообщения появляется красная кнопка-корзина для отмены записи (как в Telegram). Работает и при тапе, и при удержании.
Добавлена функция «Удалить у всех»: отправитель может удалить своё сообщение не только для себя, но и для собеседника.
Удаление сообщений теперь работает мгновенно через AJAX — без перезагрузки страницы, с плавной анимацией исчезновения.
На мобильных устройствах при фокусе на поле ввода чат автоматически прокручивается к последнему сообщению, даже если до этого был прокручен вверх.
Technical:
Добавлена кнопка `#voiceCancelBtn` (`.chat-voice-cancel-btn`) в inputbar мессенджера; появляется при `voiceTapRecording`/`voiceHoldRecording`, вызывает `voiceRecResetState()` для отмены.
В `app/chat.php` добавлена `message_delete_for_all()` — физическое удаление сообщения и его реакций; доступно только отправителю.
Новый AJAX-маршрут `chat_delete_async` в `index.php`: принимает `mode` (`for_me` / `for_all`), возвращает JSON; заменяет синхронные form POST для удаления.
В dropdown-меню сообщений (PHP-рендер и JS polling-рендер) form POST заменён на `data-action=\"delete\"` / `data-action=\"delete-all\"` кнопки с обработкой через delegated click handler.
В mobile focusin-обработчике `scrollToBottom(false)` заменён на `scrollToBottom(true)` с повторной прокруткой через 300ms для учёта анимации клавиатуры.
v4.3.0
2026-02-27
What is new:
Создана отдельная страница «Новости» со всеми админ- и системными новостями, пагинацией и кнопкой «Показать ещё».
На дашборде в блоке «Новости» теперь показываются только 2 последних записи и ссылка «Все новости →».
Добавлен пункт «Новости» в боковую навигацию (десктоп) и мобильное меню.
Новая глобальная тема «Clear Opus» — минималистичный дизайн в духе Linear/Apple: мягкие тени, тонкие границы, акцентная полоска сверху карточек, утончённая типографика и полированные элементы на всех страницах.
Тему Clear Opus можно включить в настройках → Эффект-пакет, либо через профиль оформления «Clear Opus (чистый, воздушный)».
Technical:
Создан `views/news.php` — standalone-страница новостей с `page_top`, раздельными блоками admin/system news и load-more (initial=10).
Добавлен маршрут `case "news"` в `index.php` затягивающий `views/news.php`.
В `views/home.php` блок новостей заменён на compact-preview (2 элемента) + ссылка на `?r=news`.
В `views/layout.php` добавлен `nav-item` «Новости» (иконка `bi-megaphone`) в sidebar и offcanvas-навигацию.
В `views/partials/head.php` добавлен CSS-блок ~300 строк для пресета `clear_opus`: кастомные свойства (`--co-surface`, `--co-border`, `--co-shadow-*`), стилизация `.card`, `.page-hero`, `.navbar`, `.nav-section`, `.nav-item-link`, `.btn`, `.form-control`, `.dropdown-menu`, `.modal-content`, `.offcanvas`, `.table`, `.list-group-item`, `.badge`, `.alert`, `.breadcrumb`, `.toast`, scrollbar, dark-mode overrides и анимации при `data-ui-anim="1"`.
В `app/bootstrap.php`: `ui_appearance_profiles()` дополнен профилем `clear_opus` (accent #4f6df5, plain bg, radius 12, plex font, soft surfaces, no glass); `ui_config()` preset-валидация расширена на `clear_opus`.
В `index.php` POST-обработчик `ui_style_preset` расширен валидацией на `clear_opus`.
В `views/admin_settings.php` в select «Эффект-пакет» добавлен `<option value="clear_opus">`.
v3.4.0
2026-02-23
What is new:
Добавлены полноценные push-уведомления на устройство (через Web Push + Service Worker) для сценариев, когда сайт/PWA закрыт.
Push-уведомления теперь приходят по ключевым событиям: сообщения, входящие звонки/приглашения в звонок, лайки постов, комментарии и добавления в друзья.
В звонках добавлен индикатор качества связи (RTT, джиттер, потери, битрейт) с понятной оценкой состояния соединения.
Улучшена стабильность звонков: при проблемах соединения клиент мягко инициирует переподключение и показывает статус «переподключение».
Technical:
Добавлен `app/push.php`: VAPID-ключи (автогенерация), подписки Web Push, очередь уведомлений, payloadless Web Push dispatch и pull-механизм для SW.
В `app/migrations.php` добавлены таблицы `push_subscriptions` и `push_queue` (MySQL/SQLite) с индексами для подписок и очереди доставки.
В `index.php` добавлены маршруты `push_subscribe`, `push_unsubscribe`, `push_pull`; ключевые действия (chat/call/like/comment/friend) теперь ставят события в push-очередь и триггерят доставку.
В `views/partials/scripts.php` добавлена синхронизация `PushManager`-подписки с настройкой `notify_desktop`, а в Service Worker (`service-worker.js` и `public/service-worker.js`) реализован payloadless push -> `push_pull` -> `showNotification`.
В `views/chat.php` добавлен `getStats()`-мониторинг качества WebRTC и UI-индикатор без изменения mobile composer/keyboard-геометрии (чтобы не вернуть баг с “подбородком”).
v3.4.1
2026-02-23
What is new:
Исправлено мобильное открытие окна вложений в мессенджере: attach-модалки/проводник теперь открываются поверх fullscreen-чата.
Меню профиля/переключения мультипрофилей в мобильной шапке больше не уезжает влево: dropdown центрируется по viewport.
Technical:
В `views/chat.php` поднят z-index attach-модалки и file-picker-модалки над mobile chat pane (`z-index: 2100`) и добавлена маркировка backdrop (`chat-over-chat-backdrop`).
В `views/chat.php` усилен mobile-open handler клипсы (`pointerup` + `touchend` + click guard), чтобы не терялись тапы в fullscreen-мессенджере.
В `views/partials/head.php` и `views/layout.php` добавлен mobile-centered режим для `topbar-profile-menu` (fixed + вычисляемый `top` на `show.bs.dropdown`).
v3.4.2
2026-02-23
What is new:
Исправлена навигация по клику на уведомления: уведомления теперь корректно открывают источник (чат, календарь, профиль/пост и т.д.) в браузере и PWA.
Technical:
В `views/partials/scripts.php` `__tsoyNavigateFromNotification()` переведён на резолв ссылок через `appBasePath`, а fallback `Notification.onclick` теперь использует тот же навигатор.
В `service-worker.js` / `public/service-worker.js` `notificationclick` теперь резолвит `data.url` относительно `self.registration.scope` (а не `origin`), что исправляет deep-link в установках не в корне сайта.
v3.4.3
2026-02-23
What is new:
Уведомления стали информативнее: для новых сообщений показываются имя отправителя и фрагмент текста.
Для входящих звонков в уведомления добавлены действия «Принять» и «Отклонить» (там, где это поддерживает браузер/устройство).
Technical:
В `notif_poll` добавлен preview последнего непрочитанного сообщения (`sender/body/url`), а клиентский polling в `views/partials/scripts.php` использует его для desktop-уведомлений и toast.
В `app/push.php` расширен payload Web Push: поддержка `data` и `action_urls`, а `push_notify_incoming_call()` теперь отправляет actions (`accept/close`) и URL принятия звонка.
v3.4.4
2026-02-23
What is new:
В дашборде (`Настройки`) добавлен отдельный блок настроек уведомлений: цвет, оформление toast/desktop-уведомлений, рингтон уведомлений и отдельный рингтон входящего звонка.
Добавлен блок `PWA и обновления`: политика обновления (manual/notify/auto), интервал проверки Service Worker, автозапрос persistent storage и toast-оповещения об обновлении PWA.
В открытом приложении входящий звонок теперь использует настраиваемый рингтон (если у пользователя включён звук уведомлений).
Technical:
Добавлены новые ключи настроек в `app/settings.php`; сохранение/валидация реализованы в `index.php` (`admin_settings`).
В `views/layout.php` новые настройки прокидываются в `window.__TSOY_NOTIFY` (`ui/sounds/pwa`) для runtime-слоя.
В `views/partials/scripts.php` улучшен PWA update flow: регистрация SW с учётом `appBasePath`, настраиваемый интервал `update()`, политика auto/notify/manual и методы `__TSOY_PWA_RUNTIME.checkForUpdates/applyUpdate/getUpdateState`.
В `views/partials/scripts.php` добавлены пресеты синтезируемых звуков уведомлений и рингтона звонка, а также стилизация toast/desktop notification по админ-настройкам.
v3.4.5
2026-02-23
What is new:
В настройках уведомлений добавлена загрузка своих рингтонов: отдельно для обычных уведомлений и отдельно для входящего звонка.
В админке можно прослушать загруженные рингтоны прямо в разделе настроек и удалить их при необходимости.
Technical:
Добавлены настройки `notify_sound_custom_path` и `notify_call_sound_custom_path`, а в `admin_settings` реализована загрузка аудиофайлов в `public/sounds`.
Во фронтенде (`views/layout.php` + `views/partials/scripts.php`) runtime уведомлений получил поддержку кастомных аудио-файлов с fallback на синтезированные звуки, если браузер блокирует воспроизведение.
v3.5.0
2026-02-23
What is new:
Стабилизационный релиз: проведён общий cleanup проекта, снижён шум от временных артефактов и улучшена предсказуемость работы уведомлений/PWA-настроек.
В настройках уведомлений доработана работа со своими рингтонами: при замене старые файлы корректно очищаются, а слишком большие файлы не принимаются.
Technical:
Удалены временные каталоги восстановления/аудита (`tmp_*`) из рабочей директории, которые засоряли поиск и увеличивали накладные расходы проверок.
В `scripts/check-encoding.ps1` добавлено универсальное исключение для временных каталогов `tmp_*`, чтобы сборочные проверки не сканировали техмусор.
В `views/partials/head.php` убран дублирующийся `<link rel=\"icon\">`, а в `views/layout.php` удалены лишние переменные и лишний вызов `ui_config()` для чтения акцента (используется уже загруженный `$ui`).
В `index.php` (`admin_settings`) улучшен lifecycle кастомных рингтонов: безопасное удаление старых файлов в `public/sounds`, защита от path traversal и лимит размера загружаемого рингтона (5 MB).
v3.5.1
2026-02-23
What is new:
Hotfix рингтонов на телефонах: улучшено воспроизведение кастомных рингтонов уведомлений/звонка на мобильных браузерах и PWA.
Technical:
В `views/partials/scripts.php` исправлен баг кастомного рингтона уведомлений: теперь Promise `audio.play()` реально проверяется, и при ошибке срабатывает fallback-звук.
Кастомные рингтоны теперь резолвятся через `appBasePath` (`__tsoyResolveAppUrl`) для корректной работы в установках проекта в подпапке сайта.
Добавлен mobile-safe `audio unlock` по первому взаимодействию пользователя, чтобы повысить шанс воспроизведения звука на iPhone/Android браузерах.
v3.5.2
2026-02-23
What is new:
Усилена надёжность уведомлений: добавлен серверный retry-worker для wake-push доставки с повторными попытками и backoff.
В админке (Настройки -> PWA и обновления) появился блок диагностики push-очереди: количество недоставленных элементов, состояние очереди и статус подписок.
Technical:
В `push_queue` добавлены поля состояния доставки (`dispatch_state`, попытки, backoff, lock, last_error/status) и миграции для MySQL/SQLite.
В `app/push.php` реализованы функции очереди и worker-обработки (`claim/process due`, retry/backoff, статистика очереди).
Добавлен route `index.php?r=push_worker_run` для ручного запуска worker из админки и CLI-скрипт `scripts/push-worker.php` для cron/daemon запуска.
`push_notify_user_event()` теперь сохраняет результат wake-push отправки в очередь, а `push_dispatch_user()` возвращает расширенную статистику для retry-логики.
v3.5.3
2026-02-23
What is new:
Уведомления стали стабильнее при закрытом PWA/сайте: сервер теперь пытается отправлять полноценный Web Push payload (с телом уведомления), а не только wake-push.
Сохранён fallback-режим (`wake-push + push_pull`) для совместимости, если endpoint/браузер не принимает payload.
Technical:
В `app/push.php` добавлена payload-отправка Web Push (`aes128gcm`) с VAPID и шифрованием сообщения на стороне сервера (ECDH + HKDF + AES-128-GCM).
`push_dispatch_user()` теперь умеет отправлять payload в push и возвращает раздельную статистику `payload_sent` / `wake_sent`.
Если payload доставлен без fallback на wake-push, очередь помечается как `delivered_at`, чтобы не было дубля через `push_pull`.
Service Worker (`service-worker.js`, `public/service-worker.js`) стал устойчивее к ошибкам парсинга payload: сначала пытается `json()`, затем `text()+JSON.parse()`, потом fallback на `push_pull`.
v3.5.4
2026-02-23
What is new:
В админке (`Настройки -> PWA и обновления`) добавлена диагностика push-устройств: список подписок, устройство/режим, последний успех доставки и ошибки.
Появилась кнопка `Тест push` для каждого устройства, чтобы быстро проверить доставку уведомлений на конкретную подписку.
Technical:
В `app/push.php` добавлены helper-функции диагностики: `push_subscriptions_admin_list()`, `push_subscription_get()`, `push_subscription_test_send()`.
Добавлен route `index.php?r=push_test_subscription` (admin/settings), который отправляет тестовый push на выбранную подписку и пишет результат в flash.
Тестовая отправка использует payload Web Push с fallback на wake-push, а результат обновляет `last_seen_at`/`last_error` подписки через `push_subscription_touch_result()`.
v3.5.5
2026-02-23
What is new:
Диагностика push-устройств в админке стала практичнее: добавлены фильтры (поиск, active/inactive, только с ошибками).
Для push-подписок появились действия `Отключить / Включить / Удалить` прямо в таблице устройств.
Technical:
В `app/push.php` добавлены admin-helper’ы управления подписками: `push_subscription_set_active()` и `push_subscription_delete_by_id()`, а список подписок получил серверные фильтры (`q`, `only_errors`, `state`).
В `index.php` добавлен route `push_subscription_admin_action` для безопасного управления подписками из админки (POST + CSRF + capability).
В `views/admin_settings.php` блок диагностики push-устройств получил UI-фильтры и действия по подпискам через `formaction`, без конфликта с основной формой настроек.
v3.5.6
2026-02-23
What is new:
Исправлен бренд в уведомлениях: заголовок уведомлений теперь подтягивается из настроек сайта, а не захардкожен как `TSOY.CLOUD`.
В диагностике push-устройств добавлена колонка `Последний тест` (успех/ошибка, режим `payload/wake`, HTTP-код, время).
Technical:
В `app/push.php` добавлен helper `push_app_title()` (с кешем), и серверные push-события/очередь/тестовые уведомления переведены на имя сайта из `settings`.
В `views/layout.php` + `views/partials/scripts.php` runtime уведомлений получил `siteName/siteHeaderName`; browser/PWA fallback notifications и toast теперь используют бренд из настроек.
В `push_subscriptions` добавлены поля `last_test_*` (миграции для MySQL/SQLite), а тестовая отправка подписки сохраняет режим (`payload`/`wake`) и результат в БД.
v3.5.7
2026-02-23
What is new:
В диагностике push-устройств добавлена статистика реальных доставок по подписке: `payload`, `wake`, `wake fallback`, `errors` (накопительно, с последнего сброса).
Добавлены кнопки сброса статистики доставок: для одной подписки и для всех подписок сразу.
Заголовок уведомлений теперь стабильно берётся из настроек сайта (брендинг) и для серверных push, и для клиентских fallback-уведомлений.
Technical:
В `push_subscriptions` добавлены поля `push_stat_*` и миграции для MySQL/SQLite; реальные отправки в `push_dispatch_user()` записывают статистику по подписке (`payload/wake/fallback/error`).
В `app/push.php` реализованы helper’ы `push_subscription_delivery_stats_record()` и `push_subscription_delivery_stats_reset()`.
В `index.php` добавлен admin-route `push_subscription_stats_reset`, а в `views/admin_settings.php` — отображение статистики и кнопки сброса.
В `app/push.php` + `views/layout.php` + `views/partials/scripts.php` уведомления переведены на бренд из `settings` через `push_app_title()` и runtime helper `__tsoyNotifyTitle()`.
v3.5.8
2026-02-23
What is new:
Hotfix уведомлений: название в заголовке уведомления теперь берётся в приоритете из `Название в шапке`, затем из `Название сайта`.
Исправлен fallback тестового уведомления в центре уведомлений: больше не показывает захардкоженный `TSOY.CLOUD`.
Technical:
В `views/notifications.php` fallback `new Notification(...)` переведён на бренд из `window.__TSOY_NOTIFY`.
В `views/partials/scripts.php` helper `__tsoyNotifyTitle()` теперь использует `siteHeaderName` раньше `siteName`.
В `app/push.php` helper `push_app_title()` переведён на тот же приоритет (`site_header_name` -> `site_name`).
v3.5.10
2026-02-23
What is new:
В диагностике push-устройств добавлена агрегированная сводка по всем подпискам: `payload success rate`, `fallback rate`, `error rate` и общие счётчики попыток.
Добавлен мини-график/спарклайн по дням (14 дней): stacked bars `payload / wake / errors`, где высота столбца показывает объём попыток за день.
Теперь качество доставки push видно и в разрезе периода, и по текущему срезу без ручного анализа таблицы устройств.
Technical:
В `app/push.php` `push_queue_stats()` расширен блоком `delivery_summary`, который агрегирует `push_stat_*` по всем push-подпискам и считает проценты (`payload/fallback/error`).
Добавлена таблица/миграция `push_delivery_daily_stats` и запись дневной статистики при реальных отправках push (`payload/wake/fallback/error`).
В `app/push.php` реализован `delivery_trend` (последние 14 дней, с заполнением пропусков по датам) для UI-графика диагностики.
В `views/admin_settings.php` добавлены summary-блок и мини-график над таблицей устройств.
v3.5.11
2026-02-23
What is new:
Страница `Настройки` в дашборде больше не выглядит как сплошная простыня: добавлен блок быстрых переходов по разделам (якоря) и группировка по логическим секциям.
Появились явные секции: основные параметры, дизайн/уведомления, PWA/push, функции/звонки/диагностика — ориентироваться в настройках стало заметно проще.
Навигация по секциям адаптирована под мобильные устройства: на телефоне список разделов прокручивается горизонтально.
Technical:
В `views/admin_settings.php` добавлены якоря (`id`) для ключевых блоков настроек и верхняя навигационная панель без изменения backend-логики сохранения формы.
Страница сохранена как единая форма `admin_settings`, поэтому существующие `POST`-обработчики, `formaction` для push-диагностики и CSRF-проверки продолжают работать без миграций.
Добавлены локальные стили для секционной навигации и групповых маркеров (`admin-settings-*`) с mobile-friendly поведением.
v3.5.12
2026-02-23
What is new:
Hotfix страницы `Настройки`: быстрые переходы по разделам теперь ведут в нужные блоки страницы, а не в корень сайта.
Убран sticky-режим блока `Разделы настроек`, из-за которого он перекрывал интерфейс при прокрутке.
Technical:
В `views/admin_settings.php` ссылки разделов переведены с hash-only (`#...`) на route-aware (`index.php?r=admin_settings#...`) для корректной работы при наличии `<base>`/нестандартного base path.
Снята sticky-позиция с `admin-settings-nav-card` (оставлен статичный блок), чтобы навигация не накрывала карточки настроек ниже по странице.
v3.5.13
2026-02-23
What is new:
Страница `Настройки` переделана в Android-style режим: слева список разделов, справа показывается только выбранный раздел настроек.
Переключение разделов теперь происходит без переходов по странице/якорям; интерфейс не перекрывается и не дёргается.
Выбранный раздел запоминается локально, а переходы по служебным hash-ссылкам (например `#pwa-notify-admin`) открывают нужную секцию автоматически.
Technical:
В `views/admin_settings.php` реализован client-side секционный контроллер (`data-settings-nav` / `data-settings-section`) с переключением видимости блоков внутри одной формы.
Сохранена совместимость с текущим backend `admin_settings`: `POST`-логика, `formaction` кнопки push-диагностики и CSRF-проверка не менялись.
Скрытие секций переведено на progressive enhancement: блоки скрываются только после инициализации JS (`.js-sections-ready`), чтобы страница не ломалась при отключённом JS.
v3.5.14
2026-02-23
What is new:
В разделе `Система` настроек добавлен выпадающий список выбора часового пояса по Гринвичу (GMT/UTC offsets).
При выборе смещения из списка значение автоматически подставляется в поле часового пояса ниже, чтобы сохранить настройку одним кликом.
Поле ручного ввода IANA-зоны сохранено для точной настройки (например региональных зон с DST или нестандартных смещений).
Technical:
В `views/admin_settings.php` добавлена генерация preset-списка фиксированных зон `GMT-12 ... GMT+14` с валидными IANA-идентификаторами (`Etc/GMT±N`, `UTC`).
Добавлена JS-связка `systemTimezoneUtcPreset -> systemTimezoneInput`, которая подставляет выбранный preset в существующее поле `system_timezone` без изменений backend-валидации.
v3.5.15
2026-02-23
What is new:
Настройки переведены в Android-style режим с боковым меню разделов и вторым уровнем внутри `PWA и push` (`Обновления`, `Очередь push`, `Устройства`).
В главное меню добавлен отдельный пункт `Настройки` (после `Дашборд`), доступный всем авторизованным пользователям.
Настройки стали role-aware: пользователь/модератор видят личные настройки, админ — личные + админские, `admin_tester` видит всё, но может менять только пользовательские настройки.
В разделе `Система` добавлен выбор часового пояса по Гринвичу (GMT/UTC) через выпадающий список с автоподстановкой.
Technical:
Добавлен route `settings` с доступом через `sections.settings`; legacy route `admin_settings` сохранён для совместимости админ-инструментов и внутренних redirect’ов.
`index.php` (`settings/admin_settings`) разделён по scope сохранения: личные настройки (theme + notify prefs) сохраняются всем ролям, глобальные админ-настройки — только при `admin.settings` и не в режиме `admin_tester`.
В `app/policies.php` и `views/admin_policies.php` добавлена capability `sections.settings` (закреплена для всех ролей с логином).
Исправлена RBAC-связка пользовательского облака: route `dashboard` и связанные действия теперь проверяются по capability `sections.cloud`, а не `sections.dashboard` (staff dashboard).
В `views/admin_settings.php` реализован секционный контроллер с role-aware видимостью/readonly и поднавигацией PWA; у `admin_tester` админ-секции блокируются на уровне UI и backend.
v3.5.16
2026-02-23
What is new:
Админские настройки физически разнесены по отдельным страницам (`Брендинг`, `Доступ и лимиты`, `Система`, `Оформление`, `PWA и push`, `Звонки/диагностика`, `База данных`) при сохранении общего бокового меню.
Переходы в меню настроек теперь открывают соответствующий экран, а не просто переключают внутренние блоки в одном и том же URL.
Внутри `PWA и push`, `Оформление`, `Доступ и лимиты`, `Звонки и диагностика` сохранён второй уровень навигации для быстрого доступа к подпунктам.
Technical:
В `index.php` добавлены route-level страницы настроек (`settings_admin_*`) с capability-gates через `admin.settings`; legacy `admin_settings` сохранён и перенаправлен в режим `Брендинг` внутри общего шаблона.
В `views/admin_settings.php` реализована route-aware навигация: единый шаблон использует разные `action`/initial section в зависимости от текущего settings-route и корректно обрабатывает hash-переходы (`#pwa-notify-admin`, подпункты PWA и др.).
Обновлены ссылки из админских экранов (`Хранилище проекта`, управление новостями) на новую структуру настроек (`settings_admin_branding`).
v3.5.17
2026-02-23
What is new:
Hotfix страницы `Настройки`: пункты бокового меню снова выглядят как кнопки (без подчёркиваний) и заполняют всю ширину колонки.
На desktop видимый раздел настроек теперь растягивается на всю доступную ширину правой панели (как `WebRTC`), а не остаётся половинной карточкой.
На мобильных пересобрано боковое меню настроек: вертикальный стек + корректные подпункты без уезда вправо; нижняя панель сохранения больше не растягивает страницу.
Technical:
В `views/admin_settings.php` для `.admin-settings-side-btn` добавлены `display:block` и `text-decoration:none`, что устраняет регресс после перевода пунктов меню в `<a>`.
В JS-section режиме добавлен CSS override для `.js-settings-block.is-visible` внутри `.row`: `flex-basis/max-width:100%` (исправлен конфликт с Bootstrap `col-lg-6`).
Стабилизирована mobile-вёрстка меню и savebar: вертикальные sublists, wrap/savebar, защита от горизонтального overflow.
v3.5.18
2026-02-23
What is new:
Hotfix страницы `Настройки`: в разделе `База данных` убрана лишняя горизонтальная линия перед карточкой блока.
Нижняя панель сохранения (`Сохраняются все изменённые поля...`) теперь подстраивается под тему оформления и остаётся читаемой в светлой и тёмной темах.
Technical:
В `views/admin_settings.php` удалён лишний `<hr class=\"my-4\">` перед блоком `settings-db`.
Стили `admin-settings-savebar` переведены с жёстко тёмного фона (`rgba(20,22,30,...)`) на theme-aware фон через Bootstrap CSS variables (`--bs-body-bg-rgb`, `--bs-body-color`, `--bs-border-color-translucent`).
v3.6.0
2026-02-23
What is new:
Начат рефакторинг связки `Профиль / Контакты / Мессенджер`: на всех трёх экранах добавлен единый переключатель разделов (Social Hub) и явное описание роли каждого раздела.
`Профиль` теперь явно позиционируется как публичная страница пользователя (посты, медиа, страницы, друзья), `Контакты` — как каталог и управление связями, `Мессенджер` — как диалоги/вложения/звонки.
Визуально выровнены шапки и поверхности этих разделов: общие панели, кнопки-переключатели и единый стиль верхнего блока.
Technical:
Добавлен reusable partial `views/partials/social_suite.php` (единый CSS для Social Hub: header/switcher/surfaces/role-map chips).
`views/profile.php`, `views/contacts.php`, `views/chat.php` подключены к `social_suite` и получили общий navigation shell без вмешательства в критичную mobile-геометрию композера мессенджера.
Функциональные границы модулей зафиксированы в UI-текстах и cross-links, чтобы снизить дублирование сценариев между `Контактами` и `Мессенджером` без ломки backend-логики.
v3.6.1
2026-02-23
What is new:
Следующий шаг по связке `Контакты / Мессенджер`: в мессенджере блок `Быстрый старт` теперь показывает только контакты пользователя, а полный каталог вынесен в раздел `Контакты`.
В настройках исправлено выравнивание раздела `База данных`: карточка блока больше не поднимается выше меню слева.
Навигация настроек стала понятнее по смыслу: `Внешний вид профиля` (личное) и `Внешний вид сайта` (глобальный дизайн) вместо размытого дублирования `Внешний вид`/`Оформление`.
Technical:
В `views/chat.php` удалено дублирование каталога пользователей внутри мессенджера: список `Начать чат` переведён на `contacts_list($me_id)` + ссылка в `index.php?r=contacts`.
В `views/admin_settings.php` выровнен db-блок (`settings-db`) относительно общего grid/меню и обновлены подписи/подразделы блока дизайна (`ui/notify`) для разделения личных и глобальных настроек.
Убран лишний неиспользуемый `$users = users_list_basic()` из `views/chat.php`.
v3.6.2
2026-02-23
What is new:
Убран лишний `Social Hub` с экранов `Профиль / Контакты / Мессенджер`: переключение между разделами остаётся в основном меню, интерфейс снова стал компактнее.
В `Мессенджере` закреплена роль экрана: только активные диалоги и общение. Новый чат создаётся через раздел `Контакты`.
В настройках подправлена визуальная логика: db-блок выровнен относительно меню, а дизайн-настройки разведены по смыслу (`Внешний вид профиля` vs `Внешний вид сайта`).
Technical:
Удалён временный partial `views/partials/social_suite.php` и его подключения из `views/profile.php`, `views/contacts.php`, `views/chat.php` (откат лишнего UI-слоя без влияния на backend).
В `views/chat.php` удалён дублирующий сценарий старта чатов из списка пользователей/контактов: оставлен переход в `index.php?r=contacts` и история активных диалогов.
В `views/admin_settings.php` сохранён route-level Android-style settings, но доработаны подписи и визуальное выравнивание `settings-db`.
v3.6.3
2026-02-23
What is new:
Следующий шаг по связке `Контакты / Мессенджер`: в карточках пользователей на странице `Контакты` добавлены явные действия `Написать` и `Позвонить`.
Мессенджер очищен от каталоговых элементов: в боковой панели оставлены только активные диалоги, без блока быстрого старта/списков людей.
Переход на звонок из `Контактов` сразу открывает нужный диалог в мессенджере и запускает сценарий звонка.
Technical:
`index.php` (`chat_start` и `chat?start=`) теперь прокидывает `call=1` в итоговый URL диалога, чтобы из внешних экранов можно было запускать звонок напрямую.
В `views/contacts.php` унифицированы action-кнопки карточек (`Написать` / `Позвонить`) для списка контактов и каталога пользователей.
В `views/chat.php` удалён нижний блок `Новый диалог`, чтобы мессенджер нёс только роль истории диалогов + активного чата.
v3.6.4
2026-02-23
What is new:
Дожат интерфейс мессенджера под единый стиль с `Контактами`: обновлены список диалогов, шапка диалога и composer (кнопки, границы, поверхности, типографика).
Список диалогов стал визуально ближе к карточкам контактов: более ровные поверхности, одинаковая логика hover/active, читаемые превью и время.
Composer получил более аккуратный визуал (theme-aware фон, акцентная отправка, мягкие кнопки emoji/вложений) без изменения поведения ввода.
Technical:
Изменения сделаны только в `views/chat.php` на уровне CSS/визуальных состояний (`chat-dialog-item`, `chat-dialog-head`, `chat-inputbar`, action-buttons).
Мобильная геометрия ввода/клавиатуры (`fixed/sticky/viewport` логика, fullscreen layout цепочка) не изменялась, чтобы не вернуть iPhone-баг с \"подбородком\".
Верхняя панель мессенджера получила более стабильные mobile/desktop стили кнопок действий (`page-actions`) без вмешательства в маршруты и JS.
v3.6.5
2026-02-23
What is new:
Мессенджер получил второй visual-pass: доработаны карточки диалогов, шапка активного диалога, кнопки действий и composer для более цельного и лёгкого вида.
В списке диалогов добавлена компактная CTA-кнопка `Контакты` в шапке списка и более полезное пустое состояние с переходом в `Контакты`.
Плотность (`telegram / compact / roomy`) заметнее влияет не только на bubble, но и на список диалогов, шапку и кнопки мессенджера.
Technical:
В `views/chat.php` расширен UI-only CSS слой (polish pass 2): `chat-list-headbar`, `chat-dialog-item`, `chat-dialog-head`, `chat-head-btn`, `chat-compose-btn` и density overrides.
Добавлены только безопасные классы/микроразметка в `views/chat.php` (CTA в списке диалогов, классы кнопок) без изменения маршрутов, логики сообщений и звонков.
Мобильная keyboard-layout логика (`chat-composer-shell`, fullscreen/viewport поведение) не изменялась, чтобы не вернуть iPhone-bug с `подбородком`.
v3.6.6
2026-02-23
What is new:
Hotfix iPhone/PWA уведомлений: системная строка `from ...` теперь берёт бренд из настроек (`Название в шапке` → `Название сайта`), а не из старого захардкоженного `TSOY.CLOUD`.
PWA meta-теги (`application-name`, `apple-mobile-web-app-title`) синхронизированы с брендингом проекта, чтобы имя приложения и имя в уведомлениях совпадали.
Technical:
В `index.php` добавлен route `manifest`, который отдаёт динамический Web App Manifest на основе текущих настроек брендинга (`site_header_name` / `site_name`).
В `views/partials/head.php` `<link rel=\"manifest\">` переведён на динамический route с cache-bust (`APP_VERSION` + hash бренда); `application-name` и `apple-mobile-web-app-title` переведены на приоритет `site_header_name`.
В `service-worker.js` и `public/service-worker.js` fallback title уведомлений заменён с `TSOY.CLOUD` на нейтральный `Уведомление` (с поддержкой `src.appTitle`), чтобы убрать скрытый хардкод.
v3.6.7
2026-02-23
What is new:
Исправлен мобильный overflow окна `Диалоги` в мессенджере: карточка списка диалогов больше не вылезает за ширину экрана на iPhone/смартфонах.
Стабилизирована ширина mobile-раскладки мессенджера без изменений логики клавиатуры и без риска вернуть баг с `подбородком`.
Technical:
В `views/chat.php` для mobile добавлен точечный фикс ширины: убраны отрицательные отступы `row g-3` (Bootstrap gutter overflow) и зажаты `#chatListPane`/карточка/тело списка в `max-width:100%`.
Изменение ограничено CSS-слоем страницы чата; fullscreen/composer/`visualViewport` логика не изменялась.
v3.6.8
2026-02-23
What is new:
Ускорена отправка сообщений в мессенджере: сообщение появляется заметно быстрее после нажатия `Отправить`, без ощущения паузы в 2–3 секунды.
Повышена плавность UX при отправке: сервер отдаёт ответ чату сразу, а push-уведомления больше не держат отправку сообщения.
Technical:
В `index.php` (`chat_send_async`) push для нового сообщения переведён в queue-first режим: уведомление ставится в очередь без синхронной отправки (`sendNow=false`).
HTTP-ответ `chat_send_async` теперь завершается до фоновой попытки dispatch push (`fastcgi_finish_request` / flush), чтобы Web Push не блокировал отображение сообщения.
В `app/push.php` `push_notify_chat_message(...)` получил параметр `$sendNow` (по умолчанию `true`) для безопасного управления sync/async поведением без ломки остальных вызовов.
v3.6.9
2026-02-23
What is new:
Подготовлен серверный фундамент чата для больших историй переписки (сотни тысяч/миллионы сообщений) без изменения привычного интерфейса.
Список диалогов и polling чата стали легче для сервера за счёт оптимизации хранения unread-состояния и индексов под крупные переписки.
Technical:
В `conversations` добавлены денормализованные unread-счётчики (`u1_unread_count`, `u2_unread_count`) и метаданные последнего сообщения (`last_message_id`, `last_message_preview`).
В `app/chat.php` `message_send()` / `conversation_mark_read()` обновляют unread-счётчики диалога; `message_delete_for_me()` и `conversation_clear_for_me()` синхронизируют их через пересчёт/сброс.
`conversations_for_user()` больше не выполняет тяжёлый `COUNT(*)` unread для каждого диалога, если денормализованные счётчики уже доступны (используется `COALESCE(..., legacy COUNT)` как fallback для апгрейдов).
Добавлены chat-индексы для крупных историй: `conversations(user1_id,last_message_at)`, `conversations(user2_id,last_message_at)`, `messages(conversation_id,id)`, visible-индексы по `deleted_by_u1/u2`, индекс unread по `messages(conversation_id,is_read,id)`.
В `chat_messages_poll` убран лишний `mark_read`-UPDATE при пустом poll-ответе, что снижает шумовые записи в БД на активных вкладках.
v3.6.10
2026-02-23
What is new:
Полиш страницы `Контакты`: действия `Написать`, `Позвонить`, `Удалить` в карточках заменены на компактные иконки (конверт, трубка, корзина) для более чистого интерфейса.
Сохранены подсказки (`title`) и `aria-label`, чтобы UX остался понятным и доступным на ПК и мобильных устройствах.
Technical:
В `views/contacts.php` добавлены `contacts-actions` и `contacts-action-icon` (theme/density-friendly размеры икон-кнопок), заменена текстовая разметка кнопок в списке `Мои контакты` и `Каталог пользователей`.
Логика маршрутов и действий (`chat_start`, `chat_start&call=1`, add/remove contact) не изменялась.
v3.6.11
2026-02-23
What is new:
Доведён UI действий в `Контактах`: кнопка `В контакты` заменена на иконку `человек+`, чтобы все действия в карточках были в одном визуальном языке.
Заголовок `Каталог пользователей` и кнопка `Найти` теперь находятся в одной строке, поле поиска вынесено отдельно ниже на полную ширину.
Technical:
В `views/contacts.php` кнопка добавления контакта переведена на `bi-person-plus` с `title`/`aria-label`; сохранена существующая POST-логика `action=add`.
Поиск в каталоге использует `form=\"contactsSearchForm\"` у кнопки `Найти`, чтобы держать правильную desktop/mobile компоновку без изменения backend-маршрута `contacts`.
v3.6.12
2026-02-23
What is new:
Системные файлы проекта (логотип, favicon, кастомные звуки уведомлений/звонка и служебные ассеты спец-регистрации) переведены в единую системную папку `public/system/...`.
Старые пути (`public/branding`, `public/sounds`, `public/friend_register`) автоматически и мягко переносятся в новую системную структуру при запуске приложения.
Technical:
Добавлен `app/system_assets.php`: единый helper для системных ассетов (безопасное сохранение upload-файлов, удаление только из разрешённых системных директорий, миграция legacy-путей).
В `index.php` (`admin_settings`) загрузка логотипа, favicon и кастомных рингтонов переведена на `system_assets_store_upload(...)` с хранением в `public/system/branding` и `public/system/sounds`.
В `index.php` (`admin_friend_register`) картинка кошки-говешки переведена в `public/system/friend_register` с очисткой старого файла при замене/удалении.
После `ensure_schema()` вызывается `system_assets_migrate_known_settings()`, который мигрирует пути из `settings` и конфигов friend-registration в новую системную папку (best-effort, без ломки старых ссылок при ошибке переноса).
v3.6.13
2026-02-23
What is new:
В настройках переработан раздел `Внешний вид`: вместо разрозненных пунктов `Внешний вид профиля` и `Внешний вид сайта` появился единый раздел `Внешний вид` с подпунктами (профиль / сайт / стиль уведомлений).
Для глобального оформления сайта добавлены готовые профили внешнего вида (несколько пресетов под разные сценарии: чистый, рабочий, чтение, мягкий, ночной, psychedelic).
Шрифтовые пресеты пересмотрены с упором на кириллицу: добавлены/обновлены Manrope, PT Sans, Rubik и IBM Plex Sans.
Technical:
Добавлен helper `ui_appearance_profiles()` в `app/bootstrap.php` с готовыми профилями оформления и пакетами значений для `ui_*` настроек.
В `views/admin_settings.php` объединена навигация дизайна в один top-level `Внешний вид`, добавлен UI выбора/подстановки профиля оформления и обновлены кириллические шрифтовые опции.
В `views/partials/head.php` подключены кириллические web-fonts (Manrope/PT Sans/Rubik/IBM Plex Sans) и добавлен новый шрифтовой пресет `plex`.
В `index.php` и `ui_config()` расширена валидация/сохранение (`ui_font_family=plex`, `ui_appearance_profile`).
v3.6.14
2026-02-23
What is new:
Исправлен UX профиля: кнопка `Написать` больше не отображается на собственной карточке профиля.
У вложений постов в обычном просмотре убраны кнопки `Удалить`: удаление доступно только в режиме редактирования поста.
Technical:
В `views/profile.php` кнопка перехода в чат скрыта для `is_self`.
Из обычного рендера вложений в `views/profile.php` удалены формы `post_attachment_delete`; удаление оставлено в edit-блоке (`js-del-att`).
v3.6.15
2026-02-23
What is new:
В личном разделе `Настройки -> Внешний вид` добавлены персональные режимы основного бокового меню: `показывать всегда`, `скрывать всегда`, `по кнопке`.
Для публичной страницы профиля добавлена персональная настройка вида для гостей: `показывать боковое меню`, `скрывать боковое меню`, `скрывать боковое меню и шапку сайта`.
Настройки работают индивидуально для каждого профиля-пользователя (каждый `user` настраивает внешний chrome под себя).
Technical:
В `users` добавлены персональные UI-поля `ui_sidebar_mode` и `guest_profile_chrome_mode` (миграции в `app/migrations.php`).
В `index.php` (`settings`) сохранение пользовательских настроек расширено: добавлен `user_update_ui_prefs(...)` и синхронизация значений в session snapshot.
В `views/layout.php` переработана логика показа desktop sidebar / offcanvas / topbar с учётом персонального режима меню и режима публичного профиля для гостей.
v3.6.16
2026-02-23
What is new:
В мессенджере добавлено контекстное меню сообщения по правой кнопке мыши и по удержанию на мобильных устройствах.
Меню действий сообщения теперь включает `Изменить`, `Удалить`, `Цитировать` и `Реакция` (с выбором emoji).
Под сообщениями отображаются emoji-реакции с количеством; свою реакцию можно быстро переключать повторным нажатием.
Technical:
Добавлена таблица `message_reactions` (MySQL/SQLite) и миграции/индексы в `app/migrations.php`.
В `app/chat.php` добавлены batch-подгрузка реакций для пачек сообщений (`chat_messages_payload_for_client`) и `message_reaction_toggle(...)`.
В `index.php` добавлен JSON-route `chat_reaction_toggle`; polling/send-ответы чата теперь отдают реакции вместе с сообщениями.
В `views/chat.php` переиспользован существующий dropdown сообщений для right-click/long-press без изменения mobile keyboard/composer геометрии.
v3.6.17
2026-02-23
What is new:
В мессенджере у сообщений добавлена маленькая галочка статуса прочтения (`прочитано / не прочитано`).
Галочка отображается у ваших сообщений и обновляется в диалоге автоматически, когда собеседник читает чат.
Technical:
В `app/chat.php` в payload сообщений добавлен `is_read`, а также helper `conversation_last_read_sent_message_id(...)` для лёгкого read-receipt sync.
В `chat_send_async` и `chat_messages_poll` (`index.php`) добавлен `read_upto_own_id`, чтобы фронт мог обновлять статусы уже отрисованных сообщений без перезагрузки.
В `views/chat.php` добавлен компактный read-state UI (галочка) и JS-обновление статуса прочтения через polling.
v3.6.18
2026-02-23
What is new:
В контекстное меню сообщения мессенджера добавлен пункт `Будильник` (пинг-напоминание).
Будильник доступен для ваших сообщений и отправляет повторное уведомление собеседнику только если сообщение ещё не прочитано.
Technical:
Добавлен route `chat_message_nudge` в `index.php` с проверками: сообщение принадлежит текущему пользователю, находится в этом диалоге и ещё не прочитано.
В `app/push.php` добавлен `push_notify_chat_message_reminder(...)` с отдельным типом `chat_nudge` и dedupe tag по сообщению.
В `views/chat.php` пункт меню `Будильник` встроен в existing dropdown, автоматически отключается для чужих/прочитанных сообщений и показывает toast-результат.
v3.6.19
2026-02-23
What is new:
Начато внедрение голосовых сообщений в мессенджер: добавлена красная кнопка микрофона и аккуратное окно записи.
Голос записывается прямо в браузере/на устройстве и прикрепляется к сообщению как аудио-вложение.
Аудио-вложения (включая голосовые) теперь можно слушать прямо в чате через встроенный плеер.
Technical:
В `views/chat.php` добавлены voice-recorder modal, UI состояния записи и интеграция с `MediaRecorder` (MVP) без изменения keyboard/fullscreen геометрии чата.
Записанный blob прикрепляется через существующий `chatFileInput` (`DataTransfer`) и уходит в уже существующий backend upload flow `chat_send_async` / `message_send`.
Добавлен глобальный preloader при загрузке страниц сайта: пользователь видит аккуратный индикатор загрузки вместо “пустого” экрана.
Для PWA добавлен отдельный режим preloader `Идёт установка приложения…` при установке через системную кнопку.
Preloader также включается при переходах по страницам и при отправке формы установки сайта (`install.php`).
Technical:
В `views/partials/head.php` добавлен theme-aware overlay `#tsoyPreloader` (общий для сайта и установщика), работающий в светлой/тёмной теме без жёстко тёмного фона.
В `views/partials/scripts.php` добавлен runtime `window.__TSOY_PRELOADER` (show/hide/set) с автоскрытием после загрузки, показом на внутренних переходах и submit-формах (кроме AJAX submit с `preventDefault`).
PWA install flow (`beforeinstallprompt`) теперь включает состояние `pwa-install`; `appinstalled` закрывает overlay и показывает toast об успешной установке.
v3.6.21
2026-02-23
What is new:
Исправлено переключение разделов в настройках: секции теперь открываются без ощущения полной перезагрузки страницы.
В `Контактах` длинные имена пользователей больше не раздвигают и не перестраивают иконки действий: текст ужимается/переносится внутри текстовой зоны, а кнопки остаются на месте.
В шапке диалога `Мессенджера` зафиксирован блок кнопок справа (`Ссылка / Звонок / Очистить`), длинные имена больше не выталкивают кнопки и не ломают компоновку.
Technical:
В `views/admin_settings.php` клики по боковому меню настроек переведены на client-side section switch (`history.pushState`) вместо обязательной навигации по `settings_admin_*` route; `form action` динамически переключается по секции, поэтому сохранение остаётся корректным.
В `views/contacts.php` добавлены отдельные классы текстовой зоны (`contacts-person-*`), `contacts-actions` переведён в `nowrap`/`flex-shrink:0`, а длинные имена ограничены в 1–2 строки без сдвига иконок.
В `views/chat.php` шапка активного диалога усилена правилами `nowrap` для `chat-head-actions` и ellipsis для имени собеседника, без изменения mobile keyboard/composer геометрии.
v3.6.22
2026-02-23
What is new:
Hotfix preloader: убран автопоказ на каждый внутренний клик, поэтому переключение секций настроек и переходы между чатами больше не должны “подвисать” из-за overlay.
Preloader сохранён там, где он реально полезен: первичная загрузка страницы, установка сайта и установка PWA.
Technical:
В `views/partials/scripts.php` глобальный preloader переведён в explicit-flow режим: отключён автоперехват всех внутренних ссылок и обычных submit-форм.
Автопоказ preloader оставлен только для `install.php` submit и для форм с `data-preloader=\"1\"`; PWA install flow (`beforeinstallprompt`) сохранён отдельно.
Удалён неиспользуемый helper распознавания внутренних ссылок после сужения области применения preloader.
v3.6.23
2026-02-23
What is new:
В `Профиле` длинные тексты в карточках друзей/страниц и в постах ведут себя аккуратнее: текст ужимается/переносится внутри своей зоны и не ломает действия/бейджи.
В `install.php` добавлена мини-анимация этапов установки (БД → миграции → админ → готово) с синхронизацией текста в preloader.
В `Мессенджере` добавлен мобильный режим `удерживай для записи`: зажмите кнопку микрофона, отпустите — запись остановится и прикрепится к сообщению.
После записи голосового в composer теперь появляется компактное предпрослушивание (мини-аудиоплеер), а аудио-плееры в сообщениях стали компактнее.
Technical:
В `views/profile.php` добавлены clamp/overflow правила для карточек друзей/страниц и фикс action-зон в постах, чтобы длинные строки не выталкивали элементы интерфейса.
В `install.php` реализован submit-time stepper без изменения backend-логики: этапы анимируются на клиенте и обновляют `__TSOY_PRELOADER` в режиме `install-site`.
В `views/chat.php` расширен voice recorder: touch long-press (`push-to-talk`) на mobile, авто-прикрепление записи после отпускания, compact composer attachment preview для `audio/*` (включая голосовые).
В `views/chat.php` уменьшена ширина встроенного аудио-плеера в сообщениях для более плотного mobile/desktop UI.
v3.6.24
2026-02-23
What is new:
Hotfix preloader: страницы `Профиль` и `Мессенджер` открываются заметно быстрее, overlay загрузки больше не ждёт долго все картинки/медиа.
Preloader теперь скрывается на этапе готовности DOM, а не только после полного `window.load`.
Technical:
В `views/partials/scripts.php` логика initial preloader boot переведена на `DOMContentLoaded`/`interactive` + `requestAnimationFrame`, чтобы не блокировать UI на медиа-насыщенных страницах.
`window.load` и `pageshow` оставлены только как fallback-сигналы; добавлен hard fail-safe timeout на случай странных браузерных зависаний событий.
v3.6.25
2026-02-23
What is new:
Hotfix голосовых сообщений: голосовые `.webm` в мессенджере теперь отображаются плеером, а не только ссылкой на файл.
Фикс работает и для уже отправленных голосовых (по имени `voice_message_*`), и для новых записей.
Technical:
В `app/files.php` добавлена нормализация MIME для browser voice-notes (`voice_message_*`), чтобы `.webm/.ogg/.m4a` не сохранялись как generic/video MIME.
В `app/chat.php` добавлен helper `chat_file_is_audio_like(...)`, а payload чата теперь отдаёт `file_is_audio` для корректного client render старых и новых голосовых.
В `views/chat.php` server-side и polling-render плеера переведены на `file_is_audio` / smart audio-detection вместо строгой проверки только `audio/*`.
v3.6.26
2026-02-23
What is new:
На главной странице блок недавних файлов больше не растягивает экран вниз: по умолчанию показываются первые 3 файла.
Остальные файлы открываются кнопкой `Показать ещё файлы` (порциями по 3), как в разделе новостей.
Technical:
В `views/home.php` лента файлов переведена на существующий механизм `data-load-more-root` из `views/layout.php` без добавления нового JS-кода.
Для элементов файлов добавлено серверное начальное скрытие (`d-none`) после первых 3 записей, чтобы список был компактным сразу при рендере страницы.
v3.6.27
2026-02-23
What is new:
Hotfix голосовых сообщений в мессенджере: voice-notes отображаются компактной одной строкой без второй строки с именем файла.
Визуал голосового сообщения стал тоньше и аккуратнее, ближе к обычной строке сообщения.
Technical:
В `views/chat.php` voice-note рендер (`voice_message_*`) уже использует отдельный inline-layout без file-link; в релиз включён hotfix компактности CSS (`.chat-voice-inline-row`, `.chat-audio-clip.is-voice-note`).
Серверный и polling JS рендеры голосовых сообщений синхронизированы: для voice-notes не выводится отдельная строка имени файла.
v3.6.28
2026-02-23
What is new:
Голосовые сообщения в мессенджере: один тап по микрофону запускает запись, повторный тап останавливает запись и сразу отправляет голосовое.
Если запись не удалось отправить автоматически, голосовое остаётся прикреплённым в composer и можно отправить вручную.
Technical:
В `views/chat.php` обычный click/tap микрофона переведён на toggle-логику записи (`start/stop+auto-send`) без изменения mobile composer/fullscreen геометрии.
Добавлен helper программной отправки через существующий async submit (`chat_send_async`) после авто-прикрепления voice blob в composer.
v3.6.29
2026-02-23
What is new:
Голосовые сообщения в чате теперь воспроизводятся одинаково на ПК и телефоне: компактной одной кнопкой play/pause.
У voice-note больше нет зависимости от урезанных native audio-controls браузера на десктопе.
Technical:
В `views/chat.php` voice-notes (`voice_message_*`) переведены на custom mini-player (кнопка + hidden audio) в server-side и polling-render.
Добавлена JS-делегация управления воспроизведением (play/pause, синхронизация иконки, автопауза предыдущего голосового).
v3.6.30
2026-02-23
What is new:
В `Настройки -> Внешний вид` добавлены персональные настройки preloader: режим (`умный / только установка-PWA / выключить`), компактный вид и показ текста.
Preloader теперь можно настроить под себя по каждому профилю аккаунта (профиль = отдельный user).
Technical:
В `users` добавлены персональные UI-поля preloader (`ui_preloader_mode`, `ui_preloader_compact`, `ui_preloader_show_text`) с загрузкой в session snapshot и применением в `views/partials/scripts.php`.
В `views/partials/head.php` добавлены вариации preloader (`compact`, скрытие текста), а runtime учитывает пользовательский режим без ломки install/PWA сценариев.
v3.6.31
2026-02-23
What is new:
Hotfix голосовых сообщений на телефоне: mini-player voice-note снова стабильно воспроизводится по тапу.
Поведение mini-player синхронизировано для mobile/desktop (play/pause одной кнопкой).
Technical:
В `views/chat.php` для voice mini-player добавлен mobile-safe `touchend` handler с подавлением дубля `click`, чтобы iPhone/Safari не терял тап.
Скрытый `<audio>` переведён с `display:none` на visually-hidden класс; добавлен `audio.load()` перед `play()` для лучшей совместимости мобильных браузеров.
v3.6.32
2026-02-23
What is new:
В Брендинге добавлена отдельная настройка `Иконка PWA` (опционально) для установленного приложения.
Если PWA-иконка не задана, приложение теперь использует `favicon`, а затем `лого` как fallback.
Technical:
Route `index.php?r=manifest` теперь динамически подменяет `icons` (и shortcut icons) из настроек брендинга вместо жёстких `/public/icons/...`.
В `views/partials/head.php` `apple-touch-icon` переведены на динамический PWA icon с cache-bust, а `manifest` cache-bust учитывает смену иконки.
v3.6.33
2026-02-23
What is new:
В PWA исправлен просмотр файлов: теперь файл открывается во встроенной странице-просмотрщике с кнопкой `Назад`, а не “захватывает” приложение без пути назад.
Кнопка `Открыть` в файловом проводнике тоже использует этот встроенный просмотр в standalone/PWA.
Technical:
Добавлен route `index.php?r=file_viewer` с безопасной проверкой доступа к файлу и возвратом по `back` URL.
В `views/partials/scripts.php` добавлен standalone-PWA перехват ссылок `index.php?r=view&id=...` с перенаправлением во встроенный просмотрщик вместо raw-file response.
v3.6.34
2026-02-23
What is new:
Hotfix mini-плеера голосовых на телефоне: воспроизведение по тапу снова стабильно запускается.
Поведение mini-player выровнено между iPhone/Android и ПК (одна кнопка play/pause).
Technical:
В `views/chat.php` mini-player получил прямые обработчики `touchend/click` на кнопке (а не только делегирование через контейнер сообщений) с защитой от двойного срабатывания.
Убран рискованный pre-play `audio.load()` как основной путь; добавлен fallback reload только при ошибке `play()`.
v3.4.0
2026-02-23
What is new:
Добавлены полноценные push-уведомления на устройство (через Web Push + Service Worker) для сценариев, когда сайт/PWA закрыт.
Push-уведомления теперь приходят по ключевым событиям: сообщения, входящие звонки/приглашения в звонок, лайки постов, комментарии и добавления в друзья.
В звонках добавлен индикатор качества связи (RTT, джиттер, потери, битрейт) с понятной оценкой состояния соединения.
Улучшена стабильность звонков: при проблемах соединения клиент мягко инициирует переподключение и показывает статус «переподключение».
Technical:
Добавлен `app/push.php`: VAPID-ключи (автогенерация), подписки Web Push, очередь уведомлений, payloadless Web Push dispatch и pull-механизм для SW.
В `app/migrations.php` добавлены таблицы `push_subscriptions` и `push_queue` (MySQL/SQLite) с индексами для подписок и очереди доставки.
В `index.php` добавлены маршруты `push_subscribe`, `push_unsubscribe`, `push_pull`; ключевые действия (chat/call/like/comment/friend) теперь ставят события в push-очередь и триггерят доставку.
В `views/partials/scripts.php` добавлена синхронизация `PushManager`-подписки с настройкой `notify_desktop`, а в Service Worker (`service-worker.js` и `public/service-worker.js`) реализован payloadless push -> `push_pull` -> `showNotification`.
В `views/chat.php` добавлен `getStats()`-мониторинг качества WebRTC и UI-индикатор без изменения mobile composer/keyboard-геометрии (чтобы не вернуть баг с “подбородком”).
v3.4.1
2026-02-23
What is new:
Исправлено мобильное открытие окна вложений в мессенджере: attach-модалки/проводник теперь открываются поверх fullscreen-чата.
Меню профиля/переключения мультипрофилей в мобильной шапке больше не уезжает влево: dropdown центрируется по viewport.
Technical:
В `views/chat.php` поднят z-index attach-модалки и file-picker-модалки над mobile chat pane (`z-index: 2100`) и добавлена маркировка backdrop (`chat-over-chat-backdrop`).
В `views/chat.php` усилен mobile-open handler клипсы (`pointerup` + `touchend` + click guard), чтобы не терялись тапы в fullscreen-мессенджере.
В `views/partials/head.php` и `views/layout.php` добавлен mobile-centered режим для `topbar-profile-menu` (fixed + вычисляемый `top` на `show.bs.dropdown`).
v3.4.2
2026-02-23
What is new:
Исправлена навигация по клику на уведомления: уведомления теперь корректно открывают источник (чат, календарь, профиль/пост и т.д.) в браузере и PWA.
Technical:
В `views/partials/scripts.php` `__tsoyNavigateFromNotification()` переведён на резолв ссылок через `appBasePath`, а fallback `Notification.onclick` теперь использует тот же навигатор.
В `service-worker.js` / `public/service-worker.js` `notificationclick` теперь резолвит `data.url` относительно `self.registration.scope` (а не `origin`), что исправляет deep-link в установках не в корне сайта.
v3.4.3
2026-02-23
What is new:
Уведомления стали информативнее: для новых сообщений показываются имя отправителя и фрагмент текста.
Для входящих звонков в уведомления добавлены действия «Принять» и «Отклонить» (там, где это поддерживает браузер/устройство).
Technical:
В `notif_poll` добавлен preview последнего непрочитанного сообщения (`sender/body/url`), а клиентский polling в `views/partials/scripts.php` использует его для desktop-уведомлений и toast.
В `app/push.php` расширен payload Web Push: поддержка `data` и `action_urls`, а `push_notify_incoming_call()` теперь отправляет actions (`accept/close`) и URL принятия звонка.
v3.4.4
2026-02-23
What is new:
В дашборде (`Настройки`) добавлен отдельный блок настроек уведомлений: цвет, оформление toast/desktop-уведомлений, рингтон уведомлений и отдельный рингтон входящего звонка.
Добавлен блок `PWA и обновления`: политика обновления (manual/notify/auto), интервал проверки Service Worker, автозапрос persistent storage и toast-оповещения об обновлении PWA.
В открытом приложении входящий звонок теперь использует настраиваемый рингтон (если у пользователя включён звук уведомлений).
Technical:
Добавлены новые ключи настроек в `app/settings.php`; сохранение/валидация реализованы в `index.php` (`admin_settings`).
В `views/layout.php` новые настройки прокидываются в `window.__TSOY_NOTIFY` (`ui/sounds/pwa`) для runtime-слоя.
В `views/partials/scripts.php` улучшен PWA update flow: регистрация SW с учётом `appBasePath`, настраиваемый интервал `update()`, политика auto/notify/manual и методы `__TSOY_PWA_RUNTIME.checkForUpdates/applyUpdate/getUpdateState`.
В `views/partials/scripts.php` добавлены пресеты синтезируемых звуков уведомлений и рингтона звонка, а также стилизация toast/desktop notification по админ-настройкам.
v3.4.5
2026-02-23
What is new:
В настройках уведомлений добавлена загрузка своих рингтонов: отдельно для обычных уведомлений и отдельно для входящего звонка.
В админке можно прослушать загруженные рингтоны прямо в разделе настроек и удалить их при необходимости.
Technical:
Добавлены настройки `notify_sound_custom_path` и `notify_call_sound_custom_path`, а в `admin_settings` реализована загрузка аудиофайлов в `public/sounds`.
Во фронтенде (`views/layout.php` + `views/partials/scripts.php`) runtime уведомлений получил поддержку кастомных аудио-файлов с fallback на синтезированные звуки, если браузер блокирует воспроизведение.
v3.5.0
2026-02-23
What is new:
Стабилизационный релиз: проведён общий cleanup проекта, снижён шум от временных артефактов и улучшена предсказуемость работы уведомлений/PWA-настроек.
В настройках уведомлений доработана работа со своими рингтонами: при замене старые файлы корректно очищаются, а слишком большие файлы не принимаются.
Technical:
Удалены временные каталоги восстановления/аудита (`tmp_*`) из рабочей директории, которые засоряли поиск и увеличивали накладные расходы проверок.
В `scripts/check-encoding.ps1` добавлено универсальное исключение для временных каталогов `tmp_*`, чтобы сборочные проверки не сканировали техмусор.
В `views/partials/head.php` убран дублирующийся `<link rel=\"icon\">`, а в `views/layout.php` удалены лишние переменные и лишний вызов `ui_config()` для чтения акцента (используется уже загруженный `$ui`).
В `index.php` (`admin_settings`) улучшен lifecycle кастомных рингтонов: безопасное удаление старых файлов в `public/sounds`, защита от path traversal и лимит размера загружаемого рингтона (5 MB).
v3.5.1
2026-02-23
What is new:
Hotfix рингтонов на телефонах: улучшено воспроизведение кастомных рингтонов уведомлений/звонка на мобильных браузерах и PWA.
Technical:
В `views/partials/scripts.php` исправлен баг кастомного рингтона уведомлений: теперь Promise `audio.play()` реально проверяется, и при ошибке срабатывает fallback-звук.
Кастомные рингтоны теперь резолвятся через `appBasePath` (`__tsoyResolveAppUrl`) для корректной работы в установках проекта в подпапке сайта.
Добавлен mobile-safe `audio unlock` по первому взаимодействию пользователя, чтобы повысить шанс воспроизведения звука на iPhone/Android браузерах.
v3.5.2
2026-02-23
What is new:
Усилена надёжность уведомлений: добавлен серверный retry-worker для wake-push доставки с повторными попытками и backoff.
В админке (Настройки -> PWA и обновления) появился блок диагностики push-очереди: количество недоставленных элементов, состояние очереди и статус подписок.
Technical:
В `push_queue` добавлены поля состояния доставки (`dispatch_state`, попытки, backoff, lock, last_error/status) и миграции для MySQL/SQLite.
В `app/push.php` реализованы функции очереди и worker-обработки (`claim/process due`, retry/backoff, статистика очереди).
Добавлен route `index.php?r=push_worker_run` для ручного запуска worker из админки и CLI-скрипт `scripts/push-worker.php` для cron/daemon запуска.
`push_notify_user_event()` теперь сохраняет результат wake-push отправки в очередь, а `push_dispatch_user()` возвращает расширенную статистику для retry-логики.
v3.5.3
2026-02-23
What is new:
Уведомления стали стабильнее при закрытом PWA/сайте: сервер теперь пытается отправлять полноценный Web Push payload (с телом уведомления), а не только wake-push.
Сохранён fallback-режим (`wake-push + push_pull`) для совместимости, если endpoint/браузер не принимает payload.
Technical:
В `app/push.php` добавлена payload-отправка Web Push (`aes128gcm`) с VAPID и шифрованием сообщения на стороне сервера (ECDH + HKDF + AES-128-GCM).
`push_dispatch_user()` теперь умеет отправлять payload в push и возвращает раздельную статистику `payload_sent` / `wake_sent`.
Если payload доставлен без fallback на wake-push, очередь помечается как `delivered_at`, чтобы не было дубля через `push_pull`.
Service Worker (`service-worker.js`, `public/service-worker.js`) стал устойчивее к ошибкам парсинга payload: сначала пытается `json()`, затем `text()+JSON.parse()`, потом fallback на `push_pull`.
v3.5.4
2026-02-23
What is new:
В админке (`Настройки -> PWA и обновления`) добавлена диагностика push-устройств: список подписок, устройство/режим, последний успех доставки и ошибки.
Появилась кнопка `Тест push` для каждого устройства, чтобы быстро проверить доставку уведомлений на конкретную подписку.
Technical:
В `app/push.php` добавлены helper-функции диагностики: `push_subscriptions_admin_list()`, `push_subscription_get()`, `push_subscription_test_send()`.
Добавлен route `index.php?r=push_test_subscription` (admin/settings), который отправляет тестовый push на выбранную подписку и пишет результат в flash.
Тестовая отправка использует payload Web Push с fallback на wake-push, а результат обновляет `last_seen_at`/`last_error` подписки через `push_subscription_touch_result()`.
v3.5.5
2026-02-23
What is new:
Диагностика push-устройств в админке стала практичнее: добавлены фильтры (поиск, active/inactive, только с ошибками).
Для push-подписок появились действия `Отключить / Включить / Удалить` прямо в таблице устройств.
Technical:
В `app/push.php` добавлены admin-helper’ы управления подписками: `push_subscription_set_active()` и `push_subscription_delete_by_id()`, а список подписок получил серверные фильтры (`q`, `only_errors`, `state`).
В `index.php` добавлен route `push_subscription_admin_action` для безопасного управления подписками из админки (POST + CSRF + capability).
В `views/admin_settings.php` блок диагностики push-устройств получил UI-фильтры и действия по подпискам через `formaction`, без конфликта с основной формой настроек.
v3.5.6
2026-02-23
What is new:
Исправлен бренд в уведомлениях: заголовок уведомлений теперь подтягивается из настроек сайта, а не захардкожен как `TSOY.CLOUD`.
В диагностике push-устройств добавлена колонка `Последний тест` (успех/ошибка, режим `payload/wake`, HTTP-код, время).
Technical:
В `app/push.php` добавлен helper `push_app_title()` (с кешем), и серверные push-события/очередь/тестовые уведомления переведены на имя сайта из `settings`.
В `views/layout.php` + `views/partials/scripts.php` runtime уведомлений получил `siteName/siteHeaderName`; browser/PWA fallback notifications и toast теперь используют бренд из настроек.
В `push_subscriptions` добавлены поля `last_test_*` (миграции для MySQL/SQLite), а тестовая отправка подписки сохраняет режим (`payload`/`wake`) и результат в БД.
v3.5.7
2026-02-23
What is new:
В диагностике push-устройств добавлена статистика реальных доставок по подписке: `payload`, `wake`, `wake fallback`, `errors` (накопительно, с последнего сброса).
Добавлены кнопки сброса статистики доставок: для одной подписки и для всех подписок сразу.
Заголовок уведомлений теперь стабильно берётся из настроек сайта (брендинг) и для серверных push, и для клиентских fallback-уведомлений.
Technical:
В `push_subscriptions` добавлены поля `push_stat_*` и миграции для MySQL/SQLite; реальные отправки в `push_dispatch_user()` записывают статистику по подписке (`payload/wake/fallback/error`).
В `app/push.php` реализованы helper’ы `push_subscription_delivery_stats_record()` и `push_subscription_delivery_stats_reset()`.
В `index.php` добавлен admin-route `push_subscription_stats_reset`, а в `views/admin_settings.php` — отображение статистики и кнопки сброса.
В `app/push.php` + `views/layout.php` + `views/partials/scripts.php` уведомления переведены на бренд из `settings` через `push_app_title()` и runtime helper `__tsoyNotifyTitle()`.
v3.5.8
2026-02-23
What is new:
Hotfix уведомлений: название в заголовке уведомления теперь берётся в приоритете из `Название в шапке`, затем из `Название сайта`.
Исправлен fallback тестового уведомления в центре уведомлений: больше не показывает захардкоженный `TSOY.CLOUD`.
Technical:
В `views/notifications.php` fallback `new Notification(...)` переведён на бренд из `window.__TSOY_NOTIFY`.
В `views/partials/scripts.php` helper `__tsoyNotifyTitle()` теперь использует `siteHeaderName` раньше `siteName`.
В `app/push.php` helper `push_app_title()` переведён на тот же приоритет (`site_header_name` -> `site_name`).
v3.5.10
2026-02-23
What is new:
В диагностике push-устройств добавлена агрегированная сводка по всем подпискам: `payload success rate`, `fallback rate`, `error rate` и общие счётчики попыток.
Добавлен мини-график/спарклайн по дням (14 дней): stacked bars `payload / wake / errors`, где высота столбца показывает объём попыток за день.
Теперь качество доставки push видно и в разрезе периода, и по текущему срезу без ручного анализа таблицы устройств.
Technical:
В `app/push.php` `push_queue_stats()` расширен блоком `delivery_summary`, который агрегирует `push_stat_*` по всем push-подпискам и считает проценты (`payload/fallback/error`).
Добавлена таблица/миграция `push_delivery_daily_stats` и запись дневной статистики при реальных отправках push (`payload/wake/fallback/error`).
В `app/push.php` реализован `delivery_trend` (последние 14 дней, с заполнением пропусков по датам) для UI-графика диагностики.
В `views/admin_settings.php` добавлены summary-блок и мини-график над таблицей устройств.
v3.5.11
2026-02-23
What is new:
Страница `Настройки` в дашборде больше не выглядит как сплошная простыня: добавлен блок быстрых переходов по разделам (якоря) и группировка по логическим секциям.
Появились явные секции: основные параметры, дизайн/уведомления, PWA/push, функции/звонки/диагностика — ориентироваться в настройках стало заметно проще.
Навигация по секциям адаптирована под мобильные устройства: на телефоне список разделов прокручивается горизонтально.
Technical:
В `views/admin_settings.php` добавлены якоря (`id`) для ключевых блоков настроек и верхняя навигационная панель без изменения backend-логики сохранения формы.
Страница сохранена как единая форма `admin_settings`, поэтому существующие `POST`-обработчики, `formaction` для push-диагностики и CSRF-проверки продолжают работать без миграций.
Добавлены локальные стили для секционной навигации и групповых маркеров (`admin-settings-*`) с mobile-friendly поведением.
v3.5.12
2026-02-23
What is new:
Hotfix страницы `Настройки`: быстрые переходы по разделам теперь ведут в нужные блоки страницы, а не в корень сайта.
Убран sticky-режим блока `Разделы настроек`, из-за которого он перекрывал интерфейс при прокрутке.
Technical:
В `views/admin_settings.php` ссылки разделов переведены с hash-only (`#...`) на route-aware (`index.php?r=admin_settings#...`) для корректной работы при наличии `<base>`/нестандартного base path.
Снята sticky-позиция с `admin-settings-nav-card` (оставлен статичный блок), чтобы навигация не накрывала карточки настроек ниже по странице.
v3.5.13
2026-02-23
What is new:
Страница `Настройки` переделана в Android-style режим: слева список разделов, справа показывается только выбранный раздел настроек.
Переключение разделов теперь происходит без переходов по странице/якорям; интерфейс не перекрывается и не дёргается.
Выбранный раздел запоминается локально, а переходы по служебным hash-ссылкам (например `#pwa-notify-admin`) открывают нужную секцию автоматически.
Technical:
В `views/admin_settings.php` реализован client-side секционный контроллер (`data-settings-nav` / `data-settings-section`) с переключением видимости блоков внутри одной формы.
Сохранена совместимость с текущим backend `admin_settings`: `POST`-логика, `formaction` кнопки push-диагностики и CSRF-проверка не менялись.
Скрытие секций переведено на progressive enhancement: блоки скрываются только после инициализации JS (`.js-sections-ready`), чтобы страница не ломалась при отключённом JS.
v3.5.14
2026-02-23
What is new:
В разделе `Система` настроек добавлен выпадающий список выбора часового пояса по Гринвичу (GMT/UTC offsets).
При выборе смещения из списка значение автоматически подставляется в поле часового пояса ниже, чтобы сохранить настройку одним кликом.
Поле ручного ввода IANA-зоны сохранено для точной настройки (например региональных зон с DST или нестандартных смещений).
Technical:
В `views/admin_settings.php` добавлена генерация preset-списка фиксированных зон `GMT-12 ... GMT+14` с валидными IANA-идентификаторами (`Etc/GMT±N`, `UTC`).
Добавлена JS-связка `systemTimezoneUtcPreset -> systemTimezoneInput`, которая подставляет выбранный preset в существующее поле `system_timezone` без изменений backend-валидации.
v3.5.15
2026-02-23
What is new:
Настройки переведены в Android-style режим с боковым меню разделов и вторым уровнем внутри `PWA и push` (`Обновления`, `Очередь push`, `Устройства`).
В главное меню добавлен отдельный пункт `Настройки` (после `Дашборд`), доступный всем авторизованным пользователям.
Настройки стали role-aware: пользователь/модератор видят личные настройки, админ — личные + админские, `admin_tester` видит всё, но может менять только пользовательские настройки.
В разделе `Система` добавлен выбор часового пояса по Гринвичу (GMT/UTC) через выпадающий список с автоподстановкой.
Technical:
Добавлен route `settings` с доступом через `sections.settings`; legacy route `admin_settings` сохранён для совместимости админ-инструментов и внутренних redirect’ов.
`index.php` (`settings/admin_settings`) разделён по scope сохранения: личные настройки (theme + notify prefs) сохраняются всем ролям, глобальные админ-настройки — только при `admin.settings` и не в режиме `admin_tester`.
В `app/policies.php` и `views/admin_policies.php` добавлена capability `sections.settings` (закреплена для всех ролей с логином).
Исправлена RBAC-связка пользовательского облака: route `dashboard` и связанные действия теперь проверяются по capability `sections.cloud`, а не `sections.dashboard` (staff dashboard).
В `views/admin_settings.php` реализован секционный контроллер с role-aware видимостью/readonly и поднавигацией PWA; у `admin_tester` админ-секции блокируются на уровне UI и backend.
v3.5.16
2026-02-23
What is new:
Админские настройки физически разнесены по отдельным страницам (`Брендинг`, `Доступ и лимиты`, `Система`, `Оформление`, `PWA и push`, `Звонки/диагностика`, `База данных`) при сохранении общего бокового меню.
Переходы в меню настроек теперь открывают соответствующий экран, а не просто переключают внутренние блоки в одном и том же URL.
Внутри `PWA и push`, `Оформление`, `Доступ и лимиты`, `Звонки и диагностика` сохранён второй уровень навигации для быстрого доступа к подпунктам.
Technical:
В `index.php` добавлены route-level страницы настроек (`settings_admin_*`) с capability-gates через `admin.settings`; legacy `admin_settings` сохранён и перенаправлен в режим `Брендинг` внутри общего шаблона.
В `views/admin_settings.php` реализована route-aware навигация: единый шаблон использует разные `action`/initial section в зависимости от текущего settings-route и корректно обрабатывает hash-переходы (`#pwa-notify-admin`, подпункты PWA и др.).
Обновлены ссылки из админских экранов (`Хранилище проекта`, управление новостями) на новую структуру настроек (`settings_admin_branding`).
v3.5.17
2026-02-23
What is new:
Hotfix страницы `Настройки`: пункты бокового меню снова выглядят как кнопки (без подчёркиваний) и заполняют всю ширину колонки.
На desktop видимый раздел настроек теперь растягивается на всю доступную ширину правой панели (как `WebRTC`), а не остаётся половинной карточкой.
На мобильных пересобрано боковое меню настроек: вертикальный стек + корректные подпункты без уезда вправо; нижняя панель сохранения больше не растягивает страницу.
Technical:
В `views/admin_settings.php` для `.admin-settings-side-btn` добавлены `display:block` и `text-decoration:none`, что устраняет регресс после перевода пунктов меню в `<a>`.
В JS-section режиме добавлен CSS override для `.js-settings-block.is-visible` внутри `.row`: `flex-basis/max-width:100%` (исправлен конфликт с Bootstrap `col-lg-6`).
Стабилизирована mobile-вёрстка меню и savebar: вертикальные sublists, wrap/savebar, защита от горизонтального overflow.
v3.5.18
2026-02-23
What is new:
Hotfix страницы `Настройки`: в разделе `База данных` убрана лишняя горизонтальная линия перед карточкой блока.
Нижняя панель сохранения (`Сохраняются все изменённые поля...`) теперь подстраивается под тему оформления и остаётся читаемой в светлой и тёмной темах.
Technical:
В `views/admin_settings.php` удалён лишний `<hr class=\"my-4\">` перед блоком `settings-db`.
Стили `admin-settings-savebar` переведены с жёстко тёмного фона (`rgba(20,22,30,...)`) на theme-aware фон через Bootstrap CSS variables (`--bs-body-bg-rgb`, `--bs-body-color`, `--bs-border-color-translucent`).
v3.6.0
2026-02-23
What is new:
Начат рефакторинг связки `Профиль / Контакты / Мессенджер`: на всех трёх экранах добавлен единый переключатель разделов (Social Hub) и явное описание роли каждого раздела.
`Профиль` теперь явно позиционируется как публичная страница пользователя (посты, медиа, страницы, друзья), `Контакты` — как каталог и управление связями, `Мессенджер` — как диалоги/вложения/звонки.
Визуально выровнены шапки и поверхности этих разделов: общие панели, кнопки-переключатели и единый стиль верхнего блока.
Technical:
Добавлен reusable partial `views/partials/social_suite.php` (единый CSS для Social Hub: header/switcher/surfaces/role-map chips).
`views/profile.php`, `views/contacts.php`, `views/chat.php` подключены к `social_suite` и получили общий navigation shell без вмешательства в критичную mobile-геометрию композера мессенджера.
Функциональные границы модулей зафиксированы в UI-текстах и cross-links, чтобы снизить дублирование сценариев между `Контактами` и `Мессенджером` без ломки backend-логики.
v3.6.1
2026-02-23
What is new:
Следующий шаг по связке `Контакты / Мессенджер`: в мессенджере блок `Быстрый старт` теперь показывает только контакты пользователя, а полный каталог вынесен в раздел `Контакты`.
В настройках исправлено выравнивание раздела `База данных`: карточка блока больше не поднимается выше меню слева.
Навигация настроек стала понятнее по смыслу: `Внешний вид профиля` (личное) и `Внешний вид сайта` (глобальный дизайн) вместо размытого дублирования `Внешний вид`/`Оформление`.
Technical:
В `views/chat.php` удалено дублирование каталога пользователей внутри мессенджера: список `Начать чат` переведён на `contacts_list($me_id)` + ссылка в `index.php?r=contacts`.
В `views/admin_settings.php` выровнен db-блок (`settings-db`) относительно общего grid/меню и обновлены подписи/подразделы блока дизайна (`ui/notify`) для разделения личных и глобальных настроек.
Убран лишний неиспользуемый `$users = users_list_basic()` из `views/chat.php`.
v3.6.2
2026-02-23
What is new:
Убран лишний `Social Hub` с экранов `Профиль / Контакты / Мессенджер`: переключение между разделами остаётся в основном меню, интерфейс снова стал компактнее.
В `Мессенджере` закреплена роль экрана: только активные диалоги и общение. Новый чат создаётся через раздел `Контакты`.
В настройках подправлена визуальная логика: db-блок выровнен относительно меню, а дизайн-настройки разведены по смыслу (`Внешний вид профиля` vs `Внешний вид сайта`).
Technical:
Удалён временный partial `views/partials/social_suite.php` и его подключения из `views/profile.php`, `views/contacts.php`, `views/chat.php` (откат лишнего UI-слоя без влияния на backend).
В `views/chat.php` удалён дублирующий сценарий старта чатов из списка пользователей/контактов: оставлен переход в `index.php?r=contacts` и история активных диалогов.
В `views/admin_settings.php` сохранён route-level Android-style settings, но доработаны подписи и визуальное выравнивание `settings-db`.
v3.6.3
2026-02-23
What is new:
Следующий шаг по связке `Контакты / Мессенджер`: в карточках пользователей на странице `Контакты` добавлены явные действия `Написать` и `Позвонить`.
Мессенджер очищен от каталоговых элементов: в боковой панели оставлены только активные диалоги, без блока быстрого старта/списков людей.
Переход на звонок из `Контактов` сразу открывает нужный диалог в мессенджере и запускает сценарий звонка.
Technical:
`index.php` (`chat_start` и `chat?start=`) теперь прокидывает `call=1` в итоговый URL диалога, чтобы из внешних экранов можно было запускать звонок напрямую.
В `views/contacts.php` унифицированы action-кнопки карточек (`Написать` / `Позвонить`) для списка контактов и каталога пользователей.
В `views/chat.php` удалён нижний блок `Новый диалог`, чтобы мессенджер нёс только роль истории диалогов + активного чата.
v3.6.4
2026-02-23
What is new:
Дожат интерфейс мессенджера под единый стиль с `Контактами`: обновлены список диалогов, шапка диалога и composer (кнопки, границы, поверхности, типографика).
Список диалогов стал визуально ближе к карточкам контактов: более ровные поверхности, одинаковая логика hover/active, читаемые превью и время.
Composer получил более аккуратный визуал (theme-aware фон, акцентная отправка, мягкие кнопки emoji/вложений) без изменения поведения ввода.
Technical:
Изменения сделаны только в `views/chat.php` на уровне CSS/визуальных состояний (`chat-dialog-item`, `chat-dialog-head`, `chat-inputbar`, action-buttons).
Мобильная геометрия ввода/клавиатуры (`fixed/sticky/viewport` логика, fullscreen layout цепочка) не изменялась, чтобы не вернуть iPhone-баг с \"подбородком\".
Верхняя панель мессенджера получила более стабильные mobile/desktop стили кнопок действий (`page-actions`) без вмешательства в маршруты и JS.
v3.6.5
2026-02-23
What is new:
Мессенджер получил второй visual-pass: доработаны карточки диалогов, шапка активного диалога, кнопки действий и composer для более цельного и лёгкого вида.
В списке диалогов добавлена компактная CTA-кнопка `Контакты` в шапке списка и более полезное пустое состояние с переходом в `Контакты`.
Плотность (`telegram / compact / roomy`) заметнее влияет не только на bubble, но и на список диалогов, шапку и кнопки мессенджера.
Technical:
В `views/chat.php` расширен UI-only CSS слой (polish pass 2): `chat-list-headbar`, `chat-dialog-item`, `chat-dialog-head`, `chat-head-btn`, `chat-compose-btn` и density overrides.
Добавлены только безопасные классы/микроразметка в `views/chat.php` (CTA в списке диалогов, классы кнопок) без изменения маршрутов, логики сообщений и звонков.
Мобильная keyboard-layout логика (`chat-composer-shell`, fullscreen/viewport поведение) не изменялась, чтобы не вернуть iPhone-bug с `подбородком`.
v3.6.6
2026-02-23
What is new:
Hotfix iPhone/PWA уведомлений: системная строка `from ...` теперь берёт бренд из настроек (`Название в шапке` → `Название сайта`), а не из старого захардкоженного `TSOY.CLOUD`.
PWA meta-теги (`application-name`, `apple-mobile-web-app-title`) синхронизированы с брендингом проекта, чтобы имя приложения и имя в уведомлениях совпадали.
Technical:
В `index.php` добавлен route `manifest`, который отдаёт динамический Web App Manifest на основе текущих настроек брендинга (`site_header_name` / `site_name`).
В `views/partials/head.php` `<link rel=\"manifest\">` переведён на динамический route с cache-bust (`APP_VERSION` + hash бренда); `application-name` и `apple-mobile-web-app-title` переведены на приоритет `site_header_name`.
В `service-worker.js` и `public/service-worker.js` fallback title уведомлений заменён с `TSOY.CLOUD` на нейтральный `Уведомление` (с поддержкой `src.appTitle`), чтобы убрать скрытый хардкод.
v3.6.7
2026-02-23
What is new:
Исправлен мобильный overflow окна `Диалоги` в мессенджере: карточка списка диалогов больше не вылезает за ширину экрана на iPhone/смартфонах.
Стабилизирована ширина mobile-раскладки мессенджера без изменений логики клавиатуры и без риска вернуть баг с `подбородком`.
Technical:
В `views/chat.php` для mobile добавлен точечный фикс ширины: убраны отрицательные отступы `row g-3` (Bootstrap gutter overflow) и зажаты `#chatListPane`/карточка/тело списка в `max-width:100%`.
Изменение ограничено CSS-слоем страницы чата; fullscreen/composer/`visualViewport` логика не изменялась.
v3.6.8
2026-02-23
What is new:
Ускорена отправка сообщений в мессенджере: сообщение появляется заметно быстрее после нажатия `Отправить`, без ощущения паузы в 2–3 секунды.
Повышена плавность UX при отправке: сервер отдаёт ответ чату сразу, а push-уведомления больше не держат отправку сообщения.
Technical:
В `index.php` (`chat_send_async`) push для нового сообщения переведён в queue-first режим: уведомление ставится в очередь без синхронной отправки (`sendNow=false`).
HTTP-ответ `chat_send_async` теперь завершается до фоновой попытки dispatch push (`fastcgi_finish_request` / flush), чтобы Web Push не блокировал отображение сообщения.
В `app/push.php` `push_notify_chat_message(...)` получил параметр `$sendNow` (по умолчанию `true`) для безопасного управления sync/async поведением без ломки остальных вызовов.
v3.6.9
2026-02-23
What is new:
Подготовлен серверный фундамент чата для больших историй переписки (сотни тысяч/миллионы сообщений) без изменения привычного интерфейса.
Список диалогов и polling чата стали легче для сервера за счёт оптимизации хранения unread-состояния и индексов под крупные переписки.
Technical:
В `conversations` добавлены денормализованные unread-счётчики (`u1_unread_count`, `u2_unread_count`) и метаданные последнего сообщения (`last_message_id`, `last_message_preview`).
В `app/chat.php` `message_send()` / `conversation_mark_read()` обновляют unread-счётчики диалога; `message_delete_for_me()` и `conversation_clear_for_me()` синхронизируют их через пересчёт/сброс.
`conversations_for_user()` больше не выполняет тяжёлый `COUNT(*)` unread для каждого диалога, если денормализованные счётчики уже доступны (используется `COALESCE(..., legacy COUNT)` как fallback для апгрейдов).
Добавлены chat-индексы для крупных историй: `conversations(user1_id,last_message_at)`, `conversations(user2_id,last_message_at)`, `messages(conversation_id,id)`, visible-индексы по `deleted_by_u1/u2`, индекс unread по `messages(conversation_id,is_read,id)`.
В `chat_messages_poll` убран лишний `mark_read`-UPDATE при пустом poll-ответе, что снижает шумовые записи в БД на активных вкладках.
v3.6.10
2026-02-23
What is new:
Полиш страницы `Контакты`: действия `Написать`, `Позвонить`, `Удалить` в карточках заменены на компактные иконки (конверт, трубка, корзина) для более чистого интерфейса.
Сохранены подсказки (`title`) и `aria-label`, чтобы UX остался понятным и доступным на ПК и мобильных устройствах.
Technical:
В `views/contacts.php` добавлены `contacts-actions` и `contacts-action-icon` (theme/density-friendly размеры икон-кнопок), заменена текстовая разметка кнопок в списке `Мои контакты` и `Каталог пользователей`.
Логика маршрутов и действий (`chat_start`, `chat_start&call=1`, add/remove contact) не изменялась.
v3.6.11
2026-02-23
What is new:
Доведён UI действий в `Контактах`: кнопка `В контакты` заменена на иконку `человек+`, чтобы все действия в карточках были в одном визуальном языке.
Заголовок `Каталог пользователей` и кнопка `Найти` теперь находятся в одной строке, поле поиска вынесено отдельно ниже на полную ширину.
Technical:
В `views/contacts.php` кнопка добавления контакта переведена на `bi-person-plus` с `title`/`aria-label`; сохранена существующая POST-логика `action=add`.
Поиск в каталоге использует `form=\"contactsSearchForm\"` у кнопки `Найти`, чтобы держать правильную desktop/mobile компоновку без изменения backend-маршрута `contacts`.
v3.6.12
2026-02-23
What is new:
Системные файлы проекта (логотип, favicon, кастомные звуки уведомлений/звонка и служебные ассеты спец-регистрации) переведены в единую системную папку `public/system/...`.
Старые пути (`public/branding`, `public/sounds`, `public/friend_register`) автоматически и мягко переносятся в новую системную структуру при запуске приложения.
Technical:
Добавлен `app/system_assets.php`: единый helper для системных ассетов (безопасное сохранение upload-файлов, удаление только из разрешённых системных директорий, миграция legacy-путей).
В `index.php` (`admin_settings`) загрузка логотипа, favicon и кастомных рингтонов переведена на `system_assets_store_upload(...)` с хранением в `public/system/branding` и `public/system/sounds`.
В `index.php` (`admin_friend_register`) картинка кошки-говешки переведена в `public/system/friend_register` с очисткой старого файла при замене/удалении.
После `ensure_schema()` вызывается `system_assets_migrate_known_settings()`, который мигрирует пути из `settings` и конфигов friend-registration в новую системную папку (best-effort, без ломки старых ссылок при ошибке переноса).
v3.6.13
2026-02-23
What is new:
В настройках переработан раздел `Внешний вид`: вместо разрозненных пунктов `Внешний вид профиля` и `Внешний вид сайта` появился единый раздел `Внешний вид` с подпунктами (профиль / сайт / стиль уведомлений).
Для глобального оформления сайта добавлены готовые профили внешнего вида (несколько пресетов под разные сценарии: чистый, рабочий, чтение, мягкий, ночной, psychedelic).
Шрифтовые пресеты пересмотрены с упором на кириллицу: добавлены/обновлены Manrope, PT Sans, Rubik и IBM Plex Sans.
Technical:
Добавлен helper `ui_appearance_profiles()` в `app/bootstrap.php` с готовыми профилями оформления и пакетами значений для `ui_*` настроек.
В `views/admin_settings.php` объединена навигация дизайна в один top-level `Внешний вид`, добавлен UI выбора/подстановки профиля оформления и обновлены кириллические шрифтовые опции.
В `views/partials/head.php` подключены кириллические web-fonts (Manrope/PT Sans/Rubik/IBM Plex Sans) и добавлен новый шрифтовой пресет `plex`.
В `index.php` и `ui_config()` расширена валидация/сохранение (`ui_font_family=plex`, `ui_appearance_profile`).
v3.6.14
2026-02-23
What is new:
Исправлен UX профиля: кнопка `Написать` больше не отображается на собственной карточке профиля.
У вложений постов в обычном просмотре убраны кнопки `Удалить`: удаление доступно только в режиме редактирования поста.
Technical:
В `views/profile.php` кнопка перехода в чат скрыта для `is_self`.
Из обычного рендера вложений в `views/profile.php` удалены формы `post_attachment_delete`; удаление оставлено в edit-блоке (`js-del-att`).
v3.6.15
2026-02-23
What is new:
В личном разделе `Настройки -> Внешний вид` добавлены персональные режимы основного бокового меню: `показывать всегда`, `скрывать всегда`, `по кнопке`.
Для публичной страницы профиля добавлена персональная настройка вида для гостей: `показывать боковое меню`, `скрывать боковое меню`, `скрывать боковое меню и шапку сайта`.
Настройки работают индивидуально для каждого профиля-пользователя (каждый `user` настраивает внешний chrome под себя).
Technical:
В `users` добавлены персональные UI-поля `ui_sidebar_mode` и `guest_profile_chrome_mode` (миграции в `app/migrations.php`).
В `index.php` (`settings`) сохранение пользовательских настроек расширено: добавлен `user_update_ui_prefs(...)` и синхронизация значений в session snapshot.
В `views/layout.php` переработана логика показа desktop sidebar / offcanvas / topbar с учётом персонального режима меню и режима публичного профиля для гостей.
v3.6.16
2026-02-23
What is new:
В мессенджере добавлено контекстное меню сообщения по правой кнопке мыши и по удержанию на мобильных устройствах.
Меню действий сообщения теперь включает `Изменить`, `Удалить`, `Цитировать` и `Реакция` (с выбором emoji).
Под сообщениями отображаются emoji-реакции с количеством; свою реакцию можно быстро переключать повторным нажатием.
Technical:
Добавлена таблица `message_reactions` (MySQL/SQLite) и миграции/индексы в `app/migrations.php`.
В `app/chat.php` добавлены batch-подгрузка реакций для пачек сообщений (`chat_messages_payload_for_client`) и `message_reaction_toggle(...)`.
В `index.php` добавлен JSON-route `chat_reaction_toggle`; polling/send-ответы чата теперь отдают реакции вместе с сообщениями.
В `views/chat.php` переиспользован существующий dropdown сообщений для right-click/long-press без изменения mobile keyboard/composer геометрии.
v3.6.17
2026-02-23
What is new:
В мессенджере у сообщений добавлена маленькая галочка статуса прочтения (`прочитано / не прочитано`).
Галочка отображается у ваших сообщений и обновляется в диалоге автоматически, когда собеседник читает чат.
Technical:
В `app/chat.php` в payload сообщений добавлен `is_read`, а также helper `conversation_last_read_sent_message_id(...)` для лёгкого read-receipt sync.
В `chat_send_async` и `chat_messages_poll` (`index.php`) добавлен `read_upto_own_id`, чтобы фронт мог обновлять статусы уже отрисованных сообщений без перезагрузки.
В `views/chat.php` добавлен компактный read-state UI (галочка) и JS-обновление статуса прочтения через polling.
v3.6.18
2026-02-23
What is new:
В контекстное меню сообщения мессенджера добавлен пункт `Будильник` (пинг-напоминание).
Будильник доступен для ваших сообщений и отправляет повторное уведомление собеседнику только если сообщение ещё не прочитано.
Technical:
Добавлен route `chat_message_nudge` в `index.php` с проверками: сообщение принадлежит текущему пользователю, находится в этом диалоге и ещё не прочитано.
В `app/push.php` добавлен `push_notify_chat_message_reminder(...)` с отдельным типом `chat_nudge` и dedupe tag по сообщению.
В `views/chat.php` пункт меню `Будильник` встроен в existing dropdown, автоматически отключается для чужих/прочитанных сообщений и показывает toast-результат.
v3.6.19
2026-02-23
What is new:
Начато внедрение голосовых сообщений в мессенджер: добавлена красная кнопка микрофона и аккуратное окно записи.
Голос записывается прямо в браузере/на устройстве и прикрепляется к сообщению как аудио-вложение.
Аудио-вложения (включая голосовые) теперь можно слушать прямо в чате через встроенный плеер.
Technical:
В `views/chat.php` добавлены voice-recorder modal, UI состояния записи и интеграция с `MediaRecorder` (MVP) без изменения keyboard/fullscreen геометрии чата.
Записанный blob прикрепляется через существующий `chatFileInput` (`DataTransfer`) и уходит в уже существующий backend upload flow `chat_send_async` / `message_send`.
Добавлен глобальный preloader при загрузке страниц сайта: пользователь видит аккуратный индикатор загрузки вместо “пустого” экрана.
Для PWA добавлен отдельный режим preloader `Идёт установка приложения…` при установке через системную кнопку.
Preloader также включается при переходах по страницам и при отправке формы установки сайта (`install.php`).
Technical:
В `views/partials/head.php` добавлен theme-aware overlay `#tsoyPreloader` (общий для сайта и установщика), работающий в светлой/тёмной теме без жёстко тёмного фона.
В `views/partials/scripts.php` добавлен runtime `window.__TSOY_PRELOADER` (show/hide/set) с автоскрытием после загрузки, показом на внутренних переходах и submit-формах (кроме AJAX submit с `preventDefault`).
PWA install flow (`beforeinstallprompt`) теперь включает состояние `pwa-install`; `appinstalled` закрывает overlay и показывает toast об успешной установке.
v3.6.21
2026-02-23
What is new:
Исправлено переключение разделов в настройках: секции теперь открываются без ощущения полной перезагрузки страницы.
В `Контактах` длинные имена пользователей больше не раздвигают и не перестраивают иконки действий: текст ужимается/переносится внутри текстовой зоны, а кнопки остаются на месте.
В шапке диалога `Мессенджера` зафиксирован блок кнопок справа (`Ссылка / Звонок / Очистить`), длинные имена больше не выталкивают кнопки и не ломают компоновку.
Technical:
В `views/admin_settings.php` клики по боковому меню настроек переведены на client-side section switch (`history.pushState`) вместо обязательной навигации по `settings_admin_*` route; `form action` динамически переключается по секции, поэтому сохранение остаётся корректным.
В `views/contacts.php` добавлены отдельные классы текстовой зоны (`contacts-person-*`), `contacts-actions` переведён в `nowrap`/`flex-shrink:0`, а длинные имена ограничены в 1–2 строки без сдвига иконок.
В `views/chat.php` шапка активного диалога усилена правилами `nowrap` для `chat-head-actions` и ellipsis для имени собеседника, без изменения mobile keyboard/composer геометрии.
v3.6.22
2026-02-23
What is new:
Hotfix preloader: убран автопоказ на каждый внутренний клик, поэтому переключение секций настроек и переходы между чатами больше не должны “подвисать” из-за overlay.
Preloader сохранён там, где он реально полезен: первичная загрузка страницы, установка сайта и установка PWA.
Technical:
В `views/partials/scripts.php` глобальный preloader переведён в explicit-flow режим: отключён автоперехват всех внутренних ссылок и обычных submit-форм.
Автопоказ preloader оставлен только для `install.php` submit и для форм с `data-preloader=\"1\"`; PWA install flow (`beforeinstallprompt`) сохранён отдельно.
Удалён неиспользуемый helper распознавания внутренних ссылок после сужения области применения preloader.
v3.6.23
2026-02-23
What is new:
В `Профиле` длинные тексты в карточках друзей/страниц и в постах ведут себя аккуратнее: текст ужимается/переносится внутри своей зоны и не ломает действия/бейджи.
В `install.php` добавлена мини-анимация этапов установки (БД → миграции → админ → готово) с синхронизацией текста в preloader.
В `Мессенджере` добавлен мобильный режим `удерживай для записи`: зажмите кнопку микрофона, отпустите — запись остановится и прикрепится к сообщению.
После записи голосового в composer теперь появляется компактное предпрослушивание (мини-аудиоплеер), а аудио-плееры в сообщениях стали компактнее.
Technical:
В `views/profile.php` добавлены clamp/overflow правила для карточек друзей/страниц и фикс action-зон в постах, чтобы длинные строки не выталкивали элементы интерфейса.
В `install.php` реализован submit-time stepper без изменения backend-логики: этапы анимируются на клиенте и обновляют `__TSOY_PRELOADER` в режиме `install-site`.
В `views/chat.php` расширен voice recorder: touch long-press (`push-to-talk`) на mobile, авто-прикрепление записи после отпускания, compact composer attachment preview для `audio/*` (включая голосовые).
В `views/chat.php` уменьшена ширина встроенного аудио-плеера в сообщениях для более плотного mobile/desktop UI.
v3.6.24
2026-02-23
What is new:
Hotfix preloader: страницы `Профиль` и `Мессенджер` открываются заметно быстрее, overlay загрузки больше не ждёт долго все картинки/медиа.
Preloader теперь скрывается на этапе готовности DOM, а не только после полного `window.load`.
Technical:
В `views/partials/scripts.php` логика initial preloader boot переведена на `DOMContentLoaded`/`interactive` + `requestAnimationFrame`, чтобы не блокировать UI на медиа-насыщенных страницах.
`window.load` и `pageshow` оставлены только как fallback-сигналы; добавлен hard fail-safe timeout на случай странных браузерных зависаний событий.
v3.6.25
2026-02-23
What is new:
Hotfix голосовых сообщений: голосовые `.webm` в мессенджере теперь отображаются плеером, а не только ссылкой на файл.
Фикс работает и для уже отправленных голосовых (по имени `voice_message_*`), и для новых записей.
Technical:
В `app/files.php` добавлена нормализация MIME для browser voice-notes (`voice_message_*`), чтобы `.webm/.ogg/.m4a` не сохранялись как generic/video MIME.
В `app/chat.php` добавлен helper `chat_file_is_audio_like(...)`, а payload чата теперь отдаёт `file_is_audio` для корректного client render старых и новых голосовых.
В `views/chat.php` server-side и polling-render плеера переведены на `file_is_audio` / smart audio-detection вместо строгой проверки только `audio/*`.
v3.6.26
2026-02-23
What is new:
На главной странице блок недавних файлов больше не растягивает экран вниз: по умолчанию показываются первые 3 файла.
Остальные файлы открываются кнопкой `Показать ещё файлы` (порциями по 3), как в разделе новостей.
Technical:
В `views/home.php` лента файлов переведена на существующий механизм `data-load-more-root` из `views/layout.php` без добавления нового JS-кода.
Для элементов файлов добавлено серверное начальное скрытие (`d-none`) после первых 3 записей, чтобы список был компактным сразу при рендере страницы.
v3.6.27
2026-02-23
What is new:
Hotfix голосовых сообщений в мессенджере: voice-notes отображаются компактной одной строкой без второй строки с именем файла.
Визуал голосового сообщения стал тоньше и аккуратнее, ближе к обычной строке сообщения.
Technical:
В `views/chat.php` voice-note рендер (`voice_message_*`) уже использует отдельный inline-layout без file-link; в релиз включён hotfix компактности CSS (`.chat-voice-inline-row`, `.chat-audio-clip.is-voice-note`).
Серверный и polling JS рендеры голосовых сообщений синхронизированы: для voice-notes не выводится отдельная строка имени файла.
v3.6.28
2026-02-23
What is new:
Голосовые сообщения в мессенджере: один тап по микрофону запускает запись, повторный тап останавливает запись и сразу отправляет голосовое.
Если запись не удалось отправить автоматически, голосовое остаётся прикреплённым в composer и можно отправить вручную.
Technical:
В `views/chat.php` обычный click/tap микрофона переведён на toggle-логику записи (`start/stop+auto-send`) без изменения mobile composer/fullscreen геометрии.
Добавлен helper программной отправки через существующий async submit (`chat_send_async`) после авто-прикрепления voice blob в composer.
v3.6.29
2026-02-23
What is new:
Голосовые сообщения в чате теперь воспроизводятся одинаково на ПК и телефоне: компактной одной кнопкой play/pause.
У voice-note больше нет зависимости от урезанных native audio-controls браузера на десктопе.
Technical:
В `views/chat.php` voice-notes (`voice_message_*`) переведены на custom mini-player (кнопка + hidden audio) в server-side и polling-render.
Добавлена JS-делегация управления воспроизведением (play/pause, синхронизация иконки, автопауза предыдущего голосового).
v3.6.30
2026-02-23
What is new:
В `Настройки -> Внешний вид` добавлены персональные настройки preloader: режим (`умный / только установка-PWA / выключить`), компактный вид и показ текста.
Preloader теперь можно настроить под себя по каждому профилю аккаунта (профиль = отдельный user).
Technical:
В `users` добавлены персональные UI-поля preloader (`ui_preloader_mode`, `ui_preloader_compact`, `ui_preloader_show_text`) с загрузкой в session snapshot и применением в `views/partials/scripts.php`.
В `views/partials/head.php` добавлены вариации preloader (`compact`, скрытие текста), а runtime учитывает пользовательский режим без ломки install/PWA сценариев.
v3.6.31
2026-02-23
What is new:
Hotfix голосовых сообщений на телефоне: mini-player voice-note снова стабильно воспроизводится по тапу.
Поведение mini-player синхронизировано для mobile/desktop (play/pause одной кнопкой).
Technical:
В `views/chat.php` для voice mini-player добавлен mobile-safe `touchend` handler с подавлением дубля `click`, чтобы iPhone/Safari не терял тап.
Скрытый `<audio>` переведён с `display:none` на visually-hidden класс; добавлен `audio.load()` перед `play()` для лучшей совместимости мобильных браузеров.
v3.6.32
2026-02-23
What is new:
В Брендинге добавлена отдельная настройка `Иконка PWA` (опционально) для установленного приложения.
Если PWA-иконка не задана, приложение теперь использует `favicon`, а затем `лого` как fallback.
Technical:
Route `index.php?r=manifest` теперь динамически подменяет `icons` (и shortcut icons) из настроек брендинга вместо жёстких `/public/icons/...`.
В `views/partials/head.php` `apple-touch-icon` переведены на динамический PWA icon с cache-bust, а `manifest` cache-bust учитывает смену иконки.
v3.6.33
2026-02-23
What is new:
В PWA исправлен просмотр файлов: теперь файл открывается во встроенной странице-просмотрщике с кнопкой `Назад`, а не “захватывает” приложение без пути назад.
Кнопка `Открыть` в файловом проводнике тоже использует этот встроенный просмотр в standalone/PWA.
Technical:
Добавлен route `index.php?r=file_viewer` с безопасной проверкой доступа к файлу и возвратом по `back` URL.
В `views/partials/scripts.php` добавлен standalone-PWA перехват ссылок `index.php?r=view&id=...` с перенаправлением во встроенный просмотрщик вместо raw-file response.
v3.6.34
2026-02-23
What is new:
Hotfix mini-плеера голосовых на телефоне: воспроизведение по тапу снова стабильно запускается.
Поведение mini-player выровнено между iPhone/Android и ПК (одна кнопка play/pause).
Technical:
В `views/chat.php` mini-player получил прямые обработчики `touchend/click` на кнопке (а не только делегирование через контейнер сообщений) с защитой от двойного срабатывания.
Убран рискованный pre-play `audio.load()` как основной путь; добавлен fallback reload только при ошибке `play()`.
v3.4.0
2026-02-23
What is new:
Добавлены полноценные push-уведомления на устройство (через Web Push + Service Worker) для сценариев, когда сайт/PWA закрыт.
Push-уведомления теперь приходят по ключевым событиям: сообщения, входящие звонки/приглашения в звонок, лайки постов, комментарии и добавления в друзья.
В звонках добавлен индикатор качества связи (RTT, джиттер, потери, битрейт) с понятной оценкой состояния соединения.
Улучшена стабильность звонков: при проблемах соединения клиент мягко инициирует переподключение и показывает статус «переподключение».
Technical:
Добавлен `app/push.php`: VAPID-ключи (автогенерация), подписки Web Push, очередь уведомлений, payloadless Web Push dispatch и pull-механизм для SW.
В `app/migrations.php` добавлены таблицы `push_subscriptions` и `push_queue` (MySQL/SQLite) с индексами для подписок и очереди доставки.
В `index.php` добавлены маршруты `push_subscribe`, `push_unsubscribe`, `push_pull`; ключевые действия (chat/call/like/comment/friend) теперь ставят события в push-очередь и триггерят доставку.
В `views/partials/scripts.php` добавлена синхронизация `PushManager`-подписки с настройкой `notify_desktop`, а в Service Worker (`service-worker.js` и `public/service-worker.js`) реализован payloadless push -> `push_pull` -> `showNotification`.
В `views/chat.php` добавлен `getStats()`-мониторинг качества WebRTC и UI-индикатор без изменения mobile composer/keyboard-геометрии (чтобы не вернуть баг с “подбородком”).
v3.4.1
2026-02-23
What is new:
Исправлено мобильное открытие окна вложений в мессенджере: attach-модалки/проводник теперь открываются поверх fullscreen-чата.
Меню профиля/переключения мультипрофилей в мобильной шапке больше не уезжает влево: dropdown центрируется по viewport.
Technical:
В `views/chat.php` поднят z-index attach-модалки и file-picker-модалки над mobile chat pane (`z-index: 2100`) и добавлена маркировка backdrop (`chat-over-chat-backdrop`).
В `views/chat.php` усилен mobile-open handler клипсы (`pointerup` + `touchend` + click guard), чтобы не терялись тапы в fullscreen-мессенджере.
В `views/partials/head.php` и `views/layout.php` добавлен mobile-centered режим для `topbar-profile-menu` (fixed + вычисляемый `top` на `show.bs.dropdown`).
v3.4.2
2026-02-23
What is new:
Исправлена навигация по клику на уведомления: уведомления теперь корректно открывают источник (чат, календарь, профиль/пост и т.д.) в браузере и PWA.
Technical:
В `views/partials/scripts.php` `__tsoyNavigateFromNotification()` переведён на резолв ссылок через `appBasePath`, а fallback `Notification.onclick` теперь использует тот же навигатор.
В `service-worker.js` / `public/service-worker.js` `notificationclick` теперь резолвит `data.url` относительно `self.registration.scope` (а не `origin`), что исправляет deep-link в установках не в корне сайта.
v3.4.3
2026-02-23
What is new:
Уведомления стали информативнее: для новых сообщений показываются имя отправителя и фрагмент текста.
Для входящих звонков в уведомления добавлены действия «Принять» и «Отклонить» (там, где это поддерживает браузер/устройство).
Technical:
В `notif_poll` добавлен preview последнего непрочитанного сообщения (`sender/body/url`), а клиентский polling в `views/partials/scripts.php` использует его для desktop-уведомлений и toast.
В `app/push.php` расширен payload Web Push: поддержка `data` и `action_urls`, а `push_notify_incoming_call()` теперь отправляет actions (`accept/close`) и URL принятия звонка.
v3.4.4
2026-02-23
What is new:
В дашборде (`Настройки`) добавлен отдельный блок настроек уведомлений: цвет, оформление toast/desktop-уведомлений, рингтон уведомлений и отдельный рингтон входящего звонка.
Добавлен блок `PWA и обновления`: политика обновления (manual/notify/auto), интервал проверки Service Worker, автозапрос persistent storage и toast-оповещения об обновлении PWA.
В открытом приложении входящий звонок теперь использует настраиваемый рингтон (если у пользователя включён звук уведомлений).
Technical:
Добавлены новые ключи настроек в `app/settings.php`; сохранение/валидация реализованы в `index.php` (`admin_settings`).
В `views/layout.php` новые настройки прокидываются в `window.__TSOY_NOTIFY` (`ui/sounds/pwa`) для runtime-слоя.
В `views/partials/scripts.php` улучшен PWA update flow: регистрация SW с учётом `appBasePath`, настраиваемый интервал `update()`, политика auto/notify/manual и методы `__TSOY_PWA_RUNTIME.checkForUpdates/applyUpdate/getUpdateState`.
В `views/partials/scripts.php` добавлены пресеты синтезируемых звуков уведомлений и рингтона звонка, а также стилизация toast/desktop notification по админ-настройкам.
v3.4.5
2026-02-23
What is new:
В настройках уведомлений добавлена загрузка своих рингтонов: отдельно для обычных уведомлений и отдельно для входящего звонка.
В админке можно прослушать загруженные рингтоны прямо в разделе настроек и удалить их при необходимости.
Technical:
Добавлены настройки `notify_sound_custom_path` и `notify_call_sound_custom_path`, а в `admin_settings` реализована загрузка аудиофайлов в `public/sounds`.
Во фронтенде (`views/layout.php` + `views/partials/scripts.php`) runtime уведомлений получил поддержку кастомных аудио-файлов с fallback на синтезированные звуки, если браузер блокирует воспроизведение.
v3.5.0
2026-02-23
What is new:
Стабилизационный релиз: проведён общий cleanup проекта, снижён шум от временных артефактов и улучшена предсказуемость работы уведомлений/PWA-настроек.
В настройках уведомлений доработана работа со своими рингтонами: при замене старые файлы корректно очищаются, а слишком большие файлы не принимаются.
Technical:
Удалены временные каталоги восстановления/аудита (`tmp_*`) из рабочей директории, которые засоряли поиск и увеличивали накладные расходы проверок.
В `scripts/check-encoding.ps1` добавлено универсальное исключение для временных каталогов `tmp_*`, чтобы сборочные проверки не сканировали техмусор.
В `views/partials/head.php` убран дублирующийся `<link rel=\"icon\">`, а в `views/layout.php` удалены лишние переменные и лишний вызов `ui_config()` для чтения акцента (используется уже загруженный `$ui`).
В `index.php` (`admin_settings`) улучшен lifecycle кастомных рингтонов: безопасное удаление старых файлов в `public/sounds`, защита от path traversal и лимит размера загружаемого рингтона (5 MB).
v3.5.1
2026-02-23
What is new:
Hotfix рингтонов на телефонах: улучшено воспроизведение кастомных рингтонов уведомлений/звонка на мобильных браузерах и PWA.
Technical:
В `views/partials/scripts.php` исправлен баг кастомного рингтона уведомлений: теперь Promise `audio.play()` реально проверяется, и при ошибке срабатывает fallback-звук.
Кастомные рингтоны теперь резолвятся через `appBasePath` (`__tsoyResolveAppUrl`) для корректной работы в установках проекта в подпапке сайта.
Добавлен mobile-safe `audio unlock` по первому взаимодействию пользователя, чтобы повысить шанс воспроизведения звука на iPhone/Android браузерах.
v3.5.2
2026-02-23
What is new:
Усилена надёжность уведомлений: добавлен серверный retry-worker для wake-push доставки с повторными попытками и backoff.
В админке (Настройки -> PWA и обновления) появился блок диагностики push-очереди: количество недоставленных элементов, состояние очереди и статус подписок.
Technical:
В `push_queue` добавлены поля состояния доставки (`dispatch_state`, попытки, backoff, lock, last_error/status) и миграции для MySQL/SQLite.
В `app/push.php` реализованы функции очереди и worker-обработки (`claim/process due`, retry/backoff, статистика очереди).
Добавлен route `index.php?r=push_worker_run` для ручного запуска worker из админки и CLI-скрипт `scripts/push-worker.php` для cron/daemon запуска.
`push_notify_user_event()` теперь сохраняет результат wake-push отправки в очередь, а `push_dispatch_user()` возвращает расширенную статистику для retry-логики.
v3.5.3
2026-02-23
What is new:
Уведомления стали стабильнее при закрытом PWA/сайте: сервер теперь пытается отправлять полноценный Web Push payload (с телом уведомления), а не только wake-push.
Сохранён fallback-режим (`wake-push + push_pull`) для совместимости, если endpoint/браузер не принимает payload.
Technical:
В `app/push.php` добавлена payload-отправка Web Push (`aes128gcm`) с VAPID и шифрованием сообщения на стороне сервера (ECDH + HKDF + AES-128-GCM).
`push_dispatch_user()` теперь умеет отправлять payload в push и возвращает раздельную статистику `payload_sent` / `wake_sent`.
Если payload доставлен без fallback на wake-push, очередь помечается как `delivered_at`, чтобы не было дубля через `push_pull`.
Service Worker (`service-worker.js`, `public/service-worker.js`) стал устойчивее к ошибкам парсинга payload: сначала пытается `json()`, затем `text()+JSON.parse()`, потом fallback на `push_pull`.
v3.5.4
2026-02-23
What is new:
В админке (`Настройки -> PWA и обновления`) добавлена диагностика push-устройств: список подписок, устройство/режим, последний успех доставки и ошибки.
Появилась кнопка `Тест push` для каждого устройства, чтобы быстро проверить доставку уведомлений на конкретную подписку.
Technical:
В `app/push.php` добавлены helper-функции диагностики: `push_subscriptions_admin_list()`, `push_subscription_get()`, `push_subscription_test_send()`.
Добавлен route `index.php?r=push_test_subscription` (admin/settings), который отправляет тестовый push на выбранную подписку и пишет результат в flash.
Тестовая отправка использует payload Web Push с fallback на wake-push, а результат обновляет `last_seen_at`/`last_error` подписки через `push_subscription_touch_result()`.
v3.5.5
2026-02-23
What is new:
Диагностика push-устройств в админке стала практичнее: добавлены фильтры (поиск, active/inactive, только с ошибками).
Для push-подписок появились действия `Отключить / Включить / Удалить` прямо в таблице устройств.
Technical:
В `app/push.php` добавлены admin-helper’ы управления подписками: `push_subscription_set_active()` и `push_subscription_delete_by_id()`, а список подписок получил серверные фильтры (`q`, `only_errors`, `state`).
В `index.php` добавлен route `push_subscription_admin_action` для безопасного управления подписками из админки (POST + CSRF + capability).
В `views/admin_settings.php` блок диагностики push-устройств получил UI-фильтры и действия по подпискам через `formaction`, без конфликта с основной формой настроек.
v3.5.6
2026-02-23
What is new:
Исправлен бренд в уведомлениях: заголовок уведомлений теперь подтягивается из настроек сайта, а не захардкожен как `TSOY.CLOUD`.
В диагностике push-устройств добавлена колонка `Последний тест` (успех/ошибка, режим `payload/wake`, HTTP-код, время).
Technical:
В `app/push.php` добавлен helper `push_app_title()` (с кешем), и серверные push-события/очередь/тестовые уведомления переведены на имя сайта из `settings`.
В `views/layout.php` + `views/partials/scripts.php` runtime уведомлений получил `siteName/siteHeaderName`; browser/PWA fallback notifications и toast теперь используют бренд из настроек.
В `push_subscriptions` добавлены поля `last_test_*` (миграции для MySQL/SQLite), а тестовая отправка подписки сохраняет режим (`payload`/`wake`) и результат в БД.
v3.5.7
2026-02-23
What is new:
В диагностике push-устройств добавлена статистика реальных доставок по подписке: `payload`, `wake`, `wake fallback`, `errors` (накопительно, с последнего сброса).
Добавлены кнопки сброса статистики доставок: для одной подписки и для всех подписок сразу.
Заголовок уведомлений теперь стабильно берётся из настроек сайта (брендинг) и для серверных push, и для клиентских fallback-уведомлений.
Technical:
В `push_subscriptions` добавлены поля `push_stat_*` и миграции для MySQL/SQLite; реальные отправки в `push_dispatch_user()` записывают статистику по подписке (`payload/wake/fallback/error`).
В `app/push.php` реализованы helper’ы `push_subscription_delivery_stats_record()` и `push_subscription_delivery_stats_reset()`.
В `index.php` добавлен admin-route `push_subscription_stats_reset`, а в `views/admin_settings.php` — отображение статистики и кнопки сброса.
В `app/push.php` + `views/layout.php` + `views/partials/scripts.php` уведомления переведены на бренд из `settings` через `push_app_title()` и runtime helper `__tsoyNotifyTitle()`.
v3.5.8
2026-02-23
What is new:
Hotfix уведомлений: название в заголовке уведомления теперь берётся в приоритете из `Название в шапке`, затем из `Название сайта`.
Исправлен fallback тестового уведомления в центре уведомлений: больше не показывает захардкоженный `TSOY.CLOUD`.
Technical:
В `views/notifications.php` fallback `new Notification(...)` переведён на бренд из `window.__TSOY_NOTIFY`.
В `views/partials/scripts.php` helper `__tsoyNotifyTitle()` теперь использует `siteHeaderName` раньше `siteName`.
В `app/push.php` helper `push_app_title()` переведён на тот же приоритет (`site_header_name` -> `site_name`).
v3.5.10
2026-02-23
What is new:
В диагностике push-устройств добавлена агрегированная сводка по всем подпискам: `payload success rate`, `fallback rate`, `error rate` и общие счётчики попыток.
Добавлен мини-график/спарклайн по дням (14 дней): stacked bars `payload / wake / errors`, где высота столбца показывает объём попыток за день.
Теперь качество доставки push видно и в разрезе периода, и по текущему срезу без ручного анализа таблицы устройств.
Technical:
В `app/push.php` `push_queue_stats()` расширен блоком `delivery_summary`, который агрегирует `push_stat_*` по всем push-подпискам и считает проценты (`payload/fallback/error`).
Добавлена таблица/миграция `push_delivery_daily_stats` и запись дневной статистики при реальных отправках push (`payload/wake/fallback/error`).
В `app/push.php` реализован `delivery_trend` (последние 14 дней, с заполнением пропусков по датам) для UI-графика диагностики.
В `views/admin_settings.php` добавлены summary-блок и мини-график над таблицей устройств.
v3.5.11
2026-02-23
What is new:
Страница `Настройки` в дашборде больше не выглядит как сплошная простыня: добавлен блок быстрых переходов по разделам (якоря) и группировка по логическим секциям.
Появились явные секции: основные параметры, дизайн/уведомления, PWA/push, функции/звонки/диагностика — ориентироваться в настройках стало заметно проще.
Навигация по секциям адаптирована под мобильные устройства: на телефоне список разделов прокручивается горизонтально.
Technical:
В `views/admin_settings.php` добавлены якоря (`id`) для ключевых блоков настроек и верхняя навигационная панель без изменения backend-логики сохранения формы.
Страница сохранена как единая форма `admin_settings`, поэтому существующие `POST`-обработчики, `formaction` для push-диагностики и CSRF-проверки продолжают работать без миграций.
Добавлены локальные стили для секционной навигации и групповых маркеров (`admin-settings-*`) с mobile-friendly поведением.
v3.5.12
2026-02-23
What is new:
Hotfix страницы `Настройки`: быстрые переходы по разделам теперь ведут в нужные блоки страницы, а не в корень сайта.
Убран sticky-режим блока `Разделы настроек`, из-за которого он перекрывал интерфейс при прокрутке.
Technical:
В `views/admin_settings.php` ссылки разделов переведены с hash-only (`#...`) на route-aware (`index.php?r=admin_settings#...`) для корректной работы при наличии `<base>`/нестандартного base path.
Снята sticky-позиция с `admin-settings-nav-card` (оставлен статичный блок), чтобы навигация не накрывала карточки настроек ниже по странице.
v3.5.13
2026-02-23
What is new:
Страница `Настройки` переделана в Android-style режим: слева список разделов, справа показывается только выбранный раздел настроек.
Переключение разделов теперь происходит без переходов по странице/якорям; интерфейс не перекрывается и не дёргается.
Выбранный раздел запоминается локально, а переходы по служебным hash-ссылкам (например `#pwa-notify-admin`) открывают нужную секцию автоматически.
Technical:
В `views/admin_settings.php` реализован client-side секционный контроллер (`data-settings-nav` / `data-settings-section`) с переключением видимости блоков внутри одной формы.
Сохранена совместимость с текущим backend `admin_settings`: `POST`-логика, `formaction` кнопки push-диагностики и CSRF-проверка не менялись.
Скрытие секций переведено на progressive enhancement: блоки скрываются только после инициализации JS (`.js-sections-ready`), чтобы страница не ломалась при отключённом JS.
v3.5.14
2026-02-23
What is new:
В разделе `Система` настроек добавлен выпадающий список выбора часового пояса по Гринвичу (GMT/UTC offsets).
При выборе смещения из списка значение автоматически подставляется в поле часового пояса ниже, чтобы сохранить настройку одним кликом.
Поле ручного ввода IANA-зоны сохранено для точной настройки (например региональных зон с DST или нестандартных смещений).
Technical:
В `views/admin_settings.php` добавлена генерация preset-списка фиксированных зон `GMT-12 ... GMT+14` с валидными IANA-идентификаторами (`Etc/GMT±N`, `UTC`).
Добавлена JS-связка `systemTimezoneUtcPreset -> systemTimezoneInput`, которая подставляет выбранный preset в существующее поле `system_timezone` без изменений backend-валидации.
v3.5.15
2026-02-23
What is new:
Настройки переведены в Android-style режим с боковым меню разделов и вторым уровнем внутри `PWA и push` (`Обновления`, `Очередь push`, `Устройства`).
В главное меню добавлен отдельный пункт `Настройки` (после `Дашборд`), доступный всем авторизованным пользователям.
Настройки стали role-aware: пользователь/модератор видят личные настройки, админ — личные + админские, `admin_tester` видит всё, но может менять только пользовательские настройки.
В разделе `Система` добавлен выбор часового пояса по Гринвичу (GMT/UTC) через выпадающий список с автоподстановкой.
Technical:
Добавлен route `settings` с доступом через `sections.settings`; legacy route `admin_settings` сохранён для совместимости админ-инструментов и внутренних redirect’ов.
`index.php` (`settings/admin_settings`) разделён по scope сохранения: личные настройки (theme + notify prefs) сохраняются всем ролям, глобальные админ-настройки — только при `admin.settings` и не в режиме `admin_tester`.
В `app/policies.php` и `views/admin_policies.php` добавлена capability `sections.settings` (закреплена для всех ролей с логином).
Исправлена RBAC-связка пользовательского облака: route `dashboard` и связанные действия теперь проверяются по capability `sections.cloud`, а не `sections.dashboard` (staff dashboard).
В `views/admin_settings.php` реализован секционный контроллер с role-aware видимостью/readonly и поднавигацией PWA; у `admin_tester` админ-секции блокируются на уровне UI и backend.
v3.5.16
2026-02-23
What is new:
Админские настройки физически разнесены по отдельным страницам (`Брендинг`, `Доступ и лимиты`, `Система`, `Оформление`, `PWA и push`, `Звонки/диагностика`, `База данных`) при сохранении общего бокового меню.
Переходы в меню настроек теперь открывают соответствующий экран, а не просто переключают внутренние блоки в одном и том же URL.
Внутри `PWA и push`, `Оформление`, `Доступ и лимиты`, `Звонки и диагностика` сохранён второй уровень навигации для быстрого доступа к подпунктам.
Technical:
В `index.php` добавлены route-level страницы настроек (`settings_admin_*`) с capability-gates через `admin.settings`; legacy `admin_settings` сохранён и перенаправлен в режим `Брендинг` внутри общего шаблона.
В `views/admin_settings.php` реализована route-aware навигация: единый шаблон использует разные `action`/initial section в зависимости от текущего settings-route и корректно обрабатывает hash-переходы (`#pwa-notify-admin`, подпункты PWA и др.).
Обновлены ссылки из админских экранов (`Хранилище проекта`, управление новостями) на новую структуру настроек (`settings_admin_branding`).
v3.5.17
2026-02-23
What is new:
Hotfix страницы `Настройки`: пункты бокового меню снова выглядят как кнопки (без подчёркиваний) и заполняют всю ширину колонки.
На desktop видимый раздел настроек теперь растягивается на всю доступную ширину правой панели (как `WebRTC`), а не остаётся половинной карточкой.
На мобильных пересобрано боковое меню настроек: вертикальный стек + корректные подпункты без уезда вправо; нижняя панель сохранения больше не растягивает страницу.
Technical:
В `views/admin_settings.php` для `.admin-settings-side-btn` добавлены `display:block` и `text-decoration:none`, что устраняет регресс после перевода пунктов меню в `<a>`.
В JS-section режиме добавлен CSS override для `.js-settings-block.is-visible` внутри `.row`: `flex-basis/max-width:100%` (исправлен конфликт с Bootstrap `col-lg-6`).
Стабилизирована mobile-вёрстка меню и savebar: вертикальные sublists, wrap/savebar, защита от горизонтального overflow.
v3.5.18
2026-02-23
What is new:
Hotfix страницы `Настройки`: в разделе `База данных` убрана лишняя горизонтальная линия перед карточкой блока.
Нижняя панель сохранения (`Сохраняются все изменённые поля...`) теперь подстраивается под тему оформления и остаётся читаемой в светлой и тёмной темах.
Technical:
В `views/admin_settings.php` удалён лишний `<hr class=\"my-4\">` перед блоком `settings-db`.
Стили `admin-settings-savebar` переведены с жёстко тёмного фона (`rgba(20,22,30,...)`) на theme-aware фон через Bootstrap CSS variables (`--bs-body-bg-rgb`, `--bs-body-color`, `--bs-border-color-translucent`).
v3.6.0
2026-02-23
What is new:
Начат рефакторинг связки `Профиль / Контакты / Мессенджер`: на всех трёх экранах добавлен единый переключатель разделов (Social Hub) и явное описание роли каждого раздела.
`Профиль` теперь явно позиционируется как публичная страница пользователя (посты, медиа, страницы, друзья), `Контакты` — как каталог и управление связями, `Мессенджер` — как диалоги/вложения/звонки.
Визуально выровнены шапки и поверхности этих разделов: общие панели, кнопки-переключатели и единый стиль верхнего блока.
Technical:
Добавлен reusable partial `views/partials/social_suite.php` (единый CSS для Social Hub: header/switcher/surfaces/role-map chips).
`views/profile.php`, `views/contacts.php`, `views/chat.php` подключены к `social_suite` и получили общий navigation shell без вмешательства в критичную mobile-геометрию композера мессенджера.
Функциональные границы модулей зафиксированы в UI-текстах и cross-links, чтобы снизить дублирование сценариев между `Контактами` и `Мессенджером` без ломки backend-логики.
v3.6.1
2026-02-23
What is new:
Следующий шаг по связке `Контакты / Мессенджер`: в мессенджере блок `Быстрый старт` теперь показывает только контакты пользователя, а полный каталог вынесен в раздел `Контакты`.
В настройках исправлено выравнивание раздела `База данных`: карточка блока больше не поднимается выше меню слева.
Навигация настроек стала понятнее по смыслу: `Внешний вид профиля` (личное) и `Внешний вид сайта` (глобальный дизайн) вместо размытого дублирования `Внешний вид`/`Оформление`.
Technical:
В `views/chat.php` удалено дублирование каталога пользователей внутри мессенджера: список `Начать чат` переведён на `contacts_list($me_id)` + ссылка в `index.php?r=contacts`.
В `views/admin_settings.php` выровнен db-блок (`settings-db`) относительно общего grid/меню и обновлены подписи/подразделы блока дизайна (`ui/notify`) для разделения личных и глобальных настроек.
Убран лишний неиспользуемый `$users = users_list_basic()` из `views/chat.php`.
v3.6.2
2026-02-23
What is new:
Убран лишний `Social Hub` с экранов `Профиль / Контакты / Мессенджер`: переключение между разделами остаётся в основном меню, интерфейс снова стал компактнее.
В `Мессенджере` закреплена роль экрана: только активные диалоги и общение. Новый чат создаётся через раздел `Контакты`.
В настройках подправлена визуальная логика: db-блок выровнен относительно меню, а дизайн-настройки разведены по смыслу (`Внешний вид профиля` vs `Внешний вид сайта`).
Technical:
Удалён временный partial `views/partials/social_suite.php` и его подключения из `views/profile.php`, `views/contacts.php`, `views/chat.php` (откат лишнего UI-слоя без влияния на backend).
В `views/chat.php` удалён дублирующий сценарий старта чатов из списка пользователей/контактов: оставлен переход в `index.php?r=contacts` и история активных диалогов.
В `views/admin_settings.php` сохранён route-level Android-style settings, но доработаны подписи и визуальное выравнивание `settings-db`.
v3.6.3
2026-02-23
What is new:
Следующий шаг по связке `Контакты / Мессенджер`: в карточках пользователей на странице `Контакты` добавлены явные действия `Написать` и `Позвонить`.
Мессенджер очищен от каталоговых элементов: в боковой панели оставлены только активные диалоги, без блока быстрого старта/списков людей.
Переход на звонок из `Контактов` сразу открывает нужный диалог в мессенджере и запускает сценарий звонка.
Technical:
`index.php` (`chat_start` и `chat?start=`) теперь прокидывает `call=1` в итоговый URL диалога, чтобы из внешних экранов можно было запускать звонок напрямую.
В `views/contacts.php` унифицированы action-кнопки карточек (`Написать` / `Позвонить`) для списка контактов и каталога пользователей.
В `views/chat.php` удалён нижний блок `Новый диалог`, чтобы мессенджер нёс только роль истории диалогов + активного чата.
v3.6.4
2026-02-23
What is new:
Дожат интерфейс мессенджера под единый стиль с `Контактами`: обновлены список диалогов, шапка диалога и composer (кнопки, границы, поверхности, типографика).
Список диалогов стал визуально ближе к карточкам контактов: более ровные поверхности, одинаковая логика hover/active, читаемые превью и время.
Composer получил более аккуратный визуал (theme-aware фон, акцентная отправка, мягкие кнопки emoji/вложений) без изменения поведения ввода.
Technical:
Изменения сделаны только в `views/chat.php` на уровне CSS/визуальных состояний (`chat-dialog-item`, `chat-dialog-head`, `chat-inputbar`, action-buttons).
Мобильная геометрия ввода/клавиатуры (`fixed/sticky/viewport` логика, fullscreen layout цепочка) не изменялась, чтобы не вернуть iPhone-баг с \"подбородком\".
Верхняя панель мессенджера получила более стабильные mobile/desktop стили кнопок действий (`page-actions`) без вмешательства в маршруты и JS.
v3.6.5
2026-02-23
What is new:
Мессенджер получил второй visual-pass: доработаны карточки диалогов, шапка активного диалога, кнопки действий и composer для более цельного и лёгкого вида.
В списке диалогов добавлена компактная CTA-кнопка `Контакты` в шапке списка и более полезное пустое состояние с переходом в `Контакты`.
Плотность (`telegram / compact / roomy`) заметнее влияет не только на bubble, но и на список диалогов, шапку и кнопки мессенджера.
Technical:
В `views/chat.php` расширен UI-only CSS слой (polish pass 2): `chat-list-headbar`, `chat-dialog-item`, `chat-dialog-head`, `chat-head-btn`, `chat-compose-btn` и density overrides.
Добавлены только безопасные классы/микроразметка в `views/chat.php` (CTA в списке диалогов, классы кнопок) без изменения маршрутов, логики сообщений и звонков.
Мобильная keyboard-layout логика (`chat-composer-shell`, fullscreen/viewport поведение) не изменялась, чтобы не вернуть iPhone-bug с `подбородком`.
v3.6.6
2026-02-23
What is new:
Hotfix iPhone/PWA уведомлений: системная строка `from ...` теперь берёт бренд из настроек (`Название в шапке` → `Название сайта`), а не из старого захардкоженного `TSOY.CLOUD`.
PWA meta-теги (`application-name`, `apple-mobile-web-app-title`) синхронизированы с брендингом проекта, чтобы имя приложения и имя в уведомлениях совпадали.
Technical:
В `index.php` добавлен route `manifest`, который отдаёт динамический Web App Manifest на основе текущих настроек брендинга (`site_header_name` / `site_name`).
В `views/partials/head.php` `<link rel=\"manifest\">` переведён на динамический route с cache-bust (`APP_VERSION` + hash бренда); `application-name` и `apple-mobile-web-app-title` переведены на приоритет `site_header_name`.
В `service-worker.js` и `public/service-worker.js` fallback title уведомлений заменён с `TSOY.CLOUD` на нейтральный `Уведомление` (с поддержкой `src.appTitle`), чтобы убрать скрытый хардкод.
v3.6.7
2026-02-23
What is new:
Исправлен мобильный overflow окна `Диалоги` в мессенджере: карточка списка диалогов больше не вылезает за ширину экрана на iPhone/смартфонах.
Стабилизирована ширина mobile-раскладки мессенджера без изменений логики клавиатуры и без риска вернуть баг с `подбородком`.
Technical:
В `views/chat.php` для mobile добавлен точечный фикс ширины: убраны отрицательные отступы `row g-3` (Bootstrap gutter overflow) и зажаты `#chatListPane`/карточка/тело списка в `max-width:100%`.
Изменение ограничено CSS-слоем страницы чата; fullscreen/composer/`visualViewport` логика не изменялась.
v3.6.8
2026-02-23
What is new:
Ускорена отправка сообщений в мессенджере: сообщение появляется заметно быстрее после нажатия `Отправить`, без ощущения паузы в 2–3 секунды.
Повышена плавность UX при отправке: сервер отдаёт ответ чату сразу, а push-уведомления больше не держат отправку сообщения.
Technical:
В `index.php` (`chat_send_async`) push для нового сообщения переведён в queue-first режим: уведомление ставится в очередь без синхронной отправки (`sendNow=false`).
HTTP-ответ `chat_send_async` теперь завершается до фоновой попытки dispatch push (`fastcgi_finish_request` / flush), чтобы Web Push не блокировал отображение сообщения.
В `app/push.php` `push_notify_chat_message(...)` получил параметр `$sendNow` (по умолчанию `true`) для безопасного управления sync/async поведением без ломки остальных вызовов.
v3.6.9
2026-02-23
What is new:
Подготовлен серверный фундамент чата для больших историй переписки (сотни тысяч/миллионы сообщений) без изменения привычного интерфейса.
Список диалогов и polling чата стали легче для сервера за счёт оптимизации хранения unread-состояния и индексов под крупные переписки.
Technical:
В `conversations` добавлены денормализованные unread-счётчики (`u1_unread_count`, `u2_unread_count`) и метаданные последнего сообщения (`last_message_id`, `last_message_preview`).
В `app/chat.php` `message_send()` / `conversation_mark_read()` обновляют unread-счётчики диалога; `message_delete_for_me()` и `conversation_clear_for_me()` синхронизируют их через пересчёт/сброс.
`conversations_for_user()` больше не выполняет тяжёлый `COUNT(*)` unread для каждого диалога, если денормализованные счётчики уже доступны (используется `COALESCE(..., legacy COUNT)` как fallback для апгрейдов).
Добавлены chat-индексы для крупных историй: `conversations(user1_id,last_message_at)`, `conversations(user2_id,last_message_at)`, `messages(conversation_id,id)`, visible-индексы по `deleted_by_u1/u2`, индекс unread по `messages(conversation_id,is_read,id)`.
В `chat_messages_poll` убран лишний `mark_read`-UPDATE при пустом poll-ответе, что снижает шумовые записи в БД на активных вкладках.
v3.6.10
2026-02-23
What is new:
Полиш страницы `Контакты`: действия `Написать`, `Позвонить`, `Удалить` в карточках заменены на компактные иконки (конверт, трубка, корзина) для более чистого интерфейса.
Сохранены подсказки (`title`) и `aria-label`, чтобы UX остался понятным и доступным на ПК и мобильных устройствах.
Technical:
В `views/contacts.php` добавлены `contacts-actions` и `contacts-action-icon` (theme/density-friendly размеры икон-кнопок), заменена текстовая разметка кнопок в списке `Мои контакты` и `Каталог пользователей`.
Логика маршрутов и действий (`chat_start`, `chat_start&call=1`, add/remove contact) не изменялась.
v3.6.11
2026-02-23
What is new:
Доведён UI действий в `Контактах`: кнопка `В контакты` заменена на иконку `человек+`, чтобы все действия в карточках были в одном визуальном языке.
Заголовок `Каталог пользователей` и кнопка `Найти` теперь находятся в одной строке, поле поиска вынесено отдельно ниже на полную ширину.
Technical:
В `views/contacts.php` кнопка добавления контакта переведена на `bi-person-plus` с `title`/`aria-label`; сохранена существующая POST-логика `action=add`.
Поиск в каталоге использует `form=\"contactsSearchForm\"` у кнопки `Найти`, чтобы держать правильную desktop/mobile компоновку без изменения backend-маршрута `contacts`.
v3.6.12
2026-02-23
What is new:
Системные файлы проекта (логотип, favicon, кастомные звуки уведомлений/звонка и служебные ассеты спец-регистрации) переведены в единую системную папку `public/system/...`.
Старые пути (`public/branding`, `public/sounds`, `public/friend_register`) автоматически и мягко переносятся в новую системную структуру при запуске приложения.
Technical:
Добавлен `app/system_assets.php`: единый helper для системных ассетов (безопасное сохранение upload-файлов, удаление только из разрешённых системных директорий, миграция legacy-путей).
В `index.php` (`admin_settings`) загрузка логотипа, favicon и кастомных рингтонов переведена на `system_assets_store_upload(...)` с хранением в `public/system/branding` и `public/system/sounds`.
В `index.php` (`admin_friend_register`) картинка кошки-говешки переведена в `public/system/friend_register` с очисткой старого файла при замене/удалении.
После `ensure_schema()` вызывается `system_assets_migrate_known_settings()`, который мигрирует пути из `settings` и конфигов friend-registration в новую системную папку (best-effort, без ломки старых ссылок при ошибке переноса).
v3.6.13
2026-02-23
What is new:
В настройках переработан раздел `Внешний вид`: вместо разрозненных пунктов `Внешний вид профиля` и `Внешний вид сайта` появился единый раздел `Внешний вид` с подпунктами (профиль / сайт / стиль уведомлений).
Для глобального оформления сайта добавлены готовые профили внешнего вида (несколько пресетов под разные сценарии: чистый, рабочий, чтение, мягкий, ночной, psychedelic).
Шрифтовые пресеты пересмотрены с упором на кириллицу: добавлены/обновлены Manrope, PT Sans, Rubik и IBM Plex Sans.
Technical:
Добавлен helper `ui_appearance_profiles()` в `app/bootstrap.php` с готовыми профилями оформления и пакетами значений для `ui_*` настроек.
В `views/admin_settings.php` объединена навигация дизайна в один top-level `Внешний вид`, добавлен UI выбора/подстановки профиля оформления и обновлены кириллические шрифтовые опции.
В `views/partials/head.php` подключены кириллические web-fonts (Manrope/PT Sans/Rubik/IBM Plex Sans) и добавлен новый шрифтовой пресет `plex`.
В `index.php` и `ui_config()` расширена валидация/сохранение (`ui_font_family=plex`, `ui_appearance_profile`).
v3.6.14
2026-02-23
What is new:
Исправлен UX профиля: кнопка `Написать` больше не отображается на собственной карточке профиля.
У вложений постов в обычном просмотре убраны кнопки `Удалить`: удаление доступно только в режиме редактирования поста.
Technical:
В `views/profile.php` кнопка перехода в чат скрыта для `is_self`.
Из обычного рендера вложений в `views/profile.php` удалены формы `post_attachment_delete`; удаление оставлено в edit-блоке (`js-del-att`).
v3.6.15
2026-02-23
What is new:
В личном разделе `Настройки -> Внешний вид` добавлены персональные режимы основного бокового меню: `показывать всегда`, `скрывать всегда`, `по кнопке`.
Для публичной страницы профиля добавлена персональная настройка вида для гостей: `показывать боковое меню`, `скрывать боковое меню`, `скрывать боковое меню и шапку сайта`.
Настройки работают индивидуально для каждого профиля-пользователя (каждый `user` настраивает внешний chrome под себя).
Technical:
В `users` добавлены персональные UI-поля `ui_sidebar_mode` и `guest_profile_chrome_mode` (миграции в `app/migrations.php`).
В `index.php` (`settings`) сохранение пользовательских настроек расширено: добавлен `user_update_ui_prefs(...)` и синхронизация значений в session snapshot.
В `views/layout.php` переработана логика показа desktop sidebar / offcanvas / topbar с учётом персонального режима меню и режима публичного профиля для гостей.
v3.6.16
2026-02-23
What is new:
В мессенджере добавлено контекстное меню сообщения по правой кнопке мыши и по удержанию на мобильных устройствах.
Меню действий сообщения теперь включает `Изменить`, `Удалить`, `Цитировать` и `Реакция` (с выбором emoji).
Под сообщениями отображаются emoji-реакции с количеством; свою реакцию можно быстро переключать повторным нажатием.
Technical:
Добавлена таблица `message_reactions` (MySQL/SQLite) и миграции/индексы в `app/migrations.php`.
В `app/chat.php` добавлены batch-подгрузка реакций для пачек сообщений (`chat_messages_payload_for_client`) и `message_reaction_toggle(...)`.
В `index.php` добавлен JSON-route `chat_reaction_toggle`; polling/send-ответы чата теперь отдают реакции вместе с сообщениями.
В `views/chat.php` переиспользован существующий dropdown сообщений для right-click/long-press без изменения mobile keyboard/composer геометрии.
v3.6.17
2026-02-23
What is new:
В мессенджере у сообщений добавлена маленькая галочка статуса прочтения (`прочитано / не прочитано`).
Галочка отображается у ваших сообщений и обновляется в диалоге автоматически, когда собеседник читает чат.
Technical:
В `app/chat.php` в payload сообщений добавлен `is_read`, а также helper `conversation_last_read_sent_message_id(...)` для лёгкого read-receipt sync.
В `chat_send_async` и `chat_messages_poll` (`index.php`) добавлен `read_upto_own_id`, чтобы фронт мог обновлять статусы уже отрисованных сообщений без перезагрузки.
В `views/chat.php` добавлен компактный read-state UI (галочка) и JS-обновление статуса прочтения через polling.
v3.6.18
2026-02-23
What is new:
В контекстное меню сообщения мессенджера добавлен пункт `Будильник` (пинг-напоминание).
Будильник доступен для ваших сообщений и отправляет повторное уведомление собеседнику только если сообщение ещё не прочитано.
Technical:
Добавлен route `chat_message_nudge` в `index.php` с проверками: сообщение принадлежит текущему пользователю, находится в этом диалоге и ещё не прочитано.
В `app/push.php` добавлен `push_notify_chat_message_reminder(...)` с отдельным типом `chat_nudge` и dedupe tag по сообщению.
В `views/chat.php` пункт меню `Будильник` встроен в existing dropdown, автоматически отключается для чужих/прочитанных сообщений и показывает toast-результат.
v3.6.19
2026-02-23
What is new:
Начато внедрение голосовых сообщений в мессенджер: добавлена красная кнопка микрофона и аккуратное окно записи.
Голос записывается прямо в браузере/на устройстве и прикрепляется к сообщению как аудио-вложение.
Аудио-вложения (включая голосовые) теперь можно слушать прямо в чате через встроенный плеер.
Technical:
В `views/chat.php` добавлены voice-recorder modal, UI состояния записи и интеграция с `MediaRecorder` (MVP) без изменения keyboard/fullscreen геометрии чата.
Записанный blob прикрепляется через существующий `chatFileInput` (`DataTransfer`) и уходит в уже существующий backend upload flow `chat_send_async` / `message_send`.
Добавлен глобальный preloader при загрузке страниц сайта: пользователь видит аккуратный индикатор загрузки вместо “пустого” экрана.
Для PWA добавлен отдельный режим preloader `Идёт установка приложения…` при установке через системную кнопку.
Preloader также включается при переходах по страницам и при отправке формы установки сайта (`install.php`).
Technical:
В `views/partials/head.php` добавлен theme-aware overlay `#tsoyPreloader` (общий для сайта и установщика), работающий в светлой/тёмной теме без жёстко тёмного фона.
В `views/partials/scripts.php` добавлен runtime `window.__TSOY_PRELOADER` (show/hide/set) с автоскрытием после загрузки, показом на внутренних переходах и submit-формах (кроме AJAX submit с `preventDefault`).
PWA install flow (`beforeinstallprompt`) теперь включает состояние `pwa-install`; `appinstalled` закрывает overlay и показывает toast об успешной установке.
v3.6.21
2026-02-23
What is new:
Исправлено переключение разделов в настройках: секции теперь открываются без ощущения полной перезагрузки страницы.
В `Контактах` длинные имена пользователей больше не раздвигают и не перестраивают иконки действий: текст ужимается/переносится внутри текстовой зоны, а кнопки остаются на месте.
В шапке диалога `Мессенджера` зафиксирован блок кнопок справа (`Ссылка / Звонок / Очистить`), длинные имена больше не выталкивают кнопки и не ломают компоновку.
Technical:
В `views/admin_settings.php` клики по боковому меню настроек переведены на client-side section switch (`history.pushState`) вместо обязательной навигации по `settings_admin_*` route; `form action` динамически переключается по секции, поэтому сохранение остаётся корректным.
В `views/contacts.php` добавлены отдельные классы текстовой зоны (`contacts-person-*`), `contacts-actions` переведён в `nowrap`/`flex-shrink:0`, а длинные имена ограничены в 1–2 строки без сдвига иконок.
В `views/chat.php` шапка активного диалога усилена правилами `nowrap` для `chat-head-actions` и ellipsis для имени собеседника, без изменения mobile keyboard/composer геометрии.
v3.6.22
2026-02-23
What is new:
Hotfix preloader: убран автопоказ на каждый внутренний клик, поэтому переключение секций настроек и переходы между чатами больше не должны “подвисать” из-за overlay.
Preloader сохранён там, где он реально полезен: первичная загрузка страницы, установка сайта и установка PWA.
Technical:
В `views/partials/scripts.php` глобальный preloader переведён в explicit-flow режим: отключён автоперехват всех внутренних ссылок и обычных submit-форм.
Автопоказ preloader оставлен только для `install.php` submit и для форм с `data-preloader=\"1\"`; PWA install flow (`beforeinstallprompt`) сохранён отдельно.
Удалён неиспользуемый helper распознавания внутренних ссылок после сужения области применения preloader.
v3.6.23
2026-02-23
What is new:
В `Профиле` длинные тексты в карточках друзей/страниц и в постах ведут себя аккуратнее: текст ужимается/переносится внутри своей зоны и не ломает действия/бейджи.
В `install.php` добавлена мини-анимация этапов установки (БД → миграции → админ → готово) с синхронизацией текста в preloader.
В `Мессенджере` добавлен мобильный режим `удерживай для записи`: зажмите кнопку микрофона, отпустите — запись остановится и прикрепится к сообщению.
После записи голосового в composer теперь появляется компактное предпрослушивание (мини-аудиоплеер), а аудио-плееры в сообщениях стали компактнее.
Technical:
В `views/profile.php` добавлены clamp/overflow правила для карточек друзей/страниц и фикс action-зон в постах, чтобы длинные строки не выталкивали элементы интерфейса.
В `install.php` реализован submit-time stepper без изменения backend-логики: этапы анимируются на клиенте и обновляют `__TSOY_PRELOADER` в режиме `install-site`.
В `views/chat.php` расширен voice recorder: touch long-press (`push-to-talk`) на mobile, авто-прикрепление записи после отпускания, compact composer attachment preview для `audio/*` (включая голосовые).
В `views/chat.php` уменьшена ширина встроенного аудио-плеера в сообщениях для более плотного mobile/desktop UI.
v3.6.24
2026-02-23
What is new:
Hotfix preloader: страницы `Профиль` и `Мессенджер` открываются заметно быстрее, overlay загрузки больше не ждёт долго все картинки/медиа.
Preloader теперь скрывается на этапе готовности DOM, а не только после полного `window.load`.
Technical:
В `views/partials/scripts.php` логика initial preloader boot переведена на `DOMContentLoaded`/`interactive` + `requestAnimationFrame`, чтобы не блокировать UI на медиа-насыщенных страницах.
`window.load` и `pageshow` оставлены только как fallback-сигналы; добавлен hard fail-safe timeout на случай странных браузерных зависаний событий.
v3.6.25
2026-02-23
What is new:
Hotfix голосовых сообщений: голосовые `.webm` в мессенджере теперь отображаются плеером, а не только ссылкой на файл.
Фикс работает и для уже отправленных голосовых (по имени `voice_message_*`), и для новых записей.
Technical:
В `app/files.php` добавлена нормализация MIME для browser voice-notes (`voice_message_*`), чтобы `.webm/.ogg/.m4a` не сохранялись как generic/video MIME.
В `app/chat.php` добавлен helper `chat_file_is_audio_like(...)`, а payload чата теперь отдаёт `file_is_audio` для корректного client render старых и новых голосовых.
В `views/chat.php` server-side и polling-render плеера переведены на `file_is_audio` / smart audio-detection вместо строгой проверки только `audio/*`.
v3.6.26
2026-02-23
What is new:
На главной странице блок недавних файлов больше не растягивает экран вниз: по умолчанию показываются первые 3 файла.
Остальные файлы открываются кнопкой `Показать ещё файлы` (порциями по 3), как в разделе новостей.
Technical:
В `views/home.php` лента файлов переведена на существующий механизм `data-load-more-root` из `views/layout.php` без добавления нового JS-кода.
Для элементов файлов добавлено серверное начальное скрытие (`d-none`) после первых 3 записей, чтобы список был компактным сразу при рендере страницы.
v3.6.27
2026-02-23
What is new:
Hotfix голосовых сообщений в мессенджере: voice-notes отображаются компактной одной строкой без второй строки с именем файла.
Визуал голосового сообщения стал тоньше и аккуратнее, ближе к обычной строке сообщения.
Technical:
В `views/chat.php` voice-note рендер (`voice_message_*`) уже использует отдельный inline-layout без file-link; в релиз включён hotfix компактности CSS (`.chat-voice-inline-row`, `.chat-audio-clip.is-voice-note`).
Серверный и polling JS рендеры голосовых сообщений синхронизированы: для voice-notes не выводится отдельная строка имени файла.
v3.6.28
2026-02-23
What is new:
Голосовые сообщения в мессенджере: один тап по микрофону запускает запись, повторный тап останавливает запись и сразу отправляет голосовое.
Если запись не удалось отправить автоматически, голосовое остаётся прикреплённым в composer и можно отправить вручную.
Technical:
В `views/chat.php` обычный click/tap микрофона переведён на toggle-логику записи (`start/stop+auto-send`) без изменения mobile composer/fullscreen геометрии.
Добавлен helper программной отправки через существующий async submit (`chat_send_async`) после авто-прикрепления voice blob в composer.
v3.6.29
2026-02-23
What is new:
Голосовые сообщения в чате теперь воспроизводятся одинаково на ПК и телефоне: компактной одной кнопкой play/pause.
У voice-note больше нет зависимости от урезанных native audio-controls браузера на десктопе.
Technical:
В `views/chat.php` voice-notes (`voice_message_*`) переведены на custom mini-player (кнопка + hidden audio) в server-side и polling-render.
Добавлена JS-делегация управления воспроизведением (play/pause, синхронизация иконки, автопауза предыдущего голосового).
v3.6.30
2026-02-23
What is new:
В `Настройки -> Внешний вид` добавлены персональные настройки preloader: режим (`умный / только установка-PWA / выключить`), компактный вид и показ текста.
Preloader теперь можно настроить под себя по каждому профилю аккаунта (профиль = отдельный user).
Technical:
В `users` добавлены персональные UI-поля preloader (`ui_preloader_mode`, `ui_preloader_compact`, `ui_preloader_show_text`) с загрузкой в session snapshot и применением в `views/partials/scripts.php`.
В `views/partials/head.php` добавлены вариации preloader (`compact`, скрытие текста), а runtime учитывает пользовательский режим без ломки install/PWA сценариев.
v3.6.31
2026-02-23
What is new:
Hotfix голосовых сообщений на телефоне: mini-player voice-note снова стабильно воспроизводится по тапу.
Поведение mini-player синхронизировано для mobile/desktop (play/pause одной кнопкой).
Technical:
В `views/chat.php` для voice mini-player добавлен mobile-safe `touchend` handler с подавлением дубля `click`, чтобы iPhone/Safari не терял тап.
Скрытый `<audio>` переведён с `display:none` на visually-hidden класс; добавлен `audio.load()` перед `play()` для лучшей совместимости мобильных браузеров.
v3.6.32
2026-02-23
What is new:
В Брендинге добавлена отдельная настройка `Иконка PWA` (опционально) для установленного приложения.
Если PWA-иконка не задана, приложение теперь использует `favicon`, а затем `лого` как fallback.
Technical:
Route `index.php?r=manifest` теперь динамически подменяет `icons` (и shortcut icons) из настроек брендинга вместо жёстких `/public/icons/...`.
В `views/partials/head.php` `apple-touch-icon` переведены на динамический PWA icon с cache-bust, а `manifest` cache-bust учитывает смену иконки.
v3.6.33
2026-02-23
What is new:
В PWA исправлен просмотр файлов: теперь файл открывается во встроенной странице-просмотрщике с кнопкой `Назад`, а не “захватывает” приложение без пути назад.
Кнопка `Открыть` в файловом проводнике тоже использует этот встроенный просмотр в standalone/PWA.
Technical:
Добавлен route `index.php?r=file_viewer` с безопасной проверкой доступа к файлу и возвратом по `back` URL.
В `views/partials/scripts.php` добавлен standalone-PWA перехват ссылок `index.php?r=view&id=...` с перенаправлением во встроенный просмотрщик вместо raw-file response.
v3.6.34
2026-02-23
What is new:
Hotfix mini-плеера голосовых на телефоне: воспроизведение по тапу снова стабильно запускается.
Поведение mini-player выровнено между iPhone/Android и ПК (одна кнопка play/pause).
Technical:
В `views/chat.php` mini-player получил прямые обработчики `touchend/click` на кнопке (а не только делегирование через контейнер сообщений) с защитой от двойного срабатывания.
Убран рискованный pre-play `audio.load()` как основной путь; добавлен fallback reload только при ошибке `play()`.
v3.4.0
2026-02-23
What is new:
Добавлены полноценные push-уведомления на устройство (через Web Push + Service Worker) для сценариев, когда сайт/PWA закрыт.
Push-уведомления теперь приходят по ключевым событиям: сообщения, входящие звонки/приглашения в звонок, лайки постов, комментарии и добавления в друзья.
В звонках добавлен индикатор качества связи (RTT, джиттер, потери, битрейт) с понятной оценкой состояния соединения.
Улучшена стабильность звонков: при проблемах соединения клиент мягко инициирует переподключение и показывает статус «переподключение».
Technical:
Добавлен `app/push.php`: VAPID-ключи (автогенерация), подписки Web Push, очередь уведомлений, payloadless Web Push dispatch и pull-механизм для SW.
В `app/migrations.php` добавлены таблицы `push_subscriptions` и `push_queue` (MySQL/SQLite) с индексами для подписок и очереди доставки.
В `index.php` добавлены маршруты `push_subscribe`, `push_unsubscribe`, `push_pull`; ключевые действия (chat/call/like/comment/friend) теперь ставят события в push-очередь и триггерят доставку.
В `views/partials/scripts.php` добавлена синхронизация `PushManager`-подписки с настройкой `notify_desktop`, а в Service Worker (`service-worker.js` и `public/service-worker.js`) реализован payloadless push -> `push_pull` -> `showNotification`.
В `views/chat.php` добавлен `getStats()`-мониторинг качества WebRTC и UI-индикатор без изменения mobile composer/keyboard-геометрии (чтобы не вернуть баг с “подбородком”).
v3.4.1
2026-02-23
What is new:
Исправлено мобильное открытие окна вложений в мессенджере: attach-модалки/проводник теперь открываются поверх fullscreen-чата.
Меню профиля/переключения мультипрофилей в мобильной шапке больше не уезжает влево: dropdown центрируется по viewport.
Technical:
В `views/chat.php` поднят z-index attach-модалки и file-picker-модалки над mobile chat pane (`z-index: 2100`) и добавлена маркировка backdrop (`chat-over-chat-backdrop`).
В `views/chat.php` усилен mobile-open handler клипсы (`pointerup` + `touchend` + click guard), чтобы не терялись тапы в fullscreen-мессенджере.
В `views/partials/head.php` и `views/layout.php` добавлен mobile-centered режим для `topbar-profile-menu` (fixed + вычисляемый `top` на `show.bs.dropdown`).
v3.4.2
2026-02-23
What is new:
Исправлена навигация по клику на уведомления: уведомления теперь корректно открывают источник (чат, календарь, профиль/пост и т.д.) в браузере и PWA.
Technical:
В `views/partials/scripts.php` `__tsoyNavigateFromNotification()` переведён на резолв ссылок через `appBasePath`, а fallback `Notification.onclick` теперь использует тот же навигатор.
В `service-worker.js` / `public/service-worker.js` `notificationclick` теперь резолвит `data.url` относительно `self.registration.scope` (а не `origin`), что исправляет deep-link в установках не в корне сайта.
v3.4.3
2026-02-23
What is new:
Уведомления стали информативнее: для новых сообщений показываются имя отправителя и фрагмент текста.
Для входящих звонков в уведомления добавлены действия «Принять» и «Отклонить» (там, где это поддерживает браузер/устройство).
Technical:
В `notif_poll` добавлен preview последнего непрочитанного сообщения (`sender/body/url`), а клиентский polling в `views/partials/scripts.php` использует его для desktop-уведомлений и toast.
В `app/push.php` расширен payload Web Push: поддержка `data` и `action_urls`, а `push_notify_incoming_call()` теперь отправляет actions (`accept/close`) и URL принятия звонка.
v3.4.4
2026-02-23
What is new:
В дашборде (`Настройки`) добавлен отдельный блок настроек уведомлений: цвет, оформление toast/desktop-уведомлений, рингтон уведомлений и отдельный рингтон входящего звонка.
Добавлен блок `PWA и обновления`: политика обновления (manual/notify/auto), интервал проверки Service Worker, автозапрос persistent storage и toast-оповещения об обновлении PWA.
В открытом приложении входящий звонок теперь использует настраиваемый рингтон (если у пользователя включён звук уведомлений).
Technical:
Добавлены новые ключи настроек в `app/settings.php`; сохранение/валидация реализованы в `index.php` (`admin_settings`).
В `views/layout.php` новые настройки прокидываются в `window.__TSOY_NOTIFY` (`ui/sounds/pwa`) для runtime-слоя.
В `views/partials/scripts.php` улучшен PWA update flow: регистрация SW с учётом `appBasePath`, настраиваемый интервал `update()`, политика auto/notify/manual и методы `__TSOY_PWA_RUNTIME.checkForUpdates/applyUpdate/getUpdateState`.
В `views/partials/scripts.php` добавлены пресеты синтезируемых звуков уведомлений и рингтона звонка, а также стилизация toast/desktop notification по админ-настройкам.
v3.4.5
2026-02-23
What is new:
В настройках уведомлений добавлена загрузка своих рингтонов: отдельно для обычных уведомлений и отдельно для входящего звонка.
В админке можно прослушать загруженные рингтоны прямо в разделе настроек и удалить их при необходимости.
Technical:
Добавлены настройки `notify_sound_custom_path` и `notify_call_sound_custom_path`, а в `admin_settings` реализована загрузка аудиофайлов в `public/sounds`.
Во фронтенде (`views/layout.php` + `views/partials/scripts.php`) runtime уведомлений получил поддержку кастомных аудио-файлов с fallback на синтезированные звуки, если браузер блокирует воспроизведение.
v3.5.0
2026-02-23
What is new:
Стабилизационный релиз: проведён общий cleanup проекта, снижён шум от временных артефактов и улучшена предсказуемость работы уведомлений/PWA-настроек.
В настройках уведомлений доработана работа со своими рингтонами: при замене старые файлы корректно очищаются, а слишком большие файлы не принимаются.
Technical:
Удалены временные каталоги восстановления/аудита (`tmp_*`) из рабочей директории, которые засоряли поиск и увеличивали накладные расходы проверок.
В `scripts/check-encoding.ps1` добавлено универсальное исключение для временных каталогов `tmp_*`, чтобы сборочные проверки не сканировали техмусор.
В `views/partials/head.php` убран дублирующийся `<link rel=\"icon\">`, а в `views/layout.php` удалены лишние переменные и лишний вызов `ui_config()` для чтения акцента (используется уже загруженный `$ui`).
В `index.php` (`admin_settings`) улучшен lifecycle кастомных рингтонов: безопасное удаление старых файлов в `public/sounds`, защита от path traversal и лимит размера загружаемого рингтона (5 MB).
v3.5.1
2026-02-23
What is new:
Hotfix рингтонов на телефонах: улучшено воспроизведение кастомных рингтонов уведомлений/звонка на мобильных браузерах и PWA.
Technical:
В `views/partials/scripts.php` исправлен баг кастомного рингтона уведомлений: теперь Promise `audio.play()` реально проверяется, и при ошибке срабатывает fallback-звук.
Кастомные рингтоны теперь резолвятся через `appBasePath` (`__tsoyResolveAppUrl`) для корректной работы в установках проекта в подпапке сайта.
Добавлен mobile-safe `audio unlock` по первому взаимодействию пользователя, чтобы повысить шанс воспроизведения звука на iPhone/Android браузерах.
v3.5.2
2026-02-23
What is new:
Усилена надёжность уведомлений: добавлен серверный retry-worker для wake-push доставки с повторными попытками и backoff.
В админке (Настройки -> PWA и обновления) появился блок диагностики push-очереди: количество недоставленных элементов, состояние очереди и статус подписок.
Technical:
В `push_queue` добавлены поля состояния доставки (`dispatch_state`, попытки, backoff, lock, last_error/status) и миграции для MySQL/SQLite.
В `app/push.php` реализованы функции очереди и worker-обработки (`claim/process due`, retry/backoff, статистика очереди).
Добавлен route `index.php?r=push_worker_run` для ручного запуска worker из админки и CLI-скрипт `scripts/push-worker.php` для cron/daemon запуска.
`push_notify_user_event()` теперь сохраняет результат wake-push отправки в очередь, а `push_dispatch_user()` возвращает расширенную статистику для retry-логики.
v3.5.3
2026-02-23
What is new:
Уведомления стали стабильнее при закрытом PWA/сайте: сервер теперь пытается отправлять полноценный Web Push payload (с телом уведомления), а не только wake-push.
Сохранён fallback-режим (`wake-push + push_pull`) для совместимости, если endpoint/браузер не принимает payload.
Technical:
В `app/push.php` добавлена payload-отправка Web Push (`aes128gcm`) с VAPID и шифрованием сообщения на стороне сервера (ECDH + HKDF + AES-128-GCM).
`push_dispatch_user()` теперь умеет отправлять payload в push и возвращает раздельную статистику `payload_sent` / `wake_sent`.
Если payload доставлен без fallback на wake-push, очередь помечается как `delivered_at`, чтобы не было дубля через `push_pull`.
Service Worker (`service-worker.js`, `public/service-worker.js`) стал устойчивее к ошибкам парсинга payload: сначала пытается `json()`, затем `text()+JSON.parse()`, потом fallback на `push_pull`.
v3.5.4
2026-02-23
What is new:
В админке (`Настройки -> PWA и обновления`) добавлена диагностика push-устройств: список подписок, устройство/режим, последний успех доставки и ошибки.
Появилась кнопка `Тест push` для каждого устройства, чтобы быстро проверить доставку уведомлений на конкретную подписку.
Technical:
В `app/push.php` добавлены helper-функции диагностики: `push_subscriptions_admin_list()`, `push_subscription_get()`, `push_subscription_test_send()`.
Добавлен route `index.php?r=push_test_subscription` (admin/settings), который отправляет тестовый push на выбранную подписку и пишет результат в flash.
Тестовая отправка использует payload Web Push с fallback на wake-push, а результат обновляет `last_seen_at`/`last_error` подписки через `push_subscription_touch_result()`.
v3.5.5
2026-02-23
What is new:
Диагностика push-устройств в админке стала практичнее: добавлены фильтры (поиск, active/inactive, только с ошибками).
Для push-подписок появились действия `Отключить / Включить / Удалить` прямо в таблице устройств.
Technical:
В `app/push.php` добавлены admin-helper’ы управления подписками: `push_subscription_set_active()` и `push_subscription_delete_by_id()`, а список подписок получил серверные фильтры (`q`, `only_errors`, `state`).
В `index.php` добавлен route `push_subscription_admin_action` для безопасного управления подписками из админки (POST + CSRF + capability).
В `views/admin_settings.php` блок диагностики push-устройств получил UI-фильтры и действия по подпискам через `formaction`, без конфликта с основной формой настроек.
v3.5.6
2026-02-23
What is new:
Исправлен бренд в уведомлениях: заголовок уведомлений теперь подтягивается из настроек сайта, а не захардкожен как `TSOY.CLOUD`.
В диагностике push-устройств добавлена колонка `Последний тест` (успех/ошибка, режим `payload/wake`, HTTP-код, время).
Technical:
В `app/push.php` добавлен helper `push_app_title()` (с кешем), и серверные push-события/очередь/тестовые уведомления переведены на имя сайта из `settings`.
В `views/layout.php` + `views/partials/scripts.php` runtime уведомлений получил `siteName/siteHeaderName`; browser/PWA fallback notifications и toast теперь используют бренд из настроек.
В `push_subscriptions` добавлены поля `last_test_*` (миграции для MySQL/SQLite), а тестовая отправка подписки сохраняет режим (`payload`/`wake`) и результат в БД.
v3.5.7
2026-02-23
What is new:
В диагностике push-устройств добавлена статистика реальных доставок по подписке: `payload`, `wake`, `wake fallback`, `errors` (накопительно, с последнего сброса).
Добавлены кнопки сброса статистики доставок: для одной подписки и для всех подписок сразу.
Заголовок уведомлений теперь стабильно берётся из настроек сайта (брендинг) и для серверных push, и для клиентских fallback-уведомлений.
Technical:
В `push_subscriptions` добавлены поля `push_stat_*` и миграции для MySQL/SQLite; реальные отправки в `push_dispatch_user()` записывают статистику по подписке (`payload/wake/fallback/error`).
В `app/push.php` реализованы helper’ы `push_subscription_delivery_stats_record()` и `push_subscription_delivery_stats_reset()`.
В `index.php` добавлен admin-route `push_subscription_stats_reset`, а в `views/admin_settings.php` — отображение статистики и кнопки сброса.
В `app/push.php` + `views/layout.php` + `views/partials/scripts.php` уведомления переведены на бренд из `settings` через `push_app_title()` и runtime helper `__tsoyNotifyTitle()`.
v3.5.8
2026-02-23
What is new:
Hotfix уведомлений: название в заголовке уведомления теперь берётся в приоритете из `Название в шапке`, затем из `Название сайта`.
Исправлен fallback тестового уведомления в центре уведомлений: больше не показывает захардкоженный `TSOY.CLOUD`.
Technical:
В `views/notifications.php` fallback `new Notification(...)` переведён на бренд из `window.__TSOY_NOTIFY`.
В `views/partials/scripts.php` helper `__tsoyNotifyTitle()` теперь использует `siteHeaderName` раньше `siteName`.
В `app/push.php` helper `push_app_title()` переведён на тот же приоритет (`site_header_name` -> `site_name`).
v3.5.10
2026-02-23
What is new:
В диагностике push-устройств добавлена агрегированная сводка по всем подпискам: `payload success rate`, `fallback rate`, `error rate` и общие счётчики попыток.
Добавлен мини-график/спарклайн по дням (14 дней): stacked bars `payload / wake / errors`, где высота столбца показывает объём попыток за день.
Теперь качество доставки push видно и в разрезе периода, и по текущему срезу без ручного анализа таблицы устройств.
Technical:
В `app/push.php` `push_queue_stats()` расширен блоком `delivery_summary`, который агрегирует `push_stat_*` по всем push-подпискам и считает проценты (`payload/fallback/error`).
Добавлена таблица/миграция `push_delivery_daily_stats` и запись дневной статистики при реальных отправках push (`payload/wake/fallback/error`).
В `app/push.php` реализован `delivery_trend` (последние 14 дней, с заполнением пропусков по датам) для UI-графика диагностики.
В `views/admin_settings.php` добавлены summary-блок и мини-график над таблицей устройств.
v3.5.11
2026-02-23
What is new:
Страница `Настройки` в дашборде больше не выглядит как сплошная простыня: добавлен блок быстрых переходов по разделам (якоря) и группировка по логическим секциям.
Появились явные секции: основные параметры, дизайн/уведомления, PWA/push, функции/звонки/диагностика — ориентироваться в настройках стало заметно проще.
Навигация по секциям адаптирована под мобильные устройства: на телефоне список разделов прокручивается горизонтально.
Technical:
В `views/admin_settings.php` добавлены якоря (`id`) для ключевых блоков настроек и верхняя навигационная панель без изменения backend-логики сохранения формы.
Страница сохранена как единая форма `admin_settings`, поэтому существующие `POST`-обработчики, `formaction` для push-диагностики и CSRF-проверки продолжают работать без миграций.
Добавлены локальные стили для секционной навигации и групповых маркеров (`admin-settings-*`) с mobile-friendly поведением.
v3.5.12
2026-02-23
What is new:
Hotfix страницы `Настройки`: быстрые переходы по разделам теперь ведут в нужные блоки страницы, а не в корень сайта.
Убран sticky-режим блока `Разделы настроек`, из-за которого он перекрывал интерфейс при прокрутке.
Technical:
В `views/admin_settings.php` ссылки разделов переведены с hash-only (`#...`) на route-aware (`index.php?r=admin_settings#...`) для корректной работы при наличии `<base>`/нестандартного base path.
Снята sticky-позиция с `admin-settings-nav-card` (оставлен статичный блок), чтобы навигация не накрывала карточки настроек ниже по странице.
v3.5.13
2026-02-23
What is new:
Страница `Настройки` переделана в Android-style режим: слева список разделов, справа показывается только выбранный раздел настроек.
Переключение разделов теперь происходит без переходов по странице/якорям; интерфейс не перекрывается и не дёргается.
Выбранный раздел запоминается локально, а переходы по служебным hash-ссылкам (например `#pwa-notify-admin`) открывают нужную секцию автоматически.
Technical:
В `views/admin_settings.php` реализован client-side секционный контроллер (`data-settings-nav` / `data-settings-section`) с переключением видимости блоков внутри одной формы.
Сохранена совместимость с текущим backend `admin_settings`: `POST`-логика, `formaction` кнопки push-диагностики и CSRF-проверка не менялись.
Скрытие секций переведено на progressive enhancement: блоки скрываются только после инициализации JS (`.js-sections-ready`), чтобы страница не ломалась при отключённом JS.
v3.5.14
2026-02-23
What is new:
В разделе `Система` настроек добавлен выпадающий список выбора часового пояса по Гринвичу (GMT/UTC offsets).
При выборе смещения из списка значение автоматически подставляется в поле часового пояса ниже, чтобы сохранить настройку одним кликом.
Поле ручного ввода IANA-зоны сохранено для точной настройки (например региональных зон с DST или нестандартных смещений).
Technical:
В `views/admin_settings.php` добавлена генерация preset-списка фиксированных зон `GMT-12 ... GMT+14` с валидными IANA-идентификаторами (`Etc/GMT±N`, `UTC`).
Добавлена JS-связка `systemTimezoneUtcPreset -> systemTimezoneInput`, которая подставляет выбранный preset в существующее поле `system_timezone` без изменений backend-валидации.
v3.5.15
2026-02-23
What is new:
Настройки переведены в Android-style режим с боковым меню разделов и вторым уровнем внутри `PWA и push` (`Обновления`, `Очередь push`, `Устройства`).
В главное меню добавлен отдельный пункт `Настройки` (после `Дашборд`), доступный всем авторизованным пользователям.
Настройки стали role-aware: пользователь/модератор видят личные настройки, админ — личные + админские, `admin_tester` видит всё, но может менять только пользовательские настройки.
В разделе `Система` добавлен выбор часового пояса по Гринвичу (GMT/UTC) через выпадающий список с автоподстановкой.
Technical:
Добавлен route `settings` с доступом через `sections.settings`; legacy route `admin_settings` сохранён для совместимости админ-инструментов и внутренних redirect’ов.
`index.php` (`settings/admin_settings`) разделён по scope сохранения: личные настройки (theme + notify prefs) сохраняются всем ролям, глобальные админ-настройки — только при `admin.settings` и не в режиме `admin_tester`.
В `app/policies.php` и `views/admin_policies.php` добавлена capability `sections.settings` (закреплена для всех ролей с логином).
Исправлена RBAC-связка пользовательского облака: route `dashboard` и связанные действия теперь проверяются по capability `sections.cloud`, а не `sections.dashboard` (staff dashboard).
В `views/admin_settings.php` реализован секционный контроллер с role-aware видимостью/readonly и поднавигацией PWA; у `admin_tester` админ-секции блокируются на уровне UI и backend.
v3.5.16
2026-02-23
What is new:
Админские настройки физически разнесены по отдельным страницам (`Брендинг`, `Доступ и лимиты`, `Система`, `Оформление`, `PWA и push`, `Звонки/диагностика`, `База данных`) при сохранении общего бокового меню.
Переходы в меню настроек теперь открывают соответствующий экран, а не просто переключают внутренние блоки в одном и том же URL.
Внутри `PWA и push`, `Оформление`, `Доступ и лимиты`, `Звонки и диагностика` сохранён второй уровень навигации для быстрого доступа к подпунктам.
Technical:
В `index.php` добавлены route-level страницы настроек (`settings_admin_*`) с capability-gates через `admin.settings`; legacy `admin_settings` сохранён и перенаправлен в режим `Брендинг` внутри общего шаблона.
В `views/admin_settings.php` реализована route-aware навигация: единый шаблон использует разные `action`/initial section в зависимости от текущего settings-route и корректно обрабатывает hash-переходы (`#pwa-notify-admin`, подпункты PWA и др.).
Обновлены ссылки из админских экранов (`Хранилище проекта`, управление новостями) на новую структуру настроек (`settings_admin_branding`).
v3.5.17
2026-02-23
What is new:
Hotfix страницы `Настройки`: пункты бокового меню снова выглядят как кнопки (без подчёркиваний) и заполняют всю ширину колонки.
На desktop видимый раздел настроек теперь растягивается на всю доступную ширину правой панели (как `WebRTC`), а не остаётся половинной карточкой.
На мобильных пересобрано боковое меню настроек: вертикальный стек + корректные подпункты без уезда вправо; нижняя панель сохранения больше не растягивает страницу.
Technical:
В `views/admin_settings.php` для `.admin-settings-side-btn` добавлены `display:block` и `text-decoration:none`, что устраняет регресс после перевода пунктов меню в `<a>`.
В JS-section режиме добавлен CSS override для `.js-settings-block.is-visible` внутри `.row`: `flex-basis/max-width:100%` (исправлен конфликт с Bootstrap `col-lg-6`).
Стабилизирована mobile-вёрстка меню и savebar: вертикальные sublists, wrap/savebar, защита от горизонтального overflow.
v3.5.18
2026-02-23
What is new:
Hotfix страницы `Настройки`: в разделе `База данных` убрана лишняя горизонтальная линия перед карточкой блока.
Нижняя панель сохранения (`Сохраняются все изменённые поля...`) теперь подстраивается под тему оформления и остаётся читаемой в светлой и тёмной темах.
Technical:
В `views/admin_settings.php` удалён лишний `<hr class=\"my-4\">` перед блоком `settings-db`.
Стили `admin-settings-savebar` переведены с жёстко тёмного фона (`rgba(20,22,30,...)`) на theme-aware фон через Bootstrap CSS variables (`--bs-body-bg-rgb`, `--bs-body-color`, `--bs-border-color-translucent`).
v3.6.0
2026-02-23
What is new:
Начат рефакторинг связки `Профиль / Контакты / Мессенджер`: на всех трёх экранах добавлен единый переключатель разделов (Social Hub) и явное описание роли каждого раздела.
`Профиль` теперь явно позиционируется как публичная страница пользователя (посты, медиа, страницы, друзья), `Контакты` — как каталог и управление связями, `Мессенджер` — как диалоги/вложения/звонки.
Визуально выровнены шапки и поверхности этих разделов: общие панели, кнопки-переключатели и единый стиль верхнего блока.
Technical:
Добавлен reusable partial `views/partials/social_suite.php` (единый CSS для Social Hub: header/switcher/surfaces/role-map chips).
`views/profile.php`, `views/contacts.php`, `views/chat.php` подключены к `social_suite` и получили общий navigation shell без вмешательства в критичную mobile-геометрию композера мессенджера.
Функциональные границы модулей зафиксированы в UI-текстах и cross-links, чтобы снизить дублирование сценариев между `Контактами` и `Мессенджером` без ломки backend-логики.
v3.6.1
2026-02-23
What is new:
Следующий шаг по связке `Контакты / Мессенджер`: в мессенджере блок `Быстрый старт` теперь показывает только контакты пользователя, а полный каталог вынесен в раздел `Контакты`.
В настройках исправлено выравнивание раздела `База данных`: карточка блока больше не поднимается выше меню слева.
Навигация настроек стала понятнее по смыслу: `Внешний вид профиля` (личное) и `Внешний вид сайта` (глобальный дизайн) вместо размытого дублирования `Внешний вид`/`Оформление`.
Technical:
В `views/chat.php` удалено дублирование каталога пользователей внутри мессенджера: список `Начать чат` переведён на `contacts_list($me_id)` + ссылка в `index.php?r=contacts`.
В `views/admin_settings.php` выровнен db-блок (`settings-db`) относительно общего grid/меню и обновлены подписи/подразделы блока дизайна (`ui/notify`) для разделения личных и глобальных настроек.
Убран лишний неиспользуемый `$users = users_list_basic()` из `views/chat.php`.
v3.6.2
2026-02-23
What is new:
Убран лишний `Social Hub` с экранов `Профиль / Контакты / Мессенджер`: переключение между разделами остаётся в основном меню, интерфейс снова стал компактнее.
В `Мессенджере` закреплена роль экрана: только активные диалоги и общение. Новый чат создаётся через раздел `Контакты`.
В настройках подправлена визуальная логика: db-блок выровнен относительно меню, а дизайн-настройки разведены по смыслу (`Внешний вид профиля` vs `Внешний вид сайта`).
Technical:
Удалён временный partial `views/partials/social_suite.php` и его подключения из `views/profile.php`, `views/contacts.php`, `views/chat.php` (откат лишнего UI-слоя без влияния на backend).
В `views/chat.php` удалён дублирующий сценарий старта чатов из списка пользователей/контактов: оставлен переход в `index.php?r=contacts` и история активных диалогов.
В `views/admin_settings.php` сохранён route-level Android-style settings, но доработаны подписи и визуальное выравнивание `settings-db`.
v3.6.3
2026-02-23
What is new:
Следующий шаг по связке `Контакты / Мессенджер`: в карточках пользователей на странице `Контакты` добавлены явные действия `Написать` и `Позвонить`.
Мессенджер очищен от каталоговых элементов: в боковой панели оставлены только активные диалоги, без блока быстрого старта/списков людей.
Переход на звонок из `Контактов` сразу открывает нужный диалог в мессенджере и запускает сценарий звонка.
Technical:
`index.php` (`chat_start` и `chat?start=`) теперь прокидывает `call=1` в итоговый URL диалога, чтобы из внешних экранов можно было запускать звонок напрямую.
В `views/contacts.php` унифицированы action-кнопки карточек (`Написать` / `Позвонить`) для списка контактов и каталога пользователей.
В `views/chat.php` удалён нижний блок `Новый диалог`, чтобы мессенджер нёс только роль истории диалогов + активного чата.
v3.6.4
2026-02-23
What is new:
Дожат интерфейс мессенджера под единый стиль с `Контактами`: обновлены список диалогов, шапка диалога и composer (кнопки, границы, поверхности, типографика).
Список диалогов стал визуально ближе к карточкам контактов: более ровные поверхности, одинаковая логика hover/active, читаемые превью и время.
Composer получил более аккуратный визуал (theme-aware фон, акцентная отправка, мягкие кнопки emoji/вложений) без изменения поведения ввода.
Technical:
Изменения сделаны только в `views/chat.php` на уровне CSS/визуальных состояний (`chat-dialog-item`, `chat-dialog-head`, `chat-inputbar`, action-buttons).
Мобильная геометрия ввода/клавиатуры (`fixed/sticky/viewport` логика, fullscreen layout цепочка) не изменялась, чтобы не вернуть iPhone-баг с \"подбородком\".
Верхняя панель мессенджера получила более стабильные mobile/desktop стили кнопок действий (`page-actions`) без вмешательства в маршруты и JS.
v3.6.5
2026-02-23
What is new:
Мессенджер получил второй visual-pass: доработаны карточки диалогов, шапка активного диалога, кнопки действий и composer для более цельного и лёгкого вида.
В списке диалогов добавлена компактная CTA-кнопка `Контакты` в шапке списка и более полезное пустое состояние с переходом в `Контакты`.
Плотность (`telegram / compact / roomy`) заметнее влияет не только на bubble, но и на список диалогов, шапку и кнопки мессенджера.
Technical:
В `views/chat.php` расширен UI-only CSS слой (polish pass 2): `chat-list-headbar`, `chat-dialog-item`, `chat-dialog-head`, `chat-head-btn`, `chat-compose-btn` и density overrides.
Добавлены только безопасные классы/микроразметка в `views/chat.php` (CTA в списке диалогов, классы кнопок) без изменения маршрутов, логики сообщений и звонков.
Мобильная keyboard-layout логика (`chat-composer-shell`, fullscreen/viewport поведение) не изменялась, чтобы не вернуть iPhone-bug с `подбородком`.
v3.6.6
2026-02-23
What is new:
Hotfix iPhone/PWA уведомлений: системная строка `from ...` теперь берёт бренд из настроек (`Название в шапке` → `Название сайта`), а не из старого захардкоженного `TSOY.CLOUD`.
PWA meta-теги (`application-name`, `apple-mobile-web-app-title`) синхронизированы с брендингом проекта, чтобы имя приложения и имя в уведомлениях совпадали.
Technical:
В `index.php` добавлен route `manifest`, который отдаёт динамический Web App Manifest на основе текущих настроек брендинга (`site_header_name` / `site_name`).
В `views/partials/head.php` `<link rel=\"manifest\">` переведён на динамический route с cache-bust (`APP_VERSION` + hash бренда); `application-name` и `apple-mobile-web-app-title` переведены на приоритет `site_header_name`.
В `service-worker.js` и `public/service-worker.js` fallback title уведомлений заменён с `TSOY.CLOUD` на нейтральный `Уведомление` (с поддержкой `src.appTitle`), чтобы убрать скрытый хардкод.
v3.6.7
2026-02-23
What is new:
Исправлен мобильный overflow окна `Диалоги` в мессенджере: карточка списка диалогов больше не вылезает за ширину экрана на iPhone/смартфонах.
Стабилизирована ширина mobile-раскладки мессенджера без изменений логики клавиатуры и без риска вернуть баг с `подбородком`.
Technical:
В `views/chat.php` для mobile добавлен точечный фикс ширины: убраны отрицательные отступы `row g-3` (Bootstrap gutter overflow) и зажаты `#chatListPane`/карточка/тело списка в `max-width:100%`.
Изменение ограничено CSS-слоем страницы чата; fullscreen/composer/`visualViewport` логика не изменялась.
v3.6.8
2026-02-23
What is new:
Ускорена отправка сообщений в мессенджере: сообщение появляется заметно быстрее после нажатия `Отправить`, без ощущения паузы в 2–3 секунды.
Повышена плавность UX при отправке: сервер отдаёт ответ чату сразу, а push-уведомления больше не держат отправку сообщения.
Technical:
В `index.php` (`chat_send_async`) push для нового сообщения переведён в queue-first режим: уведомление ставится в очередь без синхронной отправки (`sendNow=false`).
HTTP-ответ `chat_send_async` теперь завершается до фоновой попытки dispatch push (`fastcgi_finish_request` / flush), чтобы Web Push не блокировал отображение сообщения.
В `app/push.php` `push_notify_chat_message(...)` получил параметр `$sendNow` (по умолчанию `true`) для безопасного управления sync/async поведением без ломки остальных вызовов.
v3.6.9
2026-02-23
What is new:
Подготовлен серверный фундамент чата для больших историй переписки (сотни тысяч/миллионы сообщений) без изменения привычного интерфейса.
Список диалогов и polling чата стали легче для сервера за счёт оптимизации хранения unread-состояния и индексов под крупные переписки.
Technical:
В `conversations` добавлены денормализованные unread-счётчики (`u1_unread_count`, `u2_unread_count`) и метаданные последнего сообщения (`last_message_id`, `last_message_preview`).
В `app/chat.php` `message_send()` / `conversation_mark_read()` обновляют unread-счётчики диалога; `message_delete_for_me()` и `conversation_clear_for_me()` синхронизируют их через пересчёт/сброс.
`conversations_for_user()` больше не выполняет тяжёлый `COUNT(*)` unread для каждого диалога, если денормализованные счётчики уже доступны (используется `COALESCE(..., legacy COUNT)` как fallback для апгрейдов).
Добавлены chat-индексы для крупных историй: `conversations(user1_id,last_message_at)`, `conversations(user2_id,last_message_at)`, `messages(conversation_id,id)`, visible-индексы по `deleted_by_u1/u2`, индекс unread по `messages(conversation_id,is_read,id)`.
В `chat_messages_poll` убран лишний `mark_read`-UPDATE при пустом poll-ответе, что снижает шумовые записи в БД на активных вкладках.
v3.6.10
2026-02-23
What is new:
Полиш страницы `Контакты`: действия `Написать`, `Позвонить`, `Удалить` в карточках заменены на компактные иконки (конверт, трубка, корзина) для более чистого интерфейса.
Сохранены подсказки (`title`) и `aria-label`, чтобы UX остался понятным и доступным на ПК и мобильных устройствах.
Technical:
В `views/contacts.php` добавлены `contacts-actions` и `contacts-action-icon` (theme/density-friendly размеры икон-кнопок), заменена текстовая разметка кнопок в списке `Мои контакты` и `Каталог пользователей`.
Логика маршрутов и действий (`chat_start`, `chat_start&call=1`, add/remove contact) не изменялась.
v3.6.11
2026-02-23
What is new:
Доведён UI действий в `Контактах`: кнопка `В контакты` заменена на иконку `человек+`, чтобы все действия в карточках были в одном визуальном языке.
Заголовок `Каталог пользователей` и кнопка `Найти` теперь находятся в одной строке, поле поиска вынесено отдельно ниже на полную ширину.
Technical:
В `views/contacts.php` кнопка добавления контакта переведена на `bi-person-plus` с `title`/`aria-label`; сохранена существующая POST-логика `action=add`.
Поиск в каталоге использует `form=\"contactsSearchForm\"` у кнопки `Найти`, чтобы держать правильную desktop/mobile компоновку без изменения backend-маршрута `contacts`.
v3.6.12
2026-02-23
What is new:
Системные файлы проекта (логотип, favicon, кастомные звуки уведомлений/звонка и служебные ассеты спец-регистрации) переведены в единую системную папку `public/system/...`.
Старые пути (`public/branding`, `public/sounds`, `public/friend_register`) автоматически и мягко переносятся в новую системную структуру при запуске приложения.
Technical:
Добавлен `app/system_assets.php`: единый helper для системных ассетов (безопасное сохранение upload-файлов, удаление только из разрешённых системных директорий, миграция legacy-путей).
В `index.php` (`admin_settings`) загрузка логотипа, favicon и кастомных рингтонов переведена на `system_assets_store_upload(...)` с хранением в `public/system/branding` и `public/system/sounds`.
В `index.php` (`admin_friend_register`) картинка кошки-говешки переведена в `public/system/friend_register` с очисткой старого файла при замене/удалении.
После `ensure_schema()` вызывается `system_assets_migrate_known_settings()`, который мигрирует пути из `settings` и конфигов friend-registration в новую системную папку (best-effort, без ломки старых ссылок при ошибке переноса).
v3.6.13
2026-02-23
What is new:
В настройках переработан раздел `Внешний вид`: вместо разрозненных пунктов `Внешний вид профиля` и `Внешний вид сайта` появился единый раздел `Внешний вид` с подпунктами (профиль / сайт / стиль уведомлений).
Для глобального оформления сайта добавлены готовые профили внешнего вида (несколько пресетов под разные сценарии: чистый, рабочий, чтение, мягкий, ночной, psychedelic).
Шрифтовые пресеты пересмотрены с упором на кириллицу: добавлены/обновлены Manrope, PT Sans, Rubik и IBM Plex Sans.
Technical:
Добавлен helper `ui_appearance_profiles()` в `app/bootstrap.php` с готовыми профилями оформления и пакетами значений для `ui_*` настроек.
В `views/admin_settings.php` объединена навигация дизайна в один top-level `Внешний вид`, добавлен UI выбора/подстановки профиля оформления и обновлены кириллические шрифтовые опции.
В `views/partials/head.php` подключены кириллические web-fonts (Manrope/PT Sans/Rubik/IBM Plex Sans) и добавлен новый шрифтовой пресет `plex`.
В `index.php` и `ui_config()` расширена валидация/сохранение (`ui_font_family=plex`, `ui_appearance_profile`).
v3.6.14
2026-02-23
What is new:
Исправлен UX профиля: кнопка `Написать` больше не отображается на собственной карточке профиля.
У вложений постов в обычном просмотре убраны кнопки `Удалить`: удаление доступно только в режиме редактирования поста.
Technical:
В `views/profile.php` кнопка перехода в чат скрыта для `is_self`.
Из обычного рендера вложений в `views/profile.php` удалены формы `post_attachment_delete`; удаление оставлено в edit-блоке (`js-del-att`).
v3.6.15
2026-02-23
What is new:
В личном разделе `Настройки -> Внешний вид` добавлены персональные режимы основного бокового меню: `показывать всегда`, `скрывать всегда`, `по кнопке`.
Для публичной страницы профиля добавлена персональная настройка вида для гостей: `показывать боковое меню`, `скрывать боковое меню`, `скрывать боковое меню и шапку сайта`.
Настройки работают индивидуально для каждого профиля-пользователя (каждый `user` настраивает внешний chrome под себя).
Technical:
В `users` добавлены персональные UI-поля `ui_sidebar_mode` и `guest_profile_chrome_mode` (миграции в `app/migrations.php`).
В `index.php` (`settings`) сохранение пользовательских настроек расширено: добавлен `user_update_ui_prefs(...)` и синхронизация значений в session snapshot.
В `views/layout.php` переработана логика показа desktop sidebar / offcanvas / topbar с учётом персонального режима меню и режима публичного профиля для гостей.
v3.6.16
2026-02-23
What is new:
В мессенджере добавлено контекстное меню сообщения по правой кнопке мыши и по удержанию на мобильных устройствах.
Меню действий сообщения теперь включает `Изменить`, `Удалить`, `Цитировать` и `Реакция` (с выбором emoji).
Под сообщениями отображаются emoji-реакции с количеством; свою реакцию можно быстро переключать повторным нажатием.
Technical:
Добавлена таблица `message_reactions` (MySQL/SQLite) и миграции/индексы в `app/migrations.php`.
В `app/chat.php` добавлены batch-подгрузка реакций для пачек сообщений (`chat_messages_payload_for_client`) и `message_reaction_toggle(...)`.
В `index.php` добавлен JSON-route `chat_reaction_toggle`; polling/send-ответы чата теперь отдают реакции вместе с сообщениями.
В `views/chat.php` переиспользован существующий dropdown сообщений для right-click/long-press без изменения mobile keyboard/composer геометрии.
v3.6.17
2026-02-23
What is new:
В мессенджере у сообщений добавлена маленькая галочка статуса прочтения (`прочитано / не прочитано`).
Галочка отображается у ваших сообщений и обновляется в диалоге автоматически, когда собеседник читает чат.
Technical:
В `app/chat.php` в payload сообщений добавлен `is_read`, а также helper `conversation_last_read_sent_message_id(...)` для лёгкого read-receipt sync.
В `chat_send_async` и `chat_messages_poll` (`index.php`) добавлен `read_upto_own_id`, чтобы фронт мог обновлять статусы уже отрисованных сообщений без перезагрузки.
В `views/chat.php` добавлен компактный read-state UI (галочка) и JS-обновление статуса прочтения через polling.
v3.6.18
2026-02-23
What is new:
В контекстное меню сообщения мессенджера добавлен пункт `Будильник` (пинг-напоминание).
Будильник доступен для ваших сообщений и отправляет повторное уведомление собеседнику только если сообщение ещё не прочитано.
Technical:
Добавлен route `chat_message_nudge` в `index.php` с проверками: сообщение принадлежит текущему пользователю, находится в этом диалоге и ещё не прочитано.
В `app/push.php` добавлен `push_notify_chat_message_reminder(...)` с отдельным типом `chat_nudge` и dedupe tag по сообщению.
В `views/chat.php` пункт меню `Будильник` встроен в existing dropdown, автоматически отключается для чужих/прочитанных сообщений и показывает toast-результат.
v3.6.19
2026-02-23
What is new:
Начато внедрение голосовых сообщений в мессенджер: добавлена красная кнопка микрофона и аккуратное окно записи.
Голос записывается прямо в браузере/на устройстве и прикрепляется к сообщению как аудио-вложение.
Аудио-вложения (включая голосовые) теперь можно слушать прямо в чате через встроенный плеер.
Technical:
В `views/chat.php` добавлены voice-recorder modal, UI состояния записи и интеграция с `MediaRecorder` (MVP) без изменения keyboard/fullscreen геометрии чата.
Записанный blob прикрепляется через существующий `chatFileInput` (`DataTransfer`) и уходит в уже существующий backend upload flow `chat_send_async` / `message_send`.
Добавлен глобальный preloader при загрузке страниц сайта: пользователь видит аккуратный индикатор загрузки вместо “пустого” экрана.
Для PWA добавлен отдельный режим preloader `Идёт установка приложения…` при установке через системную кнопку.
Preloader также включается при переходах по страницам и при отправке формы установки сайта (`install.php`).
Technical:
В `views/partials/head.php` добавлен theme-aware overlay `#tsoyPreloader` (общий для сайта и установщика), работающий в светлой/тёмной теме без жёстко тёмного фона.
В `views/partials/scripts.php` добавлен runtime `window.__TSOY_PRELOADER` (show/hide/set) с автоскрытием после загрузки, показом на внутренних переходах и submit-формах (кроме AJAX submit с `preventDefault`).
PWA install flow (`beforeinstallprompt`) теперь включает состояние `pwa-install`; `appinstalled` закрывает overlay и показывает toast об успешной установке.
v3.6.21
2026-02-23
What is new:
Исправлено переключение разделов в настройках: секции теперь открываются без ощущения полной перезагрузки страницы.
В `Контактах` длинные имена пользователей больше не раздвигают и не перестраивают иконки действий: текст ужимается/переносится внутри текстовой зоны, а кнопки остаются на месте.
В шапке диалога `Мессенджера` зафиксирован блок кнопок справа (`Ссылка / Звонок / Очистить`), длинные имена больше не выталкивают кнопки и не ломают компоновку.
Technical:
В `views/admin_settings.php` клики по боковому меню настроек переведены на client-side section switch (`history.pushState`) вместо обязательной навигации по `settings_admin_*` route; `form action` динамически переключается по секции, поэтому сохранение остаётся корректным.
В `views/contacts.php` добавлены отдельные классы текстовой зоны (`contacts-person-*`), `contacts-actions` переведён в `nowrap`/`flex-shrink:0`, а длинные имена ограничены в 1–2 строки без сдвига иконок.
В `views/chat.php` шапка активного диалога усилена правилами `nowrap` для `chat-head-actions` и ellipsis для имени собеседника, без изменения mobile keyboard/composer геометрии.
v3.6.22
2026-02-23
What is new:
Hotfix preloader: убран автопоказ на каждый внутренний клик, поэтому переключение секций настроек и переходы между чатами больше не должны “подвисать” из-за overlay.
Preloader сохранён там, где он реально полезен: первичная загрузка страницы, установка сайта и установка PWA.
Technical:
В `views/partials/scripts.php` глобальный preloader переведён в explicit-flow режим: отключён автоперехват всех внутренних ссылок и обычных submit-форм.
Автопоказ preloader оставлен только для `install.php` submit и для форм с `data-preloader=\"1\"`; PWA install flow (`beforeinstallprompt`) сохранён отдельно.
Удалён неиспользуемый helper распознавания внутренних ссылок после сужения области применения preloader.
v3.6.23
2026-02-23
What is new:
В `Профиле` длинные тексты в карточках друзей/страниц и в постах ведут себя аккуратнее: текст ужимается/переносится внутри своей зоны и не ломает действия/бейджи.
В `install.php` добавлена мини-анимация этапов установки (БД → миграции → админ → готово) с синхронизацией текста в preloader.
В `Мессенджере` добавлен мобильный режим `удерживай для записи`: зажмите кнопку микрофона, отпустите — запись остановится и прикрепится к сообщению.
После записи голосового в composer теперь появляется компактное предпрослушивание (мини-аудиоплеер), а аудио-плееры в сообщениях стали компактнее.
Technical:
В `views/profile.php` добавлены clamp/overflow правила для карточек друзей/страниц и фикс action-зон в постах, чтобы длинные строки не выталкивали элементы интерфейса.
В `install.php` реализован submit-time stepper без изменения backend-логики: этапы анимируются на клиенте и обновляют `__TSOY_PRELOADER` в режиме `install-site`.
В `views/chat.php` расширен voice recorder: touch long-press (`push-to-talk`) на mobile, авто-прикрепление записи после отпускания, compact composer attachment preview для `audio/*` (включая голосовые).
В `views/chat.php` уменьшена ширина встроенного аудио-плеера в сообщениях для более плотного mobile/desktop UI.
v3.6.24
2026-02-23
What is new:
Hotfix preloader: страницы `Профиль` и `Мессенджер` открываются заметно быстрее, overlay загрузки больше не ждёт долго все картинки/медиа.
Preloader теперь скрывается на этапе готовности DOM, а не только после полного `window.load`.
Technical:
В `views/partials/scripts.php` логика initial preloader boot переведена на `DOMContentLoaded`/`interactive` + `requestAnimationFrame`, чтобы не блокировать UI на медиа-насыщенных страницах.
`window.load` и `pageshow` оставлены только как fallback-сигналы; добавлен hard fail-safe timeout на случай странных браузерных зависаний событий.
v3.6.25
2026-02-23
What is new:
Hotfix голосовых сообщений: голосовые `.webm` в мессенджере теперь отображаются плеером, а не только ссылкой на файл.
Фикс работает и для уже отправленных голосовых (по имени `voice_message_*`), и для новых записей.
Technical:
В `app/files.php` добавлена нормализация MIME для browser voice-notes (`voice_message_*`), чтобы `.webm/.ogg/.m4a` не сохранялись как generic/video MIME.
В `app/chat.php` добавлен helper `chat_file_is_audio_like(...)`, а payload чата теперь отдаёт `file_is_audio` для корректного client render старых и новых голосовых.
В `views/chat.php` server-side и polling-render плеера переведены на `file_is_audio` / smart audio-detection вместо строгой проверки только `audio/*`.
v3.6.26
2026-02-23
What is new:
На главной странице блок недавних файлов больше не растягивает экран вниз: по умолчанию показываются первые 3 файла.
Остальные файлы открываются кнопкой `Показать ещё файлы` (порциями по 3), как в разделе новостей.
Technical:
В `views/home.php` лента файлов переведена на существующий механизм `data-load-more-root` из `views/layout.php` без добавления нового JS-кода.
Для элементов файлов добавлено серверное начальное скрытие (`d-none`) после первых 3 записей, чтобы список был компактным сразу при рендере страницы.
v3.6.27
2026-02-23
What is new:
Hotfix голосовых сообщений в мессенджере: voice-notes отображаются компактной одной строкой без второй строки с именем файла.
Визуал голосового сообщения стал тоньше и аккуратнее, ближе к обычной строке сообщения.
Technical:
В `views/chat.php` voice-note рендер (`voice_message_*`) уже использует отдельный inline-layout без file-link; в релиз включён hotfix компактности CSS (`.chat-voice-inline-row`, `.chat-audio-clip.is-voice-note`).
Серверный и polling JS рендеры голосовых сообщений синхронизированы: для voice-notes не выводится отдельная строка имени файла.
v3.6.28
2026-02-23
What is new:
Голосовые сообщения в мессенджере: один тап по микрофону запускает запись, повторный тап останавливает запись и сразу отправляет голосовое.
Если запись не удалось отправить автоматически, голосовое остаётся прикреплённым в composer и можно отправить вручную.
Technical:
В `views/chat.php` обычный click/tap микрофона переведён на toggle-логику записи (`start/stop+auto-send`) без изменения mobile composer/fullscreen геометрии.
Добавлен helper программной отправки через существующий async submit (`chat_send_async`) после авто-прикрепления voice blob в composer.
v3.6.29
2026-02-23
What is new:
Голосовые сообщения в чате теперь воспроизводятся одинаково на ПК и телефоне: компактной одной кнопкой play/pause.
У voice-note больше нет зависимости от урезанных native audio-controls браузера на десктопе.
Technical:
В `views/chat.php` voice-notes (`voice_message_*`) переведены на custom mini-player (кнопка + hidden audio) в server-side и polling-render.
Добавлена JS-делегация управления воспроизведением (play/pause, синхронизация иконки, автопауза предыдущего голосового).
v3.6.30
2026-02-23
What is new:
В `Настройки -> Внешний вид` добавлены персональные настройки preloader: режим (`умный / только установка-PWA / выключить`), компактный вид и показ текста.
Preloader теперь можно настроить под себя по каждому профилю аккаунта (профиль = отдельный user).
Technical:
В `users` добавлены персональные UI-поля preloader (`ui_preloader_mode`, `ui_preloader_compact`, `ui_preloader_show_text`) с загрузкой в session snapshot и применением в `views/partials/scripts.php`.
В `views/partials/head.php` добавлены вариации preloader (`compact`, скрытие текста), а runtime учитывает пользовательский режим без ломки install/PWA сценариев.
v3.6.31
2026-02-23
What is new:
Hotfix голосовых сообщений на телефоне: mini-player voice-note снова стабильно воспроизводится по тапу.
Поведение mini-player синхронизировано для mobile/desktop (play/pause одной кнопкой).
Technical:
В `views/chat.php` для voice mini-player добавлен mobile-safe `touchend` handler с подавлением дубля `click`, чтобы iPhone/Safari не терял тап.
Скрытый `<audio>` переведён с `display:none` на visually-hidden класс; добавлен `audio.load()` перед `play()` для лучшей совместимости мобильных браузеров.
v3.6.32
2026-02-23
What is new:
В Брендинге добавлена отдельная настройка `Иконка PWA` (опционально) для установленного приложения.
Если PWA-иконка не задана, приложение теперь использует `favicon`, а затем `лого` как fallback.
Technical:
Route `index.php?r=manifest` теперь динамически подменяет `icons` (и shortcut icons) из настроек брендинга вместо жёстких `/public/icons/...`.
В `views/partials/head.php` `apple-touch-icon` переведены на динамический PWA icon с cache-bust, а `manifest` cache-bust учитывает смену иконки.
v3.6.33
2026-02-23
What is new:
В PWA исправлен просмотр файлов: теперь файл открывается во встроенной странице-просмотрщике с кнопкой `Назад`, а не “захватывает” приложение без пути назад.
Кнопка `Открыть` в файловом проводнике тоже использует этот встроенный просмотр в standalone/PWA.
Technical:
Добавлен route `index.php?r=file_viewer` с безопасной проверкой доступа к файлу и возвратом по `back` URL.
В `views/partials/scripts.php` добавлен standalone-PWA перехват ссылок `index.php?r=view&id=...` с перенаправлением во встроенный просмотрщик вместо raw-file response.
v3.6.34
2026-02-23
What is new:
Hotfix mini-плеера голосовых на телефоне: воспроизведение по тапу снова стабильно запускается.
Поведение mini-player выровнено между iPhone/Android и ПК (одна кнопка play/pause).
Technical:
В `views/chat.php` mini-player получил прямые обработчики `touchend/click` на кнопке (а не только делегирование через контейнер сообщений) с защитой от двойного срабатывания.
Убран рискованный pre-play `audio.load()` как основной путь; добавлен fallback reload только при ошибке `play()`.
v2.3.8
2026-02-22
What is new:
Снижен лаг при открытии страниц.
Technical:
Polling-задачи переведены в менее агрессивный режим.
v2.3.10
2026-02-22
What is new:
Исправлены критические проблемы отображения текста и уведомлений.
Technical:
Подготовлена база для финальной правки кодировки.
v2.3.11
2026-02-22
What is new:
Полностью восстановлен текст интерфейса на корректной кириллице.
Исправлены сообщения профиля, чатов, звонков и административных страниц.
Technical:
index.php восстановлен из стабильной версии и очищен от поврежденных строк.
Обновлены маршруты администрирования звонков: мониторинг, закрытие и удаление комнат.
v2.3.12
2026-02-22
What is new:
Исправлено отображение текста на странице звонка по ссылке.
Восстановлены подписи и действия в админ-панели.
Technical:
Очищены поврежденные символы в views/call_room.php и views/admin.php.
В call_room добавлено управление закрытием комнаты для создателя и администратора.
v2.3.13
2026-02-22
What is new:
Зафиксировано правило: кодировка проекта только UTF-8 без BOM.
Technical:
Добавлен .editorconfig с обязательным charset=utf-8.
Добавлен scripts/check-encoding.ps1 и подключён в scripts/make-release.ps1.
v2.3.14
2026-02-22
What is new:
Улучшено качество аудиозвонков в личных и публичных комнатах.
Добавлена автопопытка восстановления соединения при сетевых сбоях.
Technical:
Вынесены единые WebRTC-параметры: ICE/STUN/TURN и аудио-профиль в настройки админа.
Убраны хардкоды RTCPeerConnection в chat/call_room/admin_call_monitor.
Добавлено применение maxBitrate для аудио sender-параметров.
v2.3.15
2026-02-22
What is new:
Звонки стали отзывчивее без перегруза сервера: события обрабатываются быстрее после действий пользователя.
Стабильнее работа в фоне и после возврата в приложение/вкладку.
Technical:
Переведены call polling-циклы на адаптивный single-flight алгоритм (без наложения запросов).
Добавлены таймауты запросов, backoff при ошибках и fast-retry после сигналов/действий.
Применено в views/chat.php, views/call_room.php, views/admin_call_monitor.php.
v2.3.16
2026-02-22
What is new:
В админке добавлены импорт и экспорт базы данных в JSON для резервного копирования и переноса.
Добавлены сервисные операции очистки БД и файлов: RTC-мусор, старый аудит, удалённые файлы и сироты в uploads.
Technical:
Добавлен модуль app/admin_maintenance.php с безопасным экспортом/импортом и обслуживанием хранилища.
Импорт БД выполняется с полной заменой данных таблиц приложения (через DELETE в транзакции, без TRUNCATE).
Добавлены маршруты admin_db_export/admin_db_import/admin_db_cleanup и UI в views/admin_db.php.
v2.3.17
2026-02-22
What is new:
Исправлена критическая ошибка отправки emoji/смайликов в мессенджере на MySQL.
После обновления сайт автоматически приводит старые таблицы чата и связанные таблицы к emoji-safe кодировке utf8mb4.
Technical:
MySQL-подключение теперь принудительно использует SET NAMES/CHARACTER SET utf8mb4.
Добавлен runtime-check кодировки таблиц через INFORMATION_SCHEMA и best-effort конвертация в utf8mb4 только при необходимости.
Авто-проверка utf8mb4 подключена в обычный запуск index.php после ensure_schema().
v2.3.18
2026-02-22
What is new:
В админке БД добавлен визуальный статус проверки utf8mb4/emoji (для MySQL).
Теперь можно быстро увидеть, есть ли таблицы или колонки, которые ещё не готовы к emoji.
Technical:
Добавлен отчёт admin_db_charset_report() по INFORMATION_SCHEMA: default charset/collation БД, таблицы и текстовые колонки.
Отчёт выведен в views/admin_db.php с компактной сводкой и таблицами проблемных объектов (если есть).
Диагностика безопасна: только чтение метаданных, без изменений данных.
v2.3.19
2026-02-22
What is new:
Переработан блок смайликов в мессенджере: быстрые emoji, недавние emoji и удобная панель выбора.
Подключена библиотека emoji picker с поиском и категориями; добавлены быстрые кнопки, включая клоуна 🤡.
Technical:
Локально подключена библиотека public/vendor/emoji-button/emoji-button.min.js (без CDN-зависимости в рантайме).
В chat composer добавено хранение недавних emoji в localStorage и fallback-режим, если библиотека недоступна.
Добавлены стили/адаптация picker для mobile full-screen чата и тёмной темы.
v2.3.20
2026-02-22
What is new:
Исправлен баг мессенджера: новые сообщения теперь появляются в открытом чате без перезахода.
Если вы находитесь внизу ленты, чат автоматически прокручивается к новым сообщениям.
Technical:
Добавлен lightweight endpoint chat_messages_poll (инкрементальная выдача сообщений по after_id).
Во views/chat.php добавлен single-flight polling и клиентский рендер новых сообщений без полной перезагрузки страницы.
Обработчики редактирования и цитирования переведены на event delegation для новых дорисованных сообщений.
v2.3.21
2026-02-22
What is new:
Список диалогов в мессенджере теперь обновляется автоматически: новые сообщения и непрочитанные появляются без перезахода в чат.
Превью последнего сообщения, время и бейдж непрочитанных синхронизируются прямо в открытом разделе «Мессенджер».
Technical:
Добавлен endpoint chat_dialogs_poll с компактной JSON-выдачей списка диалогов для текущего пользователя.
Во views/chat.php добавлен отдельный single-flight polling списка диалогов с backoff, signature-check и обновлением DOM только при изменениях.
После получения новых сообщений в открытом чате запускается fast-refresh списка диалогов для быстрого обновления превью/бейджей.
v2.3.22
2026-02-22
What is new:
Переработан интерфейс мессенджера в стиле PWA-мессенджеров: удобнее список диалогов, компактнее шапка чата и чище лента сообщений.
На телефоне чат занимает экран аккуратнее: более компактные action-кнопки, улучшенная шапка и удобнее поле ввода для быстрых сообщений.
Technical:
Во views/chat.php обновлены layout/styling для desktop и mobile (split-pane, sticky composer, адаптивная шапка, улучшенные bubbles).
UI-рефактор сделан без изменения API звонков/сообщений: логика realtime/polling сохранена.
v2.3.23
2026-02-22
What is new:
Исправлена проблема со «слетающей» авторизацией: сессия пользователя теперь сохраняется стабильнее, особенно в PWA и на мобильных устройствах.
Пользователю больше не нужно постоянно повторно входить в аккаунт при обычном использовании сайта.
Technical:
Добавлена устойчивая инициализация PHP-сессии: cookie lifetime 30 дней, gc_maxlifetime 30 дней, httponly/samesite и корректный secure через HTTPS/X-Forwarded-Proto.
Сессии вынесены в project-local storage/sessions (если доступно), чтобы изолировать их от server-wide gc других сайтов/приложений.
Добавлено sliding-refresh session cookie и session_regenerate_id(true) при логине для стабильности и безопасности.
v2.3.24
2026-02-22
What is new:
Исправлен UX мессенджера на ПК: форма ввода теперь закреплена поверх ленты сообщений и всегда видна, как в Telegram/WhatsApp.
Возвращён стеклянный (glass) вид мессенджера на телефоне и PWA-экране.
Лента сообщений переведена на догрузку по шагам: история подгружается по 10 сообщений при прокрутке вверх, новые сообщения приходят вниз компактными пачками.
Technical:
Добавлен endpoint chat_messages_before_poll (before_id) и server helper conversation_messages_before_for_user() для lazy-history.
Стартовая загрузка сообщений в чате уменьшена до компактной пачки, дальнейшая история догружается по scroll trigger.
Во views/chat.php переработан layout conversation pane: внутренний scroll у chatMessages, фиксированный composer overlay на desktop, сохранена совместимость с текущими polling/звонками.
v2.3.25
2026-02-22
What is new:
Исправлен критичный UX-баг мессенджера на ПК: при открытии диалога теперь сразу видны последние сообщения и форма ввода (без прокрутки всей страницы вниз).
Форма ввода закреплена поверх ленты сообщений, а прокрутка выполняется внутри окна чата.
Доработан стеклянный стиль mobile/PWA после предыдущего интерфейсного обновления.
Technical:
Для desktop conversation pane добавлена жёсткая высота по viewport (CSS + JS syncDesktopMessengerViewport), чтобы контент не растягивал страницу.
chatMessages переведён в гарантированно внутренний scroll-container; composer остаётся fixed/overlay внутри card.
Сохранена lazy-history логика (+10) и polling новых сообщений без изменения API звонков/чатов.
v2.3.26
2026-02-22
What is new:
Добавлен отдельный центр уведомлений: быстрые переключатели, статус разрешений браузера, Service Worker/PWA и тест уведомления на устройство.
Настройки уведомлений теперь можно менять без захода в профиль — прямо из раздела «Уведомления».
Исправлен мобильный UX мессенджера при открытии клавиатуры: уменьшен лишний отступ под полем ввода, стабилизировано положение composer (меньше прыжков).
Technical:
Маршрут notifications получил обработку POST (сохранение notify_desktop/notify_sound) и скорректирован порядок mark_seen/counts.
Во views/chat.php добавлена VisualViewport-синхронизация mobile full-screen окна чата и очищен двойной safe-area padding снизу.
v2.3.27
2026-02-22
What is new:
Добавлена публичная страница «О проекте» (`/about`) с описанием проекта и карточками участников/вклада.
В профиле (редактирование) для администратора добавлен блок управления страницей «О проекте», включая загрузку фото участников с устройства.
На странице профиля добавлены лайки постов и ссылка на конкретный пост; из ленты постов убраны дефолтные кнопки «Скачать/Магнит» (показываются только при явном разрешении скачивания).
При создании/редактировании поста теперь можно прикреплять файлы напрямую с устройства (телефон/ПК), а не только из облака.
Technical:
Добавлены маршрут `about`, pretty-route `/about` и POST-обработчик `post_like_toggle` с JSON-ответом для AJAX.
В `profile_edit` добавлено сохранение настроек страницы about через `settings` + хранение списка участников в JSON (`about_contributors_json`).
Для постов подключена серверная обработка `attach_device_files[]` через `post_attach_uploaded_device_files()` и автоопределение типа вложения по MIME.
v2.3.28
2026-02-22
What is new:
Hotfix: исправлено битое сообщение после сохранения настроек в центре уведомлений (теперь отображается нормальная кириллица).
Technical:
В `index.php` заменены оставшиеся mojibake-строки flash-сообщения `Настройки уведомлений сохранены.` в обработчиках профиля и центра уведомлений.
v2.3.29
2026-02-22
What is new:
Hotfix: исправлены оставшиеся «кракозябры» в системных сообщениях/заголовках из `index.php` (включая центр уведомлений и очистку аудита в разделе БД).
Technical:
Выполнена массовая зачистка mojibake-строковых литералов в `index.php` (восстановлена нормальная кириллица в flash/title сообщениях).
Усилен `scripts/check-encoding.ps1`: проверка mojibake теперь использует кодовые точки (`U+00C2/U+00C3/U+00D0/U+00D1`), а не хрупкий текстовый regex.
README обновлён: примеры маркеров кракозябр переведены в формат `U+` кодов, чтобы чекер не ловил демонстрационные символы.
v2.3.30
2026-02-22
What is new:
Ссылка на страницу «О проекте» добавлена в подвал рядом с версией проекта.
Настройки страницы «О проекте» вынесены из профиля в отдельный раздел администрирования в дашборде.
Добавлены роли `global_admin` и `admin_tester` (тестировщик-администратор в режиме только чтение).
Для `admin` и `admin_tester` скрыт доступ к разделу БД и к просмотру учётных данных БД.
Улучшен UX уведомлений: при включении push-переключателя разрешение запрашивается сразу.
Страница мессенджера визуально облегчена и приведена к более единому стилю.
Technical:
Добавлен маршрут `admin_about` + новая страница `views/admin_about.php`; сохранение настроек about перенесено из `profile_edit` в admin-раздел.
Расширен RBAC: новые роли (`global_admin`, `admin_tester`), нормализация политик по умолчанию, закреплённые инварианты для доступа к БД/политикам/настройкам.
Добавлен централизованный backend-guard `enforce_readonly_tester_write_guard()` для блокировки всех write-запросов роли `admin_tester`.
Маршруты admin DB/settings/policies переведены на capability-gates; добавлена маскировка DB login/password в `views/admin_db.php` для не-`global_admin`.
Обновлены уведомления в `views/notifications.php` и `views/profile_edit.php`: авто-request permission и синхронизация с runtime helper `__TSOY_NOTIFY_RUNTIME`.
v2.3.31
2026-02-22
What is new:
Исправлены права управления пользователями: первый пользователь всегда закреплён как `global_admin`, обычный администратор не может понижать/блокировать/удалять его и сбрасывать ему пароль.
Роль `admin_tester` теперь может пользоваться обычными функциями приложения (включая профиль и фото), при этом изменения в админ-разделах по-прежнему заблокированы.
Мессенджер и верхнее меню теперь корректнее используют данные профиля (имя/аватар), а список диалогов подхватывает фото и `display_name` в том числе при автообновлении.
Technical:
Добавлены backend-инварианты для первого пользователя (`user_ensure_first_global_admin`, запрет бана/удаления первого пользователя) и защита операций над `global_admin` в `admin_users`.
Глобальный guard `admin_tester` сужен до write-операций админ-разделов, чтобы не ломать обычный пользовательский функционал.
Серверные payload-ы чата и SSR/JS-рендер унифицированы по `display_name`/`avatar_path`; обновлён session-refresh в `views/layout.php` и `auth_login()`.
v2.3.32
2026-02-22
What is new:
Исправлена логика публичных файлов: фото участников со страницы `/about` остаются публичными, но больше не попадают в ленту «Публичные файлы» на главной.
Улучшена навигация и нейминг: пользовательское облако переименовано в «Мои файлы», а `admin`-экран оформлен как «Файлы проекта».
Экран `admin` визуально приведён ближе к интерфейсу «Мои файлы» (единая шапка страницы, похожая таблица и структура действий).
Technical:
В `app/files.php` добавлена фильтрация публичной ленты по исключениям (`files_public_feed_excluded_ids()`), сейчас туда входят фото участников из `about_contributors_json`.
Обновлены заголовки/подписи в `views/home.php`, `views/dashboard.php`, `views/admin.php`, `views/layout.php`, `views/staff.php`, `views/chat.php`, `views/contacts.php` для уменьшения путаницы между пользовательским и административным файловыми экранами.
В `views/admin_about.php` добавлена явная подсказка о новом поведении публичных фото страницы `/about`.
v2.3.33
2026-02-22
What is new:
Добавлена отдельная «мемная» invite-регистрация для друзей с автоназначением ролей `admin` и `admin_tester` по токен-ссылке.
Страница спец-регистрации получила отдельный дизайн с анимациями и роль-специфичными сообщениями (admin/tester).
Форма спец-регистрации и тексты страницы теперь настраиваются из дашборда (тема, подписи, кнопки, ссылки-инвайты).
Technical:
Добавлен модуль `app/friend_registration.php`: JSON-конфиг спец-регистрации, токены, invite-ссылки, нормализация и resolve роли по токену.
В `index.php` добавлены маршруты `friend_register` и `admin_friend_register`, а также pretty-route `/friend-invite/<token>`.
Добавлены страницы `views/friend_register.php` и `views/admin_friend_register.php`, плюс ссылка на раздел в `views/staff.php`.
v2.3.34
2026-02-22
What is new:
Hotfix: устранены предупреждения Deprecated на PHP 8.4+ в модуле спец-регистрации друзей.
Technical:
В `app/friend_registration.php` сигнатуры helper-функций обновлены с implicit nullable (`array $cfg = null`) на явный nullable тип (`?array $cfg = null`).
v2.3.35
2026-02-22
What is new:
В спец-регистрацию друзей встроен виджет «кошка-говешка» с анимированным блоком внутри формы.
В настройках спец-регистрации можно загрузить фото кошки с устройства, включать/выключать блок и настраивать подпись/бейдж.
Добавлен глобальный UI-пресет `Psychedelic` для всего проекта (фон, карточки, кнопки, формы, таблицы, навигация и анимации).
Technical:
Спец-регистрация расширена настройками `cat_*` в `app/friend_registration.php`; загрузка изображения реализована в `index.php` и хранится в `public/friend_register/`.
В `views/friend_register.php` добавлен анимированный cat-widget с безопасным fallback без картинки.
Глобальная тема вынесена в preset `ui_style_preset` (`default|psychedelic`) через `ui_config()` и `views/partials/head.php`; управление добавлено в `views/admin_settings.php`.
v2.3.36
2026-02-22
What is new:
Базовый пресет оформления снова по умолчанию `Default`, а `Psychedelic` оставлен как опциональный вариант в настройках.
Уведомления о сообщениях и событиях теперь открывают соответствующий раздел (чат или календарь), а не всегда центр уведомлений.
Отправка сообщений в мессенджере переведена на асинхронный режим: обновляется только область чата без полной перезагрузки страницы.
Technical:
Добавлен JSON endpoint `chat_send_async` и клиентский submit-handler во `views/chat.php` для AJAX-отправки сообщения с поддержкой вложений.
В `notif_poll` добавлены target-ссылки (`chat`/`calendar`), а `views/partials/scripts.php` формирует отдельные device-notifications с корректным `data.url`.
Возврат дефолта пресета выполнен в `app/settings.php`, `ui_config()` (`app/bootstrap.php`), `views/admin_settings.php` и обработчике `admin_settings` в `index.php`.
v2.3.37
2026-02-22
What is new:
Мессенджер структурно облегчён: более компактный header/messages/composer stack, меньше визуальной тяжести и ближе к привычной мобильной логике.
Исправлено поведение поля ввода в мобильном полноэкранном чате: composer больше не “съезжает” вниз из-за наложенных padding/overlay-стилей.
Пузырьки сообщений и панель действий стали компактнее и чище, при этом все функции (редактирование, вложения, эмодзи, звонки) сохранены.
Technical:
В `views/chat.php` добавлены структурные классы (`chat-list-card`, `chat-conv-card`, `chat-conv-body`, `chat-composer-shell`) и финальный CSS override-блок с упрощённой layout-схемой.
Убран тяжёлый overlay-режим composer для conversation pane (через CSS overrides), сообщения снова живут в нормальном flex-stack без лишнего bottom-overlay padding.
Мобильный fullscreen-pane нормализован по safe-area: один источник нижнего отступа для composer вместо конфликтующих стилей.
v2.3.38
2026-02-22
What is new:
Перестроена DOM-структура окна диалога: `chatMessages` теперь единый контейнер на всю область чата, внутри которого находятся шапка, лента сообщений и composer.
Шапка диалога и панель ввода встроены внутрь общего контейнера как в современных мессенджерах, что улучшает поведение на мобильных экранах.
Скролл сообщений выделен во внутренний контейнер, чтобы сохранить плавность и корректную работу кнопки «Новые сообщения».
Technical:
В `views/chat.php` `id=\"chatMessages\"` переведён в роль root-container conversation pane, а scroll-area вынесена в `id=\"chatMessagesScroll\"`.
JS-логика мессенджера обновлена на новый scroll-target (`chatMessagesScroll`) с backward fallback на старую структуру.
Добавлены CSS-правила для 100% ширины/высоты `#chatMessages` внутри `chat-conv-body` и новой иерархии `chat-thread-shell` / `chat-thread-scroll-wrap`.
v2.3.39
2026-02-22
What is new:
Уменьшен зазор между клавиатурой и полем ввода в мобильном мессенджере (почти вплотную, несколько миллиметров).
Панель ввода в fullscreen-чате лучше поджимается к клавиатуре на iPhone/iOS.
Technical:
В `views/chat.php` добавлен динамический CSS var `--chat-mobile-composer-gap` и логика `visualViewport`-детекта открытой клавиатуры.
При открытой клавиатуре fullscreen-pane чата растягивается до видимого нижнего края без лишнего white-gap из-за `visualViewport.offsetTop`.
v2.3.40
2026-02-22
What is new:
Исправлен большой пустой отступ между полем ввода и клавиатурой в мобильном мессенджере (fullscreen chat).
Панель ввода и лента сообщений теперь корректно сжимаются при открытии клавиатуры.
Technical:
В `views/chat.php` снят конфликтующий `min-height`/жёсткая высота на mobile fullscreen-цепочке контейнеров (`chat-conv-body` → `#chatMessages` → scroll-wrap → `#chatMessagesScroll`).
Горячий фикс рассчитан на iOS/Safari/PWA сценарии, где клавиатура уменьшает viewport и ломает flex-layout с `min-height`.
v2.3.41
2026-02-22
What is new:
Дополнительно исправлен большой зазор над клавиатурой на iPhone: поле ввода поджимается ближе даже при включённой assistant/suggestions панели iOS.
Technical:
В `views/chat.php` добавлена реальная компенсация нижнего зазора по измерению положения composer относительно viewport (а не только по `visualViewport.height`).
Учтён iOS-кейс, когда `visualViewport` и `window.innerHeight` расходятся на высоту assistant/suggestions панели клавиатуры.
v2.3.42
2026-02-22
What is new:
Для диагностики iPhone-отступа убрана встроенная (inline) панель быстрых смайликов из формы сообщения в мессенджере.
Кнопка смайликов в composer теперь открывает полный emoji picker, если inline-панель отключена.
Technical:
Из `views/chat.php` удалён блок `chat-emoji-panel` внутри composer; JS-клик по `emojiBtn` переведён на fallback `toggleFullEmojiPicker()` при отсутствии inline-панели.
v2.3.43
2026-02-22
What is new:
Для диагностики iPhone-отступа убран набор layout-классов у нижнего блока `attachHint / Убрать вложение` в composer мессенджера.
Technical:
В `views/chat.php` блок под composer (с `attachHint` и `attachClearBtn`) упрощён до обычного контейнера без `d-flex/.../mt-2`.
v2.3.44
2026-02-22
What is new:
Для диагностики iPhone-отступа убран класс `small text-secondary` у блока `attachHint` в composer мессенджера.
Technical:
В `views/chat.php` элемент `#attachHint` оставлен без CSS-классов, чтобы исключить влияние типографики/line-height на высоту composer.
v2.3.45
2026-02-22
What is new:
Для диагностики iPhone-отступа удалён `id=\"attachHint\"` у нижнего блока composer и связанный CSS-минимум высоты.
Technical:
В `views/chat.php` удалено правило `#chatConvPane #attachHint { min-height ... }`, а сам элемент оставлен без `id`, чтобы исключить его вклад в высоту composer.
v2.3.46
2026-02-22
What is new:
Мессенджер вынесен из общего `container py-4` в отдельное “полотно” layout (full-canvas host), чтобы уменьшить конфликты мобильного fullscreen-режима с обёртками страницы.
Это изменение направлено именно на iPhone-баг с большим отступом над клавиатурой: чат теперь живёт в более простой DOM-структуре без общей контейнерной обвязки страницы.
Technical:
В `views/layout.php` добавлен route-aware режим `contentCanvasRoute` для `chat`: контент мессенджера рендерится в `chat-canvas-stage` вне `container py-4`.
В `views/chat.php` обновлены mobile fullscreen-селекторы, которые раньше были жёстко привязаны к `.container.py-4`, теперь они поддерживают `.chat-canvas-stage`.
v2.3.47
2026-02-22
What is new:
Мессенджер после фикса iPhone-клавиатуры дополнительно очищен и визуально облегчён: обновлены шапка страницы, список диалогов, полотно сообщений и composer.
Строка состояния редактирования в composer теперь показывается только в режиме редактирования, а не занимает место постоянно.
Technical:
Из `views/chat.php` удалён временный JS-компенсатор `tightenComposerToViewportBottom()` и связанный runtime-костыль `--chat-mobile-composer-gap`, оставлена более простая `visualViewport`-синхронизация.
Добавлены финальные CSS-overrides для canvas-режима чата (`chat-canvas-stage`) без возврата к старой layout-обвязке `container py-4`.
v2.3.48
2026-02-22
What is new:
На главной в разделе «Новости» теперь по умолчанию показываются только первые записи, остальные открываются кнопкой «Загрузить ещё».
В истории версий (технические новости по версиям) добавлен такой же режим постепенной подгрузки списка через кнопку «Показать ещё версии».
В профилях ролей `admin`, `global_admin` и `admin_tester` добавлен значок подтверждения рядом с именем.
Technical:
В `views/layout.php` добавлен универсальный client-side `load more`-инициализатор для блоков с `data-load-more-*`.
Разметка новостей на главной (`views/home.php`) и модалки истории версий (`views/layout.php`) переведена на единый шаблон постепенного раскрытия списка.
В `views/profile.php` добавлена role-aware отрисовка verified-иконки с tooltip для админских ролей.
v2.3.49
2026-02-22
What is new:
Исправлен повторный iPhone-баг в мессенджере с большим отступом между клавиатурой и полем ввода (runtime-компенсация viewport/composer для mobile fullscreen).
Новости на главной и технические заметки по версиям теперь действительно свёрнуты по умолчанию (первые 3 записи), остальные открываются через кнопку «Показать ещё / Загрузить ещё».
Блок разработчиков на странице `/about` теперь подтягивает имя, роль и фото из профилей администраторов (`global_admin`, `admin`, `admin_tester`), отдельно настраивается только заметка о вкладе.
Technical:
В `views/chat.php` возвращена измеряемая компенсация `visualViewport` по фактическому gap до composer (без возврата старого `--chat-mobile-composer-gap` костыля).
В `views/layout.php` исправлен клиентский `load more`-инициализатор (Safari-safe проверка вместо `ParentNode`) и добавлено серверное начальное сворачивание версий.
Добавлены `users_about_developers()` и `user_role_label_ru()` в `app/users.php`; `/about` и `admin_about` переведены на данные профилей + `about_developer_notes_json`.
v2.3.50
2026-02-22
What is new:
В мессенджере убрана служебная подпись под именем собеседника; клик по фото/имени в шапке диалога теперь открывает профиль собеседника.
Профиль расширен: значок админ-роли для администраторов, список друзей, количество друзей, а также кнопки добавления/удаления из друзей прямо на странице профиля.
В настройках профиля для ролей разработчиков (`global_admin`/`admin`/`admin_tester`) добавлен переключатель показа карточки на странице `/about` (по умолчанию включён).
Обложки постов теперь отображаются на всю ширину карточки; выбор обложки переведён на кнопку + модальное окно с выбором из облака или загрузкой с устройства (создание и редактирование поста).
Technical:
Добавлены helper-функции для видимости карточек разработчиков на `/about` (`about_developer_visibility_json`, `user_about_card_visible()`, `user_about_card_set_visible()`) и фильтрация в `users_about_developers()`.
Маршруты `post_create/post_update` получили поддержку `cover_device_file` через новый helper `post_cover_from_upload()` в `app/posts.php`.
Маршрут `contacts` поддерживает безопасный redirect назад на профиль после add/remove контакта.
v2.3.51
2026-02-22
What is new:
В мессенджере из composer удалён нижний блок `chat-attach-row` (подсказка/кнопка вложения), чтобы убрать лишнюю высоту и iPhone-gap («подбородок»).
Technical:
Из `views/chat.php` удалена разметка `div.chat-attach-row`; JS обработчики вложений уже безопасно работают при отсутствии `attachHint/attachClearBtn`.
v2.3.52
2026-02-22
What is new:
Усилен iPhone-fix для мессенджера: composer в mobile fullscreen при открытой клавиатуре закрепляется в `fixed`-режиме относительно видимой области, чтобы убрать большой зазор над клавиатурой.
Technical:
В `views/chat.php` добавлен режим `chat-composer-vv-fixed` + JS-синхронизация с `visualViewport` (адаптивно: `bottom=0` или компенсация `keyboardInset`, если fixed элемент уходит под клавиатуру).
v2.3.53
2026-02-22
What is new:
В мессенджере с composer снят класс `chat-sticky` (оставлен только `chat-composer-shell`) — hotfix для iPhone-отступа над клавиатурой.
Technical:
В `views/chat.php` удалён `chat-sticky` у обёртки формы сообщений, чтобы исключить конфликт sticky/fixed логики в mobile fullscreen.
v2.3.54
2026-02-22
What is new:
Ещё один iPhone hotfix для мессенджера: при открытой клавиатуре `fixed`-composer больше не обрезается контейнерами чата (снят clipping/blurs на время mobile keyboard mode).
Technical:
В `views/chat.php` добавлен режим `chat-composer-vv-mode`: при активной клавиатуре снимаются `overflow:hidden` и `backdrop-filter` у `chat-conv-card/chat-conv-body`, чтобы Safari не привязывал/не обрезал `position: fixed` composer внутри карточки.
v2.3.55
2026-02-22
What is new:
В мессенджере переписан mobile-composer режим для iPhone: поле ввода при открытой клавиатуре выносится в отдельный viewport-портал, чтобы не появлялся большой зазор над клавиатурой.
Technical:
В `views/chat.php` реализован `composer portal` (spacer + перенос `.chat-composer-shell` в `body` при mobile keyboard mode) вместо прежней fixed/sticky-компенсации внутри карточки чата.
v2.3.56
2026-02-22
What is new:
Добавлена система мультипрофилей: у одного аккаунта можно создавать, переключать и удалять несколько профилей через меню по клику на имя/аватар в шапке.
Для ролей разработчиков (`global_admin`/`admin`/`admin_tester`) добавлен выбор, какой профиль показывать на странице `/about`.
Лента файлов на главной переработана: авторизованный пользователь видит свои последние файлы, гость — файлы, загруженные гостями; в «Мои файлы» добавлены массовые и папочные действия «сделать доступными для всех».
Для постов добавлена настройка «Скрыть пост от гостей»; на открытом профиле гости видят только разрешённые публикации, а вложенные медиа (обложки/фото/аудио/видео) открываются через публичный профиль.
Technical:
В `app/migrations.php` добавлены `user_profiles`, колонки `users.active_profile_id/users.about_profile_id` и `posts.hide_from_guests`.
В `app/users.php` реализованы helper-ы мультипрофилей (bootstrap/create/switch/delete/sync/about-select) и overlay данных выбранного профиля в `/about`.
В `app/files.php` добавлены `files_recent_for_user()/files_recent_for_guests()`, массовая/папочная публичность и inline-доступ к медиа постов публичного профиля через `file_is_readable_by(..., $inline_view=true)`.
v2.3.57
2026-02-22
What is new:
Мессенджер откатан по фронтенду (`views/chat.php`) к состоянию релиза `2.3.46` — это версия, на которой исчезал iPhone-gap («подбородок») над клавиатурой.
Technical:
Сравнение показало, что `views/layout.php` (перенос чата в `chat-canvas-stage`) остаётся правильным; регрессия появилась позже в `views/chat.php` после добавления mobile keyboard viewport-хаков (`chat-composer-vv-portal`, `chat-composer-vv-fixed`, `chat-composer-vv-mode`, spacer/portal composer).
Откат выполнен точечно только для мессенджера: `views/chat.php` взят из архива `releases/tsoycloud_v2.3.46_2026-02-22.zip`.
v2.3.58
2026-02-22
What is new:
Мультипрофили переработаны: теперь каждый профиль аккаунта — это отдельный пользователь со своим логином и собственной страницей `/user/<login>` (отдельные посты, файлы и медиа).
В меню профилей аккаунта создание профиля теперь запрашивает отдельный логин (`username`) и отображаемое имя; основной профиль нельзя удалить.
Для ролей разработчиков выбор профиля для `/about` продолжает работать, но теперь выбирается реальный профиль-пользователь аккаунта.
Technical:
Логика `user_profiles_*` в `app/users.php` переведена с таблицы `user_profiles` на связанные записи `users` через `owner_account_user_id` (старую таблицу больше не используем как источник истины).
В `app/auth.php` добавлен `auth_session_apply_active_profile()` и `$_SESSION[\"auth_user_id\"]`: сессия хранит владельца аккаунта отдельно от активного профиля (`$_SESSION[\"user\"]`).
В `index.php`, `views/layout.php`, `views/profile_edit.php` управление профилями переведено на `current_account_owner_id()`, чтобы переключение/выбор `/about` работали на уровне аккаунта, а редактирование — на уровне активного профиля.
v2.3.59
2026-02-22
What is new:
Мессенджер улучшен поверх стабильной базы (без возврата mobile keyboard-хаков): имя/аватар собеседника в шапке снова открывают профиль, убрана лишняя служебная подпись.
В профиле добавлены отдельные блоки медиа: фото, видео и аудио (для владельца — из облака, для гостей/других пользователей — из видимых постов).
Добавлены комментарии к постам во всплывающем окне: просмотр, добавление, удаление (по правам).
Добавлен конструктор пользовательских страниц (блоки текст/галерея/ссылки) + публичный маршрут `/page/<user>/<slug>` и публикация страницы в виде поста на профиле.
Technical:
В `app/migrations.php` добавлены таблицы `post_comments` и `user_pages`.
В `app/posts.php` реализованы helpers комментариев и поддержка внутренних ссылок (`/page/...`) в `post_attachment_add_link()` для публикации страниц.
Добавлен новый helper `app/pages.php` (CRUD страниц, нормализация блоков, публичный рендер, публикация в посты); подключены маршруты `my_pages`, `user_page_*`, `post_comment_*` в `index.php`.
v2.3.60
2026-02-22
What is new:
Исправлено мобильное меню профилей в шапке: dropdown больше не уезжает влево на узких экранах (ограничена ширина, стабилизировано позиционирование).
Technical:
В `views/layout.php` профильный dropdown переведен на `data-bs-display=\"static\"` и вынесен на отдельный класс `topbar-profile-menu`; в `views/partials/head.php` добавлены mobile-safe стили ширины/переполнения.
v2.3.61
2026-02-22
What is new:
Исправлен раздел «Медиа» в профиле: теперь он показывает только контент, который пользователь явно добавил в посты (обложки и вложения), а не все файлы из облака.
Technical:
В `views/profile.php` блок `Медиа` переведен на единый источник данных (медиа из постов) для владельца и гостей; облачные файлы владельца больше не попадают туда автоматически.
v2.3.62
2026-02-22
What is new:
Профиль переведён на более современный шаблонный стиль: обновлены карточки, шапка профиля и добавлены верхние вкладки разделов (Посты/Друзья/Страницы/Медиа).
Разделы Фото/Видео/Аудио теперь работают как отдельные ручные галереи профиля: пользователь сам добавляет контент в галереи, а не получает автоподбор из облака/постов.
Владелец профиля может управлять галереями: добавлять файлы из облака, загружать с устройства и удалять элементы галереи.
Экран редактирования профиля визуально подтянут к новому стилю профиля.
Technical:
Добавлен helper `app/profile_media.php` и таблица `profile_media_items` (ручные галереи профиля) с миграцией в `app/migrations.php`.
Добавлен маршрут `profile_media_gallery` в `index.php` (добавление/удаление элементов галереи, загрузка файлов с устройства).
В `app/files.php` расширен inline-доступ к файлам для публичных профильных галерей (`profile_media_file_inline_visible_on_public_profile()`).
v2.3.63
2026-02-22
What is new:
Профиль ещё ближе к новому шаблону: усилен визуал шапки (cover/avatar/chips/статистика), обновлены карточки друзей/страниц/медиа и общий стиль карточек постов/модалок.
Улучшена навигация по разделам профиля через верхние вкладки с сохранением активной вкладки.
Technical:
В `views/profile.php` расширен слой профильных стилей и добавлены счётчики/визуальные блоки без изменения бизнес-логики постов, комментариев и ролей.
v2.3.64
2026-02-22
What is new:
Посты на странице профиля ещё ближе к новому шаблону: добавлен header карточки (аватар/имя/@username/время), улучшен action-bar и визуал карточек.
Модалка комментариев профиля визуально переработана и на мобильных ведёт себя ближе к формату bottom-sheet.
Technical:
В `views/profile.php` добавлены профильные UI-классы для карточек постов и комментариев без изменения текущей логики лайков/комментариев/прав доступа.
v2.3.65
2026-02-22
What is new:
Управление галереями профиля перенесено в модалку (вместо collapse), что ближе к новому шаблону и удобнее на мобильных устройствах.
Экран `Редактировать профиль` заметно переработан визуально: добавлен hero-preview профиля, улучшены блоки загрузки аватара/обложки и группировка полей.
Technical:
В `views/profile.php` блок управления ручными галереями переведён на modal-layout без изменения логики форм `profile_media_gallery`.
В `views/profile_edit.php` добавлены новые UI-обёртки и стили (`profile-edit-header-*`, `profile-edit-fieldset`, `profile-edit-upload-*`) при сохранении прежних POST-полей.
v2.3.66
2026-02-22
What is new:
Профиль дополнительно отполирован под мобильные устройства: карточки друзей и страниц стали компактнее и аккуратнее на узких экранах.
В модалке комментариев улучшен блок ввода: форма стала ближе к привычному мобильному composer-формату.
Сетка медиа в профиле уплотнена и выровнена для более ровного отображения на телефонах.
Technical:
В `views/profile.php` добавлены mobile-first стили и классы для списков друзей/страниц, медиасетки и composer-разметки комментариев без изменения бизнес-логики.
v3.0.0
2026-02-22
What is new:
Подготовлен крупный профильный апдейт 3.0: улучшен mobile UX профиля (Друзья/Страницы/Медиа), а форма комментариев в модалке стала ближе к привычному мобильному composer-формату.
Полностью переработан интерфейс мультипрофилей в шапке: новый dropdown с быстрым переключением, аватарами и статусами профилей.
Модалка «Профили аккаунта» получила новый карточный UI: создание профиля, переключение, удаление, переименование и выбор профиля для `/about` стали заметно понятнее.
Technical:
В `views/layout.php` переписана разметка topbar dropdown и модалки `#userProfilesModal` без изменения существующих роутов/POST-действий (`user_profiles`).
В `views/partials/head.php` добавлен новый слой стилей для мультипрофильного UX (`topbar-profile-*`, `user-profiles-modal-modern`, `user-profile-card*`) с адаптацией под мобильные экраны.
В `app/news.php` добавлена системная новость о релизе 3.0.0 для главной страницы.
v3.0.1
2026-02-22
What is new:
На странице профиля кнопка копирования публичной ссылки теперь копирует адрес в буфер и показывает диалог «Скопировано».
При открытии профиля по публичной ссылке `/user/<username>` скрывается боковое меню (desktop + mobile offcanvas), страница выглядит ближе к формату соцсети.
Technical:
В `views/profile.php` обновлён helper `copyText()` для кнопок `.js-copy`: успешное копирование подтверждается диалогом, fallback остаётся только при ошибке clipboard API.
В `views/layout.php` добавлен режим публичной страницы профиля (`$publicProfilePageRoute`) с условным отключением sidebar/offcanvas и корректировкой mobile topbar-отступа.
v3.0.2
2026-02-22
What is new:
На страницах профиля боковое меню теперь скрывается только у гостей. Для авторизованных пользователей навигация в профиле снова доступна.
Technical:
В `views/layout.php` режим “соц-страницы без меню” ограничен только гостевым просмотром публичного профиля (`$guestPublicProfileSocialMode`).
v3.0.3
2026-02-22
What is new:
Кнопки «Ссылка на профиль» и «Ссылка на пост» на странице профиля теперь копируют ссылку в буфер по одному клику.
Technical:
В `views/profile.php` copy-handler для `.js-copy/.js-magnet` усилен: добавлены `preventDefault/stopPropagation` и fallback-копирование через `textarea + execCommand(copy)` без обязательного `prompt`.
v3.1.0
2026-02-22
What is new:
Конструктор пользовательских страниц серьёзно переработан: добавлены блоки «Статья», «Гайд» и «Плеер роликов» помимо галереи/ссылок.
В выборе файлов для конструктора страниц больше не нужны ID вручную: добавлен единый проводник файлов с папками, поиском, фильтрами и мультивыбором.
Раздел «Медиа» в профиле также переведён на этот же проводник: выбор фото/видео/аудио для галерей теперь через нормальный файловый интерфейс.
Technical:
Добавлен reusable partial `views/partials/file_explorer_picker.php` (модалка + JS-компонент `TsoyFileExplorerPicker`) для повторного использования в разных разделах.
В `app/pages.php` расширена модель блоков страниц (`article`, `guide`, `video_player`) и обновлён сбор используемых file_id для рендера.
В `views/my_pages.php` переписан UI конструктора страниц и убран ручной ввод ID файлов в пользу picker-компонента.
В `views/user_page_view.php` добавлен рендер новых блоков (статья/гайд/видеоплеер с плейлистом).
В `views/profile.php` модалка управления галереями профиля переведена на единый picker вместо списков чекбоксов по ID.
v3.2.0
2026-02-22
What is new:
Усилен PWA-режим для ПК и смартфонов: улучшен manifest (ярлыки быстрых действий, desktop/mobile launch-поведение, метаданные приложения).
Уведомления и звонки в PWA/браузере теперь надёжнее открывают нужный раздел по клику (чат, конкретный звонок, уведомления и т.д.).
Улучшено локальное офлайн-кеширование файлов: кнопки офлайн-режима теперь корректно показывают статус уже закешированных файлов.
Technical:
Root и `public/service-worker.js` синхронизированы и переведены на единый hardened SW (navigation preload, deep-link `notificationclick`, управление файловым кешем через message API).
В Service Worker добавлен корректный bypass для `Range`-запросов, чтобы не ломать стриминг аудио/видео и просмотр медиа на мобильных устройствах.
В `views/partials/scripts.php` добавлен `__TSOY_PWA_RUNTIME` (статус PWA, persistent storage, работа с файловым кешем SW) и обработка `TSOY_NAVIGATE` сообщений от SW.
Fallback `Notification` в `views/partials/scripts.php` и `views/chat.php` дополнен click-handler с deep-link навигацией в нужный чат/звонок.
Manifest и head-мета обновлены для лучшей совместимости PWA на desktop/mobile (`shortcuts`, `display_override`, `launch_handler`, `mobile-web-app-capable`).
v3.2.1
2026-02-22
What is new:
В разделе «Настройки → Брендинг» добавлена отдельная настройка названия проекта в шапке (верхняя панель и боковое меню).
Technical:
Добавлен ключ настроек `site_header_name`; при пустом значении используется fallback на `site_name`.
В `views/layout.php` брендинг шапки переведён на отдельную переменную `$siteHeaderName`, не затрагивая title страниц и прочие места, где используется `site_name`.
v3.3.0
2026-02-22
What is new:
Проведена большая унификация визуального стиля проекта: карточки, навигация, формы, модалки и отступы лучше согласованы между разделами.
Раздел «Настройки → Оформление» расширен: добавлены настройки глобального шрифта, масштаба текста, ширины контента, контраста поверхностей и отдельная плотность мессенджера.
Мессенджер получил более компактные облака сообщений (Telegram-like режим), при этом мобильная геометрия composer/клавиатуры не менялась.
Technical:
Расширен `ui_config()` и системные настройки (`ui_font_family`, `ui_font_scale`, `ui_content_width`, `ui_surface_contrast`, `ui_chat_density`) с валидацией в `index.php?r=admin_settings`.
В `views/partials/head.php` добавлены новые data-атрибуты UI и глобальные CSS-токены (font-scale, content-width, surface-contrast) для централизованного управления дизайном.
В `views/chat.php` добавлены безопасные CSS-presets плотности чата (roomy/compact/telegram) только для bubble/spacing, без вмешательства в composer/sticky/viewport-логику.
Сохранена PWA-совместимость: дизайн-настройки реализованы через CSS/HTML data-атрибуты и не затрагивают service worker, офлайн-кеш и keyboard-fixes.
v3.3.1
2026-02-22
What is new:
В мессенджере выбор файла из облака переведён на единый проводник (папки, поиск, фильтры, превью), как в других разделах проекта.
Исправлено меню действий сообщения (`Изменить/Удалить`): dropdown больше не перекрывается соседними сообщениями.
Настройки `Оформление` лучше применяются к мессенджеру: `Ширина контента` работает в canvas-режиме, а плотность/контраст теперь заметно влияют на чат.
Technical:
В `views/chat.php` интегрирован reusable `TsoyFileExplorerPicker` для attach-модалки (mobile-safe сценарий через отдельную модалку picker-а).
Для строк сообщений добавлен z-index lift при `show.bs.dropdown` (`chat-row-menu-open`), чтобы меню действий не попадало под соседние bubbles.
В `views/layout.php` `.chat-canvas-stage` привязан к `--t-content-max`, поэтому `ui_content_width` теперь работает и на странице мессенджера.
В `views/chat.php` добавлены визуальные связки с глобальными токенами `ui_surface_contrast` и `ui_density`, без изменений composer/keyboard-геометрии (чтобы не вернуть “подбородок”).
v3.3.2
2026-02-22
What is new:
В «Центре уведомлений» блок с уведомлениями/событиями теперь показывается первым, а настройки уведомлений идут после него.
Technical:
В `views/notifications.php` переставлен визуальный порядок колонок через grid-order (`notify-col-feed` перед `notify-col-settings`) и обновлён заголовок блока на «Все уведомления».
v3.3.3
2026-02-22
What is new:
Страница «Контакты» визуально приведена к стилю мессенджера: одинаковая шапка, поверхности, контуры и оттенки/градиенты.
Technical:
В `views/contacts.php` добавлен локальный токенизированный стиль (`contacts-page`) с той же логикой surface/background, что и в мессенджере, включая реакции на `ui_surface_contrast` и `ui_density`.
v3.3.4
2026-02-22
What is new:
Проводник файлов в профиле (обложка и вложения постов) переведён на единое ядро `TsoyFileExplorerPicker`, как в мессенджере.
Вложения к посту с устройства в профиле переработаны в единый блок внутри модалки вложений (облако + устройство + ссылки), чтобы выбор работал стабильнее и понятнее.
`/index.php?r=admin` переименован в «Хранилище проекта» и получил папочную структуру с фильтром по владельцу и папке.
Technical:
В `views/profile.php` добавлен JS-слой унификации старых модалок вложений постов: облачные файлы выбираются через общий picker, а hidden-inputs собираются по mime (`attach_images/video/audio/files`).
В `app/files.php` расширен `files_admin_list()` (фильтры по владельцу и папке) и добавлены helper-функции `files_admin_owner_stats()` / `files_admin_folders_list()` для админского проводника.
В `views/admin.php`, `views/staff.php`, `index.php` и `views/chat.php` обновлён нейминг admin-файлового экрана на «Хранилище проекта/Хранилище».
v3.3.5
2026-02-22
What is new:
Исправлен двойной проводник в профиле: при выборе обложки поста больше не открывается одновременно новый и старый интерфейс.
Копирование ссылки на профиль и пост теперь использует тихий toast («Скопировано») вместо модального `alert`.
Клипса в мессенджере переведена на явный JS-open attach-модалки с mobile fallback.
Technical:
В `views/profile.php` удалены legacy JS-билдеры вложений постов (`js-att`/`js-att-edit`) и старые вкладки вложений теперь физически вырезаются из DOM после инициализации нового picker-слоя.
В `views/profile.php` убраны bootstrap-trigger атрибуты с кнопок выбора обложки (теперь открывается только `TsoyFileExplorerPicker`), а возврат старой attach-модалки после picker отключён.
В `views/chat.php` убраны мёртвые остатки старого cloud-list фильтра (`cloudSearch/cloudRadios`) и добавлен явный обработчик `attachBtn` для iOS/mobile кейсов.
v3.3.6
2026-02-22
What is new:
В конструкторе пользовательских страниц добавлен новый блок «Таблица» с ручным редактированием ячеек.
Для блока таблицы доступны действия: добавить/удалить строку и добавить/удалить столбец, а также режим «первая строка — заголовки».
Публичные страницы теперь умеют отображать таблицы как адаптивный HTML-table блок.
Technical:
В `app/pages.php` добавлена нормализация блока `table` (header + rows, ограничения размеров и длины ячеек).
В `views/my_pages.php` расширен page-builder: тип `table`, визуальный table-editor и сериализация таблицы в `blocks_json`.
В `views/user_page_view.php` добавлен рендер блока таблицы (`table-responsive`, поддержка header/body).
v2.3.8
2026-02-22
What is new:
Снижен лаг при открытии страниц.
Technical:
Polling-задачи переведены в менее агрессивный режим.
v2.3.10
2026-02-22
What is new:
Исправлены критические проблемы отображения текста и уведомлений.
Technical:
Подготовлена база для финальной правки кодировки.
v2.3.11
2026-02-22
What is new:
Полностью восстановлен текст интерфейса на корректной кириллице.
Исправлены сообщения профиля, чатов, звонков и административных страниц.
Technical:
index.php восстановлен из стабильной версии и очищен от поврежденных строк.
Обновлены маршруты администрирования звонков: мониторинг, закрытие и удаление комнат.
v2.3.12
2026-02-22
What is new:
Исправлено отображение текста на странице звонка по ссылке.
Восстановлены подписи и действия в админ-панели.
Technical:
Очищены поврежденные символы в views/call_room.php и views/admin.php.
В call_room добавлено управление закрытием комнаты для создателя и администратора.
v2.3.13
2026-02-22
What is new:
Зафиксировано правило: кодировка проекта только UTF-8 без BOM.
Technical:
Добавлен .editorconfig с обязательным charset=utf-8.
Добавлен scripts/check-encoding.ps1 и подключён в scripts/make-release.ps1.
v2.3.14
2026-02-22
What is new:
Улучшено качество аудиозвонков в личных и публичных комнатах.
Добавлена автопопытка восстановления соединения при сетевых сбоях.
Technical:
Вынесены единые WebRTC-параметры: ICE/STUN/TURN и аудио-профиль в настройки админа.
Убраны хардкоды RTCPeerConnection в chat/call_room/admin_call_monitor.
Добавлено применение maxBitrate для аудио sender-параметров.
v2.3.15
2026-02-22
What is new:
Звонки стали отзывчивее без перегруза сервера: события обрабатываются быстрее после действий пользователя.
Стабильнее работа в фоне и после возврата в приложение/вкладку.
Technical:
Переведены call polling-циклы на адаптивный single-flight алгоритм (без наложения запросов).
Добавлены таймауты запросов, backoff при ошибках и fast-retry после сигналов/действий.
Применено в views/chat.php, views/call_room.php, views/admin_call_monitor.php.
v2.3.16
2026-02-22
What is new:
В админке добавлены импорт и экспорт базы данных в JSON для резервного копирования и переноса.
Добавлены сервисные операции очистки БД и файлов: RTC-мусор, старый аудит, удалённые файлы и сироты в uploads.
Technical:
Добавлен модуль app/admin_maintenance.php с безопасным экспортом/импортом и обслуживанием хранилища.
Импорт БД выполняется с полной заменой данных таблиц приложения (через DELETE в транзакции, без TRUNCATE).
Добавлены маршруты admin_db_export/admin_db_import/admin_db_cleanup и UI в views/admin_db.php.
v2.3.17
2026-02-22
What is new:
Исправлена критическая ошибка отправки emoji/смайликов в мессенджере на MySQL.
После обновления сайт автоматически приводит старые таблицы чата и связанные таблицы к emoji-safe кодировке utf8mb4.
Technical:
MySQL-подключение теперь принудительно использует SET NAMES/CHARACTER SET utf8mb4.
Добавлен runtime-check кодировки таблиц через INFORMATION_SCHEMA и best-effort конвертация в utf8mb4 только при необходимости.
Авто-проверка utf8mb4 подключена в обычный запуск index.php после ensure_schema().
v2.3.18
2026-02-22
What is new:
В админке БД добавлен визуальный статус проверки utf8mb4/emoji (для MySQL).
Теперь можно быстро увидеть, есть ли таблицы или колонки, которые ещё не готовы к emoji.
Technical:
Добавлен отчёт admin_db_charset_report() по INFORMATION_SCHEMA: default charset/collation БД, таблицы и текстовые колонки.
Отчёт выведен в views/admin_db.php с компактной сводкой и таблицами проблемных объектов (если есть).
Диагностика безопасна: только чтение метаданных, без изменений данных.
v2.3.19
2026-02-22
What is new:
Переработан блок смайликов в мессенджере: быстрые emoji, недавние emoji и удобная панель выбора.
Подключена библиотека emoji picker с поиском и категориями; добавлены быстрые кнопки, включая клоуна 🤡.
Technical:
Локально подключена библиотека public/vendor/emoji-button/emoji-button.min.js (без CDN-зависимости в рантайме).
В chat composer добавено хранение недавних emoji в localStorage и fallback-режим, если библиотека недоступна.
Добавлены стили/адаптация picker для mobile full-screen чата и тёмной темы.
v2.3.20
2026-02-22
What is new:
Исправлен баг мессенджера: новые сообщения теперь появляются в открытом чате без перезахода.
Если вы находитесь внизу ленты, чат автоматически прокручивается к новым сообщениям.
Technical:
Добавлен lightweight endpoint chat_messages_poll (инкрементальная выдача сообщений по after_id).
Во views/chat.php добавлен single-flight polling и клиентский рендер новых сообщений без полной перезагрузки страницы.
Обработчики редактирования и цитирования переведены на event delegation для новых дорисованных сообщений.
v2.3.21
2026-02-22
What is new:
Список диалогов в мессенджере теперь обновляется автоматически: новые сообщения и непрочитанные появляются без перезахода в чат.
Превью последнего сообщения, время и бейдж непрочитанных синхронизируются прямо в открытом разделе «Мессенджер».
Technical:
Добавлен endpoint chat_dialogs_poll с компактной JSON-выдачей списка диалогов для текущего пользователя.
Во views/chat.php добавлен отдельный single-flight polling списка диалогов с backoff, signature-check и обновлением DOM только при изменениях.
После получения новых сообщений в открытом чате запускается fast-refresh списка диалогов для быстрого обновления превью/бейджей.
v2.3.22
2026-02-22
What is new:
Переработан интерфейс мессенджера в стиле PWA-мессенджеров: удобнее список диалогов, компактнее шапка чата и чище лента сообщений.
На телефоне чат занимает экран аккуратнее: более компактные action-кнопки, улучшенная шапка и удобнее поле ввода для быстрых сообщений.
Technical:
Во views/chat.php обновлены layout/styling для desktop и mobile (split-pane, sticky composer, адаптивная шапка, улучшенные bubbles).
UI-рефактор сделан без изменения API звонков/сообщений: логика realtime/polling сохранена.
v2.3.23
2026-02-22
What is new:
Исправлена проблема со «слетающей» авторизацией: сессия пользователя теперь сохраняется стабильнее, особенно в PWA и на мобильных устройствах.
Пользователю больше не нужно постоянно повторно входить в аккаунт при обычном использовании сайта.
Technical:
Добавлена устойчивая инициализация PHP-сессии: cookie lifetime 30 дней, gc_maxlifetime 30 дней, httponly/samesite и корректный secure через HTTPS/X-Forwarded-Proto.
Сессии вынесены в project-local storage/sessions (если доступно), чтобы изолировать их от server-wide gc других сайтов/приложений.
Добавлено sliding-refresh session cookie и session_regenerate_id(true) при логине для стабильности и безопасности.
v2.3.24
2026-02-22
What is new:
Исправлен UX мессенджера на ПК: форма ввода теперь закреплена поверх ленты сообщений и всегда видна, как в Telegram/WhatsApp.
Возвращён стеклянный (glass) вид мессенджера на телефоне и PWA-экране.
Лента сообщений переведена на догрузку по шагам: история подгружается по 10 сообщений при прокрутке вверх, новые сообщения приходят вниз компактными пачками.
Technical:
Добавлен endpoint chat_messages_before_poll (before_id) и server helper conversation_messages_before_for_user() для lazy-history.
Стартовая загрузка сообщений в чате уменьшена до компактной пачки, дальнейшая история догружается по scroll trigger.
Во views/chat.php переработан layout conversation pane: внутренний scroll у chatMessages, фиксированный composer overlay на desktop, сохранена совместимость с текущими polling/звонками.
v2.3.25
2026-02-22
What is new:
Исправлен критичный UX-баг мессенджера на ПК: при открытии диалога теперь сразу видны последние сообщения и форма ввода (без прокрутки всей страницы вниз).
Форма ввода закреплена поверх ленты сообщений, а прокрутка выполняется внутри окна чата.
Доработан стеклянный стиль mobile/PWA после предыдущего интерфейсного обновления.
Technical:
Для desktop conversation pane добавлена жёсткая высота по viewport (CSS + JS syncDesktopMessengerViewport), чтобы контент не растягивал страницу.
chatMessages переведён в гарантированно внутренний scroll-container; composer остаётся fixed/overlay внутри card.
Сохранена lazy-history логика (+10) и polling новых сообщений без изменения API звонков/чатов.
v2.3.26
2026-02-22
What is new:
Добавлен отдельный центр уведомлений: быстрые переключатели, статус разрешений браузера, Service Worker/PWA и тест уведомления на устройство.
Настройки уведомлений теперь можно менять без захода в профиль — прямо из раздела «Уведомления».
Исправлен мобильный UX мессенджера при открытии клавиатуры: уменьшен лишний отступ под полем ввода, стабилизировано положение composer (меньше прыжков).
Technical:
Маршрут notifications получил обработку POST (сохранение notify_desktop/notify_sound) и скорректирован порядок mark_seen/counts.
Во views/chat.php добавлена VisualViewport-синхронизация mobile full-screen окна чата и очищен двойной safe-area padding снизу.
v2.3.27
2026-02-22
What is new:
Добавлена публичная страница «О проекте» (`/about`) с описанием проекта и карточками участников/вклада.
В профиле (редактирование) для администратора добавлен блок управления страницей «О проекте», включая загрузку фото участников с устройства.
На странице профиля добавлены лайки постов и ссылка на конкретный пост; из ленты постов убраны дефолтные кнопки «Скачать/Магнит» (показываются только при явном разрешении скачивания).
При создании/редактировании поста теперь можно прикреплять файлы напрямую с устройства (телефон/ПК), а не только из облака.
Technical:
Добавлены маршрут `about`, pretty-route `/about` и POST-обработчик `post_like_toggle` с JSON-ответом для AJAX.
В `profile_edit` добавлено сохранение настроек страницы about через `settings` + хранение списка участников в JSON (`about_contributors_json`).
Для постов подключена серверная обработка `attach_device_files[]` через `post_attach_uploaded_device_files()` и автоопределение типа вложения по MIME.
v2.3.28
2026-02-22
What is new:
Hotfix: исправлено битое сообщение после сохранения настроек в центре уведомлений (теперь отображается нормальная кириллица).
Technical:
В `index.php` заменены оставшиеся mojibake-строки flash-сообщения `Настройки уведомлений сохранены.` в обработчиках профиля и центра уведомлений.
v2.3.29
2026-02-22
What is new:
Hotfix: исправлены оставшиеся «кракозябры» в системных сообщениях/заголовках из `index.php` (включая центр уведомлений и очистку аудита в разделе БД).
Technical:
Выполнена массовая зачистка mojibake-строковых литералов в `index.php` (восстановлена нормальная кириллица в flash/title сообщениях).
Усилен `scripts/check-encoding.ps1`: проверка mojibake теперь использует кодовые точки (`U+00C2/U+00C3/U+00D0/U+00D1`), а не хрупкий текстовый regex.
README обновлён: примеры маркеров кракозябр переведены в формат `U+` кодов, чтобы чекер не ловил демонстрационные символы.
v2.3.30
2026-02-22
What is new:
Ссылка на страницу «О проекте» добавлена в подвал рядом с версией проекта.
Настройки страницы «О проекте» вынесены из профиля в отдельный раздел администрирования в дашборде.
Добавлены роли `global_admin` и `admin_tester` (тестировщик-администратор в режиме только чтение).
Для `admin` и `admin_tester` скрыт доступ к разделу БД и к просмотру учётных данных БД.
Улучшен UX уведомлений: при включении push-переключателя разрешение запрашивается сразу.
Страница мессенджера визуально облегчена и приведена к более единому стилю.
Technical:
Добавлен маршрут `admin_about` + новая страница `views/admin_about.php`; сохранение настроек about перенесено из `profile_edit` в admin-раздел.
Расширен RBAC: новые роли (`global_admin`, `admin_tester`), нормализация политик по умолчанию, закреплённые инварианты для доступа к БД/политикам/настройкам.
Добавлен централизованный backend-guard `enforce_readonly_tester_write_guard()` для блокировки всех write-запросов роли `admin_tester`.
Маршруты admin DB/settings/policies переведены на capability-gates; добавлена маскировка DB login/password в `views/admin_db.php` для не-`global_admin`.
Обновлены уведомления в `views/notifications.php` и `views/profile_edit.php`: авто-request permission и синхронизация с runtime helper `__TSOY_NOTIFY_RUNTIME`.
v2.3.31
2026-02-22
What is new:
Исправлены права управления пользователями: первый пользователь всегда закреплён как `global_admin`, обычный администратор не может понижать/блокировать/удалять его и сбрасывать ему пароль.
Роль `admin_tester` теперь может пользоваться обычными функциями приложения (включая профиль и фото), при этом изменения в админ-разделах по-прежнему заблокированы.
Мессенджер и верхнее меню теперь корректнее используют данные профиля (имя/аватар), а список диалогов подхватывает фото и `display_name` в том числе при автообновлении.
Technical:
Добавлены backend-инварианты для первого пользователя (`user_ensure_first_global_admin`, запрет бана/удаления первого пользователя) и защита операций над `global_admin` в `admin_users`.
Глобальный guard `admin_tester` сужен до write-операций админ-разделов, чтобы не ломать обычный пользовательский функционал.
Серверные payload-ы чата и SSR/JS-рендер унифицированы по `display_name`/`avatar_path`; обновлён session-refresh в `views/layout.php` и `auth_login()`.
v2.3.32
2026-02-22
What is new:
Исправлена логика публичных файлов: фото участников со страницы `/about` остаются публичными, но больше не попадают в ленту «Публичные файлы» на главной.
Улучшена навигация и нейминг: пользовательское облако переименовано в «Мои файлы», а `admin`-экран оформлен как «Файлы проекта».
Экран `admin` визуально приведён ближе к интерфейсу «Мои файлы» (единая шапка страницы, похожая таблица и структура действий).
Technical:
В `app/files.php` добавлена фильтрация публичной ленты по исключениям (`files_public_feed_excluded_ids()`), сейчас туда входят фото участников из `about_contributors_json`.
Обновлены заголовки/подписи в `views/home.php`, `views/dashboard.php`, `views/admin.php`, `views/layout.php`, `views/staff.php`, `views/chat.php`, `views/contacts.php` для уменьшения путаницы между пользовательским и административным файловыми экранами.
В `views/admin_about.php` добавлена явная подсказка о новом поведении публичных фото страницы `/about`.
v2.3.33
2026-02-22
What is new:
Добавлена отдельная «мемная» invite-регистрация для друзей с автоназначением ролей `admin` и `admin_tester` по токен-ссылке.
Страница спец-регистрации получила отдельный дизайн с анимациями и роль-специфичными сообщениями (admin/tester).
Форма спец-регистрации и тексты страницы теперь настраиваются из дашборда (тема, подписи, кнопки, ссылки-инвайты).
Technical:
Добавлен модуль `app/friend_registration.php`: JSON-конфиг спец-регистрации, токены, invite-ссылки, нормализация и resolve роли по токену.
В `index.php` добавлены маршруты `friend_register` и `admin_friend_register`, а также pretty-route `/friend-invite/<token>`.
Добавлены страницы `views/friend_register.php` и `views/admin_friend_register.php`, плюс ссылка на раздел в `views/staff.php`.
v2.3.34
2026-02-22
What is new:
Hotfix: устранены предупреждения Deprecated на PHP 8.4+ в модуле спец-регистрации друзей.
Technical:
В `app/friend_registration.php` сигнатуры helper-функций обновлены с implicit nullable (`array $cfg = null`) на явный nullable тип (`?array $cfg = null`).
v2.3.35
2026-02-22
What is new:
В спец-регистрацию друзей встроен виджет «кошка-говешка» с анимированным блоком внутри формы.
В настройках спец-регистрации можно загрузить фото кошки с устройства, включать/выключать блок и настраивать подпись/бейдж.
Добавлен глобальный UI-пресет `Psychedelic` для всего проекта (фон, карточки, кнопки, формы, таблицы, навигация и анимации).
Technical:
Спец-регистрация расширена настройками `cat_*` в `app/friend_registration.php`; загрузка изображения реализована в `index.php` и хранится в `public/friend_register/`.
В `views/friend_register.php` добавлен анимированный cat-widget с безопасным fallback без картинки.
Глобальная тема вынесена в preset `ui_style_preset` (`default|psychedelic`) через `ui_config()` и `views/partials/head.php`; управление добавлено в `views/admin_settings.php`.
v2.3.36
2026-02-22
What is new:
Базовый пресет оформления снова по умолчанию `Default`, а `Psychedelic` оставлен как опциональный вариант в настройках.
Уведомления о сообщениях и событиях теперь открывают соответствующий раздел (чат или календарь), а не всегда центр уведомлений.
Отправка сообщений в мессенджере переведена на асинхронный режим: обновляется только область чата без полной перезагрузки страницы.
Technical:
Добавлен JSON endpoint `chat_send_async` и клиентский submit-handler во `views/chat.php` для AJAX-отправки сообщения с поддержкой вложений.
В `notif_poll` добавлены target-ссылки (`chat`/`calendar`), а `views/partials/scripts.php` формирует отдельные device-notifications с корректным `data.url`.
Возврат дефолта пресета выполнен в `app/settings.php`, `ui_config()` (`app/bootstrap.php`), `views/admin_settings.php` и обработчике `admin_settings` в `index.php`.
v2.3.37
2026-02-22
What is new:
Мессенджер структурно облегчён: более компактный header/messages/composer stack, меньше визуальной тяжести и ближе к привычной мобильной логике.
Исправлено поведение поля ввода в мобильном полноэкранном чате: composer больше не “съезжает” вниз из-за наложенных padding/overlay-стилей.
Пузырьки сообщений и панель действий стали компактнее и чище, при этом все функции (редактирование, вложения, эмодзи, звонки) сохранены.
Technical:
В `views/chat.php` добавлены структурные классы (`chat-list-card`, `chat-conv-card`, `chat-conv-body`, `chat-composer-shell`) и финальный CSS override-блок с упрощённой layout-схемой.
Убран тяжёлый overlay-режим composer для conversation pane (через CSS overrides), сообщения снова живут в нормальном flex-stack без лишнего bottom-overlay padding.
Мобильный fullscreen-pane нормализован по safe-area: один источник нижнего отступа для composer вместо конфликтующих стилей.
v2.3.38
2026-02-22
What is new:
Перестроена DOM-структура окна диалога: `chatMessages` теперь единый контейнер на всю область чата, внутри которого находятся шапка, лента сообщений и composer.
Шапка диалога и панель ввода встроены внутрь общего контейнера как в современных мессенджерах, что улучшает поведение на мобильных экранах.
Скролл сообщений выделен во внутренний контейнер, чтобы сохранить плавность и корректную работу кнопки «Новые сообщения».
Technical:
В `views/chat.php` `id=\"chatMessages\"` переведён в роль root-container conversation pane, а scroll-area вынесена в `id=\"chatMessagesScroll\"`.
JS-логика мессенджера обновлена на новый scroll-target (`chatMessagesScroll`) с backward fallback на старую структуру.
Добавлены CSS-правила для 100% ширины/высоты `#chatMessages` внутри `chat-conv-body` и новой иерархии `chat-thread-shell` / `chat-thread-scroll-wrap`.
v2.3.39
2026-02-22
What is new:
Уменьшен зазор между клавиатурой и полем ввода в мобильном мессенджере (почти вплотную, несколько миллиметров).
Панель ввода в fullscreen-чате лучше поджимается к клавиатуре на iPhone/iOS.
Technical:
В `views/chat.php` добавлен динамический CSS var `--chat-mobile-composer-gap` и логика `visualViewport`-детекта открытой клавиатуры.
При открытой клавиатуре fullscreen-pane чата растягивается до видимого нижнего края без лишнего white-gap из-за `visualViewport.offsetTop`.
v2.3.40
2026-02-22
What is new:
Исправлен большой пустой отступ между полем ввода и клавиатурой в мобильном мессенджере (fullscreen chat).
Панель ввода и лента сообщений теперь корректно сжимаются при открытии клавиатуры.
Technical:
В `views/chat.php` снят конфликтующий `min-height`/жёсткая высота на mobile fullscreen-цепочке контейнеров (`chat-conv-body` → `#chatMessages` → scroll-wrap → `#chatMessagesScroll`).
Горячий фикс рассчитан на iOS/Safari/PWA сценарии, где клавиатура уменьшает viewport и ломает flex-layout с `min-height`.
v2.3.41
2026-02-22
What is new:
Дополнительно исправлен большой зазор над клавиатурой на iPhone: поле ввода поджимается ближе даже при включённой assistant/suggestions панели iOS.
Technical:
В `views/chat.php` добавлена реальная компенсация нижнего зазора по измерению положения composer относительно viewport (а не только по `visualViewport.height`).
Учтён iOS-кейс, когда `visualViewport` и `window.innerHeight` расходятся на высоту assistant/suggestions панели клавиатуры.
v2.3.42
2026-02-22
What is new:
Для диагностики iPhone-отступа убрана встроенная (inline) панель быстрых смайликов из формы сообщения в мессенджере.
Кнопка смайликов в composer теперь открывает полный emoji picker, если inline-панель отключена.
Technical:
Из `views/chat.php` удалён блок `chat-emoji-panel` внутри composer; JS-клик по `emojiBtn` переведён на fallback `toggleFullEmojiPicker()` при отсутствии inline-панели.
v2.3.43
2026-02-22
What is new:
Для диагностики iPhone-отступа убран набор layout-классов у нижнего блока `attachHint / Убрать вложение` в composer мессенджера.
Technical:
В `views/chat.php` блок под composer (с `attachHint` и `attachClearBtn`) упрощён до обычного контейнера без `d-flex/.../mt-2`.
v2.3.44
2026-02-22
What is new:
Для диагностики iPhone-отступа убран класс `small text-secondary` у блока `attachHint` в composer мессенджера.
Technical:
В `views/chat.php` элемент `#attachHint` оставлен без CSS-классов, чтобы исключить влияние типографики/line-height на высоту composer.
v2.3.45
2026-02-22
What is new:
Для диагностики iPhone-отступа удалён `id=\"attachHint\"` у нижнего блока composer и связанный CSS-минимум высоты.
Technical:
В `views/chat.php` удалено правило `#chatConvPane #attachHint { min-height ... }`, а сам элемент оставлен без `id`, чтобы исключить его вклад в высоту composer.
v2.3.46
2026-02-22
What is new:
Мессенджер вынесен из общего `container py-4` в отдельное “полотно” layout (full-canvas host), чтобы уменьшить конфликты мобильного fullscreen-режима с обёртками страницы.
Это изменение направлено именно на iPhone-баг с большим отступом над клавиатурой: чат теперь живёт в более простой DOM-структуре без общей контейнерной обвязки страницы.
Technical:
В `views/layout.php` добавлен route-aware режим `contentCanvasRoute` для `chat`: контент мессенджера рендерится в `chat-canvas-stage` вне `container py-4`.
В `views/chat.php` обновлены mobile fullscreen-селекторы, которые раньше были жёстко привязаны к `.container.py-4`, теперь они поддерживают `.chat-canvas-stage`.
v2.3.47
2026-02-22
What is new:
Мессенджер после фикса iPhone-клавиатуры дополнительно очищен и визуально облегчён: обновлены шапка страницы, список диалогов, полотно сообщений и composer.
Строка состояния редактирования в composer теперь показывается только в режиме редактирования, а не занимает место постоянно.
Technical:
Из `views/chat.php` удалён временный JS-компенсатор `tightenComposerToViewportBottom()` и связанный runtime-костыль `--chat-mobile-composer-gap`, оставлена более простая `visualViewport`-синхронизация.
Добавлены финальные CSS-overrides для canvas-режима чата (`chat-canvas-stage`) без возврата к старой layout-обвязке `container py-4`.
v2.3.48
2026-02-22
What is new:
На главной в разделе «Новости» теперь по умолчанию показываются только первые записи, остальные открываются кнопкой «Загрузить ещё».
В истории версий (технические новости по версиям) добавлен такой же режим постепенной подгрузки списка через кнопку «Показать ещё версии».
В профилях ролей `admin`, `global_admin` и `admin_tester` добавлен значок подтверждения рядом с именем.
Technical:
В `views/layout.php` добавлен универсальный client-side `load more`-инициализатор для блоков с `data-load-more-*`.
Разметка новостей на главной (`views/home.php`) и модалки истории версий (`views/layout.php`) переведена на единый шаблон постепенного раскрытия списка.
В `views/profile.php` добавлена role-aware отрисовка verified-иконки с tooltip для админских ролей.
v2.3.49
2026-02-22
What is new:
Исправлен повторный iPhone-баг в мессенджере с большим отступом между клавиатурой и полем ввода (runtime-компенсация viewport/composer для mobile fullscreen).
Новости на главной и технические заметки по версиям теперь действительно свёрнуты по умолчанию (первые 3 записи), остальные открываются через кнопку «Показать ещё / Загрузить ещё».
Блок разработчиков на странице `/about` теперь подтягивает имя, роль и фото из профилей администраторов (`global_admin`, `admin`, `admin_tester`), отдельно настраивается только заметка о вкладе.
Technical:
В `views/chat.php` возвращена измеряемая компенсация `visualViewport` по фактическому gap до composer (без возврата старого `--chat-mobile-composer-gap` костыля).
В `views/layout.php` исправлен клиентский `load more`-инициализатор (Safari-safe проверка вместо `ParentNode`) и добавлено серверное начальное сворачивание версий.
Добавлены `users_about_developers()` и `user_role_label_ru()` в `app/users.php`; `/about` и `admin_about` переведены на данные профилей + `about_developer_notes_json`.
v2.3.50
2026-02-22
What is new:
В мессенджере убрана служебная подпись под именем собеседника; клик по фото/имени в шапке диалога теперь открывает профиль собеседника.
Профиль расширен: значок админ-роли для администраторов, список друзей, количество друзей, а также кнопки добавления/удаления из друзей прямо на странице профиля.
В настройках профиля для ролей разработчиков (`global_admin`/`admin`/`admin_tester`) добавлен переключатель показа карточки на странице `/about` (по умолчанию включён).
Обложки постов теперь отображаются на всю ширину карточки; выбор обложки переведён на кнопку + модальное окно с выбором из облака или загрузкой с устройства (создание и редактирование поста).
Technical:
Добавлены helper-функции для видимости карточек разработчиков на `/about` (`about_developer_visibility_json`, `user_about_card_visible()`, `user_about_card_set_visible()`) и фильтрация в `users_about_developers()`.
Маршруты `post_create/post_update` получили поддержку `cover_device_file` через новый helper `post_cover_from_upload()` в `app/posts.php`.
Маршрут `contacts` поддерживает безопасный redirect назад на профиль после add/remove контакта.
v2.3.51
2026-02-22
What is new:
В мессенджере из composer удалён нижний блок `chat-attach-row` (подсказка/кнопка вложения), чтобы убрать лишнюю высоту и iPhone-gap («подбородок»).
Technical:
Из `views/chat.php` удалена разметка `div.chat-attach-row`; JS обработчики вложений уже безопасно работают при отсутствии `attachHint/attachClearBtn`.
v2.3.52
2026-02-22
What is new:
Усилен iPhone-fix для мессенджера: composer в mobile fullscreen при открытой клавиатуре закрепляется в `fixed`-режиме относительно видимой области, чтобы убрать большой зазор над клавиатурой.
Technical:
В `views/chat.php` добавлен режим `chat-composer-vv-fixed` + JS-синхронизация с `visualViewport` (адаптивно: `bottom=0` или компенсация `keyboardInset`, если fixed элемент уходит под клавиатуру).
v2.3.53
2026-02-22
What is new:
В мессенджере с composer снят класс `chat-sticky` (оставлен только `chat-composer-shell`) — hotfix для iPhone-отступа над клавиатурой.
Technical:
В `views/chat.php` удалён `chat-sticky` у обёртки формы сообщений, чтобы исключить конфликт sticky/fixed логики в mobile fullscreen.
v2.3.54
2026-02-22
What is new:
Ещё один iPhone hotfix для мессенджера: при открытой клавиатуре `fixed`-composer больше не обрезается контейнерами чата (снят clipping/blurs на время mobile keyboard mode).
Technical:
В `views/chat.php` добавлен режим `chat-composer-vv-mode`: при активной клавиатуре снимаются `overflow:hidden` и `backdrop-filter` у `chat-conv-card/chat-conv-body`, чтобы Safari не привязывал/не обрезал `position: fixed` composer внутри карточки.
v2.3.55
2026-02-22
What is new:
В мессенджере переписан mobile-composer режим для iPhone: поле ввода при открытой клавиатуре выносится в отдельный viewport-портал, чтобы не появлялся большой зазор над клавиатурой.
Technical:
В `views/chat.php` реализован `composer portal` (spacer + перенос `.chat-composer-shell` в `body` при mobile keyboard mode) вместо прежней fixed/sticky-компенсации внутри карточки чата.
v2.3.56
2026-02-22
What is new:
Добавлена система мультипрофилей: у одного аккаунта можно создавать, переключать и удалять несколько профилей через меню по клику на имя/аватар в шапке.
Для ролей разработчиков (`global_admin`/`admin`/`admin_tester`) добавлен выбор, какой профиль показывать на странице `/about`.
Лента файлов на главной переработана: авторизованный пользователь видит свои последние файлы, гость — файлы, загруженные гостями; в «Мои файлы» добавлены массовые и папочные действия «сделать доступными для всех».
Для постов добавлена настройка «Скрыть пост от гостей»; на открытом профиле гости видят только разрешённые публикации, а вложенные медиа (обложки/фото/аудио/видео) открываются через публичный профиль.
Technical:
В `app/migrations.php` добавлены `user_profiles`, колонки `users.active_profile_id/users.about_profile_id` и `posts.hide_from_guests`.
В `app/users.php` реализованы helper-ы мультипрофилей (bootstrap/create/switch/delete/sync/about-select) и overlay данных выбранного профиля в `/about`.
В `app/files.php` добавлены `files_recent_for_user()/files_recent_for_guests()`, массовая/папочная публичность и inline-доступ к медиа постов публичного профиля через `file_is_readable_by(..., $inline_view=true)`.
v2.3.57
2026-02-22
What is new:
Мессенджер откатан по фронтенду (`views/chat.php`) к состоянию релиза `2.3.46` — это версия, на которой исчезал iPhone-gap («подбородок») над клавиатурой.
Technical:
Сравнение показало, что `views/layout.php` (перенос чата в `chat-canvas-stage`) остаётся правильным; регрессия появилась позже в `views/chat.php` после добавления mobile keyboard viewport-хаков (`chat-composer-vv-portal`, `chat-composer-vv-fixed`, `chat-composer-vv-mode`, spacer/portal composer).
Откат выполнен точечно только для мессенджера: `views/chat.php` взят из архива `releases/tsoycloud_v2.3.46_2026-02-22.zip`.
v2.3.58
2026-02-22
What is new:
Мультипрофили переработаны: теперь каждый профиль аккаунта — это отдельный пользователь со своим логином и собственной страницей `/user/<login>` (отдельные посты, файлы и медиа).
В меню профилей аккаунта создание профиля теперь запрашивает отдельный логин (`username`) и отображаемое имя; основной профиль нельзя удалить.
Для ролей разработчиков выбор профиля для `/about` продолжает работать, но теперь выбирается реальный профиль-пользователь аккаунта.
Technical:
Логика `user_profiles_*` в `app/users.php` переведена с таблицы `user_profiles` на связанные записи `users` через `owner_account_user_id` (старую таблицу больше не используем как источник истины).
В `app/auth.php` добавлен `auth_session_apply_active_profile()` и `$_SESSION[\"auth_user_id\"]`: сессия хранит владельца аккаунта отдельно от активного профиля (`$_SESSION[\"user\"]`).
В `index.php`, `views/layout.php`, `views/profile_edit.php` управление профилями переведено на `current_account_owner_id()`, чтобы переключение/выбор `/about` работали на уровне аккаунта, а редактирование — на уровне активного профиля.
v2.3.59
2026-02-22
What is new:
Мессенджер улучшен поверх стабильной базы (без возврата mobile keyboard-хаков): имя/аватар собеседника в шапке снова открывают профиль, убрана лишняя служебная подпись.
В профиле добавлены отдельные блоки медиа: фото, видео и аудио (для владельца — из облака, для гостей/других пользователей — из видимых постов).
Добавлены комментарии к постам во всплывающем окне: просмотр, добавление, удаление (по правам).
Добавлен конструктор пользовательских страниц (блоки текст/галерея/ссылки) + публичный маршрут `/page/<user>/<slug>` и публикация страницы в виде поста на профиле.
Technical:
В `app/migrations.php` добавлены таблицы `post_comments` и `user_pages`.
В `app/posts.php` реализованы helpers комментариев и поддержка внутренних ссылок (`/page/...`) в `post_attachment_add_link()` для публикации страниц.
Добавлен новый helper `app/pages.php` (CRUD страниц, нормализация блоков, публичный рендер, публикация в посты); подключены маршруты `my_pages`, `user_page_*`, `post_comment_*` в `index.php`.
v2.3.60
2026-02-22
What is new:
Исправлено мобильное меню профилей в шапке: dropdown больше не уезжает влево на узких экранах (ограничена ширина, стабилизировано позиционирование).
Technical:
В `views/layout.php` профильный dropdown переведен на `data-bs-display=\"static\"` и вынесен на отдельный класс `topbar-profile-menu`; в `views/partials/head.php` добавлены mobile-safe стили ширины/переполнения.
v2.3.61
2026-02-22
What is new:
Исправлен раздел «Медиа» в профиле: теперь он показывает только контент, который пользователь явно добавил в посты (обложки и вложения), а не все файлы из облака.
Technical:
В `views/profile.php` блок `Медиа` переведен на единый источник данных (медиа из постов) для владельца и гостей; облачные файлы владельца больше не попадают туда автоматически.
v2.3.62
2026-02-22
What is new:
Профиль переведён на более современный шаблонный стиль: обновлены карточки, шапка профиля и добавлены верхние вкладки разделов (Посты/Друзья/Страницы/Медиа).
Разделы Фото/Видео/Аудио теперь работают как отдельные ручные галереи профиля: пользователь сам добавляет контент в галереи, а не получает автоподбор из облака/постов.
Владелец профиля может управлять галереями: добавлять файлы из облака, загружать с устройства и удалять элементы галереи.
Экран редактирования профиля визуально подтянут к новому стилю профиля.
Technical:
Добавлен helper `app/profile_media.php` и таблица `profile_media_items` (ручные галереи профиля) с миграцией в `app/migrations.php`.
Добавлен маршрут `profile_media_gallery` в `index.php` (добавление/удаление элементов галереи, загрузка файлов с устройства).
В `app/files.php` расширен inline-доступ к файлам для публичных профильных галерей (`profile_media_file_inline_visible_on_public_profile()`).
v2.3.63
2026-02-22
What is new:
Профиль ещё ближе к новому шаблону: усилен визуал шапки (cover/avatar/chips/статистика), обновлены карточки друзей/страниц/медиа и общий стиль карточек постов/модалок.
Улучшена навигация по разделам профиля через верхние вкладки с сохранением активной вкладки.
Technical:
В `views/profile.php` расширен слой профильных стилей и добавлены счётчики/визуальные блоки без изменения бизнес-логики постов, комментариев и ролей.
v2.3.64
2026-02-22
What is new:
Посты на странице профиля ещё ближе к новому шаблону: добавлен header карточки (аватар/имя/@username/время), улучшен action-bar и визуал карточек.
Модалка комментариев профиля визуально переработана и на мобильных ведёт себя ближе к формату bottom-sheet.
Technical:
В `views/profile.php` добавлены профильные UI-классы для карточек постов и комментариев без изменения текущей логики лайков/комментариев/прав доступа.
v2.3.65
2026-02-22
What is new:
Управление галереями профиля перенесено в модалку (вместо collapse), что ближе к новому шаблону и удобнее на мобильных устройствах.
Экран `Редактировать профиль` заметно переработан визуально: добавлен hero-preview профиля, улучшены блоки загрузки аватара/обложки и группировка полей.
Technical:
В `views/profile.php` блок управления ручными галереями переведён на modal-layout без изменения логики форм `profile_media_gallery`.
В `views/profile_edit.php` добавлены новые UI-обёртки и стили (`profile-edit-header-*`, `profile-edit-fieldset`, `profile-edit-upload-*`) при сохранении прежних POST-полей.
v2.3.66
2026-02-22
What is new:
Профиль дополнительно отполирован под мобильные устройства: карточки друзей и страниц стали компактнее и аккуратнее на узких экранах.
В модалке комментариев улучшен блок ввода: форма стала ближе к привычному мобильному composer-формату.
Сетка медиа в профиле уплотнена и выровнена для более ровного отображения на телефонах.
Technical:
В `views/profile.php` добавлены mobile-first стили и классы для списков друзей/страниц, медиасетки и composer-разметки комментариев без изменения бизнес-логики.
v3.0.0
2026-02-22
What is new:
Подготовлен крупный профильный апдейт 3.0: улучшен mobile UX профиля (Друзья/Страницы/Медиа), а форма комментариев в модалке стала ближе к привычному мобильному composer-формату.
Полностью переработан интерфейс мультипрофилей в шапке: новый dropdown с быстрым переключением, аватарами и статусами профилей.
Модалка «Профили аккаунта» получила новый карточный UI: создание профиля, переключение, удаление, переименование и выбор профиля для `/about` стали заметно понятнее.
Technical:
В `views/layout.php` переписана разметка topbar dropdown и модалки `#userProfilesModal` без изменения существующих роутов/POST-действий (`user_profiles`).
В `views/partials/head.php` добавлен новый слой стилей для мультипрофильного UX (`topbar-profile-*`, `user-profiles-modal-modern`, `user-profile-card*`) с адаптацией под мобильные экраны.
В `app/news.php` добавлена системная новость о релизе 3.0.0 для главной страницы.
v3.0.1
2026-02-22
What is new:
На странице профиля кнопка копирования публичной ссылки теперь копирует адрес в буфер и показывает диалог «Скопировано».
При открытии профиля по публичной ссылке `/user/<username>` скрывается боковое меню (desktop + mobile offcanvas), страница выглядит ближе к формату соцсети.
Technical:
В `views/profile.php` обновлён helper `copyText()` для кнопок `.js-copy`: успешное копирование подтверждается диалогом, fallback остаётся только при ошибке clipboard API.
В `views/layout.php` добавлен режим публичной страницы профиля (`$publicProfilePageRoute`) с условным отключением sidebar/offcanvas и корректировкой mobile topbar-отступа.
v3.0.2
2026-02-22
What is new:
На страницах профиля боковое меню теперь скрывается только у гостей. Для авторизованных пользователей навигация в профиле снова доступна.
Technical:
В `views/layout.php` режим “соц-страницы без меню” ограничен только гостевым просмотром публичного профиля (`$guestPublicProfileSocialMode`).
v3.0.3
2026-02-22
What is new:
Кнопки «Ссылка на профиль» и «Ссылка на пост» на странице профиля теперь копируют ссылку в буфер по одному клику.
Technical:
В `views/profile.php` copy-handler для `.js-copy/.js-magnet` усилен: добавлены `preventDefault/stopPropagation` и fallback-копирование через `textarea + execCommand(copy)` без обязательного `prompt`.
v3.1.0
2026-02-22
What is new:
Конструктор пользовательских страниц серьёзно переработан: добавлены блоки «Статья», «Гайд» и «Плеер роликов» помимо галереи/ссылок.
В выборе файлов для конструктора страниц больше не нужны ID вручную: добавлен единый проводник файлов с папками, поиском, фильтрами и мультивыбором.
Раздел «Медиа» в профиле также переведён на этот же проводник: выбор фото/видео/аудио для галерей теперь через нормальный файловый интерфейс.
Technical:
Добавлен reusable partial `views/partials/file_explorer_picker.php` (модалка + JS-компонент `TsoyFileExplorerPicker`) для повторного использования в разных разделах.
В `app/pages.php` расширена модель блоков страниц (`article`, `guide`, `video_player`) и обновлён сбор используемых file_id для рендера.
В `views/my_pages.php` переписан UI конструктора страниц и убран ручной ввод ID файлов в пользу picker-компонента.
В `views/user_page_view.php` добавлен рендер новых блоков (статья/гайд/видеоплеер с плейлистом).
В `views/profile.php` модалка управления галереями профиля переведена на единый picker вместо списков чекбоксов по ID.
v3.2.0
2026-02-22
What is new:
Усилен PWA-режим для ПК и смартфонов: улучшен manifest (ярлыки быстрых действий, desktop/mobile launch-поведение, метаданные приложения).
Уведомления и звонки в PWA/браузере теперь надёжнее открывают нужный раздел по клику (чат, конкретный звонок, уведомления и т.д.).
Улучшено локальное офлайн-кеширование файлов: кнопки офлайн-режима теперь корректно показывают статус уже закешированных файлов.
Technical:
Root и `public/service-worker.js` синхронизированы и переведены на единый hardened SW (navigation preload, deep-link `notificationclick`, управление файловым кешем через message API).
В Service Worker добавлен корректный bypass для `Range`-запросов, чтобы не ломать стриминг аудио/видео и просмотр медиа на мобильных устройствах.
В `views/partials/scripts.php` добавлен `__TSOY_PWA_RUNTIME` (статус PWA, persistent storage, работа с файловым кешем SW) и обработка `TSOY_NAVIGATE` сообщений от SW.
Fallback `Notification` в `views/partials/scripts.php` и `views/chat.php` дополнен click-handler с deep-link навигацией в нужный чат/звонок.
Manifest и head-мета обновлены для лучшей совместимости PWA на desktop/mobile (`shortcuts`, `display_override`, `launch_handler`, `mobile-web-app-capable`).
v3.2.1
2026-02-22
What is new:
В разделе «Настройки → Брендинг» добавлена отдельная настройка названия проекта в шапке (верхняя панель и боковое меню).
Technical:
Добавлен ключ настроек `site_header_name`; при пустом значении используется fallback на `site_name`.
В `views/layout.php` брендинг шапки переведён на отдельную переменную `$siteHeaderName`, не затрагивая title страниц и прочие места, где используется `site_name`.
v3.3.0
2026-02-22
What is new:
Проведена большая унификация визуального стиля проекта: карточки, навигация, формы, модалки и отступы лучше согласованы между разделами.
Раздел «Настройки → Оформление» расширен: добавлены настройки глобального шрифта, масштаба текста, ширины контента, контраста поверхностей и отдельная плотность мессенджера.
Мессенджер получил более компактные облака сообщений (Telegram-like режим), при этом мобильная геометрия composer/клавиатуры не менялась.
Technical:
Расширен `ui_config()` и системные настройки (`ui_font_family`, `ui_font_scale`, `ui_content_width`, `ui_surface_contrast`, `ui_chat_density`) с валидацией в `index.php?r=admin_settings`.
В `views/partials/head.php` добавлены новые data-атрибуты UI и глобальные CSS-токены (font-scale, content-width, surface-contrast) для централизованного управления дизайном.
В `views/chat.php` добавлены безопасные CSS-presets плотности чата (roomy/compact/telegram) только для bubble/spacing, без вмешательства в composer/sticky/viewport-логику.
Сохранена PWA-совместимость: дизайн-настройки реализованы через CSS/HTML data-атрибуты и не затрагивают service worker, офлайн-кеш и keyboard-fixes.
v3.3.1
2026-02-22
What is new:
В мессенджере выбор файла из облака переведён на единый проводник (папки, поиск, фильтры, превью), как в других разделах проекта.
Исправлено меню действий сообщения (`Изменить/Удалить`): dropdown больше не перекрывается соседними сообщениями.
Настройки `Оформление` лучше применяются к мессенджеру: `Ширина контента` работает в canvas-режиме, а плотность/контраст теперь заметно влияют на чат.
Technical:
В `views/chat.php` интегрирован reusable `TsoyFileExplorerPicker` для attach-модалки (mobile-safe сценарий через отдельную модалку picker-а).
Для строк сообщений добавлен z-index lift при `show.bs.dropdown` (`chat-row-menu-open`), чтобы меню действий не попадало под соседние bubbles.
В `views/layout.php` `.chat-canvas-stage` привязан к `--t-content-max`, поэтому `ui_content_width` теперь работает и на странице мессенджера.
В `views/chat.php` добавлены визуальные связки с глобальными токенами `ui_surface_contrast` и `ui_density`, без изменений composer/keyboard-геометрии (чтобы не вернуть “подбородок”).
v3.3.2
2026-02-22
What is new:
В «Центре уведомлений» блок с уведомлениями/событиями теперь показывается первым, а настройки уведомлений идут после него.
Technical:
В `views/notifications.php` переставлен визуальный порядок колонок через grid-order (`notify-col-feed` перед `notify-col-settings`) и обновлён заголовок блока на «Все уведомления».
v3.3.3
2026-02-22
What is new:
Страница «Контакты» визуально приведена к стилю мессенджера: одинаковая шапка, поверхности, контуры и оттенки/градиенты.
Technical:
В `views/contacts.php` добавлен локальный токенизированный стиль (`contacts-page`) с той же логикой surface/background, что и в мессенджере, включая реакции на `ui_surface_contrast` и `ui_density`.
v3.3.4
2026-02-22
What is new:
Проводник файлов в профиле (обложка и вложения постов) переведён на единое ядро `TsoyFileExplorerPicker`, как в мессенджере.
Вложения к посту с устройства в профиле переработаны в единый блок внутри модалки вложений (облако + устройство + ссылки), чтобы выбор работал стабильнее и понятнее.
`/index.php?r=admin` переименован в «Хранилище проекта» и получил папочную структуру с фильтром по владельцу и папке.
Technical:
В `views/profile.php` добавлен JS-слой унификации старых модалок вложений постов: облачные файлы выбираются через общий picker, а hidden-inputs собираются по mime (`attach_images/video/audio/files`).
В `app/files.php` расширен `files_admin_list()` (фильтры по владельцу и папке) и добавлены helper-функции `files_admin_owner_stats()` / `files_admin_folders_list()` для админского проводника.
В `views/admin.php`, `views/staff.php`, `index.php` и `views/chat.php` обновлён нейминг admin-файлового экрана на «Хранилище проекта/Хранилище».
v3.3.5
2026-02-22
What is new:
Исправлен двойной проводник в профиле: при выборе обложки поста больше не открывается одновременно новый и старый интерфейс.
Копирование ссылки на профиль и пост теперь использует тихий toast («Скопировано») вместо модального `alert`.
Клипса в мессенджере переведена на явный JS-open attach-модалки с mobile fallback.
Technical:
В `views/profile.php` удалены legacy JS-билдеры вложений постов (`js-att`/`js-att-edit`) и старые вкладки вложений теперь физически вырезаются из DOM после инициализации нового picker-слоя.
В `views/profile.php` убраны bootstrap-trigger атрибуты с кнопок выбора обложки (теперь открывается только `TsoyFileExplorerPicker`), а возврат старой attach-модалки после picker отключён.
В `views/chat.php` убраны мёртвые остатки старого cloud-list фильтра (`cloudSearch/cloudRadios`) и добавлен явный обработчик `attachBtn` для iOS/mobile кейсов.
v3.3.6
2026-02-22
What is new:
В конструкторе пользовательских страниц добавлен новый блок «Таблица» с ручным редактированием ячеек.
Для блока таблицы доступны действия: добавить/удалить строку и добавить/удалить столбец, а также режим «первая строка — заголовки».
Публичные страницы теперь умеют отображать таблицы как адаптивный HTML-table блок.
Technical:
В `app/pages.php` добавлена нормализация блока `table` (header + rows, ограничения размеров и длины ячеек).
В `views/my_pages.php` расширен page-builder: тип `table`, визуальный table-editor и сериализация таблицы в `blocks_json`.
В `views/user_page_view.php` добавлен рендер блока таблицы (`table-responsive`, поддержка header/body).
v2.3.8
2026-02-22
What is new:
Снижен лаг при открытии страниц.
Technical:
Polling-задачи переведены в менее агрессивный режим.
v2.3.10
2026-02-22
What is new:
Исправлены критические проблемы отображения текста и уведомлений.
Technical:
Подготовлена база для финальной правки кодировки.
v2.3.11
2026-02-22
What is new:
Полностью восстановлен текст интерфейса на корректной кириллице.
Исправлены сообщения профиля, чатов, звонков и административных страниц.
Technical:
index.php восстановлен из стабильной версии и очищен от поврежденных строк.
Обновлены маршруты администрирования звонков: мониторинг, закрытие и удаление комнат.
v2.3.12
2026-02-22
What is new:
Исправлено отображение текста на странице звонка по ссылке.
Восстановлены подписи и действия в админ-панели.
Technical:
Очищены поврежденные символы в views/call_room.php и views/admin.php.
В call_room добавлено управление закрытием комнаты для создателя и администратора.
v2.3.13
2026-02-22
What is new:
Зафиксировано правило: кодировка проекта только UTF-8 без BOM.
Technical:
Добавлен .editorconfig с обязательным charset=utf-8.
Добавлен scripts/check-encoding.ps1 и подключён в scripts/make-release.ps1.
v2.3.14
2026-02-22
What is new:
Улучшено качество аудиозвонков в личных и публичных комнатах.
Добавлена автопопытка восстановления соединения при сетевых сбоях.
Technical:
Вынесены единые WebRTC-параметры: ICE/STUN/TURN и аудио-профиль в настройки админа.
Убраны хардкоды RTCPeerConnection в chat/call_room/admin_call_monitor.
Добавлено применение maxBitrate для аудио sender-параметров.
v2.3.15
2026-02-22
What is new:
Звонки стали отзывчивее без перегруза сервера: события обрабатываются быстрее после действий пользователя.
Стабильнее работа в фоне и после возврата в приложение/вкладку.
Technical:
Переведены call polling-циклы на адаптивный single-flight алгоритм (без наложения запросов).
Добавлены таймауты запросов, backoff при ошибках и fast-retry после сигналов/действий.
Применено в views/chat.php, views/call_room.php, views/admin_call_monitor.php.
v2.3.16
2026-02-22
What is new:
В админке добавлены импорт и экспорт базы данных в JSON для резервного копирования и переноса.
Добавлены сервисные операции очистки БД и файлов: RTC-мусор, старый аудит, удалённые файлы и сироты в uploads.
Technical:
Добавлен модуль app/admin_maintenance.php с безопасным экспортом/импортом и обслуживанием хранилища.
Импорт БД выполняется с полной заменой данных таблиц приложения (через DELETE в транзакции, без TRUNCATE).
Добавлены маршруты admin_db_export/admin_db_import/admin_db_cleanup и UI в views/admin_db.php.
v2.3.17
2026-02-22
What is new:
Исправлена критическая ошибка отправки emoji/смайликов в мессенджере на MySQL.
После обновления сайт автоматически приводит старые таблицы чата и связанные таблицы к emoji-safe кодировке utf8mb4.
Technical:
MySQL-подключение теперь принудительно использует SET NAMES/CHARACTER SET utf8mb4.
Добавлен runtime-check кодировки таблиц через INFORMATION_SCHEMA и best-effort конвертация в utf8mb4 только при необходимости.
Авто-проверка utf8mb4 подключена в обычный запуск index.php после ensure_schema().
v2.3.18
2026-02-22
What is new:
В админке БД добавлен визуальный статус проверки utf8mb4/emoji (для MySQL).
Теперь можно быстро увидеть, есть ли таблицы или колонки, которые ещё не готовы к emoji.
Technical:
Добавлен отчёт admin_db_charset_report() по INFORMATION_SCHEMA: default charset/collation БД, таблицы и текстовые колонки.
Отчёт выведен в views/admin_db.php с компактной сводкой и таблицами проблемных объектов (если есть).
Диагностика безопасна: только чтение метаданных, без изменений данных.
v2.3.19
2026-02-22
What is new:
Переработан блок смайликов в мессенджере: быстрые emoji, недавние emoji и удобная панель выбора.
Подключена библиотека emoji picker с поиском и категориями; добавлены быстрые кнопки, включая клоуна 🤡.
Technical:
Локально подключена библиотека public/vendor/emoji-button/emoji-button.min.js (без CDN-зависимости в рантайме).
В chat composer добавено хранение недавних emoji в localStorage и fallback-режим, если библиотека недоступна.
Добавлены стили/адаптация picker для mobile full-screen чата и тёмной темы.
v2.3.20
2026-02-22
What is new:
Исправлен баг мессенджера: новые сообщения теперь появляются в открытом чате без перезахода.
Если вы находитесь внизу ленты, чат автоматически прокручивается к новым сообщениям.
Technical:
Добавлен lightweight endpoint chat_messages_poll (инкрементальная выдача сообщений по after_id).
Во views/chat.php добавлен single-flight polling и клиентский рендер новых сообщений без полной перезагрузки страницы.
Обработчики редактирования и цитирования переведены на event delegation для новых дорисованных сообщений.
v2.3.21
2026-02-22
What is new:
Список диалогов в мессенджере теперь обновляется автоматически: новые сообщения и непрочитанные появляются без перезахода в чат.
Превью последнего сообщения, время и бейдж непрочитанных синхронизируются прямо в открытом разделе «Мессенджер».
Technical:
Добавлен endpoint chat_dialogs_poll с компактной JSON-выдачей списка диалогов для текущего пользователя.
Во views/chat.php добавлен отдельный single-flight polling списка диалогов с backoff, signature-check и обновлением DOM только при изменениях.
После получения новых сообщений в открытом чате запускается fast-refresh списка диалогов для быстрого обновления превью/бейджей.
v2.3.22
2026-02-22
What is new:
Переработан интерфейс мессенджера в стиле PWA-мессенджеров: удобнее список диалогов, компактнее шапка чата и чище лента сообщений.
На телефоне чат занимает экран аккуратнее: более компактные action-кнопки, улучшенная шапка и удобнее поле ввода для быстрых сообщений.
Technical:
Во views/chat.php обновлены layout/styling для desktop и mobile (split-pane, sticky composer, адаптивная шапка, улучшенные bubbles).
UI-рефактор сделан без изменения API звонков/сообщений: логика realtime/polling сохранена.
v2.3.23
2026-02-22
What is new:
Исправлена проблема со «слетающей» авторизацией: сессия пользователя теперь сохраняется стабильнее, особенно в PWA и на мобильных устройствах.
Пользователю больше не нужно постоянно повторно входить в аккаунт при обычном использовании сайта.
Technical:
Добавлена устойчивая инициализация PHP-сессии: cookie lifetime 30 дней, gc_maxlifetime 30 дней, httponly/samesite и корректный secure через HTTPS/X-Forwarded-Proto.
Сессии вынесены в project-local storage/sessions (если доступно), чтобы изолировать их от server-wide gc других сайтов/приложений.
Добавлено sliding-refresh session cookie и session_regenerate_id(true) при логине для стабильности и безопасности.
v2.3.24
2026-02-22
What is new:
Исправлен UX мессенджера на ПК: форма ввода теперь закреплена поверх ленты сообщений и всегда видна, как в Telegram/WhatsApp.
Возвращён стеклянный (glass) вид мессенджера на телефоне и PWA-экране.
Лента сообщений переведена на догрузку по шагам: история подгружается по 10 сообщений при прокрутке вверх, новые сообщения приходят вниз компактными пачками.
Technical:
Добавлен endpoint chat_messages_before_poll (before_id) и server helper conversation_messages_before_for_user() для lazy-history.
Стартовая загрузка сообщений в чате уменьшена до компактной пачки, дальнейшая история догружается по scroll trigger.
Во views/chat.php переработан layout conversation pane: внутренний scroll у chatMessages, фиксированный composer overlay на desktop, сохранена совместимость с текущими polling/звонками.
v2.3.25
2026-02-22
What is new:
Исправлен критичный UX-баг мессенджера на ПК: при открытии диалога теперь сразу видны последние сообщения и форма ввода (без прокрутки всей страницы вниз).
Форма ввода закреплена поверх ленты сообщений, а прокрутка выполняется внутри окна чата.
Доработан стеклянный стиль mobile/PWA после предыдущего интерфейсного обновления.
Technical:
Для desktop conversation pane добавлена жёсткая высота по viewport (CSS + JS syncDesktopMessengerViewport), чтобы контент не растягивал страницу.
chatMessages переведён в гарантированно внутренний scroll-container; composer остаётся fixed/overlay внутри card.
Сохранена lazy-history логика (+10) и polling новых сообщений без изменения API звонков/чатов.
v2.3.26
2026-02-22
What is new:
Добавлен отдельный центр уведомлений: быстрые переключатели, статус разрешений браузера, Service Worker/PWA и тест уведомления на устройство.
Настройки уведомлений теперь можно менять без захода в профиль — прямо из раздела «Уведомления».
Исправлен мобильный UX мессенджера при открытии клавиатуры: уменьшен лишний отступ под полем ввода, стабилизировано положение composer (меньше прыжков).
Technical:
Маршрут notifications получил обработку POST (сохранение notify_desktop/notify_sound) и скорректирован порядок mark_seen/counts.
Во views/chat.php добавлена VisualViewport-синхронизация mobile full-screen окна чата и очищен двойной safe-area padding снизу.
v2.3.27
2026-02-22
What is new:
Добавлена публичная страница «О проекте» (`/about`) с описанием проекта и карточками участников/вклада.
В профиле (редактирование) для администратора добавлен блок управления страницей «О проекте», включая загрузку фото участников с устройства.
На странице профиля добавлены лайки постов и ссылка на конкретный пост; из ленты постов убраны дефолтные кнопки «Скачать/Магнит» (показываются только при явном разрешении скачивания).
При создании/редактировании поста теперь можно прикреплять файлы напрямую с устройства (телефон/ПК), а не только из облака.
Technical:
Добавлены маршрут `about`, pretty-route `/about` и POST-обработчик `post_like_toggle` с JSON-ответом для AJAX.
В `profile_edit` добавлено сохранение настроек страницы about через `settings` + хранение списка участников в JSON (`about_contributors_json`).
Для постов подключена серверная обработка `attach_device_files[]` через `post_attach_uploaded_device_files()` и автоопределение типа вложения по MIME.
v2.3.28
2026-02-22
What is new:
Hotfix: исправлено битое сообщение после сохранения настроек в центре уведомлений (теперь отображается нормальная кириллица).
Technical:
В `index.php` заменены оставшиеся mojibake-строки flash-сообщения `Настройки уведомлений сохранены.` в обработчиках профиля и центра уведомлений.
v2.3.29
2026-02-22
What is new:
Hotfix: исправлены оставшиеся «кракозябры» в системных сообщениях/заголовках из `index.php` (включая центр уведомлений и очистку аудита в разделе БД).
Technical:
Выполнена массовая зачистка mojibake-строковых литералов в `index.php` (восстановлена нормальная кириллица в flash/title сообщениях).
Усилен `scripts/check-encoding.ps1`: проверка mojibake теперь использует кодовые точки (`U+00C2/U+00C3/U+00D0/U+00D1`), а не хрупкий текстовый regex.
README обновлён: примеры маркеров кракозябр переведены в формат `U+` кодов, чтобы чекер не ловил демонстрационные символы.
v2.3.30
2026-02-22
What is new:
Ссылка на страницу «О проекте» добавлена в подвал рядом с версией проекта.
Настройки страницы «О проекте» вынесены из профиля в отдельный раздел администрирования в дашборде.
Добавлены роли `global_admin` и `admin_tester` (тестировщик-администратор в режиме только чтение).
Для `admin` и `admin_tester` скрыт доступ к разделу БД и к просмотру учётных данных БД.
Улучшен UX уведомлений: при включении push-переключателя разрешение запрашивается сразу.
Страница мессенджера визуально облегчена и приведена к более единому стилю.
Technical:
Добавлен маршрут `admin_about` + новая страница `views/admin_about.php`; сохранение настроек about перенесено из `profile_edit` в admin-раздел.
Расширен RBAC: новые роли (`global_admin`, `admin_tester`), нормализация политик по умолчанию, закреплённые инварианты для доступа к БД/политикам/настройкам.
Добавлен централизованный backend-guard `enforce_readonly_tester_write_guard()` для блокировки всех write-запросов роли `admin_tester`.
Маршруты admin DB/settings/policies переведены на capability-gates; добавлена маскировка DB login/password в `views/admin_db.php` для не-`global_admin`.
Обновлены уведомления в `views/notifications.php` и `views/profile_edit.php`: авто-request permission и синхронизация с runtime helper `__TSOY_NOTIFY_RUNTIME`.
v2.3.31
2026-02-22
What is new:
Исправлены права управления пользователями: первый пользователь всегда закреплён как `global_admin`, обычный администратор не может понижать/блокировать/удалять его и сбрасывать ему пароль.
Роль `admin_tester` теперь может пользоваться обычными функциями приложения (включая профиль и фото), при этом изменения в админ-разделах по-прежнему заблокированы.
Мессенджер и верхнее меню теперь корректнее используют данные профиля (имя/аватар), а список диалогов подхватывает фото и `display_name` в том числе при автообновлении.
Technical:
Добавлены backend-инварианты для первого пользователя (`user_ensure_first_global_admin`, запрет бана/удаления первого пользователя) и защита операций над `global_admin` в `admin_users`.
Глобальный guard `admin_tester` сужен до write-операций админ-разделов, чтобы не ломать обычный пользовательский функционал.
Серверные payload-ы чата и SSR/JS-рендер унифицированы по `display_name`/`avatar_path`; обновлён session-refresh в `views/layout.php` и `auth_login()`.
v2.3.32
2026-02-22
What is new:
Исправлена логика публичных файлов: фото участников со страницы `/about` остаются публичными, но больше не попадают в ленту «Публичные файлы» на главной.
Улучшена навигация и нейминг: пользовательское облако переименовано в «Мои файлы», а `admin`-экран оформлен как «Файлы проекта».
Экран `admin` визуально приведён ближе к интерфейсу «Мои файлы» (единая шапка страницы, похожая таблица и структура действий).
Technical:
В `app/files.php` добавлена фильтрация публичной ленты по исключениям (`files_public_feed_excluded_ids()`), сейчас туда входят фото участников из `about_contributors_json`.
Обновлены заголовки/подписи в `views/home.php`, `views/dashboard.php`, `views/admin.php`, `views/layout.php`, `views/staff.php`, `views/chat.php`, `views/contacts.php` для уменьшения путаницы между пользовательским и административным файловыми экранами.
В `views/admin_about.php` добавлена явная подсказка о новом поведении публичных фото страницы `/about`.
v2.3.33
2026-02-22
What is new:
Добавлена отдельная «мемная» invite-регистрация для друзей с автоназначением ролей `admin` и `admin_tester` по токен-ссылке.
Страница спец-регистрации получила отдельный дизайн с анимациями и роль-специфичными сообщениями (admin/tester).
Форма спец-регистрации и тексты страницы теперь настраиваются из дашборда (тема, подписи, кнопки, ссылки-инвайты).
Technical:
Добавлен модуль `app/friend_registration.php`: JSON-конфиг спец-регистрации, токены, invite-ссылки, нормализация и resolve роли по токену.
В `index.php` добавлены маршруты `friend_register` и `admin_friend_register`, а также pretty-route `/friend-invite/<token>`.
Добавлены страницы `views/friend_register.php` и `views/admin_friend_register.php`, плюс ссылка на раздел в `views/staff.php`.
v2.3.34
2026-02-22
What is new:
Hotfix: устранены предупреждения Deprecated на PHP 8.4+ в модуле спец-регистрации друзей.
Technical:
В `app/friend_registration.php` сигнатуры helper-функций обновлены с implicit nullable (`array $cfg = null`) на явный nullable тип (`?array $cfg = null`).
v2.3.35
2026-02-22
What is new:
В спец-регистрацию друзей встроен виджет «кошка-говешка» с анимированным блоком внутри формы.
В настройках спец-регистрации можно загрузить фото кошки с устройства, включать/выключать блок и настраивать подпись/бейдж.
Добавлен глобальный UI-пресет `Psychedelic` для всего проекта (фон, карточки, кнопки, формы, таблицы, навигация и анимации).
Technical:
Спец-регистрация расширена настройками `cat_*` в `app/friend_registration.php`; загрузка изображения реализована в `index.php` и хранится в `public/friend_register/`.
В `views/friend_register.php` добавлен анимированный cat-widget с безопасным fallback без картинки.
Глобальная тема вынесена в preset `ui_style_preset` (`default|psychedelic`) через `ui_config()` и `views/partials/head.php`; управление добавлено в `views/admin_settings.php`.
v2.3.36
2026-02-22
What is new:
Базовый пресет оформления снова по умолчанию `Default`, а `Psychedelic` оставлен как опциональный вариант в настройках.
Уведомления о сообщениях и событиях теперь открывают соответствующий раздел (чат или календарь), а не всегда центр уведомлений.
Отправка сообщений в мессенджере переведена на асинхронный режим: обновляется только область чата без полной перезагрузки страницы.
Technical:
Добавлен JSON endpoint `chat_send_async` и клиентский submit-handler во `views/chat.php` для AJAX-отправки сообщения с поддержкой вложений.
В `notif_poll` добавлены target-ссылки (`chat`/`calendar`), а `views/partials/scripts.php` формирует отдельные device-notifications с корректным `data.url`.
Возврат дефолта пресета выполнен в `app/settings.php`, `ui_config()` (`app/bootstrap.php`), `views/admin_settings.php` и обработчике `admin_settings` в `index.php`.
v2.3.37
2026-02-22
What is new:
Мессенджер структурно облегчён: более компактный header/messages/composer stack, меньше визуальной тяжести и ближе к привычной мобильной логике.
Исправлено поведение поля ввода в мобильном полноэкранном чате: composer больше не “съезжает” вниз из-за наложенных padding/overlay-стилей.
Пузырьки сообщений и панель действий стали компактнее и чище, при этом все функции (редактирование, вложения, эмодзи, звонки) сохранены.
Technical:
В `views/chat.php` добавлены структурные классы (`chat-list-card`, `chat-conv-card`, `chat-conv-body`, `chat-composer-shell`) и финальный CSS override-блок с упрощённой layout-схемой.
Убран тяжёлый overlay-режим composer для conversation pane (через CSS overrides), сообщения снова живут в нормальном flex-stack без лишнего bottom-overlay padding.
Мобильный fullscreen-pane нормализован по safe-area: один источник нижнего отступа для composer вместо конфликтующих стилей.
v2.3.38
2026-02-22
What is new:
Перестроена DOM-структура окна диалога: `chatMessages` теперь единый контейнер на всю область чата, внутри которого находятся шапка, лента сообщений и composer.
Шапка диалога и панель ввода встроены внутрь общего контейнера как в современных мессенджерах, что улучшает поведение на мобильных экранах.
Скролл сообщений выделен во внутренний контейнер, чтобы сохранить плавность и корректную работу кнопки «Новые сообщения».
Technical:
В `views/chat.php` `id=\"chatMessages\"` переведён в роль root-container conversation pane, а scroll-area вынесена в `id=\"chatMessagesScroll\"`.
JS-логика мессенджера обновлена на новый scroll-target (`chatMessagesScroll`) с backward fallback на старую структуру.
Добавлены CSS-правила для 100% ширины/высоты `#chatMessages` внутри `chat-conv-body` и новой иерархии `chat-thread-shell` / `chat-thread-scroll-wrap`.
v2.3.39
2026-02-22
What is new:
Уменьшен зазор между клавиатурой и полем ввода в мобильном мессенджере (почти вплотную, несколько миллиметров).
Панель ввода в fullscreen-чате лучше поджимается к клавиатуре на iPhone/iOS.
Technical:
В `views/chat.php` добавлен динамический CSS var `--chat-mobile-composer-gap` и логика `visualViewport`-детекта открытой клавиатуры.
При открытой клавиатуре fullscreen-pane чата растягивается до видимого нижнего края без лишнего white-gap из-за `visualViewport.offsetTop`.
v2.3.40
2026-02-22
What is new:
Исправлен большой пустой отступ между полем ввода и клавиатурой в мобильном мессенджере (fullscreen chat).
Панель ввода и лента сообщений теперь корректно сжимаются при открытии клавиатуры.
Technical:
В `views/chat.php` снят конфликтующий `min-height`/жёсткая высота на mobile fullscreen-цепочке контейнеров (`chat-conv-body` → `#chatMessages` → scroll-wrap → `#chatMessagesScroll`).
Горячий фикс рассчитан на iOS/Safari/PWA сценарии, где клавиатура уменьшает viewport и ломает flex-layout с `min-height`.
v2.3.41
2026-02-22
What is new:
Дополнительно исправлен большой зазор над клавиатурой на iPhone: поле ввода поджимается ближе даже при включённой assistant/suggestions панели iOS.
Technical:
В `views/chat.php` добавлена реальная компенсация нижнего зазора по измерению положения composer относительно viewport (а не только по `visualViewport.height`).
Учтён iOS-кейс, когда `visualViewport` и `window.innerHeight` расходятся на высоту assistant/suggestions панели клавиатуры.
v2.3.42
2026-02-22
What is new:
Для диагностики iPhone-отступа убрана встроенная (inline) панель быстрых смайликов из формы сообщения в мессенджере.
Кнопка смайликов в composer теперь открывает полный emoji picker, если inline-панель отключена.
Technical:
Из `views/chat.php` удалён блок `chat-emoji-panel` внутри composer; JS-клик по `emojiBtn` переведён на fallback `toggleFullEmojiPicker()` при отсутствии inline-панели.
v2.3.43
2026-02-22
What is new:
Для диагностики iPhone-отступа убран набор layout-классов у нижнего блока `attachHint / Убрать вложение` в composer мессенджера.
Technical:
В `views/chat.php` блок под composer (с `attachHint` и `attachClearBtn`) упрощён до обычного контейнера без `d-flex/.../mt-2`.
v2.3.44
2026-02-22
What is new:
Для диагностики iPhone-отступа убран класс `small text-secondary` у блока `attachHint` в composer мессенджера.
Technical:
В `views/chat.php` элемент `#attachHint` оставлен без CSS-классов, чтобы исключить влияние типографики/line-height на высоту composer.
v2.3.45
2026-02-22
What is new:
Для диагностики iPhone-отступа удалён `id=\"attachHint\"` у нижнего блока composer и связанный CSS-минимум высоты.
Technical:
В `views/chat.php` удалено правило `#chatConvPane #attachHint { min-height ... }`, а сам элемент оставлен без `id`, чтобы исключить его вклад в высоту composer.
v2.3.46
2026-02-22
What is new:
Мессенджер вынесен из общего `container py-4` в отдельное “полотно” layout (full-canvas host), чтобы уменьшить конфликты мобильного fullscreen-режима с обёртками страницы.
Это изменение направлено именно на iPhone-баг с большим отступом над клавиатурой: чат теперь живёт в более простой DOM-структуре без общей контейнерной обвязки страницы.
Technical:
В `views/layout.php` добавлен route-aware режим `contentCanvasRoute` для `chat`: контент мессенджера рендерится в `chat-canvas-stage` вне `container py-4`.
В `views/chat.php` обновлены mobile fullscreen-селекторы, которые раньше были жёстко привязаны к `.container.py-4`, теперь они поддерживают `.chat-canvas-stage`.
v2.3.47
2026-02-22
What is new:
Мессенджер после фикса iPhone-клавиатуры дополнительно очищен и визуально облегчён: обновлены шапка страницы, список диалогов, полотно сообщений и composer.
Строка состояния редактирования в composer теперь показывается только в режиме редактирования, а не занимает место постоянно.
Technical:
Из `views/chat.php` удалён временный JS-компенсатор `tightenComposerToViewportBottom()` и связанный runtime-костыль `--chat-mobile-composer-gap`, оставлена более простая `visualViewport`-синхронизация.
Добавлены финальные CSS-overrides для canvas-режима чата (`chat-canvas-stage`) без возврата к старой layout-обвязке `container py-4`.
v2.3.48
2026-02-22
What is new:
На главной в разделе «Новости» теперь по умолчанию показываются только первые записи, остальные открываются кнопкой «Загрузить ещё».
В истории версий (технические новости по версиям) добавлен такой же режим постепенной подгрузки списка через кнопку «Показать ещё версии».
В профилях ролей `admin`, `global_admin` и `admin_tester` добавлен значок подтверждения рядом с именем.
Technical:
В `views/layout.php` добавлен универсальный client-side `load more`-инициализатор для блоков с `data-load-more-*`.
Разметка новостей на главной (`views/home.php`) и модалки истории версий (`views/layout.php`) переведена на единый шаблон постепенного раскрытия списка.
В `views/profile.php` добавлена role-aware отрисовка verified-иконки с tooltip для админских ролей.
v2.3.49
2026-02-22
What is new:
Исправлен повторный iPhone-баг в мессенджере с большим отступом между клавиатурой и полем ввода (runtime-компенсация viewport/composer для mobile fullscreen).
Новости на главной и технические заметки по версиям теперь действительно свёрнуты по умолчанию (первые 3 записи), остальные открываются через кнопку «Показать ещё / Загрузить ещё».
Блок разработчиков на странице `/about` теперь подтягивает имя, роль и фото из профилей администраторов (`global_admin`, `admin`, `admin_tester`), отдельно настраивается только заметка о вкладе.
Technical:
В `views/chat.php` возвращена измеряемая компенсация `visualViewport` по фактическому gap до composer (без возврата старого `--chat-mobile-composer-gap` костыля).
В `views/layout.php` исправлен клиентский `load more`-инициализатор (Safari-safe проверка вместо `ParentNode`) и добавлено серверное начальное сворачивание версий.
Добавлены `users_about_developers()` и `user_role_label_ru()` в `app/users.php`; `/about` и `admin_about` переведены на данные профилей + `about_developer_notes_json`.
v2.3.50
2026-02-22
What is new:
В мессенджере убрана служебная подпись под именем собеседника; клик по фото/имени в шапке диалога теперь открывает профиль собеседника.
Профиль расширен: значок админ-роли для администраторов, список друзей, количество друзей, а также кнопки добавления/удаления из друзей прямо на странице профиля.
В настройках профиля для ролей разработчиков (`global_admin`/`admin`/`admin_tester`) добавлен переключатель показа карточки на странице `/about` (по умолчанию включён).
Обложки постов теперь отображаются на всю ширину карточки; выбор обложки переведён на кнопку + модальное окно с выбором из облака или загрузкой с устройства (создание и редактирование поста).
Technical:
Добавлены helper-функции для видимости карточек разработчиков на `/about` (`about_developer_visibility_json`, `user_about_card_visible()`, `user_about_card_set_visible()`) и фильтрация в `users_about_developers()`.
Маршруты `post_create/post_update` получили поддержку `cover_device_file` через новый helper `post_cover_from_upload()` в `app/posts.php`.
Маршрут `contacts` поддерживает безопасный redirect назад на профиль после add/remove контакта.
v2.3.51
2026-02-22
What is new:
В мессенджере из composer удалён нижний блок `chat-attach-row` (подсказка/кнопка вложения), чтобы убрать лишнюю высоту и iPhone-gap («подбородок»).
Technical:
Из `views/chat.php` удалена разметка `div.chat-attach-row`; JS обработчики вложений уже безопасно работают при отсутствии `attachHint/attachClearBtn`.
v2.3.52
2026-02-22
What is new:
Усилен iPhone-fix для мессенджера: composer в mobile fullscreen при открытой клавиатуре закрепляется в `fixed`-режиме относительно видимой области, чтобы убрать большой зазор над клавиатурой.
Technical:
В `views/chat.php` добавлен режим `chat-composer-vv-fixed` + JS-синхронизация с `visualViewport` (адаптивно: `bottom=0` или компенсация `keyboardInset`, если fixed элемент уходит под клавиатуру).
v2.3.53
2026-02-22
What is new:
В мессенджере с composer снят класс `chat-sticky` (оставлен только `chat-composer-shell`) — hotfix для iPhone-отступа над клавиатурой.
Technical:
В `views/chat.php` удалён `chat-sticky` у обёртки формы сообщений, чтобы исключить конфликт sticky/fixed логики в mobile fullscreen.
v2.3.54
2026-02-22
What is new:
Ещё один iPhone hotfix для мессенджера: при открытой клавиатуре `fixed`-composer больше не обрезается контейнерами чата (снят clipping/blurs на время mobile keyboard mode).
Technical:
В `views/chat.php` добавлен режим `chat-composer-vv-mode`: при активной клавиатуре снимаются `overflow:hidden` и `backdrop-filter` у `chat-conv-card/chat-conv-body`, чтобы Safari не привязывал/не обрезал `position: fixed` composer внутри карточки.
v2.3.55
2026-02-22
What is new:
В мессенджере переписан mobile-composer режим для iPhone: поле ввода при открытой клавиатуре выносится в отдельный viewport-портал, чтобы не появлялся большой зазор над клавиатурой.
Technical:
В `views/chat.php` реализован `composer portal` (spacer + перенос `.chat-composer-shell` в `body` при mobile keyboard mode) вместо прежней fixed/sticky-компенсации внутри карточки чата.
v2.3.56
2026-02-22
What is new:
Добавлена система мультипрофилей: у одного аккаунта можно создавать, переключать и удалять несколько профилей через меню по клику на имя/аватар в шапке.
Для ролей разработчиков (`global_admin`/`admin`/`admin_tester`) добавлен выбор, какой профиль показывать на странице `/about`.
Лента файлов на главной переработана: авторизованный пользователь видит свои последние файлы, гость — файлы, загруженные гостями; в «Мои файлы» добавлены массовые и папочные действия «сделать доступными для всех».
Для постов добавлена настройка «Скрыть пост от гостей»; на открытом профиле гости видят только разрешённые публикации, а вложенные медиа (обложки/фото/аудио/видео) открываются через публичный профиль.
Technical:
В `app/migrations.php` добавлены `user_profiles`, колонки `users.active_profile_id/users.about_profile_id` и `posts.hide_from_guests`.
В `app/users.php` реализованы helper-ы мультипрофилей (bootstrap/create/switch/delete/sync/about-select) и overlay данных выбранного профиля в `/about`.
В `app/files.php` добавлены `files_recent_for_user()/files_recent_for_guests()`, массовая/папочная публичность и inline-доступ к медиа постов публичного профиля через `file_is_readable_by(..., $inline_view=true)`.
v2.3.57
2026-02-22
What is new:
Мессенджер откатан по фронтенду (`views/chat.php`) к состоянию релиза `2.3.46` — это версия, на которой исчезал iPhone-gap («подбородок») над клавиатурой.
Technical:
Сравнение показало, что `views/layout.php` (перенос чата в `chat-canvas-stage`) остаётся правильным; регрессия появилась позже в `views/chat.php` после добавления mobile keyboard viewport-хаков (`chat-composer-vv-portal`, `chat-composer-vv-fixed`, `chat-composer-vv-mode`, spacer/portal composer).
Откат выполнен точечно только для мессенджера: `views/chat.php` взят из архива `releases/tsoycloud_v2.3.46_2026-02-22.zip`.
v2.3.58
2026-02-22
What is new:
Мультипрофили переработаны: теперь каждый профиль аккаунта — это отдельный пользователь со своим логином и собственной страницей `/user/<login>` (отдельные посты, файлы и медиа).
В меню профилей аккаунта создание профиля теперь запрашивает отдельный логин (`username`) и отображаемое имя; основной профиль нельзя удалить.
Для ролей разработчиков выбор профиля для `/about` продолжает работать, но теперь выбирается реальный профиль-пользователь аккаунта.
Technical:
Логика `user_profiles_*` в `app/users.php` переведена с таблицы `user_profiles` на связанные записи `users` через `owner_account_user_id` (старую таблицу больше не используем как источник истины).
В `app/auth.php` добавлен `auth_session_apply_active_profile()` и `$_SESSION[\"auth_user_id\"]`: сессия хранит владельца аккаунта отдельно от активного профиля (`$_SESSION[\"user\"]`).
В `index.php`, `views/layout.php`, `views/profile_edit.php` управление профилями переведено на `current_account_owner_id()`, чтобы переключение/выбор `/about` работали на уровне аккаунта, а редактирование — на уровне активного профиля.
v2.3.59
2026-02-22
What is new:
Мессенджер улучшен поверх стабильной базы (без возврата mobile keyboard-хаков): имя/аватар собеседника в шапке снова открывают профиль, убрана лишняя служебная подпись.
В профиле добавлены отдельные блоки медиа: фото, видео и аудио (для владельца — из облака, для гостей/других пользователей — из видимых постов).
Добавлены комментарии к постам во всплывающем окне: просмотр, добавление, удаление (по правам).
Добавлен конструктор пользовательских страниц (блоки текст/галерея/ссылки) + публичный маршрут `/page/<user>/<slug>` и публикация страницы в виде поста на профиле.
Technical:
В `app/migrations.php` добавлены таблицы `post_comments` и `user_pages`.
В `app/posts.php` реализованы helpers комментариев и поддержка внутренних ссылок (`/page/...`) в `post_attachment_add_link()` для публикации страниц.
Добавлен новый helper `app/pages.php` (CRUD страниц, нормализация блоков, публичный рендер, публикация в посты); подключены маршруты `my_pages`, `user_page_*`, `post_comment_*` в `index.php`.
v2.3.60
2026-02-22
What is new:
Исправлено мобильное меню профилей в шапке: dropdown больше не уезжает влево на узких экранах (ограничена ширина, стабилизировано позиционирование).
Technical:
В `views/layout.php` профильный dropdown переведен на `data-bs-display=\"static\"` и вынесен на отдельный класс `topbar-profile-menu`; в `views/partials/head.php` добавлены mobile-safe стили ширины/переполнения.
v2.3.61
2026-02-22
What is new:
Исправлен раздел «Медиа» в профиле: теперь он показывает только контент, который пользователь явно добавил в посты (обложки и вложения), а не все файлы из облака.
Technical:
В `views/profile.php` блок `Медиа` переведен на единый источник данных (медиа из постов) для владельца и гостей; облачные файлы владельца больше не попадают туда автоматически.
v2.3.62
2026-02-22
What is new:
Профиль переведён на более современный шаблонный стиль: обновлены карточки, шапка профиля и добавлены верхние вкладки разделов (Посты/Друзья/Страницы/Медиа).
Разделы Фото/Видео/Аудио теперь работают как отдельные ручные галереи профиля: пользователь сам добавляет контент в галереи, а не получает автоподбор из облака/постов.
Владелец профиля может управлять галереями: добавлять файлы из облака, загружать с устройства и удалять элементы галереи.
Экран редактирования профиля визуально подтянут к новому стилю профиля.
Technical:
Добавлен helper `app/profile_media.php` и таблица `profile_media_items` (ручные галереи профиля) с миграцией в `app/migrations.php`.
Добавлен маршрут `profile_media_gallery` в `index.php` (добавление/удаление элементов галереи, загрузка файлов с устройства).
В `app/files.php` расширен inline-доступ к файлам для публичных профильных галерей (`profile_media_file_inline_visible_on_public_profile()`).
v2.3.63
2026-02-22
What is new:
Профиль ещё ближе к новому шаблону: усилен визуал шапки (cover/avatar/chips/статистика), обновлены карточки друзей/страниц/медиа и общий стиль карточек постов/модалок.
Улучшена навигация по разделам профиля через верхние вкладки с сохранением активной вкладки.
Technical:
В `views/profile.php` расширен слой профильных стилей и добавлены счётчики/визуальные блоки без изменения бизнес-логики постов, комментариев и ролей.
v2.3.64
2026-02-22
What is new:
Посты на странице профиля ещё ближе к новому шаблону: добавлен header карточки (аватар/имя/@username/время), улучшен action-bar и визуал карточек.
Модалка комментариев профиля визуально переработана и на мобильных ведёт себя ближе к формату bottom-sheet.
Technical:
В `views/profile.php` добавлены профильные UI-классы для карточек постов и комментариев без изменения текущей логики лайков/комментариев/прав доступа.
v2.3.65
2026-02-22
What is new:
Управление галереями профиля перенесено в модалку (вместо collapse), что ближе к новому шаблону и удобнее на мобильных устройствах.
Экран `Редактировать профиль` заметно переработан визуально: добавлен hero-preview профиля, улучшены блоки загрузки аватара/обложки и группировка полей.
Technical:
В `views/profile.php` блок управления ручными галереями переведён на modal-layout без изменения логики форм `profile_media_gallery`.
В `views/profile_edit.php` добавлены новые UI-обёртки и стили (`profile-edit-header-*`, `profile-edit-fieldset`, `profile-edit-upload-*`) при сохранении прежних POST-полей.
v2.3.66
2026-02-22
What is new:
Профиль дополнительно отполирован под мобильные устройства: карточки друзей и страниц стали компактнее и аккуратнее на узких экранах.
В модалке комментариев улучшен блок ввода: форма стала ближе к привычному мобильному composer-формату.
Сетка медиа в профиле уплотнена и выровнена для более ровного отображения на телефонах.
Technical:
В `views/profile.php` добавлены mobile-first стили и классы для списков друзей/страниц, медиасетки и composer-разметки комментариев без изменения бизнес-логики.
v3.0.0
2026-02-22
What is new:
Подготовлен крупный профильный апдейт 3.0: улучшен mobile UX профиля (Друзья/Страницы/Медиа), а форма комментариев в модалке стала ближе к привычному мобильному composer-формату.
Полностью переработан интерфейс мультипрофилей в шапке: новый dropdown с быстрым переключением, аватарами и статусами профилей.
Модалка «Профили аккаунта» получила новый карточный UI: создание профиля, переключение, удаление, переименование и выбор профиля для `/about` стали заметно понятнее.
Technical:
В `views/layout.php` переписана разметка topbar dropdown и модалки `#userProfilesModal` без изменения существующих роутов/POST-действий (`user_profiles`).
В `views/partials/head.php` добавлен новый слой стилей для мультипрофильного UX (`topbar-profile-*`, `user-profiles-modal-modern`, `user-profile-card*`) с адаптацией под мобильные экраны.
В `app/news.php` добавлена системная новость о релизе 3.0.0 для главной страницы.
v3.0.1
2026-02-22
What is new:
На странице профиля кнопка копирования публичной ссылки теперь копирует адрес в буфер и показывает диалог «Скопировано».
При открытии профиля по публичной ссылке `/user/<username>` скрывается боковое меню (desktop + mobile offcanvas), страница выглядит ближе к формату соцсети.
Technical:
В `views/profile.php` обновлён helper `copyText()` для кнопок `.js-copy`: успешное копирование подтверждается диалогом, fallback остаётся только при ошибке clipboard API.
В `views/layout.php` добавлен режим публичной страницы профиля (`$publicProfilePageRoute`) с условным отключением sidebar/offcanvas и корректировкой mobile topbar-отступа.
v3.0.2
2026-02-22
What is new:
На страницах профиля боковое меню теперь скрывается только у гостей. Для авторизованных пользователей навигация в профиле снова доступна.
Technical:
В `views/layout.php` режим “соц-страницы без меню” ограничен только гостевым просмотром публичного профиля (`$guestPublicProfileSocialMode`).
v3.0.3
2026-02-22
What is new:
Кнопки «Ссылка на профиль» и «Ссылка на пост» на странице профиля теперь копируют ссылку в буфер по одному клику.
Technical:
В `views/profile.php` copy-handler для `.js-copy/.js-magnet` усилен: добавлены `preventDefault/stopPropagation` и fallback-копирование через `textarea + execCommand(copy)` без обязательного `prompt`.
v3.1.0
2026-02-22
What is new:
Конструктор пользовательских страниц серьёзно переработан: добавлены блоки «Статья», «Гайд» и «Плеер роликов» помимо галереи/ссылок.
В выборе файлов для конструктора страниц больше не нужны ID вручную: добавлен единый проводник файлов с папками, поиском, фильтрами и мультивыбором.
Раздел «Медиа» в профиле также переведён на этот же проводник: выбор фото/видео/аудио для галерей теперь через нормальный файловый интерфейс.
Technical:
Добавлен reusable partial `views/partials/file_explorer_picker.php` (модалка + JS-компонент `TsoyFileExplorerPicker`) для повторного использования в разных разделах.
В `app/pages.php` расширена модель блоков страниц (`article`, `guide`, `video_player`) и обновлён сбор используемых file_id для рендера.
В `views/my_pages.php` переписан UI конструктора страниц и убран ручной ввод ID файлов в пользу picker-компонента.
В `views/user_page_view.php` добавлен рендер новых блоков (статья/гайд/видеоплеер с плейлистом).
В `views/profile.php` модалка управления галереями профиля переведена на единый picker вместо списков чекбоксов по ID.
v3.2.0
2026-02-22
What is new:
Усилен PWA-режим для ПК и смартфонов: улучшен manifest (ярлыки быстрых действий, desktop/mobile launch-поведение, метаданные приложения).
Уведомления и звонки в PWA/браузере теперь надёжнее открывают нужный раздел по клику (чат, конкретный звонок, уведомления и т.д.).
Улучшено локальное офлайн-кеширование файлов: кнопки офлайн-режима теперь корректно показывают статус уже закешированных файлов.
Technical:
Root и `public/service-worker.js` синхронизированы и переведены на единый hardened SW (navigation preload, deep-link `notificationclick`, управление файловым кешем через message API).
В Service Worker добавлен корректный bypass для `Range`-запросов, чтобы не ломать стриминг аудио/видео и просмотр медиа на мобильных устройствах.
В `views/partials/scripts.php` добавлен `__TSOY_PWA_RUNTIME` (статус PWA, persistent storage, работа с файловым кешем SW) и обработка `TSOY_NAVIGATE` сообщений от SW.
Fallback `Notification` в `views/partials/scripts.php` и `views/chat.php` дополнен click-handler с deep-link навигацией в нужный чат/звонок.
Manifest и head-мета обновлены для лучшей совместимости PWA на desktop/mobile (`shortcuts`, `display_override`, `launch_handler`, `mobile-web-app-capable`).
v3.2.1
2026-02-22
What is new:
В разделе «Настройки → Брендинг» добавлена отдельная настройка названия проекта в шапке (верхняя панель и боковое меню).
Technical:
Добавлен ключ настроек `site_header_name`; при пустом значении используется fallback на `site_name`.
В `views/layout.php` брендинг шапки переведён на отдельную переменную `$siteHeaderName`, не затрагивая title страниц и прочие места, где используется `site_name`.
v3.3.0
2026-02-22
What is new:
Проведена большая унификация визуального стиля проекта: карточки, навигация, формы, модалки и отступы лучше согласованы между разделами.
Раздел «Настройки → Оформление» расширен: добавлены настройки глобального шрифта, масштаба текста, ширины контента, контраста поверхностей и отдельная плотность мессенджера.
Мессенджер получил более компактные облака сообщений (Telegram-like режим), при этом мобильная геометрия composer/клавиатуры не менялась.
Technical:
Расширен `ui_config()` и системные настройки (`ui_font_family`, `ui_font_scale`, `ui_content_width`, `ui_surface_contrast`, `ui_chat_density`) с валидацией в `index.php?r=admin_settings`.
В `views/partials/head.php` добавлены новые data-атрибуты UI и глобальные CSS-токены (font-scale, content-width, surface-contrast) для централизованного управления дизайном.
В `views/chat.php` добавлены безопасные CSS-presets плотности чата (roomy/compact/telegram) только для bubble/spacing, без вмешательства в composer/sticky/viewport-логику.
Сохранена PWA-совместимость: дизайн-настройки реализованы через CSS/HTML data-атрибуты и не затрагивают service worker, офлайн-кеш и keyboard-fixes.
v3.3.1
2026-02-22
What is new:
В мессенджере выбор файла из облака переведён на единый проводник (папки, поиск, фильтры, превью), как в других разделах проекта.
Исправлено меню действий сообщения (`Изменить/Удалить`): dropdown больше не перекрывается соседними сообщениями.
Настройки `Оформление` лучше применяются к мессенджеру: `Ширина контента` работает в canvas-режиме, а плотность/контраст теперь заметно влияют на чат.
Technical:
В `views/chat.php` интегрирован reusable `TsoyFileExplorerPicker` для attach-модалки (mobile-safe сценарий через отдельную модалку picker-а).
Для строк сообщений добавлен z-index lift при `show.bs.dropdown` (`chat-row-menu-open`), чтобы меню действий не попадало под соседние bubbles.
В `views/layout.php` `.chat-canvas-stage` привязан к `--t-content-max`, поэтому `ui_content_width` теперь работает и на странице мессенджера.
В `views/chat.php` добавлены визуальные связки с глобальными токенами `ui_surface_contrast` и `ui_density`, без изменений composer/keyboard-геометрии (чтобы не вернуть “подбородок”).
v3.3.2
2026-02-22
What is new:
В «Центре уведомлений» блок с уведомлениями/событиями теперь показывается первым, а настройки уведомлений идут после него.
Technical:
В `views/notifications.php` переставлен визуальный порядок колонок через grid-order (`notify-col-feed` перед `notify-col-settings`) и обновлён заголовок блока на «Все уведомления».
v3.3.3
2026-02-22
What is new:
Страница «Контакты» визуально приведена к стилю мессенджера: одинаковая шапка, поверхности, контуры и оттенки/градиенты.
Technical:
В `views/contacts.php` добавлен локальный токенизированный стиль (`contacts-page`) с той же логикой surface/background, что и в мессенджере, включая реакции на `ui_surface_contrast` и `ui_density`.
v3.3.4
2026-02-22
What is new:
Проводник файлов в профиле (обложка и вложения постов) переведён на единое ядро `TsoyFileExplorerPicker`, как в мессенджере.
Вложения к посту с устройства в профиле переработаны в единый блок внутри модалки вложений (облако + устройство + ссылки), чтобы выбор работал стабильнее и понятнее.
`/index.php?r=admin` переименован в «Хранилище проекта» и получил папочную структуру с фильтром по владельцу и папке.
Technical:
В `views/profile.php` добавлен JS-слой унификации старых модалок вложений постов: облачные файлы выбираются через общий picker, а hidden-inputs собираются по mime (`attach_images/video/audio/files`).
В `app/files.php` расширен `files_admin_list()` (фильтры по владельцу и папке) и добавлены helper-функции `files_admin_owner_stats()` / `files_admin_folders_list()` для админского проводника.
В `views/admin.php`, `views/staff.php`, `index.php` и `views/chat.php` обновлён нейминг admin-файлового экрана на «Хранилище проекта/Хранилище».
v3.3.5
2026-02-22
What is new:
Исправлен двойной проводник в профиле: при выборе обложки поста больше не открывается одновременно новый и старый интерфейс.
Копирование ссылки на профиль и пост теперь использует тихий toast («Скопировано») вместо модального `alert`.
Клипса в мессенджере переведена на явный JS-open attach-модалки с mobile fallback.
Technical:
В `views/profile.php` удалены legacy JS-билдеры вложений постов (`js-att`/`js-att-edit`) и старые вкладки вложений теперь физически вырезаются из DOM после инициализации нового picker-слоя.
В `views/profile.php` убраны bootstrap-trigger атрибуты с кнопок выбора обложки (теперь открывается только `TsoyFileExplorerPicker`), а возврат старой attach-модалки после picker отключён.
В `views/chat.php` убраны мёртвые остатки старого cloud-list фильтра (`cloudSearch/cloudRadios`) и добавлен явный обработчик `attachBtn` для iOS/mobile кейсов.
v3.3.6
2026-02-22
What is new:
В конструкторе пользовательских страниц добавлен новый блок «Таблица» с ручным редактированием ячеек.
Для блока таблицы доступны действия: добавить/удалить строку и добавить/удалить столбец, а также режим «первая строка — заголовки».
Публичные страницы теперь умеют отображать таблицы как адаптивный HTML-table блок.
Technical:
В `app/pages.php` добавлена нормализация блока `table` (header + rows, ограничения размеров и длины ячеек).
В `views/my_pages.php` расширен page-builder: тип `table`, визуальный table-editor и сериализация таблицы в `blocks_json`.
В `views/user_page_view.php` добавлен рендер блока таблицы (`table-responsive`, поддержка header/body).
v2.3.8
2026-02-22
What is new:
Снижен лаг при открытии страниц.
Technical:
Polling-задачи переведены в менее агрессивный режим.
v2.3.10
2026-02-22
What is new:
Исправлены критические проблемы отображения текста и уведомлений.
Technical:
Подготовлена база для финальной правки кодировки.
v2.3.11
2026-02-22
What is new:
Полностью восстановлен текст интерфейса на корректной кириллице.
Исправлены сообщения профиля, чатов, звонков и административных страниц.
Technical:
index.php восстановлен из стабильной версии и очищен от поврежденных строк.
Обновлены маршруты администрирования звонков: мониторинг, закрытие и удаление комнат.
v2.3.12
2026-02-22
What is new:
Исправлено отображение текста на странице звонка по ссылке.
Восстановлены подписи и действия в админ-панели.
Technical:
Очищены поврежденные символы в views/call_room.php и views/admin.php.
В call_room добавлено управление закрытием комнаты для создателя и администратора.
v2.3.13
2026-02-22
What is new:
Зафиксировано правило: кодировка проекта только UTF-8 без BOM.
Technical:
Добавлен .editorconfig с обязательным charset=utf-8.
Добавлен scripts/check-encoding.ps1 и подключён в scripts/make-release.ps1.
v2.3.14
2026-02-22
What is new:
Улучшено качество аудиозвонков в личных и публичных комнатах.
Добавлена автопопытка восстановления соединения при сетевых сбоях.
Technical:
Вынесены единые WebRTC-параметры: ICE/STUN/TURN и аудио-профиль в настройки админа.
Убраны хардкоды RTCPeerConnection в chat/call_room/admin_call_monitor.
Добавлено применение maxBitrate для аудио sender-параметров.
v2.3.15
2026-02-22
What is new:
Звонки стали отзывчивее без перегруза сервера: события обрабатываются быстрее после действий пользователя.
Стабильнее работа в фоне и после возврата в приложение/вкладку.
Technical:
Переведены call polling-циклы на адаптивный single-flight алгоритм (без наложения запросов).
Добавлены таймауты запросов, backoff при ошибках и fast-retry после сигналов/действий.
Применено в views/chat.php, views/call_room.php, views/admin_call_monitor.php.
v2.3.16
2026-02-22
What is new:
В админке добавлены импорт и экспорт базы данных в JSON для резервного копирования и переноса.
Добавлены сервисные операции очистки БД и файлов: RTC-мусор, старый аудит, удалённые файлы и сироты в uploads.
Technical:
Добавлен модуль app/admin_maintenance.php с безопасным экспортом/импортом и обслуживанием хранилища.
Импорт БД выполняется с полной заменой данных таблиц приложения (через DELETE в транзакции, без TRUNCATE).
Добавлены маршруты admin_db_export/admin_db_import/admin_db_cleanup и UI в views/admin_db.php.
v2.3.17
2026-02-22
What is new:
Исправлена критическая ошибка отправки emoji/смайликов в мессенджере на MySQL.
После обновления сайт автоматически приводит старые таблицы чата и связанные таблицы к emoji-safe кодировке utf8mb4.
Technical:
MySQL-подключение теперь принудительно использует SET NAMES/CHARACTER SET utf8mb4.
Добавлен runtime-check кодировки таблиц через INFORMATION_SCHEMA и best-effort конвертация в utf8mb4 только при необходимости.
Авто-проверка utf8mb4 подключена в обычный запуск index.php после ensure_schema().
v2.3.18
2026-02-22
What is new:
В админке БД добавлен визуальный статус проверки utf8mb4/emoji (для MySQL).
Теперь можно быстро увидеть, есть ли таблицы или колонки, которые ещё не готовы к emoji.
Technical:
Добавлен отчёт admin_db_charset_report() по INFORMATION_SCHEMA: default charset/collation БД, таблицы и текстовые колонки.
Отчёт выведен в views/admin_db.php с компактной сводкой и таблицами проблемных объектов (если есть).
Диагностика безопасна: только чтение метаданных, без изменений данных.
v2.3.19
2026-02-22
What is new:
Переработан блок смайликов в мессенджере: быстрые emoji, недавние emoji и удобная панель выбора.
Подключена библиотека emoji picker с поиском и категориями; добавлены быстрые кнопки, включая клоуна 🤡.
Technical:
Локально подключена библиотека public/vendor/emoji-button/emoji-button.min.js (без CDN-зависимости в рантайме).
В chat composer добавено хранение недавних emoji в localStorage и fallback-режим, если библиотека недоступна.
Добавлены стили/адаптация picker для mobile full-screen чата и тёмной темы.
v2.3.20
2026-02-22
What is new:
Исправлен баг мессенджера: новые сообщения теперь появляются в открытом чате без перезахода.
Если вы находитесь внизу ленты, чат автоматически прокручивается к новым сообщениям.
Technical:
Добавлен lightweight endpoint chat_messages_poll (инкрементальная выдача сообщений по after_id).
Во views/chat.php добавлен single-flight polling и клиентский рендер новых сообщений без полной перезагрузки страницы.
Обработчики редактирования и цитирования переведены на event delegation для новых дорисованных сообщений.
v2.3.21
2026-02-22
What is new:
Список диалогов в мессенджере теперь обновляется автоматически: новые сообщения и непрочитанные появляются без перезахода в чат.
Превью последнего сообщения, время и бейдж непрочитанных синхронизируются прямо в открытом разделе «Мессенджер».
Technical:
Добавлен endpoint chat_dialogs_poll с компактной JSON-выдачей списка диалогов для текущего пользователя.
Во views/chat.php добавлен отдельный single-flight polling списка диалогов с backoff, signature-check и обновлением DOM только при изменениях.
После получения новых сообщений в открытом чате запускается fast-refresh списка диалогов для быстрого обновления превью/бейджей.
v2.3.22
2026-02-22
What is new:
Переработан интерфейс мессенджера в стиле PWA-мессенджеров: удобнее список диалогов, компактнее шапка чата и чище лента сообщений.
На телефоне чат занимает экран аккуратнее: более компактные action-кнопки, улучшенная шапка и удобнее поле ввода для быстрых сообщений.
Technical:
Во views/chat.php обновлены layout/styling для desktop и mobile (split-pane, sticky composer, адаптивная шапка, улучшенные bubbles).
UI-рефактор сделан без изменения API звонков/сообщений: логика realtime/polling сохранена.
v2.3.23
2026-02-22
What is new:
Исправлена проблема со «слетающей» авторизацией: сессия пользователя теперь сохраняется стабильнее, особенно в PWA и на мобильных устройствах.
Пользователю больше не нужно постоянно повторно входить в аккаунт при обычном использовании сайта.
Technical:
Добавлена устойчивая инициализация PHP-сессии: cookie lifetime 30 дней, gc_maxlifetime 30 дней, httponly/samesite и корректный secure через HTTPS/X-Forwarded-Proto.
Сессии вынесены в project-local storage/sessions (если доступно), чтобы изолировать их от server-wide gc других сайтов/приложений.
Добавлено sliding-refresh session cookie и session_regenerate_id(true) при логине для стабильности и безопасности.
v2.3.24
2026-02-22
What is new:
Исправлен UX мессенджера на ПК: форма ввода теперь закреплена поверх ленты сообщений и всегда видна, как в Telegram/WhatsApp.
Возвращён стеклянный (glass) вид мессенджера на телефоне и PWA-экране.
Лента сообщений переведена на догрузку по шагам: история подгружается по 10 сообщений при прокрутке вверх, новые сообщения приходят вниз компактными пачками.
Technical:
Добавлен endpoint chat_messages_before_poll (before_id) и server helper conversation_messages_before_for_user() для lazy-history.
Стартовая загрузка сообщений в чате уменьшена до компактной пачки, дальнейшая история догружается по scroll trigger.
Во views/chat.php переработан layout conversation pane: внутренний scroll у chatMessages, фиксированный composer overlay на desktop, сохранена совместимость с текущими polling/звонками.
v2.3.25
2026-02-22
What is new:
Исправлен критичный UX-баг мессенджера на ПК: при открытии диалога теперь сразу видны последние сообщения и форма ввода (без прокрутки всей страницы вниз).
Форма ввода закреплена поверх ленты сообщений, а прокрутка выполняется внутри окна чата.
Доработан стеклянный стиль mobile/PWA после предыдущего интерфейсного обновления.
Technical:
Для desktop conversation pane добавлена жёсткая высота по viewport (CSS + JS syncDesktopMessengerViewport), чтобы контент не растягивал страницу.
chatMessages переведён в гарантированно внутренний scroll-container; composer остаётся fixed/overlay внутри card.
Сохранена lazy-history логика (+10) и polling новых сообщений без изменения API звонков/чатов.
v2.3.26
2026-02-22
What is new:
Добавлен отдельный центр уведомлений: быстрые переключатели, статус разрешений браузера, Service Worker/PWA и тест уведомления на устройство.
Настройки уведомлений теперь можно менять без захода в профиль — прямо из раздела «Уведомления».
Исправлен мобильный UX мессенджера при открытии клавиатуры: уменьшен лишний отступ под полем ввода, стабилизировано положение composer (меньше прыжков).
Technical:
Маршрут notifications получил обработку POST (сохранение notify_desktop/notify_sound) и скорректирован порядок mark_seen/counts.
Во views/chat.php добавлена VisualViewport-синхронизация mobile full-screen окна чата и очищен двойной safe-area padding снизу.
v2.3.27
2026-02-22
What is new:
Добавлена публичная страница «О проекте» (`/about`) с описанием проекта и карточками участников/вклада.
В профиле (редактирование) для администратора добавлен блок управления страницей «О проекте», включая загрузку фото участников с устройства.
На странице профиля добавлены лайки постов и ссылка на конкретный пост; из ленты постов убраны дефолтные кнопки «Скачать/Магнит» (показываются только при явном разрешении скачивания).
При создании/редактировании поста теперь можно прикреплять файлы напрямую с устройства (телефон/ПК), а не только из облака.
Technical:
Добавлены маршрут `about`, pretty-route `/about` и POST-обработчик `post_like_toggle` с JSON-ответом для AJAX.
В `profile_edit` добавлено сохранение настроек страницы about через `settings` + хранение списка участников в JSON (`about_contributors_json`).
Для постов подключена серверная обработка `attach_device_files[]` через `post_attach_uploaded_device_files()` и автоопределение типа вложения по MIME.
v2.3.28
2026-02-22
What is new:
Hotfix: исправлено битое сообщение после сохранения настроек в центре уведомлений (теперь отображается нормальная кириллица).
Technical:
В `index.php` заменены оставшиеся mojibake-строки flash-сообщения `Настройки уведомлений сохранены.` в обработчиках профиля и центра уведомлений.
v2.3.29
2026-02-22
What is new:
Hotfix: исправлены оставшиеся «кракозябры» в системных сообщениях/заголовках из `index.php` (включая центр уведомлений и очистку аудита в разделе БД).
Technical:
Выполнена массовая зачистка mojibake-строковых литералов в `index.php` (восстановлена нормальная кириллица в flash/title сообщениях).
Усилен `scripts/check-encoding.ps1`: проверка mojibake теперь использует кодовые точки (`U+00C2/U+00C3/U+00D0/U+00D1`), а не хрупкий текстовый regex.
README обновлён: примеры маркеров кракозябр переведены в формат `U+` кодов, чтобы чекер не ловил демонстрационные символы.
v2.3.30
2026-02-22
What is new:
Ссылка на страницу «О проекте» добавлена в подвал рядом с версией проекта.
Настройки страницы «О проекте» вынесены из профиля в отдельный раздел администрирования в дашборде.
Добавлены роли `global_admin` и `admin_tester` (тестировщик-администратор в режиме только чтение).
Для `admin` и `admin_tester` скрыт доступ к разделу БД и к просмотру учётных данных БД.
Улучшен UX уведомлений: при включении push-переключателя разрешение запрашивается сразу.
Страница мессенджера визуально облегчена и приведена к более единому стилю.
Technical:
Добавлен маршрут `admin_about` + новая страница `views/admin_about.php`; сохранение настроек about перенесено из `profile_edit` в admin-раздел.
Расширен RBAC: новые роли (`global_admin`, `admin_tester`), нормализация политик по умолчанию, закреплённые инварианты для доступа к БД/политикам/настройкам.
Добавлен централизованный backend-guard `enforce_readonly_tester_write_guard()` для блокировки всех write-запросов роли `admin_tester`.
Маршруты admin DB/settings/policies переведены на capability-gates; добавлена маскировка DB login/password в `views/admin_db.php` для не-`global_admin`.
Обновлены уведомления в `views/notifications.php` и `views/profile_edit.php`: авто-request permission и синхронизация с runtime helper `__TSOY_NOTIFY_RUNTIME`.
v2.3.31
2026-02-22
What is new:
Исправлены права управления пользователями: первый пользователь всегда закреплён как `global_admin`, обычный администратор не может понижать/блокировать/удалять его и сбрасывать ему пароль.
Роль `admin_tester` теперь может пользоваться обычными функциями приложения (включая профиль и фото), при этом изменения в админ-разделах по-прежнему заблокированы.
Мессенджер и верхнее меню теперь корректнее используют данные профиля (имя/аватар), а список диалогов подхватывает фото и `display_name` в том числе при автообновлении.
Technical:
Добавлены backend-инварианты для первого пользователя (`user_ensure_first_global_admin`, запрет бана/удаления первого пользователя) и защита операций над `global_admin` в `admin_users`.
Глобальный guard `admin_tester` сужен до write-операций админ-разделов, чтобы не ломать обычный пользовательский функционал.
Серверные payload-ы чата и SSR/JS-рендер унифицированы по `display_name`/`avatar_path`; обновлён session-refresh в `views/layout.php` и `auth_login()`.
v2.3.32
2026-02-22
What is new:
Исправлена логика публичных файлов: фото участников со страницы `/about` остаются публичными, но больше не попадают в ленту «Публичные файлы» на главной.
Улучшена навигация и нейминг: пользовательское облако переименовано в «Мои файлы», а `admin`-экран оформлен как «Файлы проекта».
Экран `admin` визуально приведён ближе к интерфейсу «Мои файлы» (единая шапка страницы, похожая таблица и структура действий).
Technical:
В `app/files.php` добавлена фильтрация публичной ленты по исключениям (`files_public_feed_excluded_ids()`), сейчас туда входят фото участников из `about_contributors_json`.
Обновлены заголовки/подписи в `views/home.php`, `views/dashboard.php`, `views/admin.php`, `views/layout.php`, `views/staff.php`, `views/chat.php`, `views/contacts.php` для уменьшения путаницы между пользовательским и административным файловыми экранами.
В `views/admin_about.php` добавлена явная подсказка о новом поведении публичных фото страницы `/about`.
v2.3.33
2026-02-22
What is new:
Добавлена отдельная «мемная» invite-регистрация для друзей с автоназначением ролей `admin` и `admin_tester` по токен-ссылке.
Страница спец-регистрации получила отдельный дизайн с анимациями и роль-специфичными сообщениями (admin/tester).
Форма спец-регистрации и тексты страницы теперь настраиваются из дашборда (тема, подписи, кнопки, ссылки-инвайты).
Technical:
Добавлен модуль `app/friend_registration.php`: JSON-конфиг спец-регистрации, токены, invite-ссылки, нормализация и resolve роли по токену.
В `index.php` добавлены маршруты `friend_register` и `admin_friend_register`, а также pretty-route `/friend-invite/<token>`.
Добавлены страницы `views/friend_register.php` и `views/admin_friend_register.php`, плюс ссылка на раздел в `views/staff.php`.
v2.3.34
2026-02-22
What is new:
Hotfix: устранены предупреждения Deprecated на PHP 8.4+ в модуле спец-регистрации друзей.
Technical:
В `app/friend_registration.php` сигнатуры helper-функций обновлены с implicit nullable (`array $cfg = null`) на явный nullable тип (`?array $cfg = null`).
v2.3.35
2026-02-22
What is new:
В спец-регистрацию друзей встроен виджет «кошка-говешка» с анимированным блоком внутри формы.
В настройках спец-регистрации можно загрузить фото кошки с устройства, включать/выключать блок и настраивать подпись/бейдж.
Добавлен глобальный UI-пресет `Psychedelic` для всего проекта (фон, карточки, кнопки, формы, таблицы, навигация и анимации).
Technical:
Спец-регистрация расширена настройками `cat_*` в `app/friend_registration.php`; загрузка изображения реализована в `index.php` и хранится в `public/friend_register/`.
В `views/friend_register.php` добавлен анимированный cat-widget с безопасным fallback без картинки.
Глобальная тема вынесена в preset `ui_style_preset` (`default|psychedelic`) через `ui_config()` и `views/partials/head.php`; управление добавлено в `views/admin_settings.php`.
v2.3.36
2026-02-22
What is new:
Базовый пресет оформления снова по умолчанию `Default`, а `Psychedelic` оставлен как опциональный вариант в настройках.
Уведомления о сообщениях и событиях теперь открывают соответствующий раздел (чат или календарь), а не всегда центр уведомлений.
Отправка сообщений в мессенджере переведена на асинхронный режим: обновляется только область чата без полной перезагрузки страницы.
Technical:
Добавлен JSON endpoint `chat_send_async` и клиентский submit-handler во `views/chat.php` для AJAX-отправки сообщения с поддержкой вложений.
В `notif_poll` добавлены target-ссылки (`chat`/`calendar`), а `views/partials/scripts.php` формирует отдельные device-notifications с корректным `data.url`.
Возврат дефолта пресета выполнен в `app/settings.php`, `ui_config()` (`app/bootstrap.php`), `views/admin_settings.php` и обработчике `admin_settings` в `index.php`.
v2.3.37
2026-02-22
What is new:
Мессенджер структурно облегчён: более компактный header/messages/composer stack, меньше визуальной тяжести и ближе к привычной мобильной логике.
Исправлено поведение поля ввода в мобильном полноэкранном чате: composer больше не “съезжает” вниз из-за наложенных padding/overlay-стилей.
Пузырьки сообщений и панель действий стали компактнее и чище, при этом все функции (редактирование, вложения, эмодзи, звонки) сохранены.
Technical:
В `views/chat.php` добавлены структурные классы (`chat-list-card`, `chat-conv-card`, `chat-conv-body`, `chat-composer-shell`) и финальный CSS override-блок с упрощённой layout-схемой.
Убран тяжёлый overlay-режим composer для conversation pane (через CSS overrides), сообщения снова живут в нормальном flex-stack без лишнего bottom-overlay padding.
Мобильный fullscreen-pane нормализован по safe-area: один источник нижнего отступа для composer вместо конфликтующих стилей.
v2.3.38
2026-02-22
What is new:
Перестроена DOM-структура окна диалога: `chatMessages` теперь единый контейнер на всю область чата, внутри которого находятся шапка, лента сообщений и composer.
Шапка диалога и панель ввода встроены внутрь общего контейнера как в современных мессенджерах, что улучшает поведение на мобильных экранах.
Скролл сообщений выделен во внутренний контейнер, чтобы сохранить плавность и корректную работу кнопки «Новые сообщения».
Technical:
В `views/chat.php` `id=\"chatMessages\"` переведён в роль root-container conversation pane, а scroll-area вынесена в `id=\"chatMessagesScroll\"`.
JS-логика мессенджера обновлена на новый scroll-target (`chatMessagesScroll`) с backward fallback на старую структуру.
Добавлены CSS-правила для 100% ширины/высоты `#chatMessages` внутри `chat-conv-body` и новой иерархии `chat-thread-shell` / `chat-thread-scroll-wrap`.
v2.3.39
2026-02-22
What is new:
Уменьшен зазор между клавиатурой и полем ввода в мобильном мессенджере (почти вплотную, несколько миллиметров).
Панель ввода в fullscreen-чате лучше поджимается к клавиатуре на iPhone/iOS.
Technical:
В `views/chat.php` добавлен динамический CSS var `--chat-mobile-composer-gap` и логика `visualViewport`-детекта открытой клавиатуры.
При открытой клавиатуре fullscreen-pane чата растягивается до видимого нижнего края без лишнего white-gap из-за `visualViewport.offsetTop`.
v2.3.40
2026-02-22
What is new:
Исправлен большой пустой отступ между полем ввода и клавиатурой в мобильном мессенджере (fullscreen chat).
Панель ввода и лента сообщений теперь корректно сжимаются при открытии клавиатуры.
Technical:
В `views/chat.php` снят конфликтующий `min-height`/жёсткая высота на mobile fullscreen-цепочке контейнеров (`chat-conv-body` → `#chatMessages` → scroll-wrap → `#chatMessagesScroll`).
Горячий фикс рассчитан на iOS/Safari/PWA сценарии, где клавиатура уменьшает viewport и ломает flex-layout с `min-height`.
v2.3.41
2026-02-22
What is new:
Дополнительно исправлен большой зазор над клавиатурой на iPhone: поле ввода поджимается ближе даже при включённой assistant/suggestions панели iOS.
Technical:
В `views/chat.php` добавлена реальная компенсация нижнего зазора по измерению положения composer относительно viewport (а не только по `visualViewport.height`).
Учтён iOS-кейс, когда `visualViewport` и `window.innerHeight` расходятся на высоту assistant/suggestions панели клавиатуры.
v2.3.42
2026-02-22
What is new:
Для диагностики iPhone-отступа убрана встроенная (inline) панель быстрых смайликов из формы сообщения в мессенджере.
Кнопка смайликов в composer теперь открывает полный emoji picker, если inline-панель отключена.
Technical:
Из `views/chat.php` удалён блок `chat-emoji-panel` внутри composer; JS-клик по `emojiBtn` переведён на fallback `toggleFullEmojiPicker()` при отсутствии inline-панели.
v2.3.43
2026-02-22
What is new:
Для диагностики iPhone-отступа убран набор layout-классов у нижнего блока `attachHint / Убрать вложение` в composer мессенджера.
Technical:
В `views/chat.php` блок под composer (с `attachHint` и `attachClearBtn`) упрощён до обычного контейнера без `d-flex/.../mt-2`.
v2.3.44
2026-02-22
What is new:
Для диагностики iPhone-отступа убран класс `small text-secondary` у блока `attachHint` в composer мессенджера.
Technical:
В `views/chat.php` элемент `#attachHint` оставлен без CSS-классов, чтобы исключить влияние типографики/line-height на высоту composer.
v2.3.45
2026-02-22
What is new:
Для диагностики iPhone-отступа удалён `id=\"attachHint\"` у нижнего блока composer и связанный CSS-минимум высоты.
Technical:
В `views/chat.php` удалено правило `#chatConvPane #attachHint { min-height ... }`, а сам элемент оставлен без `id`, чтобы исключить его вклад в высоту composer.
v2.3.46
2026-02-22
What is new:
Мессенджер вынесен из общего `container py-4` в отдельное “полотно” layout (full-canvas host), чтобы уменьшить конфликты мобильного fullscreen-режима с обёртками страницы.
Это изменение направлено именно на iPhone-баг с большим отступом над клавиатурой: чат теперь живёт в более простой DOM-структуре без общей контейнерной обвязки страницы.
Technical:
В `views/layout.php` добавлен route-aware режим `contentCanvasRoute` для `chat`: контент мессенджера рендерится в `chat-canvas-stage` вне `container py-4`.
В `views/chat.php` обновлены mobile fullscreen-селекторы, которые раньше были жёстко привязаны к `.container.py-4`, теперь они поддерживают `.chat-canvas-stage`.
v2.3.47
2026-02-22
What is new:
Мессенджер после фикса iPhone-клавиатуры дополнительно очищен и визуально облегчён: обновлены шапка страницы, список диалогов, полотно сообщений и composer.
Строка состояния редактирования в composer теперь показывается только в режиме редактирования, а не занимает место постоянно.
Technical:
Из `views/chat.php` удалён временный JS-компенсатор `tightenComposerToViewportBottom()` и связанный runtime-костыль `--chat-mobile-composer-gap`, оставлена более простая `visualViewport`-синхронизация.
Добавлены финальные CSS-overrides для canvas-режима чата (`chat-canvas-stage`) без возврата к старой layout-обвязке `container py-4`.
v2.3.48
2026-02-22
What is new:
На главной в разделе «Новости» теперь по умолчанию показываются только первые записи, остальные открываются кнопкой «Загрузить ещё».
В истории версий (технические новости по версиям) добавлен такой же режим постепенной подгрузки списка через кнопку «Показать ещё версии».
В профилях ролей `admin`, `global_admin` и `admin_tester` добавлен значок подтверждения рядом с именем.
Technical:
В `views/layout.php` добавлен универсальный client-side `load more`-инициализатор для блоков с `data-load-more-*`.
Разметка новостей на главной (`views/home.php`) и модалки истории версий (`views/layout.php`) переведена на единый шаблон постепенного раскрытия списка.
В `views/profile.php` добавлена role-aware отрисовка verified-иконки с tooltip для админских ролей.
v2.3.49
2026-02-22
What is new:
Исправлен повторный iPhone-баг в мессенджере с большим отступом между клавиатурой и полем ввода (runtime-компенсация viewport/composer для mobile fullscreen).
Новости на главной и технические заметки по версиям теперь действительно свёрнуты по умолчанию (первые 3 записи), остальные открываются через кнопку «Показать ещё / Загрузить ещё».
Блок разработчиков на странице `/about` теперь подтягивает имя, роль и фото из профилей администраторов (`global_admin`, `admin`, `admin_tester`), отдельно настраивается только заметка о вкладе.
Technical:
В `views/chat.php` возвращена измеряемая компенсация `visualViewport` по фактическому gap до composer (без возврата старого `--chat-mobile-composer-gap` костыля).
В `views/layout.php` исправлен клиентский `load more`-инициализатор (Safari-safe проверка вместо `ParentNode`) и добавлено серверное начальное сворачивание версий.
Добавлены `users_about_developers()` и `user_role_label_ru()` в `app/users.php`; `/about` и `admin_about` переведены на данные профилей + `about_developer_notes_json`.
v2.3.50
2026-02-22
What is new:
В мессенджере убрана служебная подпись под именем собеседника; клик по фото/имени в шапке диалога теперь открывает профиль собеседника.
Профиль расширен: значок админ-роли для администраторов, список друзей, количество друзей, а также кнопки добавления/удаления из друзей прямо на странице профиля.
В настройках профиля для ролей разработчиков (`global_admin`/`admin`/`admin_tester`) добавлен переключатель показа карточки на странице `/about` (по умолчанию включён).
Обложки постов теперь отображаются на всю ширину карточки; выбор обложки переведён на кнопку + модальное окно с выбором из облака или загрузкой с устройства (создание и редактирование поста).
Technical:
Добавлены helper-функции для видимости карточек разработчиков на `/about` (`about_developer_visibility_json`, `user_about_card_visible()`, `user_about_card_set_visible()`) и фильтрация в `users_about_developers()`.
Маршруты `post_create/post_update` получили поддержку `cover_device_file` через новый helper `post_cover_from_upload()` в `app/posts.php`.
Маршрут `contacts` поддерживает безопасный redirect назад на профиль после add/remove контакта.
v2.3.51
2026-02-22
What is new:
В мессенджере из composer удалён нижний блок `chat-attach-row` (подсказка/кнопка вложения), чтобы убрать лишнюю высоту и iPhone-gap («подбородок»).
Technical:
Из `views/chat.php` удалена разметка `div.chat-attach-row`; JS обработчики вложений уже безопасно работают при отсутствии `attachHint/attachClearBtn`.
v2.3.52
2026-02-22
What is new:
Усилен iPhone-fix для мессенджера: composer в mobile fullscreen при открытой клавиатуре закрепляется в `fixed`-режиме относительно видимой области, чтобы убрать большой зазор над клавиатурой.
Technical:
В `views/chat.php` добавлен режим `chat-composer-vv-fixed` + JS-синхронизация с `visualViewport` (адаптивно: `bottom=0` или компенсация `keyboardInset`, если fixed элемент уходит под клавиатуру).
v2.3.53
2026-02-22
What is new:
В мессенджере с composer снят класс `chat-sticky` (оставлен только `chat-composer-shell`) — hotfix для iPhone-отступа над клавиатурой.
Technical:
В `views/chat.php` удалён `chat-sticky` у обёртки формы сообщений, чтобы исключить конфликт sticky/fixed логики в mobile fullscreen.
v2.3.54
2026-02-22
What is new:
Ещё один iPhone hotfix для мессенджера: при открытой клавиатуре `fixed`-composer больше не обрезается контейнерами чата (снят clipping/blurs на время mobile keyboard mode).
Technical:
В `views/chat.php` добавлен режим `chat-composer-vv-mode`: при активной клавиатуре снимаются `overflow:hidden` и `backdrop-filter` у `chat-conv-card/chat-conv-body`, чтобы Safari не привязывал/не обрезал `position: fixed` composer внутри карточки.
v2.3.55
2026-02-22
What is new:
В мессенджере переписан mobile-composer режим для iPhone: поле ввода при открытой клавиатуре выносится в отдельный viewport-портал, чтобы не появлялся большой зазор над клавиатурой.
Technical:
В `views/chat.php` реализован `composer portal` (spacer + перенос `.chat-composer-shell` в `body` при mobile keyboard mode) вместо прежней fixed/sticky-компенсации внутри карточки чата.
v2.3.56
2026-02-22
What is new:
Добавлена система мультипрофилей: у одного аккаунта можно создавать, переключать и удалять несколько профилей через меню по клику на имя/аватар в шапке.
Для ролей разработчиков (`global_admin`/`admin`/`admin_tester`) добавлен выбор, какой профиль показывать на странице `/about`.
Лента файлов на главной переработана: авторизованный пользователь видит свои последние файлы, гость — файлы, загруженные гостями; в «Мои файлы» добавлены массовые и папочные действия «сделать доступными для всех».
Для постов добавлена настройка «Скрыть пост от гостей»; на открытом профиле гости видят только разрешённые публикации, а вложенные медиа (обложки/фото/аудио/видео) открываются через публичный профиль.
Technical:
В `app/migrations.php` добавлены `user_profiles`, колонки `users.active_profile_id/users.about_profile_id` и `posts.hide_from_guests`.
В `app/users.php` реализованы helper-ы мультипрофилей (bootstrap/create/switch/delete/sync/about-select) и overlay данных выбранного профиля в `/about`.
В `app/files.php` добавлены `files_recent_for_user()/files_recent_for_guests()`, массовая/папочная публичность и inline-доступ к медиа постов публичного профиля через `file_is_readable_by(..., $inline_view=true)`.
v2.3.57
2026-02-22
What is new:
Мессенджер откатан по фронтенду (`views/chat.php`) к состоянию релиза `2.3.46` — это версия, на которой исчезал iPhone-gap («подбородок») над клавиатурой.
Technical:
Сравнение показало, что `views/layout.php` (перенос чата в `chat-canvas-stage`) остаётся правильным; регрессия появилась позже в `views/chat.php` после добавления mobile keyboard viewport-хаков (`chat-composer-vv-portal`, `chat-composer-vv-fixed`, `chat-composer-vv-mode`, spacer/portal composer).
Откат выполнен точечно только для мессенджера: `views/chat.php` взят из архива `releases/tsoycloud_v2.3.46_2026-02-22.zip`.
v2.3.58
2026-02-22
What is new:
Мультипрофили переработаны: теперь каждый профиль аккаунта — это отдельный пользователь со своим логином и собственной страницей `/user/<login>` (отдельные посты, файлы и медиа).
В меню профилей аккаунта создание профиля теперь запрашивает отдельный логин (`username`) и отображаемое имя; основной профиль нельзя удалить.
Для ролей разработчиков выбор профиля для `/about` продолжает работать, но теперь выбирается реальный профиль-пользователь аккаунта.
Technical:
Логика `user_profiles_*` в `app/users.php` переведена с таблицы `user_profiles` на связанные записи `users` через `owner_account_user_id` (старую таблицу больше не используем как источник истины).
В `app/auth.php` добавлен `auth_session_apply_active_profile()` и `$_SESSION[\"auth_user_id\"]`: сессия хранит владельца аккаунта отдельно от активного профиля (`$_SESSION[\"user\"]`).
В `index.php`, `views/layout.php`, `views/profile_edit.php` управление профилями переведено на `current_account_owner_id()`, чтобы переключение/выбор `/about` работали на уровне аккаунта, а редактирование — на уровне активного профиля.
v2.3.59
2026-02-22
What is new:
Мессенджер улучшен поверх стабильной базы (без возврата mobile keyboard-хаков): имя/аватар собеседника в шапке снова открывают профиль, убрана лишняя служебная подпись.
В профиле добавлены отдельные блоки медиа: фото, видео и аудио (для владельца — из облака, для гостей/других пользователей — из видимых постов).
Добавлены комментарии к постам во всплывающем окне: просмотр, добавление, удаление (по правам).
Добавлен конструктор пользовательских страниц (блоки текст/галерея/ссылки) + публичный маршрут `/page/<user>/<slug>` и публикация страницы в виде поста на профиле.
Technical:
В `app/migrations.php` добавлены таблицы `post_comments` и `user_pages`.
В `app/posts.php` реализованы helpers комментариев и поддержка внутренних ссылок (`/page/...`) в `post_attachment_add_link()` для публикации страниц.
Добавлен новый helper `app/pages.php` (CRUD страниц, нормализация блоков, публичный рендер, публикация в посты); подключены маршруты `my_pages`, `user_page_*`, `post_comment_*` в `index.php`.
v2.3.60
2026-02-22
What is new:
Исправлено мобильное меню профилей в шапке: dropdown больше не уезжает влево на узких экранах (ограничена ширина, стабилизировано позиционирование).
Technical:
В `views/layout.php` профильный dropdown переведен на `data-bs-display=\"static\"` и вынесен на отдельный класс `topbar-profile-menu`; в `views/partials/head.php` добавлены mobile-safe стили ширины/переполнения.
v2.3.61
2026-02-22
What is new:
Исправлен раздел «Медиа» в профиле: теперь он показывает только контент, который пользователь явно добавил в посты (обложки и вложения), а не все файлы из облака.
Technical:
В `views/profile.php` блок `Медиа` переведен на единый источник данных (медиа из постов) для владельца и гостей; облачные файлы владельца больше не попадают туда автоматически.
v2.3.62
2026-02-22
What is new:
Профиль переведён на более современный шаблонный стиль: обновлены карточки, шапка профиля и добавлены верхние вкладки разделов (Посты/Друзья/Страницы/Медиа).
Разделы Фото/Видео/Аудио теперь работают как отдельные ручные галереи профиля: пользователь сам добавляет контент в галереи, а не получает автоподбор из облака/постов.
Владелец профиля может управлять галереями: добавлять файлы из облака, загружать с устройства и удалять элементы галереи.
Экран редактирования профиля визуально подтянут к новому стилю профиля.
Technical:
Добавлен helper `app/profile_media.php` и таблица `profile_media_items` (ручные галереи профиля) с миграцией в `app/migrations.php`.
Добавлен маршрут `profile_media_gallery` в `index.php` (добавление/удаление элементов галереи, загрузка файлов с устройства).
В `app/files.php` расширен inline-доступ к файлам для публичных профильных галерей (`profile_media_file_inline_visible_on_public_profile()`).
v2.3.63
2026-02-22
What is new:
Профиль ещё ближе к новому шаблону: усилен визуал шапки (cover/avatar/chips/статистика), обновлены карточки друзей/страниц/медиа и общий стиль карточек постов/модалок.
Улучшена навигация по разделам профиля через верхние вкладки с сохранением активной вкладки.
Technical:
В `views/profile.php` расширен слой профильных стилей и добавлены счётчики/визуальные блоки без изменения бизнес-логики постов, комментариев и ролей.
v2.3.64
2026-02-22
What is new:
Посты на странице профиля ещё ближе к новому шаблону: добавлен header карточки (аватар/имя/@username/время), улучшен action-bar и визуал карточек.
Модалка комментариев профиля визуально переработана и на мобильных ведёт себя ближе к формату bottom-sheet.
Technical:
В `views/profile.php` добавлены профильные UI-классы для карточек постов и комментариев без изменения текущей логики лайков/комментариев/прав доступа.
v2.3.65
2026-02-22
What is new:
Управление галереями профиля перенесено в модалку (вместо collapse), что ближе к новому шаблону и удобнее на мобильных устройствах.
Экран `Редактировать профиль` заметно переработан визуально: добавлен hero-preview профиля, улучшены блоки загрузки аватара/обложки и группировка полей.
Technical:
В `views/profile.php` блок управления ручными галереями переведён на modal-layout без изменения логики форм `profile_media_gallery`.
В `views/profile_edit.php` добавлены новые UI-обёртки и стили (`profile-edit-header-*`, `profile-edit-fieldset`, `profile-edit-upload-*`) при сохранении прежних POST-полей.
v2.3.66
2026-02-22
What is new:
Профиль дополнительно отполирован под мобильные устройства: карточки друзей и страниц стали компактнее и аккуратнее на узких экранах.
В модалке комментариев улучшен блок ввода: форма стала ближе к привычному мобильному composer-формату.
Сетка медиа в профиле уплотнена и выровнена для более ровного отображения на телефонах.
Technical:
В `views/profile.php` добавлены mobile-first стили и классы для списков друзей/страниц, медиасетки и composer-разметки комментариев без изменения бизнес-логики.
v3.0.0
2026-02-22
What is new:
Подготовлен крупный профильный апдейт 3.0: улучшен mobile UX профиля (Друзья/Страницы/Медиа), а форма комментариев в модалке стала ближе к привычному мобильному composer-формату.
Полностью переработан интерфейс мультипрофилей в шапке: новый dropdown с быстрым переключением, аватарами и статусами профилей.
Модалка «Профили аккаунта» получила новый карточный UI: создание профиля, переключение, удаление, переименование и выбор профиля для `/about` стали заметно понятнее.
Technical:
В `views/layout.php` переписана разметка topbar dropdown и модалки `#userProfilesModal` без изменения существующих роутов/POST-действий (`user_profiles`).
В `views/partials/head.php` добавлен новый слой стилей для мультипрофильного UX (`topbar-profile-*`, `user-profiles-modal-modern`, `user-profile-card*`) с адаптацией под мобильные экраны.
В `app/news.php` добавлена системная новость о релизе 3.0.0 для главной страницы.
v3.0.1
2026-02-22
What is new:
На странице профиля кнопка копирования публичной ссылки теперь копирует адрес в буфер и показывает диалог «Скопировано».
При открытии профиля по публичной ссылке `/user/<username>` скрывается боковое меню (desktop + mobile offcanvas), страница выглядит ближе к формату соцсети.
Technical:
В `views/profile.php` обновлён helper `copyText()` для кнопок `.js-copy`: успешное копирование подтверждается диалогом, fallback остаётся только при ошибке clipboard API.
В `views/layout.php` добавлен режим публичной страницы профиля (`$publicProfilePageRoute`) с условным отключением sidebar/offcanvas и корректировкой mobile topbar-отступа.
v3.0.2
2026-02-22
What is new:
На страницах профиля боковое меню теперь скрывается только у гостей. Для авторизованных пользователей навигация в профиле снова доступна.
Technical:
В `views/layout.php` режим “соц-страницы без меню” ограничен только гостевым просмотром публичного профиля (`$guestPublicProfileSocialMode`).
v3.0.3
2026-02-22
What is new:
Кнопки «Ссылка на профиль» и «Ссылка на пост» на странице профиля теперь копируют ссылку в буфер по одному клику.
Technical:
В `views/profile.php` copy-handler для `.js-copy/.js-magnet` усилен: добавлены `preventDefault/stopPropagation` и fallback-копирование через `textarea + execCommand(copy)` без обязательного `prompt`.
v3.1.0
2026-02-22
What is new:
Конструктор пользовательских страниц серьёзно переработан: добавлены блоки «Статья», «Гайд» и «Плеер роликов» помимо галереи/ссылок.
В выборе файлов для конструктора страниц больше не нужны ID вручную: добавлен единый проводник файлов с папками, поиском, фильтрами и мультивыбором.
Раздел «Медиа» в профиле также переведён на этот же проводник: выбор фото/видео/аудио для галерей теперь через нормальный файловый интерфейс.
Technical:
Добавлен reusable partial `views/partials/file_explorer_picker.php` (модалка + JS-компонент `TsoyFileExplorerPicker`) для повторного использования в разных разделах.
В `app/pages.php` расширена модель блоков страниц (`article`, `guide`, `video_player`) и обновлён сбор используемых file_id для рендера.
В `views/my_pages.php` переписан UI конструктора страниц и убран ручной ввод ID файлов в пользу picker-компонента.
В `views/user_page_view.php` добавлен рендер новых блоков (статья/гайд/видеоплеер с плейлистом).
В `views/profile.php` модалка управления галереями профиля переведена на единый picker вместо списков чекбоксов по ID.
v3.2.0
2026-02-22
What is new:
Усилен PWA-режим для ПК и смартфонов: улучшен manifest (ярлыки быстрых действий, desktop/mobile launch-поведение, метаданные приложения).
Уведомления и звонки в PWA/браузере теперь надёжнее открывают нужный раздел по клику (чат, конкретный звонок, уведомления и т.д.).
Улучшено локальное офлайн-кеширование файлов: кнопки офлайн-режима теперь корректно показывают статус уже закешированных файлов.
Technical:
Root и `public/service-worker.js` синхронизированы и переведены на единый hardened SW (navigation preload, deep-link `notificationclick`, управление файловым кешем через message API).
В Service Worker добавлен корректный bypass для `Range`-запросов, чтобы не ломать стриминг аудио/видео и просмотр медиа на мобильных устройствах.
В `views/partials/scripts.php` добавлен `__TSOY_PWA_RUNTIME` (статус PWA, persistent storage, работа с файловым кешем SW) и обработка `TSOY_NAVIGATE` сообщений от SW.
Fallback `Notification` в `views/partials/scripts.php` и `views/chat.php` дополнен click-handler с deep-link навигацией в нужный чат/звонок.
Manifest и head-мета обновлены для лучшей совместимости PWA на desktop/mobile (`shortcuts`, `display_override`, `launch_handler`, `mobile-web-app-capable`).
v3.2.1
2026-02-22
What is new:
В разделе «Настройки → Брендинг» добавлена отдельная настройка названия проекта в шапке (верхняя панель и боковое меню).
Technical:
Добавлен ключ настроек `site_header_name`; при пустом значении используется fallback на `site_name`.
В `views/layout.php` брендинг шапки переведён на отдельную переменную `$siteHeaderName`, не затрагивая title страниц и прочие места, где используется `site_name`.
v3.3.0
2026-02-22
What is new:
Проведена большая унификация визуального стиля проекта: карточки, навигация, формы, модалки и отступы лучше согласованы между разделами.
Раздел «Настройки → Оформление» расширен: добавлены настройки глобального шрифта, масштаба текста, ширины контента, контраста поверхностей и отдельная плотность мессенджера.
Мессенджер получил более компактные облака сообщений (Telegram-like режим), при этом мобильная геометрия composer/клавиатуры не менялась.
Technical:
Расширен `ui_config()` и системные настройки (`ui_font_family`, `ui_font_scale`, `ui_content_width`, `ui_surface_contrast`, `ui_chat_density`) с валидацией в `index.php?r=admin_settings`.
В `views/partials/head.php` добавлены новые data-атрибуты UI и глобальные CSS-токены (font-scale, content-width, surface-contrast) для централизованного управления дизайном.
В `views/chat.php` добавлены безопасные CSS-presets плотности чата (roomy/compact/telegram) только для bubble/spacing, без вмешательства в composer/sticky/viewport-логику.
Сохранена PWA-совместимость: дизайн-настройки реализованы через CSS/HTML data-атрибуты и не затрагивают service worker, офлайн-кеш и keyboard-fixes.
v3.3.1
2026-02-22
What is new:
В мессенджере выбор файла из облака переведён на единый проводник (папки, поиск, фильтры, превью), как в других разделах проекта.
Исправлено меню действий сообщения (`Изменить/Удалить`): dropdown больше не перекрывается соседними сообщениями.
Настройки `Оформление` лучше применяются к мессенджеру: `Ширина контента` работает в canvas-режиме, а плотность/контраст теперь заметно влияют на чат.
Technical:
В `views/chat.php` интегрирован reusable `TsoyFileExplorerPicker` для attach-модалки (mobile-safe сценарий через отдельную модалку picker-а).
Для строк сообщений добавлен z-index lift при `show.bs.dropdown` (`chat-row-menu-open`), чтобы меню действий не попадало под соседние bubbles.
В `views/layout.php` `.chat-canvas-stage` привязан к `--t-content-max`, поэтому `ui_content_width` теперь работает и на странице мессенджера.
В `views/chat.php` добавлены визуальные связки с глобальными токенами `ui_surface_contrast` и `ui_density`, без изменений composer/keyboard-геометрии (чтобы не вернуть “подбородок”).
v3.3.2
2026-02-22
What is new:
В «Центре уведомлений» блок с уведомлениями/событиями теперь показывается первым, а настройки уведомлений идут после него.
Technical:
В `views/notifications.php` переставлен визуальный порядок колонок через grid-order (`notify-col-feed` перед `notify-col-settings`) и обновлён заголовок блока на «Все уведомления».
v3.3.3
2026-02-22
What is new:
Страница «Контакты» визуально приведена к стилю мессенджера: одинаковая шапка, поверхности, контуры и оттенки/градиенты.
Technical:
В `views/contacts.php` добавлен локальный токенизированный стиль (`contacts-page`) с той же логикой surface/background, что и в мессенджере, включая реакции на `ui_surface_contrast` и `ui_density`.
v3.3.4
2026-02-22
What is new:
Проводник файлов в профиле (обложка и вложения постов) переведён на единое ядро `TsoyFileExplorerPicker`, как в мессенджере.
Вложения к посту с устройства в профиле переработаны в единый блок внутри модалки вложений (облако + устройство + ссылки), чтобы выбор работал стабильнее и понятнее.
`/index.php?r=admin` переименован в «Хранилище проекта» и получил папочную структуру с фильтром по владельцу и папке.
Technical:
В `views/profile.php` добавлен JS-слой унификации старых модалок вложений постов: облачные файлы выбираются через общий picker, а hidden-inputs собираются по mime (`attach_images/video/audio/files`).
В `app/files.php` расширен `files_admin_list()` (фильтры по владельцу и папке) и добавлены helper-функции `files_admin_owner_stats()` / `files_admin_folders_list()` для админского проводника.
В `views/admin.php`, `views/staff.php`, `index.php` и `views/chat.php` обновлён нейминг admin-файлового экрана на «Хранилище проекта/Хранилище».
v3.3.5
2026-02-22
What is new:
Исправлен двойной проводник в профиле: при выборе обложки поста больше не открывается одновременно новый и старый интерфейс.
Копирование ссылки на профиль и пост теперь использует тихий toast («Скопировано») вместо модального `alert`.
Клипса в мессенджере переведена на явный JS-open attach-модалки с mobile fallback.
Technical:
В `views/profile.php` удалены legacy JS-билдеры вложений постов (`js-att`/`js-att-edit`) и старые вкладки вложений теперь физически вырезаются из DOM после инициализации нового picker-слоя.
В `views/profile.php` убраны bootstrap-trigger атрибуты с кнопок выбора обложки (теперь открывается только `TsoyFileExplorerPicker`), а возврат старой attach-модалки после picker отключён.
В `views/chat.php` убраны мёртвые остатки старого cloud-list фильтра (`cloudSearch/cloudRadios`) и добавлен явный обработчик `attachBtn` для iOS/mobile кейсов.
v3.3.6
2026-02-22
What is new:
В конструкторе пользовательских страниц добавлен новый блок «Таблица» с ручным редактированием ячеек.
Для блока таблицы доступны действия: добавить/удалить строку и добавить/удалить столбец, а также режим «первая строка — заголовки».
Публичные страницы теперь умеют отображать таблицы как адаптивный HTML-table блок.
Technical:
В `app/pages.php` добавлена нормализация блока `table` (header + rows, ограничения размеров и длины ячеек).
В `views/my_pages.php` расширен page-builder: тип `table`, визуальный table-editor и сериализация таблицы в `blocks_json`.
В `views/user_page_view.php` добавлен рендер блока таблицы (`table-responsive`, поддержка header/body).