matterviz 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. package/dist/EmptyState.svelte +10 -4
  2. package/dist/FilePicker.svelte +48 -60
  3. package/dist/Icon.svelte +7 -4
  4. package/dist/MillerIndexInput.svelte +2 -2
  5. package/dist/api/optimade.js +10 -7
  6. package/dist/app.css +68 -0
  7. package/dist/brillouin/BrillouinZone.svelte +90 -91
  8. package/dist/brillouin/BrillouinZone.svelte.d.ts +5 -7
  9. package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte +18 -14
  11. package/dist/brillouin/BrillouinZoneInfoPane.svelte +6 -10
  12. package/dist/brillouin/BrillouinZoneScene.svelte +46 -68
  13. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  14. package/dist/brillouin/compute.js +10 -16
  15. package/dist/brillouin/geometry.js +2 -2
  16. package/dist/chempot-diagram/ChemPotDiagram.svelte +48 -50
  17. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +61 -169
  18. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +1 -1
  19. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +559 -755
  20. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +1 -1
  21. package/dist/chempot-diagram/async-compute.svelte.js +13 -14
  22. package/dist/chempot-diagram/color.d.ts +21 -1
  23. package/dist/chempot-diagram/color.js +70 -1
  24. package/dist/chempot-diagram/compute.d.ts +7 -0
  25. package/dist/chempot-diagram/compute.js +85 -26
  26. package/dist/chempot-diagram/controls-state.svelte.js +1 -1
  27. package/dist/chempot-diagram/export.js +1 -6
  28. package/dist/chempot-diagram/temperature.js +9 -10
  29. package/dist/colors/index.d.ts +0 -4
  30. package/dist/colors/index.js +19 -20
  31. package/dist/composition/BarChart.svelte +30 -26
  32. package/dist/composition/BubbleChart.svelte +17 -17
  33. package/dist/composition/Composition.svelte +10 -19
  34. package/dist/composition/Formula.svelte +20 -27
  35. package/dist/composition/FormulaFilter.svelte +115 -184
  36. package/dist/composition/PieChart.svelte +55 -41
  37. package/dist/composition/format.js +7 -9
  38. package/dist/composition/index.d.ts +2 -0
  39. package/dist/composition/index.js +14 -0
  40. package/dist/composition/parse.d.ts +2 -2
  41. package/dist/composition/parse.js +61 -115
  42. package/dist/constants.d.ts +0 -1
  43. package/dist/constants.js +17 -26
  44. package/dist/convex-hull/ConvexHull.svelte +12 -15
  45. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
  46. package/dist/convex-hull/ConvexHull2D.svelte +93 -94
  47. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  48. package/dist/convex-hull/ConvexHull3D.svelte +127 -186
  49. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  50. package/dist/convex-hull/ConvexHull4D.svelte +131 -180
  51. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  52. package/dist/convex-hull/ConvexHullChrome.svelte +36 -40
  53. package/dist/convex-hull/ConvexHullControls.svelte +46 -48
  54. package/dist/convex-hull/ConvexHullStats.svelte +193 -195
  55. package/dist/convex-hull/ConvexHullTooltip.svelte +5 -12
  56. package/dist/convex-hull/GasPressureControls.svelte +5 -12
  57. package/dist/convex-hull/StructurePopup.svelte +18 -22
  58. package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
  59. package/dist/convex-hull/TemperatureSlider.svelte +4 -10
  60. package/dist/convex-hull/canvas-interactions.svelte.js +2 -1
  61. package/dist/convex-hull/gas-thermodynamics.js +21 -53
  62. package/dist/convex-hull/helpers.d.ts +8 -10
  63. package/dist/convex-hull/helpers.js +37 -43
  64. package/dist/convex-hull/hull-state.svelte.d.ts +1 -1
  65. package/dist/convex-hull/thermodynamics.js +37 -44
  66. package/dist/coordination/CoordinationBarPlot.svelte +49 -53
  67. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  68. package/dist/coordination/calc-coordination.d.ts +1 -1
  69. package/dist/coordination/calc-coordination.js +28 -25
  70. package/dist/element/BohrAtom.svelte +5 -9
  71. package/dist/element/ElementHeading.svelte +4 -1
  72. package/dist/element/ElementPhoto.svelte +11 -9
  73. package/dist/element/ElementStats.svelte +12 -10
  74. package/dist/element/ElementTile.svelte +44 -67
  75. package/dist/element/Nucleus.svelte +4 -2
  76. package/dist/element/data.d.ts +3 -2
  77. package/dist/element/data.js +5 -1
  78. package/dist/element/helpers.d.ts +4 -0
  79. package/dist/element/helpers.js +18 -0
  80. package/dist/element/index.d.ts +2 -5
  81. package/dist/element/index.js +4 -19
  82. package/dist/feedback/DragOverlay.svelte +5 -5
  83. package/dist/feedback/DragOverlay.svelte.d.ts +2 -2
  84. package/dist/feedback/StatusMessage.svelte +7 -4
  85. package/dist/fermi-surface/FermiSlice.svelte +21 -18
  86. package/dist/fermi-surface/FermiSurface.svelte +35 -44
  87. package/dist/fermi-surface/FermiSurface.svelte.d.ts +7 -13
  88. package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
  89. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  90. package/dist/fermi-surface/FermiSurfaceScene.svelte +64 -136
  91. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  92. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
  93. package/dist/fermi-surface/compute.js +25 -58
  94. package/dist/fermi-surface/parse.js +54 -88
  95. package/dist/file-viewer/JsonBrowser.svelte +1043 -0
  96. package/dist/file-viewer/JsonBrowser.svelte.d.ts +9 -0
  97. package/dist/file-viewer/PlotPanel.svelte +350 -0
  98. package/dist/file-viewer/PlotPanel.svelte.d.ts +9 -0
  99. package/dist/file-viewer/TrajectoryWithDos.svelte +30 -0
  100. package/dist/file-viewer/TrajectoryWithDos.svelte.d.ts +10 -0
  101. package/dist/file-viewer/detect.d.ts +11 -0
  102. package/dist/file-viewer/detect.js +381 -0
  103. package/dist/file-viewer/eligibility.d.ts +4 -0
  104. package/dist/file-viewer/eligibility.js +53 -0
  105. package/dist/file-viewer/host-protocol.d.ts +50 -0
  106. package/dist/file-viewer/host-transfer.d.ts +25 -0
  107. package/dist/file-viewer/host-transfer.js +42 -0
  108. package/dist/file-viewer/index.d.ts +5 -0
  109. package/dist/file-viewer/index.js +5 -0
  110. package/dist/file-viewer/main.d.ts +44 -0
  111. package/dist/file-viewer/main.js +535 -0
  112. package/dist/file-viewer/parse.d.ts +9 -0
  113. package/dist/file-viewer/parse.js +170 -0
  114. package/dist/file-viewer/plot-utils.d.ts +24 -0
  115. package/dist/file-viewer/plot-utils.js +191 -0
  116. package/dist/file-viewer/types.d.ts +4 -0
  117. package/dist/file-viewer/types.js +5 -0
  118. package/dist/heatmap-matrix/HeatmapMatrix.svelte +153 -219
  119. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +2 -2
  120. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +9 -7
  121. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +1 -1
  122. package/dist/heatmap-matrix/index.d.ts +5 -0
  123. package/dist/icons.d.ts +4 -0
  124. package/dist/icons.js +4 -0
  125. package/dist/index.d.ts +2 -2
  126. package/dist/index.js +1 -1
  127. package/dist/io/ExportPane.svelte +11 -7
  128. package/dist/io/decompress.d.ts +4 -1
  129. package/dist/io/decompress.js +24 -36
  130. package/dist/io/export.d.ts +11 -4
  131. package/dist/io/export.js +75 -19
  132. package/dist/io/fetch.d.ts +0 -3
  133. package/dist/io/fetch.js +0 -11
  134. package/dist/io/file-drop.js +60 -35
  135. package/dist/io/index.d.ts +0 -1
  136. package/dist/io/index.js +2 -9
  137. package/dist/io/is-binary.d.ts +9 -0
  138. package/dist/io/is-binary.js +45 -1
  139. package/dist/io/url-drop.d.ts +2 -0
  140. package/dist/io/url-drop.js +40 -40
  141. package/dist/isosurface/Isosurface.svelte +700 -215
  142. package/dist/isosurface/Isosurface.svelte.d.ts +7 -1
  143. package/dist/isosurface/IsosurfaceControls.svelte +590 -116
  144. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +1 -1
  145. package/dist/isosurface/VolumeSlice.svelte +224 -0
  146. package/dist/isosurface/VolumeSlice.svelte.d.ts +28 -0
  147. package/dist/isosurface/coloring.d.ts +20 -0
  148. package/dist/isosurface/coloring.js +118 -0
  149. package/dist/isosurface/geometry-worker-types.d.ts +38 -0
  150. package/dist/isosurface/geometry.worker.d.ts +1 -0
  151. package/dist/isosurface/geometry.worker.js +59 -0
  152. package/dist/isosurface/grid.d.ts +10 -0
  153. package/dist/isosurface/grid.js +31 -0
  154. package/dist/isosurface/index.d.ts +4 -0
  155. package/dist/isosurface/index.js +4 -0
  156. package/dist/isosurface/parse-vaspwave.d.ts +3 -0
  157. package/dist/isosurface/parse-vaspwave.js +138 -0
  158. package/dist/isosurface/parse.js +6 -6
  159. package/dist/isosurface/profile.d.ts +12 -0
  160. package/dist/isosurface/profile.js +19 -0
  161. package/dist/isosurface/sampling.d.ts +34 -0
  162. package/dist/isosurface/sampling.js +408 -0
  163. package/dist/isosurface/slice-rendering.d.ts +13 -0
  164. package/dist/isosurface/slice-rendering.js +79 -0
  165. package/dist/isosurface/slice.d.ts +22 -2
  166. package/dist/isosurface/slice.js +200 -116
  167. package/dist/isosurface/types.d.ts +24 -1
  168. package/dist/isosurface/types.js +120 -8
  169. package/dist/json-path.d.ts +4 -0
  170. package/dist/json-path.js +89 -0
  171. package/dist/labels.d.ts +6 -2
  172. package/dist/labels.js +44 -14
  173. package/dist/layout/FullscreenButton.svelte +2 -1
  174. package/dist/layout/FullscreenToggle.svelte +10 -4
  175. package/dist/layout/InfoCard.svelte +8 -21
  176. package/dist/layout/InfoTag.svelte +1 -3
  177. package/dist/layout/NumberRangeInput.svelte +46 -0
  178. package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
  179. package/dist/layout/PropertyFilter.svelte +2 -6
  180. package/dist/layout/SettingsSection.svelte +57 -62
  181. package/dist/layout/SettingsSection.svelte.d.ts +6 -7
  182. package/dist/layout/SubpageGrid.svelte +3 -1
  183. package/dist/layout/ViewerChrome.svelte +16 -11
  184. package/dist/layout/ViewerChrome.svelte.d.ts +2 -1
  185. package/dist/layout/fullscreen.js +3 -5
  186. package/dist/layout/fullscreen.svelte.js +1 -2
  187. package/dist/layout/index.d.ts +1 -0
  188. package/dist/layout/index.js +1 -0
  189. package/dist/layout/json-tree/JsonNode.svelte +22 -59
  190. package/dist/layout/json-tree/JsonTree.svelte +101 -172
  191. package/dist/layout/json-tree/JsonValue.svelte +9 -32
  192. package/dist/layout/json-tree/utils.d.ts +0 -3
  193. package/dist/layout/json-tree/utils.js +50 -188
  194. package/dist/marching-cubes.d.ts +8 -1
  195. package/dist/marching-cubes.js +115 -48
  196. package/dist/math.d.ts +5 -2
  197. package/dist/math.js +48 -38
  198. package/dist/overlays/ContextMenu.svelte +19 -34
  199. package/dist/overlays/CopyButton.svelte +11 -5
  200. package/dist/overlays/DragControlTab.svelte +6 -1
  201. package/dist/overlays/DraggablePane.svelte +110 -74
  202. package/dist/overlays/DraggablePane.svelte.d.ts +2 -1
  203. package/dist/overlays/GlassChip.svelte +32 -0
  204. package/dist/overlays/GlassChip.svelte.d.ts +8 -0
  205. package/dist/overlays/InfoPaneCards.svelte +11 -23
  206. package/dist/overlays/index.d.ts +7 -0
  207. package/dist/overlays/index.js +26 -0
  208. package/dist/overlays/portal.d.ts +2 -0
  209. package/dist/overlays/portal.js +14 -0
  210. package/dist/periodic-table/PeriodicTable.svelte +113 -145
  211. package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
  212. package/dist/periodic-table/PeriodicTableControls.svelte +37 -115
  213. package/dist/periodic-table/TableInset.svelte +9 -4
  214. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +68 -105
  215. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
  216. package/dist/phase-diagram/PhaseDiagramControls.svelte +70 -94
  217. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
  218. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +2 -1
  219. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +12 -12
  220. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
  221. package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
  222. package/dist/phase-diagram/build-diagram.js +4 -9
  223. package/dist/phase-diagram/diagram-input.d.ts +1 -2
  224. package/dist/phase-diagram/parse.js +15 -15
  225. package/dist/phase-diagram/svg-to-diagram.js +28 -27
  226. package/dist/phase-diagram/utils.js +2 -3
  227. package/dist/plot/bar/BarPlot.svelte +461 -426
  228. package/dist/plot/bar/BarPlot.svelte.d.ts +2 -0
  229. package/dist/plot/bar/BarPlotControls.svelte +1 -3
  230. package/dist/plot/bar/BarPlotControls.svelte.d.ts +4 -6
  231. package/dist/plot/bar/SpacegroupBarPlot.svelte +46 -77
  232. package/dist/plot/bar/data.d.ts +5 -4
  233. package/dist/plot/bar/data.js +2 -1
  234. package/dist/plot/box/BoxPlot.svelte +322 -226
  235. package/dist/plot/box/BoxPlot.svelte.d.ts +2 -0
  236. package/dist/plot/box/Violin.svelte.d.ts +1 -0
  237. package/dist/plot/box/box-plot.js +1 -1
  238. package/dist/plot/core/auto-place.d.ts +1 -1
  239. package/dist/plot/core/auto-place.js +2 -2
  240. package/dist/plot/core/axis-utils.d.ts +12 -7
  241. package/dist/plot/core/axis-utils.js +48 -48
  242. package/dist/plot/core/components/AxisLabel.svelte +82 -20
  243. package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
  244. package/dist/plot/core/components/ColorBar.svelte +101 -106
  245. package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
  246. package/dist/plot/core/components/FillArea.svelte +10 -17
  247. package/dist/plot/core/components/HierarchyControls.svelte +249 -0
  248. package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
  249. package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
  250. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
  251. package/dist/plot/core/components/Line.svelte +18 -9
  252. package/dist/plot/core/components/Line.svelte.d.ts +2 -0
  253. package/dist/plot/core/components/PlotAxis.svelte +40 -17
  254. package/dist/plot/core/components/PlotControls.svelte +65 -41
  255. package/dist/plot/core/components/PlotLegend.svelte +31 -35
  256. package/dist/plot/core/components/PlotMarginals.svelte +616 -0
  257. package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
  258. package/dist/plot/core/components/PlotTooltip.svelte +1 -1
  259. package/dist/plot/core/components/PortalSelect.svelte +4 -8
  260. package/dist/plot/core/components/ReferenceLine.svelte +27 -24
  261. package/dist/plot/core/components/ReferenceLine3D.svelte +54 -57
  262. package/dist/plot/core/components/ReferencePlane.svelte +7 -8
  263. package/dist/plot/core/components/ZeroLines.svelte +4 -8
  264. package/dist/plot/core/components/ZoomRect.svelte +1 -2
  265. package/dist/plot/core/components/index.d.ts +1 -0
  266. package/dist/plot/core/components/index.js +1 -0
  267. package/dist/plot/core/data-cleaning-signal.d.ts +46 -0
  268. package/dist/plot/core/data-cleaning-signal.js +467 -0
  269. package/dist/plot/core/data-cleaning.d.ts +2 -42
  270. package/dist/plot/core/data-cleaning.js +27 -474
  271. package/dist/plot/core/data-transform.d.ts +1 -2
  272. package/dist/plot/core/data-transform.js +9 -15
  273. package/dist/plot/core/fill-utils.d.ts +3 -1
  274. package/dist/plot/core/fill-utils.js +28 -6
  275. package/dist/plot/core/index.d.ts +1 -0
  276. package/dist/plot/core/index.js +1 -0
  277. package/dist/plot/core/interactions.js +0 -2
  278. package/dist/plot/core/layout.d.ts +15 -6
  279. package/dist/plot/core/layout.js +57 -38
  280. package/dist/plot/core/marginals.d.ts +170 -0
  281. package/dist/plot/core/marginals.js +436 -0
  282. package/dist/plot/core/pan-zoom.svelte.d.ts +2 -4
  283. package/dist/plot/core/pan-zoom.svelte.js +34 -17
  284. package/dist/plot/core/placed-tween.svelte.d.ts +3 -0
  285. package/dist/plot/core/placed-tween.svelte.js +68 -21
  286. package/dist/plot/core/reference-line.js +1 -1
  287. package/dist/plot/core/scales.d.ts +23 -0
  288. package/dist/plot/core/scales.js +39 -13
  289. package/dist/plot/core/svg.js +0 -1
  290. package/dist/plot/core/types/fills.d.ts +101 -0
  291. package/dist/plot/core/types/fills.js +15 -0
  292. package/dist/plot/core/types/plot-3d.d.ts +87 -0
  293. package/dist/plot/core/types/plot-3d.js +4 -0
  294. package/dist/plot/core/types/reference-lines.d.ts +140 -0
  295. package/dist/plot/core/types/reference-lines.js +9 -0
  296. package/dist/plot/core/types.d.ts +29 -324
  297. package/dist/plot/core/types.js +23 -20
  298. package/dist/plot/core/utils/hierarchy-chart.d.ts +52 -0
  299. package/dist/plot/core/utils/hierarchy-chart.js +191 -0
  300. package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
  301. package/dist/plot/core/utils/hierarchy-labels.js +100 -0
  302. package/dist/plot/core/utils/label-placement.js +2 -2
  303. package/dist/plot/histogram/Histogram.svelte +314 -340
  304. package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
  305. package/dist/plot/histogram/HistogramControls.svelte +30 -28
  306. package/dist/plot/histogram/histogram.d.ts +31 -0
  307. package/dist/plot/histogram/histogram.js +70 -0
  308. package/dist/plot/histogram/index.d.ts +1 -0
  309. package/dist/plot/histogram/index.js +1 -0
  310. package/dist/plot/index.d.ts +1 -0
  311. package/dist/plot/index.js +1 -0
  312. package/dist/plot/sankey/Sankey.svelte +78 -69
  313. package/dist/plot/sankey/Sankey.svelte.d.ts +2 -2
  314. package/dist/plot/sankey/SankeyControls.svelte +22 -16
  315. package/dist/plot/sankey/sankey.js +13 -9
  316. package/dist/plot/scatter/BinnedScatterPlot.svelte +311 -141
  317. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +7 -0
  318. package/dist/plot/scatter/ElementScatter.svelte +4 -1
  319. package/dist/plot/scatter/ScatterPlot.svelte +517 -410
  320. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +2 -0
  321. package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
  322. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  323. package/dist/plot/scatter/ScatterPoint.svelte +16 -9
  324. package/dist/plot/scatter/adaptive-density.d.ts +1 -1
  325. package/dist/plot/scatter/adaptive-density.js +36 -20
  326. package/dist/plot/scatter/binned-scatter-types.d.ts +3 -2
  327. package/dist/plot/scatter/binned-scatter-types.js +6 -1
  328. package/dist/plot/scatter/scatter-data.d.ts +1 -1
  329. package/dist/plot/scatter/scatter-data.js +8 -7
  330. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +25 -34
  331. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +2 -2
  332. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +8 -5
  333. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +113 -116
  334. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +2 -2
  335. package/dist/plot/scatter-3d/Surface3D.svelte +4 -13
  336. package/dist/plot/sunburst/Sunburst.svelte +269 -347
  337. package/dist/plot/sunburst/Sunburst.svelte.d.ts +2 -2
  338. package/dist/plot/sunburst/index.d.ts +1 -1
  339. package/dist/plot/sunburst/index.js +2 -1
  340. package/dist/plot/sunburst/render.d.ts +2 -2
  341. package/dist/plot/sunburst/render.js +47 -22
  342. package/dist/plot/sunburst/sunburst.d.ts +5 -1
  343. package/dist/plot/sunburst/sunburst.js +10 -3
  344. package/dist/plot/treemap/Treemap.svelte +1022 -0
  345. package/dist/plot/treemap/Treemap.svelte.d.ts +90 -0
  346. package/dist/plot/treemap/index.d.ts +4 -0
  347. package/dist/plot/treemap/index.js +4 -0
  348. package/dist/plot/treemap/labels.d.ts +38 -0
  349. package/dist/plot/treemap/labels.js +80 -0
  350. package/dist/plot/treemap/treemap.d.ts +28 -0
  351. package/dist/plot/treemap/treemap.js +102 -0
  352. package/dist/rdf/RdfPlot.svelte +37 -59
  353. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  354. package/dist/rdf/calc-rdf.js +63 -52
  355. package/dist/rdf/index.d.ts +0 -1
  356. package/dist/sanitize.js +85 -27
  357. package/dist/scene/SceneCamera.svelte +1 -1
  358. package/dist/scene/SceneCamera.svelte.d.ts +1 -1
  359. package/dist/scene/bind-renderer.svelte.js +14 -6
  360. package/dist/scene/index.d.ts +1 -2
  361. package/dist/scene/index.js +1 -1
  362. package/dist/scene/{props.js → props.svelte.js} +15 -1
  363. package/dist/settings.d.ts +19 -9
  364. package/dist/settings.js +229 -525
  365. package/dist/spectral/Bands.svelte +207 -221
  366. package/dist/spectral/BandsAndDos.svelte +11 -9
  367. package/dist/spectral/BrillouinBandsDos.svelte +19 -42
  368. package/dist/spectral/Dos.svelte +92 -93
  369. package/dist/spectral/helpers.d.ts +3 -3
  370. package/dist/spectral/helpers.js +65 -140
  371. package/dist/state.svelte.js +5 -18
  372. package/dist/structure/Arrow.svelte +5 -18
  373. package/dist/structure/ArrowInstances.svelte +160 -0
  374. package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
  375. package/dist/structure/AtomLegend.svelte +120 -85
  376. package/dist/structure/AtomLegend.svelte.d.ts +2 -3
  377. package/dist/structure/Bond.svelte +31 -23
  378. package/dist/structure/CanvasTooltip.svelte +15 -3
  379. package/dist/structure/CellSelect.svelte +45 -35
  380. package/dist/structure/Cylinder.svelte +24 -40
  381. package/dist/structure/InstancedAtoms.svelte +114 -0
  382. package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
  383. package/dist/structure/Lattice.svelte +85 -149
  384. package/dist/structure/SiteLabels.svelte +122 -0
  385. package/dist/structure/SiteLabels.svelte.d.ts +18 -0
  386. package/dist/structure/Structure.svelte +636 -504
  387. package/dist/structure/Structure.svelte.d.ts +4 -2
  388. package/dist/structure/StructureCarousel.svelte +637 -0
  389. package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
  390. package/dist/structure/StructureControls.svelte +165 -425
  391. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  392. package/dist/structure/StructureExportPane.svelte +17 -21
  393. package/dist/structure/StructureInfoPane.svelte +128 -133
  394. package/dist/structure/StructureInfoPane.svelte.d.ts +1 -1
  395. package/dist/structure/StructureScene.svelte +535 -578
  396. package/dist/structure/StructureScene.svelte.d.ts +6 -2
  397. package/dist/structure/StructureViewport.svelte +451 -0
  398. package/dist/structure/StructureViewport.svelte.d.ts +65 -0
  399. package/dist/structure/atom-label-placement.d.ts +16 -12
  400. package/dist/structure/atom-label-placement.js +70 -37
  401. package/dist/structure/atom-properties.d.ts +2 -0
  402. package/dist/structure/atom-properties.js +105 -38
  403. package/dist/structure/bond-order-perception.js +3 -8
  404. package/dist/structure/bonding.d.ts +9 -3
  405. package/dist/structure/bonding.js +95 -46
  406. package/dist/structure/edit-history.d.ts +6 -0
  407. package/dist/structure/edit-history.js +27 -0
  408. package/dist/structure/export.d.ts +1 -0
  409. package/dist/structure/export.js +89 -105
  410. package/dist/structure/format-detect.d.ts +1 -0
  411. package/dist/structure/format-detect.js +20 -0
  412. package/dist/structure/geometry.d.ts +9 -0
  413. package/dist/structure/geometry.js +27 -0
  414. package/dist/structure/index.d.ts +16 -1
  415. package/dist/structure/index.js +15 -10
  416. package/dist/structure/measure.d.ts +1 -1
  417. package/dist/structure/measure.js +6 -12
  418. package/dist/structure/parse.d.ts +2 -1
  419. package/dist/structure/parse.js +272 -313
  420. package/dist/structure/partial-occupancy.js +10 -5
  421. package/dist/structure/pbc.js +85 -107
  422. package/dist/structure/polyhedra.d.ts +0 -1
  423. package/dist/structure/polyhedra.js +7 -21
  424. package/dist/structure/prop-groups.d.ts +85 -0
  425. package/dist/structure/prop-groups.js +18 -0
  426. package/dist/structure/supercell.d.ts +1 -2
  427. package/dist/structure/supercell.js +7 -13
  428. package/dist/symmetry/SymmetryElements.svelte +11 -15
  429. package/dist/symmetry/SymmetryStats.svelte +55 -71
  430. package/dist/symmetry/WyckoffTable.svelte +10 -28
  431. package/dist/symmetry/cell-transform.js +6 -14
  432. package/dist/symmetry/index.d.ts +1 -0
  433. package/dist/symmetry/index.js +13 -10
  434. package/dist/symmetry/spacegroups.js +3 -2
  435. package/dist/table/HeatmapTable.svelte +1142 -447
  436. package/dist/table/HeatmapTable.svelte.d.ts +12 -2
  437. package/dist/table/ToggleMenu.svelte +168 -53
  438. package/dist/table/ToggleMenu.svelte.d.ts +1 -1
  439. package/dist/table/index.d.ts +21 -6
  440. package/dist/table/index.js +34 -21
  441. package/dist/theme/ThemeControl.svelte +16 -8
  442. package/dist/theme/embedded.d.ts +18 -0
  443. package/dist/theme/embedded.js +206 -0
  444. package/dist/theme/index.d.ts +5 -5
  445. package/dist/theme/index.js +5 -12
  446. package/dist/theme/themes.mjs +44 -66
  447. package/dist/tooltip/KCoords.svelte +4 -1
  448. package/dist/tooltip/TooltipContent.svelte +3 -6
  449. package/dist/tooltip/TooltipContent.svelte.d.ts +1 -1
  450. package/dist/tooltip/index.d.ts +8 -1
  451. package/dist/trajectory/Trajectory.svelte +613 -386
  452. package/dist/trajectory/Trajectory.svelte.d.ts +1 -1
  453. package/dist/trajectory/TrajectoryError.svelte +12 -74
  454. package/dist/trajectory/TrajectoryExportPane.svelte +14 -32
  455. package/dist/trajectory/TrajectoryInfoPane.svelte +127 -164
  456. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +2 -1
  457. package/dist/trajectory/extract.js +61 -49
  458. package/dist/trajectory/format-detect.d.ts +2 -0
  459. package/dist/trajectory/format-detect.js +17 -13
  460. package/dist/trajectory/frame-reader.d.ts +2 -0
  461. package/dist/trajectory/frame-reader.js +35 -32
  462. package/dist/trajectory/helpers.d.ts +2 -0
  463. package/dist/trajectory/helpers.js +34 -56
  464. package/dist/trajectory/index.d.ts +1 -0
  465. package/dist/trajectory/index.js +5 -8
  466. package/dist/trajectory/parse/ase.js +1 -1
  467. package/dist/trajectory/parse/h5-utils.d.ts +13 -0
  468. package/dist/trajectory/parse/h5-utils.js +109 -0
  469. package/dist/trajectory/parse/hdf5.d.ts +1 -1
  470. package/dist/trajectory/parse/hdf5.js +116 -106
  471. package/dist/trajectory/parse/index.d.ts +6 -6
  472. package/dist/trajectory/parse/index.js +25 -33
  473. package/dist/trajectory/parse/lammps.js +8 -12
  474. package/dist/trajectory/parse/vasp.js +10 -7
  475. package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
  476. package/dist/trajectory/parse/vaspout-electronic.js +207 -0
  477. package/dist/trajectory/parse/vaspout-h5.d.ts +4 -0
  478. package/dist/trajectory/parse/vaspout-h5.js +281 -0
  479. package/dist/trajectory/parse/xyz.js +59 -9
  480. package/dist/trajectory/plotting.d.ts +8 -9
  481. package/dist/trajectory/plotting.js +113 -64
  482. package/dist/utils.d.ts +3 -0
  483. package/dist/utils.js +7 -0
  484. package/dist/xrd/XrdPlot.svelte +79 -118
  485. package/dist/xrd/broadening.js +2 -1
  486. package/dist/xrd/calc-xrd.js +24 -62
  487. package/dist/xrd/parse.d.ts +0 -1
  488. package/dist/xrd/parse.js +69 -95
  489. package/package.json +94 -34
  490. package/readme.md +6 -5
  491. package/dist/api/mp.d.ts +0 -6
  492. package/dist/api/mp.js +0 -22
  493. package/dist/plot/sunburst/SunburstControls.svelte +0 -200
  494. package/dist/scene/types.d.ts +0 -26
  495. package/dist/tooltip/types.d.ts +0 -8
  496. package/dist/trajectory/constants.d.ts +0 -6
  497. package/dist/trajectory/constants.js +0 -11
  498. /package/dist/{scene/types.js → file-viewer/host-protocol.js} +0 -0
  499. /package/dist/{tooltip/types.js → isosurface/geometry-worker-types.js} +0 -0
