import React, { useState } from 'react'; import ReactMarkdown from 'react-markdown'; import { BlogSection as BlogSectionType } from '../types'; import MermaidDiagram from './MermaidDiagram'; import InteractiveChart from './InteractiveChart'; import EquationBlock from './EquationBlock'; import Collapsible from './Collapsible'; import Tooltip from './Tooltip'; import { Info, Lightbulb, AlertTriangle, BookOpen, CheckCircle, XCircle, Shield, ChevronDown, Wrench } from 'lucide-react'; interface Props { section: BlogSectionType; theme: 'light' | 'dark'; index: number; } // Validation Badge Component const ValidationBadge: React.FC<{ section: BlogSectionType }> = ({ section }) => { const [isExpanded, setIsExpanded] = useState(false); const validation = section.validationStatus; if (!validation?.isValidated) return null; const getScoreColor = (score: number) => { if (score >= 80) return 'text-green-600 dark:text-green-400 bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800'; if (score >= 60) return 'text-amber-600 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 border-amber-200 dark:border-amber-800'; return 'text-red-600 dark:text-red-400 bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800'; }; const getScoreIcon = (score: number) => { if (score >= 80) return ; if (score >= 60) return ; return ; }; return (
{isExpanded && (
{/* Content Relevance */}
{getScoreIcon(validation.contentRelevance.score)} Content Relevance {validation.contentRelevance.score}/100
{validation.contentRelevance.issues.length > 0 && (
    {validation.contentRelevance.issues.slice(0, 3).map((issue, i) => (
  • {issue}
  • ))}
)} {validation.contentRelevance.passed && validation.contentRelevance.issues.length === 0 && (

✓ Content verified against source paper

)}
{/* Visualization Validity */}
{getScoreIcon(validation.visualizationValidity.score)} Visualization {validation.visualizationValidity.score}/100
{validation.visualizationValidity.issues.length > 0 && (
    {validation.visualizationValidity.issues.slice(0, 3).map((issue, i) => (
  • {issue}
  • ))}
)} {validation.visualizationValidity.passed && validation.visualizationValidity.issues.length === 0 && (

✓ Visualization syntax valid

)}
{validation.wasRepaired && (

This section was automatically repaired ({validation.repairAttempts} attempt{validation.repairAttempts !== 1 ? 's' : ''})

)}
)}
); }; const BlogSectionComponent: React.FC = ({ section, theme, index }) => { const getMarginNoteIcon = (icon?: 'info' | 'warning' | 'tip' | 'note') => { switch (icon) { case 'warning': return ; case 'tip': return ; case 'info': return ; default: return ; } }; // Apply tooltips to content const renderContent = () => { if (!section.technicalTerms || section.technicalTerms.length === 0) { return {section.content}; } // For complex tooltip integration, we'll render ReactMarkdown // and let users hover on specially marked terms return (
{section.content} {/* Technical Terms Legend */} {section.technicalTerms.length > 0 && (
Key Terms
{section.technicalTerms.map((term, idx) => ( {term.term} ))}
)}
); }; return (
{/* Main Content */}
{/* Section Header */}
{index + 1}

{section.title}

{/* Content */}
{renderContent()}
{/* Visualization */} {section.visualizationType && section.visualizationType !== 'none' && (
{/* Visualization Header */}
{section.visualizationType === 'mermaid' ? 'Diagram' : section.visualizationType === 'chart' ? 'Data Visualization' : section.visualizationType === 'equation' ? 'Mathematical Formulation' : 'Visual'}
{section.visualizationType === 'mermaid' && section.visualizationData && (
)} {section.visualizationType === 'chart' && section.chartData && ( )} {section.visualizationType === 'equation' && section.visualizationData && (
)}
)} {/* Collapsible Deep Dives */} {section.collapsibleSections && section.collapsibleSections.length > 0 && (
{section.collapsibleSections.map((collapsible, idx) => ( {collapsible.content} ))}
)} {/* Validation Badge */}
{/* Margin Notes */} {section.marginNotes && section.marginNotes.length > 0 && ( )}
{/* Section Divider */}
); }; export default BlogSectionComponent;