import type React from 'react'; import { CollapsibleSection } from '@/components/ui/CollapsibleSection'; interface MarkdownRendererProps { content: string; className?: string; } const MarkdownRenderer: React.FC = ({ content, className = '' }) => { const parseMarkdown = (text: string) => { const parts = []; const lines = text.split('\n'); let currentBlock = []; let inCodeBlock = false; let codeLanguage = ''; for (let i = 0; i < lines.length; i++) { const line = lines[i]; if (line.startsWith('```')) { if (inCodeBlock) { if (currentBlock.length > 0) { parts.push({ type: 'code', content: currentBlock.join('\n'), language: codeLanguage }); currentBlock = []; } inCodeBlock = false; codeLanguage = ''; } else { if (currentBlock.length > 0) { parts.push({ type: 'text', content: currentBlock.join('\n') }); currentBlock = []; } inCodeBlock = true; codeLanguage = line.substring(3).trim(); } } else { currentBlock.push(line); } } if (currentBlock.length > 0) { parts.push({ type: inCodeBlock ? 'code' : 'text', content: currentBlock.join('\n'), language: codeLanguage }); } return parts; }; const parts = parseMarkdown(content); return (
{parts.map((part, index) => { if (part.type === 'code') { return (
							
								{part.content}
							
						
); } return (
{part.content.split('\n').map((line, lineIndex) => { const bulletMatch = line.match(/^(\s*)([-*])\s(.+)$/); if (bulletMatch) { const indent = bulletMatch[1].length; return (
{bulletMatch[3]}
); } const numberedMatch = line.match(/^(\s*)(\d+\.)\s(.+)$/); if (numberedMatch) { const indent = numberedMatch[1].length; return (
{numberedMatch[2]} {numberedMatch[3]}
); } const headingMatch = line.match(/^(#{1,6})\s(.+)$/); if (headingMatch) { const level = headingMatch[1].length; const headingLevel = Math.min(level + 2, 6); const headingClassName = 'font-semibold text-vscode-foreground mb-2 mt-4 first:mt-0'; switch (headingLevel) { case 3: return (

{headingMatch[2]}

); case 4: return (

{headingMatch[2]}

); case 5: return (
{headingMatch[2]}
); case 6: return (
{headingMatch[2]}
); default: return (

{headingMatch[2]}

); } } if (line.trim() === '') { return
; } return (
{line}
); })}
); })}
); }; interface DetailsSectionProps { title: string; content?: string; error?: string | null; emptyMessage?: string; defaultExpanded?: boolean; } export const DetailsSection: React.FC = ({ title, content, error, emptyMessage = 'No details available', defaultExpanded = false }) => { return (
{error ? (
Error loading {title.toLowerCase()}: {error}
) : content !== undefined && content !== '' ? ( ) : (
{emptyMessage}
)}
); };