'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 (
{/* Header bar */}
{filename && ( {filename} )} {!filename && language && ( {language} )}
{showLineNumbers && (
{code.split('\n').length} lines
)}
{/* Code content */}
{code}
) } // Helper to detect language from filename function detectLanguage(filename: string): string { const ext = filename.split('.').pop()?.toLowerCase() const languageMap: Record = { 'md': 'markdown', 'markdown': 'markdown', 'js': 'javascript', 'jsx': 'jsx', 'ts': 'typescript', 'tsx': 'tsx', 'py': 'python', 'json': 'json', 'yaml': 'yaml', 'yml': 'yaml', 'html': 'html', 'css': 'css', 'scss': 'scss', 'sh': 'bash', 'bash': 'bash', 'txt': 'text', } return languageMap[ext || ''] || 'markdown' } // Inline code component for markdown rendering export function InlineCode({ children }: { children: React.ReactNode }) { return ( {children} ) }