| | 'use client'; |
| |
|
| | import { useEffect, useRef } from 'react'; |
| | import Editor from '@monaco-editor/react'; |
| |
|
| | interface CodeEditorProps { |
| | code: string; |
| | language: string; |
| | onChange?: (value: string) => void; |
| | readOnly?: boolean; |
| | } |
| |
|
| | export default function CodeEditor({ code, language, onChange, readOnly = false }: CodeEditorProps) { |
| | const editorRef = useRef<any>(null); |
| |
|
| | |
| | const getMonacoLanguage = (lang: string): string => { |
| | const languageMap: Record<string, string> = { |
| | 'html': 'html', |
| | 'gradio': 'python', |
| | 'streamlit': 'python', |
| | 'transformers.js': 'javascript', |
| | 'react': 'typescript', |
| | 'comfyui': 'json', |
| | }; |
| | return languageMap[lang] || 'plaintext'; |
| | }; |
| |
|
| | const handleEditorDidMount = (editor: any) => { |
| | editorRef.current = editor; |
| | }; |
| |
|
| | return ( |
| | <div className="h-full overflow-hidden"> |
| | <Editor |
| | height="100%" |
| | language={getMonacoLanguage(language)} |
| | value={code} |
| | onChange={(value) => onChange && onChange(value || '')} |
| | theme="vs-dark" |
| | options={{ |
| | readOnly, |
| | minimap: { enabled: true }, |
| | fontSize: 14, |
| | fontFamily: "'SF Mono', 'JetBrains Mono', 'Menlo', 'Monaco', 'Courier New', monospace", |
| | wordWrap: 'on', |
| | lineNumbers: 'on', |
| | scrollBeyondLastLine: false, |
| | automaticLayout: true, |
| | tabSize: 2, |
| | padding: { top: 16, bottom: 16 }, |
| | lineHeight: 22, |
| | letterSpacing: 0.5, |
| | }} |
| | onMount={handleEditorDidMount} |
| | /> |
| | </div> |
| | ); |
| | } |
| |
|
| |
|