| 23 | |
| 24 | /* ---------------- Monaco loader ---------------- */ |
| 25 | function loadMonaco() { |
| 26 | return new Promise((resolve, reject) => { |
| 27 | if (monacoLoaded && window.monaco) return resolve(); |
| 28 | if (!window.require) return reject(new Error("Monaco AMD loader not found")); |
| 29 | window.require.config({ |
| 30 | paths: { vs: "https://cdn.jsdelivr.net/npm/monaco-editor@0.52.0/min/vs" }, |
| 31 | }); |
| 32 | window.require(["vs/editor/editor.main"], () => { |
| 33 | monacoLoaded = true; |
| 34 | resolve(); |
| 35 | }); |
| 36 | }); |
| 37 | } |
| 38 | |
| 39 | /* ---------------- Helpers ---------------- */ |
| 40 | async function fetchJSON(url) { |