matterviz 0.4.1 → 0.4.3

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 (499) hide show
  1. package/dist/EmptyState.svelte +10 -4
  2. package/dist/FilePicker.svelte +48 -60
  3. package/dist/Icon.svelte +7 -4
  4. package/dist/MillerIndexInput.svelte +2 -2
  5. package/dist/api/optimade.js +10 -7
  6. package/dist/app.css +68 -0
  7. package/dist/brillouin/BrillouinZone.svelte +90 -91
  8. package/dist/brillouin/BrillouinZone.svelte.d.ts +5 -7
  9. package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte +18 -14
  11. package/dist/brillouin/BrillouinZoneInfoPane.svelte +6 -10
  12. package/dist/brillouin/BrillouinZoneScene.svelte +46 -68
  13. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  14. package/dist/brillouin/compute.js +10 -16
  15. package/dist/brillouin/geometry.js +2 -2
  16. package/dist/chempot-diagram/ChemPotDiagram.svelte +48 -50
  17. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +61 -169
  18. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +1 -1
  19. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +559 -755
  20. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +1 -1
  21. package/dist/chempot-diagram/async-compute.svelte.js +13 -14
  22. package/dist/chempot-diagram/color.d.ts +21 -1
  23. package/dist/chempot-diagram/color.js +70 -1
  24. package/dist/chempot-diagram/compute.d.ts +7 -0
  25. package/dist/chempot-diagram/compute.js +85 -26
  26. package/dist/chempot-diagram/controls-state.svelte.js +1 -1
  27. package/dist/chempot-diagram/export.js +1 -6
  28. package/dist/chempot-diagram/temperature.js +9 -10
  29. package/dist/colors/index.d.ts +0 -4
  30. package/dist/colors/index.js +19 -20
  31. package/dist/composition/BarChart.svelte +30 -26
  32. package/dist/composition/BubbleChart.svelte +17 -17
  33. package/dist/composition/Composition.svelte +10 -19
  34. package/dist/composition/Formula.svelte +20 -27
  35. package/dist/composition/FormulaFilter.svelte +115 -184
  36. package/dist/composition/PieChart.svelte +55 -41
  37. package/dist/composition/format.js +7 -9
  38. package/dist/composition/index.d.ts +2 -0
  39. package/dist/composition/index.js +14 -0
  40. package/dist/composition/parse.d.ts +2 -2
  41. package/dist/composition/parse.js +61 -115
  42. package/dist/constants.d.ts +0 -1
  43. package/dist/constants.js +17 -26
  44. package/dist/convex-hull/ConvexHull.svelte +12 -15
  45. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
  46. package/dist/convex-hull/ConvexHull2D.svelte +93 -94
  47. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  48. package/dist/convex-hull/ConvexHull3D.svelte +127 -186
  49. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  50. package/dist/convex-hull/ConvexHull4D.svelte +131 -180
  51. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  52. package/dist/convex-hull/ConvexHullChrome.svelte +36 -40
  53. package/dist/convex-hull/ConvexHullControls.svelte +46 -48
  54. package/dist/convex-hull/ConvexHullStats.svelte +193 -195
  55. package/dist/convex-hull/ConvexHullTooltip.svelte +5 -12
  56. package/dist/convex-hull/GasPressureControls.svelte +5 -12
  57. package/dist/convex-hull/StructurePopup.svelte +18 -22
  58. package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
  59. package/dist/convex-hull/TemperatureSlider.svelte +4 -10
  60. package/dist/convex-hull/canvas-interactions.svelte.js +2 -1
  61. package/dist/convex-hull/gas-thermodynamics.js +21 -53
  62. package/dist/convex-hull/helpers.d.ts +8 -10
  63. package/dist/convex-hull/helpers.js +37 -43
  64. package/dist/convex-hull/hull-state.svelte.d.ts +1 -1
  65. package/dist/convex-hull/thermodynamics.js +37 -44
  66. package/dist/coordination/CoordinationBarPlot.svelte +49 -53
  67. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  68. package/dist/coordination/calc-coordination.d.ts +1 -1
  69. package/dist/coordination/calc-coordination.js +28 -25
  70. package/dist/element/BohrAtom.svelte +5 -9
  71. package/dist/element/ElementHeading.svelte +4 -1
  72. package/dist/element/ElementPhoto.svelte +11 -9
  73. package/dist/element/ElementStats.svelte +12 -10
  74. package/dist/element/ElementTile.svelte +44 -67
  75. package/dist/element/Nucleus.svelte +4 -2
  76. package/dist/element/data.d.ts +3 -2
  77. package/dist/element/data.js +5 -1
  78. package/dist/element/helpers.d.ts +4 -0
  79. package/dist/element/helpers.js +18 -0
  80. package/dist/element/index.d.ts +2 -5
  81. package/dist/element/index.js +4 -19
  82. package/dist/feedback/DragOverlay.svelte +5 -5
  83. package/dist/feedback/DragOverlay.svelte.d.ts +2 -2
  84. package/dist/feedback/StatusMessage.svelte +7 -4
  85. package/dist/fermi-surface/FermiSlice.svelte +21 -18
  86. package/dist/fermi-surface/FermiSurface.svelte +35 -44
  87. package/dist/fermi-surface/FermiSurface.svelte.d.ts +7 -13
  88. package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
  89. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  90. package/dist/fermi-surface/FermiSurfaceScene.svelte +64 -136
  91. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  92. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
  93. package/dist/fermi-surface/compute.js +25 -58
  94. package/dist/fermi-surface/parse.js +54 -88
  95. package/dist/file-viewer/JsonBrowser.svelte +1043 -0
  96. package/dist/file-viewer/JsonBrowser.svelte.d.ts +9 -0
  97. package/dist/file-viewer/PlotPanel.svelte +350 -0
  98. package/dist/file-viewer/PlotPanel.svelte.d.ts +9 -0
  99. package/dist/file-viewer/TrajectoryWithDos.svelte +30 -0
  100. package/dist/file-viewer/TrajectoryWithDos.svelte.d.ts +10 -0
  101. package/dist/file-viewer/detect.d.ts +11 -0
  102. package/dist/file-viewer/detect.js +381 -0
  103. package/dist/file-viewer/eligibility.d.ts +4 -0
  104. package/dist/file-viewer/eligibility.js +53 -0
  105. package/dist/file-viewer/host-protocol.d.ts +50 -0
  106. package/dist/file-viewer/host-transfer.d.ts +25 -0
  107. package/dist/file-viewer/host-transfer.js +42 -0
  108. package/dist/file-viewer/index.d.ts +5 -0
  109. package/dist/file-viewer/index.js +5 -0
  110. package/dist/file-viewer/main.d.ts +44 -0
  111. package/dist/file-viewer/main.js +535 -0
  112. package/dist/file-viewer/parse.d.ts +9 -0
  113. package/dist/file-viewer/parse.js +170 -0
  114. package/dist/file-viewer/plot-utils.d.ts +24 -0
  115. package/dist/file-viewer/plot-utils.js +191 -0
  116. package/dist/file-viewer/types.d.ts +4 -0
  117. package/dist/file-viewer/types.js +5 -0
  118. package/dist/heatmap-matrix/HeatmapMatrix.svelte +153 -219
  119. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +2 -2
  120. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +9 -7
  121. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +1 -1
  122. package/dist/heatmap-matrix/index.d.ts +5 -0
  123. package/dist/icons.d.ts +4 -0
  124. package/dist/icons.js +4 -0
  125. package/dist/index.d.ts +2 -2
  126. package/dist/index.js +1 -1
  127. package/dist/io/ExportPane.svelte +11 -7
  128. package/dist/io/decompress.d.ts +4 -1
  129. package/dist/io/decompress.js +24 -36
  130. package/dist/io/export.d.ts +11 -4
  131. package/dist/io/export.js +75 -19
  132. package/dist/io/fetch.d.ts +0 -3
  133. package/dist/io/fetch.js +0 -11
  134. package/dist/io/file-drop.js +60 -35
  135. package/dist/io/index.d.ts +0 -1
  136. package/dist/io/index.js +2 -9
  137. package/dist/io/is-binary.d.ts +9 -0
  138. package/dist/io/is-binary.js +45 -1
  139. package/dist/io/url-drop.d.ts +2 -0
  140. package/dist/io/url-drop.js +40 -40
  141. package/dist/isosurface/Isosurface.svelte +700 -215
  142. package/dist/isosurface/Isosurface.svelte.d.ts +7 -1
  143. package/dist/isosurface/IsosurfaceControls.svelte +590 -116
  144. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +1 -1
  145. package/dist/isosurface/VolumeSlice.svelte +224 -0
  146. package/dist/isosurface/VolumeSlice.svelte.d.ts +28 -0
  147. package/dist/isosurface/coloring.d.ts +20 -0
  148. package/dist/isosurface/coloring.js +118 -0
  149. package/dist/isosurface/geometry-worker-types.d.ts +38 -0
  150. package/dist/isosurface/geometry.worker.d.ts +1 -0
  151. package/dist/isosurface/geometry.worker.js +59 -0
  152. package/dist/isosurface/grid.d.ts +10 -0
  153. package/dist/isosurface/grid.js +31 -0
  154. package/dist/isosurface/index.d.ts +4 -0
  155. package/dist/isosurface/index.js +4 -0
  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 +6 -6
  159. package/dist/isosurface/profile.d.ts +12 -0
  160. package/dist/isosurface/profile.js +19 -0
  161. package/dist/isosurface/sampling.d.ts +34 -0
  162. package/dist/isosurface/sampling.js +408 -0
  163. package/dist/isosurface/slice-rendering.d.ts +13 -0
  164. package/dist/isosurface/slice-rendering.js +79 -0
  165. package/dist/isosurface/slice.d.ts +22 -2
  166. package/dist/isosurface/slice.js +200 -116
  167. package/dist/isosurface/types.d.ts +24 -1
  168. package/dist/isosurface/types.js +120 -8
  169. package/dist/json-path.d.ts +4 -0
  170. package/dist/json-path.js +89 -0
  171. package/dist/labels.d.ts +6 -2
  172. package/dist/labels.js +44 -14
  173. package/dist/layout/FullscreenButton.svelte +2 -1
  174. package/dist/layout/FullscreenToggle.svelte +10 -4
  175. package/dist/layout/InfoCard.svelte +8 -21
  176. package/dist/layout/InfoTag.svelte +1 -3
  177. package/dist/layout/NumberRangeInput.svelte +46 -0
  178. package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
  179. package/dist/layout/PropertyFilter.svelte +2 -6
  180. package/dist/layout/SettingsSection.svelte +57 -62
  181. package/dist/layout/SettingsSection.svelte.d.ts +6 -7
  182. package/dist/layout/SubpageGrid.svelte +3 -1
  183. package/dist/layout/ViewerChrome.svelte +16 -11
  184. package/dist/layout/ViewerChrome.svelte.d.ts +2 -1
  185. package/dist/layout/fullscreen.js +3 -5
  186. package/dist/layout/fullscreen.svelte.js +1 -2
  187. package/dist/layout/index.d.ts +1 -0
  188. package/dist/layout/index.js +1 -0
  189. package/dist/layout/json-tree/JsonNode.svelte +22 -59
  190. package/dist/layout/json-tree/JsonTree.svelte +101 -172
  191. package/dist/layout/json-tree/JsonValue.svelte +9 -32
  192. package/dist/layout/json-tree/utils.d.ts +0 -3
  193. package/dist/layout/json-tree/utils.js +50 -188
  194. package/dist/marching-cubes.d.ts +8 -1
  195. package/dist/marching-cubes.js +115 -48
  196. package/dist/math.d.ts +5 -2
  197. package/dist/math.js +48 -38
  198. package/dist/overlays/ContextMenu.svelte +19 -34
  199. package/dist/overlays/CopyButton.svelte +11 -5
  200. package/dist/overlays/DragControlTab.svelte +6 -1
  201. package/dist/overlays/DraggablePane.svelte +110 -74
  202. package/dist/overlays/DraggablePane.svelte.d.ts +2 -1
  203. package/dist/overlays/GlassChip.svelte +32 -0
  204. package/dist/overlays/GlassChip.svelte.d.ts +8 -0
  205. package/dist/overlays/InfoPaneCards.svelte +11 -23
  206. package/dist/overlays/index.d.ts +7 -0
  207. package/dist/overlays/index.js +26 -0
  208. package/dist/overlays/portal.d.ts +2 -0
  209. package/dist/overlays/portal.js +14 -0
  210. package/dist/periodic-table/PeriodicTable.svelte +113 -145
  211. package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
  212. package/dist/periodic-table/PeriodicTableControls.svelte +37 -115
  213. package/dist/periodic-table/TableInset.svelte +9 -4
  214. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +68 -105
  215. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
  216. package/dist/phase-diagram/PhaseDiagramControls.svelte +70 -94
  217. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
  218. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +2 -1
  219. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +12 -12
  220. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
  221. package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
  222. package/dist/phase-diagram/build-diagram.js +4 -9
  223. package/dist/phase-diagram/diagram-input.d.ts +1 -2
  224. package/dist/phase-diagram/parse.js +15 -15
  225. package/dist/phase-diagram/svg-to-diagram.js +28 -27
  226. package/dist/phase-diagram/utils.js +2 -3
  227. package/dist/plot/bar/BarPlot.svelte +461 -426
  228. package/dist/plot/bar/BarPlot.svelte.d.ts +2 -0
  229. package/dist/plot/bar/BarPlotControls.svelte +1 -3
  230. package/dist/plot/bar/BarPlotControls.svelte.d.ts +4 -6
  231. package/dist/plot/bar/SpacegroupBarPlot.svelte +46 -77
  232. package/dist/plot/bar/data.d.ts +5 -4
  233. package/dist/plot/bar/data.js +2 -1
  234. package/dist/plot/box/BoxPlot.svelte +322 -226
  235. package/dist/plot/box/BoxPlot.svelte.d.ts +2 -0
  236. package/dist/plot/box/Violin.svelte.d.ts +1 -0
  237. package/dist/plot/box/box-plot.js +1 -1
  238. package/dist/plot/core/auto-place.d.ts +1 -1
  239. package/dist/plot/core/auto-place.js +2 -2
  240. package/dist/plot/core/axis-utils.d.ts +12 -7
  241. package/dist/plot/core/axis-utils.js +48 -48
  242. package/dist/plot/core/components/AxisLabel.svelte +82 -20
  243. package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
  244. package/dist/plot/core/components/ColorBar.svelte +101 -106
  245. package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
  246. package/dist/plot/core/components/FillArea.svelte +10 -17
  247. package/dist/plot/core/components/HierarchyControls.svelte +249 -0
  248. package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
  249. package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
  250. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
  251. package/dist/plot/core/components/Line.svelte +18 -9
  252. package/dist/plot/core/components/Line.svelte.d.ts +2 -0
  253. package/dist/plot/core/components/PlotAxis.svelte +40 -17
  254. package/dist/plot/core/components/PlotControls.svelte +65 -41
  255. package/dist/plot/core/components/PlotLegend.svelte +31 -35
  256. package/dist/plot/core/components/PlotMarginals.svelte +616 -0
  257. package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
  258. package/dist/plot/core/components/PlotTooltip.svelte +1 -1
  259. package/dist/plot/core/components/PortalSelect.svelte +4 -8
  260. package/dist/plot/core/components/ReferenceLine.svelte +27 -24
  261. package/dist/plot/core/components/ReferenceLine3D.svelte +54 -57
  262. package/dist/plot/core/components/ReferencePlane.svelte +7 -8
  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 +27 -474
  271. package/dist/plot/core/data-transform.d.ts +1 -2
  272. package/dist/plot/core/data-transform.js +9 -15
  273. package/dist/plot/core/fill-utils.d.ts +3 -1
  274. package/dist/plot/core/fill-utils.js +28 -6
  275. package/dist/plot/core/index.d.ts +1 -0
  276. package/dist/plot/core/index.js +1 -0
  277. package/dist/plot/core/interactions.js +0 -2
  278. package/dist/plot/core/layout.d.ts +15 -6
  279. package/dist/plot/core/layout.js +57 -38
  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 +2 -4
  283. package/dist/plot/core/pan-zoom.svelte.js +34 -17
  284. package/dist/plot/core/placed-tween.svelte.d.ts +3 -0
  285. package/dist/plot/core/placed-tween.svelte.js +68 -21
  286. package/dist/plot/core/reference-line.js +1 -1
  287. package/dist/plot/core/scales.d.ts +23 -0
  288. package/dist/plot/core/scales.js +39 -13
  289. package/dist/plot/core/svg.js +0 -1
  290. package/dist/plot/core/types/fills.d.ts +101 -0
  291. package/dist/plot/core/types/fills.js +15 -0
  292. package/dist/plot/core/types/plot-3d.d.ts +87 -0
  293. package/dist/plot/core/types/plot-3d.js +4 -0
  294. package/dist/plot/core/types/reference-lines.d.ts +140 -0
  295. package/dist/plot/core/types/reference-lines.js +9 -0
  296. package/dist/plot/core/types.d.ts +29 -324
  297. package/dist/plot/core/types.js +23 -20
  298. package/dist/plot/core/utils/hierarchy-chart.d.ts +52 -0
  299. package/dist/plot/core/utils/hierarchy-chart.js +191 -0
  300. package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
  301. package/dist/plot/core/utils/hierarchy-labels.js +100 -0
  302. package/dist/plot/core/utils/label-placement.js +2 -2
  303. package/dist/plot/histogram/Histogram.svelte +314 -340
  304. package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
  305. package/dist/plot/histogram/HistogramControls.svelte +30 -28
  306. package/dist/plot/histogram/histogram.d.ts +31 -0
  307. package/dist/plot/histogram/histogram.js +70 -0
  308. package/dist/plot/histogram/index.d.ts +1 -0
  309. package/dist/plot/histogram/index.js +1 -0
  310. package/dist/plot/index.d.ts +1 -0
  311. package/dist/plot/index.js +1 -0
  312. package/dist/plot/sankey/Sankey.svelte +78 -69
  313. package/dist/plot/sankey/Sankey.svelte.d.ts +2 -2
  314. package/dist/plot/sankey/SankeyControls.svelte +22 -16
  315. package/dist/plot/sankey/sankey.js +13 -9
  316. package/dist/plot/scatter/BinnedScatterPlot.svelte +311 -141
  317. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +7 -0
  318. package/dist/plot/scatter/ElementScatter.svelte +4 -1
  319. package/dist/plot/scatter/ScatterPlot.svelte +517 -410
  320. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +2 -0
  321. package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
  322. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  323. package/dist/plot/scatter/ScatterPoint.svelte +16 -9
  324. package/dist/plot/scatter/adaptive-density.d.ts +1 -1
  325. package/dist/plot/scatter/adaptive-density.js +36 -20
  326. package/dist/plot/scatter/binned-scatter-types.d.ts +3 -2
  327. package/dist/plot/scatter/binned-scatter-types.js +6 -1
  328. package/dist/plot/scatter/scatter-data.d.ts +1 -1
  329. package/dist/plot/scatter/scatter-data.js +8 -7
  330. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +25 -34
  331. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +2 -2
  332. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +8 -5
  333. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +113 -116
  334. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +2 -2
  335. package/dist/plot/scatter-3d/Surface3D.svelte +4 -13
  336. package/dist/plot/sunburst/Sunburst.svelte +269 -347
  337. package/dist/plot/sunburst/Sunburst.svelte.d.ts +2 -2
  338. package/dist/plot/sunburst/index.d.ts +1 -1
  339. package/dist/plot/sunburst/index.js +2 -1
  340. package/dist/plot/sunburst/render.d.ts +2 -2
  341. package/dist/plot/sunburst/render.js +47 -22
  342. package/dist/plot/sunburst/sunburst.d.ts +5 -1
  343. package/dist/plot/sunburst/sunburst.js +10 -3
  344. package/dist/plot/treemap/Treemap.svelte +1022 -0
  345. package/dist/plot/treemap/Treemap.svelte.d.ts +90 -0
  346. package/dist/plot/treemap/index.d.ts +4 -0
  347. package/dist/plot/treemap/index.js +4 -0
  348. package/dist/plot/treemap/labels.d.ts +38 -0
  349. package/dist/plot/treemap/labels.js +80 -0
  350. package/dist/plot/treemap/treemap.d.ts +28 -0
  351. package/dist/plot/treemap/treemap.js +102 -0
  352. package/dist/rdf/RdfPlot.svelte +37 -59
  353. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  354. package/dist/rdf/calc-rdf.js +63 -52
  355. package/dist/rdf/index.d.ts +0 -1
  356. package/dist/sanitize.js +85 -27
  357. package/dist/scene/SceneCamera.svelte +1 -1
  358. package/dist/scene/SceneCamera.svelte.d.ts +1 -1
  359. package/dist/scene/bind-renderer.svelte.js +14 -6
  360. package/dist/scene/index.d.ts +1 -2
  361. package/dist/scene/index.js +1 -1
  362. package/dist/scene/{props.js → props.svelte.js} +15 -1
  363. package/dist/settings.d.ts +19 -9
  364. package/dist/settings.js +229 -525
  365. package/dist/spectral/Bands.svelte +207 -221
  366. package/dist/spectral/BandsAndDos.svelte +11 -9
  367. package/dist/spectral/BrillouinBandsDos.svelte +19 -42
  368. package/dist/spectral/Dos.svelte +92 -93
  369. package/dist/spectral/helpers.d.ts +3 -3
  370. package/dist/spectral/helpers.js +65 -140
  371. package/dist/state.svelte.js +5 -18
  372. package/dist/structure/Arrow.svelte +5 -18
  373. package/dist/structure/ArrowInstances.svelte +160 -0
  374. package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
  375. package/dist/structure/AtomLegend.svelte +120 -85
  376. package/dist/structure/AtomLegend.svelte.d.ts +2 -3
  377. package/dist/structure/Bond.svelte +31 -23
  378. package/dist/structure/CanvasTooltip.svelte +15 -3
  379. package/dist/structure/CellSelect.svelte +45 -35
  380. package/dist/structure/Cylinder.svelte +24 -40
  381. package/dist/structure/InstancedAtoms.svelte +114 -0
  382. package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
  383. package/dist/structure/Lattice.svelte +85 -149
  384. package/dist/structure/SiteLabels.svelte +122 -0
  385. package/dist/structure/SiteLabels.svelte.d.ts +18 -0
  386. package/dist/structure/Structure.svelte +636 -504
  387. package/dist/structure/Structure.svelte.d.ts +4 -2
  388. package/dist/structure/StructureCarousel.svelte +637 -0
  389. package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
  390. package/dist/structure/StructureControls.svelte +165 -425
  391. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  392. package/dist/structure/StructureExportPane.svelte +17 -21
  393. package/dist/structure/StructureInfoPane.svelte +128 -133
  394. package/dist/structure/StructureInfoPane.svelte.d.ts +1 -1
  395. package/dist/structure/StructureScene.svelte +535 -578
  396. package/dist/structure/StructureScene.svelte.d.ts +6 -2
  397. package/dist/structure/StructureViewport.svelte +451 -0
  398. package/dist/structure/StructureViewport.svelte.d.ts +65 -0
  399. package/dist/structure/atom-label-placement.d.ts +16 -12
  400. package/dist/structure/atom-label-placement.js +70 -37
  401. package/dist/structure/atom-properties.d.ts +2 -0
  402. package/dist/structure/atom-properties.js +105 -38
  403. package/dist/structure/bond-order-perception.js +3 -8
  404. package/dist/structure/bonding.d.ts +9 -3
  405. package/dist/structure/bonding.js +95 -46
  406. package/dist/structure/edit-history.d.ts +6 -0
  407. package/dist/structure/edit-history.js +27 -0
  408. package/dist/structure/export.d.ts +1 -0
  409. package/dist/structure/export.js +89 -105
  410. package/dist/structure/format-detect.d.ts +1 -0
  411. package/dist/structure/format-detect.js +20 -0
  412. package/dist/structure/geometry.d.ts +9 -0
  413. package/dist/structure/geometry.js +27 -0
  414. package/dist/structure/index.d.ts +16 -1
  415. package/dist/structure/index.js +15 -10
  416. package/dist/structure/measure.d.ts +1 -1
  417. package/dist/structure/measure.js +6 -12
  418. package/dist/structure/parse.d.ts +2 -1
  419. package/dist/structure/parse.js +272 -313
  420. package/dist/structure/partial-occupancy.js +10 -5
  421. package/dist/structure/pbc.js +85 -107
  422. package/dist/structure/polyhedra.d.ts +0 -1
  423. package/dist/structure/polyhedra.js +7 -21
  424. package/dist/structure/prop-groups.d.ts +85 -0
  425. package/dist/structure/prop-groups.js +18 -0
  426. package/dist/structure/supercell.d.ts +1 -2
  427. package/dist/structure/supercell.js +7 -13
  428. package/dist/symmetry/SymmetryElements.svelte +11 -15
  429. package/dist/symmetry/SymmetryStats.svelte +55 -71
  430. package/dist/symmetry/WyckoffTable.svelte +10 -28
  431. package/dist/symmetry/cell-transform.js +6 -14
  432. package/dist/symmetry/index.d.ts +1 -0
  433. package/dist/symmetry/index.js +13 -10
  434. package/dist/symmetry/spacegroups.js +3 -2
  435. package/dist/table/HeatmapTable.svelte +1142 -447
  436. package/dist/table/HeatmapTable.svelte.d.ts +12 -2
  437. package/dist/table/ToggleMenu.svelte +168 -53
  438. package/dist/table/ToggleMenu.svelte.d.ts +1 -1
  439. package/dist/table/index.d.ts +21 -6
  440. package/dist/table/index.js +34 -21
  441. package/dist/theme/ThemeControl.svelte +16 -8
  442. package/dist/theme/embedded.d.ts +18 -0
  443. package/dist/theme/embedded.js +206 -0
  444. package/dist/theme/index.d.ts +5 -5
  445. package/dist/theme/index.js +5 -12
  446. package/dist/theme/themes.mjs +44 -66
  447. package/dist/tooltip/KCoords.svelte +4 -1
  448. package/dist/tooltip/TooltipContent.svelte +3 -6
  449. package/dist/tooltip/TooltipContent.svelte.d.ts +1 -1
  450. package/dist/tooltip/index.d.ts +8 -1
  451. package/dist/trajectory/Trajectory.svelte +613 -386
  452. package/dist/trajectory/Trajectory.svelte.d.ts +1 -1
  453. package/dist/trajectory/TrajectoryError.svelte +12 -74
  454. package/dist/trajectory/TrajectoryExportPane.svelte +14 -32
  455. package/dist/trajectory/TrajectoryInfoPane.svelte +127 -164
  456. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +2 -1
  457. package/dist/trajectory/extract.js +61 -49
  458. package/dist/trajectory/format-detect.d.ts +2 -0
  459. package/dist/trajectory/format-detect.js +17 -13
  460. package/dist/trajectory/frame-reader.d.ts +2 -0
  461. package/dist/trajectory/frame-reader.js +35 -32
  462. package/dist/trajectory/helpers.d.ts +2 -0
  463. package/dist/trajectory/helpers.js +34 -56
  464. package/dist/trajectory/index.d.ts +1 -0
  465. package/dist/trajectory/index.js +5 -8
  466. package/dist/trajectory/parse/ase.js +1 -1
  467. package/dist/trajectory/parse/h5-utils.d.ts +13 -0
  468. package/dist/trajectory/parse/h5-utils.js +109 -0
  469. package/dist/trajectory/parse/hdf5.d.ts +1 -1
  470. package/dist/trajectory/parse/hdf5.js +116 -106
  471. package/dist/trajectory/parse/index.d.ts +6 -6
  472. package/dist/trajectory/parse/index.js +25 -33
  473. package/dist/trajectory/parse/lammps.js +8 -12
  474. package/dist/trajectory/parse/vasp.js +10 -7
  475. package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
  476. package/dist/trajectory/parse/vaspout-electronic.js +207 -0
  477. package/dist/trajectory/parse/vaspout-h5.d.ts +4 -0
  478. package/dist/trajectory/parse/vaspout-h5.js +281 -0
  479. package/dist/trajectory/parse/xyz.js +59 -9
  480. package/dist/trajectory/plotting.d.ts +8 -9
  481. package/dist/trajectory/plotting.js +113 -64
  482. package/dist/utils.d.ts +3 -0
  483. package/dist/utils.js +7 -0
  484. package/dist/xrd/XrdPlot.svelte +79 -118
  485. package/dist/xrd/broadening.js +2 -1
  486. package/dist/xrd/calc-xrd.js +24 -62
  487. package/dist/xrd/parse.d.ts +0 -1
  488. package/dist/xrd/parse.js +69 -95
  489. package/package.json +94 -34
  490. package/readme.md +6 -5
  491. package/dist/api/mp.d.ts +0 -6
  492. package/dist/api/mp.js +0 -22
  493. package/dist/plot/sunburst/SunburstControls.svelte +0 -200
  494. package/dist/scene/types.d.ts +0 -26
  495. package/dist/tooltip/types.d.ts +0 -8
  496. package/dist/trajectory/constants.d.ts +0 -6
  497. package/dist/trajectory/constants.js +0 -11
  498. /package/dist/{scene/types.js → file-viewer/host-protocol.js} +0 -0
  499. /package/dist/{tooltip/types.js → isosurface/geometry-worker-types.js} +0 -0
