import { Copy } from "lucide-react"; import { useState } from "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 && (
)}
); })}
); }