Spaces:
Sleeping
Sleeping
| import React from 'react'; | |
| import { Copy, Check } from 'lucide-react'; | |
| interface CodeBlockProps { | |
| language: string; | |
| code: string; | |
| filename?: string; | |
| } | |
| const CodeBlock: React.FC<CodeBlockProps> = ({ language, code, filename }) => { | |
| const [copied, setCopied] = React.useState(false); | |
| const handleCopy = () => { | |
| navigator.clipboard.writeText(code); | |
| setCopied(true); | |
| setTimeout(() => setCopied(false), 2000); | |
| }; | |
| return ( | |
| <div className="rounded-xl overflow-hidden bg-[#1e1e1e] border border-gray-700 my-4 shadow-lg"> | |
| {filename && ( | |
| <div className="flex justify-between items-center px-4 py-2 bg-[#252526] border-b border-gray-700"> | |
| <span className="text-xs text-gray-400 font-mono">{filename}</span> | |
| <button | |
| onClick={handleCopy} | |
| className="text-gray-400 hover:text-white transition-colors" | |
| > | |
| {copied ? <Check size={14} className="text-green-400" /> : <Copy size={14} />} | |
| </button> | |
| </div> | |
| )} | |
| <div className="p-4 overflow-x-auto"> | |
| <pre className="font-mono text-sm leading-relaxed text-gray-300"> | |
| <code>{code}</code> | |
| </pre> | |
| </div> | |
| </div> | |
| ); | |
| }; | |
| export default CodeBlock; |