import React from 'react'; import { Loader2, Circle } from 'lucide-react'; interface LoadingSpinnerProps { size?: 'small' | 'medium' | 'large'; text?: string; variant?: 'spinner' | 'dots' | 'pulse' | 'bars'; color?: 'primary' | 'secondary' | 'white'; } /** * 增强的加载动画组件 * 支持多种动画样式和尺寸 */ export const LoadingSpinner: React.FC = ({ size = 'medium', text, variant = 'spinner', color = 'primary' }) => { const sizeMap = { small: { icon: 16, text: 'text-sm', padding: 'p-3' }, medium: { icon: 24, text: 'text-base', padding: 'p-6' }, large: { icon: 32, text: 'text-lg', padding: 'p-8' } }; const colorMap = { primary: 'text-primary-600', secondary: 'text-gray-600', white: 'text-white' }; const currentSize = sizeMap[size]; const currentColor = colorMap[color]; const renderSpinner = () => { switch (variant) { case 'dots': return (
{[0, 1, 2].map((i) => ( ))}
); case 'pulse': return (
); case 'bars': return (
{[0, 1, 2, 3].map((i) => (
))}
); default: return ( ); } }; return (
{/* 加载动画 */}
{/* 背景光晕效果 */} {color === 'primary' && (
)} {/* 主要动画 */}
{renderSpinner()}
{/* 加载文本 */} {text && (
{text} {/* 动态点点点效果 */} {[0, 1, 2].map((i) => ( . ))}
)}
); };