matterviz 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (527) hide show
  1. package/dist/EmptyState.svelte +10 -4
  2. package/dist/FilePicker.svelte +12 -14
  3. package/dist/Icon.svelte +7 -4
  4. package/dist/MillerIndexInput.svelte +2 -2
  5. package/dist/app.css +53 -0
  6. package/dist/brillouin/BrillouinZone.svelte +132 -219
  7. package/dist/brillouin/BrillouinZone.svelte.d.ts +9 -20
  8. package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
  9. package/dist/brillouin/BrillouinZoneExportPane.svelte +47 -96
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  11. package/dist/brillouin/BrillouinZoneInfoPane.svelte +15 -42
  12. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +2 -3
  13. package/dist/brillouin/BrillouinZoneScene.svelte +63 -230
  14. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +3 -23
  15. package/dist/brillouin/ReciprocalVectors.svelte +39 -0
  16. package/dist/brillouin/ReciprocalVectors.svelte.d.ts +9 -0
  17. package/dist/brillouin/compute.d.ts +2 -0
  18. package/dist/brillouin/compute.js +80 -77
  19. package/dist/brillouin/geometry.d.ts +8 -0
  20. package/dist/brillouin/geometry.js +57 -0
  21. package/dist/brillouin/index.d.ts +2 -0
  22. package/dist/brillouin/index.js +2 -0
  23. package/dist/brillouin/types.d.ts +2 -2
  24. package/dist/chempot-diagram/ChemPotDiagram.svelte +33 -38
  25. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +1 -1
  26. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +143 -246
  27. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +4 -1
  28. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +652 -976
  29. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +7 -1
  30. package/dist/chempot-diagram/async-compute.svelte.js +1 -1
  31. package/dist/chempot-diagram/color.d.ts +3 -6
  32. package/dist/chempot-diagram/color.js +5 -5
  33. package/dist/chempot-diagram/compute.d.ts +3 -3
  34. package/dist/chempot-diagram/compute.js +3 -1
  35. package/dist/chempot-diagram/controls-state.svelte.d.ts +10 -0
  36. package/dist/chempot-diagram/controls-state.svelte.js +42 -0
  37. package/dist/chempot-diagram/export.d.ts +47 -0
  38. package/dist/chempot-diagram/export.js +133 -0
  39. package/dist/chempot-diagram/index.d.ts +1 -0
  40. package/dist/chempot-diagram/index.js +1 -0
  41. package/dist/chempot-diagram/pointer.d.ts +0 -10
  42. package/dist/chempot-diagram/pointer.js +4 -4
  43. package/dist/chempot-diagram/types.d.ts +3 -3
  44. package/dist/colors/index.d.ts +0 -4
  45. package/dist/colors/index.js +21 -22
  46. package/dist/composition/BarChart.svelte +37 -31
  47. package/dist/composition/BubbleChart.svelte +17 -17
  48. package/dist/composition/Composition.svelte +7 -11
  49. package/dist/composition/Formula.svelte +18 -25
  50. package/dist/composition/FormulaFilter.svelte +96 -98
  51. package/dist/composition/PieChart.svelte +60 -46
  52. package/dist/composition/chem-sys.js +3 -2
  53. package/dist/composition/format.js +4 -3
  54. package/dist/composition/index.d.ts +2 -0
  55. package/dist/composition/index.js +14 -0
  56. package/dist/composition/parse.d.ts +2 -3
  57. package/dist/composition/parse.js +27 -28
  58. package/dist/constants.js +11 -9
  59. package/dist/controls.d.ts +1 -0
  60. package/dist/controls.js +0 -1
  61. package/dist/convex-hull/ConvexHull.svelte +20 -25
  62. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -4
  63. package/dist/convex-hull/ConvexHull2D.svelte +176 -256
  64. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  65. package/dist/convex-hull/ConvexHull3D.svelte +269 -804
  66. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  67. package/dist/convex-hull/ConvexHull4D.svelte +236 -755
  68. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  69. package/dist/convex-hull/ConvexHullChrome.svelte +264 -0
  70. package/dist/convex-hull/ConvexHullChrome.svelte.d.ts +30 -0
  71. package/dist/convex-hull/ConvexHullControls.svelte +128 -49
  72. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +7 -6
  73. package/dist/convex-hull/ConvexHullInfoPane.svelte +18 -5
  74. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +6 -5
  75. package/dist/convex-hull/ConvexHullStats.svelte +210 -351
  76. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +3 -1
  77. package/dist/convex-hull/ConvexHullTooltip.svelte +16 -14
  78. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +2 -1
  79. package/dist/convex-hull/GasPressureControls.svelte +5 -12
  80. package/dist/convex-hull/StructurePopup.svelte +17 -21
  81. package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
  82. package/dist/convex-hull/TemperatureSlider.svelte +4 -10
  83. package/dist/convex-hull/barycentric-coords.d.ts +2 -4
  84. package/dist/convex-hull/barycentric-coords.js +6 -33
  85. package/dist/convex-hull/canvas-interactions.svelte.d.ts +79 -0
  86. package/dist/convex-hull/canvas-interactions.svelte.js +279 -0
  87. package/dist/convex-hull/helpers.d.ts +47 -17
  88. package/dist/convex-hull/helpers.js +186 -101
  89. package/dist/convex-hull/hull-state.svelte.d.ts +44 -0
  90. package/dist/convex-hull/hull-state.svelte.js +124 -0
  91. package/dist/convex-hull/index.d.ts +9 -7
  92. package/dist/convex-hull/index.js +7 -2
  93. package/dist/convex-hull/thermodynamics.js +109 -937
  94. package/dist/convex-hull/types.d.ts +12 -4
  95. package/dist/convex-hull/types.js +12 -0
  96. package/dist/coordination/CoordinationBarPlot.svelte +41 -43
  97. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  98. package/dist/coordination/calc-coordination.d.ts +1 -1
  99. package/dist/coordination/calc-coordination.js +28 -25
  100. package/dist/element/BohrAtom.svelte +6 -8
  101. package/dist/element/ElementHeading.svelte +4 -1
  102. package/dist/element/ElementPhoto.svelte +11 -9
  103. package/dist/element/ElementStats.svelte +12 -10
  104. package/dist/element/ElementTile.svelte +24 -29
  105. package/dist/element/ElementTile.svelte.d.ts +1 -1
  106. package/dist/element/Nucleus.svelte +4 -2
  107. package/dist/element/data.d.ts +1 -2
  108. package/dist/element/helpers.d.ts +4 -0
  109. package/dist/element/helpers.js +18 -0
  110. package/dist/element/index.d.ts +1 -0
  111. package/dist/element/index.js +3 -0
  112. package/dist/feedback/DragOverlay.svelte +5 -3
  113. package/dist/feedback/DragOverlay.svelte.d.ts +2 -1
  114. package/dist/feedback/StatusMessage.svelte +20 -7
  115. package/dist/fermi-surface/FermiSlice.svelte +21 -18
  116. package/dist/fermi-surface/FermiSurface.svelte +78 -165
  117. package/dist/fermi-surface/FermiSurface.svelte.d.ts +9 -20
  118. package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
  119. package/dist/fermi-surface/FermiSurfaceScene.svelte +93 -272
  120. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +3 -23
  121. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
  122. package/dist/fermi-surface/compute.js +14 -13
  123. package/dist/fermi-surface/export.js +4 -15
  124. package/dist/fermi-surface/index.d.ts +0 -1
  125. package/dist/fermi-surface/index.js +0 -1
  126. package/dist/fermi-surface/parse.d.ts +1 -1
  127. package/dist/fermi-surface/parse.js +84 -97
  128. package/dist/fermi-surface/types.d.ts +2 -2
  129. package/dist/heatmap-matrix/HeatmapMatrix.svelte +161 -185
  130. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +6 -5
  131. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +12 -9
  132. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +5 -5
  133. package/dist/heatmap-matrix/index.d.ts +8 -2
  134. package/dist/icons.d.ts +4 -0
  135. package/dist/icons.js +4 -0
  136. package/dist/index.d.ts +1 -0
  137. package/dist/index.js +1 -0
  138. package/dist/io/ExportPane.svelte +170 -0
  139. package/dist/io/ExportPane.svelte.d.ts +17 -0
  140. package/dist/io/decompress.d.ts +2 -1
  141. package/dist/io/decompress.js +22 -36
  142. package/dist/io/export.d.ts +9 -1
  143. package/dist/io/export.js +37 -29
  144. package/dist/io/fetch.d.ts +2 -4
  145. package/dist/io/fetch.js +0 -11
  146. package/dist/io/file-drop.d.ts +7 -0
  147. package/dist/io/file-drop.js +13 -0
  148. package/dist/io/index.d.ts +1 -0
  149. package/dist/io/index.js +3 -0
  150. package/dist/io/is-binary.d.ts +9 -0
  151. package/dist/io/is-binary.js +45 -1
  152. package/dist/io/types.d.ts +13 -0
  153. package/dist/io/url-drop.js +13 -25
  154. package/dist/isosurface/Isosurface.svelte +17 -23
  155. package/dist/isosurface/IsosurfaceControls.svelte +37 -42
  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 +50 -48
  159. package/dist/labels.d.ts +6 -2
  160. package/dist/labels.js +44 -14
  161. package/dist/layout/FullscreenButton.svelte +34 -0
  162. package/dist/layout/FullscreenButton.svelte.d.ts +10 -0
  163. package/dist/layout/FullscreenToggle.svelte +12 -12
  164. package/dist/layout/InfoCard.svelte +7 -18
  165. package/dist/layout/InfoTag.svelte +1 -3
  166. package/dist/layout/NumberRangeInput.svelte +46 -0
  167. package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
  168. package/dist/layout/PropertyFilter.svelte +2 -6
  169. package/dist/layout/SettingsSection.svelte +21 -17
  170. package/dist/layout/SubpageGrid.svelte +3 -1
  171. package/dist/layout/ViewerChrome.svelte +115 -0
  172. package/dist/layout/ViewerChrome.svelte.d.ts +18 -0
  173. package/dist/layout/fullscreen.d.ts +4 -0
  174. package/dist/layout/fullscreen.js +3 -5
  175. package/dist/layout/fullscreen.svelte.d.ts +8 -0
  176. package/dist/layout/fullscreen.svelte.js +36 -0
  177. package/dist/layout/index.d.ts +4 -0
  178. package/dist/layout/index.js +4 -0
  179. package/dist/layout/json-tree/JsonNode.svelte +8 -11
  180. package/dist/layout/json-tree/JsonTree.svelte +53 -77
  181. package/dist/layout/json-tree/JsonValue.svelte +7 -15
  182. package/dist/layout/json-tree/utils.js +14 -23
  183. package/dist/math.d.ts +9 -3
  184. package/dist/math.js +37 -21
  185. package/dist/overlays/ContextMenu.svelte +4 -2
  186. package/dist/overlays/CopyButton.svelte +11 -5
  187. package/dist/overlays/DragControlTab.svelte +6 -1
  188. package/dist/overlays/DraggablePane.svelte +81 -26
  189. package/dist/overlays/DraggablePane.svelte.d.ts +1 -0
  190. package/dist/overlays/GlassChip.svelte +30 -0
  191. package/dist/overlays/GlassChip.svelte.d.ts +8 -0
  192. package/dist/overlays/InfoPaneCards.svelte +11 -23
  193. package/dist/overlays/index.d.ts +11 -0
  194. package/dist/overlays/index.js +26 -0
  195. package/dist/overlays/portal.d.ts +2 -0
  196. package/dist/overlays/portal.js +14 -0
  197. package/dist/periodic-table/PeriodicTable.svelte +115 -146
  198. package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
  199. package/dist/periodic-table/PeriodicTableControls.svelte +11 -63
  200. package/dist/periodic-table/TableInset.svelte +9 -4
  201. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +50 -71
  202. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
  203. package/dist/phase-diagram/PhaseDiagramControls.svelte +73 -96
  204. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +4 -3
  205. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +4 -2
  206. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +2 -3
  207. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +49 -134
  208. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +3 -4
  209. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
  210. package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
  211. package/dist/phase-diagram/build-diagram.js +3 -3
  212. package/dist/phase-diagram/colors.js +1 -1
  213. package/dist/phase-diagram/diagram-input.d.ts +1 -2
  214. package/dist/phase-diagram/parse.d.ts +2 -1
  215. package/dist/phase-diagram/parse.js +15 -15
  216. package/dist/phase-diagram/svg-to-diagram.js +21 -15
  217. package/dist/phase-diagram/utils.js +2 -3
  218. package/dist/plot/bar/BarPlot.svelte +494 -692
  219. package/dist/plot/bar/BarPlot.svelte.d.ts +9 -15
  220. package/dist/plot/bar/BarPlotControls.svelte +1 -3
  221. package/dist/plot/bar/BarPlotControls.svelte.d.ts +5 -7
  222. package/dist/plot/bar/SpacegroupBarPlot.svelte +31 -37
  223. package/dist/plot/bar/data.d.ts +5 -4
  224. package/dist/plot/bar/data.js +2 -1
  225. package/dist/plot/box/BoxPlot.svelte +361 -439
  226. package/dist/plot/box/BoxPlot.svelte.d.ts +6 -3
  227. package/dist/plot/box/BoxPlotControls.svelte.d.ts +1 -1
  228. package/dist/plot/box/Violin.svelte.d.ts +2 -1
  229. package/dist/plot/box/box-plot.d.ts +3 -2
  230. package/dist/plot/box/box-plot.js +6 -3
  231. package/dist/plot/box/kde.d.ts +2 -1
  232. package/dist/plot/box/kde.js +4 -4
  233. package/dist/plot/core/auto-place.d.ts +1 -1
  234. package/dist/plot/core/auto-place.js +5 -2
  235. package/dist/plot/core/axis-utils.d.ts +12 -7
  236. package/dist/plot/core/axis-utils.js +48 -48
  237. package/dist/plot/core/components/AxisLabel.svelte +82 -20
  238. package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
  239. package/dist/plot/core/components/ColorBar.svelte +106 -111
  240. package/dist/plot/core/components/ColorBar.svelte.d.ts +5 -4
  241. package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
  242. package/dist/plot/core/components/FillArea.svelte +10 -17
  243. package/dist/plot/core/components/HierarchyControls.svelte +249 -0
  244. package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
  245. package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
  246. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
  247. package/dist/plot/core/components/Line.svelte +21 -11
  248. package/dist/plot/core/components/Line.svelte.d.ts +5 -2
  249. package/dist/plot/core/components/PlotAxis.svelte +42 -18
  250. package/dist/plot/core/components/PlotAxis.svelte.d.ts +2 -1
  251. package/dist/plot/core/components/PlotControls.svelte +65 -41
  252. package/dist/plot/core/components/PlotControls.svelte.d.ts +1 -1
  253. package/dist/plot/core/components/PlotLegend.svelte +31 -35
  254. package/dist/plot/core/components/PlotMarginals.svelte +616 -0
  255. package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
  256. package/dist/plot/core/components/PlotTooltip.svelte +1 -1
  257. package/dist/plot/core/components/PortalSelect.svelte +4 -8
  258. package/dist/plot/core/components/ReferenceLine.svelte +27 -24
  259. package/dist/plot/core/components/ReferenceLine3D.svelte +56 -59
  260. package/dist/plot/core/components/ReferenceLine3D.svelte.d.ts +4 -4
  261. package/dist/plot/core/components/ReferencePlane.svelte +9 -10
  262. package/dist/plot/core/components/ReferencePlane.svelte.d.ts +4 -4
  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 +29 -476
  271. package/dist/plot/core/data-transform.js +9 -5
  272. package/dist/plot/core/fill-utils.d.ts +7 -4
  273. package/dist/plot/core/fill-utils.js +34 -9
  274. package/dist/plot/core/index.d.ts +1 -0
  275. package/dist/plot/core/index.js +1 -0
  276. package/dist/plot/core/interactions.d.ts +5 -1
  277. package/dist/plot/core/interactions.js +14 -2
  278. package/dist/plot/core/layout.d.ts +3 -1
  279. package/dist/plot/core/layout.js +22 -13
  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 +35 -0
  283. package/dist/plot/core/pan-zoom.svelte.js +221 -0
  284. package/dist/plot/core/placed-tween.svelte.d.ts +21 -0
  285. package/dist/plot/core/placed-tween.svelte.js +68 -0
  286. package/dist/plot/core/reference-line.d.ts +10 -10
  287. package/dist/plot/core/reference-line.js +7 -7
  288. package/dist/plot/core/scales.d.ts +40 -25
  289. package/dist/plot/core/scales.js +49 -21
  290. package/dist/plot/core/svg.d.ts +2 -1
  291. package/dist/plot/core/types/fills.d.ts +101 -0
  292. package/dist/plot/core/types/fills.js +15 -0
  293. package/dist/plot/core/types/plot-3d.d.ts +87 -0
  294. package/dist/plot/core/types/plot-3d.js +4 -0
  295. package/dist/plot/core/types/reference-lines.d.ts +140 -0
  296. package/dist/plot/core/types/reference-lines.js +9 -0
  297. package/dist/plot/core/types.d.ts +47 -331
  298. package/dist/plot/core/types.js +23 -20
  299. package/dist/plot/core/utils/hierarchy-chart.d.ts +51 -0
  300. package/dist/plot/core/utils/hierarchy-chart.js +179 -0
  301. package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
  302. package/dist/plot/core/utils/hierarchy-labels.js +99 -0
  303. package/dist/plot/core/utils/label-placement.d.ts +1 -1
  304. package/dist/plot/core/utils/label-placement.js +5 -5
  305. package/dist/plot/core/utils.d.ts +2 -1
  306. package/dist/plot/histogram/Histogram.svelte +373 -631
  307. package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
  308. package/dist/plot/histogram/HistogramControls.svelte +30 -28
  309. package/dist/plot/histogram/HistogramControls.svelte.d.ts +1 -1
  310. package/dist/plot/histogram/histogram.d.ts +31 -0
  311. package/dist/plot/histogram/histogram.js +70 -0
  312. package/dist/plot/histogram/index.d.ts +1 -0
  313. package/dist/plot/histogram/index.js +1 -0
  314. package/dist/plot/index.d.ts +1 -0
  315. package/dist/plot/index.js +1 -0
  316. package/dist/plot/sankey/Sankey.svelte +79 -73
  317. package/dist/plot/sankey/Sankey.svelte.d.ts +3 -3
  318. package/dist/plot/sankey/SankeyControls.svelte +22 -16
  319. package/dist/plot/sankey/sankey.js +3 -1
  320. package/dist/plot/scatter/BinnedScatterPlot.svelte +264 -112
  321. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +11 -4
  322. package/dist/plot/scatter/ElementScatter.svelte +4 -1
  323. package/dist/plot/scatter/ScatterPlot.svelte +623 -821
  324. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +9 -15
  325. package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
  326. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  327. package/dist/plot/scatter/ScatterPoint.svelte +16 -9
  328. package/dist/plot/scatter/binned-scatter-types.d.ts +6 -12
  329. package/dist/plot/scatter/binned-scatter-types.js +6 -1
  330. package/dist/plot/scatter/index.d.ts +1 -1
  331. package/dist/plot/scatter/scatter-data.d.ts +1 -1
  332. package/dist/plot/scatter/scatter-data.js +8 -7
  333. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +40 -60
  334. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +6 -14
  335. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +17 -15
  336. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte.d.ts +5 -5
  337. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +232 -234
  338. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +5 -14
  339. package/dist/plot/scatter-3d/Surface3D.svelte +9 -17
  340. package/dist/plot/scatter-3d/Surface3D.svelte.d.ts +4 -3
  341. package/dist/plot/sunburst/Sunburst.svelte +256 -338
  342. package/dist/plot/sunburst/Sunburst.svelte.d.ts +4 -3
  343. package/dist/plot/sunburst/index.d.ts +1 -1
  344. package/dist/plot/sunburst/index.js +2 -1
  345. package/dist/plot/sunburst/render.d.ts +2 -2
  346. package/dist/plot/sunburst/render.js +47 -22
  347. package/dist/plot/sunburst/sunburst.d.ts +5 -1
  348. package/dist/plot/sunburst/sunburst.js +14 -4
  349. package/dist/plot/treemap/Treemap.svelte +907 -0
  350. package/dist/plot/treemap/Treemap.svelte.d.ts +84 -0
  351. package/dist/plot/treemap/index.d.ts +3 -0
  352. package/dist/plot/treemap/index.js +4 -0
  353. package/dist/plot/treemap/treemap.d.ts +26 -0
  354. package/dist/plot/treemap/treemap.js +99 -0
  355. package/dist/rdf/RdfPlot.svelte +22 -26
  356. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  357. package/dist/rdf/calc-rdf.js +4 -8
  358. package/dist/sanitize.js +14 -3
  359. package/dist/scene/SceneCamera.svelte +62 -0
  360. package/dist/scene/SceneCamera.svelte.d.ts +19 -0
  361. package/dist/scene/bind-renderer.svelte.d.ts +2 -0
  362. package/dist/scene/bind-renderer.svelte.js +22 -0
  363. package/dist/scene/index.d.ts +4 -0
  364. package/dist/scene/index.js +5 -0
  365. package/dist/scene/props.js +52 -0
  366. package/dist/scene/types.d.ts +26 -0
  367. package/dist/scene/types.js +1 -0
  368. package/dist/settings.d.ts +33 -11
  369. package/dist/settings.js +136 -51
  370. package/dist/spectral/Bands.svelte +231 -237
  371. package/dist/spectral/Bands.svelte.d.ts +3 -2
  372. package/dist/spectral/BandsAndDos.svelte +29 -29
  373. package/dist/spectral/BrillouinBandsDos.svelte +21 -29
  374. package/dist/spectral/Dos.svelte +75 -77
  375. package/dist/spectral/Dos.svelte.d.ts +2 -1
  376. package/dist/spectral/helpers.d.ts +9 -9
  377. package/dist/spectral/helpers.js +66 -70
  378. package/dist/state.svelte.d.ts +0 -7
  379. package/dist/state.svelte.js +5 -24
  380. package/dist/structure/Arrow.svelte +6 -21
  381. package/dist/structure/ArrowInstances.svelte +160 -0
  382. package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
  383. package/dist/structure/AtomLegend.svelte +115 -75
  384. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  385. package/dist/structure/Bond.svelte +31 -23
  386. package/dist/structure/CanvasTooltip.svelte +16 -3
  387. package/dist/structure/CellSelect.svelte +22 -29
  388. package/dist/structure/CellSelect.svelte.d.ts +2 -1
  389. package/dist/structure/Cylinder.svelte +24 -40
  390. package/dist/structure/InstancedAtoms.svelte +114 -0
  391. package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
  392. package/dist/structure/Lattice.svelte +85 -149
  393. package/dist/structure/SiteLabels.svelte +122 -0
  394. package/dist/structure/SiteLabels.svelte.d.ts +18 -0
  395. package/dist/structure/Structure.svelte +725 -735
  396. package/dist/structure/Structure.svelte.d.ts +8 -16
  397. package/dist/structure/StructureCarousel.svelte +630 -0
  398. package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
  399. package/dist/structure/StructureControls.svelte +298 -325
  400. package/dist/structure/StructureControls.svelte.d.ts +5 -3
  401. package/dist/structure/StructureExportPane.svelte +62 -168
  402. package/dist/structure/StructureExportPane.svelte.d.ts +4 -5
  403. package/dist/structure/StructureInfoPane.svelte +77 -69
  404. package/dist/structure/StructureInfoPane.svelte.d.ts +6 -6
  405. package/dist/structure/StructureScene.svelte +758 -600
  406. package/dist/structure/StructureScene.svelte.d.ts +24 -20
  407. package/dist/structure/StructureViewport.svelte +386 -0
  408. package/dist/structure/StructureViewport.svelte.d.ts +63 -0
  409. package/dist/structure/atom-label-placement.d.ts +18 -0
  410. package/dist/structure/atom-label-placement.js +115 -0
  411. package/dist/structure/atom-properties.d.ts +3 -1
  412. package/dist/structure/atom-properties.js +115 -54
  413. package/dist/structure/bond-order-perception.js +2 -4
  414. package/dist/structure/bonding.d.ts +12 -2
  415. package/dist/structure/bonding.js +172 -73
  416. package/dist/structure/edit-history.d.ts +6 -0
  417. package/dist/structure/edit-history.js +27 -0
  418. package/dist/structure/export.d.ts +25 -4
  419. package/dist/structure/export.js +103 -153
  420. package/dist/structure/format-detect.d.ts +1 -0
  421. package/dist/structure/format-detect.js +22 -0
  422. package/dist/structure/geometry.d.ts +9 -0
  423. package/dist/structure/geometry.js +27 -0
  424. package/dist/structure/index.d.ts +18 -1
  425. package/dist/structure/index.js +15 -2
  426. package/dist/structure/measure.d.ts +1 -1
  427. package/dist/structure/measure.js +6 -12
  428. package/dist/structure/parse.d.ts +5 -3
  429. package/dist/structure/parse.js +551 -567
  430. package/dist/structure/partial-occupancy.d.ts +0 -1
  431. package/dist/structure/partial-occupancy.js +5 -3
  432. package/dist/structure/pbc.d.ts +1 -1
  433. package/dist/structure/pbc.js +204 -51
  434. package/dist/structure/polyhedra.d.ts +40 -0
  435. package/dist/structure/polyhedra.js +587 -0
  436. package/dist/structure/site.d.ts +4 -0
  437. package/dist/structure/site.js +1 -0
  438. package/dist/structure/supercell.d.ts +1 -2
  439. package/dist/structure/supercell.js +10 -15
  440. package/dist/structure/validation.js +5 -6
  441. package/dist/symmetry/SymmetryElementControls.svelte +69 -0
  442. package/dist/symmetry/SymmetryElementControls.svelte.d.ts +9 -0
  443. package/dist/symmetry/SymmetryElements.svelte +350 -0
  444. package/dist/symmetry/SymmetryElements.svelte.d.ts +24 -0
  445. package/dist/symmetry/SymmetryStats.svelte +142 -49
  446. package/dist/symmetry/WyckoffTable.svelte +58 -16
  447. package/dist/symmetry/WyckoffTable.svelte.d.ts +3 -0
  448. package/dist/symmetry/cell-transform.js +8 -14
  449. package/dist/symmetry/index.d.ts +15 -4
  450. package/dist/symmetry/index.js +308 -81
  451. package/dist/symmetry/spacegroups.d.ts +5 -1
  452. package/dist/symmetry/spacegroups.js +18 -3
  453. package/dist/symmetry/symmetry-elements.d.ts +33 -0
  454. package/dist/symmetry/symmetry-elements.js +521 -0
  455. package/dist/symmetry/wyckoff-db.d.ts +9 -0
  456. package/dist/symmetry/wyckoff-db.js +87 -0
  457. package/dist/table/HeatmapTable.svelte +1104 -378
  458. package/dist/table/HeatmapTable.svelte.d.ts +12 -2
  459. package/dist/table/ToggleMenu.svelte +5 -12
  460. package/dist/table/index.d.ts +21 -6
  461. package/dist/table/index.js +34 -21
  462. package/dist/theme/ThemeControl.svelte +16 -8
  463. package/dist/theme/index.d.ts +1 -5
  464. package/dist/theme/index.js +4 -10
  465. package/dist/theme/themes.mjs +14 -7
  466. package/dist/tooltip/KCoords.svelte +4 -1
  467. package/dist/tooltip/TooltipContent.svelte +2 -5
  468. package/dist/trajectory/Trajectory.svelte +556 -352
  469. package/dist/trajectory/Trajectory.svelte.d.ts +10 -22
  470. package/dist/trajectory/TrajectoryError.svelte +11 -8
  471. package/dist/trajectory/TrajectoryExportPane.svelte +28 -54
  472. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +4 -5
  473. package/dist/trajectory/TrajectoryInfoPane.svelte +88 -99
  474. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +3 -2
  475. package/dist/trajectory/constants.js +6 -2
  476. package/dist/trajectory/extract.js +73 -71
  477. package/dist/trajectory/format-detect.d.ts +0 -1
  478. package/dist/trajectory/format-detect.js +13 -17
  479. package/dist/trajectory/frame-reader.d.ts +2 -1
  480. package/dist/trajectory/frame-reader.js +74 -136
  481. package/dist/trajectory/helpers.d.ts +12 -2
  482. package/dist/trajectory/helpers.js +68 -37
  483. package/dist/trajectory/index.d.ts +1 -0
  484. package/dist/trajectory/index.js +3 -0
  485. package/dist/trajectory/parse/ase.d.ts +9 -1
  486. package/dist/trajectory/parse/ase.js +47 -32
  487. package/dist/trajectory/parse/diagnostics.d.ts +3 -0
  488. package/dist/trajectory/parse/diagnostics.js +14 -0
  489. package/dist/trajectory/parse/h5-utils.d.ts +13 -0
  490. package/dist/trajectory/parse/h5-utils.js +109 -0
  491. package/dist/trajectory/parse/hdf5.d.ts +1 -1
  492. package/dist/trajectory/parse/hdf5.js +116 -106
  493. package/dist/trajectory/parse/index.d.ts +3 -4
  494. package/dist/trajectory/parse/index.js +68 -119
  495. package/dist/trajectory/parse/lammps.d.ts +0 -2
  496. package/dist/trajectory/parse/lammps.js +14 -16
  497. package/dist/trajectory/parse/pymatgen.d.ts +2 -0
  498. package/dist/trajectory/parse/pymatgen.js +74 -0
  499. package/dist/trajectory/parse/vasp.js +13 -9
  500. package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
  501. package/dist/trajectory/parse/vaspout-electronic.js +207 -0
  502. package/dist/trajectory/parse/vaspout-h5.d.ts +5 -0
  503. package/dist/trajectory/parse/vaspout-h5.js +284 -0
  504. package/dist/trajectory/parse/xyz.d.ts +9 -21
  505. package/dist/trajectory/parse/xyz.js +38 -39
  506. package/dist/trajectory/plotting.d.ts +8 -10
  507. package/dist/trajectory/plotting.js +102 -127
  508. package/dist/utils.d.ts +4 -0
  509. package/dist/utils.js +8 -1
  510. package/dist/xrd/XrdPlot.svelte +56 -85
  511. package/dist/xrd/broadening.d.ts +2 -1
  512. package/dist/xrd/broadening.js +2 -1
  513. package/dist/xrd/calc-xrd.js +8 -15
  514. package/dist/xrd/index.d.ts +2 -2
  515. package/dist/xrd/parse.d.ts +0 -1
  516. package/dist/xrd/parse.js +56 -73
  517. package/package.json +77 -36
  518. package/dist/api/mp.d.ts +0 -6
  519. package/dist/api/mp.js +0 -22
  520. package/dist/element/data.json +0 -11864
  521. package/dist/fermi-surface/marching-cubes.d.ts +0 -2
  522. package/dist/fermi-surface/marching-cubes.js +0 -2
  523. package/dist/plot/core/hover-lock.svelte.d.ts +0 -14
  524. package/dist/plot/core/hover-lock.svelte.js +0 -45
  525. package/dist/plot/sunburst/SunburstControls.svelte +0 -200
  526. package/dist/structure/label-placement.d.ts +0 -14
  527. package/dist/structure/label-placement.js +0 -72
