matterviz 0.3.4 → 0.3.6

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 (852) hide show
  1. package/.vscode/launch.json +13 -0
  2. package/.vscodeignore +7 -0
  3. package/dist/assets/STLExporter-BpTH3YHE.js +8 -0
  4. package/dist/assets/browser-DdDecX_W.js +1 -0
  5. package/dist/assets/export-qgn-H9y6.js +2 -0
  6. package/dist/assets/main-DiKYzti2.css +1 -0
  7. package/dist/assets/moyo_wasm_bg-0ocwg7xY.wasm +0 -0
  8. package/dist/extension.js +31293 -0
  9. package/dist/src/lib/FilePicker.svelte +360 -0
  10. package/dist/src/lib/MillerIndexInput.svelte +66 -0
  11. package/dist/src/lib/api/mp.ts +26 -0
  12. package/dist/src/lib/api/optimade.ts +204 -0
  13. package/dist/src/lib/app.css +247 -0
  14. package/dist/src/lib/brillouin/BrillouinZone.svelte +549 -0
  15. package/dist/src/lib/brillouin/BrillouinZoneControls.svelte +144 -0
  16. package/dist/src/lib/brillouin/BrillouinZoneExportPane.svelte +146 -0
  17. package/dist/src/lib/brillouin/BrillouinZoneInfoPane.svelte +146 -0
  18. package/dist/src/lib/brillouin/BrillouinZoneScene.svelte +476 -0
  19. package/dist/src/lib/brillouin/BrillouinZoneTooltip.svelte +92 -0
  20. package/dist/src/lib/brillouin/compute.ts +529 -0
  21. package/dist/src/lib/brillouin/index.ts +8 -0
  22. package/dist/src/lib/brillouin/types.ts +51 -0
  23. package/dist/src/lib/chempot-diagram/ChemPotDiagram.svelte +327 -0
  24. package/dist/src/lib/chempot-diagram/ChemPotDiagram2D.svelte +846 -0
  25. package/dist/src/lib/chempot-diagram/ChemPotDiagram3D.svelte +3193 -0
  26. package/dist/src/lib/chempot-diagram/async-compute.svelte.ts +94 -0
  27. package/dist/src/lib/chempot-diagram/chempot-worker.ts +11 -0
  28. package/dist/src/lib/chempot-diagram/color.ts +42 -0
  29. package/dist/src/lib/chempot-diagram/compute.ts +1014 -0
  30. package/dist/src/lib/chempot-diagram/index.ts +6 -0
  31. package/dist/src/lib/chempot-diagram/pointer.ts +56 -0
  32. package/dist/src/lib/chempot-diagram/temperature.ts +77 -0
  33. package/dist/src/lib/chempot-diagram/types.ts +130 -0
  34. package/dist/src/lib/colors/index.ts +249 -0
  35. package/dist/src/lib/composition/BarChart.svelte +297 -0
  36. package/dist/src/lib/composition/BubbleChart.svelte +218 -0
  37. package/dist/src/lib/composition/Composition.svelte +165 -0
  38. package/dist/src/lib/composition/Formula.svelte +268 -0
  39. package/dist/src/lib/composition/FormulaFilter.svelte +1257 -0
  40. package/dist/src/lib/composition/PieChart.svelte +323 -0
  41. package/dist/src/lib/composition/format.ts +155 -0
  42. package/dist/src/lib/composition/index.ts +37 -0
  43. package/dist/src/lib/composition/parse.ts +605 -0
  44. package/dist/src/lib/constants.ts +134 -0
  45. package/dist/src/lib/controls.ts +42 -0
  46. package/dist/src/lib/convex-hull/ConvexHull.svelte +157 -0
  47. package/dist/src/lib/convex-hull/ConvexHull2D.svelte +825 -0
  48. package/dist/src/lib/convex-hull/ConvexHull3D.svelte +1801 -0
  49. package/dist/src/lib/convex-hull/ConvexHull4D.svelte +1398 -0
  50. package/dist/src/lib/convex-hull/ConvexHullControls.svelte +535 -0
  51. package/dist/src/lib/convex-hull/ConvexHullInfoPane.svelte +125 -0
  52. package/dist/src/lib/convex-hull/ConvexHullStats.svelte +929 -0
  53. package/dist/src/lib/convex-hull/ConvexHullTooltip.svelte +131 -0
  54. package/dist/src/lib/convex-hull/GasPressureControls.svelte +247 -0
  55. package/dist/src/lib/convex-hull/StructurePopup.svelte +151 -0
  56. package/dist/src/lib/convex-hull/TemperatureSlider.svelte +140 -0
  57. package/dist/src/lib/convex-hull/barycentric-coords.ts +246 -0
  58. package/dist/src/lib/convex-hull/demo-temperature.ts +63 -0
  59. package/dist/src/lib/convex-hull/gas-thermodynamics.ts +405 -0
  60. package/dist/src/lib/convex-hull/helpers.ts +932 -0
  61. package/dist/src/lib/convex-hull/index.ts +202 -0
  62. package/dist/src/lib/convex-hull/thermodynamics.ts +2192 -0
  63. package/dist/src/lib/convex-hull/types.ts +267 -0
  64. package/dist/src/lib/coordination/CoordinationBarPlot.svelte +311 -0
  65. package/dist/src/lib/coordination/calc-coordination.ts +93 -0
  66. package/dist/src/lib/coordination/index.ts +9 -0
  67. package/dist/src/lib/effects.svelte.ts +48 -0
  68. package/dist/src/lib/element/BohrAtom.svelte +147 -0
  69. package/dist/src/lib/element/ElementHeading.svelte +26 -0
  70. package/dist/src/lib/element/ElementPhoto.svelte +57 -0
  71. package/dist/src/lib/element/ElementStats.svelte +80 -0
  72. package/dist/src/lib/element/ElementTile.svelte +484 -0
  73. package/dist/src/lib/element/data.json.gz.d.ts +4 -0
  74. package/dist/src/lib/element/data.ts +14 -0
  75. package/dist/src/lib/element/index.ts +8 -0
  76. package/dist/src/lib/element/types.ts +62 -0
  77. package/dist/src/lib/feedback/ClickFeedback.svelte +58 -0
  78. package/dist/src/lib/feedback/DragOverlay.svelte +42 -0
  79. package/dist/src/lib/feedback/index.ts +4 -0
  80. package/dist/src/lib/fermi-surface/FermiSlice.svelte +189 -0
  81. package/dist/src/lib/fermi-surface/FermiSurface.svelte +600 -0
  82. package/dist/src/lib/fermi-surface/FermiSurfaceControls.svelte +448 -0
  83. package/dist/src/lib/fermi-surface/FermiSurfaceScene.svelte +794 -0
  84. package/dist/src/lib/fermi-surface/FermiSurfaceTooltip.svelte +111 -0
  85. package/dist/src/lib/fermi-surface/compute.ts +728 -0
  86. package/dist/src/lib/fermi-surface/constants.ts +32 -0
  87. package/dist/src/lib/fermi-surface/export.ts +64 -0
  88. package/dist/src/lib/fermi-surface/index.ts +14 -0
  89. package/dist/src/lib/fermi-surface/marching-cubes.ts +3 -0
  90. package/dist/src/lib/fermi-surface/parse.ts +574 -0
  91. package/dist/src/lib/fermi-surface/symmetry.ts +56 -0
  92. package/dist/src/lib/fermi-surface/types.ts +159 -0
  93. package/dist/src/lib/heatmap-matrix/HeatmapMatrix.svelte +1545 -0
  94. package/dist/src/lib/heatmap-matrix/HeatmapMatrixControls.svelte +225 -0
  95. package/dist/src/lib/heatmap-matrix/index.ts +167 -0
  96. package/dist/src/lib/heatmap-matrix/shared.ts +7 -0
  97. package/dist/src/lib/icons.ts +650 -0
  98. package/dist/src/lib/index.ts +61 -0
  99. package/dist/src/lib/io/decompress.ts +92 -0
  100. package/dist/src/lib/io/export.ts +385 -0
  101. package/dist/src/lib/io/fetch.ts +46 -0
  102. package/dist/src/lib/io/file-drop.ts +51 -0
  103. package/dist/src/lib/io/index.ts +7 -0
  104. package/dist/src/lib/io/is-binary.ts +24 -0
  105. package/dist/src/lib/io/types.ts +8 -0
  106. package/dist/src/lib/io/url-drop.ts +141 -0
  107. package/dist/src/lib/isosurface/Isosurface.svelte +285 -0
  108. package/dist/src/lib/isosurface/IsosurfaceControls.svelte +277 -0
  109. package/dist/src/lib/isosurface/index.ts +7 -0
  110. package/dist/src/lib/isosurface/parse.ts +656 -0
  111. package/dist/src/lib/isosurface/slice.ts +175 -0
  112. package/dist/src/lib/isosurface/types.ts +309 -0
  113. package/dist/src/lib/labels.ts +320 -0
  114. package/dist/src/lib/layout/FullscreenToggle.svelte +50 -0
  115. package/dist/src/lib/layout/InfoCard.svelte +120 -0
  116. package/dist/src/lib/layout/InfoTag.svelte +185 -0
  117. package/dist/src/lib/layout/PropertyFilter.svelte +246 -0
  118. package/dist/src/lib/layout/SettingsSection.svelte +148 -0
  119. package/dist/src/lib/layout/SubpageGrid.svelte +82 -0
  120. package/dist/src/lib/layout/fullscreen.ts +65 -0
  121. package/dist/src/lib/layout/index.ts +11 -0
  122. package/dist/src/lib/layout/json-tree/JsonNode.svelte +548 -0
  123. package/dist/src/lib/layout/json-tree/JsonTree.svelte +1230 -0
  124. package/dist/src/lib/layout/json-tree/JsonValue.svelte +334 -0
  125. package/dist/src/lib/layout/json-tree/index.ts +3 -0
  126. package/dist/src/lib/layout/json-tree/types.ts +126 -0
  127. package/dist/src/lib/layout/json-tree/utils.ts +682 -0
  128. package/dist/src/lib/marching-cubes.ts +614 -0
  129. package/dist/src/lib/math.ts +1081 -0
  130. package/dist/src/lib/overlays/ContextMenu.svelte +162 -0
  131. package/dist/src/lib/overlays/CopyButton.svelte +45 -0
  132. package/dist/src/lib/overlays/DragControlTab.svelte +98 -0
  133. package/dist/src/lib/overlays/DraggablePane.svelte +487 -0
  134. package/dist/src/lib/overlays/InfoPaneCards.svelte +149 -0
  135. package/dist/src/lib/overlays/index.ts +3 -0
  136. package/dist/src/lib/periodic-table/PeriodicTable.svelte +469 -0
  137. package/dist/src/lib/periodic-table/PeriodicTableControls.svelte +557 -0
  138. package/dist/src/lib/periodic-table/PropertySelect.svelte +37 -0
  139. package/dist/src/lib/periodic-table/index.ts +12 -0
  140. package/dist/src/lib/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +1086 -0
  141. package/dist/src/lib/phase-diagram/PhaseDiagramControls.svelte +444 -0
  142. package/dist/src/lib/phase-diagram/PhaseDiagramEditorPane.svelte +126 -0
  143. package/dist/src/lib/phase-diagram/PhaseDiagramExportPane.svelte +184 -0
  144. package/dist/src/lib/phase-diagram/PhaseDiagramTooltip.svelte +391 -0
  145. package/dist/src/lib/phase-diagram/TdbInfoPanel.svelte +203 -0
  146. package/dist/src/lib/phase-diagram/build-diagram.ts +186 -0
  147. package/dist/src/lib/phase-diagram/colors.ts +58 -0
  148. package/dist/src/lib/phase-diagram/diagram-input.ts +40 -0
  149. package/dist/src/lib/phase-diagram/index.ts +13 -0
  150. package/dist/src/lib/phase-diagram/parse.ts +348 -0
  151. package/dist/src/lib/phase-diagram/svg-to-diagram.ts +1023 -0
  152. package/dist/src/lib/phase-diagram/types.ts +144 -0
  153. package/dist/src/lib/phase-diagram/utils.ts +775 -0
  154. package/dist/src/lib/plot/AxisLabel.svelte +51 -0
  155. package/dist/src/lib/plot/BarPlot.svelte +2113 -0
  156. package/dist/src/lib/plot/BarPlotControls.svelte +66 -0
  157. package/dist/src/lib/plot/BinnedScatterPlot.svelte +1114 -0
  158. package/dist/src/lib/plot/ColorBar.svelte +721 -0
  159. package/dist/src/lib/plot/ColorScaleSelect.svelte +54 -0
  160. package/dist/src/lib/plot/ElementScatter.svelte +63 -0
  161. package/dist/src/lib/plot/FillArea.svelte +223 -0
  162. package/dist/src/lib/plot/Histogram.svelte +1558 -0
  163. package/dist/src/lib/plot/HistogramControls.svelte +212 -0
  164. package/dist/src/lib/plot/InteractiveAxisLabel.svelte +96 -0
  165. package/dist/src/lib/plot/Line.svelte +84 -0
  166. package/dist/src/lib/plot/PlotAxis.svelte +169 -0
  167. package/dist/src/lib/plot/PlotControls.svelte +537 -0
  168. package/dist/src/lib/plot/PlotLegend.svelte +569 -0
  169. package/dist/src/lib/plot/PlotTooltip.svelte +67 -0
  170. package/dist/src/lib/plot/PortalSelect.svelte +253 -0
  171. package/dist/src/lib/plot/ReferenceLine3D.svelte +156 -0
  172. package/dist/src/lib/plot/ReferencePlane.svelte +175 -0
  173. package/dist/src/lib/plot/ScatterPlot.svelte +2778 -0
  174. package/dist/src/lib/plot/ScatterPlot3D.svelte +529 -0
  175. package/dist/src/lib/plot/ScatterPlot3DControls.svelte +437 -0
  176. package/dist/src/lib/plot/ScatterPlot3DScene.svelte +912 -0
  177. package/dist/src/lib/plot/ScatterPlotControls.svelte +306 -0
  178. package/dist/src/lib/plot/ScatterPoint.svelte +182 -0
  179. package/dist/src/lib/plot/SpacegroupBarPlot.svelte +293 -0
  180. package/dist/src/lib/plot/Surface3D.svelte +197 -0
  181. package/dist/src/lib/plot/ZeroLines.svelte +97 -0
  182. package/dist/src/lib/plot/ZoomRect.svelte +23 -0
  183. package/dist/src/lib/plot/adaptive-density.ts +316 -0
  184. package/dist/src/lib/plot/auto-place.ts +184 -0
  185. package/dist/src/lib/plot/axis-utils.ts +122 -0
  186. package/dist/src/lib/plot/binned-scatter-types.ts +83 -0
  187. package/dist/src/lib/plot/data-cleaning.ts +1069 -0
  188. package/dist/src/lib/plot/data-transform.ts +69 -0
  189. package/dist/src/lib/plot/defaults.ts +9 -0
  190. package/dist/src/lib/plot/fill-utils.ts +494 -0
  191. package/dist/src/lib/plot/hover-lock.svelte.ts +60 -0
  192. package/dist/src/lib/plot/index.ts +53 -0
  193. package/dist/src/lib/plot/interactions.ts +119 -0
  194. package/dist/src/lib/plot/layout.ts +425 -0
  195. package/dist/src/lib/plot/reference-line.ts +426 -0
  196. package/dist/src/lib/plot/scales.ts +654 -0
  197. package/dist/src/lib/plot/svg.ts +23 -0
  198. package/dist/src/lib/plot/types.ts +1144 -0
  199. package/dist/src/lib/plot/utils/label-placement.ts +541 -0
  200. package/dist/src/lib/plot/utils/series-visibility.ts +140 -0
  201. package/dist/src/lib/plot/utils.ts +11 -0
  202. package/dist/src/lib/rdf/RdfPlot.svelte +247 -0
  203. package/dist/src/lib/rdf/calc-rdf.ts +167 -0
  204. package/dist/src/lib/rdf/index.ts +27 -0
  205. package/dist/src/lib/sanitize.ts +126 -0
  206. package/dist/src/lib/settings.ts +1479 -0
  207. package/dist/src/lib/spectral/Bands.svelte +1040 -0
  208. package/dist/src/lib/spectral/BandsAndDos.svelte +134 -0
  209. package/dist/src/lib/spectral/BrillouinBandsDos.svelte +252 -0
  210. package/dist/src/lib/spectral/Dos.svelte +697 -0
  211. package/dist/src/lib/spectral/helpers.ts +1381 -0
  212. package/dist/src/lib/spectral/index.ts +8 -0
  213. package/dist/src/lib/spectral/types.ts +112 -0
  214. package/dist/src/lib/state.svelte.ts +64 -0
  215. package/dist/src/lib/structure/Arrow.svelte +72 -0
  216. package/dist/src/lib/structure/AtomLegend.svelte +815 -0
  217. package/dist/src/lib/structure/Bond.svelte +140 -0
  218. package/dist/src/lib/structure/CanvasTooltip.svelte +33 -0
  219. package/dist/src/lib/structure/CellSelect.svelte +349 -0
  220. package/dist/src/lib/structure/Cylinder.svelte +45 -0
  221. package/dist/src/lib/structure/Lattice.svelte +196 -0
  222. package/dist/src/lib/structure/Structure.svelte +2248 -0
  223. package/dist/src/lib/structure/StructureControls.svelte +1273 -0
  224. package/dist/src/lib/structure/StructureExportPane.svelte +252 -0
  225. package/dist/src/lib/structure/StructureInfoPane.svelte +737 -0
  226. package/dist/src/lib/structure/StructureScene.svelte +2255 -0
  227. package/dist/src/lib/structure/atom-properties.ts +316 -0
  228. package/dist/src/lib/structure/bond-order-perception.ts +447 -0
  229. package/dist/src/lib/structure/bonding.ts +944 -0
  230. package/dist/src/lib/structure/export.ts +861 -0
  231. package/dist/src/lib/structure/index.ts +291 -0
  232. package/dist/src/lib/structure/label-placement.ts +130 -0
  233. package/dist/src/lib/structure/measure.ts +45 -0
  234. package/dist/src/lib/structure/parse.ts +1705 -0
  235. package/dist/src/lib/structure/partial-occupancy.ts +183 -0
  236. package/dist/src/lib/structure/pbc.ts +164 -0
  237. package/dist/src/lib/structure/supercell.ts +226 -0
  238. package/dist/src/lib/structure/validation.ts +11 -0
  239. package/dist/src/lib/symmetry/SymmetryStats.svelte +226 -0
  240. package/dist/src/lib/symmetry/WyckoffTable.svelte +120 -0
  241. package/dist/src/lib/symmetry/cell-transform.ts +118 -0
  242. package/dist/src/lib/symmetry/index.ts +348 -0
  243. package/dist/src/lib/symmetry/spacegroups.ts +404 -0
  244. package/dist/src/lib/table/HeatmapTable.svelte +1833 -0
  245. package/dist/src/lib/table/ToggleMenu.svelte +385 -0
  246. package/dist/src/lib/table/index.ts +139 -0
  247. package/dist/src/lib/theme/ThemeControl.svelte +53 -0
  248. package/dist/src/lib/theme/index.ts +107 -0
  249. package/dist/src/lib/theme/themes.mjs +297 -0
  250. package/dist/src/lib/time.ts +71 -0
  251. package/dist/src/lib/tooltip/TooltipContent.svelte +58 -0
  252. package/dist/src/lib/tooltip/index.ts +2 -0
  253. package/dist/src/lib/tooltip/types.ts +13 -0
  254. package/dist/src/lib/trajectory/Trajectory.svelte +1545 -0
  255. package/dist/src/lib/trajectory/TrajectoryError.svelte +128 -0
  256. package/dist/src/lib/trajectory/TrajectoryExportPane.svelte +357 -0
  257. package/dist/src/lib/trajectory/TrajectoryInfoPane.svelte +313 -0
  258. package/dist/src/lib/trajectory/constants.ts +7 -0
  259. package/dist/src/lib/trajectory/extract.ts +196 -0
  260. package/dist/src/lib/trajectory/format-detect.ts +96 -0
  261. package/dist/src/lib/trajectory/frame-reader.ts +456 -0
  262. package/dist/src/lib/trajectory/helpers.ts +217 -0
  263. package/dist/src/lib/trajectory/index.ts +218 -0
  264. package/dist/src/lib/trajectory/parse/ase.ts +109 -0
  265. package/dist/src/lib/trajectory/parse/hdf5.ts +173 -0
  266. package/dist/src/lib/trajectory/parse/index.ts +411 -0
  267. package/dist/src/lib/trajectory/parse/lammps.ts +215 -0
  268. package/dist/src/lib/trajectory/parse/vasp.ts +102 -0
  269. package/dist/src/lib/trajectory/parse/xyz.ts +143 -0
  270. package/dist/src/lib/trajectory/plotting.ts +599 -0
  271. package/dist/src/lib/trajectory/types.ts +13 -0
  272. package/dist/src/lib/utils.ts +56 -0
  273. package/dist/src/lib/xrd/XrdPlot.svelte +615 -0
  274. package/dist/src/lib/xrd/broadening.ts +130 -0
  275. package/dist/src/lib/xrd/calc-xrd.ts +397 -0
  276. package/dist/src/lib/xrd/index.ts +38 -0
  277. package/dist/src/lib/xrd/parse.ts +858 -0
  278. package/dist/webview.js +29421 -0
  279. package/icon.png +0 -0
  280. package/license +1 -1
  281. package/matterviz-0.3.2.vsix +0 -0
  282. package/matterviz-0.3.4.vsix +0 -0
  283. package/matterviz-0.3.5.vsix +0 -0
  284. package/package.json +1461 -231
  285. package/readme.md +171 -98
  286. package/scripts/sync-config.ts +101 -0
  287. package/src/declarations.d.ts +2 -0
  288. package/src/extension.ts +972 -0
  289. package/src/node-io.ts +65 -0
  290. package/src/types.ts +17 -0
  291. package/src/webview/JsonBrowser.svelte +1079 -0
  292. package/src/webview/PlotPanel.svelte +346 -0
  293. package/src/webview/detect.ts +444 -0
  294. package/src/webview/main.ts +764 -0
  295. package/src/webview/plot-utils.ts +250 -0
  296. package/test-fixtures/all-viz-types.json.gz +0 -0
  297. package/test-fixtures/plot-demo-data.json.gz +0 -0
  298. package/tests/detect.test.ts +604 -0
  299. package/tests/extension.test.ts +2041 -0
  300. package/tests/node-io.test.ts +39 -0
  301. package/tests/plot-utils.test.ts +302 -0
  302. package/tests/vite-plugin-json-gz.test.ts +114 -0
  303. package/tests/vscode-mock.ts +18 -0
  304. package/tests/webview.test.ts +231 -0
  305. package/tsconfig.json +20 -0
  306. package/vite-plugin-json-gz.ts +29 -0
  307. package/vite.config.ts +34 -0
  308. package/vite.extension.config.ts +34 -0
  309. package/dist/EmptyState.svelte.d.ts +0 -9
  310. package/dist/FilePicker.svelte +0 -360
  311. package/dist/FilePicker.svelte.d.ts +0 -17
  312. package/dist/Icon.svelte.d.ts +0 -13
  313. package/dist/MillerIndexInput.svelte +0 -66
  314. package/dist/MillerIndexInput.svelte.d.ts +0 -7
  315. package/dist/api/mp.d.ts +0 -6
  316. package/dist/api/mp.js +0 -22
  317. package/dist/api/optimade.d.ts +0 -45
  318. package/dist/api/optimade.js +0 -135
  319. package/dist/app.css +0 -240
  320. package/dist/brillouin/BrillouinZone.svelte +0 -543
  321. package/dist/brillouin/BrillouinZone.svelte.d.ts +0 -83
  322. package/dist/brillouin/BrillouinZoneControls.svelte +0 -144
  323. package/dist/brillouin/BrillouinZoneControls.svelte.d.ts +0 -17
  324. package/dist/brillouin/BrillouinZoneExportPane.svelte +0 -148
  325. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +0 -15
  326. package/dist/brillouin/BrillouinZoneInfoPane.svelte +0 -146
  327. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +0 -13
  328. package/dist/brillouin/BrillouinZoneScene.svelte +0 -476
  329. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +0 -48
  330. package/dist/brillouin/BrillouinZoneTooltip.svelte +0 -92
  331. package/dist/brillouin/BrillouinZoneTooltip.svelte.d.ts +0 -8
  332. package/dist/brillouin/compute.d.ts +0 -17
  333. package/dist/brillouin/compute.js +0 -422
  334. package/dist/brillouin/index.d.ts +0 -8
  335. package/dist/brillouin/index.js +0 -8
  336. package/dist/brillouin/types.d.ts +0 -48
  337. package/dist/brillouin/types.js +0 -1
  338. package/dist/chempot-diagram/ChemPotDiagram.svelte +0 -327
  339. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +0 -13
  340. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +0 -847
  341. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +0 -16
  342. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +0 -3194
  343. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +0 -16
  344. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +0 -7
  345. package/dist/chempot-diagram/async-compute.svelte.d.ts +0 -3
  346. package/dist/chempot-diagram/async-compute.svelte.js +0 -77
  347. package/dist/chempot-diagram/chempot-worker.d.ts +0 -1
  348. package/dist/chempot-diagram/chempot-worker.js +0 -11
  349. package/dist/chempot-diagram/color.d.ts +0 -10
  350. package/dist/chempot-diagram/color.js +0 -32
  351. package/dist/chempot-diagram/compute.d.ts +0 -48
  352. package/dist/chempot-diagram/compute.js +0 -812
  353. package/dist/chempot-diagram/index.d.ts +0 -6
  354. package/dist/chempot-diagram/index.js +0 -6
  355. package/dist/chempot-diagram/pointer.d.ts +0 -16
  356. package/dist/chempot-diagram/pointer.js +0 -40
  357. package/dist/chempot-diagram/temperature.d.ts +0 -15
  358. package/dist/chempot-diagram/temperature.js +0 -36
  359. package/dist/chempot-diagram/types.d.ts +0 -86
  360. package/dist/chempot-diagram/types.js +0 -28
  361. package/dist/colors/index.d.ts +0 -47
  362. package/dist/colors/index.js +0 -203
  363. package/dist/composition/BarChart.svelte +0 -297
  364. package/dist/composition/BarChart.svelte.d.ts +0 -39
  365. package/dist/composition/BubbleChart.svelte +0 -218
  366. package/dist/composition/BubbleChart.svelte.d.ts +0 -28
  367. package/dist/composition/Composition.svelte +0 -164
  368. package/dist/composition/Composition.svelte.d.ts +0 -15
  369. package/dist/composition/Formula.svelte +0 -265
  370. package/dist/composition/Formula.svelte.d.ts +0 -19
  371. package/dist/composition/FormulaFilter.svelte +0 -1259
  372. package/dist/composition/FormulaFilter.svelte.d.ts +0 -51
  373. package/dist/composition/PieChart.svelte +0 -323
  374. package/dist/composition/PieChart.svelte.d.ts +0 -37
  375. package/dist/composition/format.d.ts +0 -15
  376. package/dist/composition/format.js +0 -109
  377. package/dist/composition/index.d.ts +0 -20
  378. package/dist/composition/index.js +0 -14
  379. package/dist/composition/parse.d.ts +0 -55
  380. package/dist/composition/parse.js +0 -459
  381. package/dist/constants.d.ts +0 -29
  382. package/dist/constants.js +0 -105
  383. package/dist/controls.d.ts +0 -14
  384. package/dist/controls.js +0 -30
  385. package/dist/convex-hull/ConvexHull.svelte +0 -157
  386. package/dist/convex-hull/ConvexHull.svelte.d.ts +0 -13
  387. package/dist/convex-hull/ConvexHull2D.svelte +0 -813
  388. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +0 -11
  389. package/dist/convex-hull/ConvexHull3D.svelte +0 -1788
  390. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +0 -8
  391. package/dist/convex-hull/ConvexHull4D.svelte +0 -1374
  392. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +0 -8
  393. package/dist/convex-hull/ConvexHullControls.svelte +0 -546
  394. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +0 -48
  395. package/dist/convex-hull/ConvexHullInfoPane.svelte +0 -115
  396. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +0 -18
  397. package/dist/convex-hull/ConvexHullStats.svelte +0 -905
  398. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +0 -15
  399. package/dist/convex-hull/ConvexHullTooltip.svelte +0 -131
  400. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +0 -33
  401. package/dist/convex-hull/GasPressureControls.svelte +0 -247
  402. package/dist/convex-hull/GasPressureControls.svelte.d.ts +0 -11
  403. package/dist/convex-hull/StructurePopup.svelte +0 -116
  404. package/dist/convex-hull/StructurePopup.svelte.d.ts +0 -18
  405. package/dist/convex-hull/TemperatureSlider.svelte +0 -137
  406. package/dist/convex-hull/TemperatureSlider.svelte.d.ts +0 -8
  407. package/dist/convex-hull/barycentric-coords.d.ts +0 -18
  408. package/dist/convex-hull/barycentric-coords.js +0 -182
  409. package/dist/convex-hull/demo-temperature.d.ts +0 -6
  410. package/dist/convex-hull/demo-temperature.js +0 -40
  411. package/dist/convex-hull/gas-thermodynamics.d.ts +0 -16
  412. package/dist/convex-hull/gas-thermodynamics.js +0 -316
  413. package/dist/convex-hull/helpers.d.ts +0 -103
  414. package/dist/convex-hull/helpers.js +0 -671
  415. package/dist/convex-hull/index.d.ts +0 -118
  416. package/dist/convex-hull/index.js +0 -57
  417. package/dist/convex-hull/thermodynamics.d.ts +0 -66
  418. package/dist/convex-hull/thermodynamics.js +0 -1752
  419. package/dist/convex-hull/types.d.ts +0 -162
  420. package/dist/convex-hull/types.js +0 -36
  421. package/dist/coordination/CoordinationBarPlot.svelte +0 -311
  422. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +0 -30
  423. package/dist/coordination/calc-coordination.d.ts +0 -15
  424. package/dist/coordination/calc-coordination.js +0 -63
  425. package/dist/coordination/index.d.ts +0 -8
  426. package/dist/coordination/index.js +0 -7
  427. package/dist/element/BohrAtom.svelte +0 -149
  428. package/dist/element/BohrAtom.svelte.d.ts +0 -20
  429. package/dist/element/ElementHeading.svelte +0 -26
  430. package/dist/element/ElementHeading.svelte.d.ts +0 -8
  431. package/dist/element/ElementPhoto.svelte +0 -57
  432. package/dist/element/ElementPhoto.svelte.d.ts +0 -9
  433. package/dist/element/ElementStats.svelte +0 -80
  434. package/dist/element/ElementStats.svelte.d.ts +0 -8
  435. package/dist/element/ElementTile.svelte +0 -484
  436. package/dist/element/ElementTile.svelte.d.ts +0 -29
  437. package/dist/element/Nucleus.svelte.d.ts +0 -17
  438. package/dist/element/data.d.ts +0 -3
  439. package/dist/element/data.js +0 -2
  440. package/dist/element/data.json.gz.d.ts +0 -2
  441. package/dist/element/index.d.ts +0 -8
  442. package/dist/element/index.js +0 -8
  443. package/dist/element/types.d.ts +0 -57
  444. package/dist/element/types.js +0 -1
  445. package/dist/feedback/ClickFeedback.svelte +0 -58
  446. package/dist/feedback/ClickFeedback.svelte.d.ts +0 -12
  447. package/dist/feedback/DragOverlay.svelte +0 -42
  448. package/dist/feedback/DragOverlay.svelte.d.ts +0 -7
  449. package/dist/feedback/Spinner.svelte.d.ts +0 -7
  450. package/dist/feedback/StatusMessage.svelte.d.ts +0 -9
  451. package/dist/feedback/index.d.ts +0 -4
  452. package/dist/feedback/index.js +0 -4
  453. package/dist/fermi-surface/FermiSlice.svelte +0 -189
  454. package/dist/fermi-surface/FermiSlice.svelte.d.ts +0 -24
  455. package/dist/fermi-surface/FermiSurface.svelte +0 -597
  456. package/dist/fermi-surface/FermiSurface.svelte.d.ts +0 -83
  457. package/dist/fermi-surface/FermiSurfaceControls.svelte +0 -452
  458. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +0 -35
  459. package/dist/fermi-surface/FermiSurfaceScene.svelte +0 -792
  460. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +0 -50
  461. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +0 -111
  462. package/dist/fermi-surface/FermiSurfaceTooltip.svelte.d.ts +0 -8
  463. package/dist/fermi-surface/compute.d.ts +0 -5
  464. package/dist/fermi-surface/compute.js +0 -538
  465. package/dist/fermi-surface/constants.d.ts +0 -9
  466. package/dist/fermi-surface/constants.js +0 -27
  467. package/dist/fermi-surface/export.d.ts +0 -5
  468. package/dist/fermi-surface/export.js +0 -63
  469. package/dist/fermi-surface/index.d.ts +0 -12
  470. package/dist/fermi-surface/index.js +0 -13
  471. package/dist/fermi-surface/marching-cubes.d.ts +0 -2
  472. package/dist/fermi-surface/marching-cubes.js +0 -2
  473. package/dist/fermi-surface/parse.d.ts +0 -2
  474. package/dist/fermi-surface/parse.js +0 -495
  475. package/dist/fermi-surface/symmetry.d.ts +0 -3
  476. package/dist/fermi-surface/symmetry.js +0 -46
  477. package/dist/fermi-surface/types.d.ts +0 -113
  478. package/dist/fermi-surface/types.js +0 -4
  479. package/dist/heatmap-matrix/HeatmapMatrix.svelte +0 -1527
  480. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +0 -110
  481. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +0 -225
  482. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +0 -30
  483. package/dist/heatmap-matrix/index.d.ts +0 -53
  484. package/dist/heatmap-matrix/index.js +0 -100
  485. package/dist/heatmap-matrix/shared.d.ts +0 -2
  486. package/dist/heatmap-matrix/shared.js +0 -4
  487. package/dist/icons.d.ts +0 -569
  488. package/dist/icons.js +0 -648
  489. package/dist/index.d.ts +0 -39
  490. package/dist/index.js +0 -39
  491. package/dist/io/decompress.d.ts +0 -10
  492. package/dist/io/decompress.js +0 -69
  493. package/dist/io/export.d.ts +0 -16
  494. package/dist/io/export.js +0 -312
  495. package/dist/io/fetch.d.ts +0 -5
  496. package/dist/io/fetch.js +0 -39
  497. package/dist/io/file-drop.d.ts +0 -7
  498. package/dist/io/file-drop.js +0 -43
  499. package/dist/io/index.d.ts +0 -7
  500. package/dist/io/index.js +0 -7
  501. package/dist/io/is-binary.d.ts +0 -1
  502. package/dist/io/is-binary.js +0 -5
  503. package/dist/io/types.d.ts +0 -8
  504. package/dist/io/types.js +0 -1
  505. package/dist/io/url-drop.d.ts +0 -2
  506. package/dist/io/url-drop.js +0 -117
  507. package/dist/isosurface/Isosurface.svelte +0 -285
  508. package/dist/isosurface/Isosurface.svelte.d.ts +0 -8
  509. package/dist/isosurface/IsosurfaceControls.svelte +0 -291
  510. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +0 -9
  511. package/dist/isosurface/index.d.ts +0 -5
  512. package/dist/isosurface/index.js +0 -6
  513. package/dist/isosurface/parse.d.ts +0 -6
  514. package/dist/isosurface/parse.js +0 -553
  515. package/dist/isosurface/slice.d.ts +0 -11
  516. package/dist/isosurface/slice.js +0 -140
  517. package/dist/isosurface/types.d.ts +0 -56
  518. package/dist/isosurface/types.js +0 -227
  519. package/dist/labels.d.ts +0 -53
  520. package/dist/labels.js +0 -274
  521. package/dist/layout/FullscreenToggle.svelte +0 -50
  522. package/dist/layout/FullscreenToggle.svelte.d.ts +0 -7
  523. package/dist/layout/InfoCard.svelte +0 -120
  524. package/dist/layout/InfoCard.svelte.d.ts +0 -21
  525. package/dist/layout/InfoTag.svelte +0 -183
  526. package/dist/layout/InfoTag.svelte.d.ts +0 -19
  527. package/dist/layout/PropertyFilter.svelte +0 -244
  528. package/dist/layout/PropertyFilter.svelte.d.ts +0 -24
  529. package/dist/layout/SettingsSection.svelte +0 -148
  530. package/dist/layout/SettingsSection.svelte.d.ts +0 -17
  531. package/dist/layout/SubpageGrid.svelte +0 -82
  532. package/dist/layout/SubpageGrid.svelte.d.ts +0 -14
  533. package/dist/layout/fullscreen.d.ts +0 -9
  534. package/dist/layout/fullscreen.js +0 -53
  535. package/dist/layout/index.d.ts +0 -10
  536. package/dist/layout/index.js +0 -8
  537. package/dist/layout/json-tree/JsonNode.svelte +0 -547
  538. package/dist/layout/json-tree/JsonNode.svelte.d.ts +0 -11
  539. package/dist/layout/json-tree/JsonTree.svelte +0 -1222
  540. package/dist/layout/json-tree/JsonTree.svelte.d.ts +0 -6
  541. package/dist/layout/json-tree/JsonValue.svelte +0 -334
  542. package/dist/layout/json-tree/JsonValue.svelte.d.ts +0 -9
  543. package/dist/layout/json-tree/index.d.ts +0 -3
  544. package/dist/layout/json-tree/index.js +0 -3
  545. package/dist/layout/json-tree/types.d.ts +0 -73
  546. package/dist/layout/json-tree/types.js +0 -3
  547. package/dist/layout/json-tree/utils.d.ts +0 -29
  548. package/dist/layout/json-tree/utils.js +0 -648
  549. package/dist/marching-cubes.d.ts +0 -14
  550. package/dist/marching-cubes.js +0 -542
  551. package/dist/math.d.ts +0 -91
  552. package/dist/math.js +0 -896
  553. package/dist/overlays/ContextMenu.svelte +0 -162
  554. package/dist/overlays/ContextMenu.svelte.d.ts +0 -25
  555. package/dist/overlays/DraggablePane.svelte +0 -564
  556. package/dist/overlays/DraggablePane.svelte.d.ts +0 -36
  557. package/dist/overlays/index.d.ts +0 -2
  558. package/dist/overlays/index.js +0 -2
  559. package/dist/periodic-table/PeriodicTable.svelte +0 -469
  560. package/dist/periodic-table/PeriodicTable.svelte.d.ts +0 -55
  561. package/dist/periodic-table/PeriodicTableControls.svelte +0 -557
  562. package/dist/periodic-table/PeriodicTableControls.svelte.d.ts +0 -24
  563. package/dist/periodic-table/PropertySelect.svelte +0 -37
  564. package/dist/periodic-table/PropertySelect.svelte.d.ts +0 -13
  565. package/dist/periodic-table/TableInset.svelte.d.ts +0 -9
  566. package/dist/periodic-table/index.d.ts +0 -10
  567. package/dist/periodic-table/index.js +0 -4
  568. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +0 -1086
  569. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +0 -44
  570. package/dist/phase-diagram/PhaseDiagramControls.svelte +0 -451
  571. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +0 -30
  572. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +0 -126
  573. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +0 -15
  574. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +0 -192
  575. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +0 -19
  576. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +0 -392
  577. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +0 -16
  578. package/dist/phase-diagram/TdbInfoPanel.svelte +0 -203
  579. package/dist/phase-diagram/TdbInfoPanel.svelte.d.ts +0 -12
  580. package/dist/phase-diagram/build-diagram.d.ts +0 -11
  581. package/dist/phase-diagram/build-diagram.js +0 -167
  582. package/dist/phase-diagram/colors.d.ts +0 -35
  583. package/dist/phase-diagram/colors.js +0 -51
  584. package/dist/phase-diagram/diagram-input.d.ts +0 -33
  585. package/dist/phase-diagram/diagram-input.js +0 -3
  586. package/dist/phase-diagram/index.d.ts +0 -13
  587. package/dist/phase-diagram/index.js +0 -13
  588. package/dist/phase-diagram/parse.d.ts +0 -55
  589. package/dist/phase-diagram/parse.js +0 -276
  590. package/dist/phase-diagram/svg-to-diagram.d.ts +0 -2
  591. package/dist/phase-diagram/svg-to-diagram.js +0 -869
  592. package/dist/phase-diagram/types.d.ts +0 -99
  593. package/dist/phase-diagram/types.js +0 -1
  594. package/dist/phase-diagram/utils.d.ts +0 -118
  595. package/dist/phase-diagram/utils.js +0 -606
  596. package/dist/plot/AxisLabel.svelte +0 -51
  597. package/dist/plot/AxisLabel.svelte.d.ts +0 -16
  598. package/dist/plot/BarPlot.svelte +0 -2256
  599. package/dist/plot/BarPlot.svelte.d.ts +0 -82
  600. package/dist/plot/BarPlotControls.svelte +0 -66
  601. package/dist/plot/BarPlotControls.svelte.d.ts +0 -18
  602. package/dist/plot/ColorBar.svelte +0 -719
  603. package/dist/plot/ColorBar.svelte.d.ts +0 -31
  604. package/dist/plot/ColorScaleSelect.svelte +0 -54
  605. package/dist/plot/ColorScaleSelect.svelte.d.ts +0 -15
  606. package/dist/plot/ElementScatter.svelte +0 -63
  607. package/dist/plot/ElementScatter.svelte.d.ts +0 -14
  608. package/dist/plot/FillArea.svelte +0 -226
  609. package/dist/plot/FillArea.svelte.d.ts +0 -20
  610. package/dist/plot/Histogram.svelte +0 -1654
  611. package/dist/plot/Histogram.svelte.d.ts +0 -50
  612. package/dist/plot/HistogramControls.svelte +0 -212
  613. package/dist/plot/HistogramControls.svelte.d.ts +0 -22
  614. package/dist/plot/InteractiveAxisLabel.svelte +0 -94
  615. package/dist/plot/InteractiveAxisLabel.svelte.d.ts +0 -14
  616. package/dist/plot/Line.svelte +0 -85
  617. package/dist/plot/Line.svelte.d.ts +0 -15
  618. package/dist/plot/PlotControls.svelte +0 -537
  619. package/dist/plot/PlotControls.svelte.d.ts +0 -4
  620. package/dist/plot/PlotLegend.svelte +0 -498
  621. package/dist/plot/PlotLegend.svelte.d.ts +0 -25
  622. package/dist/plot/PlotTooltip.svelte +0 -67
  623. package/dist/plot/PlotTooltip.svelte.d.ts +0 -17
  624. package/dist/plot/PortalSelect.svelte +0 -253
  625. package/dist/plot/PortalSelect.svelte.d.ts +0 -16
  626. package/dist/plot/ReferenceLine.svelte.d.ts +0 -20
  627. package/dist/plot/ReferenceLine3D.svelte +0 -154
  628. package/dist/plot/ReferenceLine3D.svelte.d.ts +0 -14
  629. package/dist/plot/ReferencePlane.svelte +0 -178
  630. package/dist/plot/ReferencePlane.svelte.d.ts +0 -14
  631. package/dist/plot/ScatterPlot.svelte +0 -2831
  632. package/dist/plot/ScatterPlot.svelte.d.ts +0 -92
  633. package/dist/plot/ScatterPlot3D.svelte +0 -499
  634. package/dist/plot/ScatterPlot3D.svelte.d.ts +0 -94
  635. package/dist/plot/ScatterPlot3DControls.svelte +0 -437
  636. package/dist/plot/ScatterPlot3DControls.svelte.d.ts +0 -20
  637. package/dist/plot/ScatterPlot3DScene.svelte +0 -912
  638. package/dist/plot/ScatterPlot3DScene.svelte.d.ts +0 -74
  639. package/dist/plot/ScatterPlotControls.svelte +0 -307
  640. package/dist/plot/ScatterPlotControls.svelte.d.ts +0 -17
  641. package/dist/plot/ScatterPoint.svelte +0 -185
  642. package/dist/plot/ScatterPoint.svelte.d.ts +0 -19
  643. package/dist/plot/SpacegroupBarPlot.svelte +0 -292
  644. package/dist/plot/SpacegroupBarPlot.svelte.d.ts +0 -9
  645. package/dist/plot/Surface3D.svelte +0 -200
  646. package/dist/plot/Surface3D.svelte.d.ts +0 -13
  647. package/dist/plot/ZeroLines.svelte +0 -96
  648. package/dist/plot/ZeroLines.svelte.d.ts +0 -32
  649. package/dist/plot/ZoomRect.svelte +0 -23
  650. package/dist/plot/ZoomRect.svelte.d.ts +0 -8
  651. package/dist/plot/axis-utils.d.ts +0 -19
  652. package/dist/plot/axis-utils.js +0 -80
  653. package/dist/plot/data-cleaning.d.ts +0 -37
  654. package/dist/plot/data-cleaning.js +0 -855
  655. package/dist/plot/data-transform.d.ts +0 -16
  656. package/dist/plot/data-transform.js +0 -45
  657. package/dist/plot/defaults.d.ts +0 -19
  658. package/dist/plot/defaults.js +0 -9
  659. package/dist/plot/fill-utils.d.ts +0 -51
  660. package/dist/plot/fill-utils.js +0 -337
  661. package/dist/plot/hover-lock.svelte.d.ts +0 -14
  662. package/dist/plot/hover-lock.svelte.js +0 -46
  663. package/dist/plot/index.d.ts +0 -43
  664. package/dist/plot/index.js +0 -37
  665. package/dist/plot/interactions.d.ts +0 -12
  666. package/dist/plot/interactions.js +0 -100
  667. package/dist/plot/layout.d.ts +0 -60
  668. package/dist/plot/layout.js +0 -230
  669. package/dist/plot/reference-line.d.ts +0 -60
  670. package/dist/plot/reference-line.js +0 -316
  671. package/dist/plot/scales.d.ts +0 -48
  672. package/dist/plot/scales.js +0 -484
  673. package/dist/plot/svg.d.ts +0 -1
  674. package/dist/plot/svg.js +0 -11
  675. package/dist/plot/types.d.ts +0 -863
  676. package/dist/plot/types.js +0 -103
  677. package/dist/plot/utils/label-placement.d.ts +0 -47
  678. package/dist/plot/utils/label-placement.js +0 -256
  679. package/dist/plot/utils/series-visibility.d.ts +0 -9
  680. package/dist/plot/utils/series-visibility.js +0 -67
  681. package/dist/plot/utils.d.ts +0 -1
  682. package/dist/plot/utils.js +0 -14
  683. package/dist/rdf/RdfPlot.svelte +0 -247
  684. package/dist/rdf/RdfPlot.svelte.d.ts +0 -27
  685. package/dist/rdf/calc-rdf.d.ts +0 -4
  686. package/dist/rdf/calc-rdf.js +0 -111
  687. package/dist/rdf/index.d.ts +0 -23
  688. package/dist/rdf/index.js +0 -2
  689. package/dist/sanitize.d.ts +0 -4
  690. package/dist/sanitize.js +0 -107
  691. package/dist/settings.d.ts +0 -253
  692. package/dist/settings.js +0 -1123
  693. package/dist/spectral/Bands.svelte +0 -1040
  694. package/dist/spectral/Bands.svelte.d.ts +0 -40
  695. package/dist/spectral/BandsAndDos.svelte +0 -128
  696. package/dist/spectral/BandsAndDos.svelte.d.ts +0 -18
  697. package/dist/spectral/BrillouinBandsDos.svelte +0 -248
  698. package/dist/spectral/BrillouinBandsDos.svelte.d.ts +0 -20
  699. package/dist/spectral/Dos.svelte +0 -697
  700. package/dist/spectral/Dos.svelte.d.ts +0 -29
  701. package/dist/spectral/helpers.d.ts +0 -117
  702. package/dist/spectral/helpers.js +0 -1023
  703. package/dist/spectral/index.d.ts +0 -6
  704. package/dist/spectral/index.js +0 -7
  705. package/dist/spectral/types.d.ts +0 -84
  706. package/dist/spectral/types.js +0 -2
  707. package/dist/state.svelte.d.ts +0 -25
  708. package/dist/state.svelte.js +0 -45
  709. package/dist/structure/Arrow.svelte +0 -72
  710. package/dist/structure/Arrow.svelte.d.ts +0 -15
  711. package/dist/structure/AtomLegend.svelte +0 -798
  712. package/dist/structure/AtomLegend.svelte.d.ts +0 -34
  713. package/dist/structure/Bond.svelte +0 -140
  714. package/dist/structure/Bond.svelte.d.ts +0 -9
  715. package/dist/structure/CanvasTooltip.svelte +0 -33
  716. package/dist/structure/CanvasTooltip.svelte.d.ts +0 -12
  717. package/dist/structure/CellSelect.svelte +0 -351
  718. package/dist/structure/CellSelect.svelte.d.ts +0 -13
  719. package/dist/structure/Cylinder.svelte +0 -45
  720. package/dist/structure/Cylinder.svelte.d.ts +0 -10
  721. package/dist/structure/Lattice.svelte +0 -196
  722. package/dist/structure/Lattice.svelte.d.ts +0 -17
  723. package/dist/structure/Structure.svelte +0 -1857
  724. package/dist/structure/Structure.svelte.d.ts +0 -83
  725. package/dist/structure/StructureControls.svelte +0 -1184
  726. package/dist/structure/StructureControls.svelte.d.ts +0 -31
  727. package/dist/structure/StructureExportPane.svelte +0 -251
  728. package/dist/structure/StructureExportPane.svelte.d.ts +0 -17
  729. package/dist/structure/StructureInfoPane.svelte +0 -434
  730. package/dist/structure/StructureInfoPane.svelte.d.ts +0 -18
  731. package/dist/structure/StructureScene.svelte +0 -1574
  732. package/dist/structure/StructureScene.svelte.d.ts +0 -104
  733. package/dist/structure/atom-properties.d.ts +0 -37
  734. package/dist/structure/atom-properties.js +0 -198
  735. package/dist/structure/bonding.d.ts +0 -33
  736. package/dist/structure/bonding.js +0 -304
  737. package/dist/structure/export.d.ts +0 -20
  738. package/dist/structure/export.js +0 -725
  739. package/dist/structure/ferrox-wasm-types.d.ts +0 -46
  740. package/dist/structure/ferrox-wasm-types.js +0 -18
  741. package/dist/structure/ferrox-wasm.d.ts +0 -94
  742. package/dist/structure/ferrox-wasm.js +0 -249
  743. package/dist/structure/index.d.ts +0 -110
  744. package/dist/structure/index.js +0 -168
  745. package/dist/structure/measure.d.ts +0 -6
  746. package/dist/structure/measure.js +0 -29
  747. package/dist/structure/parse.d.ts +0 -65
  748. package/dist/structure/parse.js +0 -1374
  749. package/dist/structure/partial-occupancy.d.ts +0 -25
  750. package/dist/structure/partial-occupancy.js +0 -99
  751. package/dist/structure/pbc.d.ts +0 -9
  752. package/dist/structure/pbc.js +0 -123
  753. package/dist/structure/supercell.d.ts +0 -8
  754. package/dist/structure/supercell.js +0 -137
  755. package/dist/structure/validation.d.ts +0 -2
  756. package/dist/structure/validation.js +0 -10
  757. package/dist/symmetry/SymmetryStats.svelte +0 -226
  758. package/dist/symmetry/SymmetryStats.svelte.d.ts +0 -21
  759. package/dist/symmetry/WyckoffTable.svelte +0 -113
  760. package/dist/symmetry/WyckoffTable.svelte.d.ts +0 -11
  761. package/dist/symmetry/cell-transform.d.ts +0 -12
  762. package/dist/symmetry/cell-transform.js +0 -77
  763. package/dist/symmetry/index.d.ts +0 -43
  764. package/dist/symmetry/index.js +0 -229
  765. package/dist/symmetry/spacegroups.d.ts +0 -9
  766. package/dist/symmetry/spacegroups.js +0 -394
  767. package/dist/table/HeatmapTable.svelte +0 -1854
  768. package/dist/table/HeatmapTable.svelte.d.ts +0 -49
  769. package/dist/table/ToggleMenu.svelte +0 -376
  770. package/dist/table/ToggleMenu.svelte.d.ts +0 -11
  771. package/dist/table/index.d.ts +0 -74
  772. package/dist/table/index.js +0 -38
  773. package/dist/theme/ThemeControl.svelte +0 -53
  774. package/dist/theme/ThemeControl.svelte.d.ts +0 -9
  775. package/dist/theme/index.d.ts +0 -29
  776. package/dist/theme/index.js +0 -79
  777. package/dist/theme/themes.mjs +0 -285
  778. package/dist/time.d.ts +0 -4
  779. package/dist/time.js +0 -70
  780. package/dist/tooltip/TooltipContent.svelte +0 -58
  781. package/dist/tooltip/TooltipContent.svelte.d.ts +0 -31
  782. package/dist/tooltip/index.d.ts +0 -2
  783. package/dist/tooltip/index.js +0 -2
  784. package/dist/tooltip/types.d.ts +0 -8
  785. package/dist/tooltip/types.js +0 -1
  786. package/dist/trajectory/Trajectory.svelte +0 -1517
  787. package/dist/trajectory/Trajectory.svelte.d.ts +0 -77
  788. package/dist/trajectory/TrajectoryError.svelte +0 -128
  789. package/dist/trajectory/TrajectoryError.svelte.d.ts +0 -13
  790. package/dist/trajectory/TrajectoryExportPane.svelte +0 -357
  791. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +0 -17
  792. package/dist/trajectory/TrajectoryInfoPane.svelte +0 -387
  793. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +0 -17
  794. package/dist/trajectory/constants.d.ts +0 -6
  795. package/dist/trajectory/constants.js +0 -7
  796. package/dist/trajectory/extract.d.ts +0 -5
  797. package/dist/trajectory/extract.js +0 -162
  798. package/dist/trajectory/format-detect.d.ts +0 -9
  799. package/dist/trajectory/format-detect.js +0 -76
  800. package/dist/trajectory/frame-reader.d.ts +0 -17
  801. package/dist/trajectory/frame-reader.js +0 -332
  802. package/dist/trajectory/helpers.d.ts +0 -14
  803. package/dist/trajectory/helpers.js +0 -172
  804. package/dist/trajectory/index.d.ts +0 -63
  805. package/dist/trajectory/index.js +0 -126
  806. package/dist/trajectory/parse/ase.d.ts +0 -2
  807. package/dist/trajectory/parse/ase.js +0 -77
  808. package/dist/trajectory/parse/hdf5.d.ts +0 -2
  809. package/dist/trajectory/parse/hdf5.js +0 -129
  810. package/dist/trajectory/parse/index.d.ts +0 -12
  811. package/dist/trajectory/parse/index.js +0 -299
  812. package/dist/trajectory/parse/lammps.d.ts +0 -5
  813. package/dist/trajectory/parse/lammps.js +0 -179
  814. package/dist/trajectory/parse/vasp.d.ts +0 -2
  815. package/dist/trajectory/parse/vasp.js +0 -68
  816. package/dist/trajectory/parse/xyz.d.ts +0 -2
  817. package/dist/trajectory/parse/xyz.js +0 -110
  818. package/dist/trajectory/plotting.d.ts +0 -28
  819. package/dist/trajectory/plotting.js +0 -423
  820. package/dist/trajectory/types.d.ts +0 -11
  821. package/dist/trajectory/types.js +0 -1
  822. package/dist/utils.d.ts +0 -5
  823. package/dist/utils.js +0 -36
  824. package/dist/xrd/XrdPlot.svelte +0 -615
  825. package/dist/xrd/XrdPlot.svelte.d.ts +0 -28
  826. package/dist/xrd/broadening.d.ts +0 -20
  827. package/dist/xrd/broadening.js +0 -97
  828. package/dist/xrd/calc-xrd.d.ts +0 -37
  829. package/dist/xrd/calc-xrd.js +0 -337
  830. package/dist/xrd/index.d.ts +0 -37
  831. package/dist/xrd/index.js +0 -4
  832. package/dist/xrd/parse.d.ts +0 -13
  833. package/dist/xrd/parse.js +0 -749
  834. /package/dist/{EmptyState.svelte → src/lib/EmptyState.svelte} +0 -0
  835. /package/dist/{Icon.svelte → src/lib/Icon.svelte} +0 -0
  836. /package/dist/{chempot-diagram → src/lib/chempot-diagram}/ChemPotScene3D.svelte +0 -0
  837. /package/dist/{colors → src/lib/colors}/alloy-colors.json +0 -0
  838. /package/dist/{colors → src/lib/colors}/dark-mode-colors.json +0 -0
  839. /package/dist/{colors → src/lib/colors}/jmol-colors.json +0 -0
  840. /package/dist/{colors → src/lib/colors}/muted-colors.json +0 -0
  841. /package/dist/{colors → src/lib/colors}/pastel-colors.json +0 -0
  842. /package/dist/{colors → src/lib/colors}/vesta-colors.json +0 -0
  843. /package/dist/{element → src/lib/element}/Nucleus.svelte +0 -0
  844. /package/dist/{element → src/lib/element}/data.json +0 -0
  845. /package/dist/{element → src/lib/element}/data.json.gz +0 -0
  846. /package/dist/{element → src/lib/element}/data.schema.json +0 -0
  847. /package/dist/{element-image-urls.json → src/lib/element-image-urls.json} +0 -0
  848. /package/dist/{feedback → src/lib/feedback}/Spinner.svelte +0 -0
  849. /package/dist/{feedback → src/lib/feedback}/StatusMessage.svelte +0 -0
  850. /package/dist/{periodic-table → src/lib/periodic-table}/TableInset.svelte +0 -0
  851. /package/dist/{plot → src/lib/plot}/ReferenceLine.svelte +0 -0
  852. /package/dist/{xrd → src/lib/xrd}/atomic_scattering_params.json +0 -0
