diff --git a/dashboard/package.json b/dashboard/package.json index 042d95a3..e88f0731 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -121,6 +121,7 @@ "@radix-ui/react-tabs": "^1.1.13", "@radix-ui/react-toast": "^1.2.15", "@radix-ui/react-tooltip": "^1.2.8", + "@react-spring/web": "10.0.3", "@tanstack/react-router": "^1.140.0", "@tanstack/react-virtual": "^3.13.13", "@tanstack/router-devtools": "^1.140.0", @@ -130,6 +131,7 @@ "@uppy/dashboard": "^5.1.0", "@uppy/react": "^5.1.1", "@uppy/xhr-upload": "^5.1.1", + "@use-gesture/react": "^10.3.1", "axios": "^1.13.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -142,6 +144,7 @@ "idb": "^8.0.3", "katex": "^0.16.27", "lucide-react": "^0.556.0", + "motion": "^12.38.0", "react": "^19.2.1", "react-day-picker": "^9.12.0", "react-dom": "^19.2.1", @@ -154,9 +157,7 @@ "remark-gfm": "^4.0.1", "remark-math": "^6.0.0", "smol-toml": "^1.5.2", - "tailwind-merge": "^3.4.0", - "@react-spring/web": "10.0.3", - "@use-gesture/react": "^10.3.1" + "tailwind-merge": "^3.4.0" }, "devDependencies": { "@tailwindcss/vite": "^4.2.1", diff --git a/dashboard/src/components/layout/Header.tsx b/dashboard/src/components/layout/Header.tsx index 7a3465b7..c9f085f5 100644 --- a/dashboard/src/components/layout/Header.tsx +++ b/dashboard/src/components/layout/Header.tsx @@ -1,4 +1,18 @@ -import { BookOpen, ChevronLeft, Globe, LogOut, Menu, Moon, Search, Server, Sun } from 'lucide-react' +import { Link } from '@tanstack/react-router' +import { + BookOpen, + ChevronLeft, + Globe, + LogOut, + Menu, + MessageSquare, + Moon, + Search, + Server, + SlidersHorizontal, + Sun, +} from 'lucide-react' +import { LayoutGroup, motion } from 'motion/react' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -13,14 +27,21 @@ import { DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { ShortcutKbd } from '@/components/ui/kbd' +import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs' import { toggleThemeWithTransition } from '@/components/use-theme' import { useBackground } from '@/hooks/use-background' import { logout } from '@/lib/fetch-with-auth' import { isElectron } from '@/lib/runtime' import { cn } from '@/lib/utils' +import type { WorkspaceMode } from './types' const LANGUAGE_CODES = ['zh', 'en', 'ja', 'ko'] as const -const LANGUAGE_NAMES: Record = { "zh": "中文", "en": "English", "ja": "日本語", "ko": "한국어" } +const LANGUAGE_NAMES: Record<(typeof LANGUAGE_CODES)[number], string> = { + zh: '中文', + en: 'English', + ja: '日本語', + ko: '한국어', +} interface HeaderProps { sidebarOpen: boolean @@ -31,6 +52,7 @@ interface HeaderProps { onMobileMenuToggle: () => void onSearchOpenChange: (open: boolean) => void onThemeChange: (theme: 'light' | 'dark' | 'system') => void + workspaceMode: WorkspaceMode } export function Header({ @@ -42,6 +64,7 @@ export function Header({ onMobileMenuToggle, onSearchOpenChange, onThemeChange, + workspaceMode, }: HeaderProps) { const { t, i18n: i18nInstance } = useTranslation() const currentLang = i18nInstance.language || 'zh' @@ -62,10 +85,12 @@ export function Header({ } return ( -
+
{!inheritsPageBackground && }
{/* 移动端菜单按钮 */} @@ -73,17 +98,23 @@ export function Header({ onClick={onMobileMenuToggle} aria-label={t('a11y.closeMenu')} aria-expanded={mobileMenuOpen} - className="rounded-lg p-2 hover:bg-accent lg:hidden" + className={cn( + 'hover:bg-accent rounded-lg p-2 lg:hidden', + workspaceMode === 'chat' && 'hidden' + )} > - + {/* 桌面端侧边栏收起/展开按钮 */} -
+
)} {/* 搜索框 */} {/* 搜索对话框 */} @@ -142,26 +223,23 @@ export function Header({ - { - - LANGUAGE_CODES.map((code) => ( + {LANGUAGE_CODES.map((code) => ( i18nInstance.changeLanguage(code)} className={cn( 'cursor-pointer', - currentLang.split('-')[0] === code && 'font-semibold text-primary' + currentLang.split('-')[0] === code && 'text-primary font-semibold' )} > - {currentLang.split('-')[0] === code && ( - - )} + {currentLang.split('-')[0] === code && } {LANGUAGE_NAMES[code]} ))} @@ -175,13 +253,13 @@ export function Header({ toggleThemeWithTransition(newTheme, onThemeChange, e) }} aria-label={actualTheme === 'dark' ? t('header.switchToLight') : t('header.switchToDark')} - className="rounded-lg p-2 hover:bg-accent" + className="hover:bg-accent rounded-lg p-2" > {actualTheme === 'dark' ? : } {/* 分隔线 */} -
+
{/* 登出按钮 */}