Игорь Надеин aba011731f 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

247 lines
7.0 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.

/**
* navbar.css
* Стили навбара: меню-тогглер, поиск, уведомления
*/
/* Navbar overflow visible для dropdown */
.app-navbar {
overflow: visible !important;
}
.app-navbar .container-fluid {
overflow: visible !important;
}
/* ─────────────────────────────────────────────────────────────
MOBILE NAVBAR HEIGHT
────────────────────────────────────────────────────────────── */
/* Увеличенная высота navbar для мобильных устройств */
@media (max-width: 767.98px) {
.app-navbar {
min-height: 90px;
}
.app-navbar .container-fluid {
min-height: 64px;
padding-top: 0.75rem;
padding-bottom: 0.75rem;
}
}
/* ─────────────────────────────────────────────────────────────
MENU TOGGLE (гамбургер)
────────────────────────────────────────────────────────────── */
/* Кнопка «гамбургера» — без круга/рамки */
.menu-toggle {
padding: 0;
border: 0;
background: transparent;
line-height: 1;
color: #fff;
}
.menu-toggle:focus {
outline: none;
box-shadow: none;
}
/* ─────────────────────────────────────────────────────────────
DROPDOWN AVATAR
────────────────────────────────────────────────────────────── */
/* Спрятать стрелочку у dropdown-аватара */
.dropdown-toggle.no-caret::after {
display: none !important;
}
/* ─────────────────────────────────────────────────────────────
MOBILE SEARCH OVERLAY
────────────────────────────────────────────────────────────── */
.mobile-search-overlay {
position: fixed;
top: var(--navbar-h);
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.5);
z-index: 1030;
opacity: 0;
pointer-events: none;
transition: opacity 0.3s ease;
}
.mobile-search-overlay.active {
opacity: 1;
pointer-events: auto;
}
/* Светлая тема - забеливание */
[data-bs-theme="light"] .mobile-search-overlay {
background-color: rgba(255, 255, 255, 0.85);
}
/* Темная тема - затемнение */
[data-bs-theme="dark"] .mobile-search-overlay {
background-color: rgba(0, 0, 0, 0.7);
}
/* ─────────────────────────────────────────────────────────────
BOTTOM NAVBAR (только для мобильных)
────────────────────────────────────────────────────────────── */
.bottom-navbar {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background-color: var(--bs-primary);
border-top: 0.5px solid var(--bs-border-color);
z-index: 1040;
padding: 0;
box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.08);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
}
/* Темная тема */
[data-bs-theme="dark"] .bottom-navbar {
background-color: var(--bs-tertiary-bg);
border-top-color: var(--bs-border-color);
box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.3);
}
.bottom-navbar-container {
display: flex;
justify-content: space-around;
align-items: center;
height: 60px;
padding: 0 8px;
max-width: 100%;
}
.bottom-nav-item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
flex: 1;
height: 100%;
color: rgba(255, 255, 255, 0.7);
text-decoration: none;
border: none;
background: transparent;
padding: 4px 8px;
transition: all 0.2s ease;
position: relative;
cursor: pointer;
}
/* Темная тема - другой цвет кнопок */
[data-bs-theme="dark"] .bottom-nav-item {
color: var(--bs-secondary-color);
}
.bottom-nav-item:hover,
.bottom-nav-item:focus,
.bottom-nav-item:active {
color: #fff;
background: rgba(255, 255, 255, 0.1);
outline: none;
}
[data-bs-theme="dark"] .bottom-nav-item:hover,
[data-bs-theme="dark"] .bottom-nav-item:focus,
[data-bs-theme="dark"] .bottom-nav-item:active {
color: var(--bs-emphasis-color);
background: var(--bs-secondary-bg);
}
.bottom-nav-item i {
font-size: 1.4rem;
margin-bottom: 2px;
line-height: 1;
}
.bottom-nav-label {
font-size: 0.65rem;
font-weight: 500;
text-align: center;
line-height: 1;
margin-top: 2px;
}
/* Иконка с бейджем для уведомлений */
.bottom-nav-icon-wrapper {
position: relative;
display: inline-block;
}
.bottom-nav-badge {
position: absolute;
top: -6px;
right: -10px;
background: var(--bs-danger);
color: #fff;
border-radius: 10px; /* Telegram использует фиксированный radius для круглых бэйджей */
padding: 0 6px;
font-size: 11px;
font-weight: 600;
min-width: 20px;
height: 20px;
display: inline-flex;
align-items: center;
justify-content: center;
text-align: center;
line-height: 1;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); /* Более заметная тень */
transition: transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275),
background-color 0.2s ease;
z-index: 10;
}
/* Мигание при новом сообщении */
.bottom-nav-badge.pulse {
animation: badge-pulse 0.6s ease-out;
}
@keyframes badge-pulse {
0% {
transform: scale(1);
}
50% {
transform: scale(1.15);
}
100% {
transform: scale(1);
}
}
/* Серый для замьюченных чатов */
.bottom-nav-badge.badge-muted {
background: var(--bs-secondary);
}
.bottom-nav-badge:empty {
display: none;
}
/* Padding для body, чтобы контент не перекрывался нижней панелью */
@media (max-width: 767.98px) {
body {
padding-bottom: 60px;
}
/* Скрыть bottom navbar на странице чата - композер заменяет навигацию */
.chat-container ~ .bottom-navbar,
.chat-page ~ .bottom-navbar,
body:has(.chat-container) .bottom-navbar,
body:has(.chat-page) .bottom-navbar {
display: none;
}
/* Убрать padding, когда navbar скрыт */
body:has(.chat-container),
body:has(.chat-page) {
padding-bottom: 0;
}
}