| import React from 'react'; | |
| import { X, Download, Copy, Check } from 'lucide-react'; | |
| import ReactMarkdown from 'react-markdown'; | |
| import remarkMath from 'remark-math'; | |
| import rehypeKatex from 'rehype-katex'; | |
| const ReportViewerModal = ({ isOpen, onClose, data }) => { | |
| const [copied, setCopied] = React.useState(false); | |
| if (!isOpen || !data) return null; | |
| const handleCopy = () => { | |
| navigator.clipboard.writeText(data.markdown); | |
| setCopied(true); | |
| setTimeout(() => setCopied(false), 2000); | |
| }; | |
| const handleDownload = () => { | |
| const blob = new Blob([data.markdown], { type: 'text/markdown' }); | |
| const url = URL.createObjectURL(blob); | |
| const a = document.createElement('a'); | |
| a.href = url; | |
| a.download = `${data.title.replace(/\s+/g, '_').toLowerCase()}.md`; | |
| document.body.appendChild(a); | |
| a.click(); | |
| document.body.removeChild(a); | |
| URL.revokeObjectURL(url); | |
| }; | |
| return ( | |
| <div className="fixed inset-0 bg-black/80 backdrop-blur-sm z-50 flex items-center justify-center p-4"> | |
| <div className="bg-[#1f1f1f] rounded-2xl w-full max-w-4xl h-[90vh] flex flex-col shadow-2xl border border-white/10 overflow-hidden"> | |
| {/* Header */} | |
| <div className="p-6 border-b border-white/10 flex justify-between items-center bg-[#1f1f1f]"> | |
| <div> | |
| <h2 className="text-2xl font-semibold text-white mb-1">{data.title}</h2> | |
| <p className="text-gray-400 text-sm">Generated by Vertical.ai</p> | |
| </div> | |
| <div className="flex gap-3"> | |
| <button | |
| onClick={handleCopy} | |
| className="flex items-center gap-2 px-4 py-2 bg-white/5 hover:bg-white/10 text-gray-300 rounded-lg transition-colors border border-white/10 font-medium" | |
| > | |
| {copied ? <Check className="w-4 h-4 text-green-400" /> : <Copy className="w-4 h-4" />} | |
| {copied ? 'Copied' : 'Copy'} | |
| </button> | |
| <button | |
| onClick={handleDownload} | |
| className="flex items-center gap-2 px-4 py-2 bg-purple-600/20 hover:bg-purple-600/30 text-purple-300 rounded-lg transition-colors border border-purple-500/30 font-medium" | |
| > | |
| <Download className="w-4 h-4" /> | |
| Download MD | |
| </button> | |
| <button | |
| onClick={onClose} | |
| className="p-2 hover:bg-white/10 rounded-full transition-colors text-gray-400 hover:text-white" | |
| > | |
| <X className="w-6 h-6" /> | |
| </button> | |
| </div> | |
| </div> | |
| {/* Content - Scrollable */} | |
| <div className="flex-1 overflow-auto p-8 bg-[#121212] prose prose-invert max-w-none"> | |
| <ReactMarkdown | |
| remarkPlugins={[remarkMath]} | |
| rehypePlugins={[rehypeKatex]} | |
| > | |
| {data.markdown} | |
| </ReactMarkdown> | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| }; | |
| export default ReportViewerModal; | |