matterviz 0.3.7 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/dist/Icon.svelte +7 -4
  2. package/dist/MillerIndexInput.svelte +1 -1
  3. package/dist/api/optimade.js +32 -26
  4. package/dist/app.css +0 -3
  5. package/dist/brillouin/BrillouinZone.svelte +76 -148
  6. package/dist/brillouin/BrillouinZone.svelte.d.ts +6 -14
  7. package/dist/brillouin/BrillouinZoneExportPane.svelte +43 -96
  8. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  9. package/dist/brillouin/BrillouinZoneInfoPane.svelte +9 -32
  10. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +2 -3
  11. package/dist/brillouin/BrillouinZoneScene.svelte +97 -205
  12. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +4 -23
  13. package/dist/brillouin/BrillouinZoneTooltip.svelte +16 -25
  14. package/dist/brillouin/ReciprocalVectors.svelte +39 -0
  15. package/dist/brillouin/ReciprocalVectors.svelte.d.ts +9 -0
  16. package/dist/brillouin/compute.d.ts +2 -0
  17. package/dist/brillouin/compute.js +89 -90
  18. package/dist/brillouin/geometry.d.ts +8 -0
  19. package/dist/brillouin/geometry.js +57 -0
  20. package/dist/brillouin/index.d.ts +2 -0
  21. package/dist/brillouin/index.js +2 -0
  22. package/dist/brillouin/types.d.ts +2 -2
  23. package/dist/chempot-diagram/ChemPotDiagram.svelte +14 -13
  24. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +1 -1
  25. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +109 -203
  26. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +4 -1
  27. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +180 -470
  28. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +7 -1
  29. package/dist/chempot-diagram/async-compute.svelte.js +3 -1
  30. package/dist/chempot-diagram/chempot-worker.js +2 -1
  31. package/dist/chempot-diagram/color.d.ts +3 -6
  32. package/dist/chempot-diagram/color.js +5 -5
  33. package/dist/chempot-diagram/compute.d.ts +4 -4
  34. package/dist/chempot-diagram/compute.js +20 -20
  35. package/dist/chempot-diagram/controls-state.svelte.d.ts +10 -0
  36. package/dist/chempot-diagram/controls-state.svelte.js +42 -0
  37. package/dist/chempot-diagram/export.d.ts +47 -0
  38. package/dist/chempot-diagram/export.js +133 -0
  39. package/dist/chempot-diagram/index.d.ts +1 -0
  40. package/dist/chempot-diagram/index.js +1 -0
  41. package/dist/chempot-diagram/pointer.d.ts +0 -10
  42. package/dist/chempot-diagram/pointer.js +4 -4
  43. package/dist/chempot-diagram/types.d.ts +3 -3
  44. package/dist/colors/index.js +8 -7
  45. package/dist/composition/FormulaFilter.svelte +18 -11
  46. package/dist/composition/PieChart.svelte +11 -10
  47. package/dist/composition/chem-sys.d.ts +8 -0
  48. package/dist/composition/chem-sys.js +86 -0
  49. package/dist/composition/format.js +7 -4
  50. package/dist/composition/index.d.ts +1 -0
  51. package/dist/composition/index.js +1 -0
  52. package/dist/composition/parse.d.ts +0 -1
  53. package/dist/composition/parse.js +41 -31
  54. package/dist/controls.d.ts +1 -0
  55. package/dist/controls.js +0 -1
  56. package/dist/convex-hull/ConvexHull.svelte +8 -10
  57. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -4
  58. package/dist/convex-hull/ConvexHull2D.svelte +106 -185
  59. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  60. package/dist/convex-hull/ConvexHull3D.svelte +179 -683
  61. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  62. package/dist/convex-hull/ConvexHull4D.svelte +183 -687
  63. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  64. package/dist/convex-hull/ConvexHullChrome.svelte +268 -0
  65. package/dist/convex-hull/ConvexHullChrome.svelte.d.ts +30 -0
  66. package/dist/convex-hull/ConvexHullControls.svelte +88 -7
  67. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +7 -6
  68. package/dist/convex-hull/ConvexHullInfoPane.svelte +18 -5
  69. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +6 -5
  70. package/dist/convex-hull/ConvexHullStats.svelte +36 -175
  71. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +3 -1
  72. package/dist/convex-hull/ConvexHullTooltip.svelte +11 -2
  73. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +2 -1
  74. package/dist/convex-hull/GasPressureControls.svelte +4 -4
  75. package/dist/convex-hull/TemperatureSlider.svelte +2 -2
  76. package/dist/convex-hull/barycentric-coords.d.ts +2 -4
  77. package/dist/convex-hull/barycentric-coords.js +6 -33
  78. package/dist/convex-hull/canvas-interactions.svelte.d.ts +79 -0
  79. package/dist/convex-hull/canvas-interactions.svelte.js +278 -0
  80. package/dist/convex-hull/demo-temperature.d.ts +1 -1
  81. package/dist/convex-hull/demo-temperature.js +20 -22
  82. package/dist/convex-hull/gas-thermodynamics.d.ts +2 -2
  83. package/dist/convex-hull/gas-thermodynamics.js +22 -30
  84. package/dist/convex-hull/helpers.d.ts +42 -7
  85. package/dist/convex-hull/helpers.js +171 -78
  86. package/dist/convex-hull/hull-state.svelte.d.ts +44 -0
  87. package/dist/convex-hull/hull-state.svelte.js +124 -0
  88. package/dist/convex-hull/index.d.ts +10 -8
  89. package/dist/convex-hull/index.js +7 -2
  90. package/dist/convex-hull/thermodynamics.js +136 -960
  91. package/dist/convex-hull/types.d.ts +13 -5
  92. package/dist/convex-hull/types.js +12 -0
  93. package/dist/coordination/CoordinationBarPlot.svelte +27 -34
  94. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  95. package/dist/element/BohrAtom.svelte +2 -1
  96. package/dist/element/index.d.ts +4 -0
  97. package/dist/element/index.js +18 -0
  98. package/dist/feedback/DragOverlay.svelte +3 -1
  99. package/dist/feedback/DragOverlay.svelte.d.ts +1 -0
  100. package/dist/feedback/StatusMessage.svelte +13 -3
  101. package/dist/fermi-surface/FermiSlice.svelte +13 -5
  102. package/dist/fermi-surface/FermiSurface.svelte +78 -151
  103. package/dist/fermi-surface/FermiSurface.svelte.d.ts +5 -14
  104. package/dist/fermi-surface/FermiSurfaceControls.svelte +1 -1
  105. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  106. package/dist/fermi-surface/FermiSurfaceScene.svelte +72 -221
  107. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +3 -23
  108. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +8 -34
  109. package/dist/fermi-surface/compute.js +67 -66
  110. package/dist/fermi-surface/export.js +6 -16
  111. package/dist/fermi-surface/index.d.ts +0 -1
  112. package/dist/fermi-surface/index.js +0 -1
  113. package/dist/fermi-surface/parse.d.ts +1 -1
  114. package/dist/fermi-surface/parse.js +71 -79
  115. package/dist/fermi-surface/types.d.ts +3 -2
  116. package/dist/heatmap-matrix/HeatmapMatrix.svelte +69 -52
  117. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +4 -3
  118. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +3 -2
  119. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +5 -5
  120. package/dist/heatmap-matrix/index.d.ts +3 -2
  121. package/dist/heatmap-matrix/index.js +1 -1
  122. package/dist/index.d.ts +1 -0
  123. package/dist/index.js +1 -0
  124. package/dist/io/ExportPane.svelte +166 -0
  125. package/dist/io/ExportPane.svelte.d.ts +17 -0
  126. package/dist/io/decompress.js +5 -4
  127. package/dist/io/export.d.ts +9 -5
  128. package/dist/io/export.js +77 -51
  129. package/dist/io/fetch.d.ts +2 -1
  130. package/dist/io/fetch.js +5 -1
  131. package/dist/io/file-drop.d.ts +8 -1
  132. package/dist/io/file-drop.js +48 -36
  133. package/dist/io/index.d.ts +2 -0
  134. package/dist/io/index.js +10 -0
  135. package/dist/io/types.d.ts +13 -0
  136. package/dist/io/url-drop.js +64 -33
  137. package/dist/isosurface/parse.js +52 -51
  138. package/dist/isosurface/slice.js +5 -4
  139. package/dist/isosurface/types.js +1 -1
  140. package/dist/keyboard.d.ts +3 -0
  141. package/dist/keyboard.js +23 -0
  142. package/dist/labels.d.ts +1 -1
  143. package/dist/labels.js +9 -8
  144. package/dist/layout/FullscreenButton.svelte +33 -0
  145. package/dist/layout/FullscreenButton.svelte.d.ts +10 -0
  146. package/dist/layout/FullscreenToggle.svelte +8 -14
  147. package/dist/layout/PropertyFilter.svelte +3 -2
  148. package/dist/layout/SettingsSection.svelte +1 -1
  149. package/dist/layout/ViewerChrome.svelte +116 -0
  150. package/dist/layout/ViewerChrome.svelte.d.ts +17 -0
  151. package/dist/layout/fullscreen.d.ts +4 -0
  152. package/dist/layout/fullscreen.svelte.d.ts +8 -0
  153. package/dist/layout/fullscreen.svelte.js +37 -0
  154. package/dist/layout/index.d.ts +3 -0
  155. package/dist/layout/index.js +3 -0
  156. package/dist/layout/json-tree/JsonNode.svelte +1 -1
  157. package/dist/layout/json-tree/JsonTree.svelte +2 -2
  158. package/dist/layout/json-tree/utils.js +5 -4
  159. package/dist/marching-cubes.js +8 -13
  160. package/dist/math.d.ts +12 -4
  161. package/dist/math.js +42 -30
  162. package/dist/overlays/DraggablePane.svelte +4 -4
  163. package/dist/overlays/index.d.ts +4 -0
  164. package/dist/periodic-table/PeriodicTable.svelte +27 -15
  165. package/dist/periodic-table/PropertySelect.svelte +1 -0
  166. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +9 -3
  167. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +1 -1
  168. package/dist/phase-diagram/PhaseDiagramControls.svelte +3 -2
  169. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +4 -3
  170. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +4 -2
  171. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +2 -3
  172. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +47 -132
  173. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +3 -4
  174. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +1 -1
  175. package/dist/phase-diagram/build-diagram.js +2 -2
  176. package/dist/phase-diagram/colors.js +1 -1
  177. package/dist/phase-diagram/parse.d.ts +2 -1
  178. package/dist/phase-diagram/parse.js +6 -5
  179. package/dist/phase-diagram/types.d.ts +1 -1
  180. package/dist/phase-diagram/utils.d.ts +3 -3
  181. package/dist/phase-diagram/utils.js +8 -12
  182. package/dist/plot/{BarPlot.svelte → bar/BarPlot.svelte} +246 -841
  183. package/dist/plot/{BarPlot.svelte.d.ts → bar/BarPlot.svelte.d.ts} +8 -16
  184. package/dist/plot/{BarPlotControls.svelte → bar/BarPlotControls.svelte} +6 -5
  185. package/dist/plot/{BarPlotControls.svelte.d.ts → bar/BarPlotControls.svelte.d.ts} +3 -3
  186. package/dist/plot/{SpacegroupBarPlot.svelte → bar/SpacegroupBarPlot.svelte} +8 -7
  187. package/dist/plot/{SpacegroupBarPlot.svelte.d.ts → bar/SpacegroupBarPlot.svelte.d.ts} +1 -1
  188. package/dist/plot/bar/data.d.ts +40 -0
  189. package/dist/plot/bar/data.js +154 -0
  190. package/dist/plot/bar/geometry.d.ts +39 -0
  191. package/dist/plot/bar/geometry.js +60 -0
  192. package/dist/plot/bar/index.d.ts +3 -0
  193. package/dist/plot/bar/index.js +3 -0
  194. package/dist/plot/box/BoxPlot.svelte +1292 -0
  195. package/dist/plot/box/BoxPlot.svelte.d.ts +95 -0
  196. package/dist/plot/box/BoxPlotControls.svelte +109 -0
  197. package/dist/plot/box/BoxPlotControls.svelte.d.ts +19 -0
  198. package/dist/plot/box/Violin.svelte +14 -0
  199. package/dist/plot/box/Violin.svelte.d.ts +70 -0
  200. package/dist/plot/box/box-plot.d.ts +56 -0
  201. package/dist/plot/box/box-plot.js +129 -0
  202. package/dist/plot/box/index.d.ts +5 -0
  203. package/dist/plot/box/index.js +5 -0
  204. package/dist/plot/box/kde.d.ts +17 -0
  205. package/dist/plot/box/kde.js +160 -0
  206. package/dist/plot/box/quantile.d.ts +3 -0
  207. package/dist/plot/box/quantile.js +53 -0
  208. package/dist/plot/{auto-place.d.ts → core/auto-place.d.ts} +1 -1
  209. package/dist/plot/{auto-place.js → core/auto-place.js} +6 -3
  210. package/dist/plot/core/axis-utils.d.ts +46 -0
  211. package/dist/plot/core/axis-utils.js +110 -0
  212. package/dist/plot/{AxisLabel.svelte → core/components/AxisLabel.svelte} +2 -2
  213. package/dist/plot/{AxisLabel.svelte.d.ts → core/components/AxisLabel.svelte.d.ts} +1 -1
  214. package/dist/plot/{ColorBar.svelte → core/components/ColorBar.svelte} +41 -38
  215. package/dist/plot/{ColorBar.svelte.d.ts → core/components/ColorBar.svelte.d.ts} +7 -6
  216. package/dist/plot/{ColorScaleSelect.svelte → core/components/ColorScaleSelect.svelte} +4 -3
  217. package/dist/plot/{ColorScaleSelect.svelte.d.ts → core/components/ColorScaleSelect.svelte.d.ts} +2 -2
  218. package/dist/plot/core/components/ControlPane.svelte +46 -0
  219. package/dist/plot/core/components/ControlPane.svelte.d.ts +13 -0
  220. package/dist/plot/{FillArea.svelte → core/components/FillArea.svelte} +17 -6
  221. package/dist/plot/{FillArea.svelte.d.ts → core/components/FillArea.svelte.d.ts} +1 -1
  222. package/dist/plot/{InteractiveAxisLabel.svelte → core/components/InteractiveAxisLabel.svelte} +3 -3
  223. package/dist/plot/{InteractiveAxisLabel.svelte.d.ts → core/components/InteractiveAxisLabel.svelte.d.ts} +2 -2
  224. package/dist/plot/{Line.svelte → core/components/Line.svelte} +33 -15
  225. package/dist/plot/{Line.svelte.d.ts → core/components/Line.svelte.d.ts} +3 -2
  226. package/dist/plot/{PlotAxis.svelte → core/components/PlotAxis.svelte} +9 -6
  227. package/dist/plot/{PlotAxis.svelte.d.ts → core/components/PlotAxis.svelte.d.ts} +5 -3
  228. package/dist/plot/{PlotControls.svelte → core/components/PlotControls.svelte} +17 -29
  229. package/dist/plot/core/components/PlotControls.svelte.d.ts +4 -0
  230. package/dist/plot/{PlotLegend.svelte → core/components/PlotLegend.svelte} +21 -10
  231. package/dist/plot/{PlotLegend.svelte.d.ts → core/components/PlotLegend.svelte.d.ts} +3 -2
  232. package/dist/plot/{PlotTooltip.svelte → core/components/PlotTooltip.svelte} +17 -1
  233. package/dist/plot/{PlotTooltip.svelte.d.ts → core/components/PlotTooltip.svelte.d.ts} +8 -0
  234. package/dist/plot/{PortalSelect.svelte → core/components/PortalSelect.svelte} +11 -7
  235. package/dist/plot/{ReferenceLine.svelte → core/components/ReferenceLine.svelte} +3 -3
  236. package/dist/plot/{ReferenceLine.svelte.d.ts → core/components/ReferenceLine.svelte.d.ts} +1 -1
  237. package/dist/plot/{ReferenceLine3D.svelte → core/components/ReferenceLine3D.svelte} +5 -5
  238. package/dist/plot/{ReferenceLine3D.svelte.d.ts → core/components/ReferenceLine3D.svelte.d.ts} +5 -5
  239. package/dist/plot/{ReferencePlane.svelte → core/components/ReferencePlane.svelte} +8 -8
  240. package/dist/plot/{ReferencePlane.svelte.d.ts → core/components/ReferencePlane.svelte.d.ts} +5 -5
  241. package/dist/plot/{ZeroLines.svelte → core/components/ZeroLines.svelte} +3 -3
  242. package/dist/plot/{ZeroLines.svelte.d.ts → core/components/ZeroLines.svelte.d.ts} +3 -3
  243. package/dist/plot/{ZoomRect.svelte → core/components/ZoomRect.svelte} +1 -1
  244. package/dist/plot/{ZoomRect.svelte.d.ts → core/components/ZoomRect.svelte.d.ts} +1 -1
  245. package/dist/plot/core/components/index.d.ts +17 -0
  246. package/dist/plot/core/components/index.js +17 -0
  247. package/dist/plot/{data-cleaning.d.ts → core/data-cleaning.d.ts} +71 -1
  248. package/dist/plot/{data-cleaning.js → core/data-cleaning.js} +21 -23
  249. package/dist/plot/{data-transform.d.ts → core/data-transform.d.ts} +2 -2
  250. package/dist/plot/{data-transform.js → core/data-transform.js} +3 -3
  251. package/dist/plot/core/fill-utils.d.ts +34 -0
  252. package/dist/plot/core/fill-utils.js +391 -0
  253. package/dist/plot/core/index.d.ts +10 -0
  254. package/dist/plot/core/index.js +11 -0
  255. package/dist/plot/core/interactions.d.ts +39 -0
  256. package/dist/plot/core/interactions.js +209 -0
  257. package/dist/plot/{layout.d.ts → core/layout.d.ts} +1 -0
  258. package/dist/plot/{layout.js → core/layout.js} +16 -8
  259. package/dist/plot/core/pan-zoom.svelte.d.ts +35 -0
  260. package/dist/plot/core/pan-zoom.svelte.js +221 -0
  261. package/dist/plot/core/placed-tween.svelte.d.ts +21 -0
  262. package/dist/plot/core/placed-tween.svelte.js +68 -0
  263. package/dist/plot/{reference-line.d.ts → core/reference-line.d.ts} +11 -11
  264. package/dist/plot/{reference-line.js → core/reference-line.js} +29 -42
  265. package/dist/plot/core/scales.d.ts +40 -0
  266. package/dist/plot/{scales.js → core/scales.js} +94 -93
  267. package/dist/plot/core/svg.d.ts +3 -0
  268. package/dist/plot/core/svg.js +41 -0
  269. package/dist/plot/{types.d.ts → core/types.d.ts} +36 -85
  270. package/dist/plot/{types.js → core/types.js} +1 -1
  271. package/dist/plot/{utils → core/utils}/label-placement.d.ts +3 -3
  272. package/dist/plot/{utils → core/utils}/label-placement.js +3 -3
  273. package/dist/plot/core/utils/series-visibility.d.ts +26 -0
  274. package/dist/plot/{utils → core/utils}/series-visibility.js +29 -2
  275. package/dist/plot/core/utils.d.ts +12 -0
  276. package/dist/plot/core/utils.js +27 -0
  277. package/dist/plot/{Histogram.svelte → histogram/Histogram.svelte} +174 -551
  278. package/dist/plot/{Histogram.svelte.d.ts → histogram/Histogram.svelte.d.ts} +2 -2
  279. package/dist/plot/{HistogramControls.svelte → histogram/HistogramControls.svelte} +6 -6
  280. package/dist/plot/{HistogramControls.svelte.d.ts → histogram/HistogramControls.svelte.d.ts} +4 -4
  281. package/dist/plot/histogram/index.d.ts +2 -0
  282. package/dist/plot/histogram/index.js +2 -0
  283. package/dist/plot/index.d.ts +8 -41
  284. package/dist/plot/index.js +10 -39
  285. package/dist/plot/sankey/Sankey.svelte +697 -0
  286. package/dist/plot/sankey/Sankey.svelte.d.ts +74 -0
  287. package/dist/plot/sankey/SankeyControls.svelte +98 -0
  288. package/dist/plot/sankey/SankeyControls.svelte.d.ts +19 -0
  289. package/dist/plot/sankey/index.d.ts +4 -0
  290. package/dist/plot/sankey/index.js +3 -0
  291. package/dist/plot/sankey/sankey-types.d.ts +42 -0
  292. package/dist/plot/sankey/sankey-types.js +4 -0
  293. package/dist/plot/sankey/sankey.d.ts +52 -0
  294. package/dist/plot/sankey/sankey.js +189 -0
  295. package/dist/plot/{BinnedScatterPlot.svelte → scatter/BinnedScatterPlot.svelte} +64 -64
  296. package/dist/plot/{BinnedScatterPlot.svelte.d.ts → scatter/BinnedScatterPlot.svelte.d.ts} +6 -6
  297. package/dist/plot/{ElementScatter.svelte → scatter/ElementScatter.svelte} +6 -6
  298. package/dist/plot/{ElementScatter.svelte.d.ts → scatter/ElementScatter.svelte.d.ts} +2 -2
  299. package/dist/plot/{ScatterPlot.svelte → scatter/ScatterPlot.svelte} +297 -1008
  300. package/dist/plot/{ScatterPlot.svelte.d.ts → scatter/ScatterPlot.svelte.d.ts} +10 -18
  301. package/dist/plot/{ScatterPlotControls.svelte → scatter/ScatterPlotControls.svelte} +6 -5
  302. package/dist/plot/{ScatterPlotControls.svelte.d.ts → scatter/ScatterPlotControls.svelte.d.ts} +2 -2
  303. package/dist/plot/{ScatterPoint.svelte → scatter/ScatterPoint.svelte} +7 -7
  304. package/dist/plot/{ScatterPoint.svelte.d.ts → scatter/ScatterPoint.svelte.d.ts} +3 -3
  305. package/dist/plot/{adaptive-density.d.ts → scatter/adaptive-density.d.ts} +14 -4
  306. package/dist/plot/{adaptive-density.js → scatter/adaptive-density.js} +46 -20
  307. package/dist/plot/{binned-scatter-types.d.ts → scatter/binned-scatter-types.d.ts} +5 -12
  308. package/dist/plot/scatter/index.d.ts +7 -0
  309. package/dist/plot/scatter/index.js +5 -0
  310. package/dist/plot/scatter/scatter-data.d.ts +19 -0
  311. package/dist/plot/scatter/scatter-data.js +212 -0
  312. package/dist/plot/{ScatterPlot3D.svelte → scatter-3d/ScatterPlot3D.svelte} +25 -34
  313. package/dist/plot/{ScatterPlot3D.svelte.d.ts → scatter-3d/ScatterPlot3D.svelte.d.ts} +9 -17
  314. package/dist/plot/{ScatterPlot3DControls.svelte → scatter-3d/ScatterPlot3DControls.svelte} +14 -14
  315. package/dist/plot/{ScatterPlot3DControls.svelte.d.ts → scatter-3d/ScatterPlot3DControls.svelte.d.ts} +6 -6
  316. package/dist/plot/{ScatterPlot3DScene.svelte → scatter-3d/ScatterPlot3DScene.svelte} +129 -128
  317. package/dist/plot/{ScatterPlot3DScene.svelte.d.ts → scatter-3d/ScatterPlot3DScene.svelte.d.ts} +6 -15
  318. package/dist/plot/{Surface3D.svelte → scatter-3d/Surface3D.svelte} +7 -6
  319. package/dist/plot/{Surface3D.svelte.d.ts → scatter-3d/Surface3D.svelte.d.ts} +5 -4
  320. package/dist/plot/scatter-3d/index.d.ts +4 -0
  321. package/dist/plot/scatter-3d/index.js +4 -0
  322. package/dist/plot/sunburst/Sunburst.svelte +1041 -0
  323. package/dist/plot/sunburst/Sunburst.svelte.d.ts +97 -0
  324. package/dist/plot/sunburst/SunburstControls.svelte +200 -0
  325. package/dist/plot/sunburst/SunburstControls.svelte.d.ts +26 -0
  326. package/dist/plot/sunburst/index.d.ts +4 -0
  327. package/dist/plot/sunburst/index.js +4 -0
  328. package/dist/plot/sunburst/render.d.ts +34 -0
  329. package/dist/plot/sunburst/render.js +122 -0
  330. package/dist/plot/sunburst/sunburst.d.ts +62 -0
  331. package/dist/plot/sunburst/sunburst.js +269 -0
  332. package/dist/rdf/RdfPlot.svelte +2 -1
  333. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  334. package/dist/rdf/calc-rdf.js +11 -24
  335. package/dist/sanitize.js +14 -3
  336. package/dist/scene/SceneCamera.svelte +62 -0
  337. package/dist/scene/SceneCamera.svelte.d.ts +19 -0
  338. package/dist/scene/bind-renderer.svelte.d.ts +2 -0
  339. package/dist/scene/bind-renderer.svelte.js +14 -0
  340. package/dist/scene/index.d.ts +4 -0
  341. package/dist/scene/index.js +5 -0
  342. package/dist/scene/props.js +52 -0
  343. package/dist/scene/types.d.ts +26 -0
  344. package/dist/scene/types.js +1 -0
  345. package/dist/settings.d.ts +79 -3
  346. package/dist/settings.js +321 -1
  347. package/dist/spectral/Bands.svelte +47 -36
  348. package/dist/spectral/Bands.svelte.d.ts +6 -6
  349. package/dist/spectral/BandsAndDos.svelte +23 -25
  350. package/dist/spectral/BrillouinBandsDos.svelte +42 -30
  351. package/dist/spectral/Dos.svelte +15 -23
  352. package/dist/spectral/Dos.svelte.d.ts +4 -3
  353. package/dist/spectral/helpers.d.ts +8 -6
  354. package/dist/spectral/helpers.js +137 -65
  355. package/dist/state.svelte.d.ts +0 -7
  356. package/dist/state.svelte.js +0 -6
  357. package/dist/structure/Arrow.svelte +2 -4
  358. package/dist/structure/AtomLegend.svelte +8 -9
  359. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  360. package/dist/structure/CanvasTooltip.svelte +1 -0
  361. package/dist/structure/CellSelect.svelte +12 -5
  362. package/dist/structure/CellSelect.svelte.d.ts +2 -1
  363. package/dist/structure/Cylinder.svelte +12 -8
  364. package/dist/structure/Cylinder.svelte.d.ts +4 -1
  365. package/dist/structure/Lattice.svelte +2 -2
  366. package/dist/structure/Structure.svelte +365 -423
  367. package/dist/structure/Structure.svelte.d.ts +5 -15
  368. package/dist/structure/StructureControls.svelte +217 -2
  369. package/dist/structure/StructureControls.svelte.d.ts +5 -3
  370. package/dist/structure/StructureExportPane.svelte +54 -156
  371. package/dist/structure/StructureExportPane.svelte.d.ts +4 -5
  372. package/dist/structure/StructureInfoPane.svelte +10 -9
  373. package/dist/structure/StructureInfoPane.svelte.d.ts +5 -5
  374. package/dist/structure/StructureScene.svelte +376 -208
  375. package/dist/structure/StructureScene.svelte.d.ts +22 -20
  376. package/dist/structure/{label-placement.d.ts → atom-label-placement.d.ts} +3 -3
  377. package/dist/structure/{label-placement.js → atom-label-placement.js} +15 -5
  378. package/dist/structure/atom-properties.d.ts +1 -1
  379. package/dist/structure/atom-properties.js +17 -22
  380. package/dist/structure/bond-order-perception.js +3 -5
  381. package/dist/structure/bonding.d.ts +4 -0
  382. package/dist/structure/bonding.js +134 -63
  383. package/dist/structure/export.d.ts +24 -4
  384. package/dist/structure/export.js +89 -143
  385. package/dist/structure/index.d.ts +4 -4
  386. package/dist/structure/index.js +3 -3
  387. package/dist/structure/measure.d.ts +3 -2
  388. package/dist/structure/measure.js +6 -5
  389. package/dist/structure/parse.d.ts +3 -2
  390. package/dist/structure/parse.js +419 -438
  391. package/dist/structure/partial-occupancy.d.ts +0 -1
  392. package/dist/structure/partial-occupancy.js +1 -1
  393. package/dist/structure/pbc.d.ts +1 -1
  394. package/dist/structure/pbc.js +190 -13
  395. package/dist/structure/polyhedra.d.ts +41 -0
  396. package/dist/structure/polyhedra.js +602 -0
  397. package/dist/structure/site.d.ts +4 -0
  398. package/dist/structure/site.js +1 -0
  399. package/dist/structure/supercell.js +3 -2
  400. package/dist/structure/validation.js +5 -6
  401. package/dist/symmetry/SymmetryElementControls.svelte +69 -0
  402. package/dist/symmetry/SymmetryElementControls.svelte.d.ts +9 -0
  403. package/dist/symmetry/SymmetryElements.svelte +354 -0
  404. package/dist/symmetry/SymmetryElements.svelte.d.ts +24 -0
  405. package/dist/symmetry/SymmetryStats.svelte +113 -8
  406. package/dist/symmetry/WyckoffTable.svelte +68 -7
  407. package/dist/symmetry/WyckoffTable.svelte.d.ts +3 -0
  408. package/dist/symmetry/cell-transform.js +7 -14
  409. package/dist/symmetry/index.d.ts +14 -4
  410. package/dist/symmetry/index.js +291 -72
  411. package/dist/symmetry/spacegroups.d.ts +12 -1
  412. package/dist/symmetry/spacegroups.js +63 -14
  413. package/dist/symmetry/symmetry-elements.d.ts +33 -0
  414. package/dist/symmetry/symmetry-elements.js +521 -0
  415. package/dist/symmetry/wyckoff-db.d.ts +9 -0
  416. package/dist/symmetry/wyckoff-db.js +87 -0
  417. package/dist/table/HeatmapTable.svelte +66 -25
  418. package/dist/table/HeatmapTable.svelte.d.ts +1 -1
  419. package/dist/table/index.d.ts +1 -3
  420. package/dist/table/index.js +1 -1
  421. package/dist/theme/index.js +8 -8
  422. package/dist/tooltip/KCoords.svelte +45 -0
  423. package/dist/tooltip/KCoords.svelte.d.ts +8 -0
  424. package/dist/tooltip/index.d.ts +1 -0
  425. package/dist/tooltip/index.js +1 -0
  426. package/dist/trajectory/Trajectory.svelte +123 -100
  427. package/dist/trajectory/Trajectory.svelte.d.ts +11 -22
  428. package/dist/trajectory/TrajectoryExportPane.svelte +17 -25
  429. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +4 -5
  430. package/dist/trajectory/TrajectoryInfoPane.svelte +5 -3
  431. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +3 -2
  432. package/dist/trajectory/constants.js +6 -2
  433. package/dist/trajectory/extract.js +17 -37
  434. package/dist/trajectory/format-detect.d.ts +1 -1
  435. package/dist/trajectory/format-detect.js +27 -19
  436. package/dist/trajectory/frame-reader.d.ts +0 -1
  437. package/dist/trajectory/frame-reader.js +63 -162
  438. package/dist/trajectory/helpers.d.ts +10 -2
  439. package/dist/trajectory/helpers.js +56 -36
  440. package/dist/trajectory/index.js +1 -1
  441. package/dist/trajectory/parse/ase.d.ts +9 -1
  442. package/dist/trajectory/parse/ase.js +47 -32
  443. package/dist/trajectory/parse/diagnostics.d.ts +3 -0
  444. package/dist/trajectory/parse/diagnostics.js +14 -0
  445. package/dist/trajectory/parse/hdf5.js +1 -1
  446. package/dist/trajectory/parse/index.d.ts +1 -1
  447. package/dist/trajectory/parse/index.js +65 -105
  448. package/dist/trajectory/parse/lammps.d.ts +0 -2
  449. package/dist/trajectory/parse/lammps.js +8 -6
  450. package/dist/trajectory/parse/pymatgen.d.ts +2 -0
  451. package/dist/trajectory/parse/pymatgen.js +74 -0
  452. package/dist/trajectory/parse/vasp.js +38 -18
  453. package/dist/trajectory/parse/xyz.d.ts +13 -1
  454. package/dist/trajectory/parse/xyz.js +102 -94
  455. package/dist/trajectory/plotting.d.ts +1 -2
  456. package/dist/trajectory/plotting.js +16 -113
  457. package/dist/utils.d.ts +2 -0
  458. package/dist/utils.js +7 -5
  459. package/dist/xrd/XrdPlot.svelte +16 -30
  460. package/dist/xrd/broadening.d.ts +2 -1
  461. package/dist/xrd/calc-xrd.js +18 -20
  462. package/dist/xrd/index.d.ts +2 -2
  463. package/dist/xrd/parse.js +2 -2
  464. package/package.json +43 -26
  465. package/dist/element/data.json +0 -11864
  466. package/dist/fermi-surface/marching-cubes.d.ts +0 -2
  467. package/dist/fermi-surface/marching-cubes.js +0 -2
  468. package/dist/plot/PlotControls.svelte.d.ts +0 -4
  469. package/dist/plot/axis-utils.d.ts +0 -19
  470. package/dist/plot/axis-utils.js +0 -78
  471. package/dist/plot/defaults.d.ts +0 -19
  472. package/dist/plot/defaults.js +0 -9
  473. package/dist/plot/fill-utils.d.ts +0 -46
  474. package/dist/plot/fill-utils.js +0 -322
  475. package/dist/plot/hover-lock.svelte.d.ts +0 -14
  476. package/dist/plot/hover-lock.svelte.js +0 -46
  477. package/dist/plot/interactions.d.ts +0 -12
  478. package/dist/plot/interactions.js +0 -101
  479. package/dist/plot/scales.d.ts +0 -48
  480. package/dist/plot/svg.d.ts +0 -1
  481. package/dist/plot/svg.js +0 -11
  482. package/dist/plot/utils/series-visibility.d.ts +0 -15
  483. package/dist/plot/utils.d.ts +0 -1
  484. package/dist/plot/utils.js +0 -14
  485. /package/dist/plot/{PortalSelect.svelte.d.ts → core/components/PortalSelect.svelte.d.ts} +0 -0
  486. /package/dist/plot/{binned-scatter-types.js → scatter/binned-scatter-types.js} +0 -0
