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
@@ -57,7 +57,7 @@
57
57
  bz_color = `#888888`,
58
58
  bz_opacity = 0.1,
59
59
  bz_edge_color = `#333333`,
60
- bz_edge_width = 0.02,
60
+ bz_edge_width = 0.002,
61
61
  show_vectors = true,
62
62
  tile_bz = false,
63
63
  // Clipping plane
@@ -153,8 +153,8 @@
153
153
 
154
154
  // Filter surfaces based on selected bands
155
155
  let visible_surfaces = $derived(
156
- fermi_data?.isosurfaces.filter((surface) =>
157
- selected_bands === undefined || selected_bands.includes(surface.band_index)
156
+ fermi_data?.isosurfaces.filter(
157
+ (surface) => selected_bands === undefined || selected_bands.includes(surface.band_index),
158
158
  ) ?? [],
159
159
  )
160
160
 
@@ -172,21 +172,11 @@
172
172
 
173
173
  // Map from surface to its render order based on size (inner surfaces first)
174
174
  let surface_render_orders = $derived.by((): Map<Isosurface, number> => {
175
- const order_map = new SvelteMap<Isosurface, number>()
176
- if (visible_surfaces.length === 0) return order_map
177
-
178
- // Compute radius for each surface and sort by it
179
- const surfaces_with_radius = visible_surfaces.map((surface) => ({
180
- surface,
181
- radius: compute_surface_radius(surface),
182
- }))
183
- surfaces_with_radius.sort((a, b) => a.radius - b.radius)
184
-
185
- // Assign render order: smaller radius (inner) = lower order = rendered first
186
- for (let idx = 0; idx < surfaces_with_radius.length; idx++) {
187
- order_map.set(surfaces_with_radius[idx].surface, idx)
188
- }
189
- return order_map
175
+ const by_radius = visible_surfaces
176
+ .map((surface) => ({ surface, radius: compute_surface_radius(surface) }))
177
+ .toSorted((surf_a, surf_b) => surf_a.radius - surf_b.radius)
178
+ // Smaller radius (inner) = lower order = rendered first
179
+ return new SvelteMap(by_radius.map(({ surface }, idx) => [surface, idx]))
190
180
  })
191
181
 
192
182
  // Compute property range for color scaling
@@ -208,9 +198,6 @@
208
198
 
209
199
  // Get color for a surface/vertex
210
200
  function get_surface_color(surface: Isosurface, vertex_idx?: number): string {
211
- if (color_property === `band`) {
212
- return constants.BAND_COLORS[surface.band_index % constants.BAND_COLORS.length]
213
- }
214
201
  if (
215
202
  (color_property === `velocity` || color_property === `custom`) &&
216
203
  surface.properties &&
@@ -218,9 +205,7 @@
218
205
  ) {
219
206
  const prop = surface.properties[vertex_idx]
220
207
  const [min_val, max_val] = property_range
221
- const normalized = max_val > min_val
222
- ? (prop - min_val) / (max_val - min_val)
223
- : 0.5
208
+ const normalized = max_val > min_val ? (prop - min_val) / (max_val - min_val) : 0.5
224
209
  return get_d3_interpolator(color_scale as D3InterpolateName)(normalized)
225
210
  }
226
211
  // Spin coloring
@@ -240,8 +225,7 @@
240
225
  const normals: number[] = []
241
226
  const colors: number[] = []
242
227
 
243
- const use_vertex_colors = color_property === `velocity` ||
244
- color_property === `custom`
228
+ const use_vertex_colors = color_property === `velocity` || color_property === `custom`
245
229
 
246
230
  const n_vertices = surface.vertices.length
247
231
 
@@ -257,9 +241,12 @@
257
241
 
258
242
  // Validate face indices are within bounds (protects against malformed JSON files)
259
243
  if (
260
- idx0 < 0 || idx0 >= n_vertices ||
261
- idx1 < 0 || idx1 >= n_vertices ||
262
- idx2 < 0 || idx2 >= n_vertices
244
+ idx0 < 0 ||
245
+ idx0 >= n_vertices ||
246
+ idx1 < 0 ||
247
+ idx1 >= n_vertices ||
248
+ idx2 < 0 ||
249
+ idx2 >= n_vertices
263
250
  ) {
264
251
  continue
265
252
  }
@@ -297,10 +284,7 @@
297
284
  }
298
285
 
299
286
  const geometry = new BufferGeometry()
300
- geometry.setAttribute(
301
- `position`,
302
- new BufferAttribute(new Float32Array(positions), 3),
303
- )
287
+ geometry.setAttribute(`position`, new BufferAttribute(new Float32Array(positions), 3))
304
288
  geometry.setAttribute(`normal`, new BufferAttribute(new Float32Array(normals), 3))
305
289
 
306
290
  if (use_vertex_colors) {
@@ -358,18 +342,20 @@
358
342
  camera_position || default_camera_position(scene_size),
359
343
  )
360
344
 
361
- const orbit_controls_props = $derived(build_orbit_props({
362
- camera_projection,
363
- target: rotation_target,
364
- rotate_speed,
365
- zoom_speed,
366
- zoom_to_cursor,
367
- pan_speed,
368
- max_zoom,
369
- min_zoom,
370
- auto_rotate,
371
- rotation_damping,
372
- }))
345
+ const orbit_controls_props = $derived(
346
+ build_orbit_props({
347
+ camera_projection,
348
+ target: rotation_target,
349
+ rotate_speed,
350
+ zoom_speed,
351
+ zoom_to_cursor,
352
+ pan_speed,
353
+ max_zoom,
354
+ min_zoom,
355
+ auto_rotate,
356
+ rotation_damping,
357
+ }),
358
+ )
373
359
 
374
360
  // Create BZ geometry
375
361
  const bz_geometry = $derived(
@@ -423,11 +409,7 @@
423
409
  let [min_dist, nearest_idx] = [Infinity, 0]
424
410
  for (let idx = 0; idx < surface.vertices.length; idx++) {
425
411
  const vertex = surface.vertices[idx]
426
- const dist = Math.hypot(
427
- point[0] - vertex[0],
428
- point[1] - vertex[1],
429
- point[2] - vertex[2],
430
- )
412
+ const dist = Math.hypot(point[0] - vertex[0], point[1] - vertex[1], point[2] - vertex[2])
431
413
  if (dist < min_dist) {
432
414
  min_dist = dist
433
415
  nearest_idx = idx
@@ -459,9 +441,8 @@
459
441
  const nearest_idx = find_nearest_vertex(surface, local_position)
460
442
  const property_value = surface.properties?.[nearest_idx]
461
443
  const has_velocities = fermi_data?.metadata?.has_velocities
462
- const property_name = property_value != null
463
- ? (has_velocities ? `velocity` : `custom`)
464
- : undefined
444
+ const property_name =
445
+ property_value != null ? (has_velocities ? `velocity` : `custom`) : undefined
465
446
 
466
447
  const { clientX, clientY } = event.nativeEvent
467
448
  return {
@@ -533,19 +514,11 @@
533
514
 
534
515
  <!-- Reciprocal lattice vectors -->
535
516
  {#if show_vectors && fermi_data?.k_lattice}
536
- <ReciprocalVectors
537
- k_lattice={fermi_data.k_lattice}
538
- {vector_scale}
539
- size={scene_size}
540
- />
517
+ <ReciprocalVectors k_lattice={fermi_data.k_lattice} {vector_scale} size={scene_size} />
541
518
  {/if}
542
519
 
543
520
  <!-- Fermi surfaces (with optional symmetry tiling) -->
544
- {#each visible_surfaces as
545
- surface,
546
- surface_idx
547
- (`surface-${surface.band_index}-${surface.spin}-${surface_idx}`)
548
- }
521
+ {#each visible_surfaces as surface, surface_idx (`surface-${surface.band_index}-${surface.spin}-${surface_idx}`)}
549
522
  {@const geo_key = `${surface.band_index}-${surface.spin}-${surface_idx}`}
550
523
  {@const geo_data = geometry_cache.get(geo_key)}
551
524
  {@const surface_color = get_surface_color(surface)}
@@ -555,89 +528,44 @@
555
528
 
556
529
  {#if geo_data}
557
530
  {#each symmetry_ops as sym_matrix, sym_idx (`sym-${sym_idx}`)}
558
- {#if representation === `wireframe`}
531
+ {#snippet mesh_pass(order: number, pass: `wireframe` | `front` | `back`)}
559
532
  <T.Mesh
560
533
  geometry={geo_data.geometry}
561
534
  matrix={sym_matrix}
562
535
  matrixAutoUpdate={false}
563
- {renderOrder}
536
+ renderOrder={order}
564
537
  onpointermove={(event: ThreltePointerEvent) =>
565
- handle_pointer_move(event, surface, surface_color, sym_idx, sym_matrix)}
538
+ handle_pointer_move(event, surface, surface_color, sym_idx, sym_matrix)}
566
539
  onpointerleave={clear_hover}
567
540
  >
568
- <T.MeshBasicMaterial
569
- color={surface_color}
570
- wireframe
571
- transparent={surface_opacity < 1}
572
- opacity={surface_opacity}
573
- depthWrite={true}
574
- depthTest={true}
575
- />
541
+ {#if pass === `wireframe`}
542
+ <T.MeshBasicMaterial
543
+ color={surface_color}
544
+ wireframe
545
+ transparent={surface_opacity < 1}
546
+ opacity={surface_opacity}
547
+ depthWrite={true}
548
+ depthTest={true}
549
+ />
550
+ {:else}
551
+ <T.MeshStandardMaterial
552
+ {...get_material_props(surface_color, use_vertex_colors, surface_idx, pass)}
553
+ metalness={0.1}
554
+ roughness={0.6}
555
+ flatShading={false}
556
+ />
557
+ {/if}
576
558
  </T.Mesh>
559
+ {/snippet}
560
+
561
+ {#if representation === `wireframe`}
562
+ {@render mesh_pass(renderOrder, `wireframe`)}
577
563
  {:else if surface_opacity < 1}
578
- <!-- Two-pass rendering for transparent surfaces -->
579
- <!-- Pass 1: Back faces (rendered first, lower renderOrder) -->
580
- <T.Mesh
581
- geometry={geo_data.geometry}
582
- matrix={sym_matrix}
583
- matrixAutoUpdate={false}
584
- renderOrder={renderOrder * 2}
585
- onpointermove={(event: ThreltePointerEvent) =>
586
- handle_pointer_move(event, surface, surface_color, sym_idx, sym_matrix)}
587
- onpointerleave={clear_hover}
588
- >
589
- <T.MeshStandardMaterial
590
- {...get_material_props(surface_color, use_vertex_colors, surface_idx, `back`)}
591
- metalness={0.1}
592
- roughness={0.6}
593
- flatShading={false}
594
- />
595
- </T.Mesh>
596
- <!-- Pass 2: Front faces (rendered second, higher renderOrder) -->
597
- <T.Mesh
598
- geometry={geo_data.geometry}
599
- matrix={sym_matrix}
600
- matrixAutoUpdate={false}
601
- renderOrder={renderOrder * 2 + 1}
602
- onpointermove={(event: ThreltePointerEvent) =>
603
- handle_pointer_move(event, surface, surface_color, sym_idx, sym_matrix)}
604
- onpointerleave={clear_hover}
605
- >
606
- <T.MeshStandardMaterial
607
- {...get_material_props(
608
- surface_color,
609
- use_vertex_colors,
610
- surface_idx,
611
- `front`,
612
- )}
613
- metalness={0.1}
614
- roughness={0.6}
615
- flatShading={false}
616
- />
617
- </T.Mesh>
564
+ <!-- Two-pass transparent rendering: back faces first, front faces on top -->
565
+ {@render mesh_pass(renderOrder * 2, `back`)}
566
+ {@render mesh_pass(renderOrder * 2 + 1, `front`)}
618
567
  {:else}
619
- <!-- Single pass for opaque surfaces -->
620
- <T.Mesh
621
- geometry={geo_data.geometry}
622
- matrix={sym_matrix}
623
- matrixAutoUpdate={false}
624
- {renderOrder}
625
- onpointermove={(event: ThreltePointerEvent) =>
626
- handle_pointer_move(event, surface, surface_color, sym_idx, sym_matrix)}
627
- onpointerleave={clear_hover}
628
- >
629
- <T.MeshStandardMaterial
630
- {...get_material_props(
631
- surface_color,
632
- use_vertex_colors,
633
- surface_idx,
634
- `front`,
635
- )}
636
- metalness={0.1}
637
- roughness={0.6}
638
- flatShading={false}
639
- />
640
- </T.Mesh>
568
+ {@render mesh_pass(renderOrder, `front`)}
641
569
  {/if}
642
570
  {/each}
643
571
  {/if}
@@ -25,6 +25,6 @@ type $$ComponentProps = SceneControlProps & {
25
25
  vector_scale?: number;
26
26
  hover_data?: FermiHoverData | null;
27
27
  };
28
- declare const FermiSurfaceScene: import("svelte").Component<$$ComponentProps, {}, "scene" | "camera" | "camera_projection" | "camera_position" | "surface_opacity" | "bz_data" | "hover_data" | "fermi_data">;
28
+ declare const FermiSurfaceScene: import("svelte").Component<$$ComponentProps, {}, "camera" | "camera_projection" | "camera_position" | "scene" | "surface_opacity" | "bz_data" | "hover_data" | "fermi_data">;
29
29
  type FermiSurfaceScene = ReturnType<typeof FermiSurfaceScene>;
30
30
  export default FermiSurfaceScene;
@@ -5,7 +5,10 @@
5
5
  import { KCoords, TooltipContent } from '../tooltip'
6
6
  import type { FermiHoverData, FermiTooltipProp } from './types'
7
7
 
8
- let { hover_data, tooltip }: {
8
+ let {
9
+ hover_data,
10
+ tooltip,
11
+ }: {
9
12
  hover_data: FermiHoverData
10
13
  tooltip?: FermiTooltipProp
11
14
  } = $props()
@@ -27,15 +30,15 @@
27
30
 
28
31
  {#if hover_data.property_value != null}
29
32
  <div class="property-row">
30
- {hover_data.property_name || `Property`}: {
31
- format_num(hover_data.property_value, `.4~`)
32
- }
33
+ {hover_data.property_name || `Property`}: {format_num(
34
+ hover_data.property_value,
35
+ `.4~`,
36
+ )}
33
37
  <span class="nearest-note">(nearest)</span>
34
38
  </div>
35
39
  {/if}
36
40
 
37
- {#if hover_data.is_tiled && hover_data.symmetry_index != null &&
38
- hover_data.symmetry_index > 0}
41
+ {#if hover_data.is_tiled && hover_data.symmetry_index != null && hover_data.symmetry_index > 0}
39
42
  <div class="tiling-info">
40
43
  Symmetry copy #{hover_data.symmetry_index + 1}/48
41
44
  </div>
@@ -3,6 +3,8 @@ import * as math from '../math';
3
3
  import { EPS } from '../math';
4
4
  import { CLOSED_CONTOUR_TOLERANCE, IRREDUCIBLE_BZ_MIN_VERTICES, IRREDUCIBLE_BZ_TOLERANCE, SPANNING_THRESHOLD, } from './constants';
5
5
  import { marching_cubes } from '../marching-cubes';
6
+ // clamp01 guards float jitter at the cell boundary
7
+ import { clamp01 } from '../utils';
6
8
  const safe_mod = (val, dim) => ((val % dim) + dim) % dim;
7
9
  // Precompute Catmull-Rom coefficients for a given t value
8
10
  // Returns [c0, c1, c2, c3] where result = c0*p0 + c1*p1 + c2*p2 + c3*p3
@@ -24,18 +26,15 @@ function tricubic_interpolate(grid, fx, fy, fz, px, py, pz) {
24
26
  const iy = Math.floor(fy);
25
27
  const iz = Math.floor(fz);
26
28
  // Precompute Catmull-Rom coefficients
27
- const [cx0, cx1, cx2, cx3] = catmull_rom_coeffs(fx - ix);
28
- const [cy0, cy1, cy2, cy3] = catmull_rom_coeffs(fy - iy);
29
- const [cz0, cz1, cz2, cz3] = catmull_rom_coeffs(fz - iz);
29
+ const cx = catmull_rom_coeffs(fx - ix);
30
+ const cy = catmull_rom_coeffs(fy - iy);
31
+ const cz = catmull_rom_coeffs(fz - iz);
30
32
  // Wrapped stencil indices (modulo hoisted out of the inner loop); a zero period
31
33
  // (single-point axis) has no neighbours, so collapse the stencil onto index 0
32
34
  const stencil = (idx, period) => [idx - 1, idx, idx + 1, idx + 2].map((stencil_idx) => period > 0 ? ((stencil_idx % period) + period) % period : 0);
33
35
  const [wx, wy, wz] = [stencil(ix, px), stencil(iy, py), stencil(iz, pz)];
34
36
  // Interpolate along z, then y, then x (fully inlined)
35
37
  let result = 0;
36
- const cx = [cx0, cx1, cx2, cx3];
37
- const cy = [cy0, cy1, cy2, cy3];
38
- const cz = [cz0, cz1, cz2, cz3];
39
38
  for (let xi = 0; xi < 4; xi++) {
40
39
  const row = grid[wx[xi]];
41
40
  let y_sum = 0;
@@ -204,7 +203,7 @@ export function compute_surface_area(surface) {
204
203
  const cy = e1z * e2x - e1x * e2z;
205
204
  const cz = e1x * e2y - e1y * e2x;
206
205
  // Area is half the magnitude of cross product
207
- total_area += Math.sqrt(cx * cx + cy * cy + cz * cz) * 0.5;
206
+ total_area += Math.hypot(cx, cy, cz) * 0.5;
208
207
  }
209
208
  return total_area;
210
209
  }
@@ -218,8 +217,6 @@ function compute_fermi_velocities(surface, velocity_grid, k_lattice, k_grid, per
218
217
  const k_inv = math.matrix_inverse_3x3(math.transpose_3x3_matrix(k_lattice));
219
218
  // Grid point i sits at frac i/(n−1) (endpoint-inclusive BXSF) or i/n (periodic)
220
219
  const [sx, sy, sz] = periodic ? [nx, ny, nz] : [nx - 1, ny - 1, nz - 1];
221
- // Clamp guards float jitter at the cell boundary
222
- const clamp01 = (val) => Math.min(Math.max(val, 0), 1);
223
220
  for (const vertex of surface.vertices) {
224
221
  const frac = math.mat3x3_vec3_multiply(k_inv, vertex); // centered, in [-0.5, 0.5]
225
222
  const gx = clamp01(frac[0] + 0.5) * sx;
@@ -286,36 +283,26 @@ function analyze_surface_topology(surface, k_lattice) {
286
283
  spans[axis_idx] = surface_size > SPANNING_THRESHOLD * bz_size;
287
284
  }
288
285
  const n_spanning = spans.filter(Boolean).length;
289
- if (n_spanning === 0) {
290
- // Closed surface, no spanning directions
286
+ // 0 spanning = closed 3D pocket; 3 spanning = complex warped network
287
+ if (n_spanning === 0)
291
288
  return { dimensionality: `3D`, orientation: null };
292
- }
293
- else if (n_spanning === 1) {
294
- // 2D sheet spanning one direction
295
- const axis_idx = spans.indexOf(true);
296
- const orientation = [0, 0, 0];
297
- orientation[axis_idx] = 1;
298
- return { dimensionality: `2D`, orientation };
299
- }
300
- else if (n_spanning === 2) {
301
- // 1D noodle-like (tube spanning 2 directions, bounded in 1)
302
- const axis_idx = spans.indexOf(false);
303
- const orientation = [0, 0, 0];
304
- orientation[axis_idx] = 1;
305
- return { dimensionality: `1D`, orientation };
306
- }
307
- // Spans all 3 directions - complex warped network
308
- return { dimensionality: `quasi-2D`, orientation: null };
289
+ if (n_spanning === 3)
290
+ return { dimensionality: `quasi-2D`, orientation: null };
291
+ // 1 spanning = 2D sheet (oriented along the spanning axis);
292
+ // 2 spanning = 1D noodle-like tube (oriented along the bounded axis)
293
+ const axis_idx = n_spanning === 1 ? spans.indexOf(true) : spans.indexOf(false);
294
+ const orientation = [0, 0, 0];
295
+ orientation[axis_idx] = 1;
296
+ return { dimensionality: n_spanning === 1 ? `2D` : `1D`, orientation };
309
297
  }
310
298
  // Compute 2D Fermi slice along a specified plane
311
299
  export function compute_fermi_slice(fermi_data, options = {}) {
312
300
  const { miller_indices = [0, 0, 1], distance = 0 } = options;
313
- // Validate miller indices are not all zero
314
- if (miller_indices[0] === 0 && miller_indices[1] === 0 && miller_indices[2] === 0) {
301
+ if (miller_indices.every((miller_idx) => miller_idx === 0)) {
315
302
  throw new Error(`Invalid miller indices [0, 0, 0]: at least one index must be non-zero to define a plane`);
316
303
  }
317
304
  // Compute plane normal in Cartesian coordinates
318
- const plane_normal = math.add(math.add(math.scale(fermi_data.k_lattice[0], miller_indices[0]), math.scale(fermi_data.k_lattice[1], miller_indices[1])), math.scale(fermi_data.k_lattice[2], miller_indices[2]));
305
+ const plane_normal = math.add(math.scale(fermi_data.k_lattice[0], miller_indices[0]), math.scale(fermi_data.k_lattice[1], miller_indices[1]), math.scale(fermi_data.k_lattice[2], miller_indices[2]));
319
306
  const normal_len = Math.hypot(...plane_normal);
320
307
  if (normal_len < EPS) {
321
308
  throw new Error(`Degenerate plane normal: k_lattice vectors produce a zero-length normal for miller indices [${miller_indices.join(`, `)}]`);
@@ -324,11 +311,7 @@ export function compute_fermi_slice(fermi_data, options = {}) {
324
311
  // Compute in-plane basis vectors
325
312
  const [in_plane_u, in_plane_v] = math.compute_in_plane_basis(unit_normal);
326
313
  // Slice each isosurface
327
- const isolines = [];
328
- for (const surface of fermi_data.isosurfaces) {
329
- const lines = slice_surface_with_plane(surface, unit_normal, distance, in_plane_u, in_plane_v);
330
- isolines.push(...lines);
331
- }
314
+ const isolines = fermi_data.isosurfaces.flatMap((surface) => slice_surface_with_plane(surface, unit_normal, distance, in_plane_u, in_plane_v));
332
315
  return {
333
316
  isolines,
334
317
  plane_normal: unit_normal,
@@ -340,8 +323,6 @@ export function compute_fermi_slice(fermi_data, options = {}) {
340
323
  },
341
324
  };
342
325
  }
343
- // Helper to create edge key (sorted vertex indices)
344
- const make_edge_key = (v0_idx, v1_idx) => `${Math.min(v0_idx, v1_idx)},${Math.max(v0_idx, v1_idx)}`;
345
326
  // Compute intersection point on an edge
346
327
  function compute_edge_intersection(surface, vertex_distances, v0_idx, v1_idx) {
347
328
  const d0 = vertex_distances[v0_idx];
@@ -383,7 +364,7 @@ function slice_surface_with_plane(surface, plane_normal, plane_distance, in_plan
383
364
  for (let edge_idx = 0; edge_idx < face.length; edge_idx++) {
384
365
  const v0_idx = face[edge_idx];
385
366
  const v1_idx = face[(edge_idx + 1) % face.length];
386
- const edge_key = make_edge_key(v0_idx, v1_idx);
367
+ const edge_key = `${Math.min(v0_idx, v1_idx)},${Math.max(v0_idx, v1_idx)}`;
387
368
  const intersection = compute_edge_intersection(surface, vertex_distances, v0_idx, v1_idx);
388
369
  if (intersection) {
389
370
  crossing_edges.push({ edge_key, intersection });
@@ -516,24 +497,10 @@ function slice_surface_with_plane(surface, plane_normal, plane_distance, in_plan
516
497
  // For cubic Oh symmetry, this is the region where all vertices are in the first octant
517
498
  // (x >= 0, y >= 0, z >= 0) with some tolerance. Such data needs tiling to show the full BZ.
518
499
  export function detect_irreducible_bz(fermi_data) {
519
- if (fermi_data.isosurfaces.length === 0)
500
+ const vertex_count = fermi_data.isosurfaces.reduce((sum, surface) => sum + surface.vertices.length, 0);
501
+ // Only consider it irreducible if we have significant data and all vertices are
502
+ // in the positive octant (with small tolerance for numerical error)
503
+ if (vertex_count <= IRREDUCIBLE_BZ_MIN_VERTICES)
520
504
  return false;
521
- // Check if all vertices are in the positive octant (with small tolerance for numerical error)
522
- let all_positive = true;
523
- let vertex_count = 0;
524
- for (const surface of fermi_data.isosurfaces) {
525
- for (const vertex of surface.vertices) {
526
- vertex_count++;
527
- if (vertex[0] < -IRREDUCIBLE_BZ_TOLERANCE ||
528
- vertex[1] < -IRREDUCIBLE_BZ_TOLERANCE ||
529
- vertex[2] < -IRREDUCIBLE_BZ_TOLERANCE) {
530
- all_positive = false;
531
- break;
532
- }
533
- }
534
- if (!all_positive)
535
- break;
536
- }
537
- // Only consider it irreducible if we have significant data and all positive
538
- return all_positive && vertex_count > IRREDUCIBLE_BZ_MIN_VERTICES;
505
+ return fermi_data.isosurfaces.every((surface) => surface.vertices.every((vertex) => vertex.every((coord) => coord >= -IRREDUCIBLE_BZ_TOLERANCE)));
539
506
  }