import React, { useState } from 'react'; import ReactMarkdown from 'react-markdown'; import { ChevronDown, ChevronUp, Layers, Zap, List, FileText, Quote, Sparkles } from 'lucide-react'; import { ContentLayers, ConfidenceLevel } from '../types'; interface Props { layers: ContentLayers; eli5Mode?: boolean; showConfidenceBadges?: boolean; } type LayerLevel = 1 | 2 | 3; const layerInfo = { 1: { name: 'TL;DR', icon: Zap, description: 'Core thesis in one sentence', color: 'brand' }, 2: { name: 'Key Takeaways', icon: List, description: '3-5 essential points', color: 'purple' }, 3: { name: 'Full Details', icon: FileText, description: 'Complete explanation', color: 'emerald' } }; const ProgressiveContent: React.FC = ({ layers, eli5Mode = false, showConfidenceBadges = true }) => { const [expandedLayer, setExpandedLayer] = useState(1); const [isAnimating, setIsAnimating] = useState(false); const handleLayerChange = (level: LayerLevel) => { if (level === expandedLayer) return; setIsAnimating(true); setTimeout(() => { setExpandedLayer(level); setIsAnimating(false); }, 150); }; const content = eli5Mode && layers.eli5Content ? layers.eli5Content : layers.detailed; return (
{/* Layer Selector Pills */}
Depth: {([1, 2, 3] as LayerLevel[]).map((level) => { const info = layerInfo[level]; const Icon = info.icon; const isActive = expandedLayer === level; return ( ); })}
{/* Content Display */}
{/* Layer 1: Thesis */} {expandedLayer >= 1 && (
Core Thesis {showConfidenceBadges && ( )}

{layers.thesis}

{expandedLayer === 1 && ( )}
)} {/* Layer 2: Key Takeaways */} {expandedLayer >= 2 && (
= 2 ? 'animate-in fade-in slide-in-from-top-4' : ''}`}>
Key Takeaways
    {layers.takeaways.map((takeaway, idx) => (
  • {idx + 1} {takeaway}
  • ))}
{expandedLayer === 2 && ( )}
)} {/* Layer 3: Full Details */} {expandedLayer === 3 && (
Full Explanation {eli5Mode && layers.eli5Content && ( Simple Mode )}
{content}
)}
); }; // Confidence Badge Component const ConfidenceBadge: React.FC<{ level: ConfidenceLevel }> = ({ level }) => { const config = { 'direct-quote': { label: 'Direct Quote', color: 'bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300 border-green-200 dark:border-green-800', icon: Quote }, 'paraphrase': { label: 'Paraphrased', color: 'bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 border-blue-200 dark:border-blue-800', icon: Sparkles }, 'synthesis': { label: 'Synthesized', color: 'bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 border-purple-200 dark:border-purple-800', icon: Layers }, 'interpretation': { label: 'AI Interpretation', color: 'bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300 border-amber-200 dark:border-amber-800', icon: Sparkles } }; const { label, color, icon: Icon } = config[level]; return ( {label} ); }; export { ConfidenceBadge }; export default ProgressiveContent;