@@ -0,0 +1,79 @@
1
+ import { get_d3_interpolator } from '../colors';
2
+ import { rgb } from 'd3-color';
3
+ const SLICE_LUT_SIZE = 256;
4
+ const MAX_CONTOUR_LEVELS = 256;
5
+ const slice_lut_cache = new Map();
6
+ const get_slice_lut = (colormap) => {
7
+ const cached = slice_lut_cache.get(colormap);
8
+ if (cached)
9
+ return cached;
10
+ const interpolator = get_d3_interpolator(colormap);
11
+ const lut = new Uint8ClampedArray(SLICE_LUT_SIZE * 3);
12
+ for (let color_idx = 0; color_idx < SLICE_LUT_SIZE; color_idx++) {
13
+ const color = rgb(interpolator(color_idx / (SLICE_LUT_SIZE - 1)));
14
+ lut[color_idx * 3] = color.r;
15
+ lut[color_idx * 3 + 1] = color.g;
16
+ lut[color_idx * 3 + 2] = color.b;
17
+ }
18
+ slice_lut_cache.set(colormap, lut);
19
+ return lut;
20
+ };
21
+ /** Resolve an explicit or automatic slice color range. */
22
+ export function resolve_slice_color_range(slice, color_range, symmetric = `auto`) {
23
+ if (color_range)
24
+ return [...color_range];
25
+ if (symmetric === true || (symmetric === `auto` && slice.min < 0 && slice.max > 0)) {
26
+ const abs_max = Math.max(Math.abs(slice.min), Math.abs(slice.max));
27
+ return [-abs_max, abs_max];
28
+ }
29
+ return [slice.min, slice.max];
30
+ }
31
+ /** Convert a sampled slice to browser-sRGB RGBA pixels, preserving its exact mask. */
32
+ export function slice_to_rgba(slice, colormap, color_range, { flip_y = true, out } = {}) {
33
+ const pixels = out?.length === slice.data.length * 4 ? out : new Uint8ClampedArray(slice.data.length * 4);
34
+ const lut = get_slice_lut(colormap);
35
+ const [range_min, range_max] = color_range;
36
+ const span = range_max - range_min;
37
+ const inv_span = span === 0 ? 0 : 1 / span;
38
+ for (let row_idx = 0; row_idx < slice.height; row_idx++) {
39
+ const target_row = flip_y ? slice.height - 1 - row_idx : row_idx;
40
+ for (let col_idx = 0; col_idx < slice.width; col_idx++) {
41
+ const source_idx = row_idx * slice.width + col_idx;
42
+ const pixel_idx = (target_row * slice.width + col_idx) * 4;
43
+ if (!slice.mask[source_idx] || !Number.isFinite(slice.data[source_idx])) {
44
+ pixels[pixel_idx] = 0;
45
+ pixels[pixel_idx + 1] = 0;
46
+ pixels[pixel_idx + 2] = 0;
47
+ pixels[pixel_idx + 3] = 0;
48
+ continue;
49
+ }
50
+ const normalized = span === 0
51
+ ? 0.5
52
+ : Math.max(0, Math.min(1, (slice.data[source_idx] - range_min) * inv_span));
53
+ const lut_idx = Math.round(normalized * (SLICE_LUT_SIZE - 1)) * 3;
54
+ pixels[pixel_idx] = lut[lut_idx];
55
+ pixels[pixel_idx + 1] = lut[lut_idx + 1];
56
+ pixels[pixel_idx + 2] = lut[lut_idx + 2];
57
+ pixels[pixel_idx + 3] = 255;
58
+ }
59
+ }
60
+ return pixels;
61
+ }
62
+ /** Resolve a contour count or explicit threshold list against a color range. */
63
+ export function resolve_contour_thresholds(color_range, contour_levels) {
64
+ if (Array.isArray(contour_levels)) {
65
+ // Sort before truncating so the cap keeps the lowest thresholds deterministically
66
+ // regardless of input order
67
+ return contour_levels
68
+ .filter(Number.isFinite)
69
+ .sort((left, right) => left - right)
70
+ .slice(0, MAX_CONTOUR_LEVELS);
71
+ }
72
+ const count = Number.isFinite(contour_levels)
73
+ ? Math.min(MAX_CONTOUR_LEVELS, Math.max(0, Math.floor(contour_levels)))
74
+ : 0;
75
+ const [range_min, range_max] = color_range;
76
+ if (count === 0 || range_min === range_max)
77
+ return [];
78
+ return Array.from({ length: count }, (_, level_idx) => range_min + ((level_idx + 1) / (count + 1)) * (range_max - range_min)).sort((left, right) => left - right);
79
+ }
@@ -1,11 +1,31 @@
1
- import type { Vec3 } from '../math';
1
+ import type { Vec2, Vec3 } from '../math';
2
+ import { type DisplayRange } from './sampling';
2
3
  import type { VolumetricData } from './types';
