UNPKG

create-ex-den-kit

Version:

Create exam projects with Ex-Den-Kit

133 lines (118 loc) 4.45 kB
import React from 'react'; import { Outlet, Link, useNavigate, useLocation } from 'react-router-dom'; import { motion } from 'framer-motion'; import { useAuth } from '../contexts/AuthContext'; import { useTheme } from '../contexts/ThemeContext'; import { Home, PlusCircle, Archive, LogOut, Palette, User } from 'lucide-react'; const Layout = () => { const { user, logout } = useAuth(); const { config } = useTheme(); const navigate = useNavigate(); const location = useLocation(); const handleLogout = () => { logout(); navigate('/login'); }; const navItems = [ { path: '/dashboard', label: 'Мои записи', icon: Home }, { path: '/create', label: 'Создать запись', icon: PlusCircle }, ]; if (config.features.archive) { navItems.push({ path: '/archive', label: 'Архив', icon: Archive }); } return ( <div className="min-h-screen bg-gray-50"> {/* Header */} <motion.header initial={{ y: -100 }} animate={{ y: 0 }} className="bg-white shadow-lg border-b border-gray-200" > <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div className="flex justify-between items-center h-16"> <div className="flex items-center space-x-4"> <span className="text-2xl">{config.icon}</span> <h1 className="text-xl font-bold text-gray-900">{config.name}</h1> </div> <nav className="hidden md:flex space-x-8"> {navItems.map((item) => { const Icon = item.icon; const isActive = location.pathname === item.path; return ( <Link key={item.path} to={item.path} className={`flex items-center space-x-2 px-3 py-2 rounded-md text-sm font-medium transition-all duration-200 ${isActive ? 'text-primary bg-primary/10' : 'text-gray-700 hover:text-primary hover:bg-gray-100' }`} > <Icon size={18} /> <span>{item.label}</span> </Link> ); })} </nav> <div className="flex items-center space-x-4"> <Link to="/theme" className="p-2 rounded-lg hover:bg-gray-100 transition-colors" title="Сменить тему" > <Palette size={20} className="text-gray-600" /> </Link> <div className="flex items-center space-x-3"> <div className="flex items-center space-x-2"> <User size={18} className="text-gray-600" /> <span className="text-sm font-medium text-gray-700"> {user?.fullName} </span> </div> <button onClick={handleLogout} className="flex items-center space-x-1 px-3 py-2 text-sm text-red-600 hover:bg-red-50 rounded-md transition-colors" > <LogOut size={18} /> <span>Выход</span> </button> </div> </div> </div> </div> </motion.header> {/* Mobile Navigation */} <div className="md:hidden fixed bottom-0 left-0 right-0 bg-white border-t border-gray-200 z-50"> <div className="flex justify-around items-center h-16"> {navItems.map((item) => { const Icon = item.icon; const isActive = location.pathname === item.path; return ( <Link key={item.path} to={item.path} className={`flex flex-col items-center justify-center flex-1 h-full ${isActive ? 'text-primary' : 'text-gray-600'}`} > <Icon size={24} /> <span className="text-xs mt-1">{item.label}</span> </Link> ); })} </div> </div> {/* Main Content */} <main className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8 pb-20 md:pb-8"> <Outlet /> </main> </div> ); }; export default Layout;