'use client' import { useState, useCallback } from 'react' import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter' import { oneDark } from 'react-syntax-highlighter/dist/cjs/styles/prism' import { Copy, Check, FileCode, Hash } from 'lucide-react' import { motion } from 'framer-motion' interface CodeBlockProps { code: string language?: string showLineNumbers?: boolean filename?: string } // Custom dark theme matching site colors const customTheme = { ...oneDark, 'pre[class*="language-"]': { ...oneDark['pre[class*="language-"]'], background: '#0a0a0a', margin: 0, padding: '1rem', fontSize: '0.875rem', lineHeight: '1.6', }, 'code[class*="language-"]': { ...oneDark['code[class*="language-"]'], background: 'transparent', }, } export default function CodeBlock({ code, language = 'markdown', showLineNumbers = false, filename }: CodeBlockProps) { const [copied, setCopied] = useState(false) const handleCopy = useCallback(async () => { try { await navigator.clipboard.writeText(code) setCopied(true) setTimeout(() => setCopied(false), 2000) } catch (err) { console.error('Failed to copy:', err) } }, [code]) // Detect language from filename if not provided const detectedLanguage = language || detectLanguage(filename || '') return (
{children}
)
}