@@ -3,10 +3,6 @@ import * as math from '../math';
3
3
  import { Vector3 } from 'three';
4
4
  import { ConvexGeometry } from 'three/examples/jsm/geometries/ConvexGeometry.js';
5
5
  const TOL = 1e-8;
6
- const normalize = (vec) => {
7
- const mag = Math.hypot(...vec);
8
- return mag < 1e-10 ? [0, 0, 0] : [vec[0] / mag, vec[1] / mag, vec[2] / mag];
9
- };
10
6
  // Check if rotation matrix is identity
11
7
  const is_identity_rotation = (rot) => rot.every((row, idx) => row.every((val, jdx) => Math.abs(val - (idx === jdx ? 1 : 0)) < TOL));
12
8
  // Extract unique point group rotation matrices from space group operations.
@@ -26,20 +22,6 @@ export function extract_point_group_from_operations(operations) {
26
22
  }
27
23
  return unique_rotations;
28
24
  }
29
- // Multiply two 3x3 matrices: C = A · B
30
- function mat3x3_multiply(A, B) {
31
- const result = [
32
- [0, 0, 0],
33
- [0, 0, 0],
34
- [0, 0, 0],
35
- ];
36
- for (let row = 0; row < 3; row++) {
37
- for (let col = 0; col < 3; col++) {
38
- result[row][col] = A[row][0] * B[0][col] + A[row][1] * B[1][col] + A[row][2] * B[2][col];
39
- }
40
- }
41
- return result;
42
- }
43
25
  // Convert fractional rotation W to Cartesian k-space rotation. k_lattice stores reciprocal