@@ -0,0 +1,944 @@
1
+ // Bonding algorithms for structure visualization
2
+
3
+ import { element_data } from '$lib/element'
4
+ import type { Vec3 } from '$lib/math'
5
+ import * as math from '$lib/math'
6
+ import type { AnyStructure, BondOrder, BondPair, Site, StructureBond } from '$lib/structure'
7
+
8
+ type SpatialGrid = Map<string, number[]>
9
+
10
+ const element_lookup = new Map(element_data.map((el) => [el.symbol, el]))
11
+ const covalent_radii: Map<string, number> = new Map(
12
+ element_data.flatMap((el) =>
13
+ el.covalent_radius === null ? [] : [[el.symbol, el.covalent_radius]],
14
+ ),
15
+ )
16
+
17
+ const is_zero_cell_shift = (cell_shift: Vec3 | undefined): boolean =>
18
+ cell_shift === undefined || cell_shift.every((val) => val === 0)
19
+
20
+ const format_cell_shift = (cell_shift: Vec3 | undefined): string => {
21
+ if (cell_shift === undefined || is_zero_cell_shift(cell_shift)) return ``
22
+ return `@${cell_shift.join(`,`)}`
23
+ }
24
+
25
+ const negate_cell_shift = (cell_shift: Vec3): Vec3 => [
26
+ cell_shift[0] === 0 ? 0 : -cell_shift[0],
27
+ cell_shift[1] === 0 ? 0 : -cell_shift[1],
28
+ cell_shift[2] === 0 ? 0 : -cell_shift[2],
29
+ ]
30
+
31
+ const canonical_self_bond_shift = (cell_shift: Vec3): Vec3 => {
32
+ const first_non_zero = cell_shift.find((val) => val !== 0)
33
+ return first_non_zero !== undefined && first_non_zero < 0
34
+ ? negate_cell_shift(cell_shift)
35
+ : cell_shift
36
+ }
37
+
38
+ const normalize_bond_endpoints = (
39
+ site_idx_1: number,
40
+ site_idx_2: number,
41
+ cell_shift?: Vec3,
42
+ ): Pick<StructureBond, `site_idx_1` | `site_idx_2` | `cell_shift`> => {
43
+ if (site_idx_1 === site_idx_2) {
44
+ const ordered = { site_idx_1, site_idx_2 }
45
+ if (cell_shift === undefined || is_zero_cell_shift(cell_shift)) return ordered
46
+ return { ...ordered, cell_shift: canonical_self_bond_shift(cell_shift) }
47
+ }
48
+ const ordered =
49
+ site_idx_1 < site_idx_2
50
+ ? { site_idx_1, site_idx_2 }
51
+ : { site_idx_1: site_idx_2, site_idx_2: site_idx_1 }
52
+ if (cell_shift === undefined || is_zero_cell_shift(cell_shift)) return ordered
53
+ return {
54
+ ...ordered,
55
+ cell_shift: site_idx_1 < site_idx_2 ? cell_shift : negate_cell_shift(cell_shift),
56
+ }
57
+ }
58
+
59
+ export const normalize_structure_bond = (
60
+ site_idx_1: number,
61
+ site_idx_2: number,
62
+ order: BondOrder,
63
+ cell_shift?: Vec3,
64
+ ): StructureBond => {
65
+ const bond = normalize_bond_endpoints(site_idx_1, site_idx_2, cell_shift)
66
+ return { ...bond, order }
67
+ }
68
+
69
+ export const get_bond_key = (idx_1: number, idx_2: number, cell_shift?: Vec3): string => {
70
+ const normalized = normalize_bond_endpoints(idx_1, idx_2, cell_shift)
71
+ return `${normalized.site_idx_1}-${normalized.site_idx_2}${format_cell_shift(
72
+ normalized.cell_shift,
73
+ )}`
74
+ }
75
+
76
+ export type BondEditState = {
77
+ added_bonds: StructureBond[]
78
+ removed_bonds: StructureBond[]
79
+ bond_order_overrides: StructureBond[]
80
+ }
81
+
82
+ export type BondEditAction =
83
+ | `added`
84
+ | `already-visible`
85
+ | `deleted-added`
86
+ | `deleted-calculated`
87
+ | `not-visible`
88
+ | `ordered-added`
89
+ | `ordered-calculated`
90
+ | `restored`
91
+
92
+ export type BondEditResult = {
93
+ action: BondEditAction
94
+ changed: boolean
95
+ state: BondEditState
96
+ }
97
+
98
+ export type BondKeyTarget = Pick<StructureBond, `site_idx_1` | `site_idx_2` | `cell_shift`>
99
+ type BondOrderTarget = BondKeyTarget & {
100
+ bond_order?: BondOrder
101
+ order?: BondOrder
102
+ }
103
+
104
+ export const BOND_ORDER_OPTIONS: { order: BondOrder; label: string }[] = [
105
+ { order: 1, label: `Single` },
106
+ { order: 1.5, label: `1.5` },
107
+ { order: 2, label: `Double` },
108
+ { order: 3, label: `Triple` },
109
+ { order: `aromatic`, label: `Aromatic` },
110
+ ]
111
+
112
+ const site_image_shift = (sites: Site[] | undefined, site_idx: number): Vec3 => {
113
+ const site = sites?.[site_idx]
114
+ const orig_site_idx = site?.properties?.orig_site_idx
115
+ if (typeof orig_site_idx !== `number`) return [0, 0, 0]
116
+ const orig_site = sites?.[orig_site_idx]
117
+ if (!site?.abc || !orig_site?.abc) return [0, 0, 0]
118
+ return [
119
+ Math.round(site.abc[0] - orig_site.abc[0]),
120
+ Math.round(site.abc[1] - orig_site.abc[1]),
121
+ Math.round(site.abc[2] - orig_site.abc[2]),
122
+ ]
123
+ }
124
+
125
+ const original_site_idx = (sites: Site[] | undefined, site_idx: number): number => {
126
+ const orig_site_idx = sites?.[site_idx]?.properties?.orig_site_idx
127
+ return typeof orig_site_idx === `number` ? orig_site_idx : site_idx
128
+ }
129
+
130
+ export const canonicalize_bond_target = (
131
+ bond: BondKeyTarget,
132
+ sites: Site[] | undefined,
133
+ ): BondKeyTarget => {
134
+ const shift_1 = site_image_shift(sites, bond.site_idx_1)
135
+ const shift_2 = site_image_shift(sites, bond.site_idx_2)
136
+ const base_shift = bond.cell_shift ?? [0, 0, 0]
137
+ const cell_shift: Vec3 = [
138
+ base_shift[0] + shift_2[0] - shift_1[0],
139
+ base_shift[1] + shift_2[1] - shift_1[1],
140
+ base_shift[2] + shift_2[2] - shift_1[2],
141
+ ]
142
+ return normalize_bond_endpoints(
143
+ original_site_idx(sites, bond.site_idx_1),
144
+ original_site_idx(sites, bond.site_idx_2),
145
+ cell_shift,
146
+ )
147
+ }
148
+
149
+ const bond_key_for = (bond: BondKeyTarget): string =>
150
+ get_bond_key(bond.site_idx_1, bond.site_idx_2, bond.cell_shift)
151
+
152
+ const matches_bond_key = (bond: BondKeyTarget, key: string): boolean =>
153
+ bond_key_for(bond) === key
154
+
155
+ const replace_bond = (bonds: StructureBond[], next_bond: StructureBond): StructureBond[] => {
156
+ const key = bond_key_for(next_bond)
157
+ return [...bonds.filter((bond) => !matches_bond_key(bond, key)), next_bond]
158
+ }
159
+
160
+ const remove_bond_key = (bonds: StructureBond[], key: string): StructureBond[] =>
161
+ bonds.filter((bond) => !matches_bond_key(bond, key))
162
+
163
+ const includes_bond_key = (bonds: BondKeyTarget[], key: string): boolean =>
164
+ bonds.some((bond) => matches_bond_key(bond, key))
165
+
166
+ const get_bond_order = (bond: BondOrderTarget | undefined): BondOrder =>
167
+ bond?.bond_order ?? bond?.order ?? 1
168
+
169
+ const find_bond_by_key = <BondType extends BondKeyTarget>(
170
+ bonds: BondType[],
171
+ key: string,
172
+ ): BondType | undefined => bonds.find((bond) => matches_bond_key(bond, key))
173
+
174
+ const make_bond_record = (bond: BondKeyTarget, order: BondOrder): StructureBond =>
175
+ normalize_structure_bond(bond.site_idx_1, bond.site_idx_2, order, bond.cell_shift)
176
+
177
+ export function has_visible_bond(
178
+ edit_state: BondEditState,
179
+ bond: BondKeyTarget,
180
+ calculated_bonds: BondOrderTarget[],
181
+ ): boolean {
182
+ const key = bond_key_for(bond)
183
+ if (includes_bond_key(edit_state.removed_bonds, key)) {
184
+ return false
185
+ }
186
+ if (includes_bond_key(edit_state.added_bonds, key)) return true
187
+ return includes_bond_key(calculated_bonds, key)
188
+ }
189
+
190
+ export function add_or_restore_bond(
191
+ edit_state: BondEditState,
192
+ bond: BondKeyTarget,
193
+ calculated_bonds: BondOrderTarget[],
194
+ order: BondOrder,
195
+ ): BondEditResult {
196
+ const record = make_bond_record(bond, order)
197
+ const key = bond_key_for(record)
198
+ const removed_bond = find_bond_by_key(edit_state.removed_bonds, key)
199
+ if (removed_bond) {
200
+ return {
201
+ action: `restored`,
202
+ changed: true,
203
+ state: {
204
+ ...edit_state,
205
+ added_bonds: remove_bond_key(edit_state.added_bonds, key),
206
+ removed_bonds: remove_bond_key(edit_state.removed_bonds, key),
207
+ bond_order_overrides:
208
+ removed_bond.order === order
209
+ ? remove_bond_key(edit_state.bond_order_overrides, key)
210
+ : replace_bond(edit_state.bond_order_overrides, record),
211
+ },
212
+ }
213
+ }
214
+ if (has_visible_bond(edit_state, record, calculated_bonds)) {
215
+ return { action: `already-visible`, changed: false, state: edit_state }
216
+ }
217
+ return {
218
+ action: `added`,
219
+ changed: true,
220
+ state: {
221
+ ...edit_state,
222
+ added_bonds: replace_bond(edit_state.added_bonds, record),
223
+ bond_order_overrides: remove_bond_key(edit_state.bond_order_overrides, key),
224
+ },
225
+ }
226
+ }
227
+
228
+ export function delete_bond(
229
+ edit_state: BondEditState,
230
+ bond: BondKeyTarget,
231
+ calculated_bonds: BondOrderTarget[],
232
+ ): BondEditResult {
233
+ const record = make_bond_record(bond, 1)
234
+ const key = bond_key_for(record)
235
+ if (includes_bond_key(edit_state.added_bonds, key)) {
236
+ return {
237
+ action: `deleted-added`,
238
+ changed: true,
239
+ state: {
240
+ ...edit_state,
241
+ added_bonds: remove_bond_key(edit_state.added_bonds, key),
242
+ bond_order_overrides: remove_bond_key(edit_state.bond_order_overrides, key),
243
+ },
244
+ }
245
+ }
246
+ const calculated = find_bond_by_key(calculated_bonds, key)
247
+ if (!calculated || includes_bond_key(edit_state.removed_bonds, key)) {
248
+ return { action: `not-visible`, changed: false, state: edit_state }
249
+ }
250
+ return {
251
+ action: `deleted-calculated`,
252
+ changed: true,
253
+ state: {
254
+ ...edit_state,
255
+ removed_bonds: replace_bond(edit_state.removed_bonds, {
256
+ ...record,
257
+ order: get_bond_order(calculated),
258
+ }),
259
+ bond_order_overrides: remove_bond_key(edit_state.bond_order_overrides, key),
260
+ },
261
+ }
262
+ }
263
+
264
+ export function set_bond_order(
265
+ edit_state: BondEditState,
266
+ bond: BondKeyTarget,
267
+ calculated_bonds: BondOrderTarget[],
268
+ order: BondOrder,
269
+ ): BondEditResult {
270
+ const record = make_bond_record(bond, order)
271
+ const key = bond_key_for(record)
272
+ const calculated = find_bond_by_key(calculated_bonds, key)
273
+ if (calculated) {
274
+ const visible_order = get_bond_order(calculated)
275
+ const has_existing_edit =
276
+ includes_bond_key(edit_state.added_bonds, key) ||
277
+ includes_bond_key(edit_state.removed_bonds, key) ||
278
+ includes_bond_key(edit_state.bond_order_overrides, key)
279
+ const next_overrides =
280
+ order === visible_order
281
+ ? remove_bond_key(edit_state.bond_order_overrides, key)
282
+ : replace_bond(edit_state.bond_order_overrides, record)
283
+ const next_state = {
284
+ added_bonds: remove_bond_key(edit_state.added_bonds, key),
285
+ removed_bonds: remove_bond_key(edit_state.removed_bonds, key),
286
+ bond_order_overrides: next_overrides,
287
+ }
288
+ return {
289
+ action: `ordered-calculated`,
290
+ changed: has_existing_edit || order !== visible_order,
291
+ state: next_state,
292
+ }
293
+ }
294
+ return {
295
+ action: `ordered-added`,
296
+ changed: true,
297
+ state: {
298
+ ...edit_state,
299
+ added_bonds: replace_bond(edit_state.added_bonds, record),
300
+ bond_order_overrides: remove_bond_key(edit_state.bond_order_overrides, key),
301
+ },
302
+ }
303
+ }
304
+
305
+ export const merge_bond_edits = (
306
+ base_bonds: StructureBond[],
307
+ added: StructureBond[],
308
+ removed: StructureBond[],
309
+ overrides: StructureBond[],
310
+ ): StructureBond[] => {
311
+ const key_for = (bond: StructureBond): string =>
312
+ get_bond_key(bond.site_idx_1, bond.site_idx_2, bond.cell_shift)
313
+ const normalize_record = (bond: StructureBond): StructureBond =>
314
+ normalize_structure_bond(bond.site_idx_1, bond.site_idx_2, bond.order, bond.cell_shift)
315
+ const removed_keys = new Set(removed.map(key_for))
316
+ const merged = new Map(
317
+ base_bonds
318
+ .filter((bond) => !removed_keys.has(key_for(bond)))
319
+ .map((bond) => [key_for(bond), normalize_record(bond)]),
320
+ )
321
+ // Apply additions before overrides so user-set bond orders win even if
322
+ // callers accidentally pass overlapping edit lists.
323
+ for (const bond of added) {
324
+ if (!removed_keys.has(key_for(bond))) merged.set(key_for(bond), normalize_record(bond))
325
+ }
326
+ for (const bond of overrides) {
327
+ if (!removed_keys.has(key_for(bond))) merged.set(key_for(bond), normalize_record(bond))
328
+ }
329
+ return [...merged.values()]
330
+ }
331
+
332
+ const is_record = (value: unknown): value is Record<string, unknown> =>
333
+ typeof value === `object` && value !== null
334
+
335
+ export function normalize_bond_order(order: unknown): BondOrder | null {
336
+ if (order === `aromatic`) return order
337
+ if (order === 1 || order === 1.5 || order === 2 || order === 3) return order
338
+ return null
339
+ }
340
+
341
+ function normalize_cell_shift(cell_shift: unknown): Vec3 | undefined | null {
342
+ if (cell_shift === undefined) return undefined
343
+ if (!Array.isArray(cell_shift) || cell_shift.length !== 3) return null
344
+ return cell_shift.some((val) => typeof val !== `number` || !Number.isInteger(val))
345
+ ? null
346
+ : [cell_shift[0], cell_shift[1], cell_shift[2]]
347
+ }
348
+
349
+ function lattice_translation(structure: AnyStructure, cell_shift: Vec3 | undefined): Vec3 {
350
+ if (cell_shift === undefined || is_zero_cell_shift(cell_shift)) return [0, 0, 0]
351
+ if (!(`lattice` in structure)) {
352
+ throw new Error(`Explicit bond cell_shift requires a crystal lattice`)
353
+ }
354
+ const [shift_a, shift_b, shift_c] = cell_shift
355
+ const [vec_a, vec_b, vec_c] = structure.lattice.matrix
356
+ return math.add(
357
+ math.scale(vec_a, shift_a),
358
+ math.scale(vec_b, shift_b),
359
+ math.scale(vec_c, shift_c),
360
+ )
361
+ }
362
+
363
+ export function structure_bond_to_bond_pair(
364
+ structure: AnyStructure,
365
+ bond: StructureBond,
366
+ ): BondPair {
367
+ const { site_idx_1, site_idx_2, order, cell_shift } = bond
368
+ const site_1 = structure.sites[site_idx_1]
369
+ const site_2 = structure.sites[site_idx_2]
370
+ if (!site_1 || !site_2) {
371
+ throw new Error(
372
+ `Cannot create bond pair for invalid site indices ${site_idx_1}, ${site_idx_2}`,
373
+ )
374
+ }
375
+ const pos_1 = site_1.xyz
376
+ const pos_2 = math.add(site_2.xyz, lattice_translation(structure, cell_shift))
377
+ return {
378
+ pos_1,
379
+ pos_2,
380
+ site_idx_1,
381
+ site_idx_2,
382
+ bond_length: math.euclidean_dist(pos_1, pos_2),
383
+ strength: 1,
384
+ bond_order: order,
385
+ cell_shift,
386
+ transform_matrix: compute_bond_transform(pos_1, pos_2),
387
+ }
388
+ }
389
+
390
+ export function get_explicit_bond_metadata(structure: AnyStructure): StructureBond[] {
391
+ const raw_bonds = structure.properties?.bonds
392
+ if (raw_bonds === undefined) return []
393
+ if (!Array.isArray(raw_bonds)) {
394
+ console.warn(`Ignoring structure.properties.bonds because it is not an array`)
395
+ return []
396
+ }
397
+
398
+ const explicit_bonds = new Map<string, StructureBond>()
399
+ for (const [entry_idx, raw_bond] of raw_bonds.entries()) {
400
+ if (!is_record(raw_bond)) {
401
+ console.warn(`Ignoring invalid explicit bond at index ${entry_idx}: expected object`)
402
+ continue
403
+ }
404
+ const { order } = raw_bond
405
+ const site_idx_1 = raw_bond.site_idx_1
406
+ const site_idx_2 = raw_bond.site_idx_2
407
+ if (
408
+ typeof site_idx_1 !== `number` ||
409
+ typeof site_idx_2 !== `number` ||
410
+ !Number.isInteger(site_idx_1) ||
411
+ !Number.isInteger(site_idx_2)
412
+ ) {
413
+ console.warn(
414
+ `Ignoring invalid explicit bond at index ${entry_idx}: site indices must be integers`,
415
+ )
416
+ continue
417
+ }
418
+ if (
419
+ site_idx_1 < 0 ||
420
+ site_idx_2 < 0 ||
421
+ site_idx_1 >= structure.sites.length ||
422
+ site_idx_2 >= structure.sites.length
423
+ ) {
424
+ console.warn(
425
+ `Ignoring invalid explicit bond at index ${entry_idx}: site indices ${
426
+ site_idx_1
427
+ }, ${site_idx_2} are out of range for ${structure.sites.length} sites`,
428
+ )
429
+ continue
430
+ }
431
+ const bond_order = normalize_bond_order(order)
432
+ if (bond_order === null) {
433
+ console.warn(
434
+ `Ignoring invalid explicit bond at index ${entry_idx}: unsupported order ${String(
435
+ order,
436
+ )}`,
437
+ )
438
+ continue
439
+ }
440
+ const cell_shift = normalize_cell_shift(raw_bond.cell_shift)
441
+ if (cell_shift === null) {
442
+ console.warn(
443
+ `Ignoring invalid explicit bond at index ${entry_idx}: cell_shift must be three integers`,
444
+ )
445
+ continue
446
+ }
447
+ if (site_idx_1 === site_idx_2 && is_zero_cell_shift(cell_shift)) {
448
+ console.warn(`Ignoring invalid explicit bond at index ${entry_idx}: endpoints match`)
449
+ continue
450
+ }
451
+ if (
452
+ cell_shift !== undefined &&
453
+ !is_zero_cell_shift(cell_shift) &&
454
+ !(`lattice` in structure)
455
+ ) {
456
+ console.warn(
457
+ `Ignoring invalid explicit bond at index ${entry_idx}: cell_shift requires a crystal lattice`,
458
+ )
459
+ continue
460
+ }
461
+
462
+ const key = get_bond_key(site_idx_1, site_idx_2, cell_shift)
463
+ if (explicit_bonds.has(key)) {
464
+ console.warn(
465
+ `Duplicate explicit bond definition at index ${entry_idx} for site indices ${
466
+ site_idx_1
467
+ }, ${site_idx_2} with order ${bond_order}; will overwrite the previous entry`,
468
+ )
469
+ }
470
+ explicit_bonds.set(
471
+ key,
472
+ normalize_structure_bond(site_idx_1, site_idx_2, bond_order, cell_shift),
473
+ )
474
+ }
475
+ return [...explicit_bonds.values()]
476
+ }
477
+
478
+ export function apply_explicit_bond_metadata(
479
+ structure: AnyStructure,
480
+ bonds: BondPair[],
481
+ ): BondPair[] {
482
+ const explicit_bonds = get_explicit_bond_metadata(structure)
483
+ if (explicit_bonds.length === 0) return bonds
484
+
485
+ const explicit_by_key = new Map(
486
+ explicit_bonds.map((bond) => [
487
+ get_bond_key(bond.site_idx_1, bond.site_idx_2, bond.cell_shift),
488
+ bond,
489
+ ]),
490
+ )
491
+ const merged = bonds.map((bond) => {
492
+ const key = get_bond_key(bond.site_idx_1, bond.site_idx_2, bond.cell_shift)
493
+ const explicit = explicit_by_key.get(key)
494
+ if (!explicit) return bond
495
+ explicit_by_key.delete(key)
496
+ return { ...bond, bond_order: explicit.order }
497
+ })
498
+
499
+ for (const explicit_bond of explicit_by_key.values()) {
500
+ merged.push(structure_bond_to_bond_pair(structure, explicit_bond))
501
+ }
502
+
503
+ return merged
504
+ }
505
+
506
+ export function scale_and_offset_bond_matrix(
507
+ transform_matrix: Float32Array,
508
+ offset: number,
509
+ radius_scale: number,
510
+ ): Float32Array {
511
+ const matrix = new Float32Array(transform_matrix)
512
+ // Column-major 4x4 layout: 0-2 are the right vector, 8-10 are the forward
513
+ // vector. Scale orientation columns for cylinder radius, not translation.
514
+ for (const matrix_idx of [0, 1, 2, 8, 9, 10]) {
515
+ matrix[matrix_idx] *= radius_scale
516
+ }
517
+
518
+ const right_len = Math.hypot(matrix[0], matrix[1], matrix[2]) || 1
519
+ const offset_dir: Vec3 = [
520
+ matrix[0] / right_len,
521
+ matrix[1] / right_len,
522
+ matrix[2] / right_len,
523
+ ]
524
+ matrix[12] += offset_dir[0] * offset
525
+ matrix[13] += offset_dir[1] * offset
526
+ matrix[14] += offset_dir[2] * offset
527
+ return matrix
528
+ }
529
+
530
+ export function get_bond_render_matrices(
531
+ bond: BondPair,
532
+ bond_thickness: number,
533
+ ): Float32Array[] {
534
+ const order = bond.bond_order ?? 1
535
+ const gap = bond_thickness * 1.8
536
+ const offsets_and_scales: [number, number][] =
537
+ order === 2
538
+ ? [
539
+ [-gap / 2, 0.65],
540
+ [gap / 2, 0.65],
541
+ ]
542
+ : order === 3
543
+ ? [
544
+ [-gap, 0.55],
545
+ [0, 0.55],
546
+ [gap, 0.55],
547
+ ]
548
+ : order === 1.5 || order === `aromatic`
549
+ ? [
550
+ [-gap / 2, 0.75],
551
+ [gap / 2, 0.4],
552
+ ]
553
+ : []
554
+ return offsets_and_scales.length === 0
555
+ ? [bond.transform_matrix]
556
+ : offsets_and_scales.map(([offset, radius_scale]) =>
557
+ scale_and_offset_bond_matrix(bond.transform_matrix, offset, radius_scale),
558
+ )
559
+ }
560
+
561
+ // Get the species with highest occupancy from a site.
562
+ const get_majority_species = (site: Site) =>
563
+ (site.species ?? []).reduce(
564
+ (max_species, species) => (species.occu > max_species.occu ? species : max_species),
565
+ site.species?.[0] ?? { element: ``, occu: -1 },
566
+ )
567
+
568
+ // Helper to extract numeric index from site properties
569
+ function get_orig_idx(site: Site, fallback: number): number {
570
+ const props = site.properties
571
+ if (!props) return fallback
572
+
573
+ const raw = props.orig_unit_cell_idx ?? props.orig_site_idx
574
+ if (raw === undefined) return fallback
575
+
576
+ const num = Number(raw)
577
+ return Number.isFinite(num) ? num : fallback
578
+ }
579
+
580
+ // Compute 4x4 transformation matrix for bond cylinder between two positions.
581
+ // Uses Y-up, right-handed coordinate system convention for Three.js compatibility.
582
+ export function compute_bond_transform(pos_1: Vec3, pos_2: Vec3): Float32Array {
583
+ const [dx, dy, dz] = math.subtract(pos_2, pos_1)
584
+ const height = Math.hypot(dx, dy, dz)
585
+
586
+ if (height < 1e-10) {
587
+ return new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1])
588
+ }
589
+
590
+ const [dir_x, dir_y, dir_z] = [dx / height, dy / height, dz / height]
591
+ let [m00, m01, m02, m10, m11, m12, m20, m21, m22] = [0, 0, 0, 0, 0, 0, 0, 0, 0]
592
+
593
+ // Special case: bond pointing straight up (+Y)
594
+ if (Math.abs(dir_y - 1.0) < 1e-10) {
595
+ ;[m00, m01, m02, m10, m11, m12, m20, m21, m22] = [1, 0, 0, 0, 1, 0, 0, 0, 1]
596
+ } else if (Math.abs(dir_y + 1.0) < 1e-10) {
597
+ // Special case: bond pointing straight down (-Y)
598
+ ;[m00, m01, m02, m10, m11, m12, m20, m21, m22] = [1, 0, 0, 0, -1, 0, 0, 0, 1]
599
+ } else {
600
+ // General case: construct orthonormal basis (right, dir, up)
601
+ // Right vector: perpendicular to dir in XZ plane
602
+ const [rx, rz] = [-dir_z, dir_x]
603
+ const r_len = Math.hypot(rx, rz)
604
+ const [right_x, right_z] = [rx / r_len, rz / r_len]
605
+ // Up vector: cross product of dir and right
606
+ const [up_x, up_y, up_z] = [
607
+ dir_y * right_z,
608
+ dir_z * right_x - dir_x * right_z,
609
+ -dir_y * right_x,
610
+ ]
611
+ ;[m00, m01, m02, m10, m11, m12, m20, m21, m22] = [
612
+ right_x,
613
+ dir_x,
614
+ up_x,
615
+ 0,
616
+ dir_y,
617
+ up_y,
618
+ right_z,
619
+ dir_z,
620
+ up_z,
621
+ ]
622
+ }
623
+
624
+ // Position at midpoint between the two atoms
625
+ const [px, py, pz] = [
626
+ (pos_1[0] + pos_2[0]) / 2,
627
+ (pos_1[1] + pos_2[1]) / 2,
628
+ (pos_1[2] + pos_2[2]) / 2,
629
+ ]
630
+
631
+ return new Float32Array([
632
+ // Return flattened column-major 4x4 matrix for Three.js
633
+ m00,
634
+ m10,
635
+ m20,
636
+ 0,
637
+ m01 * height,
638
+ m11 * height,
639
+ m21 * height,
640
+ 0,
641
+ m02,
642
+ m12,
643
+ m22,
644
+ 0,
645
+ px,
646
+ py,
647
+ pz,
648
+ 1,
649
+ ])
650
+ }
651
+
652
+ // Build spatial grid by dividing 3D space into cubic cells.
653
+ function build_spatial_grid(sites: Site[], cell_size: number): SpatialGrid {
654
+ const grid: SpatialGrid = new Map()
655
+ for (let idx = 0; idx < sites.length; idx++) {
656
+ const [x, y, z] = sites[idx].xyz.map((coord) => Math.floor(coord / cell_size))
657
+ const key = `${x},${y},${z}`
658
+ const cell = grid.get(key)
659
+ if (cell) cell.push(idx)
660
+ else grid.set(key, [idx])
661
+ }
662
+ return grid
663
+ }
664
+
665
+ // Get all site indices in 3x3x3 cube of cells around position.
666
+ function get_neighbors_from_grid(pos: Vec3, grid: SpatialGrid, cell_size: number): number[] {
667
+ const [cx, cy, cz] = [
668
+ Math.floor(pos[0] / cell_size),
669
+ Math.floor(pos[1] / cell_size),
670
+ Math.floor(pos[2] / cell_size),
671
+ ]
672
+ const neighbors: number[] = []
673
+ for (let dx = -1; dx <= 1; dx++) {
674
+ for (let dy = -1; dy <= 1; dy++) {
675
+ for (let dz = -1; dz <= 1; dz++) {
676
+ const cell = grid.get(`${cx + dx},${cy + dy},${cz + dz}`)
677
+ if (cell) neighbors.push(...cell)
678
+ }
679
+ }
680
+ }
681
+ return neighbors
682
+ }
683
+
684
+ // Setup spatial decomposition for structures with >50 atoms.
685
+ function setup_spatial_grid(sites: Site[], cutoff: number) {
686
+ const use_grid = sites.length > 50
687
+ return use_grid ? { grid: build_spatial_grid(sites, cutoff), cell_size: cutoff } : null
688
+ }
689
+
690
+ // Get candidate neighbor indices using spatial grid or all sites.
691
+ const get_candidates = (
692
+ pos: Vec3,
693
+ sites: Site[],
694
+ spatial: ReturnType<typeof setup_spatial_grid>,
695
+ ): number[] =>
696
+ spatial
697
+ ? get_neighbors_from_grid(pos, spatial.grid, spatial.cell_size)
698
+ : Array.from({ length: sites.length }, (_, idx) => idx)
699
+
700
+ export const BONDING_STRATEGIES = { electroneg_ratio, solid_angle } as const
701
+ export type BondingStrategy = keyof typeof BONDING_STRATEGIES
702
+ export type BondingAlgo = (typeof BONDING_STRATEGIES)[BondingStrategy]
703
+
704
+ // Electronegativity-based bonding with chemical preferences.
705
+ // This algorithm considers electronegativity differences between atoms, metal/nonmetal
706
+ // properties, and distance to determine bond strength. Bonds are only created if the
707
+ // computed strength exceeds the strength_threshold parameter (default: 0.3).
708
+ export function electroneg_ratio(
709
+ structure: AnyStructure,
710
+ {
711
+ electronegativity_threshold = 1.7, // Max electronegativity difference for bonding
712
+ max_distance_ratio = 2.0, // Max distance as multiple of sum of covalent radii
713
+ min_bond_dist = 0.4, // Minimum bond distance in Angstroms
714
+ metal_metal_penalty = 0.7, // Strength penalty for metal-metal bonds
715
+ metal_nonmetal_bonus = 1.5, // Strength bonus for metal-nonmetal bonds
716
+ similar_electronegativity_bonus = 1.2, // Bonus for similar electronegativity
717
+ same_species_penalty = 0.5, // Penalty for bonds between same element
718
+ strength_threshold = 0.3, // Minimum bond strength to include in results
719
+ } = {},
720
+ ): BondPair[] {
721
+ const { sites } = structure
722
+ if (sites.length < 2) return []
723
+
724
+ const bonds: BondPair[] = []
725
+ const min_dist_sq = min_bond_dist ** 2
726
+ const closest = new Map<number, number>()
727
+
728
+ const props = sites.map((site) => {
729
+ const majority = get_majority_species(site)
730
+ const elem = majority.element
731
+ const data = element_lookup.get(elem)
732
+ return {
733
+ element: elem,
734
+ electroneg: data?.electronegativity ?? 2.0,
735
+ is_metal: data?.metal ?? false,
736
+ is_nonmetal: data?.nonmetal ?? false,
737
+ radius: elem ? covalent_radii.get(elem) : undefined,
738
+ }
739
+ })
740
+
741
+ let max_radius = 0
742
+ for (const radius of covalent_radii.values()) {
743
+ if (radius > max_radius) max_radius = radius
744
+ }
745
+ const max_cutoff = max_radius * 2 * max_distance_ratio
746
+ const spatial = setup_spatial_grid(sites, max_cutoff)
747
+
748
+ // Two-pass approach to ensure symmetry between original and image atoms:
749
+ // 1. Collect all potential bonds and determine closest neighbor distance for each unique atom (orig_idx)
750
+ // 2. Filter bonds based on penalties using the fully populated closest distances
751
+
752
+ interface PotentialBond {
753
+ site_idx_1: number
754
+ site_idx_2: number
755
+ dist: number
756
+ expected_dist: number
757
+ base_strength: number
758
+ orig_idx_a: number
759
+ orig_idx_b: number
760
+ }
761
+
762
+ const potential_bonds: PotentialBond[] = []
763
+
764
+ for (let idx_a = 0; idx_a < sites.length - 1; idx_a++) {
765
+ const [x1, y1, z1] = sites[idx_a].xyz
766
+ const props_a = props[idx_a]
767
+
768
+ for (const idx_b of get_candidates(sites[idx_a].xyz, sites, spatial)) {
769
+ if (idx_b <= idx_a) continue
770
+
771
+ const [x2, y2, z2] = sites[idx_b].xyz
772
+ const props_b = props[idx_b]
773
+
774
+ const [dx, dy, dz] = [x2 - x1, y2 - y1, z2 - z1]
775
+ const dist_sq = dx * dx + dy * dy + dz * dz
776
+ const dist = Math.sqrt(dist_sq)
777
+
778
+ if (dist_sq < min_dist_sq || !props_a.radius || !props_b.radius) continue
779
+
780
+ const expected = props_a.radius + props_b.radius
781
+ if (dist > expected * max_distance_ratio) continue
782
+
783
+ const electroneg_diff = Math.abs(props_a.electroneg - props_b.electroneg)
784
+ const electroneg_balance = electroneg_diff / (props_a.electroneg + props_b.electroneg)
785
+
786
+ let bond_strength = 1.0
787
+ if (props_a.is_metal && props_b.is_metal) {
788
+ bond_strength *= metal_metal_penalty
789
+ } else if (
790
+ (props_a.is_metal && props_b.is_nonmetal) ||
791
+ (props_a.is_nonmetal && props_b.is_metal)
792
+ ) {
793
+ bond_strength *= metal_nonmetal_bonus
794
+ if (electroneg_diff > electronegativity_threshold) bond_strength *= 1.3
795
+ } else if (electroneg_diff < 0.5) {
796
+ bond_strength *= similar_electronegativity_bonus
797
+ }
798
+
799
+ const dist_weight = Math.exp(-((dist / expected - 1) ** 2) / 0.18)
800
+ const electroneg_weight = 1.0 - 0.3 * electroneg_balance
801
+ let strength = bond_strength * dist_weight * electroneg_weight
802
+
803
+ if (props_a.element === props_b.element) strength *= same_species_penalty
804
+
805
+ // If raw strength is already too low, we can skip early
806
+ // (penalty will only reduce it further)
807
+ if (strength <= strength_threshold) continue
808
+
809
+ // Use helper logic to handle both supercell and image atoms with robust normalization
810
+ const orig_idx_a = get_orig_idx(sites[idx_a], idx_a)
811
+ const orig_idx_b = get_orig_idx(sites[idx_b], idx_b)
812
+
813
+ // Update closest known normalized distance (dist / expected) for original atoms
814
+ // Normalized distance handles atoms of different sizes better than raw distance
815
+ // (e.g. C-H is short but C-C is longer; we don't want C-H to penalize C-C just because H is small)
816
+ const norm_dist = dist / expected
817
+ const closest_dist_a = closest.get(orig_idx_a) ?? Infinity
818
+ if (norm_dist < closest_dist_a) closest.set(orig_idx_a, norm_dist)
819
+
820
+ const closest_dist_b = closest.get(orig_idx_b) ?? Infinity
821
+ if (norm_dist < closest_dist_b) closest.set(orig_idx_b, norm_dist)
822
+
823
+ potential_bonds.push({
824
+ site_idx_1: idx_a,
825
+ site_idx_2: idx_b,
826
+ dist,
827
+ expected_dist: expected,
828
+ base_strength: strength,
829
+ orig_idx_a,
830
+ orig_idx_b,
831
+ })
832
+ }
833
+ }
834
+
835
+ // Second pass: Apply penalties and filter
836
+ for (const bond of potential_bonds) {
837
+ const {
838
+ site_idx_1,
839
+ site_idx_2,
840
+ dist,
841
+ expected_dist,
842
+ base_strength,
843
+ orig_idx_a,
844
+ orig_idx_b,
845
+ } = bond
846
+
847
+ const closest_dist_a = closest.get(orig_idx_a) ?? Infinity
848
+ const closest_dist_b = closest.get(orig_idx_b) ?? Infinity
849
+ const norm_dist = dist / expected_dist
850
+
851
+ let strength = base_strength
852
+
853
+ // Apply penalty if this bond is much longer (relative to radii) than the closest known bond
854
+ if (norm_dist > closest_dist_a) {
855
+ strength *= Math.exp(-(norm_dist / closest_dist_a - 1) / 0.5)
856
+ }
857
+ if (orig_idx_b !== orig_idx_a && norm_dist > closest_dist_b) {
858
+ strength *= Math.exp(-(norm_dist / closest_dist_b - 1) / 0.5)
859
+ }
860
+
861
+ if (strength > strength_threshold) {
862
+ bonds.push({
863
+ pos_1: sites[site_idx_1].xyz,
864
+ pos_2: sites[site_idx_2].xyz,
865
+ site_idx_1,
866
+ site_idx_2,
867
+ bond_length: dist,
868
+ strength,
869
+ transform_matrix: compute_bond_transform(sites[site_idx_1].xyz, sites[site_idx_2].xyz),
870
+ })
871
+ }
872
+ }
873
+
874
+ return apply_explicit_bond_metadata(structure, bonds)
875
+ }
876
+
877
+ // Solid angle-based bonding using geometric proximity heuristics.
878
+ // Inspired by Voronoi tessellation without having to actually compute Voronoi cells.
879
+ // This algorithm computes bond strength based on the solid angle subtended by atoms
880
+ // and their distance penalty. Bonds are only created if the computed strength exceeds
881
+ // the strength_threshold parameter.
882
+ export function solid_angle(
883
+ structure: AnyStructure,
884
+ {
885
+ min_solid_angle = 0.01,
886
+ min_face_area = 0.05,
887
+ max_distance = 5.0,
888
+ min_bond_dist = 0.4,
889
+ strength_threshold = 0.05,
890
+ } = {},
891
+ ): BondPair[] {
892
+ const { sites } = structure
893
+ if (sites.length < 2) return []
894
+
895
+ const bonds: BondPair[] = []
896
+ const min_dist_sq = min_bond_dist ** 2
897
+ const max_dist_sq = max_distance ** 2
898
+ const spatial = setup_spatial_grid(sites, max_distance)
899
+
900
+ for (let idx_a = 0; idx_a < sites.length - 1; idx_a++) {
901
+ const [x1, y1, z1] = sites[idx_a].xyz
902
+ const majority_a = get_majority_species(sites[idx_a])
903
+ const radius_a = majority_a.element ? covalent_radii.get(majority_a.element) : undefined
904
+
905
+ for (const idx_b of get_candidates(sites[idx_a].xyz, sites, spatial)) {
906
+ if (idx_b <= idx_a) continue
907
+
908
+ const [x2, y2, z2] = sites[idx_b].xyz
909
+ const majority_b = get_majority_species(sites[idx_b])
910
+ const radius_b = majority_b.element ? covalent_radii.get(majority_b.element) : undefined
911
+
912
+ const [dx, dy, dz] = [x2 - x1, y2 - y1, z2 - z1]
913
+ const dist_sq = dx * dx + dy * dy + dz * dz
914
+ const dist = Math.sqrt(dist_sq)
915
+
916
+ if (dist_sq < min_dist_sq || dist_sq > max_dist_sq || !radius_a || !radius_b) {
917
+ continue
918
+ }
919
+
920
+ const avg_radius = (radius_a + radius_b) / 2.0
921
+ const face_area = Math.PI * avg_radius * avg_radius
922
+ const bond_solid_angle = face_area / dist_sq
923
+
924
+ if (bond_solid_angle < min_solid_angle || face_area < min_face_area) continue
925
+
926
+ const dist_penalty = Math.exp(-((dist / (radius_a + radius_b) - 1) ** 2) / 0.4)
927
+ const angle_strength = Math.min(bond_solid_angle / (4.0 * Math.PI), 1.0)
928
+ const strength = angle_strength * dist_penalty
929
+
930
+ if (strength > strength_threshold) {
931
+ bonds.push({
932
+ pos_1: sites[idx_a].xyz,
933
+ pos_2: sites[idx_b].xyz,
934
+ site_idx_1: idx_a,
935
+ site_idx_2: idx_b,
936
+ bond_length: dist,
937
+ strength,
938
+ transform_matrix: compute_bond_transform(sites[idx_a].xyz, sites[idx_b].xyz),
939
+ })
940
+ }
941
+ }
942
+ }
943
+ return apply_explicit_bond_metadata(structure, bonds)
944
+ }