Corp/backend/static/js/bottom-navbar.js
Игорь Надеин 003bbab1ff Добавлена нижняя навигационная панель для мобильных устройств
- Добавлена bottom navbar с 5 кнопками (Главная, Уведомления, Поиск, Календарь, Ещё)
- Панель отображается только на мобильных устройствах (до 768px)
- Использованы системные CSS переменные и стили
- Удалена кнопка гамбургера из верхней панели (дублирование функционала)
- Добавлена синхронизация бейджей уведомлений
- Поддержка светлой и темной темы
- Backdrop-filter для полупрозрачности в iOS-стиле
2026-01-12 08:32:16 +03:00

82 lines
3.0 KiB
JavaScript

/**
* Bottom Navigation Bar
* Управление нижней панелью навигации для мобильных устройств
*/
document.addEventListener('DOMContentLoaded', function() {
// Кнопка уведомлений в нижней панели
const bottomNotificationToggle = document.getElementById('bottomNotificationToggle');
const notificationDropdown = document.getElementById('notificationDropdown');
const notificationBadge = document.getElementById('notificationBadge');
const bottomNotificationBadge = document.getElementById('bottomNotificationBadge');
// Синхронизация бейджей между верхней и нижней панелью
function syncNotificationBadges() {
if (notificationBadge && bottomNotificationBadge) {
const count = notificationBadge.textContent;
const hasNotifications = !notificationBadge.classList.contains('d-none');
bottomNotificationBadge.textContent = count;
if (hasNotifications) {
bottomNotificationBadge.classList.remove('d-none');
} else {
bottomNotificationBadge.classList.add('d-none');
}
}
}
// Наблюдатель за изменениями бейджа уведомлений
if (notificationBadge) {
const observer = new MutationObserver(syncNotificationBadges);
observer.observe(notificationBadge, {
attributes: true,
childList: true,
characterData: true,
subtree: true
});
// Первоначальная синхронизация
syncNotificationBadges();
}
// Открытие уведомлений из нижней панели
if (bottomNotificationToggle && notificationDropdown) {
bottomNotificationToggle.addEventListener('click', function(e) {
e.preventDefault();
e.stopPropagation();
const isVisible = notificationDropdown.style.display !== 'none';
if (isVisible) {
notificationDropdown.style.display = 'none';
} else {
notificationDropdown.style.display = 'block';
// Позиционируем над нижней панелью
notificationDropdown.style.bottom = '70px';
notificationDropdown.style.right = '10px';
notificationDropdown.style.top = 'auto';
notificationDropdown.style.left = 'auto';
}
});
}
// Кнопка поиска в нижней панели
const bottomSearchToggle = document.getElementById('bottomSearchToggle');
if (bottomSearchToggle) {
bottomSearchToggle.addEventListener('click', function(e) {
e.preventDefault();
// Перенаправляем на страницу поиска
window.location.href = '/search/';
});
}
// Закрытие выпадающих элементов при клике вне их
document.addEventListener('click', function(e) {
if (notificationDropdown &&
!notificationDropdown.contains(e.target) &&
!bottomNotificationToggle?.contains(e.target)) {
notificationDropdown.style.display = 'none';
}
});
});