// Overlay for reading and editing the MATLAB implementation. Edits take // effect on the next debounced render and live only as long as the page. import { useState } from 'react'; import { DEFAULT_MFILES, EXECUTED_BY_APP, type MFile } from '../mfiles'; import type { RenderError } from '../hooks/useRenderer'; import CodeEditor from './CodeEditor'; interface Props { mfiles: MFile[]; onChangeFile: (name: string, source: string) => void; onResetFile: (name: string) => void; onResetAll: () => void; onClose: () => void; onRenderFull: () => void; error: RenderError | null; busy: boolean; } function defaultSourceOf(name: string): string { return DEFAULT_MFILES.find((f) => f.name === name)?.source ?? ''; } export default function CodePanel({ mfiles, onChangeFile, onResetFile, onResetAll, onClose, onRenderFull, error, busy, }: Props) { const [selected, setSelected] = useState( mfiles.find((f) => EXECUTED_BY_APP.has(f.name))?.name ?? mfiles[0]?.name ?? '', ); const file = mfiles.find((f) => f.name === selected) ?? mfiles[0]; const dirty = (f: MFile) => f.source !== defaultSourceOf(f.name); const anyDirty = mfiles.some(dirty); return (
e.stopPropagation()}>

MATLAB source

Executed by numbl. Edits re-render as you type and are discarded on reload.
{mfiles.map((f) => ( ))}
{file && ( <>
{file.name} {!EXECUTED_BY_APP.has(file.name) && ( entry point for the numbl CLI; the app does not run this file )}
onChangeFile(file.name, src)} /> )}
{error && (
{error.file ? `${error.file}${error.line ? `:${error.line}` : ''}` : 'error'}{' '} {error.message}
)}
); }