@opencor/opencor 0.20250826.0 → 0.20250827.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +1 -1
  2. package/dist/opencor.es.js +1 -1
  3. package/package.json +5 -6
  4. package/src/App.vue +0 -7
  5. package/src/ContainerApp.vue +0 -21
  6. package/src/assets/app.css +0 -14
  7. package/src/assets/base.css +0 -31
  8. package/src/assets/logo.svg +0 -17
  9. package/src/common/common.ts +0 -86
  10. package/src/common/constants.ts +0 -12
  11. package/src/common/electron.ts +0 -23
  12. package/src/common/electronApi.ts +0 -63
  13. package/src/common/locCommon.ts +0 -170
  14. package/src/common/settings.ts +0 -95
  15. package/src/common/vueCommon.ts +0 -69
  16. package/src/components/BackgroundComponent.vue +0 -26
  17. package/src/components/BlockingMessageComponent.vue +0 -34
  18. package/src/components/ContentsComponent.vue +0 -277
  19. package/src/components/DragNDropComponent.vue +0 -35
  20. package/src/components/MainMenu.vue +0 -225
  21. package/src/components/OpenCOR.vue +0 -624
  22. package/src/components/dialogs/AboutDialog.vue +0 -51
  23. package/src/components/dialogs/BaseDialog.vue +0 -58
  24. package/src/components/dialogs/OpenRemoteDialog.vue +0 -37
  25. package/src/components/dialogs/ResetAllDialog.vue +0 -13
  26. package/src/components/dialogs/SettingsDialog.vue +0 -42
  27. package/src/components/dialogs/UpdateAvailableDialog.vue +0 -16
  28. package/src/components/dialogs/UpdateDownloadProgressDialog.vue +0 -11
  29. package/src/components/dialogs/UpdateErrorDialog.vue +0 -18
  30. package/src/components/dialogs/UpdateNotAvailableDialog.vue +0 -12
  31. package/src/components/propertyEditors/GraphsPropertyEditor.vue +0 -3
  32. package/src/components/propertyEditors/ParametersPropertyEditor.vue +0 -3
  33. package/src/components/propertyEditors/PropertyEditor.vue +0 -60
  34. package/src/components/propertyEditors/SimulationPropertyEditor.vue +0 -45
  35. package/src/components/propertyEditors/SolversPropertyEditor.vue +0 -3
  36. package/src/components/views/IssuesView.vue +0 -50
  37. package/src/components/views/SimulationExperimentUiView.vue +0 -154
  38. package/src/components/views/SimulationExperimentView.vue +0 -218
  39. package/src/components/widgets/GraphPanelWidget.vue +0 -140
  40. package/src/components/widgets/InputWidget.vue +0 -128
  41. package/src/libopencor/locApi.ts +0 -167
  42. package/src/libopencor/locFileApi.ts +0 -263
  43. package/src/libopencor/locLoggerApi.ts +0 -36
  44. package/src/libopencor/locSedApi.ts +0 -486
  45. package/src/libopencor/locUiJsonApi.ts +0 -485
  46. package/src/libopencor/locVersionApi.ts +0 -17
  47. package/src/libopencor/src/common.cpp +0 -67
  48. package/src/libopencor/src/common.h +0 -27
  49. package/src/libopencor/src/file.cpp +0 -72
  50. package/src/libopencor/src/file.h +0 -15
  51. package/src/libopencor/src/main.cpp +0 -78
  52. package/src/libopencor/src/sed.cpp +0 -348
  53. package/src/libopencor/src/sed.h +0 -53
  54. package/src/libopencor/src/version.cpp +0 -8
  55. package/src/libopencor/src/version.h +0 -5
  56. package/src/main.ts +0 -6
  57. package/src/types/types.d.ts +0 -9
package/README.md CHANGED
@@ -45,7 +45,7 @@ import '@opencor/opencor/style.css'
45
45
  </script>
