matterviz 0.3.7 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/dist/Icon.svelte +7 -4
  2. package/dist/MillerIndexInput.svelte +1 -1
  3. package/dist/api/optimade.js +32 -26
  4. package/dist/app.css +0 -3
  5. package/dist/brillouin/BrillouinZone.svelte +76 -148
  6. package/dist/brillouin/BrillouinZone.svelte.d.ts +6 -14
  7. package/dist/brillouin/BrillouinZoneExportPane.svelte +43 -96
  8. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  9. package/dist/brillouin/BrillouinZoneInfoPane.svelte +9 -32
  10. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +2 -3
  11. package/dist/brillouin/BrillouinZoneScene.svelte +97 -205
  12. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +4 -23
  13. package/dist/brillouin/BrillouinZoneTooltip.svelte +16 -25
  14. package/dist/brillouin/ReciprocalVectors.svelte +39 -0
  15. package/dist/brillouin/ReciprocalVectors.svelte.d.ts +9 -0
  16. package/dist/brillouin/compute.d.ts +2 -0
  17. package/dist/brillouin/compute.js +89 -90
  18. package/dist/brillouin/geometry.d.ts +8 -0
  19. package/dist/brillouin/geometry.js +57 -0
  20. package/dist/brillouin/index.d.ts +2 -0
  21. package/dist/brillouin/index.js +2 -0
  22. package/dist/brillouin/types.d.ts +2 -2
  23. package/dist/chempot-diagram/ChemPotDiagram.svelte +14 -13
  24. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +1 -1
  25. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +109 -203
  26. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +4 -1
  27. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +180 -470
  28. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +7 -1
  29. package/dist/chempot-diagram/async-compute.svelte.js +3 -1
  30. package/dist/chempot-diagram/chempot-worker.js +2 -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 +4 -4
  34. package/dist/chempot-diagram/compute.js +20 -20
  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.js +8 -7
  45. package/dist/composition/FormulaFilter.svelte +18 -11
  46. package/dist/composition/PieChart.svelte +11 -10
  47. package/dist/composition/chem-sys.d.ts +8 -0
  48. package/dist/composition/chem-sys.js +86 -0
  49. package/dist/composition/format.js +7 -4
  50. package/dist/composition/index.d.ts +1 -0
  51. package/dist/composition/index.js +1 -0
  52. package/dist/composition/parse.d.ts +0 -1
  53. package/dist/composition/parse.js +41 -31
  54. package/dist/controls.d.ts +1 -0
  55. package/dist/controls.js +0 -1
  56. package/dist/convex-hull/ConvexHull.svelte +8 -10
  57. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -4
  58. package/dist/convex-hull/ConvexHull2D.svelte +106 -185
  59. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  60. package/dist/convex-hull/ConvexHull3D.svelte +179 -683
  61. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  62. package/dist/convex-hull/ConvexHull4D.svelte +183 -687
  63. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  64. package/dist/convex-hull/ConvexHullChrome.svelte +268 -0
  65. package/dist/convex-hull/ConvexHullChrome.svelte.d.ts +30 -0
  66. package/dist/convex-hull/ConvexHullControls.svelte +88 -7
  67. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +7 -6
  68. package/dist/convex-hull/ConvexHullInfoPane.svelte +18 -5
  69. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +6 -5
  70. package/dist/convex-hull/ConvexHullStats.svelte +36 -175
  71. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +3 -1
  72. package/dist/convex-hull/ConvexHullTooltip.svelte +11 -2
  73. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +2 -1
  74. package/dist/convex-hull/GasPressureControls.svelte +4 -4
  75. package/dist/convex-hull/TemperatureSlider.svelte +2 -2
  76. package/dist/convex-hull/barycentric-coords.d.ts +2 -4
  77. package/dist/convex-hull/barycentric-coords.js +6 -33
  78. package/dist/convex-hull/canvas-interactions.svelte.d.ts +79 -0
  79. package/dist/convex-hull/canvas-interactions.svelte.js +278 -0
  80. package/dist/convex-hull/demo-temperature.d.ts +1 -1
  81. package/dist/convex-hull/demo-temperature.js +20 -22
  82. package/dist/convex-hull/gas-thermodynamics.d.ts +2 -2
  83. package/dist/convex-hull/gas-thermodynamics.js +22 -30
  84. package/dist/convex-hull/helpers.d.ts +42 -7
  85. package/dist/convex-hull/helpers.js +171 -78
  86. package/dist/convex-hull/hull-state.svelte.d.ts +44 -0
  87. package/dist/convex-hull/hull-state.svelte.js +124 -0
  88. package/dist/convex-hull/index.d.ts +10 -8
  89. package/dist/convex-hull/index.js +7 -2
  90. package/dist/convex-hull/thermodynamics.js +136 -960
  91. package/dist/convex-hull/types.d.ts +13 -5
  92. package/dist/convex-hull/types.js +12 -0
  93. package/dist/coordination/CoordinationBarPlot.svelte +27 -34
  94. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  95. package/dist/element/BohrAtom.svelte +2 -1
  96. package/dist/element/index.d.ts +4 -0
  97. package/dist/element/index.js +18 -0
  98. package/dist/feedback/DragOverlay.svelte +3 -1
  99. package/dist/feedback/DragOverlay.svelte.d.ts +1 -0
  100. package/dist/feedback/StatusMessage.svelte +13 -3
  101. package/dist/fermi-surface/FermiSlice.svelte +13 -5
  102. package/dist/fermi-surface/FermiSurface.svelte +78 -151
  103. package/dist/fermi-surface/FermiSurface.svelte.d.ts +5 -14
  104. package/dist/fermi-surface/FermiSurfaceControls.svelte +1 -1
  105. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  106. package/dist/fermi-surface/FermiSurfaceScene.svelte +72 -221
  107. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +3 -23
  108. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +8 -34
  109. package/dist/fermi-surface/compute.js +67 -66
  110. package/dist/fermi-surface/export.js +6 -16
  111. package/dist/fermi-surface/index.d.ts +0 -1
  112. package/dist/fermi-surface/index.js +0 -1
  113. package/dist/fermi-surface/parse.d.ts +1 -1
  114. package/dist/fermi-surface/parse.js +71 -79
  115. package/dist/fermi-surface/types.d.ts +3 -2
  116. package/dist/heatmap-matrix/HeatmapMatrix.svelte +69 -52
  117. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +4 -3
  118. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +3 -2
  119. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +5 -5
  120. package/dist/heatmap-matrix/index.d.ts +3 -2
  121. package/dist/heatmap-matrix/index.js +1 -1
  122. package/dist/index.d.ts +1 -0
  123. package/dist/index.js +1 -0
  124. package/dist/io/ExportPane.svelte +166 -0
  125. package/dist/io/ExportPane.svelte.d.ts +17 -0
  126. package/dist/io/decompress.js +5 -4
  127. package/dist/io/export.d.ts +9 -5
  128. package/dist/io/export.js +77 -51
  129. package/dist/io/fetch.d.ts +2 -1
  130. package/dist/io/fetch.js +5 -1
  131. package/dist/io/file-drop.d.ts +8 -1
  132. package/dist/io/file-drop.js +48 -36
  133. package/dist/io/index.d.ts +2 -0
  134. package/dist/io/index.js +10 -0
  135. package/dist/io/types.d.ts +13 -0
  136. package/dist/io/url-drop.js +64 -33
  137. package/dist/isosurface/parse.js +52 -51
  138. package/dist/isosurface/slice.js +5 -4
  139. package/dist/isosurface/types.js +1 -1
  140. package/dist/keyboard.d.ts +3 -0
  141. package/dist/keyboard.js +23 -0
  142. package/dist/labels.d.ts +1 -1
  143. package/dist/labels.js +9 -8
  144. package/dist/layout/FullscreenButton.svelte +33 -0
  145. package/dist/layout/FullscreenButton.svelte.d.ts +10 -0
  146. package/dist/layout/FullscreenToggle.svelte +8 -14
  147. package/dist/layout/PropertyFilter.svelte +3 -2
  148. package/dist/layout/SettingsSection.svelte +1 -1
  149. package/dist/layout/ViewerChrome.svelte +116 -0
  150. package/dist/layout/ViewerChrome.svelte.d.ts +17 -0
  151. package/dist/layout/fullscreen.d.ts +4 -0
  152. package/dist/layout/fullscreen.svelte.d.ts +8 -0
  153. package/dist/layout/fullscreen.svelte.js +37 -0
  154. package/dist/layout/index.d.ts +3 -0
  155. package/dist/layout/index.js +3 -0
  156. package/dist/layout/json-tree/JsonNode.svelte +1 -1
  157. package/dist/layout/json-tree/JsonTree.svelte +2 -2
  158. package/dist/layout/json-tree/utils.js +5 -4
  159. package/dist/marching-cubes.js +8 -13
  160. package/dist/math.d.ts +12 -4
  161. package/dist/math.js +42 -30
  162. package/dist/overlays/DraggablePane.svelte +4 -4
  163. package/dist/overlays/index.d.ts +4 -0
  164. package/dist/periodic-table/PeriodicTable.svelte +27 -15
  165. package/dist/periodic-table/PropertySelect.svelte +1 -0
  166. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +9 -3
  167. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +1 -1
  168. package/dist/phase-diagram/PhaseDiagramControls.svelte +3 -2
  169. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +4 -3
  170. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +4 -2
  171. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +2 -3
  172. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +47 -132
  173. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +3 -4
  174. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +1 -1
  175. package/dist/phase-diagram/build-diagram.js +2 -2
  176. package/dist/phase-diagram/colors.js +1 -1
  177. package/dist/phase-diagram/parse.d.ts +2 -1
  178. package/dist/phase-diagram/parse.js +6 -5
  179. package/dist/phase-diagram/types.d.ts +1 -1
  180. package/dist/phase-diagram/utils.d.ts +3 -3
  181. package/dist/phase-diagram/utils.js +8 -12
  182. package/dist/plot/{BarPlot.svelte → bar/BarPlot.svelte} +246 -841
  183. package/dist/plot/{BarPlot.svelte.d.ts → bar/BarPlot.svelte.d.ts} +8 -16
  184. package/dist/plot/{BarPlotControls.svelte → bar/BarPlotControls.svelte} +6 -5
  185. package/dist/plot/{BarPlotControls.svelte.d.ts → bar/BarPlotControls.svelte.d.ts} +3 -3
  186. package/dist/plot/{SpacegroupBarPlot.svelte → bar/SpacegroupBarPlot.svelte} +8 -7
  187. package/dist/plot/{SpacegroupBarPlot.svelte.d.ts → bar/SpacegroupBarPlot.svelte.d.ts} +1 -1
  188. package/dist/plot/bar/data.d.ts +40 -0
  189. package/dist/plot/bar/data.js +154 -0
  190. package/dist/plot/bar/geometry.d.ts +39 -0
  191. package/dist/plot/bar/geometry.js +60 -0
  192. package/dist/plot/bar/index.d.ts +3 -0
  193. package/dist/plot/bar/index.js +3 -0
  194. package/dist/plot/box/BoxPlot.svelte +1292 -0
  195. package/dist/plot/box/BoxPlot.svelte.d.ts +95 -0
  196. package/dist/plot/box/BoxPlotControls.svelte +109 -0
  197. package/dist/plot/box/BoxPlotControls.svelte.d.ts +19 -0
  198. package/dist/plot/box/Violin.svelte +14 -0
  199. package/dist/plot/box/Violin.svelte.d.ts +70 -0
  200. package/dist/plot/box/box-plot.d.ts +56 -0
  201. package/dist/plot/box/box-plot.js +129 -0
  202. package/dist/plot/box/index.d.ts +5 -0
  203. package/dist/plot/box/index.js +5 -0
  204. package/dist/plot/box/kde.d.ts +17 -0
  205. package/dist/plot/box/kde.js +160 -0
  206. package/dist/plot/box/quantile.d.ts +3 -0
  207. package/dist/plot/box/quantile.js +53 -0
  208. package/dist/plot/{auto-place.d.ts → core/auto-place.d.ts} +1 -1
  209. package/dist/plot/{auto-place.js → core/auto-place.js} +6 -3
  210. package/dist/plot/core/axis-utils.d.ts +46 -0
  211. package/dist/plot/core/axis-utils.js +110 -0
  212. package/dist/plot/{AxisLabel.svelte → core/components/AxisLabel.svelte} +2 -2
  213. package/dist/plot/{AxisLabel.svelte.d.ts → core/components/AxisLabel.svelte.d.ts} +1 -1
  214. package/dist/plot/{ColorBar.svelte → core/components/ColorBar.svelte} +41 -38
  215. package/dist/plot/{ColorBar.svelte.d.ts → core/components/ColorBar.svelte.d.ts} +7 -6
  216. package/dist/plot/{ColorScaleSelect.svelte → core/components/ColorScaleSelect.svelte} +4 -3
  217. package/dist/plot/{ColorScaleSelect.svelte.d.ts → core/components/ColorScaleSelect.svelte.d.ts} +2 -2
  218. package/dist/plot/core/components/ControlPane.svelte +46 -0
  219. package/dist/plot/core/components/ControlPane.svelte.d.ts +13 -0
  220. package/dist/plot/{FillArea.svelte → core/components/FillArea.svelte} +17 -6
  221. package/dist/plot/{FillArea.svelte.d.ts → core/components/FillArea.svelte.d.ts} +1 -1
  222. package/dist/plot/{InteractiveAxisLabel.svelte → core/components/InteractiveAxisLabel.svelte} +3 -3
  223. package/dist/plot/{InteractiveAxisLabel.svelte.d.ts → core/components/InteractiveAxisLabel.svelte.d.ts} +2 -2
  224. package/dist/plot/{Line.svelte → core/components/Line.svelte} +33 -15
  225. package/dist/plot/{Line.svelte.d.ts → core/components/Line.svelte.d.ts} +3 -2
  226. package/dist/plot/{PlotAxis.svelte → core/components/PlotAxis.svelte} +9 -6
  227. package/dist/plot/{PlotAxis.svelte.d.ts → core/components/PlotAxis.svelte.d.ts} +5 -3
  228. package/dist/plot/{PlotControls.svelte → core/components/PlotControls.svelte} +17 -29
  229. package/dist/plot/core/components/PlotControls.svelte.d.ts +4 -0
  230. package/dist/plot/{PlotLegend.svelte → core/components/PlotLegend.svelte} +21 -10
  231. package/dist/plot/{PlotLegend.svelte.d.ts → core/components/PlotLegend.svelte.d.ts} +3 -2
  232. package/dist/plot/{PlotTooltip.svelte → core/components/PlotTooltip.svelte} +17 -1
  233. package/dist/plot/{PlotTooltip.svelte.d.ts → core/components/PlotTooltip.svelte.d.ts} +8 -0
  234. package/dist/plot/{PortalSelect.svelte → core/components/PortalSelect.svelte} +11 -7
  235. package/dist/plot/{ReferenceLine.svelte → core/components/ReferenceLine.svelte} +3 -3
  236. package/dist/plot/{ReferenceLine.svelte.d.ts → core/components/ReferenceLine.svelte.d.ts} +1 -1
  237. package/dist/plot/{ReferenceLine3D.svelte → core/components/ReferenceLine3D.svelte} +5 -5
  238. package/dist/plot/{ReferenceLine3D.svelte.d.ts → core/components/ReferenceLine3D.svelte.d.ts} +5 -5
  239. package/dist/plot/{ReferencePlane.svelte → core/components/ReferencePlane.svelte} +8 -8
  240. package/dist/plot/{ReferencePlane.svelte.d.ts → core/components/ReferencePlane.svelte.d.ts} +5 -5
  241. package/dist/plot/{ZeroLines.svelte → core/components/ZeroLines.svelte} +3 -3
  242. package/dist/plot/{ZeroLines.svelte.d.ts → core/components/ZeroLines.svelte.d.ts} +3 -3
  243. package/dist/plot/{ZoomRect.svelte → core/components/ZoomRect.svelte} +1 -1
  244. package/dist/plot/{ZoomRect.svelte.d.ts → core/components/ZoomRect.svelte.d.ts} +1 -1
  245. package/dist/plot/core/components/index.d.ts +17 -0
  246. package/dist/plot/core/components/index.js +17 -0
  247. package/dist/plot/{data-cleaning.d.ts → core/data-cleaning.d.ts} +71 -1
  248. package/dist/plot/{data-cleaning.js → core/data-cleaning.js} +21 -23
  249. package/dist/plot/{data-transform.d.ts → core/data-transform.d.ts} +2 -2
  250. package/dist/plot/{data-transform.js → core/data-transform.js} +3 -3
  251. package/dist/plot/core/fill-utils.d.ts +34 -0
  252. package/dist/plot/core/fill-utils.js +391 -0
  253. package/dist/plot/core/index.d.ts +10 -0
  254. package/dist/plot/core/index.js +11 -0
  255. package/dist/plot/core/interactions.d.ts +39 -0
  256. package/dist/plot/core/interactions.js +209 -0
  257. package/dist/plot/{layout.d.ts → core/layout.d.ts} +1 -0
  258. package/dist/plot/{layout.js → core/layout.js} +16 -8
  259. package/dist/plot/core/pan-zoom.svelte.d.ts +35 -0
  260. package/dist/plot/core/pan-zoom.svelte.js +221 -0
  261. package/dist/plot/core/placed-tween.svelte.d.ts +21 -0
  262. package/dist/plot/core/placed-tween.svelte.js +68 -0
  263. package/dist/plot/{reference-line.d.ts → core/reference-line.d.ts} +11 -11
  264. package/dist/plot/{reference-line.js → core/reference-line.js} +29 -42
  265. package/dist/plot/core/scales.d.ts +40 -0
  266. package/dist/plot/{scales.js → core/scales.js} +94 -93
  267. package/dist/plot/core/svg.d.ts +3 -0
  268. package/dist/plot/core/svg.js +41 -0
  269. package/dist/plot/{types.d.ts → core/types.d.ts} +36 -85
  270. package/dist/plot/{types.js → core/types.js} +1 -1
  271. package/dist/plot/{utils → core/utils}/label-placement.d.ts +3 -3
  272. package/dist/plot/{utils → core/utils}/label-placement.js +3 -3
  273. package/dist/plot/core/utils/series-visibility.d.ts +26 -0
  274. package/dist/plot/{utils → core/utils}/series-visibility.js +29 -2
  275. package/dist/plot/core/utils.d.ts +12 -0
  276. package/dist/plot/core/utils.js +27 -0
  277. package/dist/plot/{Histogram.svelte → histogram/Histogram.svelte} +174 -551
  278. package/dist/plot/{Histogram.svelte.d.ts → histogram/Histogram.svelte.d.ts} +2 -2
  279. package/dist/plot/{HistogramControls.svelte → histogram/HistogramControls.svelte} +6 -6
  280. package/dist/plot/{HistogramControls.svelte.d.ts → histogram/HistogramControls.svelte.d.ts} +4 -4
  281. package/dist/plot/histogram/index.d.ts +2 -0
  282. package/dist/plot/histogram/index.js +2 -0
  283. package/dist/plot/index.d.ts +8 -41
  284. package/dist/plot/index.js +10 -39
  285. package/dist/plot/sankey/Sankey.svelte +697 -0
  286. package/dist/plot/sankey/Sankey.svelte.d.ts +74 -0
  287. package/dist/plot/sankey/SankeyControls.svelte +98 -0
  288. package/dist/plot/sankey/SankeyControls.svelte.d.ts +19 -0
  289. package/dist/plot/sankey/index.d.ts +4 -0
  290. package/dist/plot/sankey/index.js +3 -0
  291. package/dist/plot/sankey/sankey-types.d.ts +42 -0
  292. package/dist/plot/sankey/sankey-types.js +4 -0
  293. package/dist/plot/sankey/sankey.d.ts +52 -0
  294. package/dist/plot/sankey/sankey.js +189 -0
  295. package/dist/plot/{BinnedScatterPlot.svelte → scatter/BinnedScatterPlot.svelte} +64 -64
  296. package/dist/plot/{BinnedScatterPlot.svelte.d.ts → scatter/BinnedScatterPlot.svelte.d.ts} +6 -6
  297. package/dist/plot/{ElementScatter.svelte → scatter/ElementScatter.svelte} +6 -6
  298. package/dist/plot/{ElementScatter.svelte.d.ts → scatter/ElementScatter.svelte.d.ts} +2 -2
  299. package/dist/plot/{ScatterPlot.svelte → scatter/ScatterPlot.svelte} +297 -1008
  300. package/dist/plot/{ScatterPlot.svelte.d.ts → scatter/ScatterPlot.svelte.d.ts} +10 -18
  301. package/dist/plot/{ScatterPlotControls.svelte → scatter/ScatterPlotControls.svelte} +6 -5
  302. package/dist/plot/{ScatterPlotControls.svelte.d.ts → scatter/ScatterPlotControls.svelte.d.ts} +2 -2
  303. package/dist/plot/{ScatterPoint.svelte → scatter/ScatterPoint.svelte} +7 -7
  304. package/dist/plot/{ScatterPoint.svelte.d.ts → scatter/ScatterPoint.svelte.d.ts} +3 -3
  305. package/dist/plot/{adaptive-density.d.ts → scatter/adaptive-density.d.ts} +14 -4
  306. package/dist/plot/{adaptive-density.js → scatter/adaptive-density.js} +46 -20
  307. package/dist/plot/{binned-scatter-types.d.ts → scatter/binned-scatter-types.d.ts} +5 -12
  308. package/dist/plot/scatter/index.d.ts +7 -0
  309. package/dist/plot/scatter/index.js +5 -0
  310. package/dist/plot/scatter/scatter-data.d.ts +19 -0
  311. package/dist/plot/scatter/scatter-data.js +212 -0
  312. package/dist/plot/{ScatterPlot3D.svelte → scatter-3d/ScatterPlot3D.svelte} +25 -34
  313. package/dist/plot/{ScatterPlot3D.svelte.d.ts → scatter-3d/ScatterPlot3D.svelte.d.ts} +9 -17
  314. package/dist/plot/{ScatterPlot3DControls.svelte → scatter-3d/ScatterPlot3DControls.svelte} +14 -14
  315. package/dist/plot/{ScatterPlot3DControls.svelte.d.ts → scatter-3d/ScatterPlot3DControls.svelte.d.ts} +6 -6
  316. package/dist/plot/{ScatterPlot3DScene.svelte → scatter-3d/ScatterPlot3DScene.svelte} +129 -128
  317. package/dist/plot/{ScatterPlot3DScene.svelte.d.ts → scatter-3d/ScatterPlot3DScene.svelte.d.ts} +6 -15
  318. package/dist/plot/{Surface3D.svelte → scatter-3d/Surface3D.svelte} +7 -6
  319. package/dist/plot/{Surface3D.svelte.d.ts → scatter-3d/Surface3D.svelte.d.ts} +5 -4
  320. package/dist/plot/scatter-3d/index.d.ts +4 -0
  321. package/dist/plot/scatter-3d/index.js +4 -0
  322. package/dist/plot/sunburst/Sunburst.svelte +1041 -0
  323. package/dist/plot/sunburst/Sunburst.svelte.d.ts +97 -0
  324. package/dist/plot/sunburst/SunburstControls.svelte +200 -0
  325. package/dist/plot/sunburst/SunburstControls.svelte.d.ts +26 -0
  326. package/dist/plot/sunburst/index.d.ts +4 -0
  327. package/dist/plot/sunburst/index.js +4 -0
  328. package/dist/plot/sunburst/render.d.ts +34 -0
  329. package/dist/plot/sunburst/render.js +122 -0
  330. package/dist/plot/sunburst/sunburst.d.ts +62 -0
  331. package/dist/plot/sunburst/sunburst.js +269 -0
  332. package/dist/rdf/RdfPlot.svelte +2 -1
  333. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  334. package/dist/rdf/calc-rdf.js +11 -24
  335. package/dist/sanitize.js +14 -3
  336. package/dist/scene/SceneCamera.svelte +62 -0
  337. package/dist/scene/SceneCamera.svelte.d.ts +19 -0
  338. package/dist/scene/bind-renderer.svelte.d.ts +2 -0
  339. package/dist/scene/bind-renderer.svelte.js +14 -0
  340. package/dist/scene/index.d.ts +4 -0
  341. package/dist/scene/index.js +5 -0
  342. package/dist/scene/props.js +52 -0
  343. package/dist/scene/types.d.ts +26 -0
  344. package/dist/scene/types.js +1 -0
  345. package/dist/settings.d.ts +79 -3
  346. package/dist/settings.js +321 -1
  347. package/dist/spectral/Bands.svelte +47 -36
  348. package/dist/spectral/Bands.svelte.d.ts +6 -6
  349. package/dist/spectral/BandsAndDos.svelte +23 -25
  350. package/dist/spectral/BrillouinBandsDos.svelte +42 -30
  351. package/dist/spectral/Dos.svelte +15 -23
  352. package/dist/spectral/Dos.svelte.d.ts +4 -3
  353. package/dist/spectral/helpers.d.ts +8 -6
  354. package/dist/spectral/helpers.js +137 -65
  355. package/dist/state.svelte.d.ts +0 -7
  356. package/dist/state.svelte.js +0 -6
  357. package/dist/structure/Arrow.svelte +2 -4
  358. package/dist/structure/AtomLegend.svelte +8 -9
  359. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  360. package/dist/structure/CanvasTooltip.svelte +1 -0
  361. package/dist/structure/CellSelect.svelte +12 -5
  362. package/dist/structure/CellSelect.svelte.d.ts +2 -1
  363. package/dist/structure/Cylinder.svelte +12 -8
  364. package/dist/structure/Cylinder.svelte.d.ts +4 -1
  365. package/dist/structure/Lattice.svelte +2 -2
  366. package/dist/structure/Structure.svelte +365 -423
  367. package/dist/structure/Structure.svelte.d.ts +5 -15
  368. package/dist/structure/StructureControls.svelte +217 -2
  369. package/dist/structure/StructureControls.svelte.d.ts +5 -3
  370. package/dist/structure/StructureExportPane.svelte +54 -156
  371. package/dist/structure/StructureExportPane.svelte.d.ts +4 -5
  372. package/dist/structure/StructureInfoPane.svelte +10 -9
  373. package/dist/structure/StructureInfoPane.svelte.d.ts +5 -5
  374. package/dist/structure/StructureScene.svelte +376 -208
  375. package/dist/structure/StructureScene.svelte.d.ts +22 -20
  376. package/dist/structure/{label-placement.d.ts → atom-label-placement.d.ts} +3 -3
  377. package/dist/structure/{label-placement.js → atom-label-placement.js} +15 -5
  378. package/dist/structure/atom-properties.d.ts +1 -1
  379. package/dist/structure/atom-properties.js +17 -22
  380. package/dist/structure/bond-order-perception.js +3 -5
  381. package/dist/structure/bonding.d.ts +4 -0
  382. package/dist/structure/bonding.js +134 -63
  383. package/dist/structure/export.d.ts +24 -4
  384. package/dist/structure/export.js +89 -143
  385. package/dist/structure/index.d.ts +4 -4
  386. package/dist/structure/index.js +3 -3
  387. package/dist/structure/measure.d.ts +3 -2
  388. package/dist/structure/measure.js +6 -5
  389. package/dist/structure/parse.d.ts +3 -2
  390. package/dist/structure/parse.js +419 -438
  391. package/dist/structure/partial-occupancy.d.ts +0 -1
  392. package/dist/structure/partial-occupancy.js +1 -1
  393. package/dist/structure/pbc.d.ts +1 -1
  394. package/dist/structure/pbc.js +190 -13
  395. package/dist/structure/polyhedra.d.ts +41 -0
  396. package/dist/structure/polyhedra.js +602 -0
  397. package/dist/structure/site.d.ts +4 -0
  398. package/dist/structure/site.js +1 -0
  399. package/dist/structure/supercell.js +3 -2
  400. package/dist/structure/validation.js +5 -6
  401. package/dist/symmetry/SymmetryElementControls.svelte +69 -0
  402. package/dist/symmetry/SymmetryElementControls.svelte.d.ts +9 -0
  403. package/dist/symmetry/SymmetryElements.svelte +354 -0
  404. package/dist/symmetry/SymmetryElements.svelte.d.ts +24 -0
  405. package/dist/symmetry/SymmetryStats.svelte +113 -8
  406. package/dist/symmetry/WyckoffTable.svelte +68 -7
  407. package/dist/symmetry/WyckoffTable.svelte.d.ts +3 -0
  408. package/dist/symmetry/cell-transform.js +7 -14
  409. package/dist/symmetry/index.d.ts +14 -4
  410. package/dist/symmetry/index.js +291 -72
  411. package/dist/symmetry/spacegroups.d.ts +12 -1
  412. package/dist/symmetry/spacegroups.js +63 -14
  413. package/dist/symmetry/symmetry-elements.d.ts +33 -0
  414. package/dist/symmetry/symmetry-elements.js +521 -0
  415. package/dist/symmetry/wyckoff-db.d.ts +9 -0
  416. package/dist/symmetry/wyckoff-db.js +87 -0
  417. package/dist/table/HeatmapTable.svelte +66 -25
  418. package/dist/table/HeatmapTable.svelte.d.ts +1 -1
  419. package/dist/table/index.d.ts +1 -3
  420. package/dist/table/index.js +1 -1
  421. package/dist/theme/index.js +8 -8
  422. package/dist/tooltip/KCoords.svelte +45 -0
  423. package/dist/tooltip/KCoords.svelte.d.ts +8 -0
  424. package/dist/tooltip/index.d.ts +1 -0
  425. package/dist/tooltip/index.js +1 -0
  426. package/dist/trajectory/Trajectory.svelte +123 -100
  427. package/dist/trajectory/Trajectory.svelte.d.ts +11 -22
  428. package/dist/trajectory/TrajectoryExportPane.svelte +17 -25
  429. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +4 -5
  430. package/dist/trajectory/TrajectoryInfoPane.svelte +5 -3
  431. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +3 -2
  432. package/dist/trajectory/constants.js +6 -2
  433. package/dist/trajectory/extract.js +17 -37
  434. package/dist/trajectory/format-detect.d.ts +1 -1
  435. package/dist/trajectory/format-detect.js +27 -19
  436. package/dist/trajectory/frame-reader.d.ts +0 -1
  437. package/dist/trajectory/frame-reader.js +63 -162
  438. package/dist/trajectory/helpers.d.ts +10 -2
  439. package/dist/trajectory/helpers.js +56 -36
  440. package/dist/trajectory/index.js +1 -1
  441. package/dist/trajectory/parse/ase.d.ts +9 -1
  442. package/dist/trajectory/parse/ase.js +47 -32
  443. package/dist/trajectory/parse/diagnostics.d.ts +3 -0
  444. package/dist/trajectory/parse/diagnostics.js +14 -0
  445. package/dist/trajectory/parse/hdf5.js +1 -1
  446. package/dist/trajectory/parse/index.d.ts +1 -1
  447. package/dist/trajectory/parse/index.js +65 -105
  448. package/dist/trajectory/parse/lammps.d.ts +0 -2
  449. package/dist/trajectory/parse/lammps.js +8 -6
  450. package/dist/trajectory/parse/pymatgen.d.ts +2 -0
  451. package/dist/trajectory/parse/pymatgen.js +74 -0
  452. package/dist/trajectory/parse/vasp.js +38 -18
  453. package/dist/trajectory/parse/xyz.d.ts +13 -1
  454. package/dist/trajectory/parse/xyz.js +102 -94
  455. package/dist/trajectory/plotting.d.ts +1 -2
  456. package/dist/trajectory/plotting.js +16 -113
  457. package/dist/utils.d.ts +2 -0
  458. package/dist/utils.js +7 -5
  459. package/dist/xrd/XrdPlot.svelte +16 -30
  460. package/dist/xrd/broadening.d.ts +2 -1
  461. package/dist/xrd/calc-xrd.js +18 -20
  462. package/dist/xrd/index.d.ts +2 -2
  463. package/dist/xrd/parse.js +2 -2
  464. package/package.json +43 -26
  465. package/dist/element/data.json +0 -11864
  466. package/dist/fermi-surface/marching-cubes.d.ts +0 -2
  467. package/dist/fermi-surface/marching-cubes.js +0 -2
  468. package/dist/plot/PlotControls.svelte.d.ts +0 -4
  469. package/dist/plot/axis-utils.d.ts +0 -19
  470. package/dist/plot/axis-utils.js +0 -78
  471. package/dist/plot/defaults.d.ts +0 -19
  472. package/dist/plot/defaults.js +0 -9
  473. package/dist/plot/fill-utils.d.ts +0 -46
  474. package/dist/plot/fill-utils.js +0 -322
  475. package/dist/plot/hover-lock.svelte.d.ts +0 -14
  476. package/dist/plot/hover-lock.svelte.js +0 -46
  477. package/dist/plot/interactions.d.ts +0 -12
  478. package/dist/plot/interactions.js +0 -101
  479. package/dist/plot/scales.d.ts +0 -48
  480. package/dist/plot/svg.d.ts +0 -1
  481. package/dist/plot/svg.js +0 -11
  482. package/dist/plot/utils/series-visibility.d.ts +0 -15
  483. package/dist/plot/utils.d.ts +0 -1
  484. package/dist/plot/utils.js +0 -14
  485. /package/dist/plot/{PortalSelect.svelte.d.ts → core/components/PortalSelect.svelte.d.ts} +0 -0
  486. /package/dist/plot/{binned-scatter-types.js → scatter/binned-scatter-types.js} +0 -0
