matterviz 0.4.0 → 0.4.2

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 (527) hide show
  1. package/dist/EmptyState.svelte +10 -4
  2. package/dist/FilePicker.svelte +12 -14
  3. package/dist/Icon.svelte +7 -4
  4. package/dist/MillerIndexInput.svelte +2 -2
  5. package/dist/app.css +53 -0
  6. package/dist/brillouin/BrillouinZone.svelte +132 -219
  7. package/dist/brillouin/BrillouinZone.svelte.d.ts +9 -20
  8. package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
  9. package/dist/brillouin/BrillouinZoneExportPane.svelte +47 -96
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  11. package/dist/brillouin/BrillouinZoneInfoPane.svelte +15 -42
  12. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +2 -3
  13. package/dist/brillouin/BrillouinZoneScene.svelte +63 -230
  14. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +3 -23
  15. package/dist/brillouin/ReciprocalVectors.svelte +39 -0
  16. package/dist/brillouin/ReciprocalVectors.svelte.d.ts +9 -0
  17. package/dist/brillouin/compute.d.ts +2 -0
  18. package/dist/brillouin/compute.js +80 -77
  19. package/dist/brillouin/geometry.d.ts +8 -0
  20. package/dist/brillouin/geometry.js +57 -0
  21. package/dist/brillouin/index.d.ts +2 -0
  22. package/dist/brillouin/index.js +2 -0
  23. package/dist/brillouin/types.d.ts +2 -2
  24. package/dist/chempot-diagram/ChemPotDiagram.svelte +33 -38
  25. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +1 -1
  26. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +143 -246
  27. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +4 -1
  28. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +652 -976
  29. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +7 -1
  30. package/dist/chempot-diagram/async-compute.svelte.js +1 -1
  31. package/dist/chempot-diagram/color.d.ts +3 -6
  32. package/dist/chempot-diagram/color.js +5 -5
  33. package/dist/chempot-diagram/compute.d.ts +3 -3
  34. package/dist/chempot-diagram/compute.js +3 -1
  35. package/dist/chempot-diagram/controls-state.svelte.d.ts +10 -0
  36. package/dist/chempot-diagram/controls-state.svelte.js +42 -0
  37. package/dist/chempot-diagram/export.d.ts +47 -0
  38. package/dist/chempot-diagram/export.js +133 -0
  39. package/dist/chempot-diagram/index.d.ts +1 -0
  40. package/dist/chempot-diagram/index.js +1 -0
  41. package/dist/chempot-diagram/pointer.d.ts +0 -10
  42. package/dist/chempot-diagram/pointer.js +4 -4
  43. package/dist/chempot-diagram/types.d.ts +3 -3
  44. package/dist/colors/index.d.ts +0 -4
  45. package/dist/colors/index.js +21 -22
  46. package/dist/composition/BarChart.svelte +37 -31
  47. package/dist/composition/BubbleChart.svelte +17 -17
  48. package/dist/composition/Composition.svelte +7 -11
  49. package/dist/composition/Formula.svelte +18 -25
  50. package/dist/composition/FormulaFilter.svelte +96 -98
  51. package/dist/composition/PieChart.svelte +60 -46
  52. package/dist/composition/chem-sys.js +3 -2
  53. package/dist/composition/format.js +4 -3
  54. package/dist/composition/index.d.ts +2 -0
  55. package/dist/composition/index.js +14 -0
  56. package/dist/composition/parse.d.ts +2 -3
  57. package/dist/composition/parse.js +27 -28
  58. package/dist/constants.js +11 -9
  59. package/dist/controls.d.ts +1 -0
  60. package/dist/controls.js +0 -1
  61. package/dist/convex-hull/ConvexHull.svelte +20 -25
  62. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -4
  63. package/dist/convex-hull/ConvexHull2D.svelte +176 -256
  64. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  65. package/dist/convex-hull/ConvexHull3D.svelte +269 -804
  66. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  67. package/dist/convex-hull/ConvexHull4D.svelte +236 -755
  68. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  69. package/dist/convex-hull/ConvexHullChrome.svelte +264 -0
  70. package/dist/convex-hull/ConvexHullChrome.svelte.d.ts +30 -0
  71. package/dist/convex-hull/ConvexHullControls.svelte +128 -49
  72. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +7 -6
  73. package/dist/convex-hull/ConvexHullInfoPane.svelte +18 -5
  74. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +6 -5
  75. package/dist/convex-hull/ConvexHullStats.svelte +210 -351
  76. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +3 -1
  77. package/dist/convex-hull/ConvexHullTooltip.svelte +16 -14
  78. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +2 -1
  79. package/dist/convex-hull/GasPressureControls.svelte +5 -12
  80. package/dist/convex-hull/StructurePopup.svelte +17 -21
  81. package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
  82. package/dist/convex-hull/TemperatureSlider.svelte +4 -10
  83. package/dist/convex-hull/barycentric-coords.d.ts +2 -4
  84. package/dist/convex-hull/barycentric-coords.js +6 -33
  85. package/dist/convex-hull/canvas-interactions.svelte.d.ts +79 -0
  86. package/dist/convex-hull/canvas-interactions.svelte.js +279 -0
  87. package/dist/convex-hull/helpers.d.ts +47 -17
  88. package/dist/convex-hull/helpers.js +186 -101
  89. package/dist/convex-hull/hull-state.svelte.d.ts +44 -0
  90. package/dist/convex-hull/hull-state.svelte.js +124 -0
  91. package/dist/convex-hull/index.d.ts +9 -7
  92. package/dist/convex-hull/index.js +7 -2
  93. package/dist/convex-hull/thermodynamics.js +109 -937
  94. package/dist/convex-hull/types.d.ts +12 -4
  95. package/dist/convex-hull/types.js +12 -0
  96. package/dist/coordination/CoordinationBarPlot.svelte +41 -43
  97. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  98. package/dist/coordination/calc-coordination.d.ts +1 -1
  99. package/dist/coordination/calc-coordination.js +28 -25
  100. package/dist/element/BohrAtom.svelte +6 -8
  101. package/dist/element/ElementHeading.svelte +4 -1
  102. package/dist/element/ElementPhoto.svelte +11 -9
  103. package/dist/element/ElementStats.svelte +12 -10
  104. package/dist/element/ElementTile.svelte +24 -29
  105. package/dist/element/ElementTile.svelte.d.ts +1 -1
  106. package/dist/element/Nucleus.svelte +4 -2
  107. package/dist/element/data.d.ts +1 -2
  108. package/dist/element/helpers.d.ts +4 -0
  109. package/dist/element/helpers.js +18 -0
  110. package/dist/element/index.d.ts +1 -0
  111. package/dist/element/index.js +3 -0
  112. package/dist/feedback/DragOverlay.svelte +5 -3
  113. package/dist/feedback/DragOverlay.svelte.d.ts +2 -1
  114. package/dist/feedback/StatusMessage.svelte +20 -7
  115. package/dist/fermi-surface/FermiSlice.svelte +21 -18
  116. package/dist/fermi-surface/FermiSurface.svelte +78 -165
  117. package/dist/fermi-surface/FermiSurface.svelte.d.ts +9 -20
  118. package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
  119. package/dist/fermi-surface/FermiSurfaceScene.svelte +93 -272
  120. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +3 -23
  121. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
  122. package/dist/fermi-surface/compute.js +14 -13
  123. package/dist/fermi-surface/export.js +4 -15
  124. package/dist/fermi-surface/index.d.ts +0 -1
  125. package/dist/fermi-surface/index.js +0 -1
  126. package/dist/fermi-surface/parse.d.ts +1 -1
  127. package/dist/fermi-surface/parse.js +84 -97
  128. package/dist/fermi-surface/types.d.ts +2 -2
  129. package/dist/heatmap-matrix/HeatmapMatrix.svelte +161 -185
  130. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +6 -5
  131. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +12 -9
  132. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +5 -5
  133. package/dist/heatmap-matrix/index.d.ts +8 -2
  134. package/dist/icons.d.ts +4 -0
  135. package/dist/icons.js +4 -0
  136. package/dist/index.d.ts +1 -0
  137. package/dist/index.js +1 -0
  138. package/dist/io/ExportPane.svelte +170 -0
  139. package/dist/io/ExportPane.svelte.d.ts +17 -0
  140. package/dist/io/decompress.d.ts +2 -1
  141. package/dist/io/decompress.js +22 -36
  142. package/dist/io/export.d.ts +9 -1
  143. package/dist/io/export.js +37 -29
  144. package/dist/io/fetch.d.ts +2 -4
  145. package/dist/io/fetch.js +0 -11
  146. package/dist/io/file-drop.d.ts +7 -0
  147. package/dist/io/file-drop.js +13 -0
  148. package/dist/io/index.d.ts +1 -0
  149. package/dist/io/index.js +3 -0
  150. package/dist/io/is-binary.d.ts +9 -0
  151. package/dist/io/is-binary.js +45 -1
  152. package/dist/io/types.d.ts +13 -0
  153. package/dist/io/url-drop.js +13 -25
  154. package/dist/isosurface/Isosurface.svelte +17 -23
  155. package/dist/isosurface/IsosurfaceControls.svelte +37 -42
  156. package/dist/isosurface/parse-vaspwave.d.ts +3 -0
  157. package/dist/isosurface/parse-vaspwave.js +138 -0
  158. package/dist/isosurface/parse.js +50 -48
  159. package/dist/labels.d.ts +6 -2
  160. package/dist/labels.js +44 -14
  161. package/dist/layout/FullscreenButton.svelte +34 -0
  162. package/dist/layout/FullscreenButton.svelte.d.ts +10 -0
  163. package/dist/layout/FullscreenToggle.svelte +12 -12
  164. package/dist/layout/InfoCard.svelte +7 -18
  165. package/dist/layout/InfoTag.svelte +1 -3
  166. package/dist/layout/NumberRangeInput.svelte +46 -0
  167. package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
  168. package/dist/layout/PropertyFilter.svelte +2 -6
  169. package/dist/layout/SettingsSection.svelte +21 -17
  170. package/dist/layout/SubpageGrid.svelte +3 -1
  171. package/dist/layout/ViewerChrome.svelte +115 -0
  172. package/dist/layout/ViewerChrome.svelte.d.ts +18 -0
  173. package/dist/layout/fullscreen.d.ts +4 -0
  174. package/dist/layout/fullscreen.js +3 -5
  175. package/dist/layout/fullscreen.svelte.d.ts +8 -0
  176. package/dist/layout/fullscreen.svelte.js +36 -0
  177. package/dist/layout/index.d.ts +4 -0
  178. package/dist/layout/index.js +4 -0
  179. package/dist/layout/json-tree/JsonNode.svelte +8 -11
  180. package/dist/layout/json-tree/JsonTree.svelte +53 -77
  181. package/dist/layout/json-tree/JsonValue.svelte +7 -15
  182. package/dist/layout/json-tree/utils.js +14 -23
  183. package/dist/math.d.ts +9 -3
  184. package/dist/math.js +37 -21
  185. package/dist/overlays/ContextMenu.svelte +4 -2
  186. package/dist/overlays/CopyButton.svelte +11 -5
  187. package/dist/overlays/DragControlTab.svelte +6 -1
  188. package/dist/overlays/DraggablePane.svelte +81 -26
  189. package/dist/overlays/DraggablePane.svelte.d.ts +1 -0
  190. package/dist/overlays/GlassChip.svelte +30 -0
  191. package/dist/overlays/GlassChip.svelte.d.ts +8 -0
  192. package/dist/overlays/InfoPaneCards.svelte +11 -23
  193. package/dist/overlays/index.d.ts +11 -0
  194. package/dist/overlays/index.js +26 -0
  195. package/dist/overlays/portal.d.ts +2 -0
  196. package/dist/overlays/portal.js +14 -0
  197. package/dist/periodic-table/PeriodicTable.svelte +115 -146
  198. package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
  199. package/dist/periodic-table/PeriodicTableControls.svelte +11 -63
  200. package/dist/periodic-table/TableInset.svelte +9 -4
  201. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +50 -71
  202. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
  203. package/dist/phase-diagram/PhaseDiagramControls.svelte +73 -96
  204. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +4 -3
  205. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +4 -2
  206. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +2 -3
  207. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +49 -134
  208. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +3 -4
  209. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
  210. package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
  211. package/dist/phase-diagram/build-diagram.js +3 -3
  212. package/dist/phase-diagram/colors.js +1 -1
  213. package/dist/phase-diagram/diagram-input.d.ts +1 -2
  214. package/dist/phase-diagram/parse.d.ts +2 -1
  215. package/dist/phase-diagram/parse.js +15 -15
  216. package/dist/phase-diagram/svg-to-diagram.js +21 -15
  217. package/dist/phase-diagram/utils.js +2 -3
  218. package/dist/plot/bar/BarPlot.svelte +494 -692
  219. package/dist/plot/bar/BarPlot.svelte.d.ts +9 -15
  220. package/dist/plot/bar/BarPlotControls.svelte +1 -3
  221. package/dist/plot/bar/BarPlotControls.svelte.d.ts +5 -7
  222. package/dist/plot/bar/SpacegroupBarPlot.svelte +31 -37
  223. package/dist/plot/bar/data.d.ts +5 -4
  224. package/dist/plot/bar/data.js +2 -1
  225. package/dist/plot/box/BoxPlot.svelte +361 -439
  226. package/dist/plot/box/BoxPlot.svelte.d.ts +6 -3
  227. package/dist/plot/box/BoxPlotControls.svelte.d.ts +1 -1
  228. package/dist/plot/box/Violin.svelte.d.ts +2 -1
  229. package/dist/plot/box/box-plot.d.ts +3 -2
  230. package/dist/plot/box/box-plot.js +6 -3
  231. package/dist/plot/box/kde.d.ts +2 -1
  232. package/dist/plot/box/kde.js +4 -4
  233. package/dist/plot/core/auto-place.d.ts +1 -1
  234. package/dist/plot/core/auto-place.js +5 -2
  235. package/dist/plot/core/axis-utils.d.ts +12 -7
  236. package/dist/plot/core/axis-utils.js +48 -48
  237. package/dist/plot/core/components/AxisLabel.svelte +82 -20
  238. package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
  239. package/dist/plot/core/components/ColorBar.svelte +106 -111
  240. package/dist/plot/core/components/ColorBar.svelte.d.ts +5 -4
  241. package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
  242. package/dist/plot/core/components/FillArea.svelte +10 -17
  243. package/dist/plot/core/components/HierarchyControls.svelte +249 -0
  244. package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
  245. package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
  246. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
  247. package/dist/plot/core/components/Line.svelte +21 -11
  248. package/dist/plot/core/components/Line.svelte.d.ts +5 -2
  249. package/dist/plot/core/components/PlotAxis.svelte +42 -18
  250. package/dist/plot/core/components/PlotAxis.svelte.d.ts +2 -1
  251. package/dist/plot/core/components/PlotControls.svelte +65 -41
  252. package/dist/plot/core/components/PlotControls.svelte.d.ts +1 -1
  253. package/dist/plot/core/components/PlotLegend.svelte +31 -35
  254. package/dist/plot/core/components/PlotMarginals.svelte +616 -0
  255. package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
  256. package/dist/plot/core/components/PlotTooltip.svelte +1 -1
  257. package/dist/plot/core/components/PortalSelect.svelte +4 -8
  258. package/dist/plot/core/components/ReferenceLine.svelte +27 -24
  259. package/dist/plot/core/components/ReferenceLine3D.svelte +56 -59
  260. package/dist/plot/core/components/ReferenceLine3D.svelte.d.ts +4 -4
  261. package/dist/plot/core/components/ReferencePlane.svelte +9 -10
  262. package/dist/plot/core/components/ReferencePlane.svelte.d.ts +4 -4
  263. package/dist/plot/core/components/ZeroLines.svelte +4 -8
  264. package/dist/plot/core/components/ZoomRect.svelte +1 -2
  265. package/dist/plot/core/components/index.d.ts +1 -0
  266. package/dist/plot/core/components/index.js +1 -0
  267. package/dist/plot/core/data-cleaning-signal.d.ts +46 -0
  268. package/dist/plot/core/data-cleaning-signal.js +467 -0
  269. package/dist/plot/core/data-cleaning.d.ts +2 -42
  270. package/dist/plot/core/data-cleaning.js +29 -476
  271. package/dist/plot/core/data-transform.js +9 -5
  272. package/dist/plot/core/fill-utils.d.ts +7 -4
  273. package/dist/plot/core/fill-utils.js +34 -9
  274. package/dist/plot/core/index.d.ts +1 -0
  275. package/dist/plot/core/index.js +1 -0
  276. package/dist/plot/core/interactions.d.ts +5 -1
  277. package/dist/plot/core/interactions.js +14 -2
  278. package/dist/plot/core/layout.d.ts +3 -1
  279. package/dist/plot/core/layout.js +22 -13
  280. package/dist/plot/core/marginals.d.ts +170 -0
  281. package/dist/plot/core/marginals.js +436 -0
  282. package/dist/plot/core/pan-zoom.svelte.d.ts +35 -0
  283. package/dist/plot/core/pan-zoom.svelte.js +221 -0
  284. package/dist/plot/core/placed-tween.svelte.d.ts +21 -0
  285. package/dist/plot/core/placed-tween.svelte.js +68 -0
  286. package/dist/plot/core/reference-line.d.ts +10 -10
  287. package/dist/plot/core/reference-line.js +7 -7
  288. package/dist/plot/core/scales.d.ts +40 -25
  289. package/dist/plot/core/scales.js +49 -21
  290. package/dist/plot/core/svg.d.ts +2 -1
  291. package/dist/plot/core/types/fills.d.ts +101 -0
  292. package/dist/plot/core/types/fills.js +15 -0
  293. package/dist/plot/core/types/plot-3d.d.ts +87 -0
  294. package/dist/plot/core/types/plot-3d.js +4 -0
  295. package/dist/plot/core/types/reference-lines.d.ts +140 -0
  296. package/dist/plot/core/types/reference-lines.js +9 -0
  297. package/dist/plot/core/types.d.ts +47 -331
  298. package/dist/plot/core/types.js +23 -20
  299. package/dist/plot/core/utils/hierarchy-chart.d.ts +51 -0
  300. package/dist/plot/core/utils/hierarchy-chart.js +179 -0
  301. package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
  302. package/dist/plot/core/utils/hierarchy-labels.js +99 -0
  303. package/dist/plot/core/utils/label-placement.d.ts +1 -1
  304. package/dist/plot/core/utils/label-placement.js +5 -5
  305. package/dist/plot/core/utils.d.ts +2 -1
  306. package/dist/plot/histogram/Histogram.svelte +373 -631
  307. package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
  308. package/dist/plot/histogram/HistogramControls.svelte +30 -28
  309. package/dist/plot/histogram/HistogramControls.svelte.d.ts +1 -1
  310. package/dist/plot/histogram/histogram.d.ts +31 -0
  311. package/dist/plot/histogram/histogram.js +70 -0
  312. package/dist/plot/histogram/index.d.ts +1 -0
  313. package/dist/plot/histogram/index.js +1 -0
  314. package/dist/plot/index.d.ts +1 -0
  315. package/dist/plot/index.js +1 -0
  316. package/dist/plot/sankey/Sankey.svelte +79 -73
  317. package/dist/plot/sankey/Sankey.svelte.d.ts +3 -3
  318. package/dist/plot/sankey/SankeyControls.svelte +22 -16
  319. package/dist/plot/sankey/sankey.js +3 -1
  320. package/dist/plot/scatter/BinnedScatterPlot.svelte +264 -112
  321. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +11 -4
  322. package/dist/plot/scatter/ElementScatter.svelte +4 -1
  323. package/dist/plot/scatter/ScatterPlot.svelte +623 -821
  324. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +9 -15
  325. package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
  326. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  327. package/dist/plot/scatter/ScatterPoint.svelte +16 -9
  328. package/dist/plot/scatter/binned-scatter-types.d.ts +6 -12
  329. package/dist/plot/scatter/binned-scatter-types.js +6 -1
  330. package/dist/plot/scatter/index.d.ts +1 -1
  331. package/dist/plot/scatter/scatter-data.d.ts +1 -1
  332. package/dist/plot/scatter/scatter-data.js +8 -7
  333. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +40 -60
  334. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +6 -14
  335. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +17 -15
  336. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte.d.ts +5 -5
  337. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +232 -234
  338. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +5 -14
  339. package/dist/plot/scatter-3d/Surface3D.svelte +9 -17
  340. package/dist/plot/scatter-3d/Surface3D.svelte.d.ts +4 -3
  341. package/dist/plot/sunburst/Sunburst.svelte +256 -338
  342. package/dist/plot/sunburst/Sunburst.svelte.d.ts +4 -3
  343. package/dist/plot/sunburst/index.d.ts +1 -1
  344. package/dist/plot/sunburst/index.js +2 -1
  345. package/dist/plot/sunburst/render.d.ts +2 -2
  346. package/dist/plot/sunburst/render.js +47 -22
  347. package/dist/plot/sunburst/sunburst.d.ts +5 -1
  348. package/dist/plot/sunburst/sunburst.js +14 -4
  349. package/dist/plot/treemap/Treemap.svelte +907 -0
  350. package/dist/plot/treemap/Treemap.svelte.d.ts +84 -0
  351. package/dist/plot/treemap/index.d.ts +3 -0
  352. package/dist/plot/treemap/index.js +4 -0
  353. package/dist/plot/treemap/treemap.d.ts +26 -0
  354. package/dist/plot/treemap/treemap.js +99 -0
  355. package/dist/rdf/RdfPlot.svelte +22 -26
  356. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  357. package/dist/rdf/calc-rdf.js +4 -8
  358. package/dist/sanitize.js +14 -3
  359. package/dist/scene/SceneCamera.svelte +62 -0
  360. package/dist/scene/SceneCamera.svelte.d.ts +19 -0
  361. package/dist/scene/bind-renderer.svelte.d.ts +2 -0
  362. package/dist/scene/bind-renderer.svelte.js +22 -0
  363. package/dist/scene/index.d.ts +4 -0
  364. package/dist/scene/index.js +5 -0
  365. package/dist/scene/props.js +52 -0
  366. package/dist/scene/types.d.ts +26 -0
  367. package/dist/scene/types.js +1 -0
  368. package/dist/settings.d.ts +33 -11
  369. package/dist/settings.js +136 -51
  370. package/dist/spectral/Bands.svelte +231 -237
  371. package/dist/spectral/Bands.svelte.d.ts +3 -2
  372. package/dist/spectral/BandsAndDos.svelte +29 -29
  373. package/dist/spectral/BrillouinBandsDos.svelte +21 -29
  374. package/dist/spectral/Dos.svelte +75 -77
  375. package/dist/spectral/Dos.svelte.d.ts +2 -1
  376. package/dist/spectral/helpers.d.ts +9 -9
  377. package/dist/spectral/helpers.js +66 -70
  378. package/dist/state.svelte.d.ts +0 -7
  379. package/dist/state.svelte.js +5 -24
  380. package/dist/structure/Arrow.svelte +6 -21
  381. package/dist/structure/ArrowInstances.svelte +160 -0
  382. package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
  383. package/dist/structure/AtomLegend.svelte +115 -75
  384. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  385. package/dist/structure/Bond.svelte +31 -23
  386. package/dist/structure/CanvasTooltip.svelte +16 -3
  387. package/dist/structure/CellSelect.svelte +22 -29
  388. package/dist/structure/CellSelect.svelte.d.ts +2 -1
  389. package/dist/structure/Cylinder.svelte +24 -40
  390. package/dist/structure/InstancedAtoms.svelte +114 -0
  391. package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
  392. package/dist/structure/Lattice.svelte +85 -149
  393. package/dist/structure/SiteLabels.svelte +122 -0
  394. package/dist/structure/SiteLabels.svelte.d.ts +18 -0
  395. package/dist/structure/Structure.svelte +725 -735
  396. package/dist/structure/Structure.svelte.d.ts +8 -16
  397. package/dist/structure/StructureCarousel.svelte +630 -0
  398. package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
  399. package/dist/structure/StructureControls.svelte +298 -325
  400. package/dist/structure/StructureControls.svelte.d.ts +5 -3
  401. package/dist/structure/StructureExportPane.svelte +62 -168
  402. package/dist/structure/StructureExportPane.svelte.d.ts +4 -5
  403. package/dist/structure/StructureInfoPane.svelte +77 -69
  404. package/dist/structure/StructureInfoPane.svelte.d.ts +6 -6
  405. package/dist/structure/StructureScene.svelte +758 -600
  406. package/dist/structure/StructureScene.svelte.d.ts +24 -20
  407. package/dist/structure/StructureViewport.svelte +386 -0
  408. package/dist/structure/StructureViewport.svelte.d.ts +63 -0
  409. package/dist/structure/atom-label-placement.d.ts +18 -0
  410. package/dist/structure/atom-label-placement.js +115 -0
  411. package/dist/structure/atom-properties.d.ts +3 -1
  412. package/dist/structure/atom-properties.js +115 -54
  413. package/dist/structure/bond-order-perception.js +2 -4
  414. package/dist/structure/bonding.d.ts +12 -2
  415. package/dist/structure/bonding.js +172 -73
  416. package/dist/structure/edit-history.d.ts +6 -0
  417. package/dist/structure/edit-history.js +27 -0
  418. package/dist/structure/export.d.ts +25 -4
  419. package/dist/structure/export.js +103 -153
  420. package/dist/structure/format-detect.d.ts +1 -0
  421. package/dist/structure/format-detect.js +22 -0
  422. package/dist/structure/geometry.d.ts +9 -0
  423. package/dist/structure/geometry.js +27 -0
  424. package/dist/structure/index.d.ts +18 -1
  425. package/dist/structure/index.js +15 -2
  426. package/dist/structure/measure.d.ts +1 -1
  427. package/dist/structure/measure.js +6 -12
  428. package/dist/structure/parse.d.ts +5 -3
  429. package/dist/structure/parse.js +551 -567
  430. package/dist/structure/partial-occupancy.d.ts +0 -1
  431. package/dist/structure/partial-occupancy.js +5 -3
  432. package/dist/structure/pbc.d.ts +1 -1
  433. package/dist/structure/pbc.js +204 -51
  434. package/dist/structure/polyhedra.d.ts +40 -0
  435. package/dist/structure/polyhedra.js +587 -0
  436. package/dist/structure/site.d.ts +4 -0
  437. package/dist/structure/site.js +1 -0
  438. package/dist/structure/supercell.d.ts +1 -2
  439. package/dist/structure/supercell.js +10 -15
  440. package/dist/structure/validation.js +5 -6
  441. package/dist/symmetry/SymmetryElementControls.svelte +69 -0
  442. package/dist/symmetry/SymmetryElementControls.svelte.d.ts +9 -0
  443. package/dist/symmetry/SymmetryElements.svelte +350 -0
  444. package/dist/symmetry/SymmetryElements.svelte.d.ts +24 -0
  445. package/dist/symmetry/SymmetryStats.svelte +142 -49
  446. package/dist/symmetry/WyckoffTable.svelte +58 -16
  447. package/dist/symmetry/WyckoffTable.svelte.d.ts +3 -0
  448. package/dist/symmetry/cell-transform.js +8 -14
  449. package/dist/symmetry/index.d.ts +15 -4
  450. package/dist/symmetry/index.js +308 -81
  451. package/dist/symmetry/spacegroups.d.ts +5 -1
  452. package/dist/symmetry/spacegroups.js +18 -3
  453. package/dist/symmetry/symmetry-elements.d.ts +33 -0
  454. package/dist/symmetry/symmetry-elements.js +521 -0
  455. package/dist/symmetry/wyckoff-db.d.ts +9 -0
  456. package/dist/symmetry/wyckoff-db.js +87 -0
  457. package/dist/table/HeatmapTable.svelte +1104 -378
  458. package/dist/table/HeatmapTable.svelte.d.ts +12 -2
  459. package/dist/table/ToggleMenu.svelte +5 -12
  460. package/dist/table/index.d.ts +21 -6
  461. package/dist/table/index.js +34 -21
  462. package/dist/theme/ThemeControl.svelte +16 -8
  463. package/dist/theme/index.d.ts +1 -5
  464. package/dist/theme/index.js +4 -10
  465. package/dist/theme/themes.mjs +14 -7
  466. package/dist/tooltip/KCoords.svelte +4 -1
  467. package/dist/tooltip/TooltipContent.svelte +2 -5
  468. package/dist/trajectory/Trajectory.svelte +556 -352
  469. package/dist/trajectory/Trajectory.svelte.d.ts +10 -22
  470. package/dist/trajectory/TrajectoryError.svelte +11 -8
  471. package/dist/trajectory/TrajectoryExportPane.svelte +28 -54
  472. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +4 -5
  473. package/dist/trajectory/TrajectoryInfoPane.svelte +88 -99
  474. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +3 -2
  475. package/dist/trajectory/constants.js +6 -2
  476. package/dist/trajectory/extract.js +73 -71
  477. package/dist/trajectory/format-detect.d.ts +0 -1
  478. package/dist/trajectory/format-detect.js +13 -17
  479. package/dist/trajectory/frame-reader.d.ts +2 -1
  480. package/dist/trajectory/frame-reader.js +74 -136
  481. package/dist/trajectory/helpers.d.ts +12 -2
  482. package/dist/trajectory/helpers.js +68 -37
  483. package/dist/trajectory/index.d.ts +1 -0
  484. package/dist/trajectory/index.js +3 -0
  485. package/dist/trajectory/parse/ase.d.ts +9 -1
  486. package/dist/trajectory/parse/ase.js +47 -32
  487. package/dist/trajectory/parse/diagnostics.d.ts +3 -0
  488. package/dist/trajectory/parse/diagnostics.js +14 -0
  489. package/dist/trajectory/parse/h5-utils.d.ts +13 -0
  490. package/dist/trajectory/parse/h5-utils.js +109 -0
  491. package/dist/trajectory/parse/hdf5.d.ts +1 -1
  492. package/dist/trajectory/parse/hdf5.js +116 -106
  493. package/dist/trajectory/parse/index.d.ts +3 -4
  494. package/dist/trajectory/parse/index.js +68 -119
  495. package/dist/trajectory/parse/lammps.d.ts +0 -2
  496. package/dist/trajectory/parse/lammps.js +14 -16
  497. package/dist/trajectory/parse/pymatgen.d.ts +2 -0
  498. package/dist/trajectory/parse/pymatgen.js +74 -0
  499. package/dist/trajectory/parse/vasp.js +13 -9
  500. package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
  501. package/dist/trajectory/parse/vaspout-electronic.js +207 -0
  502. package/dist/trajectory/parse/vaspout-h5.d.ts +5 -0
  503. package/dist/trajectory/parse/vaspout-h5.js +284 -0
  504. package/dist/trajectory/parse/xyz.d.ts +9 -21
  505. package/dist/trajectory/parse/xyz.js +38 -39
  506. package/dist/trajectory/plotting.d.ts +8 -10
  507. package/dist/trajectory/plotting.js +102 -127
  508. package/dist/utils.d.ts +4 -0
  509. package/dist/utils.js +8 -1
  510. package/dist/xrd/XrdPlot.svelte +56 -85
  511. package/dist/xrd/broadening.d.ts +2 -1
  512. package/dist/xrd/broadening.js +2 -1
  513. package/dist/xrd/calc-xrd.js +8 -15
  514. package/dist/xrd/index.d.ts +2 -2
  515. package/dist/xrd/parse.d.ts +0 -1
  516. package/dist/xrd/parse.js +56 -73
  517. package/package.json +77 -36
  518. package/dist/api/mp.d.ts +0 -6
  519. package/dist/api/mp.js +0 -22
  520. package/dist/element/data.json +0 -11864
  521. package/dist/fermi-surface/marching-cubes.d.ts +0 -2
  522. package/dist/fermi-surface/marching-cubes.js +0 -2
  523. package/dist/plot/core/hover-lock.svelte.d.ts +0 -14
  524. package/dist/plot/core/hover-lock.svelte.js +0 -45
  525. package/dist/plot/sunburst/SunburstControls.svelte +0 -200
  526. package/dist/structure/label-placement.d.ts +0 -14
  527. package/dist/structure/label-placement.js +0 -72
