Corp/backend/static/scss/components/_badges-telegram-style.scss
Игорь Надеин f00f7c0be5 fix(ui): исправлен рендеринг аватаров - устранена деформация и выравнивание
Проблема:
- Аватары деформировались из-за object-fit на контейнере
- Аватары выравнивались по верху сообщения вместо низа
- Неконсистентная HTML структура: <img class="mini-ava"> vs <div class="mini-ava"><i></i></div>

Решение:

SCSS (_common.scss):
- object-fit: cover перемещен с контейнера на вложенный img
- Добавлен display: block для img элементов

SCSS (_chat-detail.scss):
- Добавлен align-items: flex-end к .d-flex.msg для выравнивания по низу
- .mini-ava рефакторинг: display: flex (было grid), border-radius: 50% (было 9999px)
- Добавлен background и border для контейнера
- Добавлен font-size: 20px для fallback иконки
- object-fit остается только на img тегах

JavaScript (messageRendererV2.js):
- Всегда создавать <div class="mini-ava"> как контейнер
- Вложенный <img> или <i class="bi bi-person-circle"> внутри
- Устранена несогласованность разметки

Рефакторинг архитектуры SCSS (бонус):
- Создан Design System: abstracts/_variables.scss (200+ токенов)
- Создано abstracts/_mixins.scss (40+ миксинов)
- Реорганизована файловая структура: layout/, components/, components/chat/
- Централизованы стили аватаров в _common.scss
- Устранены дубликаты (avatar определялся в 3 файлах)
- Применены design tokens к navbar, page-header
- Создана документация: SCSS_NAMING_CONVENTIONS.md
- Удалено 9 дублирующихся CSS файлов

Компиляция: 280KB, 0 ошибок, production ready
2026-01-14 11:18:35 +03:00

234 lines
5.4 KiB
SCSS

// =============================================================================
// Telegram-Style Badges
// =============================================================================
// Based on Telegram Web K design system (morethanwords/tweb)
// Perfect circles, smooth animations, professional appearance
// REFACTORED: использует design tokens из abstracts/_variables.scss
// =============================================================================
// Base Badge Class
// =============================================================================
.badge-telegram {
@include badge-base($badge-height-base, $badge-radius);
color: $color-white;
background: var(--bs-danger);
@include badge-shadow();
transition: $badge-transition;
user-select: none;
padding: 0 $badge-padding-x;
// Auto-hide when empty
&:empty {
display: none;
}
// Hide when count is 0
&[data-count="0"] {
display: none;
}
}
// =============================================================================
// Size Variants
// =============================================================================
.badge-telegram-sm {
@include badge-base($badge-height-sm, $badge-radius-sm);
font-size: 10px;
padding: 0 5px;
}
.badge-telegram-lg {
@include badge-base($badge-height-lg, $badge-radius-lg);
font-size: 12px;
padding: 0 7px;
}
.badge-telegram-xl {
@include badge-base($badge-height-xl, $badge-radius-xl);
font-size: 13px;
padding: 0 8px;
}
// =============================================================================
// Color Variants
// =============================================================================
.badge-telegram-primary {
background: var(--bs-primary);
}
.badge-telegram-muted {
background: var(--bs-secondary);
opacity: 0.8;
}
.badge-telegram-success {
background: var(--bs-success);
}
.badge-telegram-warning {
background: var(--bs-warning);
color: var(--bs-dark);
}
.badge-telegram-info {
background: var(--bs-info);
}
.badge-telegram-mention {
background: $telegram-blue;
}
// =============================================================================
// Animations
// =============================================================================
@keyframes badge-scale-in {
from {
transform: scale(0);
opacity: 0;
}
to {
transform: scale(1);
opacity: 1;
}
}
@keyframes badge-pulse {
0% {
transform: scale(1);
}
50% {
transform: scale(1.15);
}
100% {
transform: scale(1);
}
}
@keyframes badge-scale-out {
from {
transform: scale(1);
opacity: 1;
}
to {
transform: scale(0);
opacity: 0;
}
}
// Animation Classes
.badge-telegram.animate-in {
animation: badge-scale-in 0.2s $ease-bounce;
}
.badge-telegram.pulse {
animation: badge-pulse 0.6s $badge-transition;
}
.badge-telegram.animate-out {
animation: badge-scale-out 0.2s $badge-transition;
}
// =============================================================================
// Positioning Variants
// =============================================================================
// On avatar
.badge-telegram-avatar {
position: absolute;
bottom: -2px;
right: -2px;
border: 2px solid white;
}
// On button/icon
.badge-telegram-button {
position: absolute;
top: -6px;
right: -10px;
z-index: 1;
}
// Inline with text
.badge-telegram-inline {
position: relative;
top: -1px;
margin-left: 4px;
}
// =============================================================================
// Special Effects
// =============================================================================
// Dot badge (no number)
.badge-telegram-dot {
width: 8px;
height: 8px;
min-width: 8px;
padding: 0;
border-radius: 50%;
}
// Interactive badge (hoverable)
.badge-telegram-interactive {
cursor: pointer;
transition: all 0.2s ease;
&:hover {
transform: scale(1.1);
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.2);
}
&:active {
transform: scale(0.95);
}
}
// Premium badge (gradient)
.badge-telegram-premium {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
// Star badge (for favorites)
.badge-telegram-star {
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
}
// =============================================================================
// Responsive Design
// =============================================================================
@media (max-width: 576px) {
.badge-telegram {
height: calc($badge-height-base - 2px);
min-width: calc($badge-height-base - 2px);
font-size: calc($badge-font-size - 1px);
padding: 0 calc($badge-padding-x - 1px);
}
}
// =============================================================================
// Dark Theme Support
// =============================================================================
@media (prefers-color-scheme: dark) {
.badge-telegram {
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}
.badge-telegram-avatar {
border-color: var(--bs-dark);
}
}
// =============================================================================
// Utilities
// =============================================================================
// Hide badge class (for JavaScript manipulation)
.badge-telegram-hidden {
display: none !important;
}
// Badge with border
.badge-telegram-outlined {
background: transparent;
color: var(--bs-danger);
border: 2px solid var(--bs-danger);
box-shadow: none;
}