feat(web): профиль с аватаром, панель в углу, настройки сервера, скрытые ID

Правки пользователя:

- в «Профиль → Основной» сверху квадратный аватар слева, справа от него
  настройки имени, «О себе», состояния и эмодзи во всю высоту; смена аватара —
  клик по нему, форматы (JPEG, PNG, WebP, GIF до 8 МБ) — в подсказке;
- убраны дубли: часовой пояс только в «Язык и регион», статус — только в
  мини-профиле панели;
- панель пользователя переехала в нижний левый угол под сайдбар, подсказка о
  выходе из сервера — на её прежнее место; панель ужата под 240 px;
- шестерёнка сервера открывает новый пункт настроек «Сервер» (список серверов,
  общее, участники, роли, опасная зона), а «Профиль → Сервер» оставлен только
  для ника и «Применить ко всем серверам»;
- окно настроек получило статический размер 70% рабочей области со скроллом;
- ID пользователей скрыты везде, кроме раздела «Инстанс» у администратора;
- список друзей свёрнут под кнопкой «Друзья (N)» и раскрывается снизу вверх;
- 249 тестов Vitest (было 239), check/lint/test/build зелёные.
This commit is contained in:
2026-09-20 11:24:09 +03:00
parent bd5f09336b
commit 4c8f888b3e
27 changed files with 1071 additions and 419 deletions
+48
View File
@@ -322,6 +322,54 @@ body {
animation: gl-shimmer 1.4s linear infinite;
}
/*
* Список друзей раскрывается снизу вверх: высота контейнера растёт от нуля
* (grid 0fr → 1fr), а содержимое въезжает снизу. Свёрнутый список не занимает
* места и не доступен скринридеру (`aria-hidden` ставит компонент).
*/
@keyframes gl-reveal-up {
from {
opacity: 0;
transform: translateY(8px);
}
to {
opacity: 1;
transform: none;
}
}
.gl-reveal-up {
display: grid;
grid-template-rows: 0fr;
transition: grid-template-rows var(--duration-base) var(--ease-out);
}
.gl-reveal-up > * {
min-height: 0;
overflow: hidden;
}
.gl-reveal-up[data-state='open'] {
grid-template-rows: 1fr;
}
.gl-reveal-up[data-state='open'] > * {
animation: gl-reveal-up var(--duration-base) var(--ease-out) backwards;
}
/* Стрелка-раскрывашка: развёрнутое состояние поворачивает её вниз. */
.gl-caret {
display: inline-block;
transform: rotate(-90deg);
transition: transform var(--duration-fast) var(--ease-out);
}
.gl-caret-open {
display: inline-block;
transform: rotate(0deg);
transition: transform var(--duration-fast) var(--ease-out);
}
/*
* Доступность: при `prefers-reduced-motion: reduce` анимации становятся
* мгновенными. Задержки каскада тоже обнуляем — иначе элементы списка