matterviz 0.4.1 → 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 (395) 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 +75 -85
  7. package/dist/brillouin/BrillouinZone.svelte.d.ts +5 -7
  8. package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
  9. package/dist/brillouin/BrillouinZoneExportPane.svelte +18 -14
  10. package/dist/brillouin/BrillouinZoneInfoPane.svelte +6 -10
  11. package/dist/brillouin/BrillouinZoneScene.svelte +26 -39
  12. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  13. package/dist/chempot-diagram/ChemPotDiagram.svelte +33 -38
  14. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +62 -74
  15. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +1 -1
  16. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +511 -547
  17. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +1 -1
  18. package/dist/chempot-diagram/async-compute.svelte.js +1 -1
  19. package/dist/chempot-diagram/controls-state.svelte.js +1 -1
  20. package/dist/colors/index.d.ts +0 -4
  21. package/dist/colors/index.js +19 -20
  22. package/dist/composition/BarChart.svelte +37 -31
  23. package/dist/composition/BubbleChart.svelte +17 -17
  24. package/dist/composition/Composition.svelte +7 -11
  25. package/dist/composition/Formula.svelte +18 -25
  26. package/dist/composition/FormulaFilter.svelte +92 -95
  27. package/dist/composition/PieChart.svelte +55 -41
  28. package/dist/composition/format.js +1 -1
  29. package/dist/composition/index.d.ts +2 -0
  30. package/dist/composition/index.js +14 -0
  31. package/dist/composition/parse.d.ts +2 -2
  32. package/dist/composition/parse.js +11 -10
  33. package/dist/constants.js +11 -9
  34. package/dist/convex-hull/ConvexHull.svelte +12 -15
  35. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
  36. package/dist/convex-hull/ConvexHull2D.svelte +93 -92
  37. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  38. package/dist/convex-hull/ConvexHull3D.svelte +109 -140
  39. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  40. package/dist/convex-hull/ConvexHull4D.svelte +75 -94
  41. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  42. package/dist/convex-hull/ConvexHullChrome.svelte +36 -40
  43. package/dist/convex-hull/ConvexHullControls.svelte +46 -48
  44. package/dist/convex-hull/ConvexHullStats.svelte +193 -195
  45. package/dist/convex-hull/ConvexHullTooltip.svelte +5 -12
  46. package/dist/convex-hull/GasPressureControls.svelte +5 -12
  47. package/dist/convex-hull/StructurePopup.svelte +17 -21
  48. package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
  49. package/dist/convex-hull/TemperatureSlider.svelte +4 -10
  50. package/dist/convex-hull/canvas-interactions.svelte.js +2 -1
  51. package/dist/convex-hull/helpers.d.ts +8 -10
  52. package/dist/convex-hull/helpers.js +36 -36
  53. package/dist/convex-hull/hull-state.svelte.d.ts +1 -1
  54. package/dist/convex-hull/thermodynamics.js +18 -17
  55. package/dist/coordination/CoordinationBarPlot.svelte +38 -33
  56. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  57. package/dist/coordination/calc-coordination.d.ts +1 -1
  58. package/dist/coordination/calc-coordination.js +28 -25
  59. package/dist/element/BohrAtom.svelte +5 -8
  60. package/dist/element/ElementHeading.svelte +4 -1
  61. package/dist/element/ElementPhoto.svelte +11 -9
  62. package/dist/element/ElementStats.svelte +12 -10
  63. package/dist/element/ElementTile.svelte +24 -29
  64. package/dist/element/Nucleus.svelte +4 -2
  65. package/dist/element/data.d.ts +1 -2
  66. package/dist/element/helpers.d.ts +4 -0
  67. package/dist/element/helpers.js +18 -0
  68. package/dist/element/index.d.ts +1 -4
  69. package/dist/element/index.js +3 -18
  70. package/dist/feedback/DragOverlay.svelte +5 -5
  71. package/dist/feedback/DragOverlay.svelte.d.ts +2 -2
  72. package/dist/feedback/StatusMessage.svelte +7 -4
  73. package/dist/fermi-surface/FermiSlice.svelte +21 -18
  74. package/dist/fermi-surface/FermiSurface.svelte +14 -22
  75. package/dist/fermi-surface/FermiSurface.svelte.d.ts +5 -7
  76. package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
  77. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  78. package/dist/fermi-surface/FermiSurfaceScene.svelte +37 -64
  79. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  80. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
  81. package/dist/fermi-surface/compute.js +3 -3
  82. package/dist/fermi-surface/parse.js +22 -24
  83. package/dist/heatmap-matrix/HeatmapMatrix.svelte +109 -148
  84. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +2 -2
  85. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +9 -7
  86. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +1 -1
  87. package/dist/heatmap-matrix/index.d.ts +5 -0
  88. package/dist/icons.d.ts +4 -0
  89. package/dist/icons.js +4 -0
  90. package/dist/io/ExportPane.svelte +10 -6
  91. package/dist/io/decompress.d.ts +2 -1
  92. package/dist/io/decompress.js +22 -35
  93. package/dist/io/export.d.ts +4 -0
  94. package/dist/io/export.js +5 -1
  95. package/dist/io/fetch.d.ts +0 -3
  96. package/dist/io/fetch.js +0 -11
  97. package/dist/io/index.d.ts +0 -1
  98. package/dist/io/index.js +2 -9
  99. package/dist/io/is-binary.d.ts +9 -0
  100. package/dist/io/is-binary.js +45 -1
  101. package/dist/io/url-drop.js +13 -25
  102. package/dist/isosurface/Isosurface.svelte +17 -23
  103. package/dist/isosurface/IsosurfaceControls.svelte +37 -42
  104. package/dist/isosurface/parse-vaspwave.d.ts +3 -0
  105. package/dist/isosurface/parse-vaspwave.js +138 -0
  106. package/dist/isosurface/parse.js +6 -6
  107. package/dist/labels.d.ts +6 -2
  108. package/dist/labels.js +43 -13
  109. package/dist/layout/FullscreenButton.svelte +2 -1
  110. package/dist/layout/FullscreenToggle.svelte +10 -4
  111. package/dist/layout/InfoCard.svelte +7 -18
  112. package/dist/layout/InfoTag.svelte +1 -3
  113. package/dist/layout/NumberRangeInput.svelte +46 -0
  114. package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
  115. package/dist/layout/PropertyFilter.svelte +2 -6
  116. package/dist/layout/SettingsSection.svelte +21 -17
  117. package/dist/layout/SubpageGrid.svelte +3 -1
  118. package/dist/layout/ViewerChrome.svelte +9 -10
  119. package/dist/layout/ViewerChrome.svelte.d.ts +2 -1
  120. package/dist/layout/fullscreen.js +3 -5
  121. package/dist/layout/fullscreen.svelte.js +1 -2
  122. package/dist/layout/index.d.ts +1 -0
  123. package/dist/layout/index.js +1 -0
  124. package/dist/layout/json-tree/JsonNode.svelte +8 -11
  125. package/dist/layout/json-tree/JsonTree.svelte +53 -77
  126. package/dist/layout/json-tree/JsonValue.svelte +7 -15
  127. package/dist/layout/json-tree/utils.js +14 -23
  128. package/dist/math.d.ts +2 -0
  129. package/dist/math.js +19 -0
  130. package/dist/overlays/ContextMenu.svelte +4 -2
  131. package/dist/overlays/CopyButton.svelte +11 -5
  132. package/dist/overlays/DragControlTab.svelte +6 -1
  133. package/dist/overlays/DraggablePane.svelte +81 -26
  134. package/dist/overlays/DraggablePane.svelte.d.ts +1 -0
  135. package/dist/overlays/GlassChip.svelte +30 -0
  136. package/dist/overlays/GlassChip.svelte.d.ts +8 -0
  137. package/dist/overlays/InfoPaneCards.svelte +11 -23
  138. package/dist/overlays/index.d.ts +7 -0
  139. package/dist/overlays/index.js +26 -0
  140. package/dist/overlays/portal.d.ts +2 -0
  141. package/dist/overlays/portal.js +14 -0
  142. package/dist/periodic-table/PeriodicTable.svelte +113 -145
  143. package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
  144. package/dist/periodic-table/PeriodicTableControls.svelte +11 -63
  145. package/dist/periodic-table/TableInset.svelte +9 -4
  146. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +50 -71
  147. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
  148. package/dist/phase-diagram/PhaseDiagramControls.svelte +70 -94
  149. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
  150. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +2 -1
  151. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +12 -12
  152. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
  153. package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
  154. package/dist/phase-diagram/build-diagram.js +3 -3
  155. package/dist/phase-diagram/diagram-input.d.ts +1 -2
  156. package/dist/phase-diagram/parse.js +15 -15
  157. package/dist/phase-diagram/svg-to-diagram.js +21 -15
  158. package/dist/phase-diagram/utils.js +2 -3
  159. package/dist/plot/bar/BarPlot.svelte +430 -391
  160. package/dist/plot/bar/BarPlot.svelte.d.ts +2 -0
  161. package/dist/plot/bar/BarPlotControls.svelte +1 -3
  162. package/dist/plot/bar/BarPlotControls.svelte.d.ts +4 -6
  163. package/dist/plot/bar/SpacegroupBarPlot.svelte +29 -36
  164. package/dist/plot/bar/data.d.ts +5 -4
  165. package/dist/plot/bar/data.js +2 -1
  166. package/dist/plot/box/BoxPlot.svelte +301 -209
  167. package/dist/plot/box/BoxPlot.svelte.d.ts +2 -0
  168. package/dist/plot/box/Violin.svelte.d.ts +1 -0
  169. package/dist/plot/box/box-plot.js +1 -1
  170. package/dist/plot/core/auto-place.js +1 -1
  171. package/dist/plot/core/axis-utils.d.ts +12 -7
  172. package/dist/plot/core/axis-utils.js +48 -48
  173. package/dist/plot/core/components/AxisLabel.svelte +82 -20
  174. package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
  175. package/dist/plot/core/components/ColorBar.svelte +101 -106
  176. package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
  177. package/dist/plot/core/components/FillArea.svelte +10 -17
  178. package/dist/plot/core/components/HierarchyControls.svelte +249 -0
  179. package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
  180. package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
  181. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
  182. package/dist/plot/core/components/Line.svelte +18 -9
  183. package/dist/plot/core/components/Line.svelte.d.ts +2 -0
  184. package/dist/plot/core/components/PlotAxis.svelte +40 -17
  185. package/dist/plot/core/components/PlotControls.svelte +65 -41
  186. package/dist/plot/core/components/PlotLegend.svelte +31 -35
  187. package/dist/plot/core/components/PlotMarginals.svelte +616 -0
  188. package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
  189. package/dist/plot/core/components/PlotTooltip.svelte +1 -1
  190. package/dist/plot/core/components/PortalSelect.svelte +4 -8
  191. package/dist/plot/core/components/ReferenceLine.svelte +27 -24
  192. package/dist/plot/core/components/ReferenceLine3D.svelte +54 -57
  193. package/dist/plot/core/components/ReferencePlane.svelte +7 -8
  194. package/dist/plot/core/components/ZeroLines.svelte +4 -8
  195. package/dist/plot/core/components/ZoomRect.svelte +1 -2
  196. package/dist/plot/core/components/index.d.ts +1 -0
  197. package/dist/plot/core/components/index.js +1 -0
  198. package/dist/plot/core/data-cleaning-signal.d.ts +46 -0
  199. package/dist/plot/core/data-cleaning-signal.js +467 -0
  200. package/dist/plot/core/data-cleaning.d.ts +2 -42
  201. package/dist/plot/core/data-cleaning.js +27 -474
  202. package/dist/plot/core/data-transform.js +9 -5
  203. package/dist/plot/core/fill-utils.d.ts +3 -1
  204. package/dist/plot/core/fill-utils.js +28 -6
  205. package/dist/plot/core/index.d.ts +1 -0
  206. package/dist/plot/core/index.js +1 -0
  207. package/dist/plot/core/interactions.js +0 -2
  208. package/dist/plot/core/layout.d.ts +3 -1
  209. package/dist/plot/core/layout.js +22 -13
  210. package/dist/plot/core/marginals.d.ts +170 -0
  211. package/dist/plot/core/marginals.js +436 -0
  212. package/dist/plot/core/reference-line.js +1 -1
  213. package/dist/plot/core/scales.d.ts +23 -0
  214. package/dist/plot/core/scales.js +39 -13
  215. package/dist/plot/core/types/fills.d.ts +101 -0
  216. package/dist/plot/core/types/fills.js +15 -0
  217. package/dist/plot/core/types/plot-3d.d.ts +87 -0
  218. package/dist/plot/core/types/plot-3d.js +4 -0
  219. package/dist/plot/core/types/reference-lines.d.ts +140 -0
  220. package/dist/plot/core/types/reference-lines.js +9 -0
  221. package/dist/plot/core/types.d.ts +29 -324
  222. package/dist/plot/core/types.js +23 -20
  223. package/dist/plot/core/utils/hierarchy-chart.d.ts +51 -0
  224. package/dist/plot/core/utils/hierarchy-chart.js +179 -0
  225. package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
  226. package/dist/plot/core/utils/hierarchy-labels.js +99 -0
  227. package/dist/plot/core/utils/label-placement.js +2 -2
  228. package/dist/plot/histogram/Histogram.svelte +304 -325
  229. package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
  230. package/dist/plot/histogram/HistogramControls.svelte +30 -28
  231. package/dist/plot/histogram/histogram.d.ts +31 -0
  232. package/dist/plot/histogram/histogram.js +70 -0
  233. package/dist/plot/histogram/index.d.ts +1 -0
  234. package/dist/plot/histogram/index.js +1 -0
  235. package/dist/plot/index.d.ts +1 -0
  236. package/dist/plot/index.js +1 -0
  237. package/dist/plot/sankey/Sankey.svelte +78 -69
  238. package/dist/plot/sankey/Sankey.svelte.d.ts +2 -2
  239. package/dist/plot/sankey/SankeyControls.svelte +22 -16
  240. package/dist/plot/scatter/BinnedScatterPlot.svelte +263 -109
  241. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +7 -0
  242. package/dist/plot/scatter/ElementScatter.svelte +4 -1
  243. package/dist/plot/scatter/ScatterPlot.svelte +477 -385
  244. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +2 -0
  245. package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
  246. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  247. package/dist/plot/scatter/ScatterPoint.svelte +16 -9
  248. package/dist/plot/scatter/binned-scatter-types.d.ts +3 -2
  249. package/dist/plot/scatter/binned-scatter-types.js +6 -1
  250. package/dist/plot/scatter/scatter-data.d.ts +1 -1
  251. package/dist/plot/scatter/scatter-data.js +8 -7
  252. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +25 -34
  253. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +2 -2
  254. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +8 -5
  255. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +113 -116
  256. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +2 -2
  257. package/dist/plot/scatter-3d/Surface3D.svelte +4 -13
  258. package/dist/plot/sunburst/Sunburst.svelte +251 -329
  259. package/dist/plot/sunburst/Sunburst.svelte.d.ts +2 -2
  260. package/dist/plot/sunburst/index.d.ts +1 -1
  261. package/dist/plot/sunburst/index.js +2 -1
  262. package/dist/plot/sunburst/render.d.ts +2 -2
  263. package/dist/plot/sunburst/render.js +47 -22
  264. package/dist/plot/sunburst/sunburst.d.ts +5 -1
  265. package/dist/plot/sunburst/sunburst.js +10 -3
  266. package/dist/plot/treemap/Treemap.svelte +907 -0
  267. package/dist/plot/treemap/Treemap.svelte.d.ts +84 -0
  268. package/dist/plot/treemap/index.d.ts +3 -0
  269. package/dist/plot/treemap/index.js +4 -0
  270. package/dist/plot/treemap/treemap.d.ts +26 -0
  271. package/dist/plot/treemap/treemap.js +99 -0
  272. package/dist/rdf/RdfPlot.svelte +22 -26
  273. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  274. package/dist/rdf/calc-rdf.js +4 -8
  275. package/dist/sanitize.js +1 -1
  276. package/dist/scene/bind-renderer.svelte.js +14 -6
  277. package/dist/settings.d.ts +19 -9
  278. package/dist/settings.js +77 -50
  279. package/dist/spectral/Bands.svelte +223 -230
  280. package/dist/spectral/BandsAndDos.svelte +11 -9
  281. package/dist/spectral/BrillouinBandsDos.svelte +19 -27
  282. package/dist/spectral/Dos.svelte +70 -73
  283. package/dist/spectral/helpers.d.ts +3 -3
  284. package/dist/spectral/helpers.js +25 -35
  285. package/dist/state.svelte.js +5 -18
  286. package/dist/structure/Arrow.svelte +5 -18
  287. package/dist/structure/ArrowInstances.svelte +160 -0
  288. package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
  289. package/dist/structure/AtomLegend.svelte +115 -75
  290. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  291. package/dist/structure/Bond.svelte +31 -23
  292. package/dist/structure/CanvasTooltip.svelte +15 -3
  293. package/dist/structure/CellSelect.svelte +11 -26
  294. package/dist/structure/Cylinder.svelte +24 -40
  295. package/dist/structure/InstancedAtoms.svelte +114 -0
  296. package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
  297. package/dist/structure/Lattice.svelte +85 -149
  298. package/dist/structure/SiteLabels.svelte +122 -0
  299. package/dist/structure/SiteLabels.svelte.d.ts +18 -0
  300. package/dist/structure/Structure.svelte +473 -419
  301. package/dist/structure/Structure.svelte.d.ts +4 -2
  302. package/dist/structure/StructureCarousel.svelte +630 -0
  303. package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
  304. package/dist/structure/StructureControls.svelte +157 -399
  305. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  306. package/dist/structure/StructureExportPane.svelte +17 -21
  307. package/dist/structure/StructureInfoPane.svelte +72 -66
  308. package/dist/structure/StructureInfoPane.svelte.d.ts +1 -1
  309. package/dist/structure/StructureScene.svelte +467 -476
  310. package/dist/structure/StructureScene.svelte.d.ts +3 -1
  311. package/dist/structure/StructureViewport.svelte +386 -0
  312. package/dist/structure/StructureViewport.svelte.d.ts +63 -0
  313. package/dist/structure/atom-label-placement.d.ts +16 -12
  314. package/dist/structure/atom-label-placement.js +70 -37
  315. package/dist/structure/atom-properties.d.ts +2 -0
  316. package/dist/structure/atom-properties.js +104 -38
  317. package/dist/structure/bonding.d.ts +10 -3
  318. package/dist/structure/bonding.js +84 -28
  319. package/dist/structure/edit-history.d.ts +6 -0
  320. package/dist/structure/edit-history.js +27 -0
  321. package/dist/structure/export.d.ts +1 -0
  322. package/dist/structure/export.js +39 -31
  323. package/dist/structure/format-detect.d.ts +1 -0
  324. package/dist/structure/format-detect.js +22 -0
  325. package/dist/structure/geometry.d.ts +9 -0
  326. package/dist/structure/geometry.js +27 -0
  327. package/dist/structure/index.d.ts +16 -1
  328. package/dist/structure/index.js +13 -2
  329. package/dist/structure/measure.d.ts +1 -1
  330. package/dist/structure/measure.js +6 -12
  331. package/dist/structure/parse.d.ts +2 -1
  332. package/dist/structure/parse.js +243 -222
  333. package/dist/structure/partial-occupancy.js +4 -2
  334. package/dist/structure/pbc.js +78 -98
  335. package/dist/structure/polyhedra.d.ts +0 -1
  336. package/dist/structure/polyhedra.js +3 -18
  337. package/dist/structure/supercell.d.ts +1 -2
  338. package/dist/structure/supercell.js +7 -13
  339. package/dist/symmetry/SymmetryElements.svelte +11 -15
  340. package/dist/symmetry/SymmetryStats.svelte +56 -68
  341. package/dist/symmetry/WyckoffTable.svelte +5 -24
  342. package/dist/symmetry/cell-transform.js +1 -0
  343. package/dist/symmetry/index.d.ts +1 -0
  344. package/dist/symmetry/index.js +8 -2
  345. package/dist/symmetry/spacegroups.js +3 -2
  346. package/dist/table/HeatmapTable.svelte +1102 -365
  347. package/dist/table/HeatmapTable.svelte.d.ts +12 -2
  348. package/dist/table/ToggleMenu.svelte +5 -12
  349. package/dist/table/index.d.ts +21 -6
  350. package/dist/table/index.js +34 -21
  351. package/dist/theme/ThemeControl.svelte +16 -8
  352. package/dist/theme/index.d.ts +1 -5
  353. package/dist/theme/index.js +4 -10
  354. package/dist/theme/themes.mjs +14 -7
  355. package/dist/tooltip/KCoords.svelte +4 -1
  356. package/dist/tooltip/TooltipContent.svelte +2 -5
  357. package/dist/trajectory/Trajectory.svelte +515 -308
  358. package/dist/trajectory/Trajectory.svelte.d.ts +1 -1
  359. package/dist/trajectory/TrajectoryError.svelte +11 -8
  360. package/dist/trajectory/TrajectoryExportPane.svelte +14 -31
  361. package/dist/trajectory/TrajectoryInfoPane.svelte +85 -97
  362. package/dist/trajectory/extract.js +56 -34
  363. package/dist/trajectory/format-detect.js +11 -9
  364. package/dist/trajectory/frame-reader.d.ts +2 -0
  365. package/dist/trajectory/frame-reader.js +33 -29
  366. package/dist/trajectory/helpers.d.ts +2 -0
  367. package/dist/trajectory/helpers.js +18 -7
  368. package/dist/trajectory/index.d.ts +1 -0
  369. package/dist/trajectory/index.js +3 -0
  370. package/dist/trajectory/parse/h5-utils.d.ts +13 -0
  371. package/dist/trajectory/parse/h5-utils.js +109 -0
  372. package/dist/trajectory/parse/hdf5.d.ts +1 -1
  373. package/dist/trajectory/parse/hdf5.js +116 -106
  374. package/dist/trajectory/parse/index.d.ts +2 -3
  375. package/dist/trajectory/parse/index.js +17 -20
  376. package/dist/trajectory/parse/lammps.js +8 -12
  377. package/dist/trajectory/parse/vasp.js +10 -7
  378. package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
  379. package/dist/trajectory/parse/vaspout-electronic.js +207 -0
  380. package/dist/trajectory/parse/vaspout-h5.d.ts +5 -0
  381. package/dist/trajectory/parse/vaspout-h5.js +284 -0
  382. package/dist/trajectory/parse/xyz.js +11 -7
  383. package/dist/trajectory/plotting.d.ts +8 -9
  384. package/dist/trajectory/plotting.js +99 -27
  385. package/dist/utils.d.ts +3 -0
  386. package/dist/utils.js +7 -0
  387. package/dist/xrd/XrdPlot.svelte +47 -61
  388. package/dist/xrd/broadening.js +2 -1
  389. package/dist/xrd/calc-xrd.js +2 -4
  390. package/dist/xrd/parse.d.ts +0 -1
  391. package/dist/xrd/parse.js +56 -73
  392. package/package.json +61 -33
  393. package/dist/api/mp.d.ts +0 -6
  394. package/dist/api/mp.js +0 -22
  395. package/dist/plot/sunburst/SunburstControls.svelte +0 -200