@@ -1,19 +1,51 @@
1
1
  // Plotting utilities for trajectory visualization
2
2
  import { PLOT_COLORS } from '../colors';
3
- import { trajectory_property_config } from '../labels';
3
+ import { SCF_AXIS_GROUP, trajectory_property_config, } from '../labels';
4
4
  import { get_coefficient_of_variation } from '../math';
5
5
  // Configuration constants
6
6
  const ENERGY_UNITS = [`eV`, `eV/atom`, `hartree`, `kcal/mol`, `kJ/mol`];
7
7
  const ENERGY_PROPERTIES = [`energy`, `total_energy`, `potential_energy`];
8
8
  const FORCE_PROPERTIES = [`force`, `fmax`, `f`];
9
- const DEFAULT_VISIBLE = new Set([`energy`, `force_max`, `stress_frobenius`]);
9
+ // scf_energy_delta lives in its own axis group (see trajectory_property_config), so
10
+ // listing it here only surfaces it when higher-priority groups (energy/force/stress)
11
+ // don't fill both axes — i.e. single-point SCF convergence views.
12
+ const DEFAULT_VISIBLE = new Set([
13
+ `energy`,
14
+ `force_max`,
15
+ `stress_frobenius`,
16
+ `scf_energy_delta`,
17
+ ]);
18
+ // Shared per-series line/point styling derived from a single color
19
+ const series_color_styles = (color) => ({
20
+ line_style: { stroke: color, stroke_width: 2 },
21
+ point_style: { fill: color, stroke: color, stroke_width: 1 },
22
+ });
23
+ // Cache the per-frame walk per trajectory so re-renders that only change visible_properties or
24
+ // labels/config reuse it (legend toggles mutate plot_series directly and skip regeneration, so they
25
+ // don't hit this). Keyed by trajectory identity (WeakMap auto-evicts) and invalidated on extractor
26
+ // or frame identity changes.
27
+ const same_frames = (cached_frames, current_frames) => cached_frames.length === current_frames.length &&
28
+ cached_frames.every((frame, frame_idx) => frame === current_frames[frame_idx]);
29
+ const stats_cache = new WeakMap();
10
30
  // Unified property extraction and series generation
