matterviz 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. package/dist/EmptyState.svelte +10 -4
  2. package/dist/FilePicker.svelte +48 -60
  3. package/dist/Icon.svelte +7 -4
  4. package/dist/MillerIndexInput.svelte +2 -2
  5. package/dist/api/optimade.js +10 -7
  6. package/dist/app.css +68 -0
  7. package/dist/brillouin/BrillouinZone.svelte +90 -91
  8. package/dist/brillouin/BrillouinZone.svelte.d.ts +5 -7
  9. package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte +18 -14
  11. package/dist/brillouin/BrillouinZoneInfoPane.svelte +6 -10
  12. package/dist/brillouin/BrillouinZoneScene.svelte +46 -68
  13. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  14. package/dist/brillouin/compute.js +10 -16
  15. package/dist/brillouin/geometry.js +2 -2
  16. package/dist/chempot-diagram/ChemPotDiagram.svelte +48 -50
  17. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +61 -169
  18. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +1 -1
  19. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +559 -755
  20. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +1 -1
  21. package/dist/chempot-diagram/async-compute.svelte.js +13 -14
  22. package/dist/chempot-diagram/color.d.ts +21 -1
  23. package/dist/chempot-diagram/color.js +70 -1
  24. package/dist/chempot-diagram/compute.d.ts +7 -0
  25. package/dist/chempot-diagram/compute.js +85 -26
  26. package/dist/chempot-diagram/controls-state.svelte.js +1 -1
  27. package/dist/chempot-diagram/export.js +1 -6
  28. package/dist/chempot-diagram/temperature.js +9 -10
  29. package/dist/colors/index.d.ts +0 -4
  30. package/dist/colors/index.js +19 -20
  31. package/dist/composition/BarChart.svelte +30 -26
  32. package/dist/composition/BubbleChart.svelte +17 -17
  33. package/dist/composition/Composition.svelte +10 -19
  34. package/dist/composition/Formula.svelte +20 -27
  35. package/dist/composition/FormulaFilter.svelte +115 -184
  36. package/dist/composition/PieChart.svelte +55 -41
  37. package/dist/composition/format.js +7 -9
  38. package/dist/composition/index.d.ts +2 -0
  39. package/dist/composition/index.js +14 -0
  40. package/dist/composition/parse.d.ts +2 -2
  41. package/dist/composition/parse.js +61 -115
  42. package/dist/constants.d.ts +0 -1
  43. package/dist/constants.js +17 -26
  44. package/dist/convex-hull/ConvexHull.svelte +12 -15
  45. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
  46. package/dist/convex-hull/ConvexHull2D.svelte +93 -94
  47. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  48. package/dist/convex-hull/ConvexHull3D.svelte +127 -186
  49. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  50. package/dist/convex-hull/ConvexHull4D.svelte +131 -180
  51. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  52. package/dist/convex-hull/ConvexHullChrome.svelte +36 -40
  53. package/dist/convex-hull/ConvexHullControls.svelte +46 -48
  54. package/dist/convex-hull/ConvexHullStats.svelte +193 -195
  55. package/dist/convex-hull/ConvexHullTooltip.svelte +5 -12
  56. package/dist/convex-hull/GasPressureControls.svelte +5 -12
  57. package/dist/convex-hull/StructurePopup.svelte +18 -22
  58. package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
  59. package/dist/convex-hull/TemperatureSlider.svelte +4 -10
  60. package/dist/convex-hull/canvas-interactions.svelte.js +2 -1
  61. package/dist/convex-hull/gas-thermodynamics.js +21 -53
  62. package/dist/convex-hull/helpers.d.ts +8 -10
  63. package/dist/convex-hull/helpers.js +37 -43
  64. package/dist/convex-hull/hull-state.svelte.d.ts +1 -1
  65. package/dist/convex-hull/thermodynamics.js +37 -44
  66. package/dist/coordination/CoordinationBarPlot.svelte +49 -53
  67. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  68. package/dist/coordination/calc-coordination.d.ts +1 -1
  69. package/dist/coordination/calc-coordination.js +28 -25
  70. package/dist/element/BohrAtom.svelte +5 -9
  71. package/dist/element/ElementHeading.svelte +4 -1
  72. package/dist/element/ElementPhoto.svelte +11 -9
  73. package/dist/element/ElementStats.svelte +12 -10
  74. package/dist/element/ElementTile.svelte +44 -67
  75. package/dist/element/Nucleus.svelte +4 -2
  76. package/dist/element/data.d.ts +3 -2
  77. package/dist/element/data.js +5 -1
  78. package/dist/element/helpers.d.ts +4 -0
  79. package/dist/element/helpers.js +18 -0
  80. package/dist/element/index.d.ts +2 -5
  81. package/dist/element/index.js +4 -19
  82. package/dist/feedback/DragOverlay.svelte +5 -5
  83. package/dist/feedback/DragOverlay.svelte.d.ts +2 -2
  84. package/dist/feedback/StatusMessage.svelte +7 -4
  85. package/dist/fermi-surface/FermiSlice.svelte +21 -18
  86. package/dist/fermi-surface/FermiSurface.svelte +35 -44
  87. package/dist/fermi-surface/FermiSurface.svelte.d.ts +7 -13
  88. package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
  89. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  90. package/dist/fermi-surface/FermiSurfaceScene.svelte +64 -136
  91. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  92. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
  93. package/dist/fermi-surface/compute.js +25 -58
  94. package/dist/fermi-surface/parse.js +54 -88
  95. package/dist/file-viewer/JsonBrowser.svelte +1043 -0
  96. package/dist/file-viewer/JsonBrowser.svelte.d.ts +9 -0
  97. package/dist/file-viewer/PlotPanel.svelte +350 -0
  98. package/dist/file-viewer/PlotPanel.svelte.d.ts +9 -0
  99. package/dist/file-viewer/TrajectoryWithDos.svelte +30 -0
  100. package/dist/file-viewer/TrajectoryWithDos.svelte.d.ts +10 -0
  101. package/dist/file-viewer/detect.d.ts +11 -0
  102. package/dist/file-viewer/detect.js +381 -0
  103. package/dist/file-viewer/eligibility.d.ts +4 -0
  104. package/dist/file-viewer/eligibility.js +53 -0
  105. package/dist/file-viewer/host-protocol.d.ts +50 -0
  106. package/dist/file-viewer/host-transfer.d.ts +25 -0
  107. package/dist/file-viewer/host-transfer.js +42 -0
  108. package/dist/file-viewer/index.d.ts +5 -0
  109. package/dist/file-viewer/index.js +5 -0
  110. package/dist/file-viewer/main.d.ts +44 -0
  111. package/dist/file-viewer/main.js +535 -0
  112. package/dist/file-viewer/parse.d.ts +9 -0
  113. package/dist/file-viewer/parse.js +170 -0
  114. package/dist/file-viewer/plot-utils.d.ts +24 -0
  115. package/dist/file-viewer/plot-utils.js +191 -0
  116. package/dist/file-viewer/types.d.ts +4 -0
  117. package/dist/file-viewer/types.js +5 -0
  118. package/dist/heatmap-matrix/HeatmapMatrix.svelte +153 -219
  119. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +2 -2
  120. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +9 -7
  121. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +1 -1
  122. package/dist/heatmap-matrix/index.d.ts +5 -0
  123. package/dist/icons.d.ts +4 -0
  124. package/dist/icons.js +4 -0
  125. package/dist/index.d.ts +2 -2
  126. package/dist/index.js +1 -1
  127. package/dist/io/ExportPane.svelte +11 -7
  128. package/dist/io/decompress.d.ts +4 -1
  129. package/dist/io/decompress.js +24 -36
  130. package/dist/io/export.d.ts +11 -4
  131. package/dist/io/export.js +75 -19
  132. package/dist/io/fetch.d.ts +0 -3
  133. package/dist/io/fetch.js +0 -11
  134. package/dist/io/file-drop.js +60 -35
  135. package/dist/io/index.d.ts +0 -1
  136. package/dist/io/index.js +2 -9
  137. package/dist/io/is-binary.d.ts +9 -0
  138. package/dist/io/is-binary.js +45 -1
  139. package/dist/io/url-drop.d.ts +2 -0
  140. package/dist/io/url-drop.js +40 -40
  141. package/dist/isosurface/Isosurface.svelte +700 -215
  142. package/dist/isosurface/Isosurface.svelte.d.ts +7 -1
  143. package/dist/isosurface/IsosurfaceControls.svelte +590 -116
  144. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +1 -1
  145. package/dist/isosurface/VolumeSlice.svelte +224 -0
  146. package/dist/isosurface/VolumeSlice.svelte.d.ts +28 -0
  147. package/dist/isosurface/coloring.d.ts +20 -0
  148. package/dist/isosurface/coloring.js +118 -0
  149. package/dist/isosurface/geometry-worker-types.d.ts +38 -0
  150. package/dist/isosurface/geometry.worker.d.ts +1 -0
  151. package/dist/isosurface/geometry.worker.js +59 -0
  152. package/dist/isosurface/grid.d.ts +10 -0
  153. package/dist/isosurface/grid.js +31 -0
  154. package/dist/isosurface/index.d.ts +4 -0
  155. package/dist/isosurface/index.js +4 -0
  156. package/dist/isosurface/parse-vaspwave.d.ts +3 -0
  157. package/dist/isosurface/parse-vaspwave.js +138 -0
  158. package/dist/isosurface/parse.js +6 -6
  159. package/dist/isosurface/profile.d.ts +12 -0
  160. package/dist/isosurface/profile.js +19 -0
  161. package/dist/isosurface/sampling.d.ts +34 -0
  162. package/dist/isosurface/sampling.js +408 -0
  163. package/dist/isosurface/slice-rendering.d.ts +13 -0
  164. package/dist/isosurface/slice-rendering.js +79 -0
  165. package/dist/isosurface/slice.d.ts +22 -2
  166. package/dist/isosurface/slice.js +200 -116
  167. package/dist/isosurface/types.d.ts +24 -1
  168. package/dist/isosurface/types.js +120 -8
  169. package/dist/json-path.d.ts +4 -0
  170. package/dist/json-path.js +89 -0
  171. package/dist/labels.d.ts +6 -2
  172. package/dist/labels.js +44 -14
  173. package/dist/layout/FullscreenButton.svelte +2 -1
  174. package/dist/layout/FullscreenToggle.svelte +10 -4
  175. package/dist/layout/InfoCard.svelte +8 -21
  176. package/dist/layout/InfoTag.svelte +1 -3
  177. package/dist/layout/NumberRangeInput.svelte +46 -0
  178. package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
  179. package/dist/layout/PropertyFilter.svelte +2 -6
  180. package/dist/layout/SettingsSection.svelte +57 -62
  181. package/dist/layout/SettingsSection.svelte.d.ts +6 -7
  182. package/dist/layout/SubpageGrid.svelte +3 -1
  183. package/dist/layout/ViewerChrome.svelte +16 -11
  184. package/dist/layout/ViewerChrome.svelte.d.ts +2 -1
  185. package/dist/layout/fullscreen.js +3 -5
  186. package/dist/layout/fullscreen.svelte.js +1 -2
  187. package/dist/layout/index.d.ts +1 -0
  188. package/dist/layout/index.js +1 -0
  189. package/dist/layout/json-tree/JsonNode.svelte +22 -59
  190. package/dist/layout/json-tree/JsonTree.svelte +101 -172
  191. package/dist/layout/json-tree/JsonValue.svelte +9 -32
  192. package/dist/layout/json-tree/utils.d.ts +0 -3
  193. package/dist/layout/json-tree/utils.js +50 -188
  194. package/dist/marching-cubes.d.ts +8 -1
  195. package/dist/marching-cubes.js +115 -48
  196. package/dist/math.d.ts +5 -2
  197. package/dist/math.js +48 -38
  198. package/dist/overlays/ContextMenu.svelte +19 -34
  199. package/dist/overlays/CopyButton.svelte +11 -5
  200. package/dist/overlays/DragControlTab.svelte +6 -1
  201. package/dist/overlays/DraggablePane.svelte +110 -74
  202. package/dist/overlays/DraggablePane.svelte.d.ts +2 -1
  203. package/dist/overlays/GlassChip.svelte +32 -0
  204. package/dist/overlays/GlassChip.svelte.d.ts +8 -0
  205. package/dist/overlays/InfoPaneCards.svelte +11 -23
  206. package/dist/overlays/index.d.ts +7 -0
  207. package/dist/overlays/index.js +26 -0
  208. package/dist/overlays/portal.d.ts +2 -0
  209. package/dist/overlays/portal.js +14 -0
  210. package/dist/periodic-table/PeriodicTable.svelte +113 -145
  211. package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
  212. package/dist/periodic-table/PeriodicTableControls.svelte +37 -115
  213. package/dist/periodic-table/TableInset.svelte +9 -4
  214. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +68 -105
  215. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
  216. package/dist/phase-diagram/PhaseDiagramControls.svelte +70 -94
  217. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
  218. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +2 -1
  219. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +12 -12
  220. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
  221. package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
  222. package/dist/phase-diagram/build-diagram.js +4 -9
  223. package/dist/phase-diagram/diagram-input.d.ts +1 -2
  224. package/dist/phase-diagram/parse.js +15 -15
  225. package/dist/phase-diagram/svg-to-diagram.js +28 -27
  226. package/dist/phase-diagram/utils.js +2 -3
  227. package/dist/plot/bar/BarPlot.svelte +461 -426
  228. package/dist/plot/bar/BarPlot.svelte.d.ts +2 -0
  229. package/dist/plot/bar/BarPlotControls.svelte +1 -3
  230. package/dist/plot/bar/BarPlotControls.svelte.d.ts +4 -6
  231. package/dist/plot/bar/SpacegroupBarPlot.svelte +46 -77
  232. package/dist/plot/bar/data.d.ts +5 -4
  233. package/dist/plot/bar/data.js +2 -1
  234. package/dist/plot/box/BoxPlot.svelte +322 -226
  235. package/dist/plot/box/BoxPlot.svelte.d.ts +2 -0
  236. package/dist/plot/box/Violin.svelte.d.ts +1 -0
  237. package/dist/plot/box/box-plot.js +1 -1
  238. package/dist/plot/core/auto-place.d.ts +1 -1
  239. package/dist/plot/core/auto-place.js +2 -2
  240. package/dist/plot/core/axis-utils.d.ts +12 -7
  241. package/dist/plot/core/axis-utils.js +48 -48
  242. package/dist/plot/core/components/AxisLabel.svelte +82 -20
  243. package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
  244. package/dist/plot/core/components/ColorBar.svelte +101 -106
  245. package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
  246. package/dist/plot/core/components/FillArea.svelte +10 -17
  247. package/dist/plot/core/components/HierarchyControls.svelte +249 -0
  248. package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
  249. package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
  250. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
  251. package/dist/plot/core/components/Line.svelte +18 -9
  252. package/dist/plot/core/components/Line.svelte.d.ts +2 -0
  253. package/dist/plot/core/components/PlotAxis.svelte +40 -17
  254. package/dist/plot/core/components/PlotControls.svelte +65 -41
  255. package/dist/plot/core/components/PlotLegend.svelte +31 -35
  256. package/dist/plot/core/components/PlotMarginals.svelte +616 -0
  257. package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
  258. package/dist/plot/core/components/PlotTooltip.svelte +1 -1
  259. package/dist/plot/core/components/PortalSelect.svelte +4 -8
  260. package/dist/plot/core/components/ReferenceLine.svelte +27 -24
  261. package/dist/plot/core/components/ReferenceLine3D.svelte +54 -57
  262. package/dist/plot/core/components/ReferencePlane.svelte +7 -8
  263. package/dist/plot/core/components/ZeroLines.svelte +4 -8
  264. package/dist/plot/core/components/ZoomRect.svelte +1 -2
  265. package/dist/plot/core/components/index.d.ts +1 -0
  266. package/dist/plot/core/components/index.js +1 -0
  267. package/dist/plot/core/data-cleaning-signal.d.ts +46 -0
  268. package/dist/plot/core/data-cleaning-signal.js +467 -0
  269. package/dist/plot/core/data-cleaning.d.ts +2 -42
  270. package/dist/plot/core/data-cleaning.js +27 -474
  271. package/dist/plot/core/data-transform.d.ts +1 -2
  272. package/dist/plot/core/data-transform.js +9 -15
  273. package/dist/plot/core/fill-utils.d.ts +3 -1
  274. package/dist/plot/core/fill-utils.js +28 -6
  275. package/dist/plot/core/index.d.ts +1 -0
  276. package/dist/plot/core/index.js +1 -0
  277. package/dist/plot/core/interactions.js +0 -2
  278. package/dist/plot/core/layout.d.ts +15 -6
  279. package/dist/plot/core/layout.js +57 -38
  280. package/dist/plot/core/marginals.d.ts +170 -0
  281. package/dist/plot/core/marginals.js +436 -0
  282. package/dist/plot/core/pan-zoom.svelte.d.ts +2 -4
  283. package/dist/plot/core/pan-zoom.svelte.js +34 -17
  284. package/dist/plot/core/placed-tween.svelte.d.ts +3 -0
  285. package/dist/plot/core/placed-tween.svelte.js +68 -21
  286. package/dist/plot/core/reference-line.js +1 -1
  287. package/dist/plot/core/scales.d.ts +23 -0
  288. package/dist/plot/core/scales.js +39 -13
  289. package/dist/plot/core/svg.js +0 -1
  290. package/dist/plot/core/types/fills.d.ts +101 -0
  291. package/dist/plot/core/types/fills.js +15 -0
  292. package/dist/plot/core/types/plot-3d.d.ts +87 -0
  293. package/dist/plot/core/types/plot-3d.js +4 -0
  294. package/dist/plot/core/types/reference-lines.d.ts +140 -0
  295. package/dist/plot/core/types/reference-lines.js +9 -0
  296. package/dist/plot/core/types.d.ts +29 -324
  297. package/dist/plot/core/types.js +23 -20
  298. package/dist/plot/core/utils/hierarchy-chart.d.ts +52 -0
  299. package/dist/plot/core/utils/hierarchy-chart.js +191 -0
  300. package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
  301. package/dist/plot/core/utils/hierarchy-labels.js +100 -0
  302. package/dist/plot/core/utils/label-placement.js +2 -2
  303. package/dist/plot/histogram/Histogram.svelte +314 -340
  304. package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
  305. package/dist/plot/histogram/HistogramControls.svelte +30 -28
  306. package/dist/plot/histogram/histogram.d.ts +31 -0
  307. package/dist/plot/histogram/histogram.js +70 -0
  308. package/dist/plot/histogram/index.d.ts +1 -0
  309. package/dist/plot/histogram/index.js +1 -0
  310. package/dist/plot/index.d.ts +1 -0
  311. package/dist/plot/index.js +1 -0
  312. package/dist/plot/sankey/Sankey.svelte +78 -69
  313. package/dist/plot/sankey/Sankey.svelte.d.ts +2 -2
  314. package/dist/plot/sankey/SankeyControls.svelte +22 -16
  315. package/dist/plot/sankey/sankey.js +13 -9
  316. package/dist/plot/scatter/BinnedScatterPlot.svelte +311 -141
  317. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +7 -0
  318. package/dist/plot/scatter/ElementScatter.svelte +4 -1
  319. package/dist/plot/scatter/ScatterPlot.svelte +517 -410
  320. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +2 -0
  321. package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
  322. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  323. package/dist/plot/scatter/ScatterPoint.svelte +16 -9
  324. package/dist/plot/scatter/adaptive-density.d.ts +1 -1
  325. package/dist/plot/scatter/adaptive-density.js +36 -20
  326. package/dist/plot/scatter/binned-scatter-types.d.ts +3 -2
  327. package/dist/plot/scatter/binned-scatter-types.js +6 -1
  328. package/dist/plot/scatter/scatter-data.d.ts +1 -1
  329. package/dist/plot/scatter/scatter-data.js +8 -7
  330. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +25 -34
  331. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +2 -2
  332. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +8 -5
  333. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +113 -116
  334. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +2 -2
  335. package/dist/plot/scatter-3d/Surface3D.svelte +4 -13
  336. package/dist/plot/sunburst/Sunburst.svelte +269 -347
  337. package/dist/plot/sunburst/Sunburst.svelte.d.ts +2 -2
  338. package/dist/plot/sunburst/index.d.ts +1 -1
  339. package/dist/plot/sunburst/index.js +2 -1
  340. package/dist/plot/sunburst/render.d.ts +2 -2
  341. package/dist/plot/sunburst/render.js +47 -22
  342. package/dist/plot/sunburst/sunburst.d.ts +5 -1
  343. package/dist/plot/sunburst/sunburst.js +10 -3
  344. package/dist/plot/treemap/Treemap.svelte +1022 -0
  345. package/dist/plot/treemap/Treemap.svelte.d.ts +90 -0
  346. package/dist/plot/treemap/index.d.ts +4 -0
  347. package/dist/plot/treemap/index.js +4 -0
  348. package/dist/plot/treemap/labels.d.ts +38 -0
  349. package/dist/plot/treemap/labels.js +80 -0
  350. package/dist/plot/treemap/treemap.d.ts +28 -0
  351. package/dist/plot/treemap/treemap.js +102 -0
  352. package/dist/rdf/RdfPlot.svelte +37 -59
  353. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  354. package/dist/rdf/calc-rdf.js +63 -52
  355. package/dist/rdf/index.d.ts +0 -1
  356. package/dist/sanitize.js +85 -27
  357. package/dist/scene/SceneCamera.svelte +1 -1
  358. package/dist/scene/SceneCamera.svelte.d.ts +1 -1
  359. package/dist/scene/bind-renderer.svelte.js +14 -6
  360. package/dist/scene/index.d.ts +1 -2
  361. package/dist/scene/index.js +1 -1
  362. package/dist/scene/{props.js → props.svelte.js} +15 -1
  363. package/dist/settings.d.ts +19 -9
  364. package/dist/settings.js +229 -525
  365. package/dist/spectral/Bands.svelte +207 -221
  366. package/dist/spectral/BandsAndDos.svelte +11 -9
  367. package/dist/spectral/BrillouinBandsDos.svelte +19 -42
  368. package/dist/spectral/Dos.svelte +92 -93
  369. package/dist/spectral/helpers.d.ts +3 -3
  370. package/dist/spectral/helpers.js +65 -140
  371. package/dist/state.svelte.js +5 -18
  372. package/dist/structure/Arrow.svelte +5 -18
  373. package/dist/structure/ArrowInstances.svelte +160 -0
  374. package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
  375. package/dist/structure/AtomLegend.svelte +120 -85
  376. package/dist/structure/AtomLegend.svelte.d.ts +2 -3
  377. package/dist/structure/Bond.svelte +31 -23
  378. package/dist/structure/CanvasTooltip.svelte +15 -3
  379. package/dist/structure/CellSelect.svelte +45 -35
  380. package/dist/structure/Cylinder.svelte +24 -40
  381. package/dist/structure/InstancedAtoms.svelte +114 -0
  382. package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
  383. package/dist/structure/Lattice.svelte +85 -149
  384. package/dist/structure/SiteLabels.svelte +122 -0
  385. package/dist/structure/SiteLabels.svelte.d.ts +18 -0
  386. package/dist/structure/Structure.svelte +636 -504
  387. package/dist/structure/Structure.svelte.d.ts +4 -2
  388. package/dist/structure/StructureCarousel.svelte +637 -0
  389. package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
  390. package/dist/structure/StructureControls.svelte +165 -425
  391. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  392. package/dist/structure/StructureExportPane.svelte +17 -21
  393. package/dist/structure/StructureInfoPane.svelte +128 -133
  394. package/dist/structure/StructureInfoPane.svelte.d.ts +1 -1
  395. package/dist/structure/StructureScene.svelte +535 -578
  396. package/dist/structure/StructureScene.svelte.d.ts +6 -2
  397. package/dist/structure/StructureViewport.svelte +451 -0
  398. package/dist/structure/StructureViewport.svelte.d.ts +65 -0
  399. package/dist/structure/atom-label-placement.d.ts +16 -12
  400. package/dist/structure/atom-label-placement.js +70 -37
  401. package/dist/structure/atom-properties.d.ts +2 -0
  402. package/dist/structure/atom-properties.js +105 -38
  403. package/dist/structure/bond-order-perception.js +3 -8
  404. package/dist/structure/bonding.d.ts +9 -3
  405. package/dist/structure/bonding.js +95 -46
  406. package/dist/structure/edit-history.d.ts +6 -0
  407. package/dist/structure/edit-history.js +27 -0
  408. package/dist/structure/export.d.ts +1 -0
  409. package/dist/structure/export.js +89 -105
  410. package/dist/structure/format-detect.d.ts +1 -0
  411. package/dist/structure/format-detect.js +20 -0
  412. package/dist/structure/geometry.d.ts +9 -0
  413. package/dist/structure/geometry.js +27 -0
  414. package/dist/structure/index.d.ts +16 -1
  415. package/dist/structure/index.js +15 -10
  416. package/dist/structure/measure.d.ts +1 -1
  417. package/dist/structure/measure.js +6 -12
  418. package/dist/structure/parse.d.ts +2 -1
  419. package/dist/structure/parse.js +272 -313
  420. package/dist/structure/partial-occupancy.js +10 -5
  421. package/dist/structure/pbc.js +85 -107
  422. package/dist/structure/polyhedra.d.ts +0 -1
  423. package/dist/structure/polyhedra.js +7 -21
  424. package/dist/structure/prop-groups.d.ts +85 -0
  425. package/dist/structure/prop-groups.js +18 -0
  426. package/dist/structure/supercell.d.ts +1 -2
  427. package/dist/structure/supercell.js +7 -13
  428. package/dist/symmetry/SymmetryElements.svelte +11 -15
  429. package/dist/symmetry/SymmetryStats.svelte +55 -71
  430. package/dist/symmetry/WyckoffTable.svelte +10 -28
  431. package/dist/symmetry/cell-transform.js +6 -14
  432. package/dist/symmetry/index.d.ts +1 -0
  433. package/dist/symmetry/index.js +13 -10
  434. package/dist/symmetry/spacegroups.js +3 -2
  435. package/dist/table/HeatmapTable.svelte +1142 -447
  436. package/dist/table/HeatmapTable.svelte.d.ts +12 -2
  437. package/dist/table/ToggleMenu.svelte +168 -53
  438. package/dist/table/ToggleMenu.svelte.d.ts +1 -1
  439. package/dist/table/index.d.ts +21 -6
  440. package/dist/table/index.js +34 -21
  441. package/dist/theme/ThemeControl.svelte +16 -8
  442. package/dist/theme/embedded.d.ts +18 -0
  443. package/dist/theme/embedded.js +206 -0
  444. package/dist/theme/index.d.ts +5 -5
  445. package/dist/theme/index.js +5 -12
  446. package/dist/theme/themes.mjs +44 -66
  447. package/dist/tooltip/KCoords.svelte +4 -1
  448. package/dist/tooltip/TooltipContent.svelte +3 -6
  449. package/dist/tooltip/TooltipContent.svelte.d.ts +1 -1
  450. package/dist/tooltip/index.d.ts +8 -1
  451. package/dist/trajectory/Trajectory.svelte +613 -386
  452. package/dist/trajectory/Trajectory.svelte.d.ts +1 -1
  453. package/dist/trajectory/TrajectoryError.svelte +12 -74
  454. package/dist/trajectory/TrajectoryExportPane.svelte +14 -32
  455. package/dist/trajectory/TrajectoryInfoPane.svelte +127 -164
  456. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +2 -1
  457. package/dist/trajectory/extract.js +61 -49
  458. package/dist/trajectory/format-detect.d.ts +2 -0
  459. package/dist/trajectory/format-detect.js +17 -13
  460. package/dist/trajectory/frame-reader.d.ts +2 -0
  461. package/dist/trajectory/frame-reader.js +35 -32
  462. package/dist/trajectory/helpers.d.ts +2 -0
  463. package/dist/trajectory/helpers.js +34 -56
  464. package/dist/trajectory/index.d.ts +1 -0
  465. package/dist/trajectory/index.js +5 -8
  466. package/dist/trajectory/parse/ase.js +1 -1
  467. package/dist/trajectory/parse/h5-utils.d.ts +13 -0
  468. package/dist/trajectory/parse/h5-utils.js +109 -0
  469. package/dist/trajectory/parse/hdf5.d.ts +1 -1
  470. package/dist/trajectory/parse/hdf5.js +116 -106
  471. package/dist/trajectory/parse/index.d.ts +6 -6
  472. package/dist/trajectory/parse/index.js +25 -33
  473. package/dist/trajectory/parse/lammps.js +8 -12
  474. package/dist/trajectory/parse/vasp.js +10 -7
  475. package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
  476. package/dist/trajectory/parse/vaspout-electronic.js +207 -0
  477. package/dist/trajectory/parse/vaspout-h5.d.ts +4 -0
  478. package/dist/trajectory/parse/vaspout-h5.js +281 -0
  479. package/dist/trajectory/parse/xyz.js +59 -9
  480. package/dist/trajectory/plotting.d.ts +8 -9
  481. package/dist/trajectory/plotting.js +113 -64
  482. package/dist/utils.d.ts +3 -0
  483. package/dist/utils.js +7 -0
  484. package/dist/xrd/XrdPlot.svelte +79 -118
  485. package/dist/xrd/broadening.js +2 -1
  486. package/dist/xrd/calc-xrd.js +24 -62
  487. package/dist/xrd/parse.d.ts +0 -1
  488. package/dist/xrd/parse.js +69 -95
  489. package/package.json +94 -34
  490. package/readme.md +6 -5
  491. package/dist/api/mp.d.ts +0 -6
  492. package/dist/api/mp.js +0 -22
  493. package/dist/plot/sunburst/SunburstControls.svelte +0 -200
  494. package/dist/scene/types.d.ts +0 -26
  495. package/dist/tooltip/types.d.ts +0 -8
  496. package/dist/trajectory/constants.d.ts +0 -6
  497. package/dist/trajectory/constants.js +0 -11
  498. /package/dist/{scene/types.js → file-viewer/host-protocol.js} +0 -0
  499. /package/dist/{tooltip/types.js → isosurface/geometry-worker-types.js} +0 -0
