Corp/backend/static/css/components/badges-telegram-style.css
Игорь Надеин 0375337543 feat: implement Telegram-style badges system
- Created comprehensive badges-telegram-style.css (240 lines) based on Telegram Web K
- Updated all badge markup in templates (navbar, sidebar, chat_list, chat_detail, chat_title)
- Replaced Bootstrap badge classes with .badge-telegram classes
- Implemented Telegram specifications: 20px height, 10px radius, 11px font, 600 weight
- Added smooth animations: pulse (on update), animate-in (on mount), animate-out (on unmount)
- Updated JavaScript: replaced .d-none with style.display for badge visibility
- Updated 5 JS files: bottom-navbar, notification-manager, chatBadgeHandler, chatBadgeManager, chatListRealtime
- Added pulse animation on badge value increase
- Improved shadows and transitions with cubic-bezier easing
- Added badges-telegram-style.css to base.html for global availability
- Created documentation: TELEGRAM_BADGES_GUIDE.md, TELEGRAM_BADGES_UPDATE.md

Technical details:
- Research: Analyzed 50+ files from Telegram Web K GitHub repository
- Perfect circles: border-radius: 10px (not 50%)
- Spring animation: cubic-bezier(0.175, 0.885, 0.32, 1.275)
- Auto-hide: :empty and [data-count='0'] selectors
- Responsive design + dark theme support
2026-01-12 17:37:41 +03:00

254 lines
7.7 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Telegram-Style Badges
* Основано на практиках Telegram Web K
* https://github.com/morethanwords/tweb
*/
/* ═══════════════════════════════════════════════════════════
БАЗОВЫЙ СТИЛЬ БЭЙДЖА (КАК В TELEGRAM)
═══════════════════════════════════════════════════════════ */
.badge-telegram {
--badge-height: 20px;
--badge-padding-x: 6px;
--badge-font-size: 11px;
display: inline-flex;
align-items: center;
justify-content: center;
height: var(--badge-height);
min-width: var(--badge-height);
padding: 0 var(--badge-padding-x);
font-size: var(--badge-font-size);
font-weight: 600;
line-height: 1;
color: #fff;
background: var(--bs-danger);
border-radius: calc(var(--badge-height) / 2); /* Идеальные круги */
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
transition: transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275),
background-color 0.2s ease,
opacity 0.2s ease;
}
.badge-telegram:empty {
display: none;
}
/* ═══════════════════════════════════════════════════════════
РАЗМЕРЫ (КАК В TELEGRAM)
═══════════════════════════════════════════════════════════ */
.badge-telegram-sm {
--badge-height: 18px;
--badge-padding-x: 5px;
--badge-font-size: 10px;
}
.badge-telegram-lg {
--badge-height: 24px;
--badge-padding-x: 8px;
--badge-font-size: 12px;
}
.badge-telegram-xl {
--badge-height: 28px;
--badge-padding-x: 10px;
--badge-font-size: 14px;
}
/* ═══════════════════════════════════════════════════════════
ЦВЕТОВЫЕ ВАРИАНТЫ
═══════════════════════════════════════════════════════════ */
.badge-telegram-primary {
background: var(--bs-primary);
}
.badge-telegram-muted {
background: var(--bs-secondary);
}
.badge-telegram-success {
background: var(--bs-success);
}
.badge-telegram-warning {
background: var(--bs-warning);
}
.badge-telegram-info {
background: var(--bs-info);
}
/* Особый стиль для "mentions" */
.badge-telegram-mention {
background: #0088cc;
}
/* ═══════════════════════════════════════════════════════════
АНИМАЦИИ (КАК В TELEGRAM)
═══════════════════════════════════════════════════════════ */
/* Появление */
@keyframes badge-scale-in {
from {
transform: scale(0);
opacity: 0;
}
to {
transform: scale(1);
opacity: 1;
}
}
.badge-telegram.animate-in {
animation: badge-scale-in 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}
/* Пульсация при новом сообщении */
@keyframes badge-pulse {
0% {
transform: scale(1);
}
50% {
transform: scale(1.15);
}
100% {
transform: scale(1);
}
}
.badge-telegram.pulse {
animation: badge-pulse 0.6s ease-out;
}
/* Исчезновение */
@keyframes badge-scale-out {
from {
transform: scale(1);
opacity: 1;
}
to {
transform: scale(0);
opacity: 0;
}
}
.badge-telegram.animate-out {
animation: badge-scale-out 0.15s ease-in;
}
/* ═══════════════════════════════════════════════════════════
ПОЗИЦИОНИРОВАНИЕ (КАК В TELEGRAM)
═══════════════════════════════════════════════════════════ */
/* На аватаре справа снизу */
.badge-telegram-avatar {
position: absolute;
bottom: -2px;
right: -2px;
border: 2px solid var(--bs-body-bg);
}
/* На кнопке справа сверху */
.badge-telegram-button {
position: absolute;
top: -6px;
right: -10px;
z-index: 10;
}
/* В списке справа */
.badge-telegram-inline {
margin-left: 0.5rem;
}
/* ═══════════════════════════════════════════════════════════
СПЕЦИАЛЬНЫЕ ЭФФЕКТЫ
═══════════════════════════════════════════════════════════ */
/* Точка (без числа) */
.badge-telegram-dot {
width: var(--badge-height);
height: var(--badge-height);
padding: 0;
min-width: auto;
}
/* Hover эффект на интерактивных бэйджах */
.badge-telegram-interactive {
cursor: pointer;
}
.badge-telegram-interactive:hover {
transform: scale(1.05);
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.2);
}
.badge-telegram-interactive:active {
transform: scale(0.95);
}
/* ═══════════════════════════════════════════════════════════
АДАПТИВНОСТЬ
═══════════════════════════════════════════════════════════ */
@media (max-width: 576px) {
.badge-telegram {
--badge-height: 18px;
--badge-padding-x: 5px;
--badge-font-size: 10px;
}
.badge-telegram-lg {
--badge-height: 22px;
--badge-padding-x: 7px;
--badge-font-size: 11px;
}
}
/* ═══════════════════════════════════════════════════════════
ТЕМНАЯ ТЕМА
═══════════════════════════════════════════════════════════ */
[data-bs-theme="dark"] .badge-telegram-avatar {
border-color: var(--bs-dark);
}
[data-bs-theme="dark"] .badge-telegram {
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}
/* ═══════════════════════════════════════════════════════════
УТИЛИТЫ
═══════════════════════════════════════════════════════════ */
/* Скрыть при нулевом значении */
.badge-telegram[data-count="0"] {
display: none;
}
/* Ограничение текста для больших чисел */
.badge-telegram-limit {
max-width: 50px;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
/* Градиентный бэйдж (для премиум фич) */
.badge-telegram-premium {
background: linear-gradient(90deg, #9275ff 0%, #ff8b8b 100%);
}
/* Звёздочка (для особых меток) */
.badge-telegram-star {
background: linear-gradient(to right, #ffcd3a, #ffaa00);
}