matterviz 0.3.6 → 0.4.0

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 (926) hide show
  1. package/dist/EmptyState.svelte.d.ts +9 -0
  2. package/dist/FilePicker.svelte +360 -0
  3. package/dist/FilePicker.svelte.d.ts +17 -0
  4. package/dist/Icon.svelte +44 -0
  5. package/dist/Icon.svelte.d.ts +13 -0
  6. package/dist/MillerIndexInput.svelte +66 -0
  7. package/dist/MillerIndexInput.svelte.d.ts +7 -0
  8. package/dist/api/mp.d.ts +6 -0
  9. package/dist/api/mp.js +22 -0
  10. package/dist/api/optimade.d.ts +45 -0
  11. package/dist/api/optimade.js +141 -0
  12. package/dist/app.css +244 -0
  13. package/dist/brillouin/BrillouinZone.svelte +554 -0
  14. package/dist/brillouin/BrillouinZone.svelte.d.ts +84 -0
  15. package/dist/brillouin/BrillouinZoneControls.svelte +144 -0
  16. package/dist/brillouin/BrillouinZoneControls.svelte.d.ts +17 -0
  17. package/dist/brillouin/BrillouinZoneExportPane.svelte +146 -0
  18. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +15 -0
  19. package/dist/brillouin/BrillouinZoneInfoPane.svelte +146 -0
  20. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +13 -0
  21. package/dist/brillouin/BrillouinZoneScene.svelte +522 -0
  22. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +49 -0
  23. package/dist/brillouin/BrillouinZoneTooltip.svelte +83 -0
  24. package/dist/brillouin/BrillouinZoneTooltip.svelte.d.ts +8 -0
  25. package/dist/brillouin/compute.d.ts +17 -0
  26. package/dist/brillouin/compute.js +422 -0
  27. package/dist/brillouin/index.d.ts +8 -0
  28. package/dist/brillouin/index.js +7 -0
  29. package/dist/brillouin/types.d.ts +43 -0
  30. package/dist/brillouin/types.js +1 -0
  31. package/dist/chempot-diagram/ChemPotDiagram.svelte +328 -0
  32. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +13 -0
  33. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +843 -0
  34. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +16 -0
  35. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +3191 -0
  36. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +16 -0
  37. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +7 -0
  38. package/dist/chempot-diagram/async-compute.svelte.d.ts +3 -0
  39. package/dist/chempot-diagram/async-compute.svelte.js +80 -0
  40. package/dist/chempot-diagram/chempot-worker.d.ts +1 -0
  41. package/dist/chempot-diagram/chempot-worker.js +12 -0
  42. package/dist/chempot-diagram/color.d.ts +10 -0
  43. package/dist/chempot-diagram/color.js +32 -0
  44. package/dist/chempot-diagram/compute.d.ts +48 -0
  45. package/dist/chempot-diagram/compute.js +804 -0
  46. package/dist/chempot-diagram/index.d.ts +6 -0
  47. package/dist/chempot-diagram/index.js +6 -0
  48. package/dist/chempot-diagram/pointer.d.ts +16 -0
  49. package/dist/chempot-diagram/pointer.js +40 -0
  50. package/dist/chempot-diagram/temperature.d.ts +15 -0
  51. package/dist/chempot-diagram/temperature.js +34 -0
  52. package/dist/chempot-diagram/types.d.ts +81 -0
  53. package/dist/chempot-diagram/types.js +28 -0
  54. package/dist/colors/index.d.ts +47 -0
  55. package/dist/colors/index.js +204 -0
  56. package/dist/composition/BarChart.svelte +297 -0
  57. package/dist/composition/BarChart.svelte.d.ts +39 -0
  58. package/dist/composition/BubbleChart.svelte +218 -0
  59. package/dist/composition/BubbleChart.svelte.d.ts +28 -0
  60. package/dist/composition/Composition.svelte +165 -0
  61. package/dist/composition/Composition.svelte.d.ts +15 -0
  62. package/dist/composition/Formula.svelte +268 -0
  63. package/dist/composition/Formula.svelte.d.ts +19 -0
  64. package/dist/composition/FormulaFilter.svelte +1263 -0
  65. package/dist/composition/FormulaFilter.svelte.d.ts +51 -0
  66. package/dist/composition/PieChart.svelte +324 -0
  67. package/dist/composition/PieChart.svelte.d.ts +37 -0
  68. package/dist/composition/chem-sys.d.ts +8 -0
  69. package/dist/composition/chem-sys.js +85 -0
  70. package/dist/composition/format.d.ts +15 -0
  71. package/dist/composition/format.js +111 -0
  72. package/dist/composition/index.d.ts +21 -0
  73. package/dist/composition/index.js +15 -0
  74. package/dist/composition/parse.d.ts +56 -0
  75. package/dist/composition/parse.js +486 -0
  76. package/dist/constants.d.ts +29 -0
  77. package/dist/constants.js +99 -0
  78. package/dist/controls.d.ts +14 -0
  79. package/dist/controls.js +30 -0
  80. package/dist/convex-hull/ConvexHull.svelte +157 -0
  81. package/dist/convex-hull/ConvexHull.svelte.d.ts +13 -0
  82. package/dist/convex-hull/ConvexHull2D.svelte +827 -0
  83. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +11 -0
  84. package/dist/convex-hull/ConvexHull3D.svelte +1801 -0
  85. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +8 -0
  86. package/dist/convex-hull/ConvexHull4D.svelte +1394 -0
  87. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +8 -0
  88. package/dist/convex-hull/ConvexHullControls.svelte +535 -0
  89. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +48 -0
  90. package/dist/convex-hull/ConvexHullInfoPane.svelte +125 -0
  91. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +20 -0
  92. package/dist/convex-hull/ConvexHullStats.svelte +929 -0
  93. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +17 -0
  94. package/dist/convex-hull/ConvexHullTooltip.svelte +131 -0
  95. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +33 -0
  96. package/dist/convex-hull/GasPressureControls.svelte +247 -0
  97. package/dist/convex-hull/GasPressureControls.svelte.d.ts +11 -0
  98. package/dist/convex-hull/StructurePopup.svelte +151 -0
  99. package/dist/convex-hull/StructurePopup.svelte.d.ts +18 -0
  100. package/dist/convex-hull/TemperatureSlider.svelte +140 -0
  101. package/dist/convex-hull/TemperatureSlider.svelte.d.ts +8 -0
  102. package/dist/convex-hull/barycentric-coords.d.ts +18 -0
  103. package/dist/convex-hull/barycentric-coords.js +182 -0
  104. package/dist/convex-hull/demo-temperature.d.ts +6 -0
  105. package/dist/convex-hull/demo-temperature.js +38 -0
  106. package/dist/convex-hull/gas-thermodynamics.d.ts +16 -0
  107. package/dist/convex-hull/gas-thermodynamics.js +306 -0
  108. package/dist/convex-hull/helpers.d.ts +117 -0
  109. package/dist/convex-hull/helpers.js +718 -0
  110. package/dist/convex-hull/index.d.ts +119 -0
  111. package/dist/convex-hull/index.js +58 -0
  112. package/dist/convex-hull/thermodynamics.d.ts +67 -0
  113. package/dist/convex-hull/thermodynamics.js +1757 -0
  114. package/dist/convex-hull/types.d.ts +162 -0
  115. package/dist/convex-hull/types.js +36 -0
  116. package/dist/coordination/CoordinationBarPlot.svelte +311 -0
  117. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +30 -0
  118. package/dist/coordination/calc-coordination.d.ts +15 -0
  119. package/dist/coordination/calc-coordination.js +63 -0
  120. package/dist/coordination/index.d.ts +8 -0
  121. package/dist/coordination/index.js +7 -0
  122. package/dist/effects.svelte.d.ts +12 -0
  123. package/dist/effects.svelte.js +37 -0
  124. package/dist/element/BohrAtom.svelte.d.ts +20 -0
  125. package/dist/element/ElementHeading.svelte +26 -0
  126. package/dist/element/ElementHeading.svelte.d.ts +8 -0
  127. package/dist/element/ElementPhoto.svelte +57 -0
  128. package/dist/element/ElementPhoto.svelte.d.ts +9 -0
  129. package/dist/element/ElementStats.svelte +80 -0
  130. package/dist/element/ElementStats.svelte.d.ts +8 -0
  131. package/dist/element/ElementTile.svelte +484 -0
  132. package/dist/element/ElementTile.svelte.d.ts +29 -0
  133. package/dist/element/Nucleus.svelte.d.ts +17 -0
  134. package/dist/element/data.d.ts +2 -0
  135. package/dist/element/data.js +2 -0
  136. package/dist/element/index.d.ts +8 -0
  137. package/dist/element/index.js +7 -0
  138. package/dist/element/types.d.ts +57 -0
  139. package/dist/element/types.js +1 -0
  140. package/dist/feedback/ClickFeedback.svelte +58 -0
  141. package/dist/feedback/ClickFeedback.svelte.d.ts +12 -0
  142. package/dist/feedback/DragOverlay.svelte +42 -0
  143. package/dist/feedback/DragOverlay.svelte.d.ts +7 -0
  144. package/dist/feedback/Spinner.svelte.d.ts +7 -0
  145. package/dist/feedback/StatusMessage.svelte.d.ts +9 -0
  146. package/dist/feedback/index.d.ts +4 -0
  147. package/dist/feedback/index.js +4 -0
  148. package/dist/fermi-surface/FermiSlice.svelte +197 -0
  149. package/dist/fermi-surface/FermiSlice.svelte.d.ts +24 -0
  150. package/dist/fermi-surface/FermiSurface.svelte +606 -0
  151. package/dist/fermi-surface/FermiSurface.svelte.d.ts +83 -0
  152. package/dist/fermi-surface/FermiSurfaceControls.svelte +448 -0
  153. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +35 -0
  154. package/dist/fermi-surface/FermiSurfaceScene.svelte +797 -0
  155. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +50 -0
  156. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +85 -0
  157. package/dist/fermi-surface/FermiSurfaceTooltip.svelte.d.ts +8 -0
  158. package/dist/fermi-surface/compute.d.ts +5 -0
  159. package/dist/fermi-surface/compute.js +538 -0
  160. package/dist/fermi-surface/constants.d.ts +9 -0
  161. package/dist/fermi-surface/constants.js +27 -0
  162. package/dist/fermi-surface/export.d.ts +5 -0
  163. package/dist/fermi-surface/export.js +51 -0
  164. package/dist/fermi-surface/index.d.ts +12 -0
  165. package/dist/fermi-surface/index.js +13 -0
  166. package/dist/fermi-surface/marching-cubes.d.ts +2 -0
  167. package/dist/fermi-surface/marching-cubes.js +2 -0
  168. package/dist/fermi-surface/parse.d.ts +2 -0
  169. package/dist/fermi-surface/parse.js +494 -0
  170. package/dist/fermi-surface/symmetry.d.ts +3 -0
  171. package/dist/fermi-surface/symmetry.js +46 -0
  172. package/dist/fermi-surface/types.d.ts +111 -0
  173. package/dist/fermi-surface/types.js +4 -0
  174. package/dist/heatmap-matrix/HeatmapMatrix.svelte +1547 -0
  175. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +110 -0
  176. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +225 -0
  177. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +30 -0
  178. package/dist/heatmap-matrix/index.d.ts +53 -0
  179. package/dist/heatmap-matrix/index.js +100 -0
  180. package/dist/heatmap-matrix/shared.d.ts +2 -0
  181. package/dist/heatmap-matrix/shared.js +4 -0
  182. package/dist/icons.d.ts +569 -0
  183. package/dist/icons.js +648 -0
  184. package/dist/index.d.ts +39 -0
  185. package/dist/index.js +39 -0
  186. package/dist/io/decompress.d.ts +11 -0
  187. package/dist/io/decompress.js +76 -0
  188. package/dist/io/export.d.ts +16 -0
  189. package/dist/io/export.js +338 -0
  190. package/dist/io/fetch.d.ts +5 -0
  191. package/dist/io/fetch.js +43 -0
  192. package/dist/io/file-drop.d.ts +7 -0
  193. package/dist/io/file-drop.js +42 -0
  194. package/dist/io/index.d.ts +7 -0
  195. package/dist/io/index.js +6 -0
  196. package/dist/io/is-binary.d.ts +1 -0
  197. package/dist/io/is-binary.js +20 -0
  198. package/dist/io/types.d.ts +8 -0
  199. package/dist/io/types.js +1 -0
  200. package/dist/io/url-drop.d.ts +2 -0
  201. package/dist/io/url-drop.js +154 -0
  202. package/dist/isosurface/Isosurface.svelte +285 -0
  203. package/dist/isosurface/Isosurface.svelte.d.ts +8 -0
  204. package/dist/isosurface/IsosurfaceControls.svelte +277 -0
  205. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +9 -0
  206. package/dist/isosurface/index.d.ts +5 -0
  207. package/dist/isosurface/index.js +6 -0
  208. package/dist/isosurface/parse.d.ts +6 -0
  209. package/dist/isosurface/parse.js +552 -0
  210. package/dist/isosurface/slice.d.ts +11 -0
  211. package/dist/isosurface/slice.js +141 -0
  212. package/dist/isosurface/types.d.ts +56 -0
  213. package/dist/isosurface/types.js +227 -0
  214. package/dist/keyboard.d.ts +3 -0
  215. package/dist/keyboard.js +23 -0
  216. package/dist/labels.d.ts +53 -0
  217. package/dist/labels.js +278 -0
  218. package/dist/layout/FullscreenToggle.svelte +50 -0
  219. package/dist/layout/FullscreenToggle.svelte.d.ts +7 -0
  220. package/dist/layout/InfoCard.svelte +120 -0
  221. package/dist/layout/InfoCard.svelte.d.ts +21 -0
  222. package/dist/layout/InfoTag.svelte +185 -0
  223. package/dist/layout/InfoTag.svelte.d.ts +19 -0
  224. package/dist/layout/PropertyFilter.svelte +247 -0
  225. package/dist/layout/PropertyFilter.svelte.d.ts +24 -0
  226. package/dist/layout/SettingsSection.svelte +148 -0
  227. package/dist/layout/SettingsSection.svelte.d.ts +17 -0
  228. package/dist/layout/SubpageGrid.svelte +82 -0
  229. package/dist/layout/SubpageGrid.svelte.d.ts +14 -0
  230. package/dist/layout/fullscreen.d.ts +9 -0
  231. package/dist/layout/fullscreen.js +53 -0
  232. package/dist/layout/index.d.ts +10 -0
  233. package/dist/layout/index.js +8 -0
  234. package/dist/layout/json-tree/JsonNode.svelte +548 -0
  235. package/dist/layout/json-tree/JsonNode.svelte.d.ts +11 -0
  236. package/dist/layout/json-tree/JsonTree.svelte +1230 -0
  237. package/dist/layout/json-tree/JsonTree.svelte.d.ts +6 -0
  238. package/dist/layout/json-tree/JsonValue.svelte.d.ts +9 -0
  239. package/dist/layout/json-tree/index.d.ts +3 -0
  240. package/dist/layout/json-tree/index.js +3 -0
  241. package/dist/layout/json-tree/types.d.ts +74 -0
  242. package/dist/layout/json-tree/types.js +2 -0
  243. package/dist/layout/json-tree/utils.d.ts +29 -0
  244. package/dist/layout/json-tree/utils.js +642 -0
  245. package/dist/marching-cubes.d.ts +14 -0
  246. package/dist/marching-cubes.js +535 -0
  247. package/dist/math.d.ts +105 -0
  248. package/dist/math.js +920 -0
  249. package/dist/overlays/ContextMenu.svelte +162 -0
  250. package/dist/overlays/ContextMenu.svelte.d.ts +25 -0
  251. package/dist/overlays/CopyButton.svelte +45 -0
  252. package/dist/overlays/CopyButton.svelte.d.ts +8 -0
  253. package/dist/overlays/DragControlTab.svelte +98 -0
  254. package/dist/overlays/DragControlTab.svelte.d.ts +8 -0
  255. package/dist/overlays/DraggablePane.svelte +487 -0
  256. package/dist/overlays/DraggablePane.svelte.d.ts +36 -0
  257. package/dist/overlays/InfoPaneCards.svelte +149 -0
  258. package/dist/overlays/InfoPaneCards.svelte.d.ts +22 -0
  259. package/dist/overlays/index.d.ts +3 -0
  260. package/dist/overlays/index.js +3 -0
  261. package/dist/periodic-table/PeriodicTable.svelte +480 -0
  262. package/dist/periodic-table/PeriodicTable.svelte.d.ts +55 -0
  263. package/dist/periodic-table/PeriodicTableControls.svelte +557 -0
  264. package/dist/periodic-table/PeriodicTableControls.svelte.d.ts +24 -0
  265. package/dist/periodic-table/PropertySelect.svelte +38 -0
  266. package/dist/periodic-table/PropertySelect.svelte.d.ts +13 -0
  267. package/dist/periodic-table/TableInset.svelte.d.ts +9 -0
  268. package/dist/periodic-table/index.d.ts +10 -0
  269. package/dist/periodic-table/index.js +4 -0
  270. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +1092 -0
  271. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +44 -0
  272. package/dist/phase-diagram/PhaseDiagramControls.svelte +444 -0
  273. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +30 -0
  274. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +127 -0
  275. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +15 -0
  276. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +184 -0
  277. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +19 -0
  278. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +391 -0
  279. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +16 -0
  280. package/dist/phase-diagram/TdbInfoPanel.svelte +203 -0
  281. package/dist/phase-diagram/TdbInfoPanel.svelte.d.ts +12 -0
  282. package/dist/phase-diagram/build-diagram.d.ts +11 -0
  283. package/dist/phase-diagram/build-diagram.js +160 -0
  284. package/dist/phase-diagram/colors.d.ts +35 -0
  285. package/dist/phase-diagram/colors.js +51 -0
  286. package/dist/phase-diagram/diagram-input.d.ts +29 -0
  287. package/dist/phase-diagram/diagram-input.js +3 -0
  288. package/dist/phase-diagram/index.d.ts +13 -0
  289. package/dist/phase-diagram/index.js +11 -0
  290. package/dist/phase-diagram/parse.d.ts +55 -0
  291. package/dist/phase-diagram/parse.js +273 -0
  292. package/dist/phase-diagram/svg-to-diagram.d.ts +2 -0
  293. package/dist/phase-diagram/svg-to-diagram.js +867 -0
  294. package/dist/phase-diagram/types.d.ts +93 -0
  295. package/dist/phase-diagram/types.js +1 -0
  296. package/dist/phase-diagram/utils.d.ts +118 -0
  297. package/dist/phase-diagram/utils.js +600 -0
  298. package/dist/plot/bar/BarPlot.svelte +1755 -0
  299. package/dist/plot/bar/BarPlot.svelte.d.ts +84 -0
  300. package/dist/plot/bar/BarPlotControls.svelte +67 -0
  301. package/dist/plot/bar/BarPlotControls.svelte.d.ts +18 -0
  302. package/dist/plot/bar/SpacegroupBarPlot.svelte +293 -0
  303. package/dist/plot/bar/SpacegroupBarPlot.svelte.d.ts +9 -0
  304. package/dist/plot/bar/data.d.ts +40 -0
  305. package/dist/plot/bar/data.js +154 -0
  306. package/dist/plot/bar/geometry.d.ts +39 -0
  307. package/dist/plot/bar/geometry.js +60 -0
  308. package/dist/plot/bar/index.d.ts +3 -0
  309. package/dist/plot/bar/index.js +3 -0
  310. package/dist/plot/box/BoxPlot.svelte +1462 -0
  311. package/dist/plot/box/BoxPlot.svelte.d.ts +94 -0
  312. package/dist/plot/box/BoxPlotControls.svelte +109 -0
  313. package/dist/plot/box/BoxPlotControls.svelte.d.ts +19 -0
  314. package/dist/plot/box/Violin.svelte +14 -0
  315. package/dist/plot/box/Violin.svelte.d.ts +70 -0
  316. package/dist/plot/box/box-plot.d.ts +55 -0
  317. package/dist/plot/box/box-plot.js +126 -0
  318. package/dist/plot/box/index.d.ts +5 -0
  319. package/dist/plot/box/index.js +5 -0
  320. package/dist/plot/box/kde.d.ts +16 -0
  321. package/dist/plot/box/kde.js +160 -0
  322. package/dist/plot/box/quantile.d.ts +3 -0
  323. package/dist/plot/box/quantile.js +53 -0
  324. package/dist/plot/core/auto-place.d.ts +43 -0
  325. package/dist/plot/core/auto-place.js +122 -0
  326. package/dist/plot/core/axis-utils.d.ts +46 -0
  327. package/dist/plot/core/axis-utils.js +110 -0
  328. package/dist/plot/core/components/AxisLabel.svelte +51 -0
  329. package/dist/plot/core/components/AxisLabel.svelte.d.ts +16 -0
  330. package/dist/plot/core/components/ColorBar.svelte +724 -0
  331. package/dist/plot/core/components/ColorBar.svelte.d.ts +31 -0
  332. package/dist/plot/core/components/ColorScaleSelect.svelte +55 -0
  333. package/dist/plot/core/components/ColorScaleSelect.svelte.d.ts +15 -0
  334. package/dist/plot/core/components/ControlPane.svelte +46 -0
  335. package/dist/plot/core/components/ControlPane.svelte.d.ts +13 -0
  336. package/dist/plot/core/components/FillArea.svelte +234 -0
  337. package/dist/plot/core/components/FillArea.svelte.d.ts +21 -0
  338. package/dist/plot/core/components/InteractiveAxisLabel.svelte +96 -0
  339. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +14 -0
  340. package/dist/plot/core/components/Line.svelte +101 -0
  341. package/dist/plot/core/components/Line.svelte.d.ts +15 -0
  342. package/dist/plot/core/components/PlotAxis.svelte +171 -0
  343. package/dist/plot/core/components/PlotAxis.svelte.d.ts +25 -0
  344. package/dist/plot/core/components/PlotControls.svelte +525 -0
  345. package/dist/plot/core/components/PlotControls.svelte.d.ts +4 -0
  346. package/dist/plot/core/components/PlotLegend.svelte +580 -0
  347. package/dist/plot/core/components/PlotLegend.svelte.d.ts +30 -0
  348. package/dist/plot/core/components/PlotTooltip.svelte +83 -0
  349. package/dist/plot/core/components/PlotTooltip.svelte.d.ts +25 -0
  350. package/dist/plot/core/components/PortalSelect.svelte +257 -0
  351. package/dist/plot/core/components/PortalSelect.svelte.d.ts +16 -0
  352. package/dist/plot/core/components/ReferenceLine.svelte +204 -0
  353. package/dist/plot/core/components/ReferenceLine.svelte.d.ts +20 -0
  354. package/dist/plot/core/components/ReferenceLine3D.svelte +156 -0
  355. package/dist/plot/core/components/ReferenceLine3D.svelte.d.ts +14 -0
  356. package/dist/plot/core/components/ReferencePlane.svelte +175 -0
  357. package/dist/plot/core/components/ReferencePlane.svelte.d.ts +14 -0
  358. package/dist/plot/core/components/ZeroLines.svelte +97 -0
  359. package/dist/plot/core/components/ZeroLines.svelte.d.ts +33 -0
  360. package/dist/plot/core/components/ZoomRect.svelte +23 -0
  361. package/dist/plot/core/components/ZoomRect.svelte.d.ts +8 -0
  362. package/dist/plot/core/components/index.d.ts +17 -0
  363. package/dist/plot/core/components/index.js +17 -0
  364. package/dist/plot/core/data-cleaning.d.ts +107 -0
  365. package/dist/plot/core/data-cleaning.js +853 -0
  366. package/dist/plot/core/data-transform.d.ts +16 -0
  367. package/dist/plot/core/data-transform.js +45 -0
  368. package/dist/plot/core/fill-utils.d.ts +33 -0
  369. package/dist/plot/core/fill-utils.js +388 -0
  370. package/dist/plot/core/hover-lock.svelte.d.ts +14 -0
  371. package/dist/plot/core/hover-lock.svelte.js +45 -0
  372. package/dist/plot/core/index.d.ts +10 -0
  373. package/dist/plot/core/index.js +11 -0
  374. package/dist/plot/core/interactions.d.ts +35 -0
  375. package/dist/plot/core/interactions.js +195 -0
  376. package/dist/plot/core/layout.d.ts +79 -0
  377. package/dist/plot/core/layout.js +281 -0
  378. package/dist/plot/core/reference-line.d.ts +60 -0
  379. package/dist/plot/core/reference-line.js +301 -0
  380. package/dist/plot/core/scales.d.ts +48 -0
  381. package/dist/plot/core/scales.js +480 -0
  382. package/dist/plot/core/svg.d.ts +2 -0
  383. package/dist/plot/core/svg.js +41 -0
  384. package/dist/plot/core/types.d.ts +771 -0
  385. package/dist/plot/core/types.js +99 -0
  386. package/dist/plot/core/utils/label-placement.d.ts +68 -0
  387. package/dist/plot/core/utils/label-placement.js +326 -0
  388. package/dist/plot/core/utils/series-visibility.d.ts +26 -0
  389. package/dist/plot/core/utils/series-visibility.js +112 -0
  390. package/dist/plot/core/utils.d.ts +11 -0
  391. package/dist/plot/core/utils.js +27 -0
  392. package/dist/plot/histogram/Histogram.svelte +1418 -0
  393. package/dist/plot/histogram/Histogram.svelte.d.ts +50 -0
  394. package/dist/plot/histogram/HistogramControls.svelte +212 -0
  395. package/dist/plot/histogram/HistogramControls.svelte.d.ts +22 -0
  396. package/dist/plot/histogram/index.d.ts +2 -0
  397. package/dist/plot/histogram/index.js +2 -0
  398. package/dist/plot/index.d.ts +8 -0
  399. package/dist/plot/index.js +10 -0
  400. package/dist/plot/sankey/Sankey.svelte +700 -0
  401. package/dist/plot/sankey/Sankey.svelte.d.ts +74 -0
  402. package/dist/plot/sankey/SankeyControls.svelte +98 -0
  403. package/dist/plot/sankey/SankeyControls.svelte.d.ts +19 -0
  404. package/dist/plot/sankey/index.d.ts +4 -0
  405. package/dist/plot/sankey/index.js +3 -0
  406. package/dist/plot/sankey/sankey-types.d.ts +42 -0
  407. package/dist/plot/sankey/sankey-types.js +4 -0
  408. package/dist/plot/sankey/sankey.d.ts +52 -0
  409. package/dist/plot/sankey/sankey.js +187 -0
  410. package/dist/plot/scatter/BinnedScatterPlot.svelte +1116 -0
  411. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +66 -0
  412. package/dist/plot/scatter/ElementScatter.svelte +63 -0
  413. package/dist/plot/scatter/ElementScatter.svelte.d.ts +14 -0
  414. package/dist/plot/scatter/ScatterPlot.svelte +2357 -0
  415. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +96 -0
  416. package/dist/plot/scatter/ScatterPlotControls.svelte +307 -0
  417. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +17 -0
  418. package/dist/plot/scatter/ScatterPoint.svelte +182 -0
  419. package/dist/plot/scatter/ScatterPoint.svelte.d.ts +22 -0
  420. package/dist/plot/scatter/adaptive-density.d.ts +79 -0
  421. package/dist/plot/scatter/adaptive-density.js +217 -0
  422. package/dist/plot/scatter/binned-scatter-types.d.ts +59 -0
  423. package/dist/plot/scatter/binned-scatter-types.js +1 -0
  424. package/dist/plot/scatter/index.d.ts +7 -0
  425. package/dist/plot/scatter/index.js +5 -0
  426. package/dist/plot/scatter/scatter-data.d.ts +19 -0
  427. package/dist/plot/scatter/scatter-data.js +212 -0
  428. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +531 -0
  429. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +95 -0
  430. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +438 -0
  431. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte.d.ts +20 -0
  432. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +912 -0
  433. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +74 -0
  434. package/dist/plot/scatter-3d/Surface3D.svelte +197 -0
  435. package/dist/plot/scatter-3d/Surface3D.svelte.d.ts +13 -0
  436. package/dist/plot/scatter-3d/index.d.ts +4 -0
  437. package/dist/plot/scatter-3d/index.js +4 -0
  438. package/dist/plot/sunburst/Sunburst.svelte +1045 -0
  439. package/dist/plot/sunburst/Sunburst.svelte.d.ts +96 -0
  440. package/dist/plot/sunburst/SunburstControls.svelte +200 -0
  441. package/dist/plot/sunburst/SunburstControls.svelte.d.ts +26 -0
  442. package/dist/plot/sunburst/index.d.ts +4 -0
  443. package/dist/plot/sunburst/index.js +4 -0
  444. package/dist/plot/sunburst/render.d.ts +34 -0
  445. package/dist/plot/sunburst/render.js +122 -0
  446. package/dist/plot/sunburst/sunburst.d.ts +62 -0
  447. package/dist/plot/sunburst/sunburst.js +266 -0
  448. package/dist/rdf/RdfPlot.svelte +248 -0
  449. package/dist/rdf/RdfPlot.svelte.d.ts +27 -0
  450. package/dist/rdf/calc-rdf.d.ts +4 -0
  451. package/dist/rdf/calc-rdf.js +98 -0
  452. package/dist/rdf/index.d.ts +23 -0
  453. package/dist/rdf/index.js +2 -0
  454. package/dist/sanitize.d.ts +6 -0
  455. package/dist/sanitize.js +116 -0
  456. package/dist/settings.d.ts +319 -0
  457. package/dist/settings.js +1394 -0
  458. package/dist/spectral/Bands.svelte +1050 -0
  459. package/dist/spectral/Bands.svelte.d.ts +39 -0
  460. package/dist/spectral/BandsAndDos.svelte +134 -0
  461. package/dist/spectral/BandsAndDos.svelte.d.ts +18 -0
  462. package/dist/spectral/BrillouinBandsDos.svelte +264 -0
  463. package/dist/spectral/BrillouinBandsDos.svelte.d.ts +20 -0
  464. package/dist/spectral/Dos.svelte +688 -0
  465. package/dist/spectral/Dos.svelte.d.ts +29 -0
  466. package/dist/spectral/helpers.d.ts +121 -0
  467. package/dist/spectral/helpers.js +1098 -0
  468. package/dist/spectral/index.d.ts +6 -0
  469. package/dist/spectral/index.js +6 -0
  470. package/dist/spectral/types.d.ts +84 -0
  471. package/dist/spectral/types.js +2 -0
  472. package/dist/state.svelte.d.ts +25 -0
  473. package/dist/state.svelte.js +45 -0
  474. package/dist/structure/Arrow.svelte +72 -0
  475. package/dist/structure/Arrow.svelte.d.ts +15 -0
  476. package/dist/structure/AtomLegend.svelte +814 -0
  477. package/dist/structure/AtomLegend.svelte.d.ts +35 -0
  478. package/dist/structure/Bond.svelte +140 -0
  479. package/dist/structure/Bond.svelte.d.ts +9 -0
  480. package/dist/structure/CanvasTooltip.svelte +33 -0
  481. package/dist/structure/CanvasTooltip.svelte.d.ts +12 -0
  482. package/dist/structure/CellSelect.svelte +348 -0
  483. package/dist/structure/CellSelect.svelte.d.ts +13 -0
  484. package/dist/structure/Cylinder.svelte +49 -0
  485. package/dist/structure/Cylinder.svelte.d.ts +13 -0
  486. package/dist/structure/Lattice.svelte +196 -0
  487. package/dist/structure/Lattice.svelte.d.ts +17 -0
  488. package/dist/structure/Structure.svelte +2254 -0
  489. package/dist/structure/Structure.svelte.d.ts +89 -0
  490. package/dist/structure/StructureControls.svelte +1273 -0
  491. package/dist/structure/StructureControls.svelte.d.ts +31 -0
  492. package/dist/structure/StructureExportPane.svelte +252 -0
  493. package/dist/structure/StructureExportPane.svelte.d.ts +17 -0
  494. package/dist/structure/StructureInfoPane.svelte +736 -0
  495. package/dist/structure/StructureInfoPane.svelte.d.ts +19 -0
  496. package/dist/structure/StructureScene.svelte +2256 -0
  497. package/dist/structure/StructureScene.svelte.d.ts +111 -0
  498. package/dist/structure/atom-properties.d.ts +37 -0
  499. package/dist/structure/atom-properties.js +200 -0
  500. package/dist/structure/bond-order-perception.d.ts +13 -0
  501. package/dist/structure/bond-order-perception.js +384 -0
  502. package/dist/structure/bonding.d.ts +69 -0
  503. package/dist/structure/bonding.js +724 -0
  504. package/dist/structure/export.d.ts +20 -0
  505. package/dist/structure/export.js +731 -0
  506. package/dist/structure/index.d.ts +124 -0
  507. package/dist/structure/index.js +167 -0
  508. package/dist/structure/label-placement.d.ts +14 -0
  509. package/dist/structure/label-placement.js +72 -0
  510. package/dist/structure/measure.d.ts +7 -0
  511. package/dist/structure/measure.js +30 -0
  512. package/dist/structure/parse.d.ts +66 -0
  513. package/dist/structure/parse.js +1410 -0
  514. package/dist/structure/partial-occupancy.d.ts +25 -0
  515. package/dist/structure/partial-occupancy.js +99 -0
  516. package/dist/structure/pbc.d.ts +9 -0
  517. package/dist/structure/pbc.js +127 -0
  518. package/dist/structure/supercell.d.ts +8 -0
  519. package/dist/structure/supercell.js +170 -0
  520. package/dist/structure/validation.d.ts +2 -0
  521. package/dist/structure/validation.js +10 -0
  522. package/dist/symmetry/SymmetryStats.svelte +226 -0
  523. package/dist/symmetry/SymmetryStats.svelte.d.ts +21 -0
  524. package/dist/symmetry/WyckoffTable.svelte +120 -0
  525. package/dist/symmetry/WyckoffTable.svelte.d.ts +11 -0
  526. package/dist/symmetry/cell-transform.d.ts +12 -0
  527. package/dist/symmetry/cell-transform.js +91 -0
  528. package/dist/symmetry/index.d.ts +43 -0
  529. package/dist/symmetry/index.js +226 -0
  530. package/dist/symmetry/spacegroups.d.ts +16 -0
  531. package/dist/symmetry/spacegroups.js +429 -0
  532. package/dist/table/HeatmapTable.svelte +1885 -0
  533. package/dist/table/HeatmapTable.svelte.d.ts +49 -0
  534. package/dist/table/ToggleMenu.svelte +385 -0
  535. package/dist/table/ToggleMenu.svelte.d.ts +11 -0
  536. package/dist/table/index.d.ts +72 -0
  537. package/dist/table/index.js +38 -0
  538. package/dist/theme/ThemeControl.svelte +53 -0
  539. package/dist/theme/ThemeControl.svelte.d.ts +9 -0
  540. package/dist/theme/index.d.ts +29 -0
  541. package/dist/theme/index.js +79 -0
  542. package/dist/time.d.ts +4 -0
  543. package/dist/time.js +70 -0
  544. package/dist/tooltip/KCoords.svelte +45 -0
  545. package/dist/tooltip/KCoords.svelte.d.ts +8 -0
  546. package/dist/tooltip/TooltipContent.svelte +58 -0
  547. package/dist/tooltip/TooltipContent.svelte.d.ts +31 -0
  548. package/dist/tooltip/index.d.ts +3 -0
  549. package/dist/tooltip/index.js +2 -0
  550. package/dist/tooltip/types.d.ts +8 -0
  551. package/dist/tooltip/types.js +1 -0
  552. package/dist/trajectory/Trajectory.svelte +1571 -0
  553. package/dist/trajectory/Trajectory.svelte.d.ts +78 -0
  554. package/dist/trajectory/TrajectoryError.svelte +128 -0
  555. package/dist/trajectory/TrajectoryError.svelte.d.ts +13 -0
  556. package/dist/trajectory/TrajectoryExportPane.svelte +358 -0
  557. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +17 -0
  558. package/dist/trajectory/TrajectoryInfoPane.svelte +314 -0
  559. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +17 -0
  560. package/dist/trajectory/constants.d.ts +6 -0
  561. package/dist/trajectory/constants.js +7 -0
  562. package/dist/trajectory/extract.d.ts +5 -0
  563. package/dist/trajectory/extract.js +162 -0
  564. package/dist/trajectory/format-detect.d.ts +10 -0
  565. package/dist/trajectory/format-detect.js +90 -0
  566. package/dist/trajectory/frame-reader.d.ts +17 -0
  567. package/dist/trajectory/frame-reader.js +299 -0
  568. package/dist/trajectory/helpers.d.ts +15 -0
  569. package/dist/trajectory/helpers.js +164 -0
  570. package/dist/trajectory/index.d.ts +63 -0
  571. package/dist/trajectory/index.js +126 -0
  572. package/dist/trajectory/parse/ase.d.ts +2 -0
  573. package/dist/trajectory/parse/ase.js +73 -0
  574. package/dist/trajectory/parse/hdf5.d.ts +2 -0
  575. package/dist/trajectory/parse/hdf5.js +127 -0
  576. package/dist/trajectory/parse/index.d.ts +12 -0
  577. package/dist/trajectory/parse/index.js +306 -0
  578. package/dist/trajectory/parse/lammps.d.ts +5 -0
  579. package/dist/trajectory/parse/lammps.js +179 -0
  580. package/dist/trajectory/parse/vasp.d.ts +2 -0
  581. package/dist/trajectory/parse/vasp.js +87 -0
  582. package/dist/trajectory/parse/xyz.d.ts +26 -0
  583. package/dist/trajectory/parse/xyz.js +123 -0
  584. package/dist/trajectory/plotting.d.ts +28 -0
  585. package/dist/trajectory/plotting.js +423 -0
  586. package/dist/trajectory/types.d.ts +11 -0
  587. package/dist/trajectory/types.js +1 -0
  588. package/dist/utils.d.ts +7 -0
  589. package/dist/utils.js +47 -0
  590. package/dist/xrd/XrdPlot.svelte +616 -0
  591. package/dist/xrd/XrdPlot.svelte.d.ts +28 -0
  592. package/dist/xrd/broadening.d.ts +20 -0
  593. package/dist/xrd/broadening.js +97 -0
  594. package/dist/xrd/calc-xrd.d.ts +37 -0
  595. package/dist/xrd/calc-xrd.js +339 -0
  596. package/dist/xrd/index.d.ts +37 -0
  597. package/dist/xrd/index.js +4 -0
  598. package/dist/xrd/parse.d.ts +13 -0
  599. package/dist/xrd/parse.js +749 -0
  600. package/license +1 -1
  601. package/package.json +237 -1458
  602. package/readme.md +98 -171
  603. package/.vscode/launch.json +0 -13
  604. package/.vscodeignore +0 -7
  605. package/dist/assets/STLExporter-BpTH3YHE.js +0 -8
  606. package/dist/assets/browser-DdDecX_W.js +0 -1
  607. package/dist/assets/export-qgn-H9y6.js +0 -2
  608. package/dist/assets/main-DiKYzti2.css +0 -1
  609. package/dist/assets/moyo_wasm_bg-0ocwg7xY.wasm +0 -0
  610. package/dist/extension.js +0 -31293
  611. package/dist/src/lib/FilePicker.svelte +0 -360
  612. package/dist/src/lib/Icon.svelte +0 -41
  613. package/dist/src/lib/MillerIndexInput.svelte +0 -66
  614. package/dist/src/lib/api/mp.ts +0 -26
  615. package/dist/src/lib/api/optimade.ts +0 -204
  616. package/dist/src/lib/app.css +0 -247
  617. package/dist/src/lib/brillouin/BrillouinZone.svelte +0 -549
  618. package/dist/src/lib/brillouin/BrillouinZoneControls.svelte +0 -144
  619. package/dist/src/lib/brillouin/BrillouinZoneExportPane.svelte +0 -146
  620. package/dist/src/lib/brillouin/BrillouinZoneInfoPane.svelte +0 -146
  621. package/dist/src/lib/brillouin/BrillouinZoneScene.svelte +0 -476
  622. package/dist/src/lib/brillouin/BrillouinZoneTooltip.svelte +0 -92
  623. package/dist/src/lib/brillouin/compute.ts +0 -529
  624. package/dist/src/lib/brillouin/index.ts +0 -8
  625. package/dist/src/lib/brillouin/types.ts +0 -51
  626. package/dist/src/lib/chempot-diagram/ChemPotDiagram.svelte +0 -327
  627. package/dist/src/lib/chempot-diagram/ChemPotDiagram2D.svelte +0 -846
  628. package/dist/src/lib/chempot-diagram/ChemPotDiagram3D.svelte +0 -3193
  629. package/dist/src/lib/chempot-diagram/async-compute.svelte.ts +0 -94
  630. package/dist/src/lib/chempot-diagram/chempot-worker.ts +0 -11
  631. package/dist/src/lib/chempot-diagram/color.ts +0 -42
  632. package/dist/src/lib/chempot-diagram/compute.ts +0 -1014
  633. package/dist/src/lib/chempot-diagram/index.ts +0 -6
  634. package/dist/src/lib/chempot-diagram/pointer.ts +0 -56
  635. package/dist/src/lib/chempot-diagram/temperature.ts +0 -77
  636. package/dist/src/lib/chempot-diagram/types.ts +0 -130
  637. package/dist/src/lib/colors/index.ts +0 -249
  638. package/dist/src/lib/composition/BarChart.svelte +0 -297
  639. package/dist/src/lib/composition/BubbleChart.svelte +0 -218
  640. package/dist/src/lib/composition/Composition.svelte +0 -165
  641. package/dist/src/lib/composition/Formula.svelte +0 -268
  642. package/dist/src/lib/composition/FormulaFilter.svelte +0 -1257
  643. package/dist/src/lib/composition/PieChart.svelte +0 -323
  644. package/dist/src/lib/composition/format.ts +0 -155
  645. package/dist/src/lib/composition/index.ts +0 -37
  646. package/dist/src/lib/composition/parse.ts +0 -605
  647. package/dist/src/lib/constants.ts +0 -134
  648. package/dist/src/lib/controls.ts +0 -42
  649. package/dist/src/lib/convex-hull/ConvexHull.svelte +0 -157
  650. package/dist/src/lib/convex-hull/ConvexHull2D.svelte +0 -825
  651. package/dist/src/lib/convex-hull/ConvexHull3D.svelte +0 -1801
  652. package/dist/src/lib/convex-hull/ConvexHull4D.svelte +0 -1398
  653. package/dist/src/lib/convex-hull/ConvexHullControls.svelte +0 -535
  654. package/dist/src/lib/convex-hull/ConvexHullInfoPane.svelte +0 -125
  655. package/dist/src/lib/convex-hull/ConvexHullStats.svelte +0 -929
  656. package/dist/src/lib/convex-hull/ConvexHullTooltip.svelte +0 -131
  657. package/dist/src/lib/convex-hull/GasPressureControls.svelte +0 -247
  658. package/dist/src/lib/convex-hull/StructurePopup.svelte +0 -151
  659. package/dist/src/lib/convex-hull/TemperatureSlider.svelte +0 -140
  660. package/dist/src/lib/convex-hull/barycentric-coords.ts +0 -246
  661. package/dist/src/lib/convex-hull/demo-temperature.ts +0 -63
  662. package/dist/src/lib/convex-hull/gas-thermodynamics.ts +0 -405
  663. package/dist/src/lib/convex-hull/helpers.ts +0 -932
  664. package/dist/src/lib/convex-hull/index.ts +0 -202
  665. package/dist/src/lib/convex-hull/thermodynamics.ts +0 -2192
  666. package/dist/src/lib/convex-hull/types.ts +0 -267
  667. package/dist/src/lib/coordination/CoordinationBarPlot.svelte +0 -311
  668. package/dist/src/lib/coordination/calc-coordination.ts +0 -93
  669. package/dist/src/lib/coordination/index.ts +0 -9
  670. package/dist/src/lib/effects.svelte.ts +0 -48
  671. package/dist/src/lib/element/ElementHeading.svelte +0 -26
  672. package/dist/src/lib/element/ElementPhoto.svelte +0 -57
  673. package/dist/src/lib/element/ElementStats.svelte +0 -80
  674. package/dist/src/lib/element/ElementTile.svelte +0 -484
  675. package/dist/src/lib/element/data.ts +0 -14
  676. package/dist/src/lib/element/index.ts +0 -8
  677. package/dist/src/lib/element/types.ts +0 -62
  678. package/dist/src/lib/feedback/ClickFeedback.svelte +0 -58
  679. package/dist/src/lib/feedback/DragOverlay.svelte +0 -42
  680. package/dist/src/lib/feedback/index.ts +0 -4
  681. package/dist/src/lib/fermi-surface/FermiSlice.svelte +0 -189
  682. package/dist/src/lib/fermi-surface/FermiSurface.svelte +0 -600
  683. package/dist/src/lib/fermi-surface/FermiSurfaceControls.svelte +0 -448
  684. package/dist/src/lib/fermi-surface/FermiSurfaceScene.svelte +0 -794
  685. package/dist/src/lib/fermi-surface/FermiSurfaceTooltip.svelte +0 -111
  686. package/dist/src/lib/fermi-surface/compute.ts +0 -728
  687. package/dist/src/lib/fermi-surface/constants.ts +0 -32
  688. package/dist/src/lib/fermi-surface/export.ts +0 -64
  689. package/dist/src/lib/fermi-surface/index.ts +0 -14
  690. package/dist/src/lib/fermi-surface/marching-cubes.ts +0 -3
  691. package/dist/src/lib/fermi-surface/parse.ts +0 -574
  692. package/dist/src/lib/fermi-surface/symmetry.ts +0 -56
  693. package/dist/src/lib/fermi-surface/types.ts +0 -159
  694. package/dist/src/lib/heatmap-matrix/HeatmapMatrix.svelte +0 -1545
  695. package/dist/src/lib/heatmap-matrix/HeatmapMatrixControls.svelte +0 -225
  696. package/dist/src/lib/heatmap-matrix/index.ts +0 -167
  697. package/dist/src/lib/heatmap-matrix/shared.ts +0 -7
  698. package/dist/src/lib/icons.ts +0 -650
  699. package/dist/src/lib/index.ts +0 -61
  700. package/dist/src/lib/io/decompress.ts +0 -92
  701. package/dist/src/lib/io/export.ts +0 -385
  702. package/dist/src/lib/io/fetch.ts +0 -46
  703. package/dist/src/lib/io/file-drop.ts +0 -51
  704. package/dist/src/lib/io/index.ts +0 -7
  705. package/dist/src/lib/io/is-binary.ts +0 -24
  706. package/dist/src/lib/io/types.ts +0 -8
  707. package/dist/src/lib/io/url-drop.ts +0 -141
  708. package/dist/src/lib/isosurface/Isosurface.svelte +0 -285
  709. package/dist/src/lib/isosurface/IsosurfaceControls.svelte +0 -277
  710. package/dist/src/lib/isosurface/index.ts +0 -7
  711. package/dist/src/lib/isosurface/parse.ts +0 -656
  712. package/dist/src/lib/isosurface/slice.ts +0 -175
  713. package/dist/src/lib/isosurface/types.ts +0 -309
  714. package/dist/src/lib/labels.ts +0 -320
  715. package/dist/src/lib/layout/FullscreenToggle.svelte +0 -50
  716. package/dist/src/lib/layout/InfoCard.svelte +0 -120
  717. package/dist/src/lib/layout/InfoTag.svelte +0 -185
  718. package/dist/src/lib/layout/PropertyFilter.svelte +0 -246
  719. package/dist/src/lib/layout/SettingsSection.svelte +0 -148
  720. package/dist/src/lib/layout/SubpageGrid.svelte +0 -82
  721. package/dist/src/lib/layout/fullscreen.ts +0 -65
  722. package/dist/src/lib/layout/index.ts +0 -11
  723. package/dist/src/lib/layout/json-tree/JsonNode.svelte +0 -548
  724. package/dist/src/lib/layout/json-tree/JsonTree.svelte +0 -1230
  725. package/dist/src/lib/layout/json-tree/index.ts +0 -3
  726. package/dist/src/lib/layout/json-tree/types.ts +0 -126
  727. package/dist/src/lib/layout/json-tree/utils.ts +0 -682
  728. package/dist/src/lib/marching-cubes.ts +0 -614
  729. package/dist/src/lib/math.ts +0 -1081
  730. package/dist/src/lib/overlays/ContextMenu.svelte +0 -162
  731. package/dist/src/lib/overlays/CopyButton.svelte +0 -45
  732. package/dist/src/lib/overlays/DragControlTab.svelte +0 -98
  733. package/dist/src/lib/overlays/DraggablePane.svelte +0 -487
  734. package/dist/src/lib/overlays/InfoPaneCards.svelte +0 -149
  735. package/dist/src/lib/overlays/index.ts +0 -3
  736. package/dist/src/lib/periodic-table/PeriodicTable.svelte +0 -469
  737. package/dist/src/lib/periodic-table/PeriodicTableControls.svelte +0 -557
  738. package/dist/src/lib/periodic-table/PropertySelect.svelte +0 -37
  739. package/dist/src/lib/periodic-table/index.ts +0 -12
  740. package/dist/src/lib/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +0 -1086
  741. package/dist/src/lib/phase-diagram/PhaseDiagramControls.svelte +0 -444
  742. package/dist/src/lib/phase-diagram/PhaseDiagramEditorPane.svelte +0 -126
  743. package/dist/src/lib/phase-diagram/PhaseDiagramExportPane.svelte +0 -184
  744. package/dist/src/lib/phase-diagram/PhaseDiagramTooltip.svelte +0 -391
  745. package/dist/src/lib/phase-diagram/TdbInfoPanel.svelte +0 -203
  746. package/dist/src/lib/phase-diagram/build-diagram.ts +0 -186
  747. package/dist/src/lib/phase-diagram/colors.ts +0 -58
  748. package/dist/src/lib/phase-diagram/diagram-input.ts +0 -40
  749. package/dist/src/lib/phase-diagram/index.ts +0 -13
  750. package/dist/src/lib/phase-diagram/parse.ts +0 -348
  751. package/dist/src/lib/phase-diagram/svg-to-diagram.ts +0 -1023
  752. package/dist/src/lib/phase-diagram/types.ts +0 -144
  753. package/dist/src/lib/phase-diagram/utils.ts +0 -775
  754. package/dist/src/lib/plot/AxisLabel.svelte +0 -51
  755. package/dist/src/lib/plot/BarPlot.svelte +0 -2113
  756. package/dist/src/lib/plot/BarPlotControls.svelte +0 -66
  757. package/dist/src/lib/plot/BinnedScatterPlot.svelte +0 -1114
  758. package/dist/src/lib/plot/ColorBar.svelte +0 -721
  759. package/dist/src/lib/plot/ColorScaleSelect.svelte +0 -54
  760. package/dist/src/lib/plot/ElementScatter.svelte +0 -63
  761. package/dist/src/lib/plot/FillArea.svelte +0 -223
  762. package/dist/src/lib/plot/Histogram.svelte +0 -1558
  763. package/dist/src/lib/plot/HistogramControls.svelte +0 -212
  764. package/dist/src/lib/plot/InteractiveAxisLabel.svelte +0 -96
  765. package/dist/src/lib/plot/Line.svelte +0 -84
  766. package/dist/src/lib/plot/PlotAxis.svelte +0 -169
  767. package/dist/src/lib/plot/PlotControls.svelte +0 -537
  768. package/dist/src/lib/plot/PlotLegend.svelte +0 -569
  769. package/dist/src/lib/plot/PlotTooltip.svelte +0 -67
  770. package/dist/src/lib/plot/PortalSelect.svelte +0 -253
  771. package/dist/src/lib/plot/ReferenceLine.svelte +0 -204
  772. package/dist/src/lib/plot/ReferenceLine3D.svelte +0 -156
  773. package/dist/src/lib/plot/ReferencePlane.svelte +0 -175
  774. package/dist/src/lib/plot/ScatterPlot.svelte +0 -2778
  775. package/dist/src/lib/plot/ScatterPlot3D.svelte +0 -529
  776. package/dist/src/lib/plot/ScatterPlot3DControls.svelte +0 -437
  777. package/dist/src/lib/plot/ScatterPlot3DScene.svelte +0 -912
  778. package/dist/src/lib/plot/ScatterPlotControls.svelte +0 -306
  779. package/dist/src/lib/plot/ScatterPoint.svelte +0 -182
  780. package/dist/src/lib/plot/SpacegroupBarPlot.svelte +0 -293
  781. package/dist/src/lib/plot/Surface3D.svelte +0 -197
  782. package/dist/src/lib/plot/ZeroLines.svelte +0 -97
  783. package/dist/src/lib/plot/ZoomRect.svelte +0 -23
  784. package/dist/src/lib/plot/adaptive-density.ts +0 -316
  785. package/dist/src/lib/plot/auto-place.ts +0 -184
  786. package/dist/src/lib/plot/axis-utils.ts +0 -122
  787. package/dist/src/lib/plot/binned-scatter-types.ts +0 -83
  788. package/dist/src/lib/plot/data-cleaning.ts +0 -1069
  789. package/dist/src/lib/plot/data-transform.ts +0 -69
  790. package/dist/src/lib/plot/defaults.ts +0 -9
  791. package/dist/src/lib/plot/fill-utils.ts +0 -494
  792. package/dist/src/lib/plot/hover-lock.svelte.ts +0 -60
  793. package/dist/src/lib/plot/index.ts +0 -53
  794. package/dist/src/lib/plot/interactions.ts +0 -119
  795. package/dist/src/lib/plot/layout.ts +0 -425
  796. package/dist/src/lib/plot/reference-line.ts +0 -426
  797. package/dist/src/lib/plot/scales.ts +0 -654
  798. package/dist/src/lib/plot/svg.ts +0 -23
  799. package/dist/src/lib/plot/types.ts +0 -1144
  800. package/dist/src/lib/plot/utils/label-placement.ts +0 -541
  801. package/dist/src/lib/plot/utils/series-visibility.ts +0 -140
  802. package/dist/src/lib/plot/utils.ts +0 -11
  803. package/dist/src/lib/rdf/RdfPlot.svelte +0 -247
  804. package/dist/src/lib/rdf/calc-rdf.ts +0 -167
  805. package/dist/src/lib/rdf/index.ts +0 -27
  806. package/dist/src/lib/sanitize.ts +0 -126
  807. package/dist/src/lib/settings.ts +0 -1479
  808. package/dist/src/lib/spectral/Bands.svelte +0 -1040
  809. package/dist/src/lib/spectral/BandsAndDos.svelte +0 -134
  810. package/dist/src/lib/spectral/BrillouinBandsDos.svelte +0 -252
  811. package/dist/src/lib/spectral/Dos.svelte +0 -697
  812. package/dist/src/lib/spectral/helpers.ts +0 -1381
  813. package/dist/src/lib/spectral/index.ts +0 -8
  814. package/dist/src/lib/spectral/types.ts +0 -112
  815. package/dist/src/lib/state.svelte.ts +0 -64
  816. package/dist/src/lib/structure/Arrow.svelte +0 -72
  817. package/dist/src/lib/structure/AtomLegend.svelte +0 -815
  818. package/dist/src/lib/structure/Bond.svelte +0 -140
  819. package/dist/src/lib/structure/CanvasTooltip.svelte +0 -33
  820. package/dist/src/lib/structure/CellSelect.svelte +0 -349
  821. package/dist/src/lib/structure/Cylinder.svelte +0 -45
  822. package/dist/src/lib/structure/Lattice.svelte +0 -196
  823. package/dist/src/lib/structure/Structure.svelte +0 -2248
  824. package/dist/src/lib/structure/StructureControls.svelte +0 -1273
  825. package/dist/src/lib/structure/StructureExportPane.svelte +0 -252
  826. package/dist/src/lib/structure/StructureInfoPane.svelte +0 -737
  827. package/dist/src/lib/structure/StructureScene.svelte +0 -2255
  828. package/dist/src/lib/structure/atom-properties.ts +0 -316
  829. package/dist/src/lib/structure/bond-order-perception.ts +0 -447
  830. package/dist/src/lib/structure/bonding.ts +0 -944
  831. package/dist/src/lib/structure/export.ts +0 -861
  832. package/dist/src/lib/structure/index.ts +0 -291
  833. package/dist/src/lib/structure/label-placement.ts +0 -130
  834. package/dist/src/lib/structure/measure.ts +0 -45
  835. package/dist/src/lib/structure/parse.ts +0 -1705
  836. package/dist/src/lib/structure/partial-occupancy.ts +0 -183
  837. package/dist/src/lib/structure/pbc.ts +0 -164
  838. package/dist/src/lib/structure/supercell.ts +0 -226
  839. package/dist/src/lib/structure/validation.ts +0 -11
  840. package/dist/src/lib/symmetry/SymmetryStats.svelte +0 -226
  841. package/dist/src/lib/symmetry/WyckoffTable.svelte +0 -120
  842. package/dist/src/lib/symmetry/cell-transform.ts +0 -118
  843. package/dist/src/lib/symmetry/index.ts +0 -348
  844. package/dist/src/lib/symmetry/spacegroups.ts +0 -404
  845. package/dist/src/lib/table/HeatmapTable.svelte +0 -1833
  846. package/dist/src/lib/table/ToggleMenu.svelte +0 -385
  847. package/dist/src/lib/table/index.ts +0 -139
  848. package/dist/src/lib/theme/ThemeControl.svelte +0 -53
  849. package/dist/src/lib/theme/index.ts +0 -107
  850. package/dist/src/lib/time.ts +0 -71
  851. package/dist/src/lib/tooltip/TooltipContent.svelte +0 -58
  852. package/dist/src/lib/tooltip/index.ts +0 -2
  853. package/dist/src/lib/tooltip/types.ts +0 -13
  854. package/dist/src/lib/trajectory/Trajectory.svelte +0 -1545
  855. package/dist/src/lib/trajectory/TrajectoryError.svelte +0 -128
  856. package/dist/src/lib/trajectory/TrajectoryExportPane.svelte +0 -357
  857. package/dist/src/lib/trajectory/TrajectoryInfoPane.svelte +0 -313
  858. package/dist/src/lib/trajectory/constants.ts +0 -7
  859. package/dist/src/lib/trajectory/extract.ts +0 -196
  860. package/dist/src/lib/trajectory/format-detect.ts +0 -96
  861. package/dist/src/lib/trajectory/frame-reader.ts +0 -456
  862. package/dist/src/lib/trajectory/helpers.ts +0 -217
  863. package/dist/src/lib/trajectory/index.ts +0 -218
  864. package/dist/src/lib/trajectory/parse/ase.ts +0 -109
  865. package/dist/src/lib/trajectory/parse/hdf5.ts +0 -173
  866. package/dist/src/lib/trajectory/parse/index.ts +0 -411
  867. package/dist/src/lib/trajectory/parse/lammps.ts +0 -215
  868. package/dist/src/lib/trajectory/parse/vasp.ts +0 -102
  869. package/dist/src/lib/trajectory/parse/xyz.ts +0 -143
  870. package/dist/src/lib/trajectory/plotting.ts +0 -599
  871. package/dist/src/lib/trajectory/types.ts +0 -13
  872. package/dist/src/lib/utils.ts +0 -56
  873. package/dist/src/lib/xrd/XrdPlot.svelte +0 -615
  874. package/dist/src/lib/xrd/broadening.ts +0 -130
  875. package/dist/src/lib/xrd/calc-xrd.ts +0 -397
  876. package/dist/src/lib/xrd/index.ts +0 -38
  877. package/dist/src/lib/xrd/parse.ts +0 -858
  878. package/dist/webview.js +0 -29421
  879. package/icon.png +0 -0
  880. package/matterviz-0.3.2.vsix +0 -0
  881. package/matterviz-0.3.4.vsix +0 -0
  882. package/matterviz-0.3.5.vsix +0 -0
  883. package/scripts/sync-config.ts +0 -101
  884. package/src/declarations.d.ts +0 -2
  885. package/src/extension.ts +0 -972
  886. package/src/node-io.ts +0 -65
  887. package/src/types.ts +0 -17
  888. package/src/webview/JsonBrowser.svelte +0 -1079
  889. package/src/webview/PlotPanel.svelte +0 -346
  890. package/src/webview/detect.ts +0 -444
  891. package/src/webview/main.ts +0 -764
  892. package/src/webview/plot-utils.ts +0 -250
  893. package/test-fixtures/all-viz-types.json.gz +0 -0
  894. package/test-fixtures/plot-demo-data.json.gz +0 -0
  895. package/tests/detect.test.ts +0 -604
  896. package/tests/extension.test.ts +0 -2041
  897. package/tests/node-io.test.ts +0 -39
  898. package/tests/plot-utils.test.ts +0 -302
  899. package/tests/vite-plugin-json-gz.test.ts +0 -114
  900. package/tests/vscode-mock.ts +0 -18
  901. package/tests/webview.test.ts +0 -231
  902. package/tsconfig.json +0 -20
  903. package/vite-plugin-json-gz.ts +0 -29
  904. package/vite.config.ts +0 -34
  905. package/vite.extension.config.ts +0 -34
  906. /package/dist/{src/lib/EmptyState.svelte → EmptyState.svelte} +0 -0
  907. /package/dist/{src/lib/chempot-diagram → chempot-diagram}/ChemPotScene3D.svelte +0 -0
  908. /package/dist/{src/lib/colors → colors}/alloy-colors.json +0 -0
  909. /package/dist/{src/lib/colors → colors}/dark-mode-colors.json +0 -0
  910. /package/dist/{src/lib/colors → colors}/jmol-colors.json +0 -0
  911. /package/dist/{src/lib/colors → colors}/muted-colors.json +0 -0
  912. /package/dist/{src/lib/colors → colors}/pastel-colors.json +0 -0
  913. /package/dist/{src/lib/colors → colors}/vesta-colors.json +0 -0
  914. /package/dist/{src/lib/element → element}/BohrAtom.svelte +0 -0
  915. /package/dist/{src/lib/element → element}/Nucleus.svelte +0 -0
  916. /package/dist/{src/lib/element → element}/data.json +0 -0
  917. /package/dist/{src/lib/element → element}/data.json.gz +0 -0
  918. /package/dist/{src/lib/element → element}/data.json.gz.d.ts +0 -0
  919. /package/dist/{src/lib/element → element}/data.schema.json +0 -0
  920. /package/dist/{src/lib/element-image-urls.json → element-image-urls.json} +0 -0
  921. /package/dist/{src/lib/feedback → feedback}/Spinner.svelte +0 -0
  922. /package/dist/{src/lib/feedback → feedback}/StatusMessage.svelte +0 -0
  923. /package/dist/{src/lib/layout → layout}/json-tree/JsonValue.svelte +0 -0
  924. /package/dist/{src/lib/periodic-table → periodic-table}/TableInset.svelte +0 -0
  925. /package/dist/{src/lib/theme → theme}/themes.mjs +0 -0
  926. /package/dist/{src/lib/xrd → xrd}/atomic_scattering_params.json +0 -0