@@ -0,0 +1,37 @@
1
+ import { set_fullscreen_bg } from './fullscreen';
2
+ // Two-way sync between a bindable `fullscreen` flag, the browser fullscreen state of a wrapper, and the fullscreen background CSS var. Creates $effects (call during component init). Shared by BrillouinZone/FermiSurface/Structure viewers.
3
+ // TODO Trajectory.svelte still has its own fullscreen variant — migrate it here.
4
+ export function sync_fullscreen(opts) {
5
+ // Flag -> browser: enter/exit fullscreen when the bound flag changes
6
+ $effect(() => {
7
+ if (typeof window === `undefined`)
8
+ return;
9
+ const wrapper = opts.get_wrapper();
10
+ const fullscreen = opts.get_fullscreen();
11
+ const fs_el = document.fullscreenElement;
12
+ if (fullscreen && fs_el !== wrapper && wrapper) {
13
+ wrapper.requestFullscreen().catch((err) => {
14
+ console.error(err);
15
+ opts.on_request_error?.(err);
16
+ });
17
+ }
18
+ else if (!fullscreen && fs_el === wrapper) {
19
+ document.exitFullscreen().catch(console.error);
20
+ }
21
+ set_fullscreen_bg(wrapper, fullscreen, opts.bg_css_var);
22
+ });
23
+ // Browser -> flag: track fullscreenchange events (covers Esc key, programmatic exit, ...)
24
+ $effect(() => {
25
+ if (typeof document === `undefined`)
26
+ return () => { };
27
+ const handler = () => {
28
+ // tie state to this component's own wrapper so another element entering fullscreen
29
+ // doesn't flip every viewer's flag (would also trigger a requestFullscreen cascade)
30
+ const is_fullscreen = document.fullscreenElement === opts.get_wrapper();
31
+ opts.set_fullscreen(is_fullscreen);
32
+ opts.on_change?.(is_fullscreen);
33
+ };
34
+ document.addEventListener(`fullscreenchange`, handler);
35
+ return () => document.removeEventListener(`fullscreenchange`, handler);
36
+ });
37
+ }
@@ -1,4 +1,6 @@
1
1
  export * from './fullscreen';
