import React from 'react'; import { Rocket, Heart, GraduationCap, Briefcase, TrendingUp, TrendingDown, AlertTriangle, Star, Baby, Home, Plane, DollarSign, Activity, Award, Zap, Circle, type LucideIcon } from 'lucide-react'; import { TimelineEvent, TimelineEventSentiment } from '../../types'; // Icon mapping for timeline events const iconMap: Record = { 'rocket': Rocket, 'heart': Heart, 'graduation-cap': GraduationCap, 'briefcase': Briefcase, 'trending-up': TrendingUp, 'trending-down': TrendingDown, 'alert-triangle': AlertTriangle, 'star': Star, 'baby': Baby, 'home': Home, 'plane': Plane, 'dollar-sign': DollarSign, 'activity': Activity, 'award': Award, 'zap': Zap, 'circle': Circle, }; // Sentiment color mapping const sentimentColors: Record = { positive: { bg: 'bg-emerald-100', border: 'border-emerald-400', text: 'text-emerald-700', }, negative: { bg: 'bg-rose-100', border: 'border-rose-400', text: 'text-rose-700', }, neutral: { bg: 'bg-gray-100', border: 'border-gray-400', text: 'text-gray-700', }, }; interface EventAnnotationProps { event: TimelineEvent; x: number; y: number; onClick?: (event: TimelineEvent) => void; onHover?: (event: TimelineEvent | null) => void; } // SVG-based Event Annotation for use in Recharts export const EventAnnotationShape: React.FC = ({ event, x, y, onClick, onHover, }) => { const IconComponent = iconMap[event.icon] || Circle; const isFuture = event.isFuture; // Color based on sentiment const fillColor = event.sentiment === 'positive' ? '#10B981' // emerald-500 : event.sentiment === 'negative' ? '#F43F5E' // rose-500 : '#6B7280'; // gray-500 const strokeColor = event.sentiment === 'positive' ? '#047857' // emerald-700 : event.sentiment === 'negative' ? '#BE123C' // rose-700 : '#374151'; // gray-700 return ( onClick?.(event)} onMouseEnter={() => onHover?.(event)} onMouseLeave={() => onHover?.(null)} > {/* Background circle */} {/* Pulse animation for future events */} {isFuture && ( )} {/* Icon placeholder - render as small circle for now */} ); }; // React component for Event Tooltip Card interface EventCardProps { event: TimelineEvent; position?: { x: number; y: number }; onClose?: () => void; onAddToCalendar?: (event: TimelineEvent) => void; } export const EventCard: React.FC = ({ event, position, onClose, onAddToCalendar, }) => { const colors = sentimentColors[event.sentiment]; const IconComponent = iconMap[event.icon] || Circle; return (
{/* Header */}
{event.year}年{event.month ? `${event.month}月` : ''}
{event.isFuture && ( 预测 )}
{/* Content */}

{event.title}

{event.description}

{/* Type badge */}
{event.type === 'corporate' ? '商业' : event.type === 'personal' ? '个人' : '市场'} {event.verificationStatus && ( {event.verificationStatus === 'verified' ? '已验证' : event.verificationStatus === 'unverified' ? '未验证' : '待验证'} )}
{/* Actions */} {event.isFuture && onAddToCalendar && ( )}
{/* Close button */} {onClose && ( )}
); }; export default EventAnnotationShape;