44
26
  // vectors as ROWS (k_cart = Bᵀ·q) and reciprocal fractional rotation is q' = W^{-T}·q, so
45
27
  // R_cart = Bᵀ·W^{-T}·B^{-T}. For non-orthogonal lattices W^{-1} ≠ Wᵀ, so the transpose matters.
@@ -48,7 +30,7 @@ export function fractional_to_cartesian_rotation(W, k_lattice) {
48
30
  const B_T = math.transpose_3x3_matrix(k_lattice);
49
31
  const W_inv_T = math.transpose_3x3_matrix(math.matrix_inverse_3x3(W));
50
32
  // R_cart = Bᵀ · W^{-T} · B^{-T}
51
- return mat3x3_multiply(mat3x3_multiply(B_T, W_inv_T), math.matrix_inverse_3x3(B_T));
33
+ return math.dot(math.dot(B_T, W_inv_T), math.matrix_inverse_3x3(B_T));
52
34
  }
53
35
  catch {
54
36
  // Fallback to identity if inversion fails (shouldn't happen for valid rotations)
@@ -141,7 +123,11 @@ max_planes_by_order = { 1: 26, 2: 80, 3: 150 }) {
141
123
  if (idx === center_idx)
142
124
  return null;
143
125
  const dist_sq = pt[0] ** 2 + pt[1] ** 2 + pt[2] ** 2;
144
- return { normal: normalize(pt), dist: Math.sqrt(dist_sq) / 2, dist_sq };
126
+ return {
127
+ normal: math.normalize_vec(pt, [0, 0, 0]),
128
+ dist: Math.sqrt(dist_sq) / 2,
129
+ dist_sq,
130
+ };
145
131
  })