2
+ export * from './fullscreen.svelte';
3
+ export { default as FullscreenButton } from './FullscreenButton.svelte';
2
4
  export { default as FullscreenToggle } from './FullscreenToggle.svelte';
3
5
  export { default as InfoCard } from './InfoCard.svelte';
4
6
  export { default as InfoTag } from './InfoTag.svelte';
@@ -6,5 +8,6 @@ export * from './json-tree';
6
8
  export { default as PropertyFilter } from './PropertyFilter.svelte';
7
9
  export { default as SettingsSection } from './SettingsSection.svelte';
8
10
  export { default as SubpageGrid } from './SubpageGrid.svelte';
11
+ export { default as ViewerChrome } from './ViewerChrome.svelte';
9
12
  export type InfoTagVariant = `default` | `success` | `warning` | `error` | `info`;
10
13
  export type InfoTagSize = `sm` | `md` | `lg`;
@@ -1,4 +1,6 @@
1
1
  export * from './fullscreen';
2
+ export * from './fullscreen.svelte';
3
+ export { default as FullscreenButton } from './FullscreenButton.svelte';
2
4
  export { default as FullscreenToggle } from './FullscreenToggle.svelte';
3
5
  export { default as InfoCard } from './InfoCard.svelte';
4
6
  export { default as InfoTag } from './InfoTag.svelte';
