Подвал, логотип Karsim & Szerszen, страница истории изменений, сохранение светлой темы.
Подвал и бренд
- Логотип brand/logo.png в шапке; в подвале — кликабельный лого и строка копирайта из настроек (без дублирования названия).
- Подвал: страницы, язык, соцсети; внизу только v0.02 со ссылкой на /changelog.
- В админке внизу: версия, дата/время МСК и краткая заметка о релизе.
- В тёмной теме цветной PNG не инвертируется (.karsim-logo).
Тема оформления
- Исправлено: тема не сбрасывается при переходе между страницами.
- Единый глобальный state (createGlobalState), cookie colorMode — без localStorage VueUse.
- useHead с темой только на SSR; после каждого route — syncTheme из cookie.
- Удалён конфликтующий localStorage vueuse-color-scheme при загрузке.
Исправления
- Убран плагин scope-override: ошибка 500 «Cannot redefine property: $scope» при переходе из админки в черновик поста.
- hasScope по-прежнему из Orbita через alias в nuxt.config.
Страница /changelog
- Публичная страница читает frontend/brand/changelog.json.
- Полная история версий с датами, описаниями и списками изменений.
- i18n: pages.changelog.title и subtitle (ru, en, de).
Первый отслеживаемый деплой: бренд Karsim, загрузка фото, права комментариев, инфраструктура деплоя.
Брендинг и внешний вид
- Единый стиль Karsim: токены цветов, типографика, UI-компоненты.
- Тёмная тема по умолчанию на Orbita, тёплая светлая палитра.
- Общие ресурсы в frontend/brand/ — используются и Orbita, и Owncast.
- Owncast (live.karsim.su): свои custom CSS и JS в админке — шапка, соцсети, оформление страницы эфира.
- Блок социальных ссылок на /live и в виджете автора.
- Ссылка YouTube ведёт на @szerzen.
Загрузка файлов в постах
- Исправлена ошибка загрузки фото: убран двойной путь /api//api/ при возобновлении tus-аплоада.
- Backend отдаёт относительный Location в ответах загрузки.
- Frontend нормализует tus-URL и чистит сломанные fingerprints в localStorage.
- Скрипт fix-upload-permissions.sh для прав на каталог upload/.
Комментарии и роли
- Расширены scope ролей в БД (Administrator, Moderator, User) через SeedUserRoles.
- Админам и модераторам разрешено комментировать без отдельного scope comments/put (по scope comments/roles).
- Pinia-store auth унифицирован, scope из API нормализуется (массив / JSON-строка).
- В тексте кнопок и проверках вместо $scope используется hasScope (один и тот же источник правды).
- Backend Comments.php учитывает админский scope.
- Скрипты audit-user-roles.sh и fix-user-roles.sh для проверки и починки ролей на VPS.
Авторизация
- Модуль orbita-auth: Secure-cookie для HTTPS karsim.su.
- SSR ходит во внутренний API через API_SSR_URL (без выхода наружу).
- Переопределены useAuth, hasScope, getApiUrl поверх @vesp/frontend.
Деплой и инфраструктура
- Скрипты sync-to-vps.sh, rebuild-frontend.sh, deploy-vps.sh.
- Вспомогательные fix-upload-permissions.sh, fix-user-roles.sh, audit-user-roles.sh.
- Конфиги nginx для karsim.su и live.karsim.su.
- Документация стека Orbita + Owncast: docs/stack-orbita-owncast.md.
Админка
- Версия деплоя внизу /admin: номер, дата/время МСК, краткая заметка.
- Источник: frontend/brand/deploy-version.json.
- Перед каждым деплоем версия растёт на 0.01.