@@ -1,5 +1,4 @@
1
1
  import type { Site } from './';
2
- export declare const PARTIAL_OCCUPANCY_SLICE_GAP_RAD = 0.001;
3
2
  export type RenderSite = {
4
3
  site_idx: number;
5
4
  site: Site;
@@ -1,4 +1,4 @@
1
- export const PARTIAL_OCCUPANCY_SLICE_GAP_RAD = 1e-3;
1
+ const PARTIAL_OCCUPANCY_SLICE_GAP_RAD = 1e-3;
2
2
  const OCCUPANCY_EPS = 1e-6;
3
3
  const MIN_PHI_LENGTH = 1e-4;
4
4
  const MERGE_DISTANCE_TOLERANCE = 1e-8;
@@ -5,5 +5,5 @@ export declare const wrap_frac_coord: (coord: number) => number;
5
5
  export declare const wrap_to_unit_cell: (frac: Vec3) => Vec3;
6
6
  export declare function find_image_atoms(structure: ParsedStructure, { tolerance }?: {
7
7
  tolerance?: number;
8
- }): [number, Vec3, Vec3][];
8
+ }): [number, Vec3, Vec3, boolean?][];
9
9
  export declare function get_pbc_image_sites(...args: Parameters<typeof find_image_atoms>): ParsedStructure;