4
+ export interface CartesianPlane {
5
+ point: Vec3;
6
+ normal: Vec3;
7
+ up?: Vec3;
8
+ }
9
+ export interface PlaneSliceOptions {
10
+ resolution?: number | Vec2;
11
+ max_pixels?: number;
12
+ fractional_bounds?: DisplayRange;
13
+ }
3
14
  export interface SliceResult {
4
15
  data: Float64Array;
16
+ mask: Uint8Array;
5
17
  width: number;
6
18
  height: number;
7
19
  min: number;
8
20
  max: number;
21
+ point: Vec3;
22
+ normal: Vec3;
23
+ u_axis: Vec3;
24
+ v_axis: Vec3;
25
+ u_range: Vec2;
26
+ v_range: Vec2;
27
+ polygon: Vec2[];
9
28
  }
10
- export declare function trilinear_interpolate(grid: number[][][], fx: number, fy: number, fz: number, periodic: boolean): number;
29
+ /** Sample a scalar volume on an arbitrary absolute Cartesian plane. */
30
+ export declare function sample_plane_slice(volume: VolumetricData, plane: CartesianPlane, options?: PlaneSliceOptions): SliceResult | null;
11
31
  export declare function sample_hkl_slice(volume: VolumetricData, miller_indices: Vec3, distance: number, n_points?: number): SliceResult | null;
