link0518
重构
b88ce1b
import { useState } from 'react';
import { Check, Copy } from 'lucide-react';
import { cn } from '../lib/utils';
export default function CodeBlock({ code, language = 'bash' }) {
const [copied, setCopied] = useState(false);
const copy = () => {
navigator.clipboard.writeText(code);
setCopied(true);
setTimeout(() => setCopied(false), 2000);
};
return (
<div className="relative group rounded-xl overflow-hidden bg-slate-900 border border-slate-800">
<div className="absolute right-3 top-3 opacity-0 group-hover:opacity-100 transition-opacity">
<button
onClick={copy}
className="p-1.5 text-slate-400 hover:text-white hover:bg-white/10 rounded-lg transition-colors"
>
{copied ? <Check className="w-4 h-4 text-green-500" /> : <Copy className="w-4 h-4" />}
</button>
</div>
<pre className="p-4 overflow-x-auto text-sm font-mono text-slate-300 leading-relaxed">
<code>{code}</code>
</pre>
</div>
);
}