import { useState } from 'react'; import { ChevronRight, Copy, Check } from 'lucide-react'; import { Streamdown } from 'streamdown'; import { code } from '@streamdown/code'; interface Props { title: string; content: string; } /** Ensure every newline becomes a visible paragraph break in markdown */ function ensureLineBreaks(text: string): string { return text.split('\n').join('\n\n'); } function formatSize(len: number): string { if (len < 1024) return `${len} chars`; return `${(len / 1024).toFixed(1)} KB`; } export default function BlobyTextCard({ title, content }: Props) { const [expanded, setExpanded] = useState(false); const [copied, setCopied] = useState(false); const handleCopy = async (e: React.MouseEvent) => { e.stopPropagation(); try { await navigator.clipboard.writeText(content); setCopied(true); setTimeout(() => setCopied(false), 1500); } catch { /* clipboard not available */ } }; return (
{/* Header */}
setExpanded((v) => !v)} className="flex items-center gap-2.5 px-3.5 py-2.5 bg-white/[0.03] hover:bg-white/[0.05] transition-colors cursor-pointer select-none" > {title}
{formatSize(content.length)}
{/* Collapsible content */} {expanded && (
{ensureLineBreaks(content)}
)}
); }