@@ -0,0 +1,867 @@
1
+ // SVG-to-DiagramInput converter
2
+ // Parses phase diagram SVGs (matplotlib or simple/Gemini format) into DiagramInput JSON
3
+ // for immediate rendering by IsobaricBinaryPhaseDiagram
4
+ // Two-phase color keys to cycle through for region assignment
5
+ const TWO_PHASE_COLORS = [
6
+ `two_phase`,
7
+ `two_phase_intermetallic`,
8
+ `two_phase_fcc_liquid`,
9
+ `two_phase_intermetallic_alt`,
10
+ `two_phase_alt`,
11
+ `two_phase_gamma`,
12
+ `two_phase_mixed`,
13
+ `two_phase_si`,
14
+ `two_phase_bcc_liquid`,
15
+ `two_phase_hcp_liquid`,
16
+ `two_phase_theta_liquid`,
17
+ `two_phase_eta`,
18
+ ];
19
+ // Round to 6 decimal places for clean floating-point output
20
+ const round = (val) => Math.round(val * 1e6) / 1e6;
21
+ // === Format Detection ===
22
+ // Detect whether the SVG is matplotlib, MPDS, or simple format
23
+ function detect_format(doc) {
24
+ // Matplotlib SVGs have xtick/ytick group IDs
25
+ if (doc.querySelector(`[id^="xtick_"]`) || doc.querySelector(`[id^="ytick_"]`)) {
26
+ return `matplotlib`;
27
+ }
28
+ // MPDS SVGs (from CorelDRAW/Inkscape) have sodipodi namespace or inkscape attributes
29
+ const svg_el = doc.querySelector(`svg`);
30
+ if (svg_el?.getAttribute(`sodipodi:docname`) ||
31
+ svg_el?.getAttribute(`inkscape:version`) ||
32
+ svg_el?.getAttributeNS(`http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd`, `docname`)) {
33
+ return `mpds`;
34
+ }
35
+ return `simple`;
36
+ }
37
+ // === Axis Scale Extraction ===
38
+ // Extract x and y axis scales from tick marks
39
+ function extract_axis_scales(doc, format) {
40
+ const x_ticks = [];
41
+ const y_ticks = [];
42
+ if (format === `matplotlib`) {
43
+ extract_matplotlib_ticks(doc, x_ticks, y_ticks);
44
+ }
45
+ else if (format === `mpds`) {
46
+ return extract_mpds_scales(doc);
47
+ }
48
+ else {
49
+ extract_simple_ticks(doc, x_ticks, y_ticks);
50
+ }
51
+ if (x_ticks.length < 2) {
52
+ throw new Error(`Need at least 2 x-axis ticks, found ${x_ticks.length}`);
53
+ }
54
+ if (y_ticks.length < 2) {
55
+ throw new Error(`Need at least 2 y-axis ticks, found ${y_ticks.length}`);
56
+ }
57
+ return {
58
+ x_scale: build_scale(x_ticks),
59
+ y_scale: build_scale(y_ticks), // y-axis inverted (SVG y down, temp up)
60
+ };
61
+ }
62
+ // Extract ticks from matplotlib SVG (id="xtick_N", comment-based values)
63
+ function extract_matplotlib_ticks(doc, x_ticks, y_ticks) {
64
+ const axes = [
65
+ [`xtick_`, `x`, x_ticks],
66
+ [`ytick_`, `y`, y_ticks],
67
+ ];
68
+ for (const [prefix, attr, ticks] of axes) {
69
+ for (const group of Array.from(doc.querySelectorAll(`[id^="${prefix}"]`))) {
70
+ const value = extract_comment_number(group);
71
+ const use_el = group.querySelector(`use`);
72
+ if (value !== null && use_el) {
73
+ const px = parse_float_attr(use_el, attr);
74
+ if (px !== null)
75
+ ticks.push({ px, value });
76
+ }
77
+ }
78
+ }
79
+ }
80
+ // Extract ticks from simple SVG (class-based text elements)
81
+ function extract_simple_ticks(doc, x_ticks, y_ticks) {
82
+ // Y-axis ticks: class="tick-text" with text-anchor: end
83
+ for (const text_el of Array.from(doc.querySelectorAll(`.tick-text`))) {
84
+ const value = parseFloat(text_el.textContent?.trim() ?? ``);
85
+ if (isNaN(value))
86
+ continue;
87
+ // Find the immediately preceding sibling tick line (not just any line in parent)
88
+ const tick_line = text_el.previousElementSibling;
89
+ if (!tick_line || !tick_line.matches(`.tick-line, line`))
90
+ continue;
91
+ const py = parse_float_attr(tick_line, `y1`);
92
+ // Apply parent group transform if present
93
+ const parent = text_el.parentElement;
94
+ const transform_y = get_group_translate(parent, `y`);
95
+ if (py !== null)
96
+ y_ticks.push({ px: py + transform_y, value });
97
+ }
98
+ // X-axis ticks: class="tick-text-x"
99
+ for (const text_el of Array.from(doc.querySelectorAll(`.tick-text-x`))) {
100
+ const value = parseFloat(text_el.textContent?.trim() ?? ``);
101
+ if (isNaN(value))
102
+ continue;
103
+ const px_x = parse_float_attr(text_el, `x`);
104
+ // Apply parent group transform if present
105
+ const parent = text_el.parentElement;
106
+ const transform_x = get_group_translate(parent, `x`);
107
+ if (px_x !== null)
108
+ x_ticks.push({ px: px_x + transform_x, value });
109
+ }
110
+ }
111
+ // Extract scales from MPDS SVGs using tick mark paths and text values
112
+ // MPDS SVGs store tick marks as multi-segment paths with major ticks (longer)
113
+ // and minor ticks (shorter). Text values are not positionally useful but
114
+ // tell us the data range.
115
+ function extract_mpds_scales(doc) {
116
+ // Extract all numeric text values to infer axis ranges
117
+ const numbers = [];
118
+ for (const text_el of Array.from(doc.querySelectorAll(`text`))) {
119
+ const val = parseFloat(text_el.textContent?.trim() ?? ``);
120
+ if (!isNaN(val))
121
+ numbers.push(val);
122
+ }
123
+ // Separate composition (0-100 at%) from temperature (typically 100-3000)
124
+ // Note: value 100 appears in both filters (valid as 100 at% and 100°C).
125
+ // This is intentional — only endpoints are used for scale mapping.
126
+ const comp_vals = [
127
+ ...new Set(numbers.filter((value) => value >= 0 && value <= 100 && value % 10 === 0)),
128
+ ].toSorted((a, b) => a - b);
129
+ const temp_vals = [
130
+ ...new Set(numbers.filter((value) => value >= 100 && value % 100 === 0 && value <= 3000)),
131
+ ].toSorted((a, b) => a - b);
132
+ if (comp_vals.length < 2 || temp_vals.length < 2) {
133
+ throw new Error(`MPDS SVG: could not infer axis ranges (found ${comp_vals.length} composition, ${temp_vals.length} temperature values)`);
134
+ }
135
+ // Find tick mark paths — multi-segment paths with stroke-width ~0.5
136
+ // containing both major (longer) and minor (shorter) tick marks
137
+ const x_major_ticks = [];
138
+ const y_major_ticks = [];
139
+ for (const path of Array.from(doc.querySelectorAll(`path`))) {
140
+ const path_data = path.getAttribute(`d`) ?? ``;
141
+ const stroke_width = parse_stroke_width(path);
142
+ // Tick mark paths have stroke-width ~0.5
143
+ if (stroke_width < 0.3 || stroke_width > 1.0)
144
+ continue;
145
+ // Parse path into absolute line segments (handles both absolute & relative commands)
146
+ const segments = parse_path_segments(path_data);
147
+ if (segments.length < 3)
148
+ continue;
149
+ for (const [sx1, sy1, sx2, sy2] of segments) {
150
+ const seg_dx = Math.abs(sx2 - sx1);
151
+ const seg_dy = Math.abs(sy2 - sy1);
152
+ // Major ticks are longer (~3.9 px), minor are shorter (~1.7 px)
153
+ if (Math.hypot(seg_dx, seg_dy) < 3)
154
+ continue;
155
+ // Horizontal tick segments → y-axis tick (x changes, y constant)
156
+ if (seg_dy < 0.1 && seg_dx > 2) {
157
+ y_major_ticks.push(Math.round(sy1 * 100) / 100);
158
+ }
159
+ // Vertical tick segments → x-axis tick (y changes, x constant)
160
+ if (seg_dx < 0.1 && seg_dy > 2) {
161
+ x_major_ticks.push(Math.round(sx1 * 100) / 100);
162
+ }
163
+ }
164
+ }
165
+ // Deduplicate and sort
166
+ const x_ticks_sorted = [
167
+ ...new Set(x_major_ticks.map((value) => Math.round(value * 10) / 10)),
168
+ ].toSorted((a, b) => a - b);
169
+ const y_ticks_sorted = [
170
+ ...new Set(y_major_ticks.map((value) => Math.round(value * 10) / 10)),
171
+ ].toSorted((a, b) => a - b);
172
+ if (x_ticks_sorted.length < 2 || y_ticks_sorted.length < 2) {
173
+ throw new Error(`MPDS SVG: could not find tick marks (found ${x_ticks_sorted.length} x-ticks, ${y_ticks_sorted.length} y-ticks)`);
174
+ }
175
+ // Map tick positions to data values using endpoints
176
+ // Only the first and last tick+value need to match for a linear scale
177
+ // x-axis: composition in at% → fraction; y-axis: temperature (SVG y inverted)
178
+ const x_ticks = [
179
+ { px: x_ticks_sorted[0], value: comp_vals[0] / 100 },
180
+ {
181
+ px: x_ticks_sorted[x_ticks_sorted.length - 1],
182
+ value: comp_vals[comp_vals.length - 1] / 100,
183
+ },
184
+ ];
185
+ const y_ticks = [
186
+ { px: y_ticks_sorted[0], value: temp_vals[temp_vals.length - 1] }, // top = highest temp
187
+ { px: y_ticks_sorted[y_ticks_sorted.length - 1], value: temp_vals[0] }, // bottom = lowest temp
188
+ ];
189
+ return {
190
+ x_scale: build_scale(x_ticks),
191
+ y_scale: build_scale(y_ticks),
192
+ };
193
+ }
194
+ // Build a linear scale from tick data points
195
+ function build_scale(ticks) {
196
+ ticks.sort((a, b) => a.value - b.value);
197
+ const first = ticks[0];
198
+ const last = ticks[ticks.length - 1];
199
+ const range = last.value - first.value;
200
+ if (range === 0) {
201
+ return { to_data: () => first.value, domain: [first.value, last.value] };
202
+ }
203
+ const px_per_unit = (last.px - first.px) / range;
204
+ return {
205
+ to_data: (px) => first.value + (px - first.px) / px_per_unit,
206
+ domain: [first.value, last.value],
207
+ };
208
+ }
209
+ // === Boundary Extraction ===
210
+ // Extract phase boundary lines from SVG and convert to data coordinates
211
+ function extract_boundaries(doc, format, x_scale, y_scale) {
212
+ const boundaries = [];
213
+ const epsilon = 0.5; // pixel tolerance for classifying horizontal/vertical
214
+ if (format === `mpds`) {
215
+ extract_mpds_boundaries(doc, boundaries, x_scale, y_scale, epsilon);
216
+ }
217
+ else if (format === `matplotlib`) {
218
+ // Matplotlib: look for line2d_N groups with path elements (skip tick marks at line2d_1..12ish)
219
+ for (const group of Array.from(doc.querySelectorAll(`[id^="line2d_"]`))) {
220
+ const path_el = group.querySelector(`path`);
221
+ if (!path_el)
222
+ continue;
223
+ const d_attr = path_el.getAttribute(`d`);
224
+ if (!d_attr)
225
+ continue;
226
+ // Parse "M x1 y1 L x2 y2" path data
227
+ const coords = parse_ml_path(d_attr);
228
+ if (!coords)
229
+ continue;
230
+ // Skip tick mark lines (short lines, typically < 10px)
231
+ const dx = Math.abs(coords.x2 - coords.x1);
232
+ const dy = Math.abs(coords.y2 - coords.y1);
233
+ if (dx < 15 && dy < 15)
234
+ continue;
235
+ // Check stroke-width to distinguish boundaries from axis lines
236
+ const stroke_width = parse_stroke_width(path_el) || 1;
237
+ // Axis patches (id="patch_*") are axis borders, not phase boundaries
238
+ const parent_id = group.getAttribute(`id`) ?? ``;
239
+ if (parent_id.startsWith(`patch_`))
240
+ continue;
241
+ // Only include lines with meaningful stroke
242
+ if (stroke_width < 1)
243
+ continue;
244
+ add_boundary(boundaries, coords, x_scale, y_scale, epsilon);
245
+ }
246
+ }
247
+ else {
248
+ // Simple: <line class="phase-boundary">
249
+ for (const line_el of Array.from(doc.querySelectorAll(`.phase-boundary, line[class*="phase-boundary"]`))) {
250
+ const x1 = parse_float_attr(line_el, `x1`);
251
+ const y1 = parse_float_attr(line_el, `y1`);
252
+ const x2 = parse_float_attr(line_el, `x2`);
253
+ const y2 = parse_float_attr(line_el, `y2`);
254
+ if (x1 === null || y1 === null || x2 === null || y2 === null)
255
+ continue;
256
+ add_boundary(boundaries, { x1, y1, x2, y2 }, x_scale, y_scale, epsilon);
257
+ }
258
+ }
259
+ return boundaries;
260
+ }
261
+ // Extract boundaries from MPDS SVGs — simple M x1,y1 L x2,y2 path elements
262
+ // inside the plot area with thin stroke (0.216) and dark color
263
+ function extract_mpds_boundaries(doc, boundaries, x_scale, y_scale, epsilon) {
264
+ // Find the plot border to filter boundaries inside it
265
+ const plot_rect = find_mpds_plot_rect(doc);
266
+ if (!plot_rect)
267
+ return;
268
+ const { left, right, top, bottom } = plot_rect;
269
+ for (const path of Array.from(doc.querySelectorAll(`path`))) {
270
+ const path_data = path.getAttribute(`d`) ?? ``;
271
+ const style = path.getAttribute(`style`) ?? ``;
272
+ // Skip tick mark paths (stroke-width > 0.3)
273
+ const stroke_width = parse_stroke_width(path);
274
+ if (stroke_width > 0.3 || stroke_width === 0)
275
+ continue;
276
+ // Skip filled regions (phase region fills)
277
+ if ((style.includes(`fill-rule`) || style.includes(`fill: #`) || style.includes(`fill:#`)) &&
278
+ !style.includes(`fill: none`) &&
279
+ !style.includes(`fill:none`)) {
280
+ continue;
281
+ }
282
+ // Skip red annotation lines
283
+ if (style.includes(`#e30016`) || style.includes(`#E30016`))
284
+ continue;
285
+ // Parse as simple M...L line
286
+ const coords = parse_ml_path(path_data);
287
+ if (!coords)
288
+ continue;
289
+ // Must be inside the plot area
290
+ const inside = coords.x1 >= left - 1 &&
291
+ coords.x1 <= right + 1 &&
292
+ coords.x2 >= left - 1 &&
293
+ coords.x2 <= right + 1 &&
294
+ coords.y1 >= top - 1 &&
295
+ coords.y1 <= bottom + 1 &&
296
+ coords.y2 >= top - 1 &&
297
+ coords.y2 <= bottom + 1;
298
+ if (!inside)
299
+ continue;
300
+ // Skip very short segments (< 10px)
301
+ const dx = Math.abs(coords.x2 - coords.x1);
302
+ const dy = Math.abs(coords.y2 - coords.y1);
303
+ if (dx < 10 && dy < 10)
304
+ continue;
305
+ // Skip the plot border itself (connects all 4 edges)
306
+ const touches_left = Math.abs(coords.x1 - left) < 2 || Math.abs(coords.x2 - left) < 2;
307
+ const touches_right = Math.abs(coords.x1 - right) < 2 || Math.abs(coords.x2 - right) < 2;
308
+ if (touches_left && touches_right)
309
+ continue; // spans full width = likely axis
310
+ add_boundary(boundaries, coords, x_scale, y_scale, epsilon);
311
+ }
312
+ }
313
+ // Find the plot area rectangle in an MPDS SVG
314
+ // Handles both M...L...L...L...Z and M...V...H...V...Z formats
315
+ function find_mpds_plot_rect(doc) {
316
+ for (const path of Array.from(doc.querySelectorAll(`path`))) {
317
+ const path_data = path.getAttribute(`d`) ?? ``;
318
+ const style = path.getAttribute(`style`) ?? ``;
319
+ if (!style.includes(`fill: none`) && !style.includes(`fill:none`))
320
+ continue;
321
+ if (!path_data.includes(`Z`) && !path_data.includes(`z`))
322
+ continue;
323
+ // Parse path into absolute segments and extract corner points
324
+ const segments = parse_path_segments(path_data);
325
+ if (segments.length < 3)
326
+ continue; // rectangle needs at least 3 segments (4th is Z)
327
+ // Collect all x and y coordinates from segment endpoints
328
+ const xs = [];
329
+ const ys = [];
330
+ for (const [x1, y1, x2, y2] of segments) {
331
+ xs.push(Math.round(x1 * 10) / 10, Math.round(x2 * 10) / 10);
332
+ ys.push(Math.round(y1 * 10) / 10, Math.round(y2 * 10) / 10);
333
+ }
334
+ const unique_x = [...new Set(xs)];
335
+ const unique_y = [...new Set(ys)];
336
+ // Rectangle has exactly 2 unique x and 2 unique y values
337
+ if (unique_x.length === 2 && unique_y.length === 2) {
338
+ return {
339
+ left: Math.min(...unique_x),
340
+ right: Math.max(...unique_x),
341
+ top: Math.min(...unique_y),
342
+ bottom: Math.max(...unique_y),
343
+ };
344
+ }
345
+ }
346
+ return null;
347
+ }
348
+ // Add a boundary line, classifying as horizontal or vertical
349
+ function add_boundary(boundaries, px, x_scale, y_scale, epsilon) {
350
+ const is_vertical = Math.abs(px.x1 - px.x2) < epsilon;
351
+ const is_horizontal = Math.abs(px.y1 - px.y2) < epsilon;
352
+ if (!is_vertical && !is_horizontal)
353
+ return; // skip diagonal lines
354
+ const data_x1 = x_scale.to_data(px.x1);
355
+ const data_y1 = y_scale.to_data(px.y1);
356
+ const data_x2 = x_scale.to_data(px.x2);
357
+ const data_y2 = y_scale.to_data(px.y2);
358
+ boundaries.push({
359
+ x1: Math.min(data_x1, data_x2),
360
+ y1: Math.min(data_y1, data_y2),
361
+ x2: Math.max(data_x1, data_x2),
362
+ y2: Math.max(data_y1, data_y2),
363
+ orientation: is_vertical ? `vertical` : `horizontal`,
364
+ });
365
+ }
366
+ // === Label Extraction ===
367
+ // Extract phase region labels with their pixel positions
368
+ function extract_labels(doc, format) {
369
+ const labels = [];
370
+ if (format === `matplotlib`) {
371
+ extract_matplotlib_labels(doc, labels);
372
+ }
373
+ else if (format === `mpds`) {
374
+ // MPDS labels use garbled encoding; skip label extraction
375
+ // Regions will get auto-generated names from infer_regions
376
+ }
377
+ else {
378
+ extract_simple_labels(doc, labels);
379
+ }
380
+ return labels;
381
+ }
382
+ // Extract labels from matplotlib SVG using XML comments
383
+ function extract_matplotlib_labels(doc, labels) {
384
+ // Find text groups with comments containing phase names
385
+ // Matplotlib may split multi-line labels (especially rotated ones) into
386
+ // separate <g> groups: text_N has "La$_2$NiO$_4$", followed by a sibling
387
+ // with "+ La$_3$Ni$_2$O$_7$". We concatenate these continuation groups.
388
+ for (const group of Array.from(doc.querySelectorAll(`[id^="text_"]`))) {
389
+ let comment = find_comment_text(group);
390
+ if (!comment)
391
+ continue;
392
+ // Check following sibling groups for continuation comments starting with "+"
393
+ let sibling = group.nextElementSibling;
394
+ while (sibling) {
395
+ // Stop at the next text_N group (that's a separate label)
396
+ if (sibling.id?.startsWith(`text_`))
397
+ break;
398
+ const continuation = find_comment_text(sibling);
399
+ if (continuation?.trimStart().startsWith(`+`)) {
400
+ comment += ` ${continuation.trim()}`;
401
+ sibling = sibling.nextElementSibling;
402
+ }
403
+ else {
404
+ break;
405
+ }
406
+ }
407
+ if (!comment.includes(`+`))
408
+ continue; // skip axis labels (no "+")
409
+ // Clean LaTeX: "La$_2$NiO$_4$ + NiO" -> "La2NiO4 + NiO"
410
+ const text = clean_latex(comment.trim());
411
+ // Get position from transform="translate(x, y)"
412
+ const pos = parse_translate(group.querySelector(`g[transform]`)) ?? parse_translate(group);
413
+ if (!pos)
414
+ continue;
415
+ labels.push({ text, px_x: pos[0], px_y: pos[1] });
416
+ }
417
+ }
418
+ // Extract labels from simple SVG using class="label-main"
419
+ function extract_simple_labels(doc, labels) {
420
+ for (const text_el of Array.from(doc.querySelectorAll(`.label-main`))) {
421
+ // Get plain text content (strips tspan tags)
422
+ const text = (text_el.textContent ?? ``).replaceAll(/\s+/g, ` `).trim();
423
+ if (!text.includes(`+`))
424
+ continue; // skip non-phase labels
425
+ // Get position from transform or x/y attributes
426
+ const pos = parse_translate(text_el);
427
+ const px_x = pos?.[0] ?? parse_float_attr(text_el, `x`);
428
+ const px_y = pos?.[1] ?? parse_float_attr(text_el, `y`);
429
+ if (px_x !== null && px_y !== null) {
430
+ labels.push({ text, px_x, px_y });
431
+ }
432
+ }
433
+ }
434
+ // === Component Inference ===
435
+ const split_phase_label = (label) => label.text.split(/\s*\+\s*/);
436
+ // Infer binary components from region labels
437
+ function infer_components(labels) {
438
+ // Sort labels by x position, split each into phases
439
+ const sorted = labels.toSorted((a, b) => a.px_x - b.px_x);
440
+ if (sorted.length < 2)
441
+ return [`A`, `B`];
442
+ const leftmost = split_phase_label(sorted[0]);
443
+ const rightmost = split_phase_label(sorted[sorted.length - 1]);
444
+ // Component A: the unique phase in the leftmost region that doesn't appear on the right
445
+ // For "La2NiO4 + La2O3", La2O3 is the pure A endpoint
446
+ let comp_a = `A`;
447
+ if (leftmost.length === 2) {
448
+ const right_phases = new Set(sorted.slice(-3).flatMap(split_phase_label));
449
+ comp_a = leftmost.find((phase) => !right_phases.has(phase)) ?? leftmost[1] ?? `A`;
450
+ }
451
+ // Component B: the unique phase in the rightmost region that doesn't appear on the left
452
+ let comp_b = `B`;
453
+ if (rightmost.length === 2) {
454
+ const left_phases = new Set(sorted.slice(0, 3).flatMap(split_phase_label));
455
+ comp_b = rightmost.find((phase) => !left_phases.has(phase)) ?? rightmost[1] ?? `B`;
456
+ }
457
+ return [comp_a, comp_b];
458
+ }
459
+ // === Region Inference ===
460
+ // Infer phase regions from orthogonal boundaries using flood-fill on a cell grid
461
+ function infer_regions(boundaries, labels, x_scale, y_scale) {
462
+ const verticals = boundaries.filter((boundary) => boundary.orientation === `vertical`);
463
+ const horizontals = boundaries.filter((boundary) => boundary.orientation === `horizontal`);
464
+ // Collect all unique x and y coordinates (boundaries + domain edges)
465
+ const x_coords = collect_unique_sorted([
466
+ x_scale.domain[0],
467
+ x_scale.domain[1],
468
+ ...verticals.map((boundary) => boundary.x1), // x1 === x2 for vertical
469
+ ]);
470
+ const y_coords = collect_unique_sorted([
471
+ y_scale.domain[0],
472
+ y_scale.domain[1],
473
+ ...horizontals.map((boundary) => boundary.y1), // y1 === y2 for horizontal
474
+ ]);
475
+ // Build cell grid: cells[col][row]
476
+ const n_cols = x_coords.length - 1;
477
+ const n_rows = y_coords.length - 1;
478
+ const cell_ids = Array.from({ length: n_cols }, () => Array(n_rows).fill(-1));
479
+ // Check which cell edges have boundaries
480
+ const h_walls = Array.from({ length: n_cols }, () => Array(n_rows + 1).fill(false));
481
+ const v_walls = Array.from({ length: n_cols + 1 }, () => Array(n_rows).fill(false));
482
+ // Mark horizontal walls (bottom/top of cells)
483
+ for (const hb of horizontals) {
484
+ const row = find_coord_index(y_coords, hb.y1);
485
+ if (row === -1)
486
+ continue;
487
+ for (let col = 0; col < n_cols; col++) {
488
+ const cell_x_min = x_coords[col];
489
+ const cell_x_max = x_coords[col + 1];
490
+ // Check if the boundary spans this cell's x range
491
+ if (hb.x1 <= cell_x_min + 1e-6 && hb.x2 >= cell_x_max - 1e-6) {
492
+ h_walls[col][row] = true;
493
+ }
494
+ }
495
+ }
496
+ // Mark vertical walls (left/right of cells)
497
+ for (const vb of verticals) {
498
+ const col = find_coord_index(x_coords, vb.x1);
499
+ if (col === -1)
500
+ continue;
501
+ for (let row = 0; row < n_rows; row++) {
502
+ const cell_y_min = y_coords[row];
503
+ const cell_y_max = y_coords[row + 1];
504
+ // Check if the boundary spans this cell's y range
505
+ if (vb.y1 <= cell_y_min + 1e-6 && vb.y2 >= cell_y_max - 1e-6) {
506
+ v_walls[col][row] = true;
507
+ }
508
+ }
509
+ }
510
+ // Plot edges are always walls
511
+ for (let col = 0; col < n_cols; col++) {
512
+ h_walls[col][0] = true; // bottom edge
513
+ h_walls[col][n_rows] = true; // top edge
514
+ }
515
+ for (let row = 0; row < n_rows; row++) {
516
+ v_walls[0][row] = true; // left edge
517
+ v_walls[n_cols][row] = true; // right edge
518
+ }
519
+ // Flood-fill to assign region IDs
520
+ let next_region_id = 0;
521
+ for (let col = 0; col < n_cols; col++) {
522
+ for (let row = 0; row < n_rows; row++) {
523
+ if (cell_ids[col][row] !== -1)
524
+ continue;
525
+ flood_fill(cell_ids, h_walls, v_walls, col, row, n_cols, n_rows, next_region_id);
526
+ next_region_id++;
527
+ }
528
+ }
529
+ // Assign labels to regions by checking which region contains each label's position
530
+ const region_labels = new Map();
531
+ for (const label of labels) {
532
+ const data_x = x_scale.to_data(label.px_x);
533
+ const data_y = y_scale.to_data(label.px_y);
534
+ const col = find_cell_index(x_coords, data_x);
535
+ const row = find_cell_index(y_coords, data_y);
536
+ if (col >= 0 && col < n_cols && row >= 0 && row < n_rows) {
537
+ const region_id = cell_ids[col][row];
538
+ if (region_id !== -1) {
539
+ region_labels.set(region_id, label.text);
540
+ }
541
+ }
542
+ }
543
+ // Build region polygons from merged cells
544
+ const regions = [];
545
+ for (let region_id = 0; region_id < next_region_id; region_id++) {
546
+ const name = region_labels.get(region_id) ?? `Region ${region_id + 1}`;
547
+ // Slug can be empty for non-ASCII labels like "α + β" — fall back to region_N
548
+ const slug = name
549
+ .toLowerCase()
550
+ .replaceAll(/[^a-z0-9]+/g, `_`)
551
+ .replaceAll(/^_|_$/g, ``) || `region_${region_id + 1}`;
552
+ // Find bounding box of all cells in this region
553
+ let [min_x, max_x] = [Infinity, -Infinity];
554
+ let [min_y, max_y] = [Infinity, -Infinity];
555
+ for (let col = 0; col < n_cols; col++) {
556
+ for (let row = 0; row < n_rows; row++) {
557
+ if (cell_ids[col][row] !== region_id)
558
+ continue;
559
+ min_x = Math.min(min_x, x_coords[col]);
560
+ max_x = Math.max(max_x, x_coords[col + 1]);
561
+ min_y = Math.min(min_y, y_coords[row]);
562
+ max_y = Math.max(max_y, y_coords[row + 1]);
563
+ }
564
+ }
565
+ if (min_x === Infinity)
566
+ continue;
567
+ const bounds = [
568
+ [round(min_x), round(min_y)],
569
+ [round(max_x), round(min_y)],
570
+ [round(max_x), round(max_y)],
571
+ [round(min_x), round(max_y)],
572
+ ];
573
+ regions.push({
574
+ id: slug,
575
+ name,
576
+ color: TWO_PHASE_COLORS[region_id % TWO_PHASE_COLORS.length],
577
+ bounds,
578
+ });
579
+ }
580
+ return regions;
581
+ }
582
+ // Flood-fill connected cells that share an open edge
583
+ function flood_fill(cell_ids, h_walls, v_walls, start_col, start_row, n_cols, n_rows, region_id) {
584
+ const stack = [[start_col, start_row]];
585
+ for (let item = stack.pop(); item; item = stack.pop()) {
586
+ const [col, row] = item;
587
+ if (col < 0 || col >= n_cols || row < 0 || row >= n_rows)
588
+ continue;
589
+ if (cell_ids[col][row] !== -1)
590
+ continue;
591
+ cell_ids[col][row] = region_id;
592
+ // Check neighbors (no wall between them)
593
+ // Left neighbor: check v_walls[col][row]
594
+ if (col > 0 && !v_walls[col][row])
595
+ stack.push([col - 1, row]);
596
+ // Right neighbor: check v_walls[col+1][row]
597
+ if (col < n_cols - 1 && !v_walls[col + 1][row])
598
+ stack.push([col + 1, row]);
599
+ // Bottom neighbor: check h_walls[col][row]
600
+ if (row > 0 && !h_walls[col][row])
601
+ stack.push([col, row - 1]);
602
+ // Top neighbor: check h_walls[col][row+1]
603
+ if (row < n_rows - 1 && !h_walls[col][row + 1])
604
+ stack.push([col, row + 1]);
605
+ }
606
+ }
607
+ // === Curve Generation ===
608
+ // Generate named curves from boundaries for the DiagramInput format
609
+ function generate_curves(boundaries) {
610
+ const curves = {};
611
+ const counts = { vertical: 0, horizontal: 0 };
612
+ for (const bnd of boundaries) {
613
+ const is_vert = bnd.orientation === `vertical`;
614
+ const name = `${bnd.orientation}_${counts[bnd.orientation]++}`;
615
+ curves[name] = [
616
+ [round(bnd.x1), round(bnd.y1)],
617
+ [round(is_vert ? bnd.x1 : bnd.x2), round(is_vert ? bnd.y2 : bnd.y1)],
618
+ ];
619
+ }
620
+ return curves;
621
+ }
622
+ // === Main Entry Point ===
623
+ // Parse a phase diagram SVG string and return a DiagramInput
624
+ export function parse_phase_diagram_svg(svg_string) {
625
+ const parser = new DOMParser();
626
+ const doc = parser.parseFromString(svg_string, `image/svg+xml`);
627
+ // Check for parse errors
628
+ const parse_error = doc.querySelector(`parsererror`);
629
+ if (parse_error) {
630
+ throw new Error(`Invalid SVG: ${parse_error.textContent}`);
631
+ }
632
+ const format = detect_format(doc);
633
+ const { x_scale, y_scale } = extract_axis_scales(doc, format);
634
+ const boundaries = extract_boundaries(doc, format, x_scale, y_scale);
635
+ const labels = extract_labels(doc, format);
636
+ const components = format === `mpds` ? infer_mpds_components(doc) : infer_components(labels);
637
+ if (boundaries.length === 0) {
638
+ throw new Error(`No phase boundaries found in SVG`);
639
+ }
640
+ const regions = infer_regions(boundaries, labels, x_scale, y_scale);
641
+ const curves = generate_curves(boundaries);
642
+ // MPDS SVGs use °C for temperature
643
+ const temp_unit = format === `mpds` ? `°C` : `K`;
644
+ return {
645
+ meta: {
646
+ components,
647
+ temp_range: y_scale.domain,
648
+ temp_unit,
649
+ comp_unit: `fraction`,
650
+ title: `Imported Phase Diagram`,
651
+ },
652
+ curves,
653
+ regions,
654
+ };
655
+ }
656
+ // Infer components from MPDS SVGs by finding element-like text content
657
+ // MPDS SVGs have readable element names as text (e.g., "Cu", "Si")
658
+ function infer_mpds_components(doc) {
659
+ const elements = new Set();
660
+ for (const text_el of Array.from(doc.querySelectorAll(`text`))) {
661
+ const content = text_el.textContent?.trim() ?? ``;
662
+ // Match single/two-letter element symbols, exclude common non-element text
663
+ if (/^[A-Z][a-z]?$/.test(content) && content !== `L` && content !== `M`) {
664
+ elements.add(content);
665
+ }
666
+ }
667
+ const unique = [...elements];
668
+ return [unique[0] ?? `A`, unique[1] ?? `B`];
669
+ }
670
+ // === Utility Functions ===
671
+ // Parse stroke-width from style attribute or direct attribute (returns 0 if not found)
672
+ function parse_stroke_width(el) {
673
+ const style_match = /stroke-width:\s*([\d.]+)/.exec(el.getAttribute(`style`) ?? ``);
674
+ if (style_match)
675
+ return parseFloat(style_match[1]);
676
+ const attr = el.getAttribute(`stroke-width`);
677
+ return attr ? parseFloat(attr) || 0 : 0;
678
+ }
679
+ // Parse a float attribute from an SVG element
680
+ function parse_float_attr(el, attr) {
681
+ const val = el.getAttribute(attr);
682
+ if (val === null)
683
+ return null;
684
+ const parsed = parseFloat(val);
685
+ return isNaN(parsed) ? null : parsed;
686
+ }
687
+ // Extract a number from XML comment nodes inside a group element
688
+ function extract_comment_number(group) {
689
+ const walker = group.ownerDocument.createTreeWalker(group, NodeFilter.SHOW_COMMENT);
690
+ let node;
691
+ while ((node = walker.nextNode())) {
692
+ const value = parseFloat(node.textContent?.trim() ?? ``);
693
+ if (!isNaN(value))
694
+ return value;
695
+ }
696
+ return null;
697
+ }
698
+ // Find the first XML comment text inside or preceding a group
699
+ function find_comment_text(group) {
700
+ // Check comment nodes inside the group
701
+ const walker = group.ownerDocument.createTreeWalker(group, NodeFilter.SHOW_COMMENT);
702
+ let node;
703
+ while ((node = walker.nextNode())) {
704
+ const text = node.textContent?.trim();
705
+ if (text && text.length > 1)
706
+ return text;
707
+ }
708
+ // Check preceding sibling comments
709
+ let sibling = group.previousSibling;
710
+ while (sibling) {
711
+ if (sibling.nodeType === Node.COMMENT_NODE) {
712
+ const text = sibling.textContent?.trim();
713
+ if (text && text.length > 1)
714
+ return text;
715
+ }
716
+ if (sibling.nodeType === Node.ELEMENT_NODE)
717
+ break; // stop at previous element
718
+ sibling = sibling.previousSibling;
719
+ }
720
+ return null;
721
+ }
722
+ // Clean LaTeX subscript notation: "La$_2$NiO$_4$" -> "La2NiO4"
723
+ const clean_latex = (text) => text
724
+ .replaceAll(/\$_\{([^}]*)\}\$/g, `$1`) // $_{10}$ -> 10
725
+ .replaceAll(/\$_(\d)\$/g, `$1`) // $_2$ -> 2
726
+ .replaceAll(`$`, ``) // remove any remaining $
727
+ .replaceAll(/\s+/g, ` `)
728
+ .trim();
729
+ // Parse SVG path data into absolute line segments [x1,y1,x2,y2]
730
+ // Handles all SVG path commands (M/L/H/V/C/S/Q/T/A/Z, both absolute and relative)
731
+ // Curves (C/S/Q/T/A) are approximated as straight lines from start to endpoint
732
+ // After M/m, implicit coordinates are treated as L/l per SVG spec
733
+ function parse_path_segments(path_str) {
734
+ const segments = [];
735
+ let [cursor_x, cursor_y] = [0, 0];
736
+ let [start_x, start_y] = [0, 0];
737
+ let last_cmd = ``;
738
+ // Numbers to skip before the endpoint x,y for each curve command
739
+ const curve_skip = { C: 4, S: 2, Q: 2, T: 0, A: 5 };
740
+ const tokens = path_str.match(/[MmLlHhVvCcSsQqTtAaZz]|[-+]?[\d]*\.?[\d]+(?:[eE][-+]?\d+)?/g);
741
+ if (!tokens)
742
+ return segments;
743
+ let idx = 0;
744
+ const peek = () => tokens[idx];
745
+ const next_num = () => parseFloat(tokens[idx++] ?? `0`);
746
+ while (idx < tokens.length) {
747
+ let cmd = peek() ?? ``;
748
+ if (cmd.length === 1 && /[A-Za-z]/.test(cmd)) {
749
+ idx++;
750
+ last_cmd = cmd;
751
+ }
752
+ else {
753
+ // Implicit repeat: after M→L, after m→l, others repeat themselves
754
+ cmd = last_cmd === `M` ? `L` : last_cmd === `m` ? `l` : last_cmd;
755
+ }
756
+ if (cmd === `M` || cmd === `m`) {
757
+ const next_x = next_num();
758
+ const next_y = next_num();
759
+ cursor_x = cmd === `M` ? next_x : cursor_x + next_x;
760
+ cursor_y = cmd === `M` ? next_y : cursor_y + next_y;
761
+ start_x = cursor_x;
762
+ start_y = cursor_y;
763
+ last_cmd = cmd;
764
+ }
765
+ else if (cmd === `L` || cmd === `l`) {
766
+ const next_x = next_num();
767
+ const next_y = next_num();
768
+ const x2 = cmd === `L` ? next_x : cursor_x + next_x;
769
+ const y2 = cmd === `L` ? next_y : cursor_y + next_y;
770
+ segments.push([cursor_x, cursor_y, x2, y2]);
771
+ cursor_x = x2;
772
+ cursor_y = y2;
773
+ }
774
+ else if (cmd === `H` || cmd === `h`) {
775
+ const next_x = next_num();
776
+ const x2 = cmd === `H` ? next_x : cursor_x + next_x;
777
+ segments.push([cursor_x, cursor_y, x2, cursor_y]);
778
+ cursor_x = x2;
779
+ }
780
+ else if (cmd === `V` || cmd === `v`) {
781
+ const next_y = next_num();
782
+ const y2 = cmd === `V` ? next_y : cursor_y + next_y;
783
+ segments.push([cursor_x, cursor_y, cursor_x, y2]);
784
+ cursor_y = y2;
785
+ }
786
+ else if (cmd === `Z` || cmd === `z`) {
787
+ if (cursor_x !== start_x || cursor_y !== start_y) {
788
+ segments.push([cursor_x, cursor_y, start_x, start_y]);
789
+ }
790
+ cursor_x = start_x;
791
+ cursor_y = start_y;
792
+ }
793
+ else {
794
+ // Curve commands: skip control/arc params, use endpoint as straight line
795
+ // C=4 skip, S=2, Q=2, T=0, A=5 (numbers before the final x,y endpoint)
796
+ const upper = cmd.toUpperCase();
797
+ const skip = curve_skip[upper];
798
+ if (skip !== undefined) {
799
+ for (let skip_idx = 0; skip_idx < skip; skip_idx++)
800
+ next_num();
801
+ const end_x = next_num();
802
+ const end_y = next_num();
803
+ const x2 = cmd === upper ? end_x : cursor_x + end_x;
804
+ const y2 = cmd === upper ? end_y : cursor_y + end_y;
805
+ segments.push([cursor_x, cursor_y, x2, y2]);
806
+ cursor_x = x2;
807
+ cursor_y = y2;
808
+ }
809
+ else {
810
+ idx++; // skip unknown tokens
811
+ }
812
+ }
813
+ }
814
+ return segments;
815
+ }
816
+ // Parse a simple 2-point line path (M...L only). Returns null for multi-segment paths
817
+ // to enforce the single-line contract expected by boundary extraction.
818
+ function parse_ml_path(path_str) {
819
+ const segments = parse_path_segments(path_str);
820
+ if (segments.length !== 1)
821
+ return null;
822
+ const [x1, y1, x2, y2] = segments[0];
823
+ return { x1, y1, x2, y2 };
824
+ }
825
+ // Parse translate(x, y) or translate(x) from a transform attribute
826
+ // Single-arg translate uses implicit y=0 per SVG spec
827
+ function parse_translate(el) {
828
+ const match = /translate\(\s*([\d.eE+-]+)(?:\s*[,\s]\s*([\d.eE+-]+))?\s*\)/.exec(el?.getAttribute(`transform`) ?? ``);
829
+ if (!match)
830
+ return null;
831
+ return [parseFloat(match[1]), match[2] ? parseFloat(match[2]) : 0];
832
+ }
833
+ // Get translate X or Y from a group's transform attribute
834
+ function get_group_translate(el, axis) {
835
+ const coords = parse_translate(el);
836
+ return coords ? coords[axis === `x` ? 0 : 1] : 0;
837
+ }
838
+ // Collect unique sorted values from an array (with epsilon deduplication)
839
+ function collect_unique_sorted(values) {
840
+ if (values.length === 0)
841
+ return [];
842
+ const sorted = values.toSorted((a, b) => a - b);
843
+ const unique = [sorted[0]];
844
+ for (let idx = 1; idx < sorted.length; idx++) {
845
+ if (Math.abs(sorted[idx] - unique[unique.length - 1]) > 1e-4) {
846
+ unique.push(sorted[idx]);
847
+ }
848
+ }
849
+ return unique;
850
+ }
851
+ // Find the index of a coordinate in a sorted array (with epsilon tolerance)
852
+ function find_coord_index(coords, value) {
853
+ for (let idx = 0; idx < coords.length; idx++) {
854
+ if (Math.abs(coords[idx] - value) < 1e-4)
855
+ return idx;
856
+ }
857
+ return -1;
858
+ }
859
+ // Find which cell interval a value falls into
860
+ function find_cell_index(coords, value) {
861
+ for (let idx = 0; idx < coords.length - 1; idx++) {
862
+ if (value >= coords[idx] - 1e-4 && value <= coords[idx + 1] + 1e-4) {
863
+ return idx;
864
+ }
865
+ }
866
+ return -1;
867
+ }