Files
SHiNE-server/shine-UI/styles/components/avatar.css
T
qandClaude Opus 5.5 f8900e531a UI: новый общий стиль, тёмная/светлая тема, настраиваемая палитра
- styles/main.css: роли цветов (по умолчанию «Индиго»), шкала отступов/скруглений/шрифтов,
  цвета отношений для обеих тем; жёсткие цвета в стилях заменены на роли.
- Палитра: пресеты и личные правки, «Оформление» Авто/День/Ночь, долгое нажатие —
  редактор цветов с экспортом/импортом.
- Каналы: пузыри постов автора, плашки дней, строка «Написать в канал…», «О канале»,
  создание канала с адресом из названия; лента открывается на свежих постах.
- Чаты: плоский список, чипы-фильтры, пузыри, плашки дней; нижняя панель скрыта в переписке.
- Корневые разделы — единая шапка; профиль и чужой профиль — общая карточка;
  настройки, кошелёк, сеансы — меню-списки.
- Нижняя панель: иконки без подписей, бейджи на иконках.
- confirmDialog вместо window.confirm/alert; на телефоне диалоги — шторки снизу.
- docs/UI-Design/ISSUES-for-dev.md — найденные ошибки сервера/UI.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26 10:05:26 +03:00

294 lines
6.1 KiB
CSS

/* Shared avatar component styles. */
.avatar-preview-circle {
width: 124px;
height: 124px;
margin: 0 auto;
border-radius: 50%;
overflow: hidden;
border: 1px solid var(--border-control);
background: var(--surface);
}
.avatar-preview-circle img {
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
display: block;
}
.avatar-wizard-preview {
width: 140px;
height: 140px;
}
.avatar-wizard-meta {
font-size: 13px;
line-height: 1.35;
color: var(--text-secondary);
word-break: break-word;
}
.avatar-wizard-error {
min-height: 18px;
font-size: 13px;
color: var(--danger);
}
.avatar-wizard-actions {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
}
.avatar-wizard-choice-grid {
display: grid;
gap: 10px;
}
.avatar {
width: 40px;
height: 40px;
min-width: 40px;
min-height: 40px;
flex: 0 0 auto;
aspect-ratio: 1 / 1;
border-radius: 50%;
background: var(--surface-selected);
display: grid;
place-items: center;
font-weight: 600;
color: var(--accent);
font-size: 14px;
}
.avatar.avatar-xs,
.avatar.xs {
width: 20px;
height: 20px;
min-width: 20px;
min-height: 20px;
font-size: 9px;
}
.avatar.avatar-sm,
.avatar.small {
width: 28px;
height: 28px;
min-width: 28px;
min-height: 28px;
font-size: 10px;
}
.avatar.avatar-md,
.avatar.medium {
width: 40px;
height: 40px;
min-width: 40px;
min-height: 40px;
font-size: 14px;
}
.avatar.avatar-lg,
.avatar.big {
width: 56px;
height: 56px;
min-width: 56px;
min-height: 56px;
font-size: 18px;
}
.avatar.avatar-xl,
.avatar.large,
.avatar.xlarge {
width: 96px;
height: 96px;
min-width: 96px;
min-height: 96px;
font-size: 26px;
}
.avatar-image {
position: relative;
overflow: hidden;
display: grid;
place-items: center;
}
.avatar-image > .avatar-fallback,
.avatar-image > img {
grid-area: 1 / 1;
}
.avatar-fallback {
width: 100%;
height: 100%;
display: grid;
place-items: center;
opacity: 1;
transition: opacity 120ms ease;
}
.avatar-image img {
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
border-radius: 50%;
display: block;
opacity: 0;
transition: opacity 120ms ease;
}
.avatar-image.has-image img {
opacity: 1;
}
.avatar-image.has-image .avatar-fallback {
opacity: 0;
visibility: hidden;
}
.avatar img {
width: 100%;
height: 100%;
display: block;
object-fit: cover;
}
/* ===== Единый шаблон аватаров (2026-08-22) =====
* Базовая аватарка повторяет принцип орбов экрана «Связи»:
* - fallback: нейтральный серый круг + белые инициалы;
* - фото занимает тот же внутренний круг;
* - стеклянный внешний круг остаётся поверх всегда, независимо от наличия фото;
* - усиленное свечение включается модификатором .avatar-glow, не меняя геометрию аватара.
*/
.avatar.avatar-image.avatar-framed {
position: relative;
overflow: visible;
isolation: isolate;
display: grid;
place-items: center;
border: 0;
background: transparent;
color: var(--text-primary);
box-shadow: none;
}
.avatar.avatar-image.avatar-framed > .avatar-fallback,
.avatar.avatar-image.avatar-framed > .avatar-photo {
grid-area: 1 / 1;
place-self: center;
width: 92.5%;
height: 92.5%;
border-radius: 50%;
z-index: 1;
}
.avatar.avatar-image.avatar-framed > .avatar-fallback {
display: grid;
place-items: center;
overflow: hidden;
background: var(--surface-selected);
color: var(--accent);
}
.avatar.avatar-image.avatar-framed > .avatar-photo {
display: block;
object-fit: cover;
object-position: center;
opacity: 0;
transition: opacity 120ms ease;
}
.avatar.avatar-image.avatar-framed.has-image > .avatar-photo {
opacity: 1;
}
.avatar.avatar-image.avatar-framed.has-image > .avatar-fallback {
opacity: 0;
visibility: hidden;
}
/* Второй круг — тот же стеклянный overlay, который используется в «Связях». */
.avatar.avatar-image.avatar-framed::after {
content: "";
position: absolute;
inset: 50% auto auto 50%;
width: 119%;
height: 119%;
transform: translate(-50%, -50%);
border: 0;
border-radius: 0;
background: url("../assets/glass_overlay_faithful.png") center / contain no-repeat;
box-shadow: none;
opacity: 1;
pointer-events: none;
z-index: 3;
}
/* Опциональный усиленный ореол для состояний «сияющий» и будущих экранов. */
.avatar.avatar-image.avatar-framed.avatar-glow::before {
content: "";
position: absolute;
inset: -16%;
border-radius: 50%;
background: radial-gradient(circle, rgba(139, 232, 255, 0.36) 0%, rgba(116, 217, 255, 0.14) 48%, rgba(116, 217, 255, 0) 74%);
filter: blur(3px);
pointer-events: none;
z-index: -1;
}
/* Единый знак официального пользователя. Левый и нижний края зафиксированы,
а сам знак растёт вправо и вверх вместе с аватаром. */
.avatar.avatar-image.avatar-framed > .avatar-official-badge {
position: absolute;
left: -2%;
bottom: -1%;
width: 32%;
height: 32%;
min-width: 18px;
min-height: 18px;
object-fit: contain;
object-position: center;
display: block;
opacity: 1;
border-radius: 0;
pointer-events: none;
z-index: 4;
filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.42));
}
/* Спокойный вариант для текстовых лент; фото остаётся без фильтров. */
.avatar.avatar-image.avatar-plain { overflow: hidden; background: var(--surface-selected); color: var(--accent); }
.avatar.avatar-image.avatar-plain::after { content: none; }
.avatar.avatar-image.avatar-plain > .avatar-fallback,
.avatar.avatar-image.avatar-plain > .avatar-photo { width: 100%; height: 100%; box-shadow: none; text-shadow: none; }
.avatar.avatar-image.avatar-plain > .avatar-fallback { background: var(--surface-selected); color: var(--accent); }