WuYongJie a604b4d488
Some checks failed
CI Check / check (push) Has been cancelled
feat: 首页UI完全统一到三层架构 & 创建通用组件库
- 首页UI统一到三层架构
  - 将所有 gray 系列替换为 slate 系列
  - 统一按钮、输入框、边框颜色样式
  - 使用 useThemeStyles() Hook

- 创建通用组件库
  - Badge 组件(支持 primary、success、warning、danger 变体)
  - Tag 组件(支持多种颜色,已在首页应用)
  - Button 组件(支持多种变体和尺寸,带加载状态)
  - Input 组件(支持错误状态和多种尺寸)
2025-11-22 16:32:52 +08:00

57 lines
1.5 KiB
TypeScript

'use client'
import { ReactNode } from 'react'
import { useThemeStyles, cn } from '@/lib/ui-styles'
interface TagProps {
children: ReactNode
color?: 'blue' | 'green' | 'orange' | 'purple' | 'indigo' | 'pink' | 'cyan'
size?: 'sm' | 'md' | 'lg'
className?: string
onClick?: () => void
}
export default function Tag({
children,
color = 'blue',
size = 'md',
className = '',
onClick,
}: TagProps) {
const styles = useThemeStyles()
const colorClasses = {
blue: 'bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300',
green: 'bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300',
orange: 'bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300',
purple: 'bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300',
indigo: 'bg-indigo-100 dark:bg-indigo-900/30 text-indigo-700 dark:text-indigo-300',
pink: 'bg-pink-100 dark:bg-pink-900/30 text-pink-700 dark:text-pink-300',
cyan: 'bg-cyan-100 dark:bg-cyan-900/30 text-cyan-700 dark:text-cyan-300',
}
const sizeClasses = {
sm: 'px-2 py-0.5 text-xs',
md: 'px-2 py-1 text-xs',
lg: 'px-3 py-1.5 text-sm',
}
const baseClasses = 'inline-flex items-center font-medium rounded transition-colors'
return (
<span
className={cn(
baseClasses,
colorClasses[color],
sizeClasses[size],
onClick && 'cursor-pointer hover:opacity-80',
className
)}
onClick={onClick}
>
{children}
</span>
)
}