146
132
  .filter((plane) => plane !== null)
147
133
  .sort((a, b) => a.dist_sq - b.dist_sq)
@@ -231,7 +217,7 @@ export function compute_convex_hull(vertices, edge_sharp_angle_deg = 5) {
231
217
  // Compute face normals and build edge-to-face adjacency
232
218
  const face_normals = faces.map((face) => {
233
219
  const [v0, v1, v2] = face.slice(0, 3).map((vertex_idx) => unique_verts[vertex_idx]);
234
- return normalize(math.cross_3d(math.subtract(v1, v0), math.subtract(v2, v0)));
220
+ return math.normalize_vec(math.cross_3d(math.subtract(v1, v0), math.subtract(v2, v0)), [0, 0, 0]);
235
221
  });
236
222
  const edge_to_faces = new Map();
237
223
  faces.forEach((face, face_idx) => {
@@ -277,51 +263,72 @@ max_planes_by_order = { 1: 26, 2: 80, 3: 150 }) {
277
263
  volume: compute_hull_volume(hull.vertices, hull.faces),
278
264
  };
279
265
  }
280
- // Test points for IBZ plane detection. These are chosen to:
281
- // 1. Avoid common rotation axes (2-fold, 3-fold, 4-fold, 6-fold)
282
- // 2. Span different directions to catch all symmetry operations
283
- // 3. Include a generic point [1,2,3] that lies on no special axis
284
- const IBZ_TEST_POINTS = [
285
- [1, 0, 0],
286
- [0, 1, 0],
287
- [0, 0, 1], // basis vectors (avoid 4-fold axes)
288
- [1, 1, 0],
289
- [1, 0, 1],
290
- [0, 1, 1], // face diagonals (avoid 2-fold axes)
291
- [1, 1, 1], // body diagonal (avoid 3-fold axis)
292
- [1, 2, 3], // generic point on no special axis
266
+ // Generic reference directions for the Dirichlet-domain construction. Irrational-ish
267
+ // component ratios keep them off every rotation axis and mirror plane of crystallographic
268
+ // point groups in practice; the later directions are fallbacks in case a pathological
269
+ // Cartesian orientation pins the first onto a symmetry element.
270
+ export const IBZ_REFERENCE_DIRECTIONS = [
271
+ [1, Math.SQRT2 / 3, Math.E / 7],
272
+ [Math.PI / 5, 1, Math.SQRT1_2 / 4],
273
+ [Math.E / 9, Math.LN2, 1],
293
274
  ];
294
- // Compute clipping planes from point group operations.
295
- // For each non-identity rotation, we define a plane that selects one representative
296
- // from each equivalence class.
275
+ // A reference direction is valid for the Dirichlet construction iff it has a trivial
276
+ // stabilizer: no non-identity operation fixes it (R·t t for every R). Such a direction
277
+ // always exists because the fixed-point sets (rotation axes, mirror planes) have measure
278
+ // zero. Try the curated generic directions first, then deterministic pseudo-random ones,
279
+ // and throw in the (mathematically unreachable) case where none qualify — rather than
280
+ // silently using a non-generic direction, which would drop that operation's clipping
281
+ // plane and inflate the IBZ volume above V_BZ/|G|.
282
+ export function find_ibz_reference_direction(non_identity_ops) {
283
+ const has_trivial_stabilizer = (dir) => non_identity_ops.every((rot) => Math.hypot(...math.subtract(math.mat3x3_vec3_multiply(rot, dir), dir)) > TOL);
284
+ const curated = IBZ_REFERENCE_DIRECTIONS.find(has_trivial_stabilizer);
285
+ if (curated)
286
+ return curated;
287
+ // Park-Miller minstd PRNG (safe-integer arithmetic) keeps the rare fallback
288
+ // reproducible across runs while sampling generic directions
289
+ let seed = 16807;
290
+ const next_component = () => {
291
+ seed = (seed * 16807) % 2147483647;
292
+ return (seed / 2147483647) * 2 - 1;
293
+ };
294
+ for (let attempt = 0; attempt < 128; attempt++) {
295
+ const dir = [next_component(), next_component(), next_component()];
296
+ if (Math.hypot(...dir) > 0.1 && has_trivial_stabilizer(dir))
297
+ return dir;
298
+ }
299
+ throw new Error(`IBZ construction: no generic reference direction found for ${non_identity_ops.length} symmetry operations`);
300
+ }
301
+ // Compute clipping planes from point group operations via the Dirichlet (Voronoi)
302
+ // fundamental-domain construction: pick ONE generic direction t with trivial stabilizer,
303
+ // then for every non-identity operation R keep the half-space x·t ≥ x·(R·t), i.e.
304
+ // (R·t − t)·x ≤ 0. Intersecting all half-spaces with the BZ yields an irreducible wedge
305
+ // of exactly volume(BZ)/|G|. (Using a different reference point per operation — or
306
+ // flipping individual planes — does NOT yield a fundamental domain in general.)
297
307
  export function compute_ibz_clipping_planes(point_group_ops) {
308
+ const non_identity_ops = point_group_ops.filter((rot) => !is_identity_rotation(rot));
309
+ if (non_identity_ops.length === 0)
310
+ return [];
311
+ const ref_dir = find_ibz_reference_direction(non_identity_ops);
298
312
  const planes = [];
299
313
  const seen_normals = new Set();
300
- for (const rot of point_group_ops) {
301
- if (is_identity_rotation(rot))
302
- continue;
303
- for (const test_pt of IBZ_TEST_POINTS) {
304
- const rotated = math.mat3x3_vec3_multiply(rot, test_pt);
305
- const diff = math.subtract(rotated, test_pt);
306
- if (Math.hypot(...diff) < TOL)
307
- continue; // point on rotation axis
308
- const plane_normal = normalize(diff);
309
- const key = plane_normal.map((val) => Math.round(val * 1000)).join(`,`);
310
- const neg_key = plane_normal.map((val) => Math.round(-val * 1000)).join(`,`);
311
- if (!seen_normals.has(key) && !seen_normals.has(neg_key)) {
312
- seen_normals.add(key);
313
- planes.push({ normal: plane_normal, dist: 0 });
314
- }
315
- break;
314
+ for (const rot of non_identity_ops) {
315
+ const rotated = math.mat3x3_vec3_multiply(rot, ref_dir);
316
+ const diff = math.subtract(rotated, ref_dir);
317
+ // ref_dir has a trivial stabilizer, so every op must move it; a zero diff would
318
+ // silently drop a plane and inflate the IBZ — surface it instead
319
+ if (Math.hypot(...diff) < TOL) {
320
+ throw new Error(`IBZ construction: reference direction unexpectedly fixed by an operation`);
321
+ }
322
+ const plane_normal = math.normalize_vec(diff, [0, 0, 0]);
323
+ // NOTE: do NOT merge antiparallel normals — n and −n select opposite half-spaces
324
+ const key = plane_normal.map((val) => Math.round(val * 1e6)).join(`,`);
325
+ if (!seen_normals.has(key)) {
326
+ seen_normals.add(key);
327
+ planes.push({ normal: plane_normal, dist: 0 });
316
328
  }
317
329
  }
318
330
  return planes;
319
331
  }
320
- // Flip a clipping plane to the opposite half-space
321
- const flip_plane = (plane) => ({
322
- normal: math.scale(plane.normal, -1),
323
- dist: -plane.dist,
324
- });
325
332
  // Clip polyhedron vertices by a half-space, adding intersection points where edges cross
326
333
  function clip_polyhedron_by_plane(vertices, faces, plane) {
327
334
  const { normal, dist } = plane;
@@ -350,14 +357,14 @@ function clip_polyhedron_by_plane(vertices, faces, plane) {
350
357
  // Skip if denominator too small (tighter than TOL for numerical stability)
351
358
  if (Math.abs(denom) < 1e-12)
352
359
  continue;
353
- const t = d1 / denom;
360
+ const frac = d1 / denom;
354
361
  // Only add intersection if it's not at an endpoint (which is already kept)
355
- if (t > TOL && t < 1 - TOL) {
362
+ if (frac > TOL && frac < 1 - TOL) {
356
363
  const [v1, v2] = [vertices[i1], vertices[i2]];
357
364
  result.push([
358
- v1[0] + t * (v2[0] - v1[0]),
359
- v1[1] + t * (v2[1] - v1[1]),
360
- v1[2] + t * (v2[2] - v1[2]),
365
+ v1[0] + frac * (v2[0] - v1[0]),
366
+ v1[1] + frac * (v2[1] - v1[1]),
367
+ v1[2] + frac * (v2[2] - v1[2]),
361
368
  ]);
362
369
  }
363
370
  }
@@ -393,21 +400,17 @@ export function compute_irreducible_bz(bz_data, point_group_ops, edge_sharp_angl
393
400
  let current_vertices = [...bz_data.vertices];
394
401
  let current_faces = [...bz_data.faces];
395
402
  for (const plane of clipping_planes) {
396
- // Try clipping with plane, then flipped plane if needed
397
- let clipped_successfully = false;
398
- for (const try_plane of [plane, flip_plane(plane)]) {
399
- const clipped = clip_polyhedron_by_plane(current_vertices, current_faces, try_plane);
400
- const hull = try_build_hull(clipped, edge_sharp_angle_deg);
401
- if (hull) {
402
- current_vertices = hull.vertices;
403
- current_faces = hull.faces;
404
- clipped_successfully = true;
405
- break;
406
- }
403
+ // Planes from the Dirichlet construction are consistently oriented (the kept side
404
+ // n·x 0 always contains the reference direction) so clip directly — flipping a
405
+ // plane would select the wrong half-space and break the fundamental-domain property
406
+ const clipped = clip_polyhedron_by_plane(current_vertices, current_faces, plane);
407
+ const hull = try_build_hull(clipped, edge_sharp_angle_deg);
408
+ if (hull) {
409
+ current_vertices = hull.vertices;
410
+ current_faces = hull.faces;
407
411
  }
408
- // If both orientations failed, vertices unchanged - continue with best effort
409
- if (!clipped_successfully) {
410
- console.warn(`IBZ clipping: plane orientation failed, continuing with current geometry`);
412
+ else {
413
+ console.warn(`IBZ clipping: degenerate clip result, skipping plane`);
411
414
  }
412
415
  }
413
416
  const hull = try_build_hull(current_vertices, edge_sharp_angle_deg);
@@ -0,0 +1,8 @@
1
+ import type { Matrix3x3, Vec3 } from '../math';
2
+ import { BufferGeometry } from 'three';
3
+ export declare function polyhedron_geometry(vertices: Vec3[], faces: number[][]): BufferGeometry | null;
4
+ export declare function k_lattice_inverse(k_lattice: Matrix3x3 | undefined): Matrix3x3 | null;
5
+ export declare const cartesian_to_fractional: (k_lattice_inv: Matrix3x3 | null, cart: Vec3) => Vec3 | null;
6
+ export declare const polyhedron_centroid: (vertices: Vec3[] | undefined) => Vec3;
7
+ export declare const k_space_size: (k_lattice: Matrix3x3 | undefined) => number;
8
+ export declare const default_camera_position: (size: number) => Vec3;
@@ -0,0 +1,57 @@
1
+ import * as math from '../math';
2
+ import { BufferAttribute, BufferGeometry } from 'three';
3
+ // Build a renderable mesh from polyhedron vertices + polygonal faces via fan triangulation with flat per-face normals. Assumes convex faces (true for BZ/IBZ polyhedra); non-convex faces would triangulate incorrectly. Shared by BrillouinZoneScene (BZ + IBZ meshes) and FermiSurfaceScene (BZ overlay). Caller owns disposal.
4
+ export function polyhedron_geometry(vertices, faces) {
5
+ if (faces.length === 0)
6
+ return null;
7
+ const positions = [];
8
+ const normals = [];
9
+ for (const face of faces) {
10
+ if (face.length < 3)
11
+ continue;
12
+ for (let face_idx = 1; face_idx < face.length - 1; face_idx++) {
13
+ const indices = [face[0], face[face_idx], face[face_idx + 1]];
14
+ if (indices.some((idx) => idx < 0 || idx >= vertices.length))
15
+ continue;
16
+ const [vertex_a, vertex_b, vertex_c] = indices.map((idx) => vertices[idx]);
17
+ positions.push(...vertex_a, ...vertex_b, ...vertex_c);
18
+ const edge_ab = math.subtract(vertex_b, vertex_a);
19
+ const edge_ac = math.subtract(vertex_c, vertex_a);
20
+ const face_normal = math.cross_3d(edge_ab, edge_ac);
21
+ const normal_length = Math.hypot(...face_normal);
22
+ const unit_normal = normal_length > 1e-10 ? face_normal.map((coord) => coord / normal_length) : [0, 0, 0];
23
+ normals.push(...unit_normal, ...unit_normal, ...unit_normal);
24
+ }
25
+ }
26
+ // All faces degenerate or out-of-range -> no triangles, so return null instead of an empty geometry
27
+ if (positions.length === 0)
28
+ return null;
29
+ const geometry = new BufferGeometry();
30
+ geometry.setAttribute(`position`, new BufferAttribute(new Float32Array(positions), 3));
31
+ geometry.setAttribute(`normal`, new BufferAttribute(new Float32Array(normals), 3));
32
+ geometry.computeBoundingSphere();
33
+ return geometry;
34
+ }
35
+ // Inverse of the reciprocal lattice for Cartesian -> fractional conversion; null if the lattice is missing or singular
36
+ export function k_lattice_inverse(k_lattice) {
37
+ if (!k_lattice)
38
+ return null;
39
+ try {
40
+ return math.matrix_inverse_3x3(k_lattice);
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ // Convert Cartesian k-coordinates to fractional (reciprocal lattice units); null if the (pre-computed) lattice inverse is unavailable
47
+ export const cartesian_to_fractional = (k_lattice_inv, cart) => k_lattice_inv && math.mat3x3_vec3_multiply(k_lattice_inv, cart);
48
+ // Centroid of polyhedron vertices, used as orbit/rotation target by BZ + Fermi scenes
49
+ export const polyhedron_centroid = (vertices) => vertices?.length
50
+ ? math.scale(vertices.reduce((acc, vert) => math.add(acc, vert), [0, 0, 0]), 1 / vertices.length)
51
+ : [0, 0, 0];
52
+ // Mean reciprocal-lattice vector magnitude: characteristic scene size for camera placement
53
+ // and arrow scaling. Fallback 10 (upper end of typical |b_i| ~ 2pi/a in 1/A) keeps the
54
+ // camera at a sensible distance while no data is loaded.
55
+ export const k_space_size = (k_lattice) => k_lattice ? k_lattice.reduce((sum, vec) => sum + Math.hypot(...vec), 0) / 3 : 10;
56
+ // Default camera position scaled to the scene size
57
+ export const default_camera_position = (size) => [10, 3, 8].map((coord) => coord * Math.max(1, size));
@@ -5,4 +5,6 @@ export { default as BrillouinZoneInfoPane } from './BrillouinZoneInfoPane.svelte
5
5
  export { default as BrillouinZoneScene } from './BrillouinZoneScene.svelte';
6
6
  export { default as BrillouinZoneTooltip } from './BrillouinZoneTooltip.svelte';
7
7
  export * from './compute';
8
+ export * from './geometry';
9
+ export { default as ReciprocalVectors } from './ReciprocalVectors.svelte';
8
10
  export type * from './types';
@@ -5,3 +5,5 @@ export { default as BrillouinZoneInfoPane } from './BrillouinZoneInfoPane.svelte
5
5
  export { default as BrillouinZoneScene } from './BrillouinZoneScene.svelte';
6
6
  export { default as BrillouinZoneTooltip } from './BrillouinZoneTooltip.svelte';
7
7
  export * from './compute';
8
+ export * from './geometry';
9
+ export { default as ReciprocalVectors } from './ReciprocalVectors.svelte';
@@ -1,4 +1,4 @@
1
- import type { Matrix3x3, Point2D, Vec3 } from '../math';
1
+ import type { Matrix3x3, Point2D, Vec2, Vec3 } from '../math';
2
2
  import type { Crystal } from '../structure';
3
3
  import type { TooltipConfig, TooltipProp } from '../tooltip';
4
4
  export type BZHoverData = {
@@ -38,6 +38,6 @@ export type BrillouinZoneProps = {
38
38
  show_vectors?: boolean;
39
39
  };
40
40
  export type ConvexHullData = Pick<BZMeshData, `vertices` | `faces`> & {
41
- edges: [number, number][];
41
+ edges: Vec2[];
42
42
  };
43
43
  export {};
@@ -9,11 +9,7 @@
9
9
  import ChemPotDiagram2D from './ChemPotDiagram2D.svelte'
10
10
  import ChemPotDiagram3D from './ChemPotDiagram3D.svelte'
11
11
  import { get_ternary_combinations } from './compute'
12
- import type {
13
- ChemPotDiagramConfig,
14
- ChemPotHoverInfo,
15
- ChemPotHoverInfo3D,
16
- } from './types'
12
+ import type { ChemPotDiagramConfig, ChemPotHoverInfo, ChemPotHoverInfo3D } from './types'
17
13
  import { CHEMPOT_DEFAULTS } from './types'
18
14
  import { to_error } from '../utils'
19
15
 
@@ -37,27 +33,25 @@
37
33
  // Extract unique elements from all entries (composition keys are element symbols)
38
34
  const all_elements = $derived(
39
35
  [
40
- ...new Set(entries.flatMap((entry) =>
41
- Object.entries(entry.composition)
42
- .filter(([, amount]) => amount > 0)
43
- .map(([element]) => element)
44
- )),
36
+ ...new Set(
37
+ entries.flatMap((entry) =>
38
+ Object.entries(entry.composition)
39
+ .filter(([, amount]) => amount > 0)
40
+ .map(([element]) => element),
41
+ ),
42
+ ),
45
43
  ].toSorted(),
46
44
  )
47
45
 
48
46
  // How many display axes (2 = binary/2D, 3+ = ternary/3D)
49
47
  const display_elements = $derived(config.elements ?? all_elements)
50
48
  const n_display = $derived(display_elements.length)
51
- const show_tooltip = $derived(
52
- config.show_tooltip ?? CHEMPOT_DEFAULTS.show_tooltip,
53
- )
49
+ const show_tooltip = $derived(config.show_tooltip ?? CHEMPOT_DEFAULTS.show_tooltip)
54
50
  const tooltip_detail_level = $derived(
55
51
  config.tooltip_detail_level ?? CHEMPOT_DEFAULTS.tooltip_detail_level,
56
52
  )
57
53
 
58
- const projection_mode = $derived(
59
- config.projection_mode ?? CHEMPOT_DEFAULTS.projection_mode,
60
- )
54
+ const projection_mode = $derived(config.projection_mode ?? CHEMPOT_DEFAULTS.projection_mode)
61
55
  // For quaternary+ in grid mode, generate all C(n,3) ternary projections
62
56
  // Uses display_elements (not all_elements) so config.elements scopes the grid
63
57
  const ternary_combos = $derived(
@@ -81,25 +75,32 @@
81
75
  if (!show_grid) return
82
76
  let cancelled = false
83
77
  compute_chempot_async(entries, { ...config, elements: ternary_combos[0] })
84
- .then(() => { if (!cancelled) grid_cache_ready = true })
78
+ .then(() => {
79
+ if (!cancelled) grid_cache_ready = true
80
+ })
85
81
  .catch((err) => {
86
82
  if (cancelled) return
87
83
  console.error(`Grid precompute failed:`, err)
88
84
  grid_error = to_error(err).message
89
85
  })
90
- return () => { cancelled = true }
86
+ return () => {
87
+ cancelled = true
88
+ }
91
89
  })
92
- const is_hover_info_3d = (value: ChemPotHoverInfo | null): value is ChemPotHoverInfo3D => value?.view === `3d`
90
+ const is_hover_info_3d = (value: ChemPotHoverInfo | null): value is ChemPotHoverInfo3D =>
91
+ value?.view === `3d`
93
92
 
94
93
  let tooltip_el = $state<HTMLElement>()
95
94
  const tooltip_pos = $derived.by(() => {
96
95
  const pointer = hover_info?.pointer
97
96
  if (!pointer) return { x: 4, y: 4 }
98
97
  return constrain_tooltip_position(
99
- pointer.x, pointer.y,
98
+ pointer.x,
99
+ pointer.y,
100
100
  tooltip_el?.offsetWidth ?? 200,
101
101
  tooltip_el?.offsetHeight ?? 100,
102
- width, height,
102
+ width,
103
+ height,
103
104
  { offset: 0 },
104
105
  )
105
106
  })
@@ -184,7 +185,9 @@ const is_hover_info_3d = (value: ChemPotHoverInfo | null): value is ChemPotHover
184
185
  style:left="{tooltip_pos.x}px"
185
186
  style:top="{tooltip_pos.y}px"
186
187
  >
187
- <h4>{@html sanitize_html(get_electro_neg_formula(hover_info.formula, false, ``, `.3~s`))}</h4>
188
+ <h4>
189
+ {@html sanitize_html(get_electro_neg_formula(hover_info.formula, false, ``, `.3~s`))}
190
+ </h4>
188
191
  {#if hover_info.view === `2d`}
189
192
  <p>2D domain · Points: {hover_info.n_points}</p>
190
193
  {#if tooltip_detail_level === `detailed`}
@@ -209,8 +212,7 @@ const is_hover_info_3d = (value: ChemPotHoverInfo | null): value is ChemPotHover
209
212
  </p>
210
213
  <p>
211
214
  Entries: {hover_info.matching_entry_count}
212
- {#if hover_info.min_energy_per_atom !== null &&
213
- hover_info.max_energy_per_atom !== null}
215
+ {#if hover_info.min_energy_per_atom !== null && hover_info.max_energy_per_atom !== null}
214
216
  · E/atom: {format_num(hover_info.min_energy_per_atom, `.4~g`)}
215
217
  to {format_num(hover_info.max_energy_per_atom, `.4~g`)} eV
216
218
  {/if}
@@ -224,20 +226,16 @@ const is_hover_info_3d = (value: ChemPotHoverInfo | null): value is ChemPotHover
224
226
  </p>
225
227
  {/each}
226
228
  <p>
227
- Centroid: ({
228
- hover_info.ann_loc.map((value) => format_num(value, `.3~g`)).join(
229
- `, `,
230
- )
231
- })
229
+ Centroid: ({hover_info.ann_loc
230
+ .map((value) => format_num(value, `.3~g`))
231
+ .join(`, `)})
232
232
  </p>
233
233
  {#if hover_info.neighbors.length > 0}
234
234
  <h5 id="neighbors">Neighbors ({hover_info.neighbors.length})</h5>
235
235
  <p>
236
- {
237
- hover_info.neighbors.map((formula) =>
238
- get_electro_neg_formula(formula, true, ``, `.3~s`)
239
- ).join(`, `)
240
- }
236
+ {hover_info.neighbors
237
+ .map((formula) => get_electro_neg_formula(formula, true, ``, `.3~s`))
238
+ .join(`, `)}
241
239
  </p>
242
240
  {/if}
243
241
  {#if hover_info.touches_limits.length > 0}
@@ -295,10 +293,7 @@ const is_hover_info_3d = (value: ChemPotHoverInfo | null): value is ChemPotHover
295
293
  .chempot-tooltip {
296
294
  position: absolute;
297
295
  max-width: min(32rem, 92vw);
298
- background: var(
299
- --tooltip-bg,
300
- light-dark(rgba(255, 255, 255, 0.95), rgba(0, 0, 0, 0.9))
301
- );
296
+ background: var(--tooltip-bg, light-dark(rgba(255, 255, 255, 0.95), rgba(0, 0, 0, 0.9)));
302
297
  color: var(--tooltip-text, var(--text-color, #222));
303
298
  border: 1px solid color-mix(in srgb, currentColor 18%, transparent);
304
299
  border-radius: 6px;
@@ -8,6 +8,6 @@ type $$ComponentProps = {
8
8
  temperature?: number;
9
9
  hover_info?: ChemPotHoverInfo | null;
10
10
  };
11
- declare const ChemPotDiagram: import("svelte").Component<$$ComponentProps, {}, "temperature" | "height" | "width" | "hover_info">;
11
+ declare const ChemPotDiagram: import("svelte").Component<$$ComponentProps, {}, "height" | "width" | "temperature" | "hover_info">;
12
12
  type ChemPotDiagram = ReturnType<typeof ChemPotDiagram>;
13
13
  export default ChemPotDiagram;