"use client"; import { useState, useRef, useEffect } from "react"; import { motion, AnimatePresence } from "framer-motion"; import Link from "next/link"; import { usePathname } from "next/navigation"; import { useApp } from "@/lib/app-context"; import { useAuth } from "@/lib/auth-context"; import { ProfileModal } from "@/components/profile-modal"; import { ProjectSwitcher } from "./project-switcher"; import { slideUp } from "@/components/ui/motion-presets"; const NAV_ITEMS = [ { href: "/", label: "工作台", phase: "Phase 0", icon: ( ), }, { href: "/docs", label: "文档", phase: "Phase 1", icon: ( ), }, { href: "/gallery", label: "资源库", phase: "Phase 0", icon: ( ), }, { href: "/styles", label: "风格库", phase: "Phase 1", icon: ( ), }, { href: "/characters", label: "角色库", phase: "Phase 1", icon: ( ), }, { href: "/training", label: "训练中心", phase: "Phase 2", icon: ( ), }, ] as const; export function TopNav() { const pathname = usePathname(); const { sidebarCollapsed, setSidebarCollapsed } = useApp(); const { user, logout } = useAuth(); const [menuOpen, setMenuOpen] = useState(false); const [profileOpen, setProfileOpen] = useState(false); const menuRef = useRef(null); useEffect(() => { if (!menuOpen) return; function handleClick(e: MouseEvent) { if (menuRef.current && !menuRef.current.contains(e.target as Node)) { setMenuOpen(false); } } document.addEventListener("mousedown", handleClick); return () => document.removeEventListener("mousedown", handleClick); }, [menuOpen]); return ( <>
{/* 移动端汉堡菜单 */} {/* Logo */}
EPEEKit {/* 项目切换器 */} {/* 导航 Tab */}
{/* 用户菜单 */} {user && (
{menuOpen && (
{user.username} {user.is_admin && (管理员)}
setMenuOpen(false)} className="w-full text-left px-3.5 py-2 text-sm text-[var(--text-primary)] hover:bg-[var(--bg-tertiary)] cursor-pointer transition-colors flex items-center gap-2" > 项目设置 P1
)}
)}
{profileOpen && setProfileOpen(false)} />} ); }