@@ -1,6 +1,21 @@
1
1
  import * as math from '../math';
2
+ import { element_lookup, get_majority_element } from './bonding';
3
+ // Distance slack added to the covalent-radii sum when deciding whether a
4
+ // candidate image atom bonds to a base atom (VESTA-like bond search criterion)
5
+ const BOND_SLACK = 0.4; // Å
6
+ // Below this separation two sites are overlapping copies, not a bond (matches
7
+ // the min_bond_dist default in bonding.ts)
8
+ const MIN_BOND_DIST = 0.4; // Å
2
9
  // Wrap a single fractional coordinate to [0, 1), clamping near-1 values to 0
3
10
  // and rounding to 15 digits to suppress floating-point noise.
11
+ // NOTE on epsilon: this is the tightest of three intentionally different wrap
12
+ // helpers. Coordinates here come almost straight from file parsing, so float
13
+ // error is tiny and a 1e-10 snap + toFixed(15) preserves maximal precision.
14
+ // Compare wrap_frac @1e-9 [[src/lib/symmetry/index.ts:80]] (post moyo
15
+ // standardization + matrix transforms) and wrap_point @1e-8
16
+ // [[src/lib/symmetry/symmetry-elements.ts:214]] (feeds symmetry-element dedup
17
+ // keys). Do not unify: loosening this epsilon changes snapping near cell
18
+ // boundaries for parsed structures.
4
19
  export const wrap_frac_coord = (coord) => {
5
20
  const wrapped = coord - Math.floor(coord);
6
21
  if (wrapped >= 1 - 1e-10)
@@ -13,17 +28,23 @@ export const wrap_to_unit_cell = (frac) => [
13
28
  wrap_frac_coord(frac[1]),
14
29
  wrap_frac_coord(frac[2]),
15
30
  ];
31
+ // Trajectory-like data: >10% of atoms far outside the unit cell. Image-atom
32
+ // generation is skipped for such structures.
33
+ const is_scattered_trajectory = (sites) => {
34
+ const atoms_outside_cell = sites.filter(({ abc }) => abc.some((coord) => coord < -0.1 || coord > 1.1));
35
+ return atoms_outside_cell.length > sites.length * 0.1;
36
+ };
37
+ // Cartesian position of fractional coords abc in the given lattice (rows = lattice vectors)
38
+ const frac_to_cart_pos = (abc, lattice_vecs) => math.add(math.scale(lattice_vecs[0], abc[0]), math.scale(lattice_vecs[1], abc[1]), math.scale(lattice_vecs[2], abc[2]));
16
39
  export function find_image_atoms(structure, { tolerance } = {}) {
17
- // Find image atoms for PBC. Returns [atom_idx, image_xyz, image_abc] tuples.
40
+ // Find image atoms for PBC. Returns [atom_idx, image_xyz, image_abc, is_completion?]
41
+ // tuples; is_completion marks phase-2 images that exist only to complete bonds /
42
+ // coordination polyhedra at cell faces (renderers may hide them when neither shows).
18
43
  // Skips image generation for trajectory data with scattered atoms.
19
44
  if (!structure.lattice || !structure.sites || structure.sites.length === 0)
20
45
  return [];
21
- // Skip trajectory data (>10% atoms outside cell)
22
- const atoms_outside_cell = structure.sites.filter(({ abc }) => abc.some((coord) => coord < -0.1 || coord > 1.1));
23
- // Skip image generation for trajectory data (>10% atoms outside cell)
24
- if (atoms_outside_cell.length > structure.sites.length * 0.1) {
46
+ if (is_scattered_trajectory(structure.sites))
25
47
  return [];
26
- }
27
48
  // Check if this is a supercell to correctly identify external boundaries correctly
28
49
  const image_sites = [];
29
50
  const lattice_vecs = structure.lattice.matrix;
@@ -43,11 +64,15 @@ export function find_image_atoms(structure, { tolerance } = {}) {
43
64
  // but fall back to 0.05 fractional tolerance if it does
44
65
  return vec_len > 0 ? PHYSICAL_TOLERANCE / vec_len : 0.05;
45
66
  });
67
+ // Respect per-axis periodicity: no images across non-periodic (vacuum) directions
68
+ const pbc = structure.lattice.pbc ?? [true, true, true];
46
69
  for (const [idx, site] of structure.sites.entries()) {
47
70
  // Find edge dimensions and translation directions
48
71
  const edge_dims = [];
49
72
  // Find boundary dimensions
50
73
  for (let dim = 0; dim < 3; dim++) {
74
+ if (!pbc[dim])
75
+ continue;
51
76
  const coord = site.abc[dim];
52
77
  const dim_tolerance = tolerances[dim];
53
78
  if (Math.abs(coord) < dim_tolerance)
@@ -83,7 +108,7 @@ export function find_image_atoms(structure, { tolerance } = {}) {
83
108
  img_abc[2] === site.abc[2])
84
109
  continue;
85
110
  // Compute xyz from img_abc to ensure consistency
86
- const img_xyz = math.add(math.scale(lattice_vecs[0], img_abc[0]), math.scale(lattice_vecs[1], img_abc[1]), math.scale(lattice_vecs[2], img_abc[2]));
111
+ const img_xyz = frac_to_cart_pos(img_abc, lattice_vecs);
87
112
  // Skip zero-displacement images (should not happen, guards against FP edge cases)
88
113
  const displacement = math.subtract(img_xyz, site.xyz);
89
114
  const displacement_len_sq = displacement.reduce((sum, val) => sum + val * val, 0);
@@ -92,6 +117,156 @@ export function find_image_atoms(structure, { tolerance } = {}) {
92
117
  image_sites.push([idx, img_xyz, img_abc]);
93
118
  }
94
119
  }
120
+ // Phase 2: polyhedra-completing images (VESTA boundary-mode-like). The face
121
+ // tolerance above only catches atoms within ~0.5 Å of a boundary, but bonds
122
+ // reach a covalent-radii sum further: an anion just beyond a cell face may be
123
+ // needed to complete the coordination shell of a cation near that face, so
124
+ // bonds and coordination polyhedra at cell edges come out truncated without it.
125
+ // Phase 2 adds ONLY such anion images: a candidate must qualify as a polyhedron
126
+ // vertex (a non-metal/metalloid - same condition as is_anion_vertex in
127
+ // polyhedra.ts) and be strictly more electronegative than the anchor atom it
128
+ // bonds to. Everything else - elemental metals, intermetallics (incl. multi
129
+ // metal ones like Al-Fe-Ni where EN differs but no polyhedra exist), equal-EN
130
+ // covalent networks, cation copies - gets no phase-2 images, so the default
131
+ // render stays minimal and grows uniformly from all cell surfaces (the phase-1
132
+ // boundary copies above are the only non-anion atoms outside the cell).
133
+ const site_radii = [];
134
+ const site_en = [];
135
+ const site_is_metal = [];
136
+ let max_radius = 0;
137
+ // Minimum electronegativity among potential anchors: a candidate can only ever
138
+ // complete some cation's shell if it's strictly more electronegative than this
139
+ let min_anchor_en = Infinity;
140
+ for (const site of structure.sites) {
141
+ const elem = get_majority_element(site);
142
+ const data = elem === null ? undefined : element_lookup.get(elem);
143
+ const radius = data?.covalent_radius ?? null;
144
+ const en = data?.electronegativity ?? null;
145
+ site_radii.push(radius);
146
+ site_en.push(en);
147
+ site_is_metal.push(data?.metal === true);
148
+ if (radius !== null && radius > max_radius)
149
+ max_radius = radius;
150
+ if (radius !== null && en !== null && en < min_anchor_en)
151
+ min_anchor_en = en;
152
+ }
153
+ const max_bond_dist = 2 * max_radius + BOND_SLACK;
154
+ if (max_bond_dist > BOND_SLACK && min_anchor_en < Infinity) {
155
+ // Perpendicular cell heights: |frac| * height lower-bounds the Cartesian
156
+ // distance along each axis (valid for oblique cells)
157
+ const volume = Math.abs(math.dot(lattice_vecs[0], math.cross_3d(lattice_vecs[1], lattice_vecs[2])));
158
+ // height = volume / opposite-face area. A zero-volume (degenerate) cell has two
159
+ // parallel lattice vectors and ill-defined heights; treat every axis as
160
+ // infinitely tall so the pad logic below adds no images (pad -> 0) instead of
161
+ // dividing by zero. When volume > 0 the vectors are linearly independent, so no
162
+ // pairwise cross product can be zero.
163
+ const heights = volume === 0
164
+ ? [Infinity, Infinity, Infinity]
165
+ : [
166
+ volume / Math.hypot(...math.cross_3d(lattice_vecs[1], lattice_vecs[2])),
167
+ volume / Math.hypot(...math.cross_3d(lattice_vecs[0], lattice_vecs[2])),
168
+ volume / Math.hypot(...math.cross_3d(lattice_vecs[0], lattice_vecs[1])),
169
+ ];
170
+ // Anchor set for the bond test: base atoms plus the phase-1 boundary images
171
+ // (corner/edge/face copies). Anchoring on those too matches VESTA - every
172
+ // displayed boundary cation gets its shell completed (e.g. all 8 corner
173
+ // octahedra in rutile, not just the one at the origin).
174
+ const anchor_positions = structure.sites.map((site) => site.xyz);
175
+ const anchor_radii = [...site_radii];
176
+ const anchor_en = [...site_en];
177
+ for (const [src_idx, img_xyz] of image_sites) {
178
+ anchor_positions.push(img_xyz);
179
+ anchor_radii.push(site_radii[src_idx]);
180
+ anchor_en.push(site_en[src_idx]);
181
+ }
182
+ // Spatial grid over anchors for the bond check
183
+ const grid = new Map();
184
+ const grid_key = (pos) => pos.map((coord) => Math.floor(coord / max_bond_dist)).join(`,`);
185
+ for (const [idx, pos] of anchor_positions.entries()) {
186
+ const key = grid_key(pos);
187
+ const cell = grid.get(key);
188
+ if (cell)
189
+ cell.push(idx);
190
+ else
191
+ grid.set(key, [idx]);
192
+ }
193
+ // True when the candidate (an anion image) bonds a strictly less
194
+ // electronegative anchor, i.e. completes some cation's coordination shell
195
+ const completes_cation_shell = (pos, radius, en) => {
196
+ const [cx, cy, cz] = pos.map((coord) => Math.floor(coord / max_bond_dist));
197
+ for (let dx = -1; dx <= 1; dx++) {
198
+ for (let dy = -1; dy <= 1; dy++) {
199
+ for (let dz = -1; dz <= 1; dz++) {
200
+ for (const anchor_idx of grid.get(`${cx + dx},${cy + dy},${cz + dz}`) ?? []) {
201
+ const anchor_radius = anchor_radii[anchor_idx];
202
+ const anchor_electroneg = anchor_en[anchor_idx];
203
+ if (anchor_radius === null)
204
+ continue;
205
+ if (anchor_electroneg === null || en <= anchor_electroneg)
206
+ continue;
207
+ const dist = math.euclidean_dist(pos, anchor_positions[anchor_idx]);
208
+ if (dist > MIN_BOND_DIST && dist <= radius + anchor_radius + BOND_SLACK) {
209
+ return true;
210
+ }
211
+ }
212
+ }
213
+ }
214
+ }
215
+ return false;
216
+ };
217
+ // Dedupe against phase-1 images via (site, integer shift) keys
218
+ const seen_images = new Set(image_sites.map(([idx, _xyz, img_abc]) => `${idx}|${img_abc
219
+ .map((coord, axis) => Math.round(coord - structure.sites[idx].abc[axis]))
220
+ .join(`,`)}`));
221
+ for (const [idx, site] of structure.sites.entries()) {
222
+ const radius = site_radii[idx];
223
+ const en = site_en[idx];
224
+ // Skip candidates that could never be a polyhedron vertex: metals (e.g.
225
+ // Fe/Ni in Al-Fe-Ni intermetallics, despite their higher EN) and anything
226
+ // not strictly more electronegative than at least one anchor (covers all
227
+ // sites of elemental/equal-EN structures and all cations)
228
+ if (radius === null || en === null || en <= min_anchor_en)
229
+ continue;
230
+ if (site_is_metal[idx])
231
+ continue;
232
+ // Per-axis shifts that could land a copy of this atom within bonding reach
233
+ // of the cell: {0} plus +1/-1 when the atom is within max_bond_dist of the
234
+ // respective boundary
235
+ const axis_shifts = [0, 1, 2].map((axis) => {
236
+ if (!pbc[axis])
237
+ return [0];
238
+ // + face tolerance: anchors (phase-1 images) can sit slightly outside the cell
239
+ const pad = (max_bond_dist + PHYSICAL_TOLERANCE) / heights[axis];
240
+ const shifts = [0];
241
+ if (site.abc[axis] < pad)
242
+ shifts.push(1);
243
+ if (site.abc[axis] > 1 - pad)
244
+ shifts.push(-1);
245
+ return shifts;
246
+ });
247
+ for (const shift_a of axis_shifts[0]) {
248
+ for (const shift_b of axis_shifts[1]) {
249
+ for (const shift_c of axis_shifts[2]) {
250
+ if (shift_a === 0 && shift_b === 0 && shift_c === 0)
251
+ continue;
252
+ const key = `${idx}|${shift_a},${shift_b},${shift_c}`;
253
+ if (seen_images.has(key))
254
+ continue;
255
+ const img_abc = [
256
+ site.abc[0] + shift_a,
257
+ site.abc[1] + shift_b,
258
+ site.abc[2] + shift_c,
259
+ ];
260
+ const img_xyz = frac_to_cart_pos(img_abc, lattice_vecs);
261
+ if (!completes_cation_shell(img_xyz, radius, en))
262
+ continue;
263
+ seen_images.add(key);
264
+ image_sites.push([idx, img_xyz, img_abc, true]);
265
+ }
266
+ }
267
+ }
268
+ }
269
+ }
95
270
  return image_sites;
96
271
  }
97
272
  // Return structure with image atoms added
@@ -100,23 +275,25 @@ export function get_pbc_image_sites(...args) {
100
275
  if (!structure || !structure.sites || structure.sites.length === 0) {
101
276
  return structure;
102
277
  }
103
- // Check for trajectory data
104
- const atoms_outside_cell = structure.sites.filter((site) => site.abc.some((coord) => coord < -0.1 || coord > 1.1));
105
278
  // Return trajectory data unchanged
106
- if (atoms_outside_cell.length > structure.sites.length * 0.1) {
279
+ if (is_scattered_trajectory(structure.sites))
107
280
  return structure;
108
- }
109
281
  // Add image atoms to regular crystal structures
110
282
  const image_sites = find_image_atoms(...args);
111
283
  const imaged_struct = { ...structure, sites: [...structure.sites] };
112
284
  // Add image atoms as new sites using provided (xyz, abc) from find_image_atoms
113
- for (const [site_idx, img_xyz, img_abc] of image_sites) {
285
+ for (const [site_idx, img_xyz, img_abc, is_completion] of image_sites) {
114
286
  const orig_site = structure.sites[site_idx];
115
287
  imaged_struct.sites.push({
116
288
  ...orig_site,
117
289
  abc: img_abc,
118
290
  xyz: img_xyz,
119
- properties: { ...orig_site.properties, orig_site_idx: site_idx },
291
+ properties: {
292
+ ...orig_site.properties,
293
+ orig_site_idx: site_idx,
294
+ // phase-2 images only complete bonds/polyhedra - hidden when neither renders
295
+ ...(is_completion ? { completion_image: true } : {}),
296
+ },
120
297
  });
121
298
  }
122
299
  return imaged_struct;
@@ -0,0 +1,41 @@
1
+ import type { ElementSymbol } from '../element';
2
+ import type { Vec3 } from '../math';
3
+ import type { AnyStructure, BondPair } from './';
4
+ export type PolyhedraColorMode = `vertex` | `center` | `uniform`;
5
+ export interface PolyhedraOptions {
6
+ min_neighbors?: number;
7
+ max_neighbors?: number;
8
+ excluded_center_elements?: readonly string[];
9
+ included_center_elements?: readonly string[];
10
+ electronegativity_margin?: number;
11
+ distance_factor?: number;
12
+ weak_bond_norm?: number;
13
+ volume_eps?: number;
14
+ }
15
+ export interface ConvexHullResult {
16
+ vertices: Vec3[];
17
+ input_idxs: number[];
18
+ faces: [number, number, number][];
19
+ volume: number;
20
+ }
21
+ export interface Polyhedron {
22
+ center_site_idx: number;
23
+ center_orig_idx: number;
24
+ center_element: ElementSymbol;
25
+ vertices: Vec3[];
26
+ vertex_site_idxs: number[];
27
+ faces: [number, number, number][];
28
+ volume: number;
29
+ }
30
+ export interface MergedPolyhedraBuffers {
31
+ positions: Float32Array;
32
+ colors: Float32Array;
33
+ edge_positions: Float32Array;
34
+ triangle_count: number;
35
+ edge_count: number;
36
+ }
37
+ export declare function convex_hull_3d(points: readonly Vec3[], eps_scale?: number): ConvexHullResult;
38
+ export declare function build_adjacency(bonds: readonly BondPair[]): Map<number, Set<number>>;
39
+ export declare const is_spectator_center: (element: string) => boolean;
40
+ export declare function compute_polyhedra(structure: AnyStructure, bonds: readonly BondPair[], options?: PolyhedraOptions): Polyhedron[];
41
+ export declare function merge_polyhedra_buffers(polyhedra: readonly Polyhedron[], get_vertex_color: (poly: Polyhedron, vertex_idx: number) => string, coplanar_tol?: number): MergedPolyhedraBuffers;