46
46
  ```
47
47
 
48
- ### With `omex` prop provided
48
+ ### `omex` prop provided
49
49
 
50
50
  When an `omex` prop is provided, the component goes straight into OpenCOR's simulation mode, using the specified OMEX file.
51
51
 
@@ -8181,7 +8181,7 @@ async function wf() {
8181
8181
  console.error("Failed to load libOpenCOR's WebAssembly module:", n);
8182
8182
  }
8183
8183
  }
8184
- const kf = "0.20250826.0", Cf = { class: "space-y-7" }, Sf = { class: "text-center" }, xf = { class: "text-3xl font-bold" }, If = {
8184
+ const kf = "0.20250827.1", Cf = { class: "space-y-7" }, Sf = { class: "text-center" }, xf = { class: "text-3xl font-bold" }, If = {
8185
8185
  key: 0,
8186
8186
  class: "text-xl italic font-bold"
8187
8187
  }, Mf = { class: "text-sm italic" }, Bf = { class: "space-y-2" }, Rf = /* @__PURE__ */ Ie({
package/package.json CHANGED
@@ -9,7 +9,6 @@
9
9
  "description": "A Web-based modelling environment for organising, editing, simulating, and analysing CellML files.",
10
10
  "files": [
11
11
  "dist",
12
- "src",
13
12
  "README.md",
14
13
  "LICENSE"
15
14
  ],
@@ -40,26 +39,24 @@
40
39
  },
41
40
  "./style.css": "./dist/opencor.css"
42
41
  },
43
- "version": "0.20250826.0",
42
+ "version": "0.20250827.1",
44
43
  "peerDependencies": {
45
44
  "vue": "^3.4.21"
46
45
  },
47
46
  "dependencies": {
48
47
  "@primeuix/themes": "^1.2.3",
49
48
  "@primevue/auto-import-resolver": "4.2.5",
50
- "@tailwindcss/postcss": "^4.1.12",
51
- "@tailwindcss/vite": "^4.1.12",
52
49
  "@vueuse/core": "12.8.2",
53
50
  "js-cookie": "^3.0.5",
54
51
  "jsonschema": "^1.5.0",
55
52
  "primeicons": "^7.0.0",
56
53
  "primevue": "4.2.5",
57
54
  "quill": "^2.0.3",
58
- "tailwindcss": "^4.1.12",
59
- "tailwindcss-primeui": "^0.6.1",
60
55
  "ua-parser-js": "^2.0.4"
61
56
  },
62
57
  "devDependencies": {
58
+ "@tailwindcss/postcss": "^4.1.12",
59
+ "@tailwindcss/vite": "^4.1.12",
63
60
  "@types/js-cookie": "^3.0.6",
64
61
  "@types/node": "^24.3.0",
65
62
  "@types/plotly.js": "3.0.3",
@@ -70,6 +67,8 @@
70
67
  "autoprefixer": "^10.4.21",
71
68
  "eslint": "^9.34.0",
72
69
  "prettier": "^3.6.2",
70
+ "tailwindcss": "^4.1.12",
71
+ "tailwindcss-primeui": "^0.6.1",
73
72
  "unplugin-vue-components": "^29.0.0",
74
73
  "vite": "^7.1.3"
75
74
  },
package/src/App.vue DELETED
@@ -1,7 +0,0 @@
1
- <template>
2
- <OpenCOR />
3
- <!-- <OpenCOR omex="https://raw.githubusercontent.com/opencor/webapp/refs/heads/main/tests/models/lorenz.cellml" /> -->
4
- <!-- <OpenCOR omex="https://raw.githubusercontent.com/opencor/webapp/refs/heads/main/tests/models/lorenz.omex" /> -->
5
- <!-- <OpenCOR omex="https://raw.githubusercontent.com/opencor/webapp/refs/heads/main/tests/models/ui/lorenz.omex" /> -->
6
- <!-- <OpenCOR omex="https://models.physiomeproject.org/workspace/b7c/rawfile/e0ae8d2d56aaaa091e23e1ee7e84cacbda1dfb6b/lorenz.omex" /> -->
7
- </template>
@@ -1,21 +0,0 @@
1
- <template>
2
- <div class="h-screen">
3
- <Splitter class="h-full" layout="vertical">
4
- <SplitterPanel class="flex items-center justify-center bg-blue-500" :size="15">Top panel...</SplitterPanel>
5
- <SplitterPanel :size="50">
6
- <Splitter>
7
- <SplitterPanel class="flex items-center justify-center bg-red-500" :size="15">Left panel...</SplitterPanel>
8
- <SplitterPanel :size="50">
9
- <OpenCOR />
10
- <!-- <OpenCOR omex="https://raw.githubusercontent.com/opencor/webapp/refs/heads/main/tests/models/lorenz.cellml" /> -->
11
- <!-- <OpenCOR omex="https://raw.githubusercontent.com/opencor/webapp/refs/heads/main/tests/models/lorenz.omex" /> -->
12
- <!-- <OpenCOR omex="https://raw.githubusercontent.com/opencor/webapp/refs/heads/main/tests/models/ui/lorenz.omex" /> -->
13
- <!-- <OpenCOR omex="https://models.physiomeproject.org/workspace/b7c/rawfile/e0ae8d2d56aaaa091e23e1ee7e84cacbda1dfb6b/lorenz.omex" /> -->
14
- </SplitterPanel>
15
- <SplitterPanel class="flex items-center justify-center bg-red-500" :size="35">Right panel...</SplitterPanel>
16
- </Splitter>
17
- </SplitterPanel>
18
- <SplitterPanel class="flex items-center justify-center bg-blue-500" :size="35">Bottom panel...</SplitterPanel>
19
- </Splitter>
20
- </div>
21
- </template>
@@ -1,14 +0,0 @@
1
- @import './base.css';
2
-
3
- body {
4
- background-color: var(--p-content-background);
5
- color: var(--p-content-color);
6
- }
7
-
8
- a {
9
- color: var(--p-button-link-color);
10
- }
11
-
12
- :focus {
13
- outline: none !important;
14
- }
@@ -1,31 +0,0 @@
1
- @import 'tailwindcss';
2
- @import 'tailwindcss-primeui';
3
-
4
- :root {
5
- --border-color: var(--p-content-border-color);
6
- }
7
-
8
- body {
9
- margin: 0;
10
- font-family:
11
- Inter,
12
- -apple-system,
13
- BlinkMacSystemFont,
14
- 'Segoe UI',
15
- Roboto,
16
- Oxygen,
17
- Ubuntu,
18
- Cantarell,
19
- 'Fira Sans',
20
- 'Droid Sans',
21
- 'Helvetica Neue',
22
- sans-serif;
23
- text-rendering: optimizeLegibility;
24
- -webkit-font-smoothing: antialiased;
25
- -moz-osx-font-smoothing: grayscale;
26
- user-select: none;
27
- }
28
-
29
- .p-component {
30
- transition: none !important;
31
- }
@@ -1,17 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="OpenCOR logo" xml:space="preserve" height="704.92" width="828.12" version="1.1">
2
- <defs>
3
- <style>
4
- @font-face {
5
- font-family: "Brush Script MT";
6
- src: url(data:application/font-woff;charset=utf-8;base64,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ADIvugAcACMAAyu6AAYAQgADK7gAQhC4ABPcugA7AEIABhESOTAxNzU2Ej4BMzIVFAYHDgEHPgMzMhYVFA4BBxYzMjcVDgIjIi4CJwYjIicOAgcGIyI1ND4CNxI3AgU+ATU0IyIGBzYWBIzLdlpEIjcrOW1FNo1ZVywcEUqKZSMldMNMkYA2FC0mPBAgBCMvIU82LRkKKzVNXBOeWOYBIGNhJTK1YEoy50aYAQyeQRoVUis4qYMqc0EmFB1MkZxcDbFIRHhICQ0YBQgcQMt4NxlMQo+AgyABEL/+6KtokiclpYwIBQAAAAAAAAEAAAAUAAEAAQAGAAAAAAAGAAj/5QAAAEADBgABAAAAAAAAACsAWAABAAAAAAABAA8ApAABAAAAAAACAAYAwgABAAAAAAADACsBIQABAAAAAAAEABYBewABAAAAAAAFAA8BsgABAAAAAAAGAA0B3gABAAAAAAAHADcCXAABAAAAAQACAAgELAABAAAAAQACAAgGxgABAAAAAQAEABgEZwABAAAAAQAEABgHAQABAAAAAgACAAYC/AABAAAAAgAEABYDMQABAAAAAwACAAcEkAABAAAAAwAEABcEyAABAAAABAACAAcE8AABAAAABAAEABcFKAABAAAABQACAAYFqAABAAAABQAEABYF3QABAAAABgACAAcDWAABAAAABgACAAcGZAABAAAABgAEABcDkAABAAAABgAEABcGnAABAAAABwACAAYCogABAAAABwAEABYC1wABAAAACAACAAcGBAABAAAACAAEABcGPAABAAAACQACAAYFTgABAAAACQAEABYFgwABAAAADQACAAoDvgABAAAADQAEABoD/wADAAEEBgACAAwClAADAAEEBgAEACwCqQADAAEEBwACAAwC7gADAAEEBwAEACwDAwADAAEECQAAAFYAAAADAAEECQABAB4AhAADAAEECQACAAwAtAADAAEECQADAFYAyQADAAEECQAEACwBTQADAAEECQAFAB4BkgADAAEECQAGABoBwgADAAEECQAHAG4B7AADAAEECgACAA4DSAADAAEECgAEAC4DYAADAAEECwACABQDqAADAAEECwAEADQDyQADAAEEDAACABAEGgADAAEEDAAEADAENQADAAEEEAACAA4EgAADAAEEEAAEAC4EmAADAAEEEwACAA4E4AAD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)
7
- }
8
- </style>
9
- </defs>
10
- <path id="manPath" d="m479.01,689.07c-6.711-8.5316-3.885-23.925,7.3448-40.009,6.5227-9.3421,8.5394-15.013,8.5902-24.157,0.0426-7.6638,3.5823-13.54,13.454-22.332,12.603-11.225,19.377-25.66,27.763-59.158,1.4627-5.842,3.7519-13.996,5.0871-18.12,1.3352-4.1238,3.6186-11.714,5.074-16.868,3.4-12.038,10.2-26.342,15.274-32.131,2.1902-2.4986,9.1468-8.3594,15.459-13.024,7.5348-5.5681,12.551-10.323,14.603-13.842,4.8433-8.3049,12.499-25.931,11.637-26.793-1.5593-1.5593-8.3533,2.4805-20.353,12.102-7.9026,6.3364-14.943,10.848-19.713,12.631-5.211,1.9488-9.1123,4.5679-13.104,8.7965-6.1064,6.47-9.695,7.4939-13.096,3.7364-3.1873-3.522-2.5026-8.2907,2.8215-19.652,6.2882-13.419,9.5502-17.551,18.687-23.674,8.5052-5.6997,10.366-8.3553,14.623-20.874,5.836-17.159,15.768-22.418,29.015-15.365,3.2277,1.7182,6.9977,3.1298,8.3778,3.1367,4.7076,0.0237,18.441-5.5735,20.177-8.2237,0.95053-1.4507,2.236-8.0044,2.8565-14.563,0.75928-8.0254,2.2164-14.528,4.4549-19.88,8.5121-20.354,8.5304-20.446,6.8585-34.822-1.2954-11.138-1.2334-14.789,0.41019-24.158,2.9914-17.05,8.1857-26.597,23.763-43.675,10.15-11.127,13.401-15.549,14.076-19.148,0.93499-4.9839-0.15067-31.713-1.4793-36.422-1.1495-4.0738-2.3541-3.5107-6.0757,2.84-4.3497,7.4223-17.489,21.394-23.793,25.3-2.7492,1.7039-7.9249,5.3259-11.502,8.0491-5.5424,4.2198-6.8044,5.9872-8.5417,11.963-5.1496,17.714-13.988,29.16-31.571,40.883-7.3786,4.9196-12.593,9.4637-15.164,13.215-4.5938,6.7023-11.219,22.862-11.281,27.514-0.0519,3.908,3.9652,15.954,6.7245,20.165,2.0534,3.134,1.5825,4.7101-1.4071,4.7101-0.94651,0-5.0995-2.8117-9.2288-6.2482-7.9932-6.652-11.313-7.5084-17.236-4.4457-5.2843,2.7326-16.431,15.397-22.408,25.459-2.9335,4.9379-6.1521,8.978-7.1524,8.978-2.283,0-2.3697,0.90262,1.2546-13.047,3.984-15.333,7.1237-21.29,18.763-35.593,5.2701-6.4765,10.89-14.357,12.489-17.512,4.192-8.2727,15.494-35.391,18.797-45.104,3.4554-10.159,7.8016-17.201,16.173-26.204,24.065-25.879,32.929-37.075,36.9-46.615,5.6516-13.576,15.262-28.965,26.508-42.45,5.2891-6.3415,12.037-14.569,14.996-18.283,12.466-15.65,19.098-17.962,48.492-16.903,21.374,0.77084,24.635,0.03699,26.766-6.022,1.0088-2.8684,0.57569-4.2373-2.8494-9.0065-8.1518-11.351-12.635-25.103-12.648-38.792-0.014-15.598,4.7185-25.657,14.876-31.622,5.1095-3.0004,7.224-3.4079,19.77-3.8105,0,0,8.9592,0.2885,12.471,1.2847,3.5116,0.99628,4.8222,1.4298,6.2553,2.8628,1.4331,1.4331,4.5874,6.4189,6.0012,11.378,1.162,4.0759,3.7378,10.291,5.7238,13.811,3.2609,5.7799,3.6109,7.5222,3.6109,17.975,0,14.781-1.6976,20.277-8.3457,27.02-5.7509,5.8335-7.0626,9.0047-6.4296,15.545,0.35106,3.6274,1.9723,5.3925,12.276,13.366,17.434,13.49,20.515,20.013,16.873,35.712-5.7979,24.984-16.688,44.336-36.158,64.255-10.351,10.59-12.356,13.509-23.611,34.365-6.7646,12.535-12.891,24.03-13.616,25.544-1.1628,2.4309-0.34785,3.7969,7.0001,11.733,20.255,21.879,41.128,55.237,43.922,70.201,0.48358,2.5895,0.47675,8.4665-0.0151,13.06-0.7584,7.0819-1.4928,8.9484-4.8293,12.275-6.8582,6.8369-25.179,12.375-64.199,19.406l-22.775,4.1038-8.9974,10.481c-4.9485,5.7644-11.761,12.965-15.139,16.003-3.3778,3.0369-8.3862,8.9948-11.13,13.24-5.906,9.1378-15.649,19.589-27.342,29.329-6.8075,5.6706-8.7247,8.0692-9.7711,12.225-1.6299,6.4728-10.835,21.869-21.372,35.746-10.031,13.21-33,41.835-37.601,46.861-5.7982,6.3329-15.863,24.69-23.796,43.401-4.1574,9.8069-10.563,23.489-14.235,30.405-3.6714,6.916-8.6659,17.511-11.099,23.544-8.7704,21.75-12.282,25.156-27.398,26.567-7.5393,0.70403-8.0689,0.57243-10.589-2.6314z" fill="#366092" />
11
- <path id="greyDnaPath" fill="#a5a5a5" d="m564.03,260.47c-118.36,4.4375-430.18,44.788-529.25,184.25,1.3074-1.2904,2.6652-2.489,4.0312-3.5938,101.24-121.44,390.47-165.64,521.57-171.69,1.2255-2.9859,2.4343-5.9818,3.6562-8.9688zm-496.97,170.25c-15.686-0.16647-34.424,10.126-45.031,33.312-7.9791,17.44-12.616,41.654,0.34375,50.031,20.62,13.329,64.934-13.655,91.781-14.844,35.12-1.5562,5.2438,121.23,52.375,121.25-30.13-7.875-8.8325-114.3-42.062-127.56-33.301-13.294-80.6,30.822-100.78,17.375-14.828-9.88,1.292-40.04,10.351-51.78,12.401-16.08,43.904-35.53,58.813-9.53-3.236-11.64-13.581-18.12-25.782-18.25zm99.469,189.75c12.651,3.2016,23.09-9.6345,32.25-27.969,0.5587-1.1183,1.1069-2.2806,1.6562-3.4375-0.55254,1.1642-1.0942,2.3123-1.6562,3.4375-0.40776,0.81626-0.80575,1.644-1.2188,2.4375v23.594c0.14588,0.29907,0.28919,0.58447,0.4375,0.875,0.20385,0.4004,0.41686,0.80419,0.625,1.1875,0.13732,0.25268,0.26709,0.50463,0.40625,0.75,0.22094,0.38817,0.43042,0.75512,0.65625,1.125,0.12634,0.20752,0.27809,0.42237,0.40625,0.625,0.24537,0.38574,0.46728,0.76001,0.71875,1.125,0.12329,0.17823,0.24987,0.35791,0.375,0.53125,0.26611,0.36865,0.53906,0.71826,0.8125,1.0625,0.10864,0.13671,0.23388,0.2732,0.34375,0.40625,0.29174,0.35157,0.57592,0.70899,0.875,1.0312,0.10681,0.11597,0.20512,0.20138,0.3125,0.3125,0.31371,0.32349,0.64587,0.64697,0.96875,0.9375,0.0922,0.0842,0.18725,0.1682,0.28125,0.25,0.34728,0.29906,0.70362,0.58253,1.0625,0.84375,0.0726,0.0537,0.14545,0.10375,0.21875,0.15625v-53.406c2.4779-5.9788,4.8612-12.15,7.1875-18.312v71.312c0.39878-0.38384,0.79528-0.77942,1.1875-1.2188,0.31206-0.34954,0.62935-0.74156,0.9375-1.125-0.31051,0.38741-0.62299,0.77227-0.9375,1.125-0.39001,0.43739-0.79096,0.8367-1.1875,1.2188-0.99915,0.96263-2.017,1.7574-3.0625,2.3438,36.845,7.2625,43.186-120.39,81.969-135.88-16.232-3.495-28.053,10.806-37.688,31.344v-13c-2.4934-4.0796-5.4595-7.1055-9.0312-8.8438v44.156c-2.6768,7.4475-5.199,15.1-7.6562,22.656v-68.062c-0.33468,0.35491-0.69741,0.72315-1.0312,1.125,0.46534-0.56138,0.93915-1.0933,1.4062-1.5625-38.951,1.5759-42.944,118.04-71.625,116.84zm313.25-167.09c-0.24047,0.0623-0.48316,0.1706-0.71875,0.25-45.311,15.475-53.044,212.46-94.594,224.69-0.0592,0.017-0.1282,0.0141-0.1875,0.0312,0.0611,0.0256,0.1265,0.0693,0.1875,0.0937,60.972,24.462,73.98-191.37,95-224.56,0.0977-0.15381,0.2136-0.35229,0.3125-0.5zm-77.625,12.344c-46.454-0.63392-43.177,197.29-85.062,202.84,62.632,3.4058,60.715-180.97,86.156-202.78-0.37199-0.0298-0.72797-0.0575-1.0938-0.0625zm-172.56,51.375c-0.28205,0.58006-0.56136,1.1785-0.84375,1.7812v80.312c-2.1198,5.91-4.274,11.355-6.4688,16.062v-81.031c2.4735-6.317,4.8936-12.148,7.3125-17.125zm-12.04,106.9c-0.53442,0.82207-1.0794,1.5918-1.625,2.3125,0.54784-0.72162,1.0883-1.489,1.625-2.3125z" />
12
- <path id="redDnaPath" fill="#953734" d="m138.79,506.86c36.515-4.4398,26.91,125.84,63.42,127.48,5.4828,0.24536,7.9876-2.638,7.9876-2.633-32.082-8.2044-23.244-153.11-72.789-127.89,0,0,1.3806,3.0481,1.3806,3.0481zm417.42,84.965c19.811,54.112,44.398,101.74,87.802,102.04-27.162-15.188-47.554-72.282-68.936-129.44-7.0508,9.2725-13.332,16.878-18.866,27.395zm-29.51,62.58c13.742,19.669,33.092,37.915,52.188,38.835-23.42,5.5005-45.488-3.1519-61.65-16.191,2.9834-5.9131,6.0254-16.956,9.4629-22.644zm-46.83-201.05c30.745-8.966,49.02,57.96,54.97,75.399,3.523-13.472,7.7808-26.171,11.266-34.974-9.1273-18.746-42.358-75.998-66.293-40.438-0.0146,0.022-0.009,0.0135-0.0244,0.0354,0.0233-0.006,0.0745-0.0208,0.0817-0.0233zm-389.52,18.338c-9.1288-30.038-53.605-21.662-73.904,25.688-8.59,20.025-3.4045,49.875,15.005,51.85,18.278,1.9544,63.08-25.884,94.562-40.154,0,0,0.99305,2.2472,0.99305,2.2472-40.202,31.22-156.88,86.395-95.096-21.715,11.522-20.162,41.856-50.915,58.439-17.915zm-49.802-31.95c103.36-114.51,411.66-147.7,512.75-151.59-3.8868,10.077-9.6631,14.556-12.739,19.656-78.036,1.9201-373.36,30.325-489.71,125.94-3.5412,1.3806-7.2339,3.7512-10.294,5.9912zm336.58,122.49v110.18c2.2412,2.3816,4.6198,4.3909,7.1649,5.9375v-153.45c3.7902-19.628,7.4872-36.824,12.047-47.952v192.05c-3.9844,5.354-9.726,10.327-16.82,9.917-60.574-3.512-56.559-154.82-83.391-180.36-1.153-1.0962-2.4988-2.0996-3.971-2.7259,1.7738-1.0327,6.33-1.6223,9.0576-1.5661,35.605,0.72754,39.414,106.93,63.865,159.3v-41.606c4.7803-15.458,8.6304-32.665,12.047-49.729zm58.612-52.331v35.481c-4.0918,16.229-8.0176,33.029-12.047,49.021v-110.62c-2.7014-4.6972-5.4516-8.5852-8.2886-11.506v152.61c-3.739,12.433-7.6929,23.558-12.047,32.415v-191.51c0.003,0.001,0.006,0.001,0.009,0.001-0.004,0-0.009-0.001-0.0125-0.001-0.0226-0.004-0.0385-0.006-0.0623-0.01,0.0244-0.0244,0.0305-0.0305,0.0549-0.0561,3.4576-3.5938,7.4054-5.741,11.979-6.0828,34.866-2.6062,57.636,76.17,85.888,142.72-8.3985,6.2036-11.223,16.429-11.675,21.378-0.4419,4.8279,0.78979,11.624-2.0105,15.44-22.281-39.828-37.268-92.562-51.788-129.29zm-187.37-11.86c54.431-4.7498,25.025,147.31,69.59,170.54-66.292,2.1692-33.405-164.74-79.802-164.92,2.0905-2.1985,6.3916-5.2771,10.212-5.6104z" />
13
- <path id="opencorPath" fill="none" d="m27.782,611.49c103.7-139.25,419-177.25,535.91-181.85" />
14
- <text id="opencorText" stroke-linejoin="miter" style="writing-mode:lr-tb;letter-spacing:0px;text-anchor:end;word-spacing:0px;text-align:end;" stroke-width="2.5" transform="translate(5.731,-211.10242)" font-family="Brush Script MT" xml:space="preserve" stroke-linecap="butt" font-size="160px" line-height="125%" stroke="#7f7f7f" font-stretch="normal" font-variant="normal" font-style="normal" stroke-dasharray="none" font-weight="normal" fill="#a5a5a5">
15
- <textPath id="opencorTextPath" style="writing-mode:lr-tb;text-anchor:end;text-align:end;" xlink:href="#opencorPath" startOffset="100%" line-height="125%">Open<tspan id="tspan140" stroke-linejoin="miter" style="writing-mode:lr-tb;text-anchor:end;text-align:end;" stroke-width="2.5" font-family="Brush Script MT" stroke-linecap="butt" font-size="160px" line-height="125%" stroke="#244061" font-stretch="normal" font-variant="normal" font-style="normal" stroke-dasharray="none" font-weight="normal" fill="#366092">C</tspan>O<tspan id="tspan142" stroke-linejoin="miter" style="writing-mode:lr-tb;text-anchor:end;text-align:end;" stroke-width="2.5" font-family="Brush Script MT" stroke-linecap="butt" font-size="160px" line-height="125%" stroke="#632423" font-stretch="normal" font-variant="normal" font-style="normal" stroke-dasharray="none" font-weight="normal" fill="#953734">R</tspan></textPath>
16
- </text>
17
- </svg>
@@ -1,86 +0,0 @@
1
- import { UAParser } from 'ua-parser-js'
2
-
3
- import { electronApi } from './electronApi.js'
4
-
5
- // Some interfaces.
6
-
7
- export interface ISettingsGeneral {
8
- checkForUpdatesAtStartup: boolean
9
- }
10
-
11
- export interface ISettings {
12
- general: ISettingsGeneral
13
- }
14
-
15
- // Some methods to determine the operating system, whether the application is running on a mobile device, etc.
16
-
17
- const uaParser = new UAParser()
18
-
19
- export function isWindows(): boolean {
20
- return uaParser.getOS().name === 'Windows'
21
- }
22
-
23
- export function isLinux(): boolean {
24
- return uaParser.getOS().name === 'Linux'
25
- }
26
-
27
- export function isMacOs(): boolean {
28
- return uaParser.getOS().name === 'macOS'
29
- }
30
-
31
- export function isMobile(): boolean {
32
- return uaParser.getDevice().type === 'mobile'
33
- }
34
-
35
- // A method to determine whether the Ctrl or Cmd key is pressed, depending on the operating system.
36
-
37
- export function isCtrlOrCmd(event: KeyboardEvent): boolean {
38
- return isMacOs() ? event.metaKey : event.ctrlKey
39
- }
40
-
41
- // A method to enable/disable the main menu.
42
-
43
- export function enableDisableMainMenu(enable: boolean): void {
44
- electronApi?.enableDisableMainMenu(enable)
45
- }
46
-
47
- // A method to format a given number of milliseconds into a string.
48
-
49
- export function formatTime(time: number): string {
50
- const ms = Math.floor(time % 1000)
51
- const s = Math.floor((time / 1000) % 60)
52
- const m = Math.floor((time / (1000 * 60)) % 60)
53
- const h = Math.floor((time / (1000 * 60 * 60)) % 24)
54
- const d = Math.floor((time / (1000 * 60 * 60 * 24)) % 24)
55
- let res = ''
56
-
57
- if (d !== 0 || ((h !== 0 || m !== 0 || s !== 0 || ms !== 0) && res !== '')) {
58
- res += `${res === '' ? '' : ' '}${String(d)}d`
59
- }
60
-
61
- if (h !== 0 || ((m !== 0 || s !== 0 || ms !== 0) && res !== '')) {
62
- res += `${res === '' ? '' : ' '}${String(h)}h`
63
- }
64
-
65
- if (m !== 0 || ((s !== 0 || ms !== 0) && res !== '')) {
66
- res += `${res === '' ? '' : ' '}${String(m)}m`
67
- }
68
-
69
- if (s !== 0 || (ms !== 0 && res !== '')) {
70
- res += `${res === '' ? '' : ' '}${String(s)}s`
71
- }
72
-
73
- if (ms !== 0 || res === '') {
74
- res += `${res === '' ? '' : ' '}${String(ms)}ms`
75
- }
76
-
77
- return res
78
- }
79
-
80
- // A method to format an issue, i.e. make sure that it starts with a capital letter and ends with a period.
81
-
82
- export function formatIssue(issue: string): string {
83
- issue = issue.charAt(0).toUpperCase() + issue.slice(1)
84
-
85
- return issue.endsWith('.') ? issue : `${issue}.`
86
- }
@@ -1,12 +0,0 @@
1
- export const URI_SCHEME = 'opencor'
2
- export const FULL_URI_SCHEME = `${URI_SCHEME}://`
3
-
4
- export const SHORT_DELAY = 69
5
- export const MEDIUM_DELAY = 169
6
- export const LONG_DELAY = 369
7
-
8
- export const TOAST_LIFE = 3000
9
-
10
- const currentYear = new Date().getFullYear()
11
-
12
- export const COPYRIGHT = currentYear === 2025 ? '2025' : `2025-${String(currentYear)}`
@@ -1,23 +0,0 @@
1
- import { is } from '@electron-toolkit/utils'
2
-
3
- import electron from 'electron'
4
-
5
- export function isPackaged(): boolean {
6
- return electron.app.isPackaged
7
- }
8
-
9
- export function isDevMode(): boolean {
10
- return is.dev && !!process.env.ELECTRON_RENDERER_URL
11
- }
12
-
13
- export function isWindows(): boolean {
14
- return process.platform === 'win32'
15
- }
16
-
17
- export function isLinux(): boolean {
18
- return process.platform === 'linux'
19
- }
20
-
21
- export function isMacOs(): boolean {
22
- return process.platform === 'darwin'
23
- }
@@ -1,63 +0,0 @@
1
- import { type ISettings } from './common.js'
2
-
3
- export interface ISplashScreenInfo {
4
- copyright: string
5
- version: string
6
- }
7
-
8
- interface IElectronApi {
9
- // Note: this must be in sync with src/preload/index.ts.
10
-
11
- // Some general methods.
12
-
13
- operatingSystem: () => string
14
-
15
- // Splash screen window.
16
-
17
- onInitSplashScreenWindow: (callback: (info: ISplashScreenInfo) => void) => void
18
-
19
- // Renderer process asking the main process to do something for it.
20
-
21
- checkForUpdates: (atStartup: boolean) => void
22
- downloadAndInstallUpdate: () => void
23
- enableDisableMainMenu: (enable: boolean) => void
24
- enableDisableFileCloseAndCloseAllMenuItems: (enable: boolean) => void
25
- fileClosed: (filePath: string) => void
26
- fileIssue: (filePath: string) => void
27
- fileOpened: (filePath: string) => void
28
- filePath: (file: File) => string
29
- fileSelected(filePath: string): void
30
- filesOpened(filePaths: string[]): void
31
- installUpdateAndRestart: () => void
32
- loadSettings: () => Promise<ISettings>
33
- resetAll: () => void
34
- saveSettings: (settings: ISettings) => void
35
-
36
- // Renderer process listening to the main process.
37
-
38
- onAbout: (callback: () => void) => void
39
- onAction: (callback: (action: string) => void) => void
40
- onCheckForUpdates: (callback: () => void) => void
41
- onEnableDisableUi: (callback: (enable: boolean) => void) => void
42
- onOpen: (callback: (filePath: string) => void) => void
43
- onOpenRemote: (callback: () => void) => void
44
- onOpenSampleLorenz: (callback: () => void) => void
45
- onOpenSampleInteractiveLorenz: (callback: () => void) => void
46
- onClose: (callback: () => void) => void
47
- onCloseAll: (callback: () => void) => void
48
- onResetAll: (callback: () => void) => void
49
- onSelect: (callback: (filePath: string) => void) => void
50
- onSettings: (callback: () => void) => void
51
- onUpdateAvailable: (callback: (version: string) => void) => void
52
- onUpdateCheckError: (callback: (issue: string) => void) => void
53
- onUpdateDownloaded: (callback: () => void) => void
54
- onUpdateDownloadError: (callback: (issue: string) => void) => void
55
- onUpdateDownloadProgress: (callback: (percent: number) => void) => void
56
- onUpdateNotAvailable: (callback: () => void) => void
57
- }
58
-
59
- interface IWindow {
60
- electronApi: IElectronApi
61
- }
62
-
63
- export const electronApi: IElectronApi | undefined = (window as unknown as IWindow).electronApi
@@ -1,170 +0,0 @@
1
- import { electronApi } from './electronApi.js'
2
- import * as locApi from '../libopencor/locApi.js'
3
-
4
- // Some file-related methods.
5
-
6
- export function proxyUrl(url: string): string {
7
- return `https://corsproxy.io/?url=${encodeURIComponent(url)}`
8
- }
9
-
10
- export function isRemoteFilePath(filePath: string): boolean {
11
- return filePath.startsWith('http://') || filePath.startsWith('https://')
12
- }
13
-
14
- export function filePath(fileOrFilePath: string | File): string {
15
- return fileOrFilePath instanceof File
16
- ? electronApi !== undefined
17
- ? electronApi.filePath(fileOrFilePath)
18
- : fileOrFilePath.name
19
- : fileOrFilePath
20
- }
21
-
22
- export function file(fileOrFilePath: string | File): Promise<locApi.File> {
23
- if (typeof fileOrFilePath === 'string') {
24
- if (isRemoteFilePath(fileOrFilePath)) {
25
- return new Promise((resolve, reject) => {
26
- fetch(proxyUrl(fileOrFilePath))
27
- .then((response) => {
28
- if (response.ok) {
29
- return response.arrayBuffer()
30
- }
31
-
32
- throw new Error(`The server responded with a status of ${String(response.status)}.`)
33
- })
34
- .then((arrayBuffer) => {
35
- const fileContents = new Uint8Array(arrayBuffer)
36
-
37
- resolve(new locApi.File(filePath(fileOrFilePath), fileContents))
38
- })
39
- .catch((error: unknown) => {
40
- reject(error instanceof Error ? error : new Error(String(error)))
41
- })
42
- })
43
- }
44
-
45
- return new Promise((resolve, reject) => {
46
- if (electronApi !== undefined) {
47
- resolve(new locApi.File(filePath(fileOrFilePath)))
48
- } else {
49
- reject(new Error('Local files cannot be opened.'))
50
- }
51
- })
52
- }
53
-
54
- return new Promise((resolve, reject) => {
55
- fileOrFilePath
56
- .arrayBuffer()
57
- .then((arrayBuffer) => {
58
- const fileContents = new Uint8Array(arrayBuffer)
59
-
60
- resolve(new locApi.File(filePath(fileOrFilePath), fileContents))
61
- })
62
- .catch((error: unknown) => {
63
- reject(error instanceof Error ? error : new Error(String(error)))
64
- })
65
- })
66
- }
67
-
68
- // A method to retrieve the simulation data information for a given name from an instance task.
69
-
70
- export enum ESimulationDataInfoType {
71
- UNKNOWN,
72
- VOI,
73
- STATE,
74
- RATE,
75
- CONSTANT,
76
- COMPUTED_CONSTANT,
77
- ALGEBRAIC
78
- }
79
-
80
- export interface ISimulationDataInfo {
81
- type: ESimulationDataInfoType
82
- index: number
83
- }
84
-
85
- export function simulationDataInfo(instanceTask: locApi.SedInstanceTask, name: string): ISimulationDataInfo {
86
- if (name === '') {
87
- return {
88
- type: ESimulationDataInfoType.UNKNOWN,
89
- index: -1
90
- }
91
- }
92
-
93
- if (name === instanceTask.voiName()) {
94
- return {
95
- type: ESimulationDataInfoType.VOI,
96
- index: -1
97
- }
98
- }
99
-
100
- for (let i = 0; i < instanceTask.stateCount(); i++) {
101
- if (name === instanceTask.stateName(i)) {
102
- return {
103
- type: ESimulationDataInfoType.STATE,
104
- index: i
105
- }
106
- }
107
- }
108
-
109
- for (let i = 0; i < instanceTask.rateCount(); i++) {
110
- if (name === instanceTask.rateName(i)) {
111
- return {
112
- type: ESimulationDataInfoType.RATE,
113
- index: i
114
- }
115
- }
116
- }
117
-
118
- for (let i = 0; i < instanceTask.constantCount(); i++) {
119
- if (name === instanceTask.constantName(i)) {
120
- return {
121
- type: ESimulationDataInfoType.CONSTANT,
122
- index: i
123
- }
124
- }
125
- }
126
-
127
- for (let i = 0; i < instanceTask.computedConstantCount(); i++) {
128
- if (name === instanceTask.computedConstantName(i)) {
129
- return {
130
- type: ESimulationDataInfoType.COMPUTED_CONSTANT,
131
- index: i
132
- }
133
- }
134
- }
135
-
136
- for (let i = 0; i < instanceTask.algebraicCount(); i++) {
137
- if (name === instanceTask.algebraicName(i)) {
138
- return {
139
- type: ESimulationDataInfoType.ALGEBRAIC,
140
- index: i
141
- }
142
- }
143
- }
144
-
145
- return {
146
- type: ESimulationDataInfoType.UNKNOWN,
147
- index: -1
148
- }
149
- }
150
-
151
- // A method to retrieve the simulation data for a given name from an instance task.
152
-
153
- export function simulationData(instanceTask: locApi.SedInstanceTask, info: ISimulationDataInfo): number[] {
154
- switch (info.type) {
155
- case ESimulationDataInfoType.VOI:
156
- return instanceTask.voi()
157
- case ESimulationDataInfoType.STATE:
158
- return instanceTask.state(info.index)
159
- case ESimulationDataInfoType.RATE:
160
- return instanceTask.rate(info.index)
161
- case ESimulationDataInfoType.CONSTANT:
162
- return instanceTask.constant(info.index)
163
- case ESimulationDataInfoType.COMPUTED_CONSTANT:
164
- return instanceTask.computedConstant(info.index)
165
- case ESimulationDataInfoType.ALGEBRAIC:
166
- return instanceTask.algebraic(info.index)
167
- default:
168
- return []
169
- }
170
- }
@@ -1,95 +0,0 @@
1
- import jsCookie from 'js-cookie'
2
-
3
- import { type ISettings, type ISettingsGeneral } from './common.js'
4
- import { electronApi } from './electronApi.js'
5
-
6
- class Settings {
7
- private static _instance: Settings | null = null
8
- private _settings!: ISettings
9
- private _isInitialised = false
10
- private _initialisationListeners: (() => void)[] = []
11
-
12
- private constructor() {
13
- // Start with some default settings and then load them.
14
- // Note: to have default settings is critical when running the desktop version of OpenCOR since they are loaded
15
- // asynchronously, so we need to ensure that our settings are always defined. This is not the case for the
16
- // web version of OpenCOR, where we can load our settings directly from the cookies.
17
-
18
- this.reset()
19
- this.load()
20
- }
21
-
22
- static instance(): Settings {
23
- this._instance ??= new Settings()
24
-
25
- return this._instance
26
- }
27
-
28
- private emitInitialised(): void {
29
- this._isInitialised = true
30
-
31
- this._initialisationListeners.forEach((callback) => {
32
- callback()
33
- })
34
-
35
- this._initialisationListeners = []
36
- }
37
-
38
- onInitialised(callback: () => void): void {
39
- if (this._isInitialised) {
40
- callback()
41
- } else {
42
- this._initialisationListeners.push(callback)
43
- }
44
- }
45
-
46
- load(): void {
47
- if (electronApi !== undefined) {
48
- void electronApi.loadSettings().then((settings: ISettings) => {
49
- this._settings = settings
50
-
51
- this.emitInitialised()
52
- })
53
- } else {
54
- const cookieData = jsCookie.get('settings')
55
-
56
- if (cookieData !== undefined) {
57
- try {
58
- this._settings = JSON.parse(cookieData)
59
- } catch (error: unknown) {
60
- console.error('Failed to parse settings from cookie, so resetting to defaults:', error)
61
-
62
- this.reset()
63
- }
64
- }
65
-
66
- this.emitInitialised()
67
- }
68
- }
69
-
70
- save(): void {
71
- if (electronApi !== undefined) {
72
- electronApi.saveSettings(this._settings)
73
- } else {
74
- jsCookie.set('settings', JSON.stringify(this._settings), { expires: 365 })
75
- }
76
- }
77
-
78
- reset(): void {
79
- this._settings = {
80
- general: {
81
- checkForUpdatesAtStartup: true
82
- }
83
- }
84
- }
85
-
86
- toString(): string {
87
- return JSON.stringify(this._settings, null, 2)
88
- }
89
-
90
- get general(): ISettingsGeneral {
91
- return this._settings.general
92
- }
93
- }
94
-
95
- export const settings = Settings.instance()