CodeEditor
AppEngine-agnostic code editor primitive. M1 ships a lightweight CodeMirror-style fallback engine (textarea + line-number gutter + active-line + theme + readonly + placeholder) so the public API is stable today. Future milestones: Monaco (VSCode) lazy engine, find/replace, multi-cursor, diagnostics (markers), custom autocomplete + hover, minimap, code folding, vim/emacs keymap. Pixel-identical EJS sibling at modules/ui/CodeEditor/CodeEditor.ejs. Used by RulesetEditor M3 + RichTextEditor code-block insert (planned).
Read-only JavaScript snippet with line numbers.
<CodeEditor
id="example"
label="example.js"
language="js"
theme="light"
value={source}
readonly
showLineNumbers
/>Editable markdown. The hidden form input is synced to the value.
const [src, setSrc] = useState('# Hello');
<CodeEditor
id="readme"
name="readme"
label="README.md"
language="markdown"
theme="dark"
value={src}
onChange={setSrc}
placeholder="Start typing markdown…"
/>