From 85becacea5d1fe8cf331fcf8b371b18ac221ac5b Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Thu, 2 Jul 2026 17:55:33 +0300 Subject: [PATCH] Enhance root layout and admin interface for better usability - Updated the root layout to include a mobile menu toggle, improving navigation on smaller screens. - Refactored navigation links and language/theme selection for better organization and accessibility. - Added overflow handling for admin navigation and tables to ensure proper display on smaller screens. - Improved translations for menu toggle accessibility in both Russian and English. --- frontend/src/routes/__root.tsx | 145 +++++++++++++++++----------- frontend/src/routes/admin.tsx | 4 +- frontend/src/routes/admin/audit.tsx | 2 + frontend/src/routes/admin/roles.tsx | 2 + frontend/src/routes/admin/users.tsx | 2 + frontend/src/shared/lib/i18n.ts | 2 + frontend/src/shared/ui/dialog.tsx | 2 +- 7 files changed, 101 insertions(+), 58 deletions(-) diff --git a/frontend/src/routes/__root.tsx b/frontend/src/routes/__root.tsx index bee8109..036517c 100644 --- a/frontend/src/routes/__root.tsx +++ b/frontend/src/routes/__root.tsx @@ -1,6 +1,7 @@ -import { useEffect } from 'react' -import { Link, Outlet, createRootRoute } from '@tanstack/react-router' +import { useEffect, useState } from 'react' +import { Link, Outlet, createRootRoute, useRouterState } from '@tanstack/react-router' import { useTranslation } from 'react-i18next' +import { Menu, X } from 'lucide-react' import { useTheme, type Theme } from '@/theme/ThemeProvider' import { setLanguage } from '@/shared/lib/i18n' import { Toaster } from '@/shared/ui/toaster' @@ -15,11 +16,18 @@ function RootLayout() { const { t, i18n } = useTranslation() const { theme, setTheme } = useTheme() const { user, isBootstrapping } = useAuthStore() + const [mobileMenuOpen, setMobileMenuOpen] = useState(false) + const pathname = useRouterState({ select: (s) => s.location.pathname }) useEffect(() => { void bootstrapSession() }, []) + // Закрываем мобильное меню при переходе на другую страницу. + useEffect(() => { + setMobileMenuOpen(false) + }, [pathname]) + const themes: Theme[] = ['light', 'dark', 'system'] const langs = ['ru', 'en'] @@ -31,61 +39,88 @@ function RootLayout() { } } + const navLinks = !isBootstrapping && user && ( + <> + + {t('nav.dashboard')} + + + {t('nav.instructions')} + + + {t('nav.settings')} + + {user.role === 'admin' && ( + + {t('nav.admin')} + + )} + + + ) + + const selects = ( + <> + + + + ) + return (
-
- - {t('appName')} - - +
+
+ + {t('appName')} + + + + + +
+ + {mobileMenuOpen && ( + + )}
diff --git a/frontend/src/routes/admin.tsx b/frontend/src/routes/admin.tsx index 7e882bd..68ef3f6 100644 --- a/frontend/src/routes/admin.tsx +++ b/frontend/src/routes/admin.tsx @@ -24,13 +24,13 @@ function AdminLayout() { return (

{t('nav.admin')}

-