@@ -2,56 +2,194 @@
2
2
  // crystallographic plane defined by Miller indices, using trilinear interpolation.
3
3
  import { reciprocal_lattice } from '../brillouin';
4
4
  import * as math from '../math';
5
- const safe_mod = (val, dim) => ((val % dim) + dim) % dim;
6
- // Trilinear interpolation of a scalar 3D grid at fractional coordinates.
7
- // Periodic grids wrap with modulo; non-periodic return 0 for out-of-bounds.
8
- export function trilinear_interpolate(grid, fx, fy, fz, periodic) {
9
- const nx = grid.length;
10
- const ny = grid[0]?.length ?? 0;
11
- const nz = grid[0]?.[0]?.length ?? 0;
12
- if (nx === 0 || ny === 0 || nz === 0)
13
- return 0;
14
- // Convert fractional to grid coordinates
15
- const gx = periodic ? fx * nx : fx * (nx - 1);
16
- const gy = periodic ? fy * ny : fy * (ny - 1);
17
- const gz = periodic ? fz * nz : fz * (nz - 1);
18
- if (!periodic) {
19
- // Out-of-bounds check for non-periodic grids
20
- if (fx < 0 || fx > 1 || fy < 0 || fy > 1 || fz < 0 || fz > 1)
21
- return 0;
5
+ import { create_volume_sampler, sanitize_display_range } from './sampling';
6
+ const CELL_EDGES = [
7
+ [0, 1],
8
+ [0, 2],
9
+ [0, 4],
10
+ [1, 3],
11
+ [1, 5],
12
+ [2, 3],
13
+ [2, 6],
14
+ [3, 7],
15
+ [4, 5],
16
+ [4, 6],
17
+ [5, 7],
18
+ [6, 7],
19
+ ];
20
+ const PLANE_TOLERANCE = 1e-9;
21
+ const DEFAULT_MAX_PIXELS = 512 * 512;
22
+ const UNIT_CELL_RANGE = [
23
+ [0, 1],
24
+ [0, 1],
25
+ [0, 1],
26
+ ];
27
+ const cell_corners = (volume, bounds) => {
28
+ const frac_to_cart = math.create_frac_to_cart(volume.lattice);
29
+ return Array.from({ length: 8 }, (_, corner_idx) => math.add(volume.origin, frac_to_cart([
30
+ bounds[0][corner_idx & 1 ? 1 : 0],
31
+ bounds[1][corner_idx & 2 ? 1 : 0],
32
+ bounds[2][corner_idx & 4 ? 1 : 0],
33
+ ])));
34
+ };
35
+ const add_unique_point = (points, point) => {
36
+ if (points.some((existing) => (existing[0] - point[0]) ** 2 +
37
+ (existing[1] - point[1]) ** 2 +
38
+ (existing[2] - point[2]) ** 2 <
39
+ PLANE_TOLERANCE ** 2))
40
+ return;
41
+ points.push(point);
42
+ };
43
+ const plane_basis = (normal, up) => {
44
+ if (!up)
45
+ return math.compute_in_plane_basis(normal);
46
+ const normal_projection = math.dot(up, normal);
47
+ const projected = math.subtract(up, math.scale(normal, normal_projection));
48
+ if (Math.hypot(...projected) < PLANE_TOLERANCE) {
49
+ return math.compute_in_plane_basis(normal);
22
50
  }
23
- const x0 = periodic
24
- ? safe_mod(Math.floor(gx), nx)
25
- : Math.max(0, Math.min(Math.floor(gx), nx - 2));
26
- const y0 = periodic
27
- ? safe_mod(Math.floor(gy), ny)
28
- : Math.max(0, Math.min(Math.floor(gy), ny - 2));
29
- const z0 = periodic
30
- ? safe_mod(Math.floor(gz), nz)
31
- : Math.max(0, Math.min(Math.floor(gz), nz - 2));
32
- const x1 = periodic ? (x0 + 1) % nx : Math.min(x0 + 1, nx - 1);
33
- const y1 = periodic ? (y0 + 1) % ny : Math.min(y0 + 1, ny - 1);
34
- const z1 = periodic ? (z0 + 1) % nz : Math.min(z0 + 1, nz - 1);
35
- // deltas from clamped lower index (non-periodic x0 clamps to nx-2 so floor(gx) may != x0)
36
- const xd = periodic ? gx - Math.floor(gx) : gx - x0;
37
- const yd = periodic ? gy - Math.floor(gy) : gy - y0;
38
- const zd = periodic ? gz - Math.floor(gz) : gz - z0;
39
- // 8-point interpolation
40
- const c000 = grid[x0][y0][z0];
41
- const c001 = grid[x0][y0][z1];
42
- const c010 = grid[x0][y1][z0];
43
- const c011 = grid[x0][y1][z1];
44
- const c100 = grid[x1][y0][z0];
45
- const c101 = grid[x1][y0][z1];
46
- const c110 = grid[x1][y1][z0];
47
- const c111 = grid[x1][y1][z1];
48
- const c00 = c000 + (c100 - c000) * xd;
49
- const c01 = c001 + (c101 - c001) * xd;
50
- const c10 = c010 + (c110 - c010) * xd;
51
- const c11 = c011 + (c111 - c011) * xd;
52
- const c0 = c00 + (c10 - c00) * yd;
53
- const c1 = c01 + (c11 - c01) * yd;
54
- return c0 + (c1 - c0) * zd;
51
+ const u_axis = math.normalize_vec(projected);
52
+ return [u_axis, math.cross_3d(normal, u_axis)];
53
+ };
54
+ const intersect_plane_cell = (corners, point, normal, u_axis, v_axis) => {
55
+ const intersections = [];
56
+ for (const [start_idx, end_idx] of CELL_EDGES) {
57
+ const start = corners[start_idx];
58
+ const end = corners[end_idx];
59
+ const start_distance = math.dot(math.subtract(start, point), normal);
60
+ const end_distance = math.dot(math.subtract(end, point), normal);
61
+ if (Math.abs(start_distance) <= PLANE_TOLERANCE)
62
+ add_unique_point(intersections, start);
63
+ if (Math.abs(end_distance) <= PLANE_TOLERANCE)
64
+ add_unique_point(intersections, end);
65
+ if (start_distance * end_distance >= -(PLANE_TOLERANCE ** 2))
66
+ continue;
67
+ const fraction = start_distance / (start_distance - end_distance);
68
+ add_unique_point(intersections, [
69
+ start[0] + fraction * (end[0] - start[0]),
70
+ start[1] + fraction * (end[1] - start[1]),
71
+ start[2] + fraction * (end[2] - start[2]),
72
+ ]);
73
+ }
74
+ return math.convex_hull_2d(intersections.map((intersection) => {
75
+ const relative = math.subtract(intersection, point);
76
+ return [math.dot(relative, u_axis), math.dot(relative, v_axis)];
77
+ }), PLANE_TOLERANCE);
78
+ };
79
+ const point_in_convex_polygon = (point, polygon) => {
80
+ let orientation = 0;
81
+ for (let point_idx = 0; point_idx < polygon.length; point_idx++) {
82
+ const start = polygon[point_idx];
83
+ const end = polygon[(point_idx + 1) % polygon.length];
84
+ const cross = (end[0] - start[0]) * (point[1] - start[1]) - (end[1] - start[1]) * (point[0] - start[0]);
85
+ if (Math.abs(cross) <= PLANE_TOLERANCE)
86
+ continue;
87
+ const current_orientation = Math.sign(cross);
88
+ if (orientation && current_orientation !== orientation)
89
+ return false;
90
+ orientation = current_orientation;
91
+ }
92
+ return true;
93
+ };
94
+ const resolve_resolution = (resolution, u_span, v_span, max_grid_dim, max_pixels) => {
95
+ let counts;
96
+ if (Array.isArray(resolution)) {
97
+ counts = [Math.max(2, Math.round(resolution[0])), Math.max(2, Math.round(resolution[1]))];
98
+ }
99
+ else {
100
+ const longest_count = Math.max(2, Math.round(resolution ?? max_grid_dim));
101
+ const longest_span = Math.max(u_span, v_span, PLANE_TOLERANCE);
102
+ counts = [
103
+ Math.max(2, Math.round((longest_count * u_span) / longest_span)),
104
+ Math.max(2, Math.round((longest_count * v_span) / longest_span)),
105
+ ];
106
+ }
107
+ const pixel_budget = Number.isFinite(max_pixels)
108
+ ? Math.max(4, Math.floor(max_pixels))
109
+ : DEFAULT_MAX_PIXELS;
110
+ const shrink = Math.min(1, Math.sqrt(pixel_budget / (counts[0] * counts[1])));
111
+ if (shrink >= 1)
112
+ return counts;
113
+ counts = counts.map((count) => Math.max(2, Math.floor(count * shrink)));
114
+ if (counts[0] * counts[1] > pixel_budget) {
115
+ const axis = counts[0] >= counts[1] ? 0 : 1;
116
+ counts[axis] = Math.max(2, Math.floor(pixel_budget / counts[axis === 0 ? 1 : 0]));
117
+ }
118
+ return counts;
119
+ };
120
+ /** Sample a scalar volume on an arbitrary absolute Cartesian plane. */
121
+ export function sample_plane_slice(volume, plane, options = {}) {
122
+ if (!plane.point.every(Number.isFinite) || !plane.normal.every(Number.isFinite))
123
+ return null;
124
+ if (plane.up && !plane.up.every(Number.isFinite))
125
+ return null;
126
+ if (Math.hypot(...plane.normal) < PLANE_TOLERANCE)
127
+ return null; // degenerate normal
128
+ const normal = math.normalize_vec(plane.normal);
129
+ // In-plane basis vectors
130
+ const [u_axis, v_axis] = plane_basis(normal, plane.up);
131
+ const bounds = sanitize_display_range(options.fractional_bounds ?? UNIT_CELL_RANGE, volume.periodic);
132
+ const corners = cell_corners(volume, bounds);
133
+ const polygon = intersect_plane_cell(corners, plane.point, normal, u_axis, v_axis);
134
+ if (polygon.length < 3)
135
+ return null;
136
+ // Project all 8 unit cell corners onto the (u, v) plane to find sampling bounds.
137
+ // Corners are at fractional coords (0 or 1) for each axis.
138
+ const { min, max, width: u_span, height: v_span } = math.compute_bounding_box_2d(polygon);
139
+ const u_range = [min[0], max[0]];
140
+ const v_range = [min[1], max[1]];
141
+ if (u_span <= PLANE_TOLERANCE || v_span <= PLANE_TOLERANCE)
142
+ return null;
143
+ // Sampling resolution: caller-specified or default to max grid dimension
144
+ const [width, height] = resolve_resolution(options.resolution, u_span, v_span, Math.max(...volume.grid_dims), options.max_pixels ?? DEFAULT_MAX_PIXELS);
145
+ const data = new Float64Array(width * height);
146
+ data.fill(Number.NaN);
147
+ const mask = new Uint8Array(width * height);
148
+ let data_min = Infinity;
149
+ let data_max = -Infinity;
150
+ const sample = create_volume_sampler(volume, {
151
+ out_of_bounds: volume.periodic ? `clamp` : `fallback`,
152
+ });
153
+ const u_step = u_span / (width - 1);
154
+ const v_step = v_span / (height - 1);
155
+ const cartesian = [0, 0, 0];
156
+ for (let row = 0; row < height; row++) {
157
+ const v_value = v_range[0] + row * v_step;
158
+ for (let col = 0; col < width; col++) {
159
+ const u_value = u_range[0] + col * u_step;
160
+ if (!point_in_convex_polygon([u_value, v_value], polygon))
161
+ continue;
162
+ const data_idx = row * width + col;
163
+ mask[data_idx] = 1;
164
+ // Cartesian position on the plane
165
+ cartesian[0] = plane.point[0] + u_value * u_axis[0] + v_value * v_axis[0];
166
+ cartesian[1] = plane.point[1] + u_value * u_axis[1] + v_value * v_axis[1];
167
+ cartesian[2] = plane.point[2] + u_value * u_axis[2] + v_value * v_axis[2];
168
+ const value = sample(cartesian);
169
+ if (!Number.isFinite(value))
170
+ continue;
171
+ data[data_idx] = value;
172
+ if (value < data_min)
173
+ data_min = value;
174
+ if (value > data_max)
175
+ data_max = value;
176
+ }
177
+ }
178
+ return {
179
+ data,
180
+ mask,
181
+ width,
182
+ height,
183
+ min: data_min === Infinity ? 0 : data_min,
184
+ max: data_max === -Infinity ? 0 : data_max,
185
+ point: [...plane.point],
186
+ normal,
187
+ u_axis,
188
+ v_axis,
189
+ u_range,
190
+ v_range,
191
+ polygon,
192
+ };
55
193
  }
56
194
  // Sample a 2D slice through volumetric data along a Miller-index plane.
57
195
  // `miller_indices` [h,k,l] defines the plane normal in reciprocal space.
@@ -61,81 +199,27 @@ export function sample_hkl_slice(volume, miller_indices, distance, n_points) {
61
199
  const [h_idx, k_idx, l_idx] = miller_indices;
62
200
  if (h_idx === 0 && k_idx === 0 && l_idx === 0)
63
201
  return null;
64
- const { grid, grid_dims, lattice, periodic } = volume;
65
- const [nx, ny, nz] = grid_dims;
66
202
  // Plane normal G = h*b1 + k*b2 + l*b3 where b_i are reciprocal lattice rows
67
- const recip = reciprocal_lattice(lattice);
203
+ const recip = reciprocal_lattice(volume.lattice);
68
204
  const plane_normal = [
69
205
  h_idx * recip[0][0] + k_idx * recip[1][0] + l_idx * recip[2][0],
70
206
  h_idx * recip[0][1] + k_idx * recip[1][1] + l_idx * recip[2][1],
71
207
  h_idx * recip[0][2] + k_idx * recip[1][2] + l_idx * recip[2][2],
72
208
  ];
73
- if (Math.hypot(...plane_normal) < 1e-12)
209
+ if (Math.hypot(...plane_normal) < PLANE_TOLERANCE)
74
210
  return null; // degenerate normal
75
211
  const unit_normal = math.normalize_vec(plane_normal);
76
- // In-plane basis vectors
77
- const [u_vec, v_vec] = math.compute_in_plane_basis(unit_normal);
78
- const cart_to_frac = math.create_cart_to_frac(lattice);
79
- // Project all 8 unit cell corners onto the (u, v) plane to find sampling bounds.
80
- // Corners are at fractional coords (0 or 1) for each axis.
81
- let u_min = Infinity;
82
- let u_max = -Infinity;
83
- let v_min = Infinity;
84
- let v_max = -Infinity;
85
- let normal_min = Infinity;
86
- let normal_max = -Infinity;
87
- for (let ci = 0; ci < 8; ci++) {
88
- const fi = ci & 1 ? 1 : 0;
89
- const fj = ci & 2 ? 1 : 0;
90
- const fk = ci & 4 ? 1 : 0;
91
- // Corner in Cartesian: frac * lattice
92
- const corner = [
93
- fi * lattice[0][0] + fj * lattice[1][0] + fk * lattice[2][0],
94
- fi * lattice[0][1] + fj * lattice[1][1] + fk * lattice[2][1],
95
- fi * lattice[0][2] + fj * lattice[1][2] + fk * lattice[2][2],
96
- ];
97
- const u_proj = math.dot(corner, u_vec);
98
- const v_proj = math.dot(corner, v_vec);
99
- const n_proj = math.dot(corner, unit_normal);
100
- if (u_proj < u_min)
101
- u_min = u_proj;
102
- if (u_proj > u_max)
103
- u_max = u_proj;
104
- if (v_proj < v_min)
105
- v_min = v_proj;
106
- if (v_proj > v_max)
107
- v_max = v_proj;
108
- if (n_proj < normal_min)
109
- normal_min = n_proj;
110
- if (n_proj > normal_max)
111
- normal_max = n_proj;
112
- }
212
+ const corners = cell_corners(volume, UNIT_CELL_RANGE);
213
+ const projections = corners.map((corner) => math.dot(corner, unit_normal));
214
+ const normal_min = Math.min(...projections);
215
+ const normal_max = Math.max(...projections);
113
216
  // Plane position: fractional distance [0,1] along the normal extent
114
217
  const d_cartesian = normal_min + distance * (normal_max - normal_min);
115
- // Sampling resolution: caller-specified or default to max grid dimension
116
- const width = n_points ?? Math.max(nx, ny, nz);
117
- const height = width;
118
- const data = new Float64Array(width * height);
119
- let data_min = Infinity;
120
- let data_max = -Infinity;
121
- const u_step = (u_max - u_min) / (width - 1 || 1);
122
- const v_step = (v_max - v_min) / (height - 1 || 1);
123
- for (let row = 0; row < height; row++) {
124
- const v_val = v_min + row * v_step;
125
- for (let col = 0; col < width; col++) {
126
- const u_val = u_min + col * u_step;
127
- // Cartesian position on the plane
128
- const px = d_cartesian * unit_normal[0] + u_val * u_vec[0] + v_val * v_vec[0];
129
- const py = d_cartesian * unit_normal[1] + u_val * u_vec[1] + v_val * v_vec[1];
130
- const pz = d_cartesian * unit_normal[2] + u_val * u_vec[2] + v_val * v_vec[2];
131
- const [fx, fy, fz] = cart_to_frac([px, py, pz]);
132
- const val = trilinear_interpolate(grid, fx, fy, fz, periodic);
133
- data[row * width + col] = val;
134
- if (val < data_min)
135
- data_min = val;
136
- if (val > data_max)
137
- data_max = val;
138
- }
139
- }
140
- return { data, width, height, min: data_min, max: data_max };
218
+ const point = [
219
+ d_cartesian * unit_normal[0],
220
+ d_cartesian * unit_normal[1],
221
+ d_cartesian * unit_normal[2],
222
+ ];
223
+ const resolution = n_points ?? Math.max(...volume.grid_dims);
224
+ return sample_plane_slice(volume, { point, normal: unit_normal }, { resolution: [resolution, resolution] });
141
225
  }
@@ -1,4 +1,5 @@
1
- import type { Matrix3x3, Vec3 } from '../math';
1
+ import type { D3InterpolateName } from '../colors';
2
+ import type { Matrix3x3, Vec2, Vec3 } from '../math';
2
3
  import type { ParsedStructure } from '../structure/parse';
3
4
  export interface DataRange {
4
5
  min: number;
@@ -15,6 +16,7 @@ export interface VolumetricData {
15
16
  data_order?: `x_fastest` | `z_fastest`;
16
17
  periodic: boolean;
17
18
  label?: string;
19
+ source?: string;
18
20
  }
19
21
  export interface VolumetricFileData {
20
22
  structure: ParsedStructure;
@@ -27,6 +29,10 @@ export interface IsosurfaceLayer {
27
29
  visible: boolean;
28
30
  show_negative: boolean;
29
31
  negative_color: string;
32
+ volume_idx?: number;
33
+ color_volume_idx?: number;
34
+ colormap?: D3InterpolateName;
35
+ color_range?: Vec2;
30
36
  }
31
37
  export interface IsosurfaceSettings {
32
38
  isovalue: number;
@@ -37,6 +43,7 @@ export interface IsosurfaceSettings {
37
43
  wireframe: boolean;
38
44
  halo: number;
39
45
  layers?: IsosurfaceLayer[];
46
+ display_range?: [Vec2, Vec2, Vec2];
40
47
  }
41
48
  export declare const LAYER_COLORS: readonly ["#3b82f6", "#ef4444", "#22c55e", "#a855f7", "#f97316", "#06b6d4", "#eab308", "#ec4899"];
42
49
  export declare function grid_data_range(grid: number[][][]): DataRange;
@@ -45,6 +52,7 @@ export declare function pad_periodic_grid(grid: number[][][], dims: Vec3, pad_fr
45
52
  dims: Vec3;
46
53
  offset: Vec3;
47
54
  };
55
+ export declare const MAX_GRID_POINTS = 500000;
48
56
  export declare function downsample_grid(grid: number[][][], dims: Vec3, max_points?: number): {
49
57
  grid: number[][][];
50
58
  dims: Vec3;
@@ -53,4 +61,19 @@ export declare function downsample_grid(grid: number[][][], dims: Vec3, max_poin
53
61
  export declare const DEFAULT_ISOSURFACE_SETTINGS: IsosurfaceSettings;
54
62
  export declare function auto_isosurface_settings(data_range: DataRange): IsosurfaceSettings;
55
63
  export declare function generate_layers(data_range: DataRange, n_layers: number): IsosurfaceLayer[];
64
+ export declare function auto_volume_layer(volume: VolumetricData, volume_idx: number, color_offset?: number): IsosurfaceLayer;
65
+ export declare function materialize_layers(settings: IsosurfaceSettings, active_volume_idx: number): IsosurfaceLayer[];
66
+ export declare function remove_volume(volumes: VolumetricData[], layers: IsosurfaceLayer[], removed_idx: number, active_volume_idx?: number): {
67
+ volumes: VolumetricData[];
68
+ layers: IsosurfaceLayer[];
69
+ };
70
+ export declare function label_file_volumes(volumes: VolumetricData[], filename: string): VolumetricData[];
71
+ export declare const lattices_match: (lattice_a: readonly (readonly number[])[] | undefined, lattice_b: readonly (readonly number[])[] | undefined, tolerance?: number) => boolean;
72
+ export interface VolumeMergeResult {
73
+ volumes: VolumetricData[];
74
+ layers: IsosurfaceLayer[];
75
+ first_touched_idx: number;
76
+ n_added: number;
77
+ }
78
+ export declare function merge_imported_volumes(existing: VolumetricData[], existing_layers: IsosurfaceLayer[], incoming: VolumetricData[], active_volume_idx?: number): VolumeMergeResult;
56
79
  export declare function tile_volumetric_data(volume: VolumetricData, scaling: Vec3): VolumetricData;