import { loadBuiltinTheme, registerBuiltinLanguages, startProjectApp, type ProjectAppConfig } from 'minwebide'; import { openNumblWorkbench } from './ide'; import { registerMatlabLanguage } from './numbl/language'; import { sampleWorkspace } from './sampleWorkspace'; const config: ProjectAppConfig = { appId: 'numbl-web-ide', appName: 'numbl web IDE', assembleWorkbench: openNumblWorkbench, startingFiles: ['/waves.m', '/main.m', '/README.md'], landing: { subtitle: 'Run MATLAB-syntax .m files in your browser. Projects are stored locally, in your browser.', links: [ { label: 'numbl.org', href: 'https://numbl.org' }, { label: 'github.com/concept-collection/numbl-web-ide', href: 'https://github.com/concept-collection/numbl-web-ide' }, ], sampleWorkspace, sampleButtonTitle: 'Seeded with runnable scripts: plots, a 3-D surface, an animation, and file output', emptyWorkspace: (project) => ({ '/main.m': `% ${project.name}\n% Write MATLAB-syntax code here and press the run button (▶).\n\ndisp('hello from numbl');\n`, }), }, }; async function start(): Promise { // dev never uses a service worker (isolation comes from server headers) — // unregister any stale coi-serviceworker left over from a production // build or an earlier version, since a controlling stale SW can block // module workers with mismatched COEP headers if (import.meta.env.DEV && 'serviceWorker' in navigator) { const registrations = await navigator.serviceWorker.getRegistrations(); if (registrations.length > 0) { await Promise.all(registrations.map(r => r.unregister())); if (navigator.serviceWorker.controller) { location.reload(); return; } } } // one-time global setup: theme + languages are shared by all views; // MATLAB registers last so it wins the .m extension const theme = await loadBuiltinTheme('dark_modern'); await registerBuiltinLanguages(theme); registerMatlabLanguage(); await startProjectApp(document.getElementById('app')!, theme, config); } start();