import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { User, Lock, Palette, Check, Loader2, AlertCircle } from 'lucide-react'; import { useUserStore } from '@/store'; import { userApi } from '@/services/api'; import { useTheme, THEME_OPTIONS } from '@/hooks/useTheme'; import { cn } from '@/lib/utils'; import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, } from '@/components/ui/dropdown-menu'; /* ---------- Floating background orbs (themed light spots) ---------- */ const ORBS = [ { top: '-10%', left: '-5%', size: 520, color: 'var(--dg-blue)', opacity: 0.22, blur: 90, animation: 'login-orb-1 18s ease-in-out infinite', }, { bottom: '-15%', right: '-8%', size: 480, color: 'var(--dg-purple)', opacity: 0.2, blur: 100, animation: 'login-orb-2 22s ease-in-out infinite', }, { top: '30%', right: '10%', size: 320, color: 'var(--dg-cyan)', opacity: 0.16, blur: 70, animation: 'login-orb-3 16s ease-in-out infinite', }, { bottom: '10%', left: '8%', size: 380, color: 'var(--dg-gradient-start)', opacity: 0.18, blur: 80, animation: 'login-orb-4 20s ease-in-out infinite', }, ]; const ANIMATIONS = ` @keyframes login-orb-1 { 0%, 100% { transform: translate(0, 0) scale(1); } 33% { transform: translate(40px, -50px) scale(1.12); } 66% { transform: translate(-30px, 35px) scale(0.92); } } @keyframes login-orb-2 { 0%, 100% { transform: translate(0, 0) scale(1); } 50% { transform: translate(-50px, 25px) scale(1.18); } } @keyframes login-orb-3 { 0%, 100% { transform: translate(0, 0) scale(1); } 50% { transform: translate(30px, 45px) scale(0.88); } } @keyframes login-orb-4 { 0%, 100% { transform: translate(0, 0) scale(1); } 50% { transform: translate(25px, -30px) scale(1.1); } } @keyframes login-card-enter { from { opacity: 0; transform: translateY(24px) scale(0.97); } to { opacity: 1; transform: translateY(0) scale(1); } } @keyframes login-fade-in { from { opacity: 0; } to { opacity: 1; } } `; export function Login() { const navigate = useNavigate(); const { theme, setTheme } = useTheme(); const [username, setUsername] = useState('admin'); const [password, setPassword] = useState('123456'); const [showPassword, setShowPassword] = useState(false); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(''); setLoading(true); try { const result = await userApi.login(username, password); useUserStore.getState().login(result.user, result.token); localStorage.setItem('token', result.token); // backward compat navigate('/', { replace: true }); } catch (err: unknown) { const message = err instanceof Error ? err.message : '登录失败,请检查用户名和密码'; setError(message); } finally { setLoading(false); } }; return ( <>
{/* -------- Floating themed light spots -------- */} {ORBS.map((orb, i) => ( ); }