11
31
  export function generate_plot_series(trajectory, data_extractor, options = {}) {
12
32
  if (!trajectory?.frames?.length)
13
33
  return [];
14
34
  const { property_config = trajectory_property_config, colors = PLOT_COLORS, default_visible_properties = DEFAULT_VISIBLE, } = options;
15
- // Single-pass data extraction with variance detection
16
- const property_stats = extract_property_statistics(trajectory, data_extractor);
35
+ // Single-pass extraction with variance detection, cached per trajectory (see stats_cache above)
36
+ const cached = stats_cache.get(trajectory);
37
+ let property_stats;
38
+ if (cached?.extractor === data_extractor && same_frames(cached.frames, trajectory.frames)) {
39
+ property_stats = cached.stats;
40
+ }
41
+ else {
42
+ property_stats = extract_property_statistics(trajectory, data_extractor);
43
+ stats_cache.set(trajectory, {
44
+ extractor: data_extractor,
45
+ frames: [...trajectory.frames],
46
+ stats: property_stats,
47
+ });
48
+ }
17
49
  // Create all series
18
50
  const all_series = create_series_from_stats(property_stats, property_config, colors);
19
51
  // Group by units and assign axes/visibility
@@ -40,21 +72,14 @@ function extract_property_statistics(trajectory, data_extractor) {
40
72
  // Convert to final format with variation detection
41
73
  const result = new Map();
42
74
  for (const [key, stat] of property_stats) {
43
- const n_values = stat.values.length;
44
- if (n_values <= 1)
75
+ if (stat.values.length <= 1)
45
76
  continue;
46
- const coefficient_of_variation = get_coefficient_of_variation(stat.values);
47
- const lower_key = key.toLowerCase();
48
- const is_energy = lower_key === `energy`;
49
- const has_variation = coefficient_of_variation >= 1e-6;
77
+ const is_energy = key.toLowerCase() === `energy`;
78
+ const has_variation = get_coefficient_of_variation(stat.values) >= 1e-6;
50
79
  // Skip constant properties except energy
51
80
  if (!has_variation && !is_energy)
52
81
  continue;
53
- result.set(key, {
54
- values: stat.values,
55
- has_variation,
56
- is_energy,
57
- });
82
+ result.set(key, { values: stat.values, has_variation, is_energy });
58
83
  }
59
84
  return result;
60
85
  }
@@ -63,25 +88,25 @@ function create_series_from_stats(property_stats, property_config, colors) {
63
88
  const all_series = [];
64
89
  let color_idx = 0;
65
90
  for (const [key, stat] of property_stats) {
66
- if (!stat)
67
- continue;
68
91
  const n_values = stat.values.length;
69
- const { clean_label, unit } = extract_label_and_unit(key, property_config);
92
+ const { clean_label, unit, axis_group } = extract_label_and_unit(key, property_config);
70
93
  const color = colors[color_idx % colors.length];
94
+ // shared per-series metadata (consumers only read metadata[0]); one object, not n copies
95
+ const series_metadata = {
96
+ series_label: unit ? `${clean_label} (${unit})` : clean_label,
97
+ property_key: key, // Store original property key for robust lookups
98
+ };
71
99
  all_series.push({
72
100
  x: Array.from({ length: n_values }, (_, idx) => idx),
73
101
  y: stat.values,
74
102
  label: clean_label,
75
103
  unit,
104
+ ...(axis_group ? { axis_group } : {}),
76
105
  y_axis: `y1`, // Will be reassigned
77
106
  visible: false, // Will be assigned
78
107
  markers: n_values < 30 ? `line+points` : `line`,
79
- metadata: Array(n_values).fill({
80
- series_label: unit ? `${clean_label} (${unit})` : clean_label,
81
- property_key: key, // Store original property key for robust lookups
82
- }),
83
- line_style: { stroke: color, stroke_width: 2 },
84
- point_style: { fill: color, radius: 4, stroke: color, stroke_width: 1 },
108
+ metadata: Array.from({ length: n_values }, () => series_metadata),
109
+ ...series_color_styles(color),
85
110
  });
86
111
  color_idx++;
87
112
  }
@@ -89,10 +114,10 @@ function create_series_from_stats(property_stats, property_config, colors) {
89
114
  }
90
115
  // Group series and assign visibility/axes
91
116
  function group_and_assign_series(series, default_visible_properties) {
92
- // Group by unit
117
+ // Group by axis_group when set (forces a dedicated axis), else by unit
93
118
  const unit_map = new Map();
94
119
  for (const srs of series) {
95
- const unit = srs.unit ?? `dimensionless`;
120
+ const unit = srs.axis_group ?? srs.unit ?? `dimensionless`;
96
121
  const group = unit_map.get(unit) ?? [];
97
122
  group.push(srs);
98
123
  unit_map.set(unit, group);
@@ -101,12 +126,12 @@ function group_and_assign_series(series, default_visible_properties) {
101
126
  const groups = Array.from(unit_map.entries())
102
127
  .map(([unit, group_series]) => {
103
128
  const priority = calculate_priority(unit, group_series);
104
- const has_default_visible = group_series.some((srs) => {
129
+ const is_visible = group_series.some((srs) => {
105
130
  const metadata = Array.isArray(srs.metadata) ? srs.metadata[0] : srs.metadata;
106
131
  const property_key = (metadata?.property_key || srs.label) ?? ``;
107
132
  return is_default_visible(property_key, default_visible_properties);
108
133
  });
109
- return { unit, series: group_series, priority, is_visible: has_default_visible };
134
+ return { unit, series: group_series, priority, is_visible };
110
135
  })
111
136
  .sort((a, b) => a.priority - b.priority);
112
137
  // Apply 2-group visibility limit
@@ -146,8 +171,9 @@ function apply_group_assignments(series, unit_groups) {
146
171
  // Helper functions
147
172
  function extract_label_and_unit(key, property_config) {
148
173
  const config = property_config[key] || property_config[key.toLowerCase()];
149
- if (config)
150
- return { clean_label: config.label, unit: config.unit };
174
+ if (config) {
175
+ return { clean_label: config.label, unit: config.unit, axis_group: config.axis_group };
176
+ }
151
177
  return {
152
178
  clean_label: key.charAt(0).toUpperCase() + key.slice(1).replaceAll('_', ` `),
153
179
  unit: ``,
@@ -219,19 +245,12 @@ function get_axis_label(axis_series) {
219
245
  if (visible_series.length === 0)
220
246
  return `Value`;
221
247
  const unit_groups = new Map();
222
- visible_series.forEach((srs) => {
223
- const unit = srs.unit ?? ``;
224
- const label = srs.label ?? `Value`;
225
- if (!unit_groups.has(unit))
226
- unit_groups.set(unit, []);
227
- const group = unit_groups.get(unit);
228
- if (group)
229
- group.push(label);
230
- });
231
- const unit_entries = Array.from(unit_groups.entries());
232
- if (unit_entries.length === 0)
233
- return `Value`;
234
- const [unit, labels] = unit_entries[0];
248
+ for (const srs of visible_series) {
249
+ const labels = unit_groups.get(srs.unit ?? ``) ?? [];
250
+ labels.push(srs.label ?? `Value`);
251
+ unit_groups.set(srs.unit ?? ``, labels);
252
+ }
253
+ const [unit, labels] = [...unit_groups.entries()][0];
235
254
  const unique_labels = [...new Set(labels)].sort().join(` / `);
236
255
  return unit ? `${unique_labels} (${unit})` : unique_labels;
237
256
  }
@@ -243,14 +262,47 @@ export function generate_axis_labels(plot_series) {
243
262
  y2: get_axis_label(plot_series.filter((srs) => srs.y_axis === `y2`)),
244
263
  };
245
264
  }
265
+ // Log-scale heuristic: a y-axis defaults to log scale when every visible series on
266
+ // it is strictly positive AND their combined values span at least this many decades.
267
+ // SCF convergence residuals (|ΔE|, density rms) span 6+ decades and degenerate into
268
+ // hockey sticks on linear axes; plain energies (large negative) stay linear.
269
+ const LOG_SCALE_MIN_DECADE_SPAN = 3;
270
+ const LOG_SCALE_AXIS_GROUPS = new Set([SCF_AXIS_GROUP]);
271
+ export function generate_axis_scale_types(plot_series) {
272
+ const scale_for_axis = (axis) => {
273
+ let min_val = Infinity;
274
+ let max_val = -Infinity;
275
+ for (const srs of plot_series) {
276
+ if (!srs.visible || (srs.y_axis ?? `y1`) !== axis)
277
+ continue;
278
+ if (!srs.axis_group || !LOG_SCALE_AXIS_GROUPS.has(srs.axis_group))
279
+ return `linear`;
280
+ for (const val of srs.y) {
281
+ if (!Number.isFinite(val))
282
+ continue;
283
+ if (val < min_val)
284
+ min_val = val;
285
+ if (val > max_val)
286
+ max_val = val;
287
+ }
288
+ }
289
+ if (!Number.isFinite(min_val) || min_val <= 0)
290
+ return `linear`;
291
+ return max_val / min_val >= 10 ** LOG_SCALE_MIN_DECADE_SPAN ? `log` : `linear`;
292
+ };
293
+ return { y1: scale_for_axis(`y1`), y2: scale_for_axis(`y2`) };
294
+ }
246
295
  export function generate_streaming_plot_series(metadata_list, options = {}) {
247
296
  if (metadata_list.length === 0)
248
297
  return [];
249
298
  const { property_config = trajectory_property_config, colors = PLOT_COLORS, default_visible_properties = DEFAULT_VISIBLE, max_points = 10_000, // 10,000 plot points provides good visual fidelity while maintaining browser performance
250
299
  } = options;
251
- const sampled_metadata = metadata_list.length > max_points
252
- ? downsample_metadata(metadata_list, max_points)
253
- : metadata_list;
300
+ const ordered_metadata = [...metadata_list]
301
+ .sort((metadata_a, metadata_b) => metadata_a.frame_number - metadata_b.frame_number)
302
+ .filter((metadata, idx, sorted_metadata) => idx === 0 || metadata.frame_number !== sorted_metadata[idx - 1].frame_number);
303
+ const sampled_metadata = ordered_metadata.length > max_points
304
+ ? downsample_metadata(ordered_metadata, max_points)
305
+ : ordered_metadata;
254
306
  const all_properties = new Set();
255
307
  sampled_metadata.forEach((metadata) => {
256
308
  Object.keys(metadata.properties).forEach((prop) => all_properties.add(prop));
@@ -261,22 +313,27 @@ export function generate_streaming_plot_series(metadata_list, options = {}) {
261
313
  for (const property_key of all_properties) {
262
314
  const data_points = sampled_metadata
263
315
  .filter((metadata) => property_key in metadata.properties)
264
- .map((metadata) => ({ x: metadata.step, y: metadata.properties[property_key] }));
316
+ .map((metadata) => ({
317
+ x: metadata.frame_number,
318
+ y: metadata.properties[property_key],
319
+ }));
265
320
  if (data_points.length < 2)
266
321
  continue;
267
322
  const is_energy = property_key.toLowerCase() === `energy`;
268
- if (!is_energy && !has_significant_variation(data_points.map((point) => point.y)))
323
+ const values = data_points.map((point) => point.y);
324
+ if (!is_energy && get_coefficient_of_variation(values) < 1e-6)
269
325
  continue;
270
- const { clean_label, unit } = extract_label_and_unit(property_key, property_config);
326
+ const { clean_label, unit, axis_group } = extract_label_and_unit(property_key, property_config);
271
327
  const is_visible = is_default_visible(property_key, default_visible_properties) || color_idx < 2;
272
328
  const color = colors[color_idx % colors.length];
273
329
  if (is_visible)
274
- visible_props.push({ property: property_key, unit });
330
+ visible_props.push({ property: property_key, unit, axis_group });
275
331
  all_series.push({
276
332
  x: data_points.map((point) => point.x),
277
333
  y: data_points.map((point) => point.y),
278
334
  label: clean_label,
279
335
  unit,
336
+ ...(axis_group ? { axis_group } : {}),
280
337
  y_axis: determine_axis_from_groups(property_key, unit, visible_props),
281
338
  visible: is_visible,
282
339
  markers: data_points.length < 1000 ? `line+points` : `line`,
@@ -284,19 +341,16 @@ export function generate_streaming_plot_series(metadata_list, options = {}) {
284
341
  series_label: unit ? `${clean_label} (${unit})` : clean_label,
285
342
  property_key, // Store original property key for robust lookups
286
343
  })),
287
- line_style: { stroke: color, stroke_width: 2 },
288
- point_style: { fill: color, radius: 4, stroke: color, stroke_width: 1 },
344
+ ...series_color_styles(color),
289
345
  });
290
346
  color_idx++;
291
347
  }
292
348
  return all_series;
293
349
  }
294
- // Helper functions for streaming
350
+ // Down-sample to at most target_points entries (callers guarantee the list is longer)
295
351
  function downsample_metadata(metadata_list, target_points) {
296
352
  const total_count = metadata_list.length;
297
- if (total_count <= target_points)
298
- return metadata_list;
299
- const points = Math.max(2, Math.min(target_points, total_count));
353
+ const points = Math.max(2, target_points);
300
354
  // Evenly spaced indices in [0, total_count-1], guaranteed to include first and last.
301
355
  const sampled = [];
302
356
  for (let idx = 0; idx < points; idx++) {
@@ -307,16 +361,11 @@ function downsample_metadata(metadata_list, target_points) {
307
361
  }
308
362
  return sampled;
309
363
  }
310
- function has_significant_variation(values, tolerance = 1e-6) {
311
- if (values.length <= 1)
312
- return false;
313
- const coefficient_of_variation = get_coefficient_of_variation(values);
314
- return coefficient_of_variation >= tolerance;
315
- }
316
364
  function determine_axis_from_groups(property, unit, visible_properties) {
317
- const mock_series = visible_properties.map(({ property: prop, unit: u }) => ({
365
+ const mock_series = visible_properties.map(({ property: prop, unit: prop_unit, axis_group }) => ({
318
366
  label: prop,
319
- unit: u,
367
+ unit: prop_unit,
368
+ ...(axis_group ? { axis_group } : {}),
320
369
  }));
321
370
  const groups = group_and_assign_series(mock_series, new Set([property]));
322
371
  const target_group = groups.find((group) => group.series.some((srs) => srs.label === property && srs.unit === unit));
package/dist/utils.d.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  export declare const is_plain_object: (val: unknown) => val is Record<string, unknown>;
2
+ export declare const clamp01: (value: number) => number;
2
3
  export declare function merge_nested<T extends Record<string, unknown>>(obj1: T, obj2?: Partial<T>): T;
3
4
  export declare const escape_html: (unsafe_string: string) => string;
4
5
  export declare const normalize_unicode_minus: (value: string) => string;
5
6
  export declare const normalize_scientific_notation: (value: string) => string;
7
+ export declare const parse_num_token: (token: string) => number;
8
+ export declare const parse_leading_num: (line: string) => number;
6
9
  export declare const to_error: (value: unknown) => Error;
7
10
  export declare function make_change_detector(): (value: unknown) => boolean;
8
11
  export declare function decode_url_safe_base64(encoded: string): string | undefined;
package/dist/utils.js CHANGED
@@ -1,5 +1,7 @@
1
1
  // Check if value is a plain object (not array, null, or other types)
2
2
  export const is_plain_object = (val) => typeof val === `object` && val !== null && !Array.isArray(val);
3
+ // Clamp a number to the [0, 1] range.
4
+ export const clamp01 = (value) => Math.max(0, Math.min(1, value));
3
5
  // Merge nested objects (1 level deep).
4
6
  export function merge_nested(obj1, obj2) {
5
7
  const result = { ...obj1, ...obj2 };
@@ -21,6 +23,11 @@ export const escape_html = (unsafe_string) => unsafe_string
21
23
  export const normalize_unicode_minus = (value) => value.replaceAll('−', `-`);
22
24
  // Normalize scientific notation variants (d/D exponent, Mathematica *^).
23
25
  export const normalize_scientific_notation = (value) => normalize_unicode_minus(value).toLowerCase().replaceAll('d', `e`).replaceAll('*^', `e`);
26
+ // Number(token) that treats blank strings as NaN, not 0 like Number(``) does
27
+ export const parse_num_token = (token) => token.trim() === `` ? NaN : Number(token);
28
+ // Parse a line's first whitespace-separated token: tolerates trailing
29
+ // tokens/comments (`1.0 ! scale` -> 1.0) like parseFloat, blank lines are NaN
30
+ export const parse_leading_num = (line) => parse_num_token(line.trim().split(/\s+/)[0]);
24
31
  // Coerce an unknown thrown value into an Error (for typed Promise rejections / error callbacks).
25
32
  export const to_error = (value) => value instanceof Error ? value : new Error(String(value));
26
33
  export function make_change_detector() {