/** * * SkillCard - 技能卡片组件 * * * 展示单个技能的基本信息,包括名称、描述、能力和安装状态 */ import { motion } from 'framer-motion'; import { Package, Check, Star, MoreHorizontal, Clock, } from 'lucide-react'; import type { Skill } from '../../types/skill-market'; import { useState } from 'react'; // === 类型定义 === interface SkillCardProps { /** 技能数据 */ skill: Skill; /** 是否选中 */ isSelected?: boolean; /** 点击回调 */ onClick?: () => void; /** 安装/卸载回调 */ onToggleInstall?: () => void; /** 显示更多操作 */ onShowMore?: () => void; } // === 分类配置 === const CATEGORY_CONFIG: Record = { development: { color: 'text-blue-600 dark:text-blue-400', bgColor: 'bg-blue-100 dark:bg-blue-900/30' }, security: { color: 'text-red-600 dark:text-red-400', bgColor: 'bg-red-100 dark:bg-red-900/30' }, analytics: { color: 'text-purple-600 dark:text-purple-400', bgColor: 'bg-purple-100 dark:bg-purple-900/30' }, content: { color: 'text-pink-600 dark:text-pink-400', bgColor: 'bg-pink-100 dark:bg-pink-900/30' }, ops: { color: 'text-orange-600 dark:text-orange-400', bgColor: 'bg-orange-100 dark:bg-orange-900/30' }, management: { color: 'text-cyan-600 dark:text-cyan-400', bgColor: 'bg-cyan-100 dark:bg-cyan-900/30' }, testing: { color: 'text-emerald-600 dark:text-emerald-400', bgColor: 'bg-emerald-100 dark:bg-emerald-900/30' }, business: { color: 'text-amber-600 dark:text-amber-400', bgColor: 'bg-amber-100 dark:bg-amber-900/30' }, marketing: { color: 'text-rose-600 dark:text-rose-400', bgColor: 'bg-rose-100 dark:bg-rose-900/30' }, }; // === 分类名称映射 === const CATEGORY_NAMES: Record = { development: '开发', security: '安全', analytics: '分析', content: '内容', ops: '运维', management: '管理', testing: '测试', business: '商务', marketing: '营销', }; /** * SkillCard - 技能卡片组件 */ export function SkillCard({ skill, isSelected = false, onClick, onToggleInstall, onShowMore, }: SkillCardProps) { const [isHovered, setIsHovered] = useState(false); const categoryConfig = CATEGORY_CONFIG[skill.category] || { color: 'text-gray-600 dark:text-gray-400', bgColor: 'bg-gray-100 dark:bg-gray-800/30', }; return ( setIsHovered(true)} onHoverEnd={() => setIsHovered(false)} onClick={onClick} className={` relative p-4 rounded-lg border cursor-pointer transition-all duration-200 ${isSelected ? 'border-blue-500 bg-blue-50 dark:bg-blue-900/20' : 'border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 hover:border-gray-300 dark:hover:border-gray-600' } `} > {/* 顶部:图标和名称 */}

{skill.name}

{skill.author || '官方'}

{/* 安装按钮 */} { e.stopPropagation(); onToggleInstall?.(); }} className={` px-3 py-1.5 rounded-lg text-xs font-medium transition-all duration-200 ${skill.installed ? 'bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-600' : 'bg-gray-700 dark:bg-gray-600 text-white hover:bg-gray-800 dark:hover:bg-gray-500' } `} > {skill.installed ? ( 已安装 ) : ( 安装 )}
{/* 描述 */}

{skill.description}

{/* 标签和能力 */}
{skill.capabilities.slice(0, 3).map((cap) => ( {cap} ))} {skill.capabilities.length > 3 && ( +{skill.capabilities.length - 3} )}
{/* 底部:分类、评分和统计 */}
{CATEGORY_NAMES[skill.category] || skill.category}
{skill.rating !== undefined && ( {skill.rating.toFixed(1)} )} {skill.reviewCount !== undefined && skill.reviewCount > 0 && ( {skill.reviewCount} 评价 )} {skill.installedAt && ( {new Date(skill.installedAt).toLocaleDateString()} )}
{/* 悬停时显示更多按钮 */}
); } export default SkillCard;