В `views/notifications.php` переставлен визуальный порядок колонок через grid-order (`notify-col-feed` перед `notify-col-settings`) и обновлён заголовок блока на «Все уведомления».
v3.3.1
2026-02-22
В `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.0
2026-02-22
Расширен `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.2.1
2026-02-22
Добавлен ключ настроек `site_header_name`; при пустом значении используется fallback на `site_name`.
В `views/layout.php` брендинг шапки переведён на отдельную переменную `$siteHeaderName`, не затрагивая title страниц и прочие места, где используется `site_name`.
v3.2.0
2026-02-22
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.1.0
2026-02-22
Добавлен 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.0.3
2026-02-22
В `views/profile.php` copy-handler для `.js-copy/.js-magnet` усилен: добавлены `preventDefault/stopPropagation` и fallback-копирование через `textarea + execCommand(copy)` без обязательного `prompt`.
v3.0.2
2026-02-22
В `views/layout.php` режим “соц-страницы без меню” ограничен только гостевым просмотром публичного профиля (`$guestPublicProfileSocialMode`).
v3.0.1
2026-02-22
В `views/profile.php` обновлён helper `copyText()` для кнопок `.js-copy`: успешное копирование подтверждается диалогом, fallback остаётся только при ошибке clipboard API.
В `views/layout.php` добавлен режим публичной страницы профиля (`$publicProfilePageRoute`) с условным отключением sidebar/offcanvas и корректировкой mobile topbar-отступа.
v3.0.0
2026-02-22
В `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 для главной страницы.
v2.3.66
2026-02-22
В `views/profile.php` добавлены mobile-first стили и классы для списков друзей/страниц, медиасетки и composer-разметки комментариев без изменения бизнес-логики.
v2.3.65
2026-02-22
В `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.64
2026-02-22
В `views/profile.php` добавлены профильные UI-классы для карточек постов и комментариев без изменения текущей логики лайков/комментариев/прав доступа.
v2.3.63
2026-02-22
В `views/profile.php` расширен слой профильных стилей и добавлены счётчики/визуальные блоки без изменения бизнес-логики постов, комментариев и ролей.
v2.3.62
2026-02-22
Добавлен 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.61
2026-02-22
В `views/profile.php` блок `Медиа` переведен на единый источник данных (медиа из постов) для владельца и гостей; облачные файлы владельца больше не попадают туда автоматически.
v2.3.60
2026-02-22
В `views/layout.php` профильный dropdown переведен на `data-bs-display=\"static\"` и вынесен на отдельный класс `topbar-profile-menu`; в `views/partials/head.php` добавлены mobile-safe стили ширины/переполнения.
v2.3.59
2026-02-22
В `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.58
2026-02-22
Логика `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.57
2026-02-22
Сравнение показало, что `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.56
2026-02-22
В `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.55
2026-02-22
В `views/chat.php` реализован `composer portal` (spacer + перенос `.chat-composer-shell` в `body` при mobile keyboard mode) вместо прежней fixed/sticky-компенсации внутри карточки чата.
v2.3.54
2026-02-22
В `views/chat.php` добавлен режим `chat-composer-vv-mode`: при активной клавиатуре снимаются `overflow:hidden` и `backdrop-filter` у `chat-conv-card/chat-conv-body`, чтобы Safari не привязывал/не обрезал `position: fixed` composer внутри карточки.
v2.3.53
2026-02-22
В `views/chat.php` удалён `chat-sticky` у обёртки формы сообщений, чтобы исключить конфликт sticky/fixed логики в mobile fullscreen.
v2.3.52
2026-02-22
В `views/chat.php` добавлен режим `chat-composer-vv-fixed` + JS-синхронизация с `visualViewport` (адаптивно: `bottom=0` или компенсация `keyboardInset`, если fixed элемент уходит под клавиатуру).
v2.3.51
2026-02-22
Из `views/chat.php` удалена разметка `div.chat-attach-row`; JS обработчики вложений уже безопасно работают при отсутствии `attachHint/attachClearBtn`.
v2.3.50
2026-02-22
Добавлены 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.49
2026-02-22
В `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.48
2026-02-22
В `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.47
2026-02-22
Из `views/chat.php` удалён временный JS-компенсатор `tightenComposerToViewportBottom()` и связанный runtime-костыль `--chat-mobile-composer-gap`, оставлена более простая `visualViewport`-синхронизация.
Добавлены финальные CSS-overrides для canvas-режима чата (`chat-canvas-stage`) без возврата к старой layout-обвязке `container py-4`.
v2.3.46
2026-02-22
В `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.45
2026-02-22
В `views/chat.php` удалено правило `#chatConvPane #attachHint { min-height ... }`, а сам элемент оставлен без `id`, чтобы исключить его вклад в высоту composer.
v2.3.44
2026-02-22
В `views/chat.php` элемент `#attachHint` оставлен без CSS-классов, чтобы исключить влияние типографики/line-height на высоту composer.
v2.3.43
2026-02-22
В `views/chat.php` блок под composer (с `attachHint` и `attachClearBtn`) упрощён до обычного контейнера без `d-flex/.../mt-2`.
v2.3.42
2026-02-22
Из `views/chat.php` удалён блок `chat-emoji-panel` внутри composer; JS-клик по `emojiBtn` переведён на fallback `toggleFullEmojiPicker()` при отсутствии inline-панели.
v2.3.41
2026-02-22
В `views/chat.php` добавлена реальная компенсация нижнего зазора по измерению положения composer относительно viewport (а не только по `visualViewport.height`).
Учтён iOS-кейс, когда `visualViewport` и `window.innerHeight` расходятся на высоту assistant/suggestions панели клавиатуры.
v2.3.40
2026-02-22
В `views/chat.php` снят конфликтующий `min-height`/жёсткая высота на mobile fullscreen-цепочке контейнеров (`chat-conv-body` → `#chatMessages` → scroll-wrap → `#chatMessagesScroll`).
Горячий фикс рассчитан на iOS/Safari/PWA сценарии, где клавиатура уменьшает viewport и ломает flex-layout с `min-height`.
v2.3.39
2026-02-22
В `views/chat.php` добавлен динамический CSS var `--chat-mobile-composer-gap` и логика `visualViewport`-детекта открытой клавиатуры.
При открытой клавиатуре fullscreen-pane чата растягивается до видимого нижнего края без лишнего white-gap из-за `visualViewport.offsetTop`.
v2.3.38
2026-02-22
В `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.37
2026-02-22
В `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.36
2026-02-22
Добавлен 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.35
2026-02-22
Спец-регистрация расширена настройками `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.34
2026-02-22
В `app/friend_registration.php` сигнатуры helper-функций обновлены с implicit nullable (`array $cfg = null`) на явный nullable тип (`?array $cfg = null`).
v2.3.33
2026-02-22
Добавлен модуль `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.32
2026-02-22
В `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.31
2026-02-22
Добавлены 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.30
2026-02-22
Добавлен маршрут `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.29
2026-02-22
Выполнена массовая зачистка mojibake-строковых литералов в `index.php` (восстановлена нормальная кириллица в flash/title сообщениях).
Усилен `scripts/check-encoding.ps1`: проверка mojibake теперь использует кодовые точки (`U+00C2/U+00C3/U+00D0/U+00D1`), а не хрупкий текстовый regex.
README обновлён: примеры маркеров кракозябр переведены в формат `U+` кодов, чтобы чекер не ловил демонстрационные символы.
v2.3.28
2026-02-22
В `index.php` заменены оставшиеся mojibake-строки flash-сообщения `Настройки уведомлений сохранены.` в обработчиках профиля и центра уведомлений.
v2.3.27
2026-02-22
Добавлены маршрут `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.26
2026-02-22
Маршрут notifications получил обработку POST (сохранение notify_desktop/notify_sound) и скорректирован порядок mark_seen/counts.
Во views/chat.php добавлена VisualViewport-синхронизация mobile full-screen окна чата и очищен двойной safe-area padding снизу.
v2.3.25
2026-02-22
Для desktop conversation pane добавлена жёсткая высота по viewport (CSS + JS syncDesktopMessengerViewport), чтобы контент не растягивал страницу.
chatMessages переведён в гарантированно внутренний scroll-container; composer остаётся fixed/overlay внутри card.
Сохранена lazy-history логика (+10) и polling новых сообщений без изменения API звонков/чатов.
v2.3.24
2026-02-22
Добавлен 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.23
2026-02-22
Добавлена устойчивая инициализация 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.22
2026-02-22
Во views/chat.php обновлены layout/styling для desktop и mobile (split-pane, sticky composer, адаптивная шапка, улучшенные bubbles).