2025-11-22 17:56:24 +08:00

76 lines
2.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Tag 组件
*
* 统一的标签组件,遵循三层架构设计
* 用于显示分类、类型等标签信息
* 支持多种颜色(blue、green、orange、purple等)和尺寸(sm、md、lg)
* 支持点击事件,可用于筛选等功能
*
* @created 2025-11-22
* @component
*/
'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: `${styles.accentStyles.blue.bg} ${styles.accentStyles.blue.text} border ${styles.accentStyles.blue.border}`,
green: `${styles.accentStyles.emerald.bg} ${styles.accentStyles.emerald.text} border ${styles.accentStyles.emerald.border}`,
orange: `${styles.accentStyles.orange.bg} ${styles.accentStyles.orange.text} border ${styles.accentStyles.orange.border}`,
purple: `${styles.accentStyles.purple.bg} ${styles.accentStyles.purple.text} border ${styles.accentStyles.purple.border}`,
indigo: `${styles.accentStyles.purple.bg} ${styles.accentStyles.purple.text} border ${styles.accentStyles.purple.border}`, // indigo 使用 purple
pink: `${styles.accentStyles.pink.bg} ${styles.accentStyles.pink.text} border ${styles.accentStyles.pink.border}`,
cyan: `${styles.accentStyles.cyan.bg} ${styles.accentStyles.cyan.text} border ${styles.accentStyles.cyan.border}`,
}
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',
onClick && color === 'blue' ? styles.accentStyles.blue.hover :
onClick && color === 'green' ? styles.accentStyles.emerald.hover :
onClick && color === 'orange' ? styles.accentStyles.orange.hover :
onClick && (color === 'purple' || color === 'indigo') ? styles.accentStyles.purple.hover :
onClick && color === 'pink' ? styles.accentStyles.pink.hover :
onClick && color === 'cyan' ? styles.accentStyles.cyan.hover : '',
className
)}
onClick={onClick}
>
{children}
</span>
)
}