1import { loadBuiltinTheme, registerBuiltinLanguages, startProjectApp, type ProjectAppConfig } from 'minwebide';
2import { openNumblWorkbench } from './ide';
3import { registerMatlabLanguage } from './numbl/language';
4import { sampleWorkspace } from './sampleWorkspace';
6const config: ProjectAppConfig = {
7 appId: 'numbl-web-ide',
8 appName: 'numbl web IDE',
9 assembleWorkbench: openNumblWorkbench,
10 startingFiles: ['/waves.m', '/main.m', '/README.md'],
11 landing: {
12 subtitle: 'Run MATLAB-syntax .m files in your browser. Projects are stored locally, in your browser.',
13 links: [
14 { label: 'numbl.org', href: 'https://numbl.org' },
15 { label: 'github.com/concept-collection/numbl-web-ide', href: 'https://github.com/concept-collection/numbl-web-ide' },
16 ],
17 sampleWorkspace,
18 sampleButtonTitle: 'Seeded with runnable scripts: plots, a 3-D surface, an animation, and file output',
19 emptyWorkspace: (project) => ({
20 '/main.m': `% ${project.name}\n% Write MATLAB-syntax code here and press the run button (▶).\n\ndisp('hello from numbl');\n`,
21 }),
22 },
23};
25async function start(): Promise<void> {
26 // dev never uses a service worker (isolation comes from server headers) —
27 // unregister any stale coi-serviceworker left over from a production
28 // build or an earlier version, since a controlling stale SW can block
29 // module workers with mismatched COEP headers
30 if (import.meta.env.DEV && 'serviceWorker' in navigator) {
31 const registrations = await navigator.serviceWorker.getRegistrations();
32 if (registrations.length > 0) {
33 await Promise.all(registrations.map(r => r.unregister()));
34 if (navigator.serviceWorker.controller) {
35 location.reload();
36 return;
37 }
38 }
39 }
41 // one-time global setup: theme + languages are shared by all views;
42 // MATLAB registers last so it wins the .m extension
43 const theme = await loadBuiltinTheme('dark_modern');
44 await registerBuiltinLanguages(theme);
45 registerMatlabLanguage();
47 await startProjectApp(document.getElementById('app')!, theme, config);
48}
50start();