@@ -1,5 +1,5 @@
1
1
  import * as math from '../math';
2
- import { Vector3 } from 'three';
2
+ import { Matrix4 } from 'three';
3
3
  export const LABEL_OFFSET_EPS = 1e-9;
4
4
  const LABEL_OFFSET_DIRECTIONS = [
5
5
  [0, -1, 0],
@@ -44,39 +44,72 @@ export const choose_site_label_offset = (bond_directions, base_offset) => {
44
44
  }
45
45
  return math.scale(best_direction, offset_length);
46
46
  };
47
- const project_to_screen = (position, label_camera, size) => {
48
- const projected = new Vector3(...position).project(label_camera);
49
- return [
50
- (projected.x * size.width) / 2 + size.width / 2,
51
- (-projected.y * size.height) / 2 + size.height / 2,
52
- ];
53
- };
54
- export const label_screen_position = (atom_position, label_offset, visual_radius, label_screen_margin, label_camera, size) => {
55
- const atom_screen = project_to_screen(atom_position, label_camera, size);
56
- const offset_screen = project_to_screen(math.add(atom_position, label_offset), label_camera, size);
57
- const offset_x = offset_screen[0] - atom_screen[0];
58
- const offset_y = offset_screen[1] - atom_screen[1];
59
- const offset_length = Math.hypot(offset_x, offset_y);
60
- const direction_x = offset_length > LABEL_OFFSET_EPS ? offset_x / offset_length : 0;
61
- const direction_y = offset_length > LABEL_OFFSET_EPS ? offset_y / offset_length : label_offset[1] >= 0 ? -1 : 1;
62
- // Measure the atom's projected radius along the camera's right axis (always
63
- // view-perpendicular). Measuring along label_offset would collapse the clearance
64
- // to ~zero for offsets near the view axis, letting the label overlap the atom.
65
- const radius_dir = new Vector3()
66
- .setFromMatrixColumn(label_camera.matrixWorld, 0)
67
- .normalize()
68
- .multiplyScalar(visual_radius);
69
- const radius_edge = math.add(atom_position, [
70
- radius_dir.x,
71
- radius_dir.y,
72
- radius_dir.z,
73
- ]);
74
- const radius_screen = project_to_screen(radius_edge, label_camera, size);
75
- const atom_screen_radius = Math.hypot(radius_screen[0] - atom_screen[0], radius_screen[1] - atom_screen[1]);
76
- const screen_gap = atom_screen_radius + label_screen_margin;
77
- return [atom_screen[0] + direction_x * screen_gap, atom_screen[1] + direction_y * screen_gap];
78
- };
79
- export const make_label_position_calculator = (_atom_position, label_offset, visual_radius, label_screen_margin) => (object, label_camera, size) => {
80
- const world_position = object.getWorldPosition(new Vector3());
81
- return label_screen_position([world_position.x, world_position.y, world_position.z], typeof label_offset === `function` ? label_offset() : label_offset, visual_radius, label_screen_margin, label_camera, size);
82
- };
47
+ // Per-frame screen projector for label overlays. `update()` precomputes the
48
+ // combined model-view-projection once per frame; `place()` then resolves each
49
+ // label with a single clip-space transform and zero allocations (labels run
50
+ // per site per frame, so the old 3-projections-per-label path with fresh
51
+ // Vector3s dominated frame time on large supercells).
52
+ //
53
+ // Placement semantics match the previous label_screen_position helper: the
54
+ // label sits `atom_screen_radius + margin` px from the atom center along the
55
+ // screen direction of its offset. The projected radius is measured along the
56
+ // camera's right axis, which for both projections equals
57
+ // visual_radius * projection[5] * (height/2) / clip_w.
58
+ export class LabelProjector {
59
+ #mvp = new Matrix4(); // projection * view * anchor (local -> clip space)
60
+ #view = new Matrix4(); // view * anchor (local -> view space, for behind-camera test)
61
+ #half_width = 0;
62
+ #half_height = 0;
63
+ #radius_scale = 0; // clip-space multiplier for projected atom radius
64
+ #margin = 0;
65
+ update(camera, anchor_world_matrix, size, margin) {
66
+ this.#view.multiplyMatrices(camera.matrixWorldInverse, anchor_world_matrix);
67
+ this.#mvp.multiplyMatrices(camera.projectionMatrix, this.#view);
68
+ this.#half_width = size.width / 2;
69
+ this.#half_height = size.height / 2;
70
+ // projectionMatrix[5] = cot(fov/2) for perspective, 2/(top-bottom) for ortho
71
+ this.#radius_scale = camera.projectionMatrix.elements[5] * this.#half_height;
72
+ this.#margin = margin;
73
+ }
74
+ // position + offset: label anchor and preferred direction in anchor-local
75
+ // space; visual_radius: atom radius in the same units
76
+ place(position, offset, visual_radius, out) {
77
+ const [pos_x, pos_y, pos_z] = position;
78
+ const mvp = this.#mvp.elements;
79
+ const view = this.#view.elements;
80
+ // Behind-camera test in view space (camera looks down -z)
81
+ const view_z = view[2] * pos_x + view[6] * pos_y + view[10] * pos_z + view[14];
82
+ if (view_z > 0) {
83
+ out.visible = false;
84
+ return;
85
+ }
86
+ const clip_x = mvp[0] * pos_x + mvp[4] * pos_y + mvp[8] * pos_z + mvp[12];
87
+ const clip_y = mvp[1] * pos_x + mvp[5] * pos_y + mvp[9] * pos_z + mvp[13];
88
+ const clip_w = mvp[3] * pos_x + mvp[7] * pos_y + mvp[11] * pos_z + mvp[15];
89
+ const screen_x = (clip_x / clip_w) * this.#half_width + this.#half_width;
90
+ const screen_y = (-clip_y / clip_w) * this.#half_height + this.#half_height;
91
+ // Screen direction of the offset: project position + offset and take the
92
+ // screen-space delta. Projecting the second point (instead of just rotating
93
+ // the offset into view space) keeps perspective foreshortening exact for
94
+ // offsets with a depth component, matching the pre-projector behavior.
95
+ const [off_x, off_y, off_z] = offset;
96
+ const end_x = pos_x + off_x;
97
+ const end_y = pos_y + off_y;
98
+ const end_z = pos_z + off_z;
99
+ const end_clip_x = mvp[0] * end_x + mvp[4] * end_y + mvp[8] * end_z + mvp[12];
100
+ const end_clip_y = mvp[1] * end_x + mvp[5] * end_y + mvp[9] * end_z + mvp[13];
101
+ const end_clip_w = mvp[3] * end_x + mvp[7] * end_y + mvp[11] * end_z + mvp[15];
102
+ const delta_x = (end_clip_x / end_clip_w) * this.#half_width + this.#half_width - screen_x;
103
+ const delta_y = (-end_clip_y / end_clip_w) * this.#half_height + this.#half_height - screen_y;
104
+ const dir_len = Math.hypot(delta_x, delta_y);
105
+ // Offsets along the view axis have no screen direction; nudge upward like
106
+ // the previous implementation (screen y grows downward)
107
+ const dir_x = dir_len > LABEL_OFFSET_EPS ? delta_x / dir_len : 0;
108
+ const dir_y = dir_len > LABEL_OFFSET_EPS ? delta_y / dir_len : off_y >= 0 ? -1 : 1;
109
+ const atom_screen_radius = (visual_radius * this.#radius_scale) / clip_w;
110
+ const screen_gap = Math.abs(atom_screen_radius) + this.#margin;
111
+ out.x = screen_x + dir_x * screen_gap;
112
+ out.y = screen_y + dir_y * screen_gap;
113
+ out.visible = true;
114
+ }
115
+ }
@@ -1,4 +1,5 @@
1
1
  import type { ColorScaleType, D3InterpolateName } from '../colors';
2
+ import type { CoordinationData } from '../coordination/calc-coordination';
2
3
  import type { AtomColorMode } from '../settings';
3
4
  import type { AnyStructure, Site } from './';
4
5
  import type { BondingStrategy } from './bonding';
@@ -29,6 +30,7 @@ export declare const apply_categorical_color_scale: (vals: string[], scale?: str
29
30
  unique_values: string[];
30
31
  };
31
32
  export declare const get_orig_site_idx: (site: Site | undefined, site_idx: number) => number;
33
+ export declare function calc_structure_coordination(structure: AnyStructure, strategy?: BondingStrategy): CoordinationData;
32
34
  export declare function get_coordination_colors(structure: AnyStructure, strategy?: BondingStrategy, scale?: string, type?: ColorScaleType): AtomPropertyColors;
33
35
  export declare function get_wyckoff_colors(structure: AnyStructure, sym_data: SymmetryDataWithOrigMap | null, scale?: string): AtomPropertyColors;
34
36
  export declare function get_custom_colors(structure: AnyStructure, fn: (site: Site, idx: number) => number | string, scale?: string, type?: ColorScaleType): AtomPropertyColors;
@@ -1,12 +1,22 @@
1
1
  // Utility functions for computing atom properties and applying color scales
2
2
  import { get_d3_interpolator } from '../colors';
3
- import { calc_coordination_nums } from '../coordination';
3
+ import { calc_coordination_nums } from '../coordination/calc-coordination';
4
+ import { element_by_symbol } from '../element/data';
4
5
  import * as math from '../math';
5
- import { wrap_to_unit_cell } from './pbc';
6
+ import { get_majority_element } from './bonding';
7
+ import { wrap_frac_coord } from './pbc';
6
8
  import { rgb } from 'd3-color';
7
9
  import * as d3_sc from 'd3-scale-chromatic';
8
10
  const GRAY = `#808080`;
9
11
  const DEFAULT_COLOR_SCALE = `interpolateViridis`;
12
+ // Cap on periodic image shells per axis when expanding for coordination. Guards
13
+ // against image explosion in very thin / highly oblique cells (coordination is ~O(n²)).
14
+ const MAX_IMAGE_SHELLS = 3;
15
+ // Max bond distance each strategy can form, mirroring the defaults in bonding.ts
16
+ // (electroneg_ratio.max_distance_ratio, solid_angle.max_distance). Used to size PBC
17
+ // image expansion just tightly enough that coordination never misses a bonded neighbor.
18
+ const ELECTRONEG_MAX_RATIO = 2;
19
+ const SOLID_ANGLE_MAX_DIST = 5; // Å
10
20
  export const get_d3_color_scales = () => Object.keys(d3_sc).filter((key) => key.startsWith(`interpolate`));
11
21
  const to_hex = (interp_fn, frac) => rgb(interp_fn(frac)).formatHex();
12
22
  const build_image_site = (site, frac_to_cart, offset, orig_idx) => {
@@ -22,12 +32,6 @@ const build_image_site = (site, frac_to_cart, offset, orig_idx) => {
22
32
  properties: { ...site.properties, orig_site_idx: orig_idx },
23
33
  };
24
34
  };
25
- const get_all_offsets = (pbc) => [-1, 0, 1]
26
- .flatMap((dx) => [-1, 0, 1].flatMap((dy) => [-1, 0, 1].map((dz) => [dx, dy, dz])))
27
- .filter(([dx, dy, dz]) => !(dx === 0 && dy === 0 && dz === 0) &&
28
- (pbc[0] || dx === 0) &&
29
- (pbc[1] || dy === 0) &&
30
- (pbc[2] || dz === 0));
31
35
  const make_categorical = (vals, scale, sort_fn) => {
32
36
  const interp_fn = get_d3_interpolator(scale);
33
37
  const uniq = sort_fn
@@ -75,46 +79,109 @@ export const get_orig_site_idx = (site, site_idx) => typeof site?.properties?.or
75
79
  : typeof site?.properties?.orig_site_idx === `number`
76
80
  ? site.properties.orig_site_idx
77
81
  : site_idx;
78
- // Expand structure with PBC images - use minimal expansion based on atom positions
79
- function expand_structure_for_pbc(structure) {
82
+ // Expand a periodic structure with the neighbor images needed for correct
83
+ // coordination. Each atom's `reach` (the largest bond `strategy` can form for it —
84
+ // electroneg_ratio's (r + r_max)·ratio or solid_angle's flat cap) sizes how many whole
85
+ // cells to image per periodic axis, measured over the perpendicular cell height (not
86
+ // the lattice vector length, so oblique cells work), keeping only images within `reach`
87
+ // of the [0,1] cell and capping at MAX_IMAGE_SHELLS/axis (warns + may undercount beyond
88
+ // that — near-degenerate cells only). Smaller atoms image less; atoms with no covalent
89
+ // radius form no bonds and get no images.
90
+ function expand_structure_for_pbc(structure, strategy) {
80
91
  if (!(`lattice` in structure) || !structure.lattice || structure.sites.length === 0) {
81
92
  return structure;
82
93
  }
83
94
  const { sites, lattice } = structure;
84
- const frac_to_cart = math.create_frac_to_cart(lattice.matrix);
85
95
  const pbc = lattice.pbc ?? [true, true, true];
86
- const all_offsets = get_all_offsets(pbc);
87
- // Small structures: expand all atoms
88
- if (sites.length < 20 || !pbc.some(Boolean)) {
89
- const image_sites = sites.flatMap((site, orig_idx) => all_offsets.map((offset) => build_image_site(site, frac_to_cart, offset, orig_idx)));
90
- return { ...structure, sites: [...sites, ...image_sites] };
91
- }
92
- // Large structures: only expand atoms near boundaries (within 5Å bond distance)
93
- const cutoff = [5.0 / lattice.a, 5.0 / lattice.b, 5.0 / lattice.c];
94
- const image_sites = sites.flatMap((site, orig_idx) => {
95
- const norm = wrap_to_unit_cell(site.abc);
96
- return all_offsets
97
- .filter(([dx, dy, dz]) => (dx === 0 || (dx === -1 ? norm[0] <= cutoff[0] : norm[0] >= 1 - cutoff[0])) &&
98
- (dy === 0 || (dy === -1 ? norm[1] <= cutoff[1] : norm[1] >= 1 - cutoff[1])) &&
99
- (dz === 0 || (dz === -1 ? norm[2] <= cutoff[2] : norm[2] >= 1 - cutoff[2])))
100
- .map((offset) => build_image_site(site, frac_to_cart, offset, orig_idx));
96
+ if (!pbc.some(Boolean))
97
+ return structure;
98
+ const frac_to_cart = math.create_frac_to_cart(lattice.matrix);
99
+ // Wrap into [0,1) along PERIODIC axes only so the near-cell filter and image
100
+ // building share one position (else boundary atoms image on the wrong side and lose
101
+ // neighbors). Vacuum axes keep their real coord — wrapping would fold apart atoms
102
+ // together and invent bonds.
103
+ const cell_sites = sites.map((site) => {
104
+ const abc = site.abc.map((coord, axis) => pbc[axis] ? wrap_frac_coord(coord) : coord);
105
+ return { ...site, abc, xyz: frac_to_cart(abc) };
101
106
  });
102
- return { ...structure, sites: [...sites, ...image_sites] };
107
+ // Covalent radius per atom (0 = unknown → forms no bonds → needs no images)
108
+ const radii = cell_sites.map((site) => {
109
+ const elem = get_majority_element(site);
110
+ return (elem ? element_by_symbol.get(elem)?.covalent_radius : undefined) ?? 0;
111
+ });
112
+ let max_radius = 0;
113
+ for (const radius of radii)
114
+ if (radius > max_radius)
115
+ max_radius = radius;
116
+ const reach_of = (radius) => strategy === `solid_angle`
117
+ ? SOLID_ANGLE_MAX_DIST
118
+ : (radius + max_radius) * ELECTRONEG_MAX_RATIO;
119
+ const heights = math.cell_heights(lattice.matrix);
120
+ // Axes we image along: periodic and non-degenerate (finite height). Non-live axes
121
+ // (vacuum or degenerate) contribute no images — 0 shells + ∞ cutoff so their only
122
+ // copy (shift 0) always passes the near-cell filter. Loop-invariant, so hoisted out.
123
+ const live_axis = heights.map((height, axis) => pbc[axis] && Number.isFinite(height));
124
+ const image_near_cell = (frac, shift, axis_cutoff) => {
125
+ const shifted = frac + shift;
126
+ return shifted >= -axis_cutoff && shifted <= 1 + axis_cutoff;
127
+ };
128
+ let capped = false;
129
+ const image_sites = [];
130
+ for (const [orig_idx, site] of cell_sites.entries()) {
131
+ const radius = radii[orig_idx];
132
+ if (radius === 0)
133
+ continue; // no covalent radius → no bonds → no images
134
+ const reach = reach_of(radius);
135
+ // `cutoff` = fractional reach for the near-cell filter (keep an image shifted by `s`
136
+ // iff abc+s lands within `cutoff` of [0,1]); `n_shells` bounds the loop so no
137
+ // in-reach copy is missed.
138
+ const cutoff = heights.map((height, axis) => (live_axis[axis] ? reach / height : Infinity));
139
+ const n_shells = heights.map((height, axis) => {
140
+ if (!live_axis[axis])
141
+ return 0;
142
+ const shells = Math.floor(1 + reach / height);
143
+ if (shells > MAX_IMAGE_SHELLS)
144
+ capped = true;
145
+ return Math.min(MAX_IMAGE_SHELLS, shells);
146
+ });
147
+ const [frac_a, frac_b, frac_c] = site.abc; // periodic axes wrapped into [0, 1)
148
+ for (let dx = -n_shells[0]; dx <= n_shells[0]; dx++) {
149
+ if (!image_near_cell(frac_a, dx, cutoff[0]))
150
+ continue;
151
+ for (let dy = -n_shells[1]; dy <= n_shells[1]; dy++) {
152
+ if (!image_near_cell(frac_b, dy, cutoff[1]))
153
+ continue;
154
+ for (let dz = -n_shells[2]; dz <= n_shells[2]; dz++) {
155
+ if (dx === 0 && dy === 0 && dz === 0)
156
+ continue;
157
+ if (!image_near_cell(frac_c, dz, cutoff[2]))
158
+ continue;
159
+ image_sites.push(build_image_site(site, frac_to_cart, [dx, dy, dz], orig_idx));
160
+ }
161
+ }
162
+ }
163
+ }
164
+ if (capped) {
165
+ console.warn(`[coordination] cell is very thin or oblique relative to bond reach; capping ` +
166
+ `PBC images at ${MAX_IMAGE_SHELLS} shells/axis, coordination near cell ` +
167
+ `boundaries may be undercounted`);
168
+ }
169
+ return { ...structure, sites: [...cell_sites, ...image_sites] };
103
170
  }
104
- export function get_coordination_colors(structure, strategy = `electroneg_ratio`, scale = DEFAULT_COLOR_SCALE, type = `continuous`) {
105
- const orig_site_count = structure.sites.length;
106
- // Check if structure has periodic boundary conditions
171
+ // PBC-aware coordination: expand periodic cells with image atoms (so boundary atoms get
172
+ // full coordination), counting only original atoms as centers. Shared by the 3D viewer and
173
+ // CoordinationBarPlot so both report identical numbers.
174
+ export function calc_structure_coordination(structure, strategy = `electroneg_ratio`) {
107
175
  const has_lattice = `lattice` in structure && structure.lattice !== undefined;
108
176
  const pbc = has_lattice ? structure.lattice.pbc : undefined;
109
177
  const has_pbc = has_lattice && (pbc === undefined || pbc.some(Boolean));
110
- // For PBC structures, expand with images from neighboring cells for accurate coordination
111
- const coord_structure = has_pbc ? expand_structure_for_pbc(structure) : structure;
112
- // Calculate coordination numbers on the (potentially expanded) structure
113
- const all_coord_data = calc_coordination_nums(coord_structure, strategy);
114
- // Extract coordination numbers only for the original sites (not image atoms)
115
- const coord_nums = all_coord_data.sites
116
- .slice(0, orig_site_count)
117
- .map((site) => site.coordination_num);
178
+ // Image atoms still count as neighbors but aren't iterated as centers (big speedup)
179
+ const coord_structure = has_pbc ? expand_structure_for_pbc(structure, strategy) : structure;
180
+ return calc_coordination_nums(coord_structure, strategy, structure.sites.length);
181
+ }
182
+ export function get_coordination_colors(structure, strategy = `electroneg_ratio`, scale = DEFAULT_COLOR_SCALE, type = `continuous`) {
183
+ // sites is already limited to the original atoms (calc_coordination_nums center_count)
184
+ const coord_nums = calc_structure_coordination(structure, strategy).sites.map((site) => site.coordination_num);
118
185
  const { colors, unique_values } = apply_color_scale(coord_nums, scale, type);
119
186
  return build_prop_colors(coord_nums, colors, unique_values);
120
187
  }
@@ -52,12 +52,10 @@ function formal_charge(symbol, bond_valence) {
52
52
  const is_main_group = (symbol) => symbol in ATOMIC_VALENCE;
53
53
  // Cap per-fragment valence enumeration (3^k for catenated S/Se/Te/P chains).
54
54
  const MAX_VALENCE_COMBOS = 4096;
55
+ // Edges are bounds-checked by perceive_bond_orders before reaching here.
55
56
  function split_fragments(n_atoms, edges) {
56
57
  const adjacency = Array.from({ length: n_atoms }, () => []);
57
58
  for (const [atom_idx_1, atom_idx_2] of edges) {
58
- if (adjacency[atom_idx_1] === undefined || adjacency[atom_idx_2] === undefined) {
59
- throw new Error(`Invalid edge ${atom_idx_1}-${atom_idx_2} for ${n_atoms} atoms`);
60
- }
61
59
  adjacency[atom_idx_1].push(atom_idx_2);
62
60
  adjacency[atom_idx_2].push(atom_idx_1);
63
61
  }
@@ -140,9 +138,6 @@ function assign_bond_orders(edges, target_valence) {
140
138
  function find_rings(n_atoms, edges) {
141
139
  const adjacency = Array.from({ length: n_atoms }, () => new Set());
142
140
  for (const [atom_idx_1, atom_idx_2] of edges) {
143
- if (adjacency[atom_idx_1] === undefined || adjacency[atom_idx_2] === undefined) {
144
- throw new Error(`Invalid edge ${atom_idx_1}-${atom_idx_2} for ${n_atoms} atoms`);
145
- }
146
141
  adjacency[atom_idx_1].add(atom_idx_2);
147
142
  adjacency[atom_idx_2].add(atom_idx_1);
148
143
  }
@@ -200,7 +195,6 @@ function find_rings(n_atoms, edges) {
200
195
  }
201
196
  return [...uniq.values()];
202
197
  }
203
- const order_to_bond_order = (order) => order >= 3 ? 3 : order === 2 ? 2 : 1;
204
198
  // Conservative planarity check: degenerate first-3-atom planes are non-planar.
205
199
  function ring_is_planar(ring, sites) {
206
200
  if (ring.length < 3)
@@ -294,7 +288,8 @@ export function perceive_bond_orders(sites, bonds, opts = {}) {
294
288
  if (!solved)
295
289
  continue;
296
290
  local_edges.forEach((edge, edge_idx) => {
297
- const order = order_to_bond_order(solved[edge_idx]);
291
+ const solved_order = solved[edge_idx];
292
+ const order = solved_order >= 3 ? 3 : solved_order === 2 ? 2 : 1;
298
293
  result.set(edge.bond, { ...edge.bond, bond_order: order, perceived: true });
299
294
  });
300
295
  // Hückel aromatic post-pass, retaining Kekulé orders for display toggles.
@@ -1,8 +1,9 @@
1
1
  import type { ElementSymbol } from '../element';
2
2
  import type { Vec3 } from '../math';
3
3
  import type { AnyStructure, BondOrder, BondPair, Site, StructureBond } from './';
4
- export declare const element_lookup: Map<"S" | "K" | "B" | "H" | "He" | "Li" | "Be" | "C" | "N" | "O" | "F" | "Ne" | "Na" | "Mg" | "Al" | "Si" | "P" | "Cl" | "Ar" | "Ca" | "Sc" | "Ti" | "V" | "Cr" | "Mn" | "Fe" | "Co" | "Ni" | "Cu" | "Zn" | "Ga" | "Ge" | "As" | "Se" | "Br" | "Kr" | "Rb" | "Sr" | "Y" | "Zr" | "Nb" | "Mo" | "Tc" | "Ru" | "Rh" | "Pd" | "Ag" | "Cd" | "In" | "Sn" | "Sb" | "Te" | "I" | "Xe" | "Cs" | "Ba" | "La" | "Ce" | "Pr" | "Nd" | "Pm" | "Sm" | "Eu" | "Gd" | "Tb" | "Dy" | "Ho" | "Er" | "Tm" | "Yb" | "Lu" | "Hf" | "Ta" | "W" | "Re" | "Os" | "Ir" | "Pt" | "Au" | "Hg" | "Tl" | "Pb" | "Bi" | "Po" | "At" | "Rn" | "Fr" | "Ra" | "Ac" | "Th" | "Pa" | "U" | "Np" | "Pu" | "Am" | "Cm" | "Bk" | "Cf" | "Es" | "Fm" | "Md" | "No" | "Lr" | "Rf" | "Db" | "Sg" | "Bh" | "Hs" | "Mt" | "Ds" | "Rg" | "Cn" | "Nh" | "Fl" | "Mc" | "Lv" | "Ts" | "Og", import("../element").ChemicalElement>;
5
4
  export declare const get_majority_element: (site: Site | undefined) => ElementSymbol | null;
5
+ export declare const is_spectator_center: (element: string) => boolean;
6
+ export declare function has_framework_potential(elements: Iterable<string>): boolean;
6
7
  export declare const normalize_structure_bond: (site_idx_1: number, site_idx_2: number, order: BondOrder, cell_shift?: Vec3) => StructureBond;
7
8
  export declare const get_bond_key: (idx_1: number, idx_2: number, cell_shift?: Vec3) => string;
8
9
  export declare function remap_bonds_after_deletion(bonds: readonly StructureBond[], deleted_indices: ReadonlySet<number>): StructureBond[];
@@ -39,12 +40,14 @@ export declare function apply_explicit_bond_metadata(structure: AnyStructure, bo
39
40
  export declare function scale_and_offset_bond_matrix(transform_matrix: Float32Array, offset: number, radius_scale: number): Float32Array;
40
41
  export declare function get_bond_render_matrices(bond: BondPair, bond_thickness: number): Float32Array[];
41
42
  export declare function compute_bond_transform(pos_1: Vec3, pos_2: Vec3): Float32Array;
43
+ export declare const pack_cell_key: (x: number, y: number, z: number) => number;
42
44
  export declare const BONDING_STRATEGIES: {
43
45
  readonly electroneg_ratio: typeof electroneg_ratio;
44
46
  readonly solid_angle: typeof solid_angle;
45
47
  };
46
48
  export type BondingStrategy = keyof typeof BONDING_STRATEGIES;
47
49
  export type BondingAlgo = (typeof BONDING_STRATEGIES)[BondingStrategy];
50
+ export declare function compute_bonds(structure: AnyStructure, strategy: BondingStrategy, options?: Record<string, unknown>): BondPair[];
48
51
  export declare function electroneg_ratio(structure: AnyStructure, { electronegativity_threshold, // Max electronegativity difference for bonding
49
52
  max_distance_ratio, // Max distance as multiple of sum of covalent radii
50
53
  min_bond_dist, // Minimum bond distance in Angstroms
@@ -52,7 +55,8 @@ metal_metal_penalty, // Strength penalty for metal-metal bonds
52
55
  metal_nonmetal_bonus, // Strength bonus for metal-nonmetal bonds
53
56
  similar_electronegativity_bonus, // Bonus for similar electronegativity
54
57
  same_species_penalty, // Penalty for bonds between same element
55
- strength_threshold, }?: {
58
+ strength_threshold, // Minimum bond strength to include in results
59
+ center_count, }?: {
56
60
  electronegativity_threshold?: number | undefined;
57
61
  max_distance_ratio?: number | undefined;
58
62
  min_bond_dist?: number | undefined;
@@ -61,12 +65,14 @@ strength_threshold, }?: {
61
65
  similar_electronegativity_bonus?: number | undefined;
62
66
  same_species_penalty?: number | undefined;
63
67
  strength_threshold?: number | undefined;
68
+ center_count?: number | undefined;
64
69
  }): BondPair[];
65
- export declare function solid_angle(structure: AnyStructure, { min_solid_angle, min_face_area, max_distance, min_bond_dist, strength_threshold, }?: {
70
+ export declare function solid_angle(structure: AnyStructure, { min_solid_angle, min_face_area, max_distance, min_bond_dist, strength_threshold, center_count, }?: {
66
71
  min_solid_angle?: number | undefined;
67
72
  min_face_area?: number | undefined;
68
73
  max_distance?: number | undefined;
69
74
  min_bond_dist?: number | undefined;
70
75
  strength_threshold?: number | undefined;
76
+ center_count?: number | undefined;
71
77
  }): BondPair[];
72
78
  export {};