@@ -6,3 +8,4 @@ export * from './json-tree';
6
8
  export { default as PropertyFilter } from './PropertyFilter.svelte';
7
9
  export { default as SettingsSection } from './SettingsSection.svelte';
8
10
  export { default as SubpageGrid } from './SubpageGrid.svelte';
11
+ export { default as ViewerChrome } from './ViewerChrome.svelte';
@@ -118,7 +118,7 @@
118
118
  }
119
119
 
120
120
  // Get children based on value type
121
- function get_children(): Array<{ key: string | number; value: unknown }> {
121
+ function get_children(): { key: string | number; value: unknown }[] {
122
122
  if (!expandable) return []
123
123
 
124
124
  if (value_type === `array`) {
@@ -252,8 +252,8 @@
252
252
  const all_paths = collect_all_paths(value, root_path)
253
253
  const descendants = target_path === `` ? all_paths : all_paths.filter(
254
254
  (entry) =>
255
- entry === target_path || entry.startsWith(target_path + `.`) ||
256
- entry.startsWith(target_path + `[`),
255
+ entry === target_path || entry.startsWith(`${target_path}.`) ||
256
+ entry.startsWith(`${target_path}[`),
257
257
  )
258
258
  return descendants.includes(target_path)
259
259
  ? descendants
@@ -13,6 +13,7 @@ function safe_stringify(val) {
13
13
  return `${inner}n`;
14
14
  if (typeof inner === `symbol`)
15
15
  return inner.toString();
16
+ // oxlint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- anonymous fns have name ``
16
17
  if (typeof inner === `function`)
17
18
  return `[Function: ${inner.name || `anonymous`}]`;
18
19
  return inner;
@@ -93,7 +94,7 @@ function format_path_segment(segment, is_first = false) {
93
94
  return is_first ? segment : `.${segment}`;
94
95
  }
95
96
  // Use bracket notation for keys with special characters
96
- return `["${segment.replace(/"/g, `\\"`)}"]`;
97
+ return `["${segment.replaceAll('"', `\\"`)}"]`;
97
98
  }
98
99
  // Format a full path from segments
99
100
  // e.g., ["users", 0, "name"] -> "users[0].name"
@@ -317,7 +318,7 @@ export function parse_path(path) {
317
318
  const num = Number(current);
318
319
  if (Number.isNaN(num)) {
319
320
  // Remove surrounding quotes and unescape internal quotes
320
- const unquoted = current.replace(/^"|"$/g, ``).replace(/\\"/g, `"`);
321
+ const unquoted = current.replaceAll(/^"|"$/g, ``).replaceAll('\\"', `"`);
321
322
  segments.push(unquoted);
322
323
  }
323
324
  else
@@ -335,7 +336,7 @@ export function parse_path(path) {
335
336
  // Apply same numeric/quoted-string logic as inside brackets
336
337
  const num = Number(current);
337
338
  if (Number.isNaN(num)) {
338
- const unquoted = current.replace(/^"|"$/g, ``).replace(/\\"/g, `"`);
339
+ const unquoted = current.replaceAll(/^"|"$/g, ``).replaceAll('\\"', `"`);
339
340
  segments.push(unquoted);
340
341
  }
341
342
  else
@@ -407,7 +408,7 @@ export function set_at_path(root, path_str, new_value, root_label) {
407
408
  const start = root_label && segments[0] === root_label ? 1 : 0;
408
409
  if (start >= segments.length)
409
410
  return new_value;
410
- const cloned = JSON.parse(JSON.stringify(root));
411
+ const cloned = structuredClone(root);
411
412
  let current = cloned;
412
413
  for (let idx = start; idx < segments.length - 1; idx++) {
413
414
  const next = current[segments[idx]];
@@ -335,9 +335,11 @@ export function marching_cubes(grid, iso_value, k_lattice, options = {}) {
335
335
  const vertices = [];
336
336
  const faces = [];
337
337
  const normals = [];
338
- // Precompute grid dimension products for flattening and cache keys
339
- const ny_nz = ny * nz;
340
- const max_flat = nx * ny_nz; // for computing cache keys
338
+ // Cache keys use UNWRAPPED grid coords (reach n in periodic mode, hence radix n+1):
339
+ // wrapping would merge vertices on opposite cell faces into cell-spanning triangles.
340
+ const key_nz = nz + 1;
341
+ const key_ny_nz = (ny + 1) * key_nz;
342
+ const max_flat = (nx + 1) * key_ny_nz; // for computing cache keys
341
343
  // Use numeric cache key - safe for grids up to ~300³ (2^53 / 2 / max_flat)
342
344
  // For much larger grids (>30M cells), consider switching to Map<string, number>
343
345
  // with keys like `${flat1},${flat2}` or Map<bigint, number> to avoid
@@ -367,17 +369,10 @@ export function marching_cubes(grid, iso_value, k_lattice, options = {}) {
367
369
  const ox2 = CUBE_VERTS_X[v2_idx];
368
370
  const oy2 = CUBE_VERTS_Y[v2_idx];
369
371
  const oz2 = CUBE_VERTS_Z[v2_idx];
370
- // Compute wrapped grid positions using safe modulo for periodic boundaries
371
- const g1x = periodic ? wrap_grid_idx(ix + ox1, nx) : ix + ox1;
372
- const g1y = periodic ? wrap_grid_idx(iy + oy1, ny) : iy + oy1;
373
- const g1z = periodic ? wrap_grid_idx(iz + oz1, nz) : iz + oz1;
374
- const g2x = periodic ? wrap_grid_idx(ix + ox2, nx) : ix + ox2;
375
- const g2y = periodic ? wrap_grid_idx(iy + oy2, ny) : iy + oy2;
376
- const g2z = periodic ? wrap_grid_idx(iz + oz2, nz) : iz + oz2;
377
- // Create numeric cache key (sorted for consistency)
372
+ // Sorted numeric key from UNWRAPPED coords (value/gradient lookups wrap internally).
378
373
  // Safe for grids up to ~300³ before exceeding Number.MAX_SAFE_INTEGER
379
- const flat1 = g1x * ny_nz + g1y * nz + g1z;
380
- const flat2 = g2x * ny_nz + g2y * nz + g2z;
374
+ const flat1 = (ix + ox1) * key_ny_nz + (iy + oy1) * key_nz + (iz + oz1);
375
+ const flat2 = (ix + ox2) * key_ny_nz + (iy + oy2) * key_nz + (iz + oz2);
381
376
  const cache_key = flat1 < flat2 ? flat1 * max_flat + flat2 : flat2 * max_flat + flat1;
382
377
  const cached = vertex_cache.get(cache_key);
383
378
  if (cached !== undefined)
package/dist/math.d.ts CHANGED
@@ -2,6 +2,7 @@ import type { LatticeParams, Pbc } from './structure/index';
2
2
  export type Vec2 = [number, number];
3
3
  export type Vec3 = [number, number, number];
4
4
  export type Vec4 = [number, number, number, number];
5
+ export type Vec5 = [number, number, number, number, number];
5
6
  export type Vec9 = [number, number, number, number, number, number, number, number, number];
6
7
  export type Point2D = {
7
8
  x: number;
@@ -51,12 +52,14 @@ export declare function matrix_inverse_3x3(matrix: Matrix3x3): Matrix3x3;
51
52
  export declare function mat3x3_vec3_multiply(matrix: Matrix3x3, vector: Vec3): Vec3;
52
53
  export declare function add<T extends NdVector>(...vecs: T[]): T;
53
54
  export declare function subtract<T extends NdVector>(vec1: T, vec2: T): T;
55
+ export declare function dot(vec1: Matrix3x3, vec2: Matrix3x3): Matrix3x3;
56
+ export declare function dot(vec1: Matrix3x3, vec2: Vec3): Vec3;
54
57
  export declare function dot(vec1: NdVector, vec2: NdVector): number;
55
58
  export declare function dot(vec1: NdVector[], vec2: NdVector): number[];
56
59
  export declare function dot(vec1: NdVector[], vec2: NdVector[]): number[][];
57
60
  export declare function to_voigt(tensor: number[][]): number[];
58
- export declare function from_voigt(voigt: number[]): number[][];
59
- export declare function vec9_to_mat3x3(flat_array: number[]): number[][];
61
+ export declare function from_voigt(voigt: number[]): Matrix3x3;
62
+ export declare function vec9_to_mat3x3(flat_array: number[]): Matrix3x3;
60
63
  export declare function tensor_to_flat_array(tensor: number[][]): number[];
61
64
  export declare const transpose_3x3_matrix: (matrix: Matrix3x3) => Matrix3x3;
62
65
  export declare function scale_lattice_matrix(orig_matrix: Matrix3x3, scaling_factors: Vec3): Matrix3x3;
@@ -78,7 +81,10 @@ export declare const lerp: (start: number, end: number, t: number) => number;
78
81
  export declare const lerp_vec3: (start: Vec3, end: Vec3, t: number) => Vec3;
79
82
  export declare const centered_frac: (val: number) => number;
80
83
  export declare const vecs_equal: (vec_a?: Vec3, vec_b?: Vec3) => boolean;
81
- export declare function normalize_vec3(vec: Vec3, fallback?: Vec3): Vec3;
84
+ type Normalized<T extends readonly number[]> = {
85
+ -readonly [K in keyof T]: number;
86
+ };
87
+ export declare function normalize_vec<T extends readonly number[]>(vec: T, fallback?: NoInfer<T>): Normalized<T>;
82
88
  export declare function compute_in_plane_basis(normal: Vec3): [Vec3, Vec3];
83
89
  export declare function are_coplanar(points: number[][], tolerance?: number): boolean;
84
90
  export declare function merge_coplanar_triangles(positions: Float32Array, tolerance?: number): Float32Array;
@@ -86,7 +92,7 @@ export declare function compute_bounding_box(vertices: Vec3[]): {
86
92
  min: Vec3;
87
93
  max: Vec3;
88
94
  };
89
- export declare function is_square_matrix(matrix: unknown, dim: number): boolean;
95
+ export declare function is_square_matrix(matrix: unknown, dim: number): matrix is number[][];
90
96
  export declare function point_in_polygon(point_x: number, point_y: number, vertices: Vec2[]): boolean;
91
97
  export declare function compute_bounding_box_2d(vertices: Vec2[]): {
92
98
  min: Vec2;
@@ -98,4 +104,6 @@ export declare function polygon_centroid(vertices: Vec2[]): Vec2;
98
104
  export declare function solve_linear_system(A: number[][], // NxN coefficient matrix
99
105
  b: number[]): number[] | null;
100
106
  export declare const cross_2d: (origin: Vec2, point_a: Vec2, point_b: Vec2) => number;
107
+ export declare const monotone_chain: (sorted: Vec2[]) => Vec2[];
101
108
  export declare function convex_hull_2d(points: Vec2[]): Vec2[];
109
+ export {};
package/dist/math.js CHANGED
@@ -448,17 +448,19 @@ export const centered_frac = (val) => {
448
448
  // Element-wise equality check for two optional Vec3s.
449
449
  // Returns true if both are the same reference, or both are defined with equal components.
450
450
  export const vecs_equal = (vec_a, vec_b) => vec_a === vec_b ||
451
- (!!vec_a &&
452
- !!vec_b &&
451
+ (vec_a != null &&
452
+ vec_b != null &&
453
453
  vec_a[0] === vec_b[0] &&
454
454
  vec_a[1] === vec_b[1] &&
455
455
  vec_a[2] === vec_b[2]);
456
- // Normalize a Vec3 to unit length, returns zero vector if input is zero
457
- export function normalize_vec3(vec, fallback) {
458
- const len = Math.hypot(vec[0], vec[1], vec[2]);
459
- if (len < EPS)
460
- return fallback ?? [0, 0, 0];
461
- return [vec[0] / len, vec[1] / len, vec[2] / len];
456
+ // Normalize a vector of any length to unit length; returns `fallback` (or zeros) when ~zero.
457
+ export function normalize_vec(vec, fallback) {
458
+ let sum_sq = 0;
459
+ for (const coord of vec)
460
+ sum_sq += coord * coord;
461
+ const len = Math.sqrt(sum_sq);
462
+ const unit = len < EPS ? (fallback ?? vec.map(() => 0)) : vec.map((coord) => coord / len);
463
+ return unit;
462
464
  }
463
465
  // Compute orthonormal basis vectors in a plane perpendicular to `normal`.
464
466
  // Uses Gram-Schmidt orthogonalization + cross product.
@@ -472,7 +474,7 @@ export function compute_in_plane_basis(normal) {
472
474
  ref_vec[1] - dot_nr * normal[1],
473
475
  ref_vec[2] - dot_nr * normal[2],
474
476
  ];
475
- const u_vec = normalize_vec3(u_raw, [0, 1, 0]);
477
+ const u_vec = normalize_vec(u_raw, [0, 1, 0]);
476
478
  const v_vec = cross_3d(normal, u_vec);
477
479
  return [u_vec, v_vec]; // u, v basis vectors
478
480
  }
@@ -649,6 +651,7 @@ export function merge_coplanar_triangles(positions, tolerance = 1e-4) {
649
651
  emit_tri(verts[0], verts[1], verts[2]);
650
652
  }
651
653
  };
654
+ const tri_area = (va, vb, vc) => 0.5 * Math.hypot(...cross_3d(subtract(vb, va), subtract(vc, va)));
652
655
  for (const members of groups.values()) {
653
656
  if (members.length === 1) {
654
657
  emit_original(members);
@@ -692,6 +695,18 @@ export function merge_coplanar_triangles(positions, tolerance = 1e-4) {
692
695
  }
693
696
  return unique_verts[best_idx];
694
697
  });
698
+ // Convex hull fills notches of concave patches, inventing area — keep originals then
699
+ let group_area = 0;
700
+ let fan_area = 0;
701
+ for (const tri_idx of members)
702
+ group_area += tri_area(...tri_planes[tri_idx].verts);
703
+ for (let idx = 1; idx < hull_3d.length - 1; idx++) {
704
+ fan_area += tri_area(hull_3d[0], hull_3d[idx], hull_3d[idx + 1]);
705
+ }
706
+ if (Math.abs(fan_area - group_area) > Math.max(group_area, 1e-12) * 1e-6) {
707
+ emit_original(members);
708
+ continue;
709
+ }
695
710
  // Fan-triangulate from hull vertex 0
696
711
  for (let idx = 1; idx < hull_3d.length - 1; idx++) {
697
712
  emit_tri(hull_3d[0], hull_3d[idx], hull_3d[idx + 1]);
@@ -722,13 +737,14 @@ export function compute_bounding_box(vertices) {
722
737
  }
723
738
  return { min, max };
724
739
  }
725
- // Check if a matrix is square with dimension NxN
740
+ // Check if a matrix is a finite-numeric square matrix of dimension NxN (type predicate
741
+ // so callers get number[][] narrowing without assertions). Rejects NaN/Infinity entries.
726
742
  export function is_square_matrix(matrix, dim) {
727
743
  if (!Array.isArray(matrix))
728
744
  return false;
729
745
  if (matrix.length !== dim)
730
746
  return false;
731
- return matrix.every((row) => Array.isArray(row) && row.length === dim);
747
+ return matrix.every((row) => Array.isArray(row) && row.length === dim && row.every((val) => Number.isFinite(val)));
732
748
  }
733
749
  // --- 2D Geometry Utilities ---
734
750
  // Point-in-polygon test using ray casting algorithm
@@ -873,31 +889,27 @@ b) {
873
889
  }
874
890
  export const cross_2d = (origin, point_a, point_b) => (point_a[0] - origin[0]) * (point_b[1] - origin[1]) -
875
891
  (point_a[1] - origin[1]) * (point_b[0] - origin[0]);
892
+ // One half of Andrew's monotone chain built from x-then-y *pre-sorted* points
893
+ // (lower chain; pass reversed input for the upper chain).
894
+ export const monotone_chain = (sorted) => {
895
+ const chain = [];
896
+ for (const pt of sorted) {
897
+ while (chain.length >= 2 &&
898
+ cross_2d(chain[chain.length - 2], chain[chain.length - 1], pt) <= 0) {
899
+ chain.pop();
900
+ }
901
+ chain.push(pt);
902
+ }
903
+ return chain;
904
+ };
876
905
  // Full 2D convex hull via Andrew's monotone chain algorithm.
877
906
  // Returns vertices in counter-clockwise order.
878
907
  export function convex_hull_2d(points) {
879
908
  if (points.length < 3)
880
909
  return [...points];
881
910
  const sorted = points.toSorted((a, b) => a[0] - b[0] || a[1] - b[1]);
882
- // Lower hull
883
- const lower = [];
884
- for (const pt of sorted) {
885
- while (lower.length >= 2 &&
886
- cross_2d(lower[lower.length - 2], lower[lower.length - 1], pt) <= 0) {
887
- lower.pop();
888
- }
889
- lower.push(pt);
890
- }
891
- // Upper hull
892
- const upper = [];
893
- for (let idx = sorted.length - 1; idx >= 0; idx--) {
894
- const pt = sorted[idx];
895
- while (upper.length >= 2 &&
896
- cross_2d(upper[upper.length - 2], upper[upper.length - 1], pt) <= 0) {
897
- upper.pop();
898
- }
899
- upper.push(pt);
900
- }
911
+ const lower = monotone_chain(sorted);
912
+ const upper = monotone_chain(sorted.toReversed());
901
913
  // Remove last point of each half (it's the first point of the other)
902
914
  lower.pop();
903
915
  upper.pop();
@@ -173,10 +173,10 @@
173
173
  if (Date.now() - resize_end_time < 200) return
174
174
 
175
175
  const target = event.target
176
- const is_toggle_button = target instanceof Node && toggle_pane_btn &&
177
- (target === toggle_pane_btn || toggle_pane_btn.contains(target))
178
- const is_inside_pane = target instanceof Node && pane_div &&
179
- (target === pane_div || pane_div.contains(target))
176
+ const is_toggle_button = target instanceof Node &&
177
+ (target === toggle_pane_btn || (toggle_pane_btn?.contains(target) ?? false))
178
+ const is_inside_pane = target instanceof Node &&
179
+ (target === pane_div || (pane_div?.contains(target) ?? false))
180
180
 
181
181
  if (!is_toggle_button && !is_inside_pane && !currently_dragging && !resizing) {
182
182
  close_pane()
@@ -1,3 +1,7 @@
1
+ import type { ComponentProps } from 'svelte';
2
+ import type DraggablePane from './DraggablePane.svelte';
1
3
  export { default as ContextMenu } from './ContextMenu.svelte';
2
4
  export { default as DraggablePane } from './DraggablePane.svelte';
3
5
  export { default as DragControlTab } from './DragControlTab.svelte';
6
+ export type PaneToggleProps = ComponentProps<typeof DraggablePane>[`toggle_props`];
7
+ export type PaneProps = ComponentProps<typeof DraggablePane>[`pane_props`];
@@ -1,12 +1,11 @@
1
1
  <script lang="ts">
2
- import { is_color } from '../colors'
2
+ import { get_d3_interpolator, is_color } from '../colors'
3
3
  import type { ChemicalElement, ElementCategory, ElementSymbol } from '../element'
4
4
  import { element_data, ElementPhoto, ElementTile } from '../element'
5
5
  import { ELEM_SYMBOLS } from '../labels'
6
6
  import type { Point2D, Vec2 } from '../math'
7
7
  import { ColorBar } from '../plot'
8
8
  import { colors } from '../state.svelte'
9
- import * as d3_sc from 'd3-scale-chromatic'
10
9
  import type { ComponentProps, Snippet } from 'svelte'
11
10
  import type { HTMLAttributes } from 'svelte/elements'
12
11
  import type { D3InterpolateName } from '../colors'
@@ -30,7 +29,7 @@
30
29
  active_elements = $bindable([]),
31
30
  gap = `0.3cqw`,
32
31
  inner_transition_metal_offset = 0.5,
33
- lanth_act_tiles = tile_props?.show_symbol == false
32
+ lanth_act_tiles = tile_props?.show_symbol === false
34
33
  ? []
35
34
  : [...default_f_block_inset_tiles],
36
35
  lanth_act_style = ``,
@@ -115,8 +114,8 @@
115
114
  `each element possibly omitting elements at the end, got ${heatmap_values.length}`,
116
115
  )
117
116
  return []
118
- } else return heatmap_values
119
- } else if (typeof heatmap_values == `object`) {
117
+ }return heatmap_values
118
+ } else if (typeof heatmap_values === `object`) {
120
119
  const bad_keys = Object.keys(heatmap_values).filter(
121
120
  (key) => !ELEM_SYMBOLS.includes(key as ElementSymbol),
122
121
  )
@@ -143,7 +142,7 @@
143
142
 
144
143
  function handle_key(event: KeyboardEvent) {
145
144
  if (disabled || !active_element) return
146
- if (event.key == `Enter`) onenter?.(active_element)
145
+ if (event.key === `Enter`) onenter?.(active_element)
147
146
 
148
147
  const arrow_keys = [`ArrowUp`, `ArrowDown`, `ArrowLeft`, `ArrowRight`]
149
148
  if (!arrow_keys.includes(event.key)) return
@@ -186,26 +185,35 @@
186
185
  }
187
186
 
188
187
  let color_scale_fn = $derived(
189
- typeof color_scale == `string` ? d3_sc[color_scale] : color_scale,
188
+ typeof color_scale === `string` ? get_d3_interpolator(color_scale) : color_scale,
190
189
  )
191
190
 
192
191
  let cs_min = $derived(
193
192
  color_scale_range[0] ??
194
- (heat_values.length
193
+ (heat_values.length > 0
195
194
  ? Math.min(
196
- ...heat_values.flat().filter((v): v is number => typeof v === `number`),
195
+ ...heat_values.flat().filter((val): val is number => typeof val === `number`),
197
196
  )
198
197
  : 0),
199
198
  )
200
199
  let cs_max = $derived(
201
200
  color_scale_range[1] ??
202
- (heat_values.length
201
+ (heat_values.length > 0
203
202
  ? Math.max(
204
- ...heat_values.flat().filter((v): v is number => typeof v === `number`),
203
+ ...heat_values.flat().filter((val): val is number => typeof val === `number`),
205
204
  )
206
205
  : 1),
207
206
  )
208
207
 
208
+ // smallest positive bound for log color mapping (matches the auto ColorBar's log scale)
209
+ let cs_min_pos = $derived.by(() => {
210
+ if (cs_min > 0) return cs_min
211
+ const pos = heat_values.flat().filter((val): val is number =>
212
+ typeof val === `number` && val > 0
213
+ )
214
+ return pos.length > 0 ? Math.min(...pos) : cs_max
215
+ })
216
+
209
217
  let bg_color = $derived(
210
218
  (
211
219
  value: number | number[] | string | string[] | false,
@@ -217,7 +225,7 @@
217
225
  }
218
226
 
219
227
  // If it's already a color string, return it directly
220
- if (is_color(value)) return value as string
228
+ if (is_color(value)) return value
221
229
 
222
230
  // Return missing color for zero/invalid values or when no heatmap data
223
231
  if (
@@ -238,8 +246,12 @@
238
246
  const span = cs_max - cs_min
239
247
  if (span === 0) return color_scale_fn?.(0.5) // midpoint when all values equal
240
248
 
241
- if (log) value = Math.log((value as number) - cs_min + 1) / Math.log(span + 1)
242
- else value = ((value as number) - cs_min) / span
249
+ if (log) {
250
+ // log mapping matching the log ColorBar (value <= 0 returned missing_color above)
251
+ const log_span = Math.log(cs_max) - Math.log(cs_min_pos)
252
+ if (log_span === 0) return color_scale_fn?.(0.5)
253
+ value = (Math.log(value as number) - Math.log(cs_min_pos)) / log_span
254
+ } else value = ((value as number) - cs_min) / span
243
255
  return color_scale_fn?.(value as number)
244
256
  },
245
257
  )
@@ -253,7 +265,7 @@
253
265
 
254
266
  return value.map((val) => {
255
267
  // If it's already a color string, return it directly
256
- if (is_color(val)) return val as string
268
+ if (is_color(val)) return val
257
269
  // Otherwise, map it through the color scale
258
270
  return bg_color(val as number, element)
259
271
  })
@@ -29,6 +29,7 @@
29
29
  {options}
30
30
  {selected}
31
31
  maxSelect={1}
32
+ maxOptions={options.length}
32
33
  {minSelect}
33
34
  bind:value
34
35
  placeholder="Select a heatmap"
@@ -8,7 +8,8 @@
8
8
  import { sanitize_svg } from '../sanitize'
9
9
  import { compute_bounding_box_2d, polygon_centroid, type Vec2 } from '../math'
10
10
  import type { AxisConfig } from '../plot'
11
- import { constrain_tooltip_position } from '../plot/layout'
11
+ import { constrain_tooltip_position } from '../plot/core/layout'
12
+ import { unique_id } from '../plot/core/utils'
12
13
  import { scaleLinear } from 'd3-scale'
13
14
  import type { ComponentProps, Snippet } from 'svelte'
14
15
  import type { HTMLAttributes } from 'svelte/elements'
@@ -124,6 +125,11 @@
124
125
  const pane_icon_style = `width: 14px; height: 14px`
125
126
  const pane_toggle_props = { style: `padding: 0` }
126
127
 
128
+ // Instance-unique prefix for gradient ids: region ids come from user data (e.g.
129
+ // 'liquid'), so two diagrams on one page would otherwise cross-reference each
130
+ // other's gradients (first-in-document wins, with that instance's pixel coords)
131
+ const gradient_uid = unique_id(`pd-gradient`)
132
+
127
133
  // Rebuild diagram data when diagram_input changes ($derived auto-recomputes)
128
134
  const rebuilt_data = $derived.by(() => {
129
135
  if (!diagram_input) return null
@@ -619,7 +625,7 @@
619
625
  {#each transformed_regions as region (region.id)}
620
626
  {#if region.gradient}
621
627
  <linearGradient
622
- id="gradient-{region.id}"
628
+ id="{gradient_uid}-{region.id}"
623
629
  x1={region.x_min}
624
630
  x2={region.x_max}
625
631
  y1="0"
@@ -661,7 +667,7 @@
661
667
  <path
662
668
  d={region.svg_path}
663
669
  fill={region.gradient
664
- ? `url(#gradient-${region.id})`
670
+ ? `url(#${gradient_uid}-${region.id})`
665
671
  : (region.color || get_phase_color(region.name))}
666
672
  stroke="none"
667
673
  class:hovered={hovered_region?.id === region.id}
@@ -39,6 +39,6 @@ type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
39
39
  }
40
40
  ]>;
41
41
  };
42
- declare const IsobaricBinaryPhaseDiagram: import("svelte").Component<$$ComponentProps, {}, "x_axis" | "y_axis" | "fullscreen" | "controls_open" | "wrapper" | "show_grid" | "config" | "show_boundaries" | "show_labels" | "show_special_points" | "show_component_labels" | "png_dpi" | "export_pane_open" | "lever_rule_mode" | "editor_open" | "diagram_input" | "hovered_region" | "display_temp_unit">;
42
+ declare const IsobaricBinaryPhaseDiagram: import("svelte").Component<$$ComponentProps, {}, "show_labels" | "y_axis" | "fullscreen" | "wrapper" | "controls_open" | "x_axis" | "export_pane_open" | "png_dpi" | "config" | "show_grid" | "show_boundaries" | "show_special_points" | "show_component_labels" | "lever_rule_mode" | "editor_open" | "diagram_input" | "hovered_region" | "display_temp_unit">;
43
43
  type IsobaricBinaryPhaseDiagram = ReturnType<typeof IsobaricBinaryPhaseDiagram>;
44
44
  export default IsobaricBinaryPhaseDiagram;
@@ -1,4 +1,5 @@
1
1
  <script lang="ts">
2
+ import type { PaneProps, PaneToggleProps } from '../overlays'
2
3
  // NOTE: Axis config objects must be reassigned (not mutated) to trigger $bindable reactivity.
3
4
  import { css_color_to_hex } from '../colors'
4
5
  import { format_num } from '../labels'
@@ -58,8 +59,8 @@
58
59
  enable_export?: boolean
59
60
  png_dpi?: number
60
61
  // Pane customization
61
- pane_props?: ComponentProps<typeof DraggablePane>[`pane_props`]
62
- toggle_props?: ComponentProps<typeof DraggablePane>[`toggle_props`]
62
+ pane_props?: PaneProps
63
+ toggle_props?: PaneToggleProps
63
64
  // Custom content snippets
64
65
  children?: Snippet<[{ controls_open: boolean }]>
65
66
  post_children?: Snippet<[{ controls_open: boolean }]>
@@ -1,3 +1,4 @@
1
+ import type { PaneProps, PaneToggleProps } from '../overlays';
1
2
  import DraggablePane from '../overlays/DraggablePane.svelte';
2
3
  import type { AxisConfig } from '../plot';
3
4
  import type { ComponentProps, Snippet } from 'svelte';
@@ -16,8 +17,8 @@ type $$ComponentProps = Omit<ComponentProps<typeof DraggablePane>, `children`> &
16
17
  data?: PhaseDiagramData;
17
18
  enable_export?: boolean;
18
19
  png_dpi?: number;
19
- pane_props?: ComponentProps<typeof DraggablePane>[`pane_props`];
20
- toggle_props?: ComponentProps<typeof DraggablePane>[`toggle_props`];
20
+ pane_props?: PaneProps;
21
+ toggle_props?: PaneToggleProps;
21
22
  children?: Snippet<[{
22
23
  controls_open: boolean;
23
24
  }]>;
@@ -25,6 +26,6 @@ type $$ComponentProps = Omit<ComponentProps<typeof DraggablePane>, `children`> &
25
26
  controls_open: boolean;
26
27
  }]>;
27
28
  };
28
- declare const PhaseDiagramControls: import("svelte").Component<$$ComponentProps, {}, "x_axis" | "y_axis" | "controls_open" | "show_grid" | "config" | "show_boundaries" | "show_labels" | "show_special_points" | "show_component_labels" | "png_dpi" | "lever_rule_mode">;
29
+ declare const PhaseDiagramControls: import("svelte").Component<$$ComponentProps, {}, "show_labels" | "y_axis" | "controls_open" | "x_axis" | "png_dpi" | "config" | "show_grid" | "show_boundaries" | "show_special_points" | "show_component_labels" | "lever_rule_mode">;
29
30
  type PhaseDiagramControls = ReturnType<typeof PhaseDiagramControls>;
30
31
  export default PhaseDiagramControls;
@@ -1,4 +1,5 @@
1
1
  <script lang="ts">
2
+ import type { PaneToggleProps } from '../overlays'
2
3
  import { JsonTree } from '../layout/json-tree'
3
4
  import { set_at_path } from '../layout/json-tree/utils'
4
5
  import DraggablePane from '../overlays/DraggablePane.svelte'
@@ -6,6 +7,7 @@
6
7
  import { build_diagram } from './build-diagram'
7
8
  import type { DiagramInput } from './diagram-input'
8
9
  import type { PhaseDiagramData } from './types'
10
+ import { to_error } from '../utils'
9
11
 
10
12
  let {
11
13
  editor_open = $bindable(false),
@@ -20,7 +22,7 @@
20
22
  data?: PhaseDiagramData | null
21
23
  ondata?: (data: PhaseDiagramData) => void
22
24
  icon_style?: string
23
- toggle_props?: ComponentProps<typeof DraggablePane>[`toggle_props`]
25
+ toggle_props?: PaneToggleProps
24
26
  } = $props()
25
27
 
26
28
  // The source object currently displayed (DiagramInput or PhaseDiagramData)
@@ -54,7 +56,7 @@
54
56
  build_diagram(updated as DiagramInput)
55
57
  diagram_input = updated as DiagramInput
56
58
  } catch (error) {
57
- const msg = error instanceof Error ? error.message : String(error)
59
+ const msg = to_error(error).message
58
60
  show_rejection(msg)
59
61
  }
60
62
  return
@@ -1,5 +1,4 @@
1
- import DraggablePane from '../overlays/DraggablePane.svelte';
2
- import type { ComponentProps } from 'svelte';
1
+ import type { PaneToggleProps } from '../overlays';
3
2
  import type { DiagramInput } from './diagram-input';
4
3
  import type { PhaseDiagramData } from './types';
5
4
  type $$ComponentProps = {
@@ -8,7 +7,7 @@ type $$ComponentProps = {
8
7
  data?: PhaseDiagramData | null;
9
8
  ondata?: (data: PhaseDiagramData) => void;
10
9
  icon_style?: string;
11
- toggle_props?: ComponentProps<typeof DraggablePane>[`toggle_props`];
10
+ toggle_props?: PaneToggleProps;
12
11
  };
13
12
  declare const PhaseDiagramEditorPane: import("svelte").Component<$$ComponentProps, {}, "editor_open" | "diagram_input">;
14
13
  type PhaseDiagramEditorPane = ReturnType<typeof PhaseDiagramEditorPane>;