import { useState } from 'react'; import { Copy } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { useToast } from '@/hooks/use-toast'; interface LineNumberedTextProps { content: string; fontSizeClass?: string; onLineClick?: (lineNumber: number) => void; highlightedLine?: number; } export function LineNumberedText({ content, fontSizeClass = 'text-size-md', onLineClick, highlightedLine }: LineNumberedTextProps) { const { toast } = useToast(); const [hoveredLine, setHoveredLine] = useState(null); // Split content into lines const lines = content.split('\n'); const handleLineHover = (lineNumber: number) => { setHoveredLine(lineNumber); }; const handleLineLeave = () => { setHoveredLine(null); }; const handleCopyLine = (lineNumber: number, lineText: string) => { navigator.clipboard.writeText(lineText); toast({ description: "Line copied to clipboard", duration: 2000, }); }; const handleCopyLineLink = (lineNumber: number) => { const url = new URL(window.location.href); url.hash = `line-${lineNumber}`; navigator.clipboard.writeText(url.toString()); toast({ description: "Link to line copied to clipboard", duration: 2000, }); }; return (
{lines.map((line, index) => { const lineNumber = index + 1; const isHighlighted = lineNumber === highlightedLine; const isHovered = lineNumber === hoveredLine; return (
handleLineHover(lineNumber)} onMouseLeave={handleLineLeave} onClick={() => onLineClick?.(lineNumber)} > {lineNumber}

{line}

{/* Copy buttons that appear on hover */} {isHovered && (
)}
); })}
); }