@@ -2,7 +2,9 @@
2
2
  import * as math from '../math';
3
3
  import { EPS } from '../math';
4
4
  import { CLOSED_CONTOUR_TOLERANCE, IRREDUCIBLE_BZ_MIN_VERTICES, IRREDUCIBLE_BZ_TOLERANCE, SPANNING_THRESHOLD, } from './constants';
5
- import { marching_cubes } from './marching-cubes';
5
+ import { marching_cubes } from '../marching-cubes';
6
+ // clamp01 guards float jitter at the cell boundary
7
+ import { clamp01 } from '../utils';
6
8
  const safe_mod = (val, dim) => ((val % dim) + dim) % dim;
7
9
  // Precompute Catmull-Rom coefficients for a given t value
8
10
  // Returns [c0, c1, c2, c3] where result = c0*p0 + c1*p1 + c2*p2 + c3*p3
@@ -29,7 +31,7 @@ function tricubic_interpolate(grid, fx, fy, fz, px, py, pz) {
29
31
  const [cz0, cz1, cz2, cz3] = catmull_rom_coeffs(fz - iz);
30
32
  // Wrapped stencil indices (modulo hoisted out of the inner loop); a zero period
31
33
  // (single-point axis) has no neighbours, so collapse the stencil onto index 0
32
- const stencil = (idx, period) => [idx - 1, idx, idx + 1, idx + 2].map((v) => period > 0 ? ((v % period) + period) % period : 0);
34
+ const stencil = (idx, period) => [idx - 1, idx, idx + 1, idx + 2].map((stencil_idx) => period > 0 ? ((stencil_idx % period) + period) % period : 0);
33
35
  const [wx, wy, wz] = [stencil(ix, px), stencil(iy, py), stencil(iz, pz)];
34
36
  // Interpolate along z, then y, then x (fully inlined)
35
37
  let result = 0;
@@ -60,8 +62,8 @@ function upsample_grid(grid, factor, periodic = false) {
60
62
  // period (count of unique points) doubles as the resampling span numerator
61
63
  const endpoint = periodic ? 0 : 1;
62
64
  const dims = [grid.length, grid[0]?.length || 0, grid[0]?.[0]?.length || 0];
63
- const [px, py, pz] = dims.map((n) => n - endpoint);
64
- const [new_nx, new_ny, new_nz] = [px, py, pz].map((p) => Math.round(p * factor) + endpoint);
65
+ const [px, py, pz] = dims.map((dim) => dim - endpoint);
66
+ const [new_nx, new_ny, new_nz] = [px, py, pz].map((period) => Math.round(period * factor) + endpoint);
65
67
  // Map new index → source coordinate; a single-point axis (span 0) pins its lone
66
68
  // output to source 0 to avoid 0/0 = NaN
67
69
  const src_coords = (new_n, period) => {
@@ -142,7 +144,8 @@ export function extract_fermi_surface(band_data, options = {}) {
142
144
  if (compute_velocities && band_data.velocities) {
143
145
  isosurface.properties = compute_fermi_velocities(isosurface, band_data.velocities[spin_idx][band_idx], band_data.k_lattice, band_data.k_grid, periodic);
144
146
  isosurface.avg_velocity =
145
- isosurface.properties.reduce((s, v) => s + v, 0) / isosurface.properties.length;
147
+ isosurface.properties.reduce((sum, velocity) => sum + velocity, 0) /
148
+ isosurface.properties.length;
146
149
  }
147
150
  // Compute dimensionality if requested
148
151
  if (compute_dimensionality) {
@@ -203,7 +206,7 @@ export function compute_surface_area(surface) {
203
206
  const cy = e1z * e2x - e1x * e2z;
204
207
  const cz = e1x * e2y - e1y * e2x;
205
208
  // Area is half the magnitude of cross product
206
- total_area += Math.sqrt(cx * cx + cy * cy + cz * cz) * 0.5;
209
+ total_area += Math.hypot(cx, cy, cz) * 0.5;
207
210
  }
208
211
  return total_area;
209
212
  }
@@ -217,8 +220,6 @@ function compute_fermi_velocities(surface, velocity_grid, k_lattice, k_grid, per
217
220
  const k_inv = math.matrix_inverse_3x3(math.transpose_3x3_matrix(k_lattice));
218
221
  // Grid point i sits at frac i/(n−1) (endpoint-inclusive BXSF) or i/n (periodic)
219
222
  const [sx, sy, sz] = periodic ? [nx, ny, nz] : [nx - 1, ny - 1, nz - 1];
220
- // Clamp guards float jitter at the cell boundary
221
- const clamp01 = (val) => Math.min(Math.max(val, 0), 1);
222
223
  for (const vertex of surface.vertices) {
223
224
  const frac = math.mat3x3_vec3_multiply(k_inv, vertex); // centered, in [-0.5, 0.5]
224
225
  const gx = clamp01(frac[0] + 0.5) * sx;
@@ -348,19 +349,19 @@ function compute_edge_intersection(surface, vertex_distances, v0_idx, v1_idx) {
348
349
  // Edge must cross the plane (opposite signs)
349
350
  if (d0 * d1 >= 0)
350
351
  return null;
351
- const t = d0 / (d0 - d1);
352
+ const frac = d0 / (d0 - d1);
352
353
  const v0 = surface.vertices[v0_idx];
353
354
  const v1 = surface.vertices[v1_idx];
354
355
  const point = [
355
- v0[0] + t * (v1[0] - v0[0]),
356
- v0[1] + t * (v1[1] - v0[1]),
357
- v0[2] + t * (v1[2] - v0[2]),
356
+ v0[0] + frac * (v1[0] - v0[0]),
357
+ v0[1] + frac * (v1[1] - v0[1]),
358
+ v0[2] + frac * (v1[2] - v0[2]),
358
359
  ];
359
360
  let property;
360
361
  if (surface.properties) {
361
362
  property =
362
363
  surface.properties[v0_idx] +
363
- t * (surface.properties[v1_idx] - surface.properties[v0_idx]);
364
+ frac * (surface.properties[v1_idx] - surface.properties[v0_idx]);
364
365
  }
365
366
  return { point, property };
366
367
  }
@@ -1,16 +1,5 @@
1
+ import { download } from '../io/fetch';
1
2
  import { to_error } from '../utils';
2
- // Helper to trigger file download
3
- function download_file(content, filename, mime_type) {
4
- const blob = new Blob([content], { type: mime_type });
5
- const url = URL.createObjectURL(blob);
6
- const link = document.createElement(`a`);
7
- link.href = url;
8
- link.download = filename;
9
- document.body.append(link);
10
- link.click();
11
- document.body.removeChild(link);
12
- URL.revokeObjectURL(url);
13
- }
14
3
  // Export scene to STL format (good for 3D printing)
15
4
  export async function export_to_stl(scene, filename) {
16
5
  const { STLExporter } = await import(`three/addons/exporters/STLExporter.js`);
@@ -18,14 +7,14 @@ export async function export_to_stl(scene, filename) {
18
7
  const result = exporter.parse(scene, { binary: true });
19
8
  // Binary STL returns DataView, convert to ArrayBuffer for Blob
20
9
  const buffer = result instanceof DataView ? result.buffer : result;
21
- download_file(buffer, `${filename}.stl`, `application/octet-stream`);
10
+ download(buffer, `${filename}.stl`, `application/octet-stream`);
22
11
  }
23
12
  // Export scene to OBJ format (widely compatible)
24
13
  export async function export_to_obj(scene, filename) {
25
14
  const { OBJExporter } = await import(`three/addons/exporters/OBJExporter.js`);
26
15
  const exporter = new OBJExporter();
27
16
  const result = exporter.parse(scene);
28
- download_file(result, `${filename}.obj`, `text/plain`);
17
+ download(result, `${filename}.obj`, `text/plain`);
29
18
  }
30
19
  // Export scene to GLTF format (modern web/AR standard)
31
20
  export async function export_to_gltf(scene, filename) {
@@ -34,7 +23,7 @@ export async function export_to_gltf(scene, filename) {
34
23
  return new Promise((resolve, reject) => {
35
24
  exporter.parse(scene, (gltf) => {
36
25
  const output = JSON.stringify(gltf, null, 2);
37
- download_file(output, `${filename}.gltf`, `application/json`);
26
+ download(output, `${filename}.gltf`, `application/json`);
38
27
  resolve();
39
28
  }, (error) => reject(to_error(error)), { binary: false });
40
29
  });
@@ -6,7 +6,6 @@ export { default as FermiSurfaceTooltip } from './FermiSurfaceTooltip.svelte';
6
6
  export * from './compute';
7
7
  export * from './constants';
8
8
  export * from './export';
9
- export * from './marching-cubes';
10
9
  export * from './parse';
11
10
  export * from './symmetry';
12
11
  export * from './types';
@@ -7,7 +7,6 @@ export { default as FermiSurfaceTooltip } from './FermiSurfaceTooltip.svelte';
7
7
  export * from './compute';
8
8
  export * from './constants';
9
9
  export * from './export';
10
- export * from './marching-cubes';
11
10
  export * from './parse';
12
11
  export * from './symmetry';
13
12
  export * from './types';
@@ -1,2 +1,2 @@
1
1
  import type { BandGridData, FermiSurfaceData } from './types';
2
- export declare function parse_fermi_file(content: string, filename?: string): BandGridData | FermiSurfaceData | null;
2
+ export declare function parse_fermi_file(content: string, filename?: string): BandGridData | FermiSurfaceData;
@@ -1,10 +1,13 @@
1
+ import * as math from '../math';
2
+ import { is_plain_object, normalize_scientific_notation, parse_leading_num, to_error, } from '../utils';
1
3
  import * as constants from './constants';
2
- import { compute_vertex_normals } from './marching-cubes';
4
+ import { compute_vertex_normals } from '../marching-cubes';
3
5
  const parse_number_tokens = (line) => line.split(/\s+/).filter(Boolean);
4
- // Parse whitespace-separated floats from a line (optimized with unary +)
5
- const parse_floats = (line) => parse_number_tokens(line).map(Number);
6
+ // Parse whitespace-separated floats from a line. Normalizes Fortran D-exponents
7
+ // (`0.1234D+01`) which Fortran codes emit in BXSF/FRMSF and Number() rejects
8
+ const parse_floats = (line) => parse_number_tokens(normalize_scientific_notation(line)).map(Number);
6
9
  // Parse whitespace-separated integers from a line
7
- const parse_ints = (line) => parse_number_tokens(line).map((part) => parseInt(part, 10));
10
+ const parse_ints = (line) => parse_number_tokens(line).map((part) => Math.trunc(Number(part)));
8
11
  // Parse BXSF (Band-XSF) format used by XCrySDen, Quantum ESPRESSO, etc.
9
12
  // Format specification: http://www.xcrysden.org/doc/XSF.html
10
13
  function parse_bxsf(content) {
@@ -38,7 +41,7 @@ function parse_bxsf(content) {
38
41
  throw new Error(`Expected BANDGRID_3D header, got: ${bandgrid_line}`);
39
42
  }
40
43
  // Parse number of bands
41
- const n_bands = parseInt(next_line(), 10);
44
+ const n_bands = Math.trunc(Number(next_line()));
42
45
  if (isNaN(n_bands) || n_bands <= 0) {
43
46
  throw new Error(`Invalid number of bands in BXSF file`);
44
47
  }
@@ -112,9 +115,9 @@ function parse_bxsf(content) {
112
115
  const lower = line.toLowerCase();
113
116
  if (lower.includes(`fermi`) && lower.includes(`energy`)) {
114
117
  // Match patterns like "Fermi Energy = 5.123" or "fermi_energy: -0.5"
115
- const match = /(?:=|:)\s*([-+]?\d*\.?\d+(?:[eE][-+]?\d+)?)/i.exec(line);
118
+ const match = /(?:=|:)\s*(?<value>[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?)/i.exec(line);
116
119
  if (match) {
117
- fermi_energy = parseFloat(match[1]);
120
+ fermi_energy = Number(match[1]);
118
121
  break;
119
122
  }
120
123
  }
@@ -147,12 +150,12 @@ function parse_frmsf(content) {
147
150
  // 0 = Monkhorst-Pack grid (shifted)
148
151
  // 1 = Gamma-centered grid
149
152
  // 2 = Gamma + half grid shift
150
- const lshift = parseInt(lines[line_idx++], 10);
153
+ const lshift = Math.trunc(Number(lines[line_idx++]));
151
154
  if (isNaN(lshift) || lshift < 0 || lshift > 2) {
152
155
  throw new Error(`FRMSF: Invalid lshift value (expected 0, 1, or 2)`);
153
156
  }
154
157
  // Line 3: number of bands
155
- const n_bands = parseInt(lines[line_idx++], 10);
158
+ const n_bands = Math.trunc(Number(lines[line_idx++]));
156
159
  if (isNaN(n_bands) || n_bands <= 0) {
157
160
  throw new Error(`FRMSF: Invalid number of bands`);
158
161
  }
@@ -181,17 +184,14 @@ function parse_frmsf(content) {
181
184
  energies[spin_idx] = [];
182
185
  for (let band_idx = 0; band_idx < n_bands; band_idx++) {
183
186
  const energy_values = [];
184
- // Read energy values (first value per line only, ignore auxiliary columns)
187
+ // Read energy values (first value per line only, ignore auxiliary columns;
188
+ // normalize Fortran D-exponents like parse_floats does)
185
189
  while (energy_values.length < total_points && line_idx < lines.length) {
186
- const line = lines[line_idx];
187
- const first_token = line?.split(/\s+/)[0];
188
- if (first_token && !isNaN(parseFloat(first_token))) {
189
- energy_values.push(parseFloat(first_token));
190
- line_idx++;
191
- }
192
- else {
190
+ const energy = parse_leading_num(normalize_scientific_notation(lines[line_idx] ?? ``));
191
+ if (isNaN(energy))
193
192
  break;
194
- }
193
+ energy_values.push(energy);
194
+ line_idx++;
195
195
  }
196
196
  if (energy_values.length < total_points) {
197
197
  throw new Error(`FRMSF spin ${spin_idx} band ${band_idx}: expected ${total_points} values, got ${energy_values.length}`);
@@ -224,14 +224,9 @@ function parse_frmsf(content) {
224
224
  }
225
225
  // Validate that an object has the required Isosurface shape
226
226
  function is_valid_isosurface(obj) {
227
- if (!obj || typeof obj !== `object`)
227
+ if (!is_plain_object(obj))
228
228
  return false;
229
- const isosurface_obj = obj;
230
- const vertices = isosurface_obj.vertices;
231
- const faces = isosurface_obj.faces;
232
- const normals = isosurface_obj.normals;
233
- const band_index = isosurface_obj.band_index;
234
- const spin = isosurface_obj.spin;
229
+ const { vertices, faces, normals, band_index, spin } = obj;
235
230
  if (!Array.isArray(vertices) || vertices.length === 0)
236
231
  return false;
237
232
  if (!Array.isArray(faces))
@@ -246,27 +241,35 @@ function is_valid_isosurface(obj) {
246
241
  }
247
242
  // Validate FermiSurfaceData shape
248
243
  function is_valid_fermi_surface_data(obj) {
249
- if (!obj || typeof obj !== `object`)
244
+ if (!is_plain_object(obj))
250
245
  return false;
251
- const data = obj;
252
246
  // Check required fields
253
- if (!Array.isArray(data.isosurfaces))
247
+ if (!Array.isArray(obj.isosurfaces))
254
248
  return false;
255
- if (!Array.isArray(data.k_lattice) || data.k_lattice.length !== 3)
249
+ if (!math.is_square_matrix(obj.k_lattice, 3))
256
250
  return false;
257
- if (typeof data.fermi_energy !== `number`)
251
+ if (typeof obj.fermi_energy !== `number`)
258
252
  return false;
259
- if (data.reciprocal_cell !== `wigner_seitz` && data.reciprocal_cell !== `parallelepiped`) {
253
+ if (obj.reciprocal_cell !== `wigner_seitz` && obj.reciprocal_cell !== `parallelepiped`) {
260
254
  return false;
261
255
  }
262
- if (!data.metadata || typeof data.metadata !== `object`)
256
+ if (!obj.metadata || typeof obj.metadata !== `object`)
263
257
  return false;
264
258
  // Validate each isosurface
265
- for (const iso of data.isosurfaces) {
266
- if (!is_valid_isosurface(iso))
267
- return false;
268
- }
269
- return true;
259
+ return obj.isosurfaces.every(is_valid_isosurface);
260
+ }
261
+ // Validate BandGridData shape: non-empty energies grid, 3 k-grid dims, 3x3 k-lattice
262
+ function is_valid_band_grid_data(obj) {
263
+ if (!is_plain_object(obj))
264
+ return false;
265
+ const { energies, k_grid, k_lattice } = obj;
266
+ if (!Array.isArray(energies) || energies.length === 0)
267
+ return false;
268
+ if (!Array.isArray(k_grid) ||
269
+ k_grid.length !== 3 ||
270
+ !k_grid.every((dim) => Number.isInteger(dim) && dim > 0))
271
+ return false;
272
+ return math.is_square_matrix(k_lattice, 3);
270
273
  }
271
274
  // Parse Matterviz/IFermi JSON format for Fermi surface data
272
275
  // Throws on invalid input; returns parsed data on success
@@ -287,22 +290,21 @@ function parse_fermi_json(content) {
287
290
  }
288
291
  // Check if it's BandGridData (raw grid data)
289
292
  if (data.energies && data.k_grid && data.k_lattice) {
290
- // Minimal validation of required fields
291
- if (!Array.isArray(data.energies) ||
292
- !Array.isArray(data.k_grid) ||
293
- data.k_grid.length !== 3 ||
294
- !Array.isArray(data.k_lattice) ||
295
- data.k_lattice.length !== 3)
296
- throw new Error(`Invalid BandGridData JSON: malformed required fields`);
293
+ if (!is_valid_band_grid_data(data)) {
294
+ throw new Error(`Invalid BandGridData JSON: expected non-empty 'energies' grid, 3 'k_grid' dims, and 3x3 'k_lattice'`);
295
+ }
297
296
  return data;
298
297
  }
299
298
  // Try to extract from nested structure (e.g. IFermi output)
300
299
  if (data.fermi_surface) {
300
+ if (!is_valid_fermi_surface_data(data.fermi_surface)) {
301
+ throw new Error(`Invalid nested 'fermi_surface' JSON: expected isosurfaces array, 3x3 k_lattice, numeric fermi_energy, reciprocal_cell, and metadata`);
302
+ }
301
303
  return data.fermi_surface;
302
304
  }
303
305
  if (data.band_structure?.energies || data.bands?.energies) {
304
306
  const bs = data.band_structure ?? data.bands;
305
- return {
307
+ const grid_data = {
306
308
  energies: bs.energies,
307
309
  k_grid: bs.k_grid ?? bs.kgrid,
308
310
  k_lattice: bs.k_lattice ?? bs.reciprocal_lattice,
@@ -312,6 +314,10 @@ function parse_fermi_json(content) {
312
314
  // oxlint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- numeric fallback chain (0 falls through)
313
315
  n_spins: (bs.n_spins ?? bs.nspins) || bs.energies.length || 1,
314
316
  };
317
+ if (!is_valid_band_grid_data(grid_data)) {
318
+ throw new Error(`Invalid band_structure JSON: expected non-empty 'energies' grid, 3 'k_grid' dims, and 3x3 'k_lattice'`);
319
+ }
320
+ return grid_data;
315
321
  }
316
322
  // Check for pymatgen BandStructure format (k-path, not k-grid)
317
323
  // These files cannot be used for Fermi surface visualization directly
@@ -339,7 +345,7 @@ function parse_ifermi_surface(data) {
339
345
  const band_indices = new Set();
340
346
  let has_spin = false;
341
347
  for (const [band_key, iso_list] of Object.entries(isosurfaces_obj)) {
342
- const band_index = parseInt(band_key, 10);
348
+ const band_index = Math.trunc(Number(band_key));
343
349
  // spin is determined by sign: positive = up, negative = down
344
350
  const spin = band_index < 0 ? `down` : `up`;
345
351
  const abs_band_idx = Math.abs(band_index);
@@ -365,13 +371,13 @@ function parse_ifermi_surface(data) {
365
371
  let dimensionality;
366
372
  if (ifermi_iso.dimensionality) {
367
373
  const dim = ifermi_iso.dimensionality.toLowerCase();
368
- if (dim.includes(`1d`) || dim === `1d`)
374
+ if (dim.includes(`1d`))
369
375
  dimensionality = `1D`;
370
- else if (dim.includes(`quasi`) || dim === `quasi-2d`)
376
+ else if (dim.includes(`quasi`))
371
377
  dimensionality = `quasi-2D`;
372
- else if (dim.includes(`2d`) || dim === `2d`)
378
+ else if (dim.includes(`2d`))
373
379
  dimensionality = `2D`;
374
- else if (dim.includes(`3d`) || dim === `3d`)
380
+ else if (dim.includes(`3d`))
375
381
  dimensionality = `3D`;
376
382
  }
377
383
  // Compute area for this isosurface using fan triangulation for N-gons
@@ -387,14 +393,8 @@ function parse_ifermi_surface(data) {
387
393
  for (let fan_idx = 1; fan_idx < face.length - 1; fan_idx++) {
388
394
  const v1 = vertices[face[fan_idx]];
389
395
  const v2 = vertices[face[fan_idx + 1]];
390
- const e1 = [v1[0] - v0[0], v1[1] - v0[1], v1[2] - v0[2]];
391
- const e2 = [v2[0] - v0[0], v2[1] - v0[1], v2[2] - v0[2]];
392
- const cross = [
393
- e1[1] * e2[2] - e1[2] * e2[1],
394
- e1[2] * e2[0] - e1[0] * e2[2],
395
- e1[0] * e2[1] - e1[1] * e2[0],
396
- ];
397
- area += 0.5 * Math.hypot(cross[0], cross[1], cross[2]);
396
+ const cross = math.cross_3d(math.subtract(v1, v0), math.subtract(v2, v0));
397
+ area += 0.5 * Math.hypot(...cross);
398
398
  }
399
399
  }
400
400
  isosurfaces.push({
@@ -427,68 +427,55 @@ function parse_ifermi_surface(data) {
427
427
  },
428
428
  };
429
429
  }
430
- // Auto-detect file format and parse accordingly
430
+ // Auto-detect file format and parse; throws an Error aggregating per-format failure reasons when nothing parses
431
431
  export function parse_fermi_file(content, filename) {
432
432
  const lower_name = filename?.toLowerCase() ?? ``;
433
- // Detect by filename extension
434
- if (lower_name.endsWith(`.bxsf`) || lower_name.endsWith(`.bxsf.gz`)) {
433
+ const errors = [];
434
+ const attempt = (format, parse) => {
435
435
  try {
436
- return parse_bxsf(content);
436
+ return parse();
437
437
  }
438
438
  catch (error) {
439
- console.error(`BXSF parse error:`, error);
439
+ errors.push(`${format}: ${to_error(error).message}`);
440
+ console.error(`${format} parse error:`, error);
440
441
  return null;
441
442
  }
443
+ };
444
+ const fail = () => {
445
+ const detail = errors.length ? `: ${errors.join(`; `)}` : `: unrecognized format`;
446
+ throw new Error(`Failed to parse Fermi surface file${filename ? ` '${filename}'` : ``}${detail}`);
447
+ };
448
+ // Detect by filename extension (authoritative: parse failure throws immediately)
449
+ if (lower_name.endsWith(`.bxsf`) || lower_name.endsWith(`.bxsf.gz`)) {
450
+ return attempt(`BXSF`, () => parse_bxsf(content)) ?? fail();
442
451
  }
443
452
  if (lower_name.endsWith(`.frmsf`) || lower_name.endsWith(`.frmsf.gz`)) {
444
- try {
445
- return parse_frmsf(content);
446
- }
447
- catch (error) {
448
- console.error(`FRMSF parse error:`, error);
449
- return null;
450
- }
453
+ return attempt(`FRMSF`, () => parse_frmsf(content)) ?? fail();
451
454
  }
452
455
  if (lower_name.endsWith(`.json`) || lower_name.endsWith(`.json.gz`)) {
453
- try {
454
- return parse_fermi_json(content);
455
- }
456
- catch (error) {
457
- console.error(`JSON parse error:`, error);
458
- return null;
459
- }
456
+ return attempt(`JSON`, () => parse_fermi_json(content)) ?? fail();
460
457
  }
461
458
  // Try auto-detection based on content
462
459
  const trimmed = content.trim();
463
460
  // BXSF format detection
464
461
  if (trimmed.includes(`BEGIN_BLOCK_BANDGRID_3D`) || trimmed.includes(`BEGIN_BANDGRID_3D`)) {
465
- try {
466
- return parse_bxsf(content);
467
- }
468
- catch (error) {
469
- console.error(`BXSF auto-detect parse error:`, error);
470
- }
462
+ const result = attempt(`BXSF`, () => parse_bxsf(content));
463
+ if (result)
464
+ return result;
471
465
  }
472
466
  // JSON format detection
473
467
  if (trimmed.startsWith(`{`) || trimmed.startsWith(`[`)) {
474
- try {
475
- return parse_fermi_json(content);
476
- }
477
- catch (error) {
478
- console.error(`JSON auto-detect parse error:`, error);
479
- }
468
+ const result = attempt(`JSON`, () => parse_fermi_json(content));
469
+ if (result)
470
+ return result;
480
471
  }
481
472
  // FRMSF format detection (starts with grid dimensions)
482
473
  const first_line = trimmed.split(/\r?\n/)[0];
483
474
  const first_tokens = first_line.split(/\s+/).filter(Boolean);
484
475
  if (first_tokens.length === 3 && first_tokens.every((token) => /^\d+$/.test(token))) {
485
- try {
486
- return parse_frmsf(content);
487
- }
488
- catch (error) {
489
- console.error(`FRMSF auto-detect parse error:`, error);
490
- }
476
+ const result = attempt(`FRMSF`, () => parse_frmsf(content));
477
+ if (result)
478
+ return result;
491
479
  }
492
- console.warn(`Could not detect Fermi surface file format for: ${filename}`);
493
- return null;
480
+ return fail();
494
481
  }
@@ -1,4 +1,4 @@
1
- import type { Matrix3x3, Point2D, Vec3 } from '../math';
1
+ import type { Matrix3x3, Point2D, Vec2, Vec3 } from '../math';
2
2
  import type { TooltipConfig, TooltipProp } from '../tooltip';
3
3
  export type SpinChannel = `up` | `down` | null;
4
4
  export type RepresentationMode = `solid` | `wireframe` | `transparent`;
@@ -62,7 +62,7 @@ export interface FermiSliceData {
62
62
  }
63
63
  export interface Isoline {
64
64
  points: Vec3[];
65
- points_2d: [number, number][];
65
+ points_2d: Vec2[];
66
66
  properties?: number[];
67
67
  band_index: number;
68
68
  spin: SpinChannel;