'use client'; import { useTheme } from 'next-themes'; import CodeMirror from '@uiw/react-codemirror'; import { vscodeDark, vscodeLight } from '@uiw/codemirror-theme-vscode'; import { EditorView } from '@codemirror/view'; import { IconCheck, IconCopy } from '@tabler/icons-react'; import { cn } from '@/lib/utils'; import { getCodeMirrorExtension } from '@/lib/languages'; import { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard'; type CodeBlockProps = { children: React.ReactNode; className?: string; }; const getLanguageExtension = (language?: string) => { if (!language) return undefined; const lang = language.replace('language-', '').toLowerCase(); return getCodeMirrorExtension(lang); }; export function CodeMirrorCodeBlock({ children, className }: CodeBlockProps) { const { copied, copy } = useCopyToClipboard(); const { theme, systemTheme } = useTheme(); const effectiveTheme = theme === 'system' ? systemTheme : theme; const code = String(children).replace(/\n$/, ''); const languageExtension = getLanguageExtension(className); // Custom padding theme const paddingTheme = EditorView.theme({ '&': { padding: '2px 2px', }, }); const handleCopy = async () => { await copy(code); }; return (
{/* Copy button */} {/* Code editor */}
); }