@@ -2,6 +2,7 @@ import type { D3InterpolateName } from '../../colors';
2
2
  import type { Point2D } from '../../math';
3
3
  import type { AxisLoadError, BasePlotProps, ColorScaleConfig, ControlsConfig, DataLoaderFn, DataSeries, ErrorBand, FillHandlerEvent, FillRegion, HoverConfig, InternalPoint, LabelPlacementConfig, LegendConfig, PanConfig, PlotConfig, Point, RefLine, RefLineEvent, ScatterHandlerEvent, ScatterHandlerProps, SizeScaleConfig, StyleOverrides, UserContentProps } from '..';
4
4
  import { ColorBar } from '..';
5
+ import type { MarginalsProp } from '../core/marginals';
5
6
  import type { ComponentProps, Snippet } from 'svelte';
6
7
  import type { HTMLAttributes } from 'svelte/elements';
7
8
  import type { TweenOptions } from 'svelte/motion';
@@ -63,6 +64,7 @@ declare function $$render<Metadata extends Record<string, unknown> = Record<stri
63
64
  on_axis_change?: (axis: `x` | `x2` | `y` | `y2`, key: string, new_series: DataSeries<Metadata>[]) => void;
64
65
  on_error?: (error: AxisLoadError) => void;
65
66
  pan?: PanConfig;
67
+ marginals?: MarginalsProp;
66
68
  };
67
69
  exports: {};
68
70
  bindings: "display" | "x2_axis" | "y_axis" | "y2_axis" | "fullscreen" | "wrapper" | "series" | "hovered" | "ref_lines" | "x_axis" | "tooltip_point" | "fill_regions" | "selected_series_idx";
@@ -38,9 +38,7 @@
38
38
  } = $props()
39
39
 
40
40
  let non_null_series = $derived(series.filter((srs) => srs != null))
41
- let visible_series = $derived(
42
- non_null_series.filter((srs) => (srs.visible ?? true)),
43
- )
41
+ let visible_series = $derived(non_null_series.filter((srs) => srs.visible ?? true))
44
42
  let has_multiple_series = $derived(non_null_series.length > 1)
45
43
 
46
44
  // Derive what marker types are present, and whether color/size are data-driven
@@ -55,7 +53,8 @@
55
53
  visible_series.some((srs) => srs?.size_values?.some((val) => val != null)),
56
54
  )
57
55
 
58
- $effect(() => { // Initialize show_points/show_lines from defaults
56
+ $effect(() => {
57
+ // Initialize show_points/show_lines from defaults
59
58
  styles.show_points ??= DEFAULTS.scatter.show_points
60
59
  styles.show_lines ??= DEFAULTS.scatter.show_lines
61
60
  })
@@ -77,14 +76,14 @@
77
76
  {...rest}
78
77
  >
79
78
  {@render children?.({
80
- x_axis,
81
- x2_axis,
82
- y_axis,
83
- y2_axis,
84
- display,
85
- styles,
86
- selected_series_idx,
87
- })}
79
+ x_axis,
80
+ x2_axis,
81
+ y_axis,
82
+ y2_axis,
83
+ display,
84
+ styles,
85
+ selected_series_idx,
86
+ })}
88
87
  {#if has_any_points || has_any_lines}
89
88
  <SettingsSection
90
89
  title="Markers"
@@ -97,14 +96,18 @@
97
96
  >
98
97
  {#if has_any_points}
99
98
  <label
100
- {@attach tooltip({ content: `Toggle visibility of data points in the scatter plot` })}
99
+ {@attach tooltip({
100
+ content: `Toggle visibility of data points in the scatter plot`,
101
+ })}
101
102
  >
102
103
  <input type="checkbox" bind:checked={styles.show_points} /> Show points
103
104
  </label>
104
105
  {/if}
105
106
  {#if has_any_lines}
106
107
  <label
107
- {@attach tooltip({ content: `Toggle visibility of connecting lines between data points` })}
108
+ {@attach tooltip({
109
+ content: `Toggle visibility of connecting lines between data points`,
110
+ })}
108
111
  >
109
112
  <input type="checkbox" bind:checked={styles.show_lines} /> Show lines
110
113
  </label>
@@ -164,11 +167,7 @@
164
167
  {#if !has_color_data}
165
168
  <div class="pane-row" data-key="point.color">
166
169
  <label for="{uid}-point-color">Color:</label>
167
- <input
168
- id="{uid}-point-color"
169
- type="color"
170
- bind:value={styles.point.color}
171
- />
170
+ <input id="{uid}-point-color" type="color" bind:value={styles.point.color} />
172
171
  </div>
173
172
  {/if}
174
173
  <div class="pane-row" data-key="point.opacity">
@@ -12,6 +12,6 @@ type $$ComponentProps = Omit<PlotControlsProps, `children` | `post_children`> &
12
12
  } & Required<PlotConfig>
13
13
  ]>;
14
14
  };
15
- declare const ScatterPlotControls: import("svelte").Component<$$ComponentProps, {}, "display" | "x2_axis" | "y_axis" | "y2_axis" | "x_axis" | "selected_series_idx" | "styles">;
15
+ declare const ScatterPlotControls: import("svelte").Component<$$ComponentProps, {}, "display" | "x2_axis" | "y_axis" | "y2_axis" | "x_axis" | "styles" | "selected_series_idx">;
16
16
  type ScatterPlotControls = ReturnType<typeof ScatterPlotControls>;
17
17
  export default ScatterPlotControls;
@@ -3,7 +3,10 @@
3
3
  import type { HoverStyle, LabelStyle, Point } from '..'
4
4
  import type { Point2D } from '../../math'
5
5
  import type { PointStyle } from '../core/types'
6
- import { estimate_label_size, label_leader_segment } from '../core/utils/label-placement'
6
+ import {
7
+ estimate_label_size,
8
+ label_leader_segment,
9
+ } from '../core/utils/label-placement'
7
10
  import { DEFAULTS } from '../../settings'
8
11
  import * as d3_symbols from 'd3-shape'
9
12
  import { symbol } from 'd3-shape'
@@ -103,13 +106,16 @@
103
106
  {@const offset_x = label.offset?.x ?? 10}
104
107
  {@const offset_y = label.offset?.y ?? 0}
105
108
  {@const displacement = Math.hypot(offset_x, offset_y)}
106
- {@const leader_line = displacement > leader_line_threshold ? label_leader_segment({
107
- point: { x: 0, y: 0 },
108
- point_radius: style.radius ?? 3,
109
- label_center: { x: offset_x, y: offset_y },
110
- label_size: label.size ?? estimate_label_size(label.text, label.font_size),
111
- min_length: 6,
112
- }) : null}
109
+ {@const leader_line =
110
+ displacement > leader_line_threshold
111
+ ? label_leader_segment({
112
+ point: { x: 0, y: 0 },
113
+ point_radius: style.radius ?? 3,
114
+ label_center: { x: offset_x, y: offset_y },
115
+ label_size: label.size ?? estimate_label_size(label.text, label.font_size),
116
+ min_length: 6,
117
+ })
118
+ : null}
113
119
  {#if leader_line}
114
120
  <line
115
121
  x1={leader_line.x1}
@@ -164,7 +170,8 @@
164
170
  filter: blur(3px);
165
171
  }
166
172
  @keyframes ring-pulse {
167
- 0%, 100% {
173
+ 0%,
174
+ 100% {
168
175
  opacity: 0.3;
169
176
  transform: scale(1);
170
177
  }
@@ -1,12 +1,13 @@
1
1
  import type { D3InterpolateName } from '../../colors';
2
2
  import type { DenseInternalPoint } from './adaptive-density';
3
3
  import type ColorBar from '../core/components/ColorBar.svelte';
4
- import type { ColorScaleConfig, LabelPlacementConfig, ScatterHandlerProps, SizeScaleConfig } from '../core/types';
4
+ import type { ColorScaleConfig, LabelPlacementConfig, RefLine, ScatterHandlerProps, SizeScaleConfig } from '../core/types';
5
5
  import type { ComponentProps, Snippet } from 'svelte';
6
6
  export type BinnedColorScaleConfig = ColorScaleConfig | D3InterpolateName;
7
7
  export type BinnedSizeScaleConfig = SizeScaleConfig & {
8
8
  pick_radius?: number | `auto`;
9
9
  };
10
+ export declare const DEFAULT_BINNED_SIZE_SCALE: BinnedSizeScaleConfig;
10
11
  export type BinnedDensityConfig = {
11
12
  bin_px?: number;
12
13
  color_scale?: BinnedColorScaleConfig;
@@ -27,7 +28,7 @@ export type BinnedRefLine = {
27
28
  width?: number;
28
29
  };
29
30
  export type BinnedOverlaysConfig = {
30
- ref_lines?: BinnedRefLine[];
31
+ ref_lines?: (BinnedRefLine | RefLine)[];
31
32
  };
32
33
  export type BinnedPointBasePayload<Metadata extends Record<string, unknown> = Record<string, unknown>> = ScatterHandlerProps<Metadata> & {
33
34
  point: DenseInternalPoint<Metadata>;
@@ -1 +1,6 @@
1
- export {};
1
+ import { SCALE_DEFAULTS } from '../core/types';
2
+ export const DEFAULT_BINNED_SIZE_SCALE = {
3
+ type: `linear`,
4
+ radius_range: SCALE_DEFAULTS.binned_radius,
5
+ pick_radius: SCALE_DEFAULTS.binned_radius[1],
6
+ };
@@ -1,6 +1,6 @@
1
1
  import type { DataSeries, FillRegion, InternalPoint, LegendItem, PointStyle } from '..';
2
2
  import { type AxisRanges } from '../core/types';
3
- export type { AxisRanges };
3
+ export { type AxisRanges } from '../core/types';
4
4
  export declare function filter_series_to_ranges<Metadata = Record<string, unknown>>(series: readonly DataSeries<Metadata>[], ranges: AxisRanges): (DataSeries<Metadata> & {
5
5
  filtered_data: InternalPoint<Metadata>[];
6
6
  })[];
@@ -2,7 +2,8 @@ import { symbol_names } from '../../labels';
2
2
  import { get_series_color, get_series_symbol, process_prop, } from '../core/data-transform';
3
3
  import { is_fill_gradient } from '../core/fill-utils';
4
4
  import { DEFAULT_MARKERS } from '../core/types';
5
- const in_range = (val, lo, hi) => val != null && !isNaN(val) && val >= Math.min(lo, hi) && val <= Math.max(lo, hi);
5
+ export {} from '../core/types';
6
+ const in_range = (val, lo, hi) => val != null && Number.isFinite(val) && val >= Math.min(lo, hi) && val <= Math.max(lo, hi);
6
7
  // Filter series data to only include points within bounds and augment with internal data.
7
8
  // Full x/y arrays are kept on each returned series (via spread) so connecting lines can
8
9
  // continue through off-range points; only filtered_data (rendered markers) is range-limited.
@@ -79,7 +80,7 @@ export function build_legend_data(series, computed_fills, color_scale_fn) {
79
80
  const first_point_style = Array.isArray(data_series?.point_style)
80
81
  ? data_series.point_style[0]
81
82
  : data_series?.point_style;
82
- if (series_markers?.includes(`points`)) {
83
+ if (series_markers.includes(`points`)) {
83
84
  if (first_point_style) {
84
85
  if (typeof first_point_style.symbol_type === `string` &&
85
86
  symbol_names.includes(first_point_style.symbol_type)) {
@@ -101,7 +102,7 @@ export function build_legend_data(series, computed_fills, color_scale_fn) {
101
102
  display_style.symbol_type = undefined;
102
103
  display_style.symbol_color = undefined;
103
104
  }
104
- if (series_markers?.includes(`line`)) {
105
+ if (series_markers.includes(`line`)) {
105
106
  // Explicit line stroke, then color scale, then point colors, then series default
106
107
  let line_color = data_series?.line_style?.stroke;
107
108
  if (!line_color) {
@@ -172,7 +173,7 @@ export function build_legend_data(series, computed_fills, color_scale_fn) {
172
173
  const is_transparent_or_none = (color) => !color ||
173
174
  color === `none` ||
174
175
  color === `transparent` ||
175
- /rgba\([^)]+[,/]\s*0(\.0*)?\s*\)$/.test(color);
176
+ /rgba\([^)]+[,/]\s*0(?:\.0*)?\s*\)$/.test(color);
176
177
  // Type-guard negation of is_transparent_or_none so usable colors narrow to string
177
178
  const is_opaque_color = (color) => !is_transparent_or_none(color);
178
179
  // Resolve tooltip background color: point color-scale value, then point fill, then point
@@ -186,12 +187,12 @@ export function pick_tooltip_bg(point, series, color_scale_fn) {
186
187
  const fill_color = point_style?.fill;
187
188
  if (is_opaque_color(fill_color))
188
189
  return fill_color;
189
- if (series_markers?.includes(`points`)) {
190
+ if (series_markers.includes(`points`)) {
190
191
  const stroke_color = point_style?.stroke;
191
192
  if (is_opaque_color(stroke_color))
192
193
  return stroke_color;
193
194
  }
194
- if (series_markers?.includes(`line`)) {
195
+ if (series_markers.includes(`line`)) {
195
196
  const line_style = series?.line_style ?? {};
196
197
  const first_point_style = Array.isArray(series?.point_style)
197
198
  ? series?.point_style[0]
@@ -203,7 +204,7 @@ export function pick_tooltip_bg(point, series, color_scale_fn) {
203
204
  }
204
205
  if (is_transparent_or_none(line_color_candidate) && first_color_value != null)
205
206
  line_color_candidate = color_scale_fn(first_color_value);
206
- if (is_transparent_or_none(line_color_candidate) && series_markers?.includes(`points`))
207
+ if (is_transparent_or_none(line_color_candidate) && series_markers.includes(`points`))
207
208
  line_color_candidate = first_point_style?.stroke;
208
209
  if (is_opaque_color(line_color_candidate))
209
210
  return line_color_candidate;
@@ -19,12 +19,12 @@
19
19
  LegendConfig,
20
20
  RefLine3D,
21
21
  RefPlane,
22
- ScaleType,
23
22
  Scatter3DHandlerEvent,
24
23
  SizeScaleConfig,
25
24
  StyleOverrides3D,
26
25
  Surface3DConfig,
27
26
  } from '../core/types'
27
+ import { SCALE_DEFAULTS } from '../core/types'
28
28
  import { Canvas } from '@threlte/core'
29
29
  import * as extras from '@threlte/extras'
30
30
  import { onMount } from 'svelte'
@@ -54,17 +54,9 @@
54
54
  },
55
55
  styles = {},
56
56
  // Color and size scaling
57
- color_scale = {
58
- type: `linear` as ScaleType,
59
- scheme: `interpolateViridis` as D3InterpolateName,
60
- value_range: undefined,
61
- },
57
+ color_scale = SCALE_DEFAULTS.color,
62
58
  color_bar = {},
63
- size_scale = {
64
- type: `linear` as ScaleType,
65
- radius_range: [0.05, 0.2],
66
- value_range: undefined,
67
- },
59
+ size_scale = SCALE_DEFAULTS.size_3d,
68
60
  // Legend
69
61
  legend = {},
70
62
  // Camera settings
@@ -119,7 +111,7 @@
119
111
  display?: DisplayConfig3D
120
112
  styles?: StyleOverrides3D
121
113
  color_scale?: ColorScaleConfig | D3InterpolateName
122
- color_bar?: ComponentProps<typeof ColorBar> & { margin?: number | Sides } | null
114
+ color_bar?: (ComponentProps<typeof ColorBar> & { margin?: number | Sides }) | null
123
115
  size_scale?: SizeScaleConfig
124
116
  legend?: LegendConfig | null
125
117
  camera_position?: Vec3
@@ -150,9 +142,7 @@
150
142
  orbit_controls?: ComponentProps<typeof extras.OrbitControls>[`ref`]
151
143
  tooltip?: Snippet<[Scatter3DHandlerEvent<Metadata>]>
152
144
  children?: Snippet<[{ height: number; width: number; fullscreen: boolean }]>
153
- header_controls?: Snippet<
154
- [{ height: number; width: number; fullscreen: boolean }]
155
- >
145
+ header_controls?: Snippet<[{ height: number; width: number; fullscreen: boolean }]>
156
146
  controls_extra?: Snippet
157
147
  } = $props()
158
148
 
@@ -160,7 +150,7 @@
160
150
 
161
151
  // Track mounted state to avoid SSR/hydration mismatch with Canvas
162
152
  let mounted = $state(false)
163
- onMount(() => mounted = true)
153
+ onMount(() => (mounted = true))
164
154
 
165
155
  const series_visibility_keys = $derived.by((): string[] => {
166
156
  const id_counts = new Map<string | number, number>()
@@ -190,8 +180,9 @@
190
180
  }
191
181
  })
192
182
  let series_visibility = $derived(
193
- series.map((srs, idx) =>
194
- visibility_overrides.get(series_visibility_keys[idx]) ?? srs?.visible ?? true
183
+ series.map(
184
+ (srs, idx) =>
185
+ visibility_overrides.get(series_visibility_keys[idx]) ?? srs?.visible ?? true,
195
186
  ),
196
187
  )
197
188
 
@@ -219,16 +210,14 @@
219
210
 
220
211
  // Collect all color values for color bar
221
212
  let all_color_values = $derived(
222
- series.filter(Boolean).flatMap((srs) =>
223
- srs.color_values?.filter((val): val is number => val != null) ?? []
224
- ),
213
+ series
214
+ .filter(Boolean)
215
+ .flatMap((srs) => srs.color_values?.filter((val): val is number => val != null) ?? []),
225
216
  )
226
217
 
227
218
  let auto_color_range = $derived(calculate_domain(all_color_values))
228
219
 
229
- let color_scale_fn = $derived(
230
- create_color_scale(normalized_color_scale, auto_color_range),
231
- )
220
+ let color_scale_fn = $derived(create_color_scale(normalized_color_scale, auto_color_range))
232
221
 
233
222
  // Legend data
234
223
  let legend_data = $derived(
@@ -244,10 +233,9 @@
244
233
  display_style: {
245
234
  symbol_type: `Circle` as const,
246
235
  symbol_color: srs?.point_style
247
- ? (Array.isArray(srs.point_style)
248
- ? srs.point_style[0]?.fill
249
- : srs.point_style?.fill) ??
250
- series_color
236
+ ? ((Array.isArray(srs.point_style)
237
+ ? srs.point_style[0]?.fill
238
+ : srs.point_style?.fill) ?? series_color)
251
239
  : series_color,
252
240
  },
253
241
  has_explicit_label: Boolean(srs?.label),
@@ -306,7 +294,7 @@
306
294
  bind:clientWidth={width}
307
295
  bind:clientHeight={height}
308
296
  {...rest}
309
- class="scatter-3d {rest.class ?? ``}"
297
+ class={[`scatter-3d`, rest.class]}
310
298
  class:fullscreen
311
299
  >
312
300
  {#if width && height}
@@ -391,9 +379,9 @@
391
379
  <!-- Color Bar -->
392
380
  {#if color_bar && all_color_values.length > 0}
393
381
  {@const color_domain = [
394
- normalized_color_scale.value_range?.[0] ?? auto_color_range[0],
395
- normalized_color_scale.value_range?.[1] ?? auto_color_range[1],
396
- ] as Vec2}
382
+ normalized_color_scale.value_range?.[0] ?? auto_color_range[0],
383
+ normalized_color_scale.value_range?.[1] ?? auto_color_range[1],
384
+ ] as Vec2}
397
385
  <ColorBar
398
386
  tick_labels={4}
399
387
  tick_side="primary"
@@ -401,7 +389,8 @@
401
389
  color_scale_domain={color_domain}
402
390
  scale_type={normalized_color_scale.type}
403
391
  range={color_domain?.every((val) => val != null) ? color_domain : undefined}
404
- wrapper_style="position: absolute; bottom: 2em; left: 2em; {color_bar?.wrapper_style ?? ``}"
392
+ wrapper_style="position: absolute; bottom: 2em; left: 2em; {color_bar?.wrapper_style ??
393
+ ``}"
405
394
  bar_style="width: 200px; height: 16px; {color_bar?.style ?? ``}"
406
395
  {...color_bar}
407
396
  />
@@ -508,7 +497,9 @@
508
497
  div.scatter-3d :global(.pane-toggle),
509
498
  div.scatter-3d .header-controls {
510
499
  opacity: 0;
511
- transition: opacity 0.2s, background-color 0.2s;
500
+ transition:
501
+ opacity 0.2s,
502
+ background-color 0.2s;
512
503
  }
513
504
  div.scatter-3d:hover :global(.pane-toggle),
514
505
  div.scatter-3d:hover .header-controls,
@@ -64,7 +64,7 @@ declare function $$render<Metadata extends Record<string, unknown> = Record<stri
64
64
  controls_extra?: Snippet;
65
65
  };
66
66
  exports: {};
67
- bindings: "fullscreen" | "wrapper" | "hovered" | "scene" | "camera" | "orbit_controls" | "camera_position" | "tooltip_point";
67
+ bindings: "fullscreen" | "wrapper" | "hovered" | "camera" | "camera_position" | "orbit_controls" | "scene" | "tooltip_point";
68
68
  slots: {};
69
69
  events: {};
70
70
  };
@@ -72,7 +72,7 @@ declare class __sveltets_Render<Metadata extends Record<string, unknown> = Recor
72
72
  props(): ReturnType<typeof $$render<Metadata>>['props'];
73
73
  events(): ReturnType<typeof $$render<Metadata>>['events'];
74
74
  slots(): ReturnType<typeof $$render<Metadata>>['slots'];
75
- bindings(): "fullscreen" | "wrapper" | "hovered" | "scene" | "camera" | "orbit_controls" | "camera_position" | "tooltip_point";
75
+ bindings(): "fullscreen" | "wrapper" | "hovered" | "camera" | "camera_position" | "orbit_controls" | "scene" | "tooltip_point";
76
76
  exports(): {};
77
77
  }
78
78
  interface $$IsomorphicComponent {
@@ -14,6 +14,7 @@
14
14
  } from '../core/types'
15
15
  import { calculate_domain } from '../core/scales'
16
16
  import { unique_id } from '../core/utils'
17
+ import { parse_num_token } from '../../utils'
17
18
  import type { ComponentProps, Snippet } from 'svelte'
18
19
 
19
20
  // Unique ID prefix to avoid conflicts when multiple instances on same page
@@ -69,8 +70,8 @@
69
70
 
70
71
  // Helpers to update display properties - avoids verbose inline handlers
71
72
  const update_display = (key: keyof DisplayConfig3D) => (event: InputControlEvent) => {
72
- const parsed = parseFloat(get_input_value(event))
73
- // Guard against NaN when input is cleared - preserve existing value
73
+ const parsed = parse_num_token(get_input_value(event))
74
+ // Guard against cleared/invalid input - preserve existing value
74
75
  if (!Number.isNaN(parsed)) display = { ...display, [key]: parsed }
75
76
  }
76
77
  const toggle_display = (key: keyof DisplayConfig3D) => () => {
@@ -356,9 +357,11 @@
356
357
  {#if series.length > 0 || surfaces.length > 0}
357
358
  <div class="data-summary">
358
359
  {#if series.length > 0}
359
- <span>{series.length} series · {
360
- series.reduce((sum, srs) => sum + srs.x.length, 0).toLocaleString()
361
- } points</span>
360
+ <span
361
+ >{series.length} series · {series
362
+ .reduce((sum, srs) => sum + srs.x.length, 0)
363
+ .toLocaleString()} points</span
364
+ >
362
365
  {/if}
363
366
  {#if surfaces.length > 0}
364
367
  <span>{surfaces.length} {surfaces.length === 1 ? `surface` : `surfaces`}</span>