matterviz 0.3.5 → 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 (855) 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/brillouin/BrillouinZone.svelte +549 -0
  14. package/dist/src/lib/brillouin/BrillouinZoneControls.svelte +144 -0
  15. package/dist/src/lib/brillouin/BrillouinZoneExportPane.svelte +146 -0
  16. package/dist/src/lib/brillouin/BrillouinZoneInfoPane.svelte +146 -0
  17. package/dist/src/lib/brillouin/BrillouinZoneScene.svelte +476 -0
  18. package/dist/src/lib/brillouin/BrillouinZoneTooltip.svelte +92 -0
  19. package/dist/src/lib/brillouin/compute.ts +529 -0
  20. package/dist/src/lib/brillouin/index.ts +8 -0
  21. package/dist/src/lib/brillouin/types.ts +51 -0
  22. package/dist/src/lib/chempot-diagram/ChemPotDiagram.svelte +327 -0
  23. package/dist/src/lib/chempot-diagram/ChemPotDiagram2D.svelte +846 -0
  24. package/dist/src/lib/chempot-diagram/ChemPotDiagram3D.svelte +3193 -0
  25. package/dist/src/lib/chempot-diagram/async-compute.svelte.ts +94 -0
  26. package/dist/src/lib/chempot-diagram/chempot-worker.ts +11 -0
  27. package/dist/src/lib/chempot-diagram/color.ts +42 -0
  28. package/dist/src/lib/chempot-diagram/compute.ts +1014 -0
  29. package/dist/src/lib/chempot-diagram/index.ts +6 -0
  30. package/dist/src/lib/chempot-diagram/pointer.ts +56 -0
  31. package/dist/src/lib/chempot-diagram/temperature.ts +77 -0
  32. package/dist/src/lib/chempot-diagram/types.ts +130 -0
  33. package/dist/src/lib/colors/index.ts +249 -0
  34. package/dist/src/lib/composition/BarChart.svelte +297 -0
  35. package/dist/src/lib/composition/BubbleChart.svelte +218 -0
  36. package/dist/src/lib/composition/Composition.svelte +165 -0
  37. package/dist/src/lib/composition/Formula.svelte +268 -0
  38. package/dist/src/lib/composition/FormulaFilter.svelte +1257 -0
  39. package/dist/src/lib/composition/PieChart.svelte +323 -0
  40. package/dist/src/lib/composition/format.ts +155 -0
  41. package/dist/src/lib/composition/index.ts +37 -0
  42. package/dist/src/lib/composition/parse.ts +605 -0
  43. package/dist/src/lib/constants.ts +134 -0
  44. package/dist/src/lib/controls.ts +42 -0
  45. package/dist/src/lib/convex-hull/ConvexHull.svelte +157 -0
  46. package/dist/src/lib/convex-hull/ConvexHull2D.svelte +825 -0
  47. package/dist/src/lib/convex-hull/ConvexHull3D.svelte +1801 -0
  48. package/dist/src/lib/convex-hull/ConvexHull4D.svelte +1398 -0
  49. package/dist/src/lib/convex-hull/ConvexHullControls.svelte +535 -0
  50. package/dist/src/lib/convex-hull/ConvexHullInfoPane.svelte +125 -0
  51. package/dist/src/lib/convex-hull/ConvexHullStats.svelte +929 -0
  52. package/dist/src/lib/convex-hull/ConvexHullTooltip.svelte +131 -0
  53. package/dist/src/lib/convex-hull/GasPressureControls.svelte +247 -0
  54. package/dist/src/lib/convex-hull/StructurePopup.svelte +151 -0
  55. package/dist/src/lib/convex-hull/TemperatureSlider.svelte +140 -0
  56. package/dist/src/lib/convex-hull/barycentric-coords.ts +246 -0
  57. package/dist/src/lib/convex-hull/demo-temperature.ts +63 -0
  58. package/dist/src/lib/convex-hull/gas-thermodynamics.ts +405 -0
  59. package/dist/src/lib/convex-hull/helpers.ts +932 -0
  60. package/dist/src/lib/convex-hull/index.ts +202 -0
  61. package/dist/src/lib/convex-hull/thermodynamics.ts +2192 -0
  62. package/dist/src/lib/convex-hull/types.ts +267 -0
  63. package/dist/src/lib/coordination/CoordinationBarPlot.svelte +311 -0
  64. package/dist/src/lib/coordination/calc-coordination.ts +93 -0
  65. package/dist/src/lib/coordination/index.ts +9 -0
  66. package/dist/src/lib/effects.svelte.ts +48 -0
  67. package/dist/src/lib/element/BohrAtom.svelte +147 -0
  68. package/dist/src/lib/element/ElementHeading.svelte +26 -0
  69. package/dist/src/lib/element/ElementPhoto.svelte +57 -0
  70. package/dist/src/lib/element/ElementStats.svelte +80 -0
  71. package/dist/src/lib/element/ElementTile.svelte +484 -0
  72. package/dist/src/lib/element/data.json.gz.d.ts +4 -0
  73. package/dist/src/lib/element/data.ts +14 -0
  74. package/dist/src/lib/element/index.ts +8 -0
  75. package/dist/src/lib/element/types.ts +62 -0
  76. package/dist/src/lib/feedback/ClickFeedback.svelte +58 -0
  77. package/dist/src/lib/feedback/DragOverlay.svelte +42 -0
  78. package/dist/src/lib/feedback/index.ts +4 -0
  79. package/dist/src/lib/fermi-surface/FermiSlice.svelte +189 -0
  80. package/dist/src/lib/fermi-surface/FermiSurface.svelte +600 -0
  81. package/dist/src/lib/fermi-surface/FermiSurfaceControls.svelte +448 -0
  82. package/dist/src/lib/fermi-surface/FermiSurfaceScene.svelte +794 -0
  83. package/dist/src/lib/fermi-surface/FermiSurfaceTooltip.svelte +111 -0
  84. package/dist/src/lib/fermi-surface/compute.ts +728 -0
  85. package/dist/src/lib/fermi-surface/constants.ts +32 -0
  86. package/dist/src/lib/fermi-surface/export.ts +64 -0
  87. package/dist/src/lib/fermi-surface/index.ts +14 -0
  88. package/dist/src/lib/fermi-surface/marching-cubes.ts +3 -0
  89. package/dist/src/lib/fermi-surface/parse.ts +574 -0
  90. package/dist/src/lib/fermi-surface/symmetry.ts +56 -0
  91. package/dist/src/lib/fermi-surface/types.ts +159 -0
  92. package/dist/src/lib/heatmap-matrix/HeatmapMatrix.svelte +1545 -0
  93. package/dist/src/lib/heatmap-matrix/HeatmapMatrixControls.svelte +225 -0
  94. package/dist/src/lib/heatmap-matrix/index.ts +167 -0
  95. package/dist/src/lib/heatmap-matrix/shared.ts +7 -0
  96. package/dist/src/lib/icons.ts +650 -0
  97. package/dist/src/lib/index.ts +61 -0
  98. package/dist/src/lib/io/decompress.ts +92 -0
  99. package/dist/src/lib/io/export.ts +385 -0
  100. package/dist/src/lib/io/fetch.ts +46 -0
  101. package/dist/src/lib/io/file-drop.ts +51 -0
  102. package/dist/src/lib/io/index.ts +7 -0
  103. package/dist/src/lib/io/is-binary.ts +24 -0
  104. package/dist/src/lib/io/types.ts +8 -0
  105. package/dist/src/lib/io/url-drop.ts +141 -0
  106. package/dist/src/lib/isosurface/Isosurface.svelte +285 -0
  107. package/dist/src/lib/isosurface/IsosurfaceControls.svelte +277 -0
  108. package/dist/src/lib/isosurface/index.ts +7 -0
  109. package/dist/src/lib/isosurface/parse.ts +656 -0
  110. package/dist/src/lib/isosurface/slice.ts +175 -0
  111. package/dist/src/lib/isosurface/types.ts +309 -0
  112. package/dist/src/lib/labels.ts +320 -0
  113. package/dist/src/lib/layout/FullscreenToggle.svelte +50 -0
  114. package/dist/src/lib/layout/InfoCard.svelte +120 -0
  115. package/dist/src/lib/layout/InfoTag.svelte +185 -0
  116. package/dist/src/lib/layout/PropertyFilter.svelte +246 -0
  117. package/dist/src/lib/layout/SettingsSection.svelte +148 -0
  118. package/dist/src/lib/layout/SubpageGrid.svelte +82 -0
  119. package/dist/src/lib/layout/fullscreen.ts +65 -0
  120. package/dist/src/lib/layout/index.ts +11 -0
  121. package/dist/src/lib/layout/json-tree/JsonNode.svelte +548 -0
  122. package/dist/src/lib/layout/json-tree/JsonTree.svelte +1230 -0
  123. package/dist/src/lib/layout/json-tree/JsonValue.svelte +334 -0
  124. package/dist/src/lib/layout/json-tree/index.ts +3 -0
  125. package/dist/src/lib/layout/json-tree/types.ts +126 -0
  126. package/dist/src/lib/layout/json-tree/utils.ts +682 -0
  127. package/dist/src/lib/marching-cubes.ts +614 -0
  128. package/dist/src/lib/math.ts +1081 -0
  129. package/dist/src/lib/overlays/ContextMenu.svelte +162 -0
  130. package/dist/src/lib/overlays/CopyButton.svelte +45 -0
  131. package/dist/src/lib/overlays/DragControlTab.svelte +98 -0
  132. package/dist/src/lib/overlays/DraggablePane.svelte +487 -0
  133. package/dist/src/lib/overlays/InfoPaneCards.svelte +149 -0
  134. package/dist/src/lib/overlays/index.ts +3 -0
  135. package/dist/src/lib/periodic-table/PeriodicTable.svelte +469 -0
  136. package/dist/src/lib/periodic-table/PeriodicTableControls.svelte +557 -0
  137. package/dist/src/lib/periodic-table/PropertySelect.svelte +37 -0
  138. package/dist/src/lib/periodic-table/index.ts +12 -0
  139. package/dist/src/lib/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +1086 -0
  140. package/dist/src/lib/phase-diagram/PhaseDiagramControls.svelte +444 -0
  141. package/dist/src/lib/phase-diagram/PhaseDiagramEditorPane.svelte +126 -0
  142. package/dist/src/lib/phase-diagram/PhaseDiagramExportPane.svelte +184 -0
  143. package/dist/src/lib/phase-diagram/PhaseDiagramTooltip.svelte +391 -0
  144. package/dist/src/lib/phase-diagram/TdbInfoPanel.svelte +203 -0
  145. package/dist/src/lib/phase-diagram/build-diagram.ts +186 -0
  146. package/dist/src/lib/phase-diagram/colors.ts +58 -0
  147. package/dist/src/lib/phase-diagram/diagram-input.ts +40 -0
  148. package/dist/src/lib/phase-diagram/index.ts +13 -0
  149. package/dist/src/lib/phase-diagram/parse.ts +348 -0
  150. package/dist/src/lib/phase-diagram/svg-to-diagram.ts +1023 -0
  151. package/dist/src/lib/phase-diagram/types.ts +144 -0
  152. package/dist/src/lib/phase-diagram/utils.ts +775 -0
  153. package/dist/src/lib/plot/AxisLabel.svelte +51 -0
  154. package/dist/src/lib/plot/BarPlot.svelte +2113 -0
  155. package/dist/src/lib/plot/BarPlotControls.svelte +66 -0
  156. package/dist/src/lib/plot/BinnedScatterPlot.svelte +1114 -0
  157. package/dist/src/lib/plot/ColorBar.svelte +721 -0
  158. package/dist/src/lib/plot/ColorScaleSelect.svelte +54 -0
  159. package/dist/src/lib/plot/ElementScatter.svelte +63 -0
  160. package/dist/src/lib/plot/FillArea.svelte +223 -0
  161. package/dist/src/lib/plot/Histogram.svelte +1558 -0
  162. package/dist/src/lib/plot/HistogramControls.svelte +212 -0
  163. package/dist/src/lib/plot/InteractiveAxisLabel.svelte +96 -0
  164. package/dist/src/lib/plot/Line.svelte +84 -0
  165. package/dist/src/lib/plot/PlotAxis.svelte +169 -0
  166. package/dist/src/lib/plot/PlotControls.svelte +537 -0
  167. package/dist/src/lib/plot/PlotLegend.svelte +569 -0
  168. package/dist/src/lib/plot/PlotTooltip.svelte +67 -0
  169. package/dist/src/lib/plot/PortalSelect.svelte +253 -0
  170. package/dist/src/lib/plot/ReferenceLine3D.svelte +156 -0
  171. package/dist/src/lib/plot/ReferencePlane.svelte +175 -0
  172. package/dist/src/lib/plot/ScatterPlot.svelte +2778 -0
  173. package/dist/src/lib/plot/ScatterPlot3D.svelte +529 -0
  174. package/dist/src/lib/plot/ScatterPlot3DControls.svelte +437 -0
  175. package/dist/src/lib/plot/ScatterPlot3DScene.svelte +912 -0
  176. package/dist/src/lib/plot/ScatterPlotControls.svelte +306 -0
  177. package/dist/src/lib/plot/ScatterPoint.svelte +182 -0
  178. package/dist/src/lib/plot/SpacegroupBarPlot.svelte +293 -0
  179. package/dist/src/lib/plot/Surface3D.svelte +197 -0
  180. package/dist/src/lib/plot/ZeroLines.svelte +97 -0
  181. package/dist/src/lib/plot/ZoomRect.svelte +23 -0
  182. package/dist/src/lib/plot/adaptive-density.ts +316 -0
  183. package/dist/src/lib/plot/auto-place.ts +184 -0
  184. package/dist/src/lib/plot/axis-utils.ts +122 -0
  185. package/dist/src/lib/plot/binned-scatter-types.ts +83 -0
  186. package/dist/src/lib/plot/data-cleaning.ts +1069 -0
  187. package/dist/src/lib/plot/data-transform.ts +69 -0
  188. package/dist/src/lib/plot/defaults.ts +9 -0
  189. package/dist/src/lib/plot/fill-utils.ts +494 -0
  190. package/dist/src/lib/plot/hover-lock.svelte.ts +60 -0
  191. package/dist/src/lib/plot/index.ts +53 -0
  192. package/dist/src/lib/plot/interactions.ts +119 -0
  193. package/dist/src/lib/plot/layout.ts +425 -0
  194. package/dist/src/lib/plot/reference-line.ts +426 -0
  195. package/dist/src/lib/plot/scales.ts +654 -0
  196. package/dist/src/lib/plot/svg.ts +23 -0
  197. package/dist/src/lib/plot/types.ts +1144 -0
  198. package/dist/src/lib/plot/utils/label-placement.ts +541 -0
  199. package/dist/src/lib/plot/utils/series-visibility.ts +140 -0
  200. package/dist/src/lib/plot/utils.ts +11 -0
  201. package/dist/src/lib/rdf/RdfPlot.svelte +247 -0
  202. package/dist/src/lib/rdf/calc-rdf.ts +167 -0
  203. package/dist/src/lib/rdf/index.ts +27 -0
  204. package/dist/src/lib/sanitize.ts +126 -0
  205. package/dist/src/lib/settings.ts +1479 -0
  206. package/dist/src/lib/spectral/Bands.svelte +1040 -0
  207. package/dist/src/lib/spectral/BandsAndDos.svelte +134 -0
  208. package/dist/src/lib/spectral/BrillouinBandsDos.svelte +252 -0
  209. package/dist/src/lib/spectral/Dos.svelte +697 -0
  210. package/dist/src/lib/spectral/helpers.ts +1381 -0
  211. package/dist/src/lib/spectral/index.ts +8 -0
  212. package/dist/src/lib/spectral/types.ts +112 -0
  213. package/dist/src/lib/state.svelte.ts +64 -0
  214. package/dist/src/lib/structure/Arrow.svelte +72 -0
  215. package/dist/src/lib/structure/AtomLegend.svelte +815 -0
  216. package/dist/src/lib/structure/Bond.svelte +140 -0
  217. package/dist/src/lib/structure/CanvasTooltip.svelte +33 -0
  218. package/dist/src/lib/structure/CellSelect.svelte +349 -0
  219. package/dist/src/lib/structure/Cylinder.svelte +45 -0
  220. package/dist/src/lib/structure/Lattice.svelte +196 -0
  221. package/dist/src/lib/structure/Structure.svelte +2248 -0
  222. package/dist/src/lib/structure/StructureControls.svelte +1273 -0
  223. package/dist/src/lib/structure/StructureExportPane.svelte +252 -0
  224. package/dist/src/lib/structure/StructureInfoPane.svelte +737 -0
  225. package/dist/src/lib/structure/StructureScene.svelte +2255 -0
  226. package/dist/src/lib/structure/atom-properties.ts +316 -0
  227. package/dist/src/lib/structure/bond-order-perception.ts +447 -0
  228. package/dist/src/lib/structure/bonding.ts +944 -0
  229. package/dist/src/lib/structure/export.ts +861 -0
  230. package/dist/src/lib/structure/index.ts +291 -0
  231. package/dist/src/lib/structure/label-placement.ts +130 -0
  232. package/dist/src/lib/structure/measure.ts +45 -0
  233. package/dist/src/lib/structure/parse.ts +1705 -0
  234. package/dist/src/lib/structure/partial-occupancy.ts +183 -0
  235. package/dist/src/lib/structure/pbc.ts +164 -0
  236. package/dist/src/lib/structure/supercell.ts +226 -0
  237. package/dist/src/lib/structure/validation.ts +11 -0
  238. package/dist/src/lib/symmetry/SymmetryStats.svelte +226 -0
  239. package/dist/src/lib/symmetry/WyckoffTable.svelte +120 -0
  240. package/dist/src/lib/symmetry/cell-transform.ts +118 -0
  241. package/dist/src/lib/symmetry/index.ts +348 -0
  242. package/dist/src/lib/symmetry/spacegroups.ts +404 -0
  243. package/dist/src/lib/table/HeatmapTable.svelte +1833 -0
  244. package/dist/src/lib/table/ToggleMenu.svelte +385 -0
  245. package/dist/src/lib/table/index.ts +139 -0
  246. package/dist/src/lib/theme/ThemeControl.svelte +53 -0
  247. package/dist/src/lib/theme/index.ts +107 -0
  248. package/dist/src/lib/theme/themes.mjs +297 -0
  249. package/dist/src/lib/time.ts +71 -0
  250. package/dist/src/lib/tooltip/TooltipContent.svelte +58 -0
  251. package/dist/src/lib/tooltip/index.ts +2 -0
  252. package/dist/src/lib/tooltip/types.ts +13 -0
  253. package/dist/src/lib/trajectory/Trajectory.svelte +1545 -0
  254. package/dist/src/lib/trajectory/TrajectoryError.svelte +128 -0
  255. package/dist/src/lib/trajectory/TrajectoryExportPane.svelte +357 -0
  256. package/dist/src/lib/trajectory/TrajectoryInfoPane.svelte +313 -0
  257. package/dist/src/lib/trajectory/constants.ts +7 -0
  258. package/dist/src/lib/trajectory/extract.ts +196 -0
  259. package/dist/src/lib/trajectory/format-detect.ts +96 -0
  260. package/dist/src/lib/trajectory/frame-reader.ts +456 -0
  261. package/dist/src/lib/trajectory/helpers.ts +217 -0
  262. package/dist/src/lib/trajectory/index.ts +218 -0
  263. package/dist/src/lib/trajectory/parse/ase.ts +109 -0
  264. package/dist/src/lib/trajectory/parse/hdf5.ts +173 -0
  265. package/dist/src/lib/trajectory/parse/index.ts +411 -0
  266. package/dist/src/lib/trajectory/parse/lammps.ts +215 -0
  267. package/dist/src/lib/trajectory/parse/vasp.ts +102 -0
  268. package/dist/src/lib/trajectory/parse/xyz.ts +143 -0
  269. package/dist/src/lib/trajectory/plotting.ts +599 -0
  270. package/dist/src/lib/trajectory/types.ts +13 -0
  271. package/dist/src/lib/utils.ts +56 -0
  272. package/dist/src/lib/xrd/XrdPlot.svelte +615 -0
  273. package/dist/src/lib/xrd/broadening.ts +130 -0
  274. package/dist/src/lib/xrd/calc-xrd.ts +397 -0
  275. package/dist/src/lib/xrd/index.ts +38 -0
  276. package/dist/src/lib/xrd/parse.ts +858 -0
  277. package/dist/webview.js +29421 -0
  278. package/icon.png +0 -0
  279. package/license +1 -1
  280. package/matterviz-0.3.2.vsix +0 -0
  281. package/matterviz-0.3.4.vsix +0 -0
  282. package/matterviz-0.3.5.vsix +0 -0
  283. package/package.json +1460 -215
  284. package/readme.md +171 -98
  285. package/scripts/sync-config.ts +101 -0
  286. package/src/declarations.d.ts +2 -0
  287. package/src/extension.ts +972 -0
  288. package/src/node-io.ts +65 -0
  289. package/src/types.ts +17 -0
  290. package/src/webview/JsonBrowser.svelte +1079 -0
  291. package/src/webview/PlotPanel.svelte +346 -0
  292. package/src/webview/detect.ts +444 -0
  293. package/src/webview/main.ts +764 -0
  294. package/src/webview/plot-utils.ts +250 -0
  295. package/test-fixtures/all-viz-types.json.gz +0 -0
  296. package/test-fixtures/plot-demo-data.json.gz +0 -0
  297. package/tests/detect.test.ts +604 -0
  298. package/tests/extension.test.ts +2041 -0
  299. package/tests/node-io.test.ts +39 -0
  300. package/tests/plot-utils.test.ts +302 -0
  301. package/tests/vite-plugin-json-gz.test.ts +114 -0
  302. package/tests/vscode-mock.ts +18 -0
  303. package/tests/webview.test.ts +231 -0
  304. package/tsconfig.json +20 -0
  305. package/vite-plugin-json-gz.ts +29 -0
  306. package/vite.config.ts +34 -0
  307. package/vite.extension.config.ts +34 -0
  308. package/dist/EmptyState.svelte.d.ts +0 -9
  309. package/dist/FilePicker.svelte +0 -360
  310. package/dist/FilePicker.svelte.d.ts +0 -17
  311. package/dist/Icon.svelte.d.ts +0 -13
  312. package/dist/MillerIndexInput.svelte +0 -66
  313. package/dist/MillerIndexInput.svelte.d.ts +0 -7
  314. package/dist/api/mp.d.ts +0 -6
  315. package/dist/api/mp.js +0 -22
  316. package/dist/api/optimade.d.ts +0 -45
  317. package/dist/api/optimade.js +0 -135
  318. package/dist/brillouin/BrillouinZone.svelte +0 -546
  319. package/dist/brillouin/BrillouinZone.svelte.d.ts +0 -83
  320. package/dist/brillouin/BrillouinZoneControls.svelte +0 -144
  321. package/dist/brillouin/BrillouinZoneControls.svelte.d.ts +0 -17
  322. package/dist/brillouin/BrillouinZoneExportPane.svelte +0 -148
  323. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +0 -15
  324. package/dist/brillouin/BrillouinZoneInfoPane.svelte +0 -146
  325. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +0 -13
  326. package/dist/brillouin/BrillouinZoneScene.svelte +0 -476
  327. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +0 -48
  328. package/dist/brillouin/BrillouinZoneTooltip.svelte +0 -92
  329. package/dist/brillouin/BrillouinZoneTooltip.svelte.d.ts +0 -8
  330. package/dist/brillouin/compute.d.ts +0 -17
  331. package/dist/brillouin/compute.js +0 -426
  332. package/dist/brillouin/index.d.ts +0 -8
  333. package/dist/brillouin/index.js +0 -8
  334. package/dist/brillouin/types.d.ts +0 -48
  335. package/dist/brillouin/types.js +0 -1
  336. package/dist/chempot-diagram/ChemPotDiagram.svelte +0 -327
  337. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +0 -13
  338. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +0 -847
  339. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +0 -16
  340. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +0 -3194
  341. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +0 -16
  342. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +0 -7
  343. package/dist/chempot-diagram/async-compute.svelte.d.ts +0 -3
  344. package/dist/chempot-diagram/async-compute.svelte.js +0 -78
  345. package/dist/chempot-diagram/chempot-worker.d.ts +0 -1
  346. package/dist/chempot-diagram/chempot-worker.js +0 -11
  347. package/dist/chempot-diagram/color.d.ts +0 -10
  348. package/dist/chempot-diagram/color.js +0 -32
  349. package/dist/chempot-diagram/compute.d.ts +0 -48
  350. package/dist/chempot-diagram/compute.js +0 -812
  351. package/dist/chempot-diagram/index.d.ts +0 -6
  352. package/dist/chempot-diagram/index.js +0 -6
  353. package/dist/chempot-diagram/pointer.d.ts +0 -16
  354. package/dist/chempot-diagram/pointer.js +0 -40
  355. package/dist/chempot-diagram/temperature.d.ts +0 -15
  356. package/dist/chempot-diagram/temperature.js +0 -36
  357. package/dist/chempot-diagram/types.d.ts +0 -86
  358. package/dist/chempot-diagram/types.js +0 -28
  359. package/dist/colors/index.d.ts +0 -47
  360. package/dist/colors/index.js +0 -203
  361. package/dist/composition/BarChart.svelte +0 -297
  362. package/dist/composition/BarChart.svelte.d.ts +0 -39
  363. package/dist/composition/BubbleChart.svelte +0 -218
  364. package/dist/composition/BubbleChart.svelte.d.ts +0 -28
  365. package/dist/composition/Composition.svelte +0 -164
  366. package/dist/composition/Composition.svelte.d.ts +0 -15
  367. package/dist/composition/Formula.svelte +0 -265
  368. package/dist/composition/Formula.svelte.d.ts +0 -19
  369. package/dist/composition/FormulaFilter.svelte +0 -1259
  370. package/dist/composition/FormulaFilter.svelte.d.ts +0 -51
  371. package/dist/composition/PieChart.svelte +0 -323
  372. package/dist/composition/PieChart.svelte.d.ts +0 -37
  373. package/dist/composition/format.d.ts +0 -15
  374. package/dist/composition/format.js +0 -109
  375. package/dist/composition/index.d.ts +0 -20
  376. package/dist/composition/index.js +0 -14
  377. package/dist/composition/parse.d.ts +0 -55
  378. package/dist/composition/parse.js +0 -459
  379. package/dist/constants.d.ts +0 -29
  380. package/dist/constants.js +0 -99
  381. package/dist/controls.d.ts +0 -14
  382. package/dist/controls.js +0 -30
  383. package/dist/convex-hull/ConvexHull.svelte +0 -157
  384. package/dist/convex-hull/ConvexHull.svelte.d.ts +0 -13
  385. package/dist/convex-hull/ConvexHull2D.svelte +0 -814
  386. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +0 -11
  387. package/dist/convex-hull/ConvexHull3D.svelte +0 -1790
  388. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +0 -8
  389. package/dist/convex-hull/ConvexHull4D.svelte +0 -1386
  390. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +0 -8
  391. package/dist/convex-hull/ConvexHullControls.svelte +0 -546
  392. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +0 -48
  393. package/dist/convex-hull/ConvexHullInfoPane.svelte +0 -122
  394. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +0 -18
  395. package/dist/convex-hull/ConvexHullStats.svelte +0 -922
  396. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +0 -15
  397. package/dist/convex-hull/ConvexHullTooltip.svelte +0 -131
  398. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +0 -33
  399. package/dist/convex-hull/GasPressureControls.svelte +0 -247
  400. package/dist/convex-hull/GasPressureControls.svelte.d.ts +0 -11
  401. package/dist/convex-hull/StructurePopup.svelte +0 -116
  402. package/dist/convex-hull/StructurePopup.svelte.d.ts +0 -18
  403. package/dist/convex-hull/TemperatureSlider.svelte +0 -137
  404. package/dist/convex-hull/TemperatureSlider.svelte.d.ts +0 -8
  405. package/dist/convex-hull/barycentric-coords.d.ts +0 -18
  406. package/dist/convex-hull/barycentric-coords.js +0 -182
  407. package/dist/convex-hull/demo-temperature.d.ts +0 -6
  408. package/dist/convex-hull/demo-temperature.js +0 -40
  409. package/dist/convex-hull/gas-thermodynamics.d.ts +0 -16
  410. package/dist/convex-hull/gas-thermodynamics.js +0 -316
  411. package/dist/convex-hull/helpers.d.ts +0 -103
  412. package/dist/convex-hull/helpers.js +0 -689
  413. package/dist/convex-hull/index.d.ts +0 -118
  414. package/dist/convex-hull/index.js +0 -57
  415. package/dist/convex-hull/thermodynamics.d.ts +0 -66
  416. package/dist/convex-hull/thermodynamics.js +0 -1752
  417. package/dist/convex-hull/types.d.ts +0 -162
  418. package/dist/convex-hull/types.js +0 -36
  419. package/dist/coordination/CoordinationBarPlot.svelte +0 -311
  420. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +0 -30
  421. package/dist/coordination/calc-coordination.d.ts +0 -15
  422. package/dist/coordination/calc-coordination.js +0 -63
  423. package/dist/coordination/index.d.ts +0 -8
  424. package/dist/coordination/index.js +0 -7
  425. package/dist/element/BohrAtom.svelte +0 -147
  426. package/dist/element/BohrAtom.svelte.d.ts +0 -20
  427. package/dist/element/ElementHeading.svelte +0 -26
  428. package/dist/element/ElementHeading.svelte.d.ts +0 -8
  429. package/dist/element/ElementPhoto.svelte +0 -57
  430. package/dist/element/ElementPhoto.svelte.d.ts +0 -9
  431. package/dist/element/ElementStats.svelte +0 -80
  432. package/dist/element/ElementStats.svelte.d.ts +0 -8
  433. package/dist/element/ElementTile.svelte +0 -484
  434. package/dist/element/ElementTile.svelte.d.ts +0 -29
  435. package/dist/element/Nucleus.svelte.d.ts +0 -17
  436. package/dist/element/data.d.ts +0 -2
  437. package/dist/element/data.js +0 -2
  438. package/dist/element/data.json.gz.d.ts +0 -2
  439. package/dist/element/index.d.ts +0 -8
  440. package/dist/element/index.js +0 -8
  441. package/dist/element/types.d.ts +0 -57
  442. package/dist/element/types.js +0 -1
  443. package/dist/feedback/ClickFeedback.svelte +0 -58
  444. package/dist/feedback/ClickFeedback.svelte.d.ts +0 -12
  445. package/dist/feedback/DragOverlay.svelte +0 -42
  446. package/dist/feedback/DragOverlay.svelte.d.ts +0 -7
  447. package/dist/feedback/Spinner.svelte.d.ts +0 -7
  448. package/dist/feedback/StatusMessage.svelte.d.ts +0 -9
  449. package/dist/feedback/index.d.ts +0 -4
  450. package/dist/feedback/index.js +0 -4
  451. package/dist/fermi-surface/FermiSlice.svelte +0 -189
  452. package/dist/fermi-surface/FermiSlice.svelte.d.ts +0 -24
  453. package/dist/fermi-surface/FermiSurface.svelte +0 -600
  454. package/dist/fermi-surface/FermiSurface.svelte.d.ts +0 -83
  455. package/dist/fermi-surface/FermiSurfaceControls.svelte +0 -452
  456. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +0 -35
  457. package/dist/fermi-surface/FermiSurfaceScene.svelte +0 -792
  458. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +0 -50
  459. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +0 -111
  460. package/dist/fermi-surface/FermiSurfaceTooltip.svelte.d.ts +0 -8
  461. package/dist/fermi-surface/compute.d.ts +0 -5
  462. package/dist/fermi-surface/compute.js +0 -538
  463. package/dist/fermi-surface/constants.d.ts +0 -9
  464. package/dist/fermi-surface/constants.js +0 -27
  465. package/dist/fermi-surface/export.d.ts +0 -5
  466. package/dist/fermi-surface/export.js +0 -63
  467. package/dist/fermi-surface/index.d.ts +0 -12
  468. package/dist/fermi-surface/index.js +0 -13
  469. package/dist/fermi-surface/marching-cubes.d.ts +0 -2
  470. package/dist/fermi-surface/marching-cubes.js +0 -2
  471. package/dist/fermi-surface/parse.d.ts +0 -2
  472. package/dist/fermi-surface/parse.js +0 -495
  473. package/dist/fermi-surface/symmetry.d.ts +0 -3
  474. package/dist/fermi-surface/symmetry.js +0 -46
  475. package/dist/fermi-surface/types.d.ts +0 -113
  476. package/dist/fermi-surface/types.js +0 -4
  477. package/dist/heatmap-matrix/HeatmapMatrix.svelte +0 -1527
  478. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +0 -110
  479. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +0 -225
  480. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +0 -30
  481. package/dist/heatmap-matrix/index.d.ts +0 -53
  482. package/dist/heatmap-matrix/index.js +0 -100
  483. package/dist/heatmap-matrix/shared.d.ts +0 -2
  484. package/dist/heatmap-matrix/shared.js +0 -4
  485. package/dist/icons.d.ts +0 -569
  486. package/dist/icons.js +0 -648
  487. package/dist/index.d.ts +0 -39
  488. package/dist/index.js +0 -39
  489. package/dist/io/decompress.d.ts +0 -10
  490. package/dist/io/decompress.js +0 -74
  491. package/dist/io/export.d.ts +0 -16
  492. package/dist/io/export.js +0 -316
  493. package/dist/io/fetch.d.ts +0 -5
  494. package/dist/io/fetch.js +0 -39
  495. package/dist/io/file-drop.d.ts +0 -7
  496. package/dist/io/file-drop.js +0 -43
  497. package/dist/io/index.d.ts +0 -7
  498. package/dist/io/index.js +0 -7
  499. package/dist/io/is-binary.d.ts +0 -1
  500. package/dist/io/is-binary.js +0 -20
  501. package/dist/io/types.d.ts +0 -8
  502. package/dist/io/types.js +0 -1
  503. package/dist/io/url-drop.d.ts +0 -2
  504. package/dist/io/url-drop.js +0 -117
  505. package/dist/isosurface/Isosurface.svelte +0 -285
  506. package/dist/isosurface/Isosurface.svelte.d.ts +0 -8
  507. package/dist/isosurface/IsosurfaceControls.svelte +0 -291
  508. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +0 -9
  509. package/dist/isosurface/index.d.ts +0 -5
  510. package/dist/isosurface/index.js +0 -6
  511. package/dist/isosurface/parse.d.ts +0 -6
  512. package/dist/isosurface/parse.js +0 -553
  513. package/dist/isosurface/slice.d.ts +0 -11
  514. package/dist/isosurface/slice.js +0 -140
  515. package/dist/isosurface/types.d.ts +0 -56
  516. package/dist/isosurface/types.js +0 -227
  517. package/dist/labels.d.ts +0 -53
  518. package/dist/labels.js +0 -274
  519. package/dist/layout/FullscreenToggle.svelte +0 -50
  520. package/dist/layout/FullscreenToggle.svelte.d.ts +0 -7
  521. package/dist/layout/InfoCard.svelte +0 -120
  522. package/dist/layout/InfoCard.svelte.d.ts +0 -21
  523. package/dist/layout/InfoTag.svelte +0 -183
  524. package/dist/layout/InfoTag.svelte.d.ts +0 -19
  525. package/dist/layout/PropertyFilter.svelte +0 -244
  526. package/dist/layout/PropertyFilter.svelte.d.ts +0 -24
  527. package/dist/layout/SettingsSection.svelte +0 -148
  528. package/dist/layout/SettingsSection.svelte.d.ts +0 -17
  529. package/dist/layout/SubpageGrid.svelte +0 -82
  530. package/dist/layout/SubpageGrid.svelte.d.ts +0 -14
  531. package/dist/layout/fullscreen.d.ts +0 -9
  532. package/dist/layout/fullscreen.js +0 -53
  533. package/dist/layout/index.d.ts +0 -10
  534. package/dist/layout/index.js +0 -8
  535. package/dist/layout/json-tree/JsonNode.svelte +0 -548
  536. package/dist/layout/json-tree/JsonNode.svelte.d.ts +0 -11
  537. package/dist/layout/json-tree/JsonTree.svelte +0 -1222
  538. package/dist/layout/json-tree/JsonTree.svelte.d.ts +0 -6
  539. package/dist/layout/json-tree/JsonValue.svelte +0 -334
  540. package/dist/layout/json-tree/JsonValue.svelte.d.ts +0 -9
  541. package/dist/layout/json-tree/index.d.ts +0 -3
  542. package/dist/layout/json-tree/index.js +0 -3
  543. package/dist/layout/json-tree/types.d.ts +0 -73
  544. package/dist/layout/json-tree/types.js +0 -3
  545. package/dist/layout/json-tree/utils.d.ts +0 -29
  546. package/dist/layout/json-tree/utils.js +0 -649
  547. package/dist/marching-cubes.d.ts +0 -14
  548. package/dist/marching-cubes.js +0 -542
  549. package/dist/math.d.ts +0 -91
  550. package/dist/math.js +0 -896
  551. package/dist/overlays/ContextMenu.svelte +0 -162
  552. package/dist/overlays/ContextMenu.svelte.d.ts +0 -25
  553. package/dist/overlays/CopyButton.svelte +0 -45
  554. package/dist/overlays/CopyButton.svelte.d.ts +0 -8
  555. package/dist/overlays/DraggablePane.svelte +0 -564
  556. package/dist/overlays/DraggablePane.svelte.d.ts +0 -36
  557. package/dist/overlays/InfoPaneCards.svelte +0 -149
  558. package/dist/overlays/InfoPaneCards.svelte.d.ts +0 -22
  559. package/dist/overlays/index.d.ts +0 -2
  560. package/dist/overlays/index.js +0 -2
  561. package/dist/periodic-table/PeriodicTable.svelte +0 -469
  562. package/dist/periodic-table/PeriodicTable.svelte.d.ts +0 -55
  563. package/dist/periodic-table/PeriodicTableControls.svelte +0 -557
  564. package/dist/periodic-table/PeriodicTableControls.svelte.d.ts +0 -24
  565. package/dist/periodic-table/PropertySelect.svelte +0 -37
  566. package/dist/periodic-table/PropertySelect.svelte.d.ts +0 -13
  567. package/dist/periodic-table/TableInset.svelte.d.ts +0 -9
  568. package/dist/periodic-table/index.d.ts +0 -10
  569. package/dist/periodic-table/index.js +0 -4
  570. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +0 -1084
  571. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +0 -44
  572. package/dist/phase-diagram/PhaseDiagramControls.svelte +0 -449
  573. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +0 -30
  574. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +0 -126
  575. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +0 -15
  576. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +0 -192
  577. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +0 -19
  578. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +0 -392
  579. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +0 -16
  580. package/dist/phase-diagram/TdbInfoPanel.svelte +0 -203
  581. package/dist/phase-diagram/TdbInfoPanel.svelte.d.ts +0 -12
  582. package/dist/phase-diagram/build-diagram.d.ts +0 -11
  583. package/dist/phase-diagram/build-diagram.js +0 -167
  584. package/dist/phase-diagram/colors.d.ts +0 -35
  585. package/dist/phase-diagram/colors.js +0 -51
  586. package/dist/phase-diagram/diagram-input.d.ts +0 -33
  587. package/dist/phase-diagram/diagram-input.js +0 -3
  588. package/dist/phase-diagram/index.d.ts +0 -13
  589. package/dist/phase-diagram/index.js +0 -13
  590. package/dist/phase-diagram/parse.d.ts +0 -55
  591. package/dist/phase-diagram/parse.js +0 -276
  592. package/dist/phase-diagram/svg-to-diagram.d.ts +0 -2
  593. package/dist/phase-diagram/svg-to-diagram.js +0 -867
  594. package/dist/phase-diagram/types.d.ts +0 -99
  595. package/dist/phase-diagram/types.js +0 -1
  596. package/dist/phase-diagram/utils.d.ts +0 -118
  597. package/dist/phase-diagram/utils.js +0 -606
  598. package/dist/plot/AxisLabel.svelte +0 -51
  599. package/dist/plot/AxisLabel.svelte.d.ts +0 -16
  600. package/dist/plot/BarPlot.svelte +0 -2265
  601. package/dist/plot/BarPlot.svelte.d.ts +0 -83
  602. package/dist/plot/BarPlotControls.svelte +0 -66
  603. package/dist/plot/BarPlotControls.svelte.d.ts +0 -18
  604. package/dist/plot/ColorBar.svelte +0 -719
  605. package/dist/plot/ColorBar.svelte.d.ts +0 -31
  606. package/dist/plot/ColorScaleSelect.svelte +0 -54
  607. package/dist/plot/ColorScaleSelect.svelte.d.ts +0 -15
  608. package/dist/plot/ElementScatter.svelte +0 -63
  609. package/dist/plot/ElementScatter.svelte.d.ts +0 -14
  610. package/dist/plot/FillArea.svelte +0 -225
  611. package/dist/plot/FillArea.svelte.d.ts +0 -21
  612. package/dist/plot/Histogram.svelte +0 -1672
  613. package/dist/plot/Histogram.svelte.d.ts +0 -50
  614. package/dist/plot/HistogramControls.svelte +0 -212
  615. package/dist/plot/HistogramControls.svelte.d.ts +0 -22
  616. package/dist/plot/InteractiveAxisLabel.svelte +0 -94
  617. package/dist/plot/InteractiveAxisLabel.svelte.d.ts +0 -14
  618. package/dist/plot/Line.svelte +0 -84
  619. package/dist/plot/Line.svelte.d.ts +0 -15
  620. package/dist/plot/PlotControls.svelte +0 -537
  621. package/dist/plot/PlotControls.svelte.d.ts +0 -4
  622. package/dist/plot/PlotLegend.svelte +0 -569
  623. package/dist/plot/PlotLegend.svelte.d.ts +0 -29
  624. package/dist/plot/PlotTooltip.svelte +0 -67
  625. package/dist/plot/PlotTooltip.svelte.d.ts +0 -17
  626. package/dist/plot/PortalSelect.svelte +0 -253
  627. package/dist/plot/PortalSelect.svelte.d.ts +0 -16
  628. package/dist/plot/ReferenceLine.svelte.d.ts +0 -20
  629. package/dist/plot/ReferenceLine3D.svelte +0 -154
  630. package/dist/plot/ReferenceLine3D.svelte.d.ts +0 -14
  631. package/dist/plot/ReferencePlane.svelte +0 -178
  632. package/dist/plot/ReferencePlane.svelte.d.ts +0 -14
  633. package/dist/plot/ScatterPlot.svelte +0 -2845
  634. package/dist/plot/ScatterPlot.svelte.d.ts +0 -93
  635. package/dist/plot/ScatterPlot3D.svelte +0 -502
  636. package/dist/plot/ScatterPlot3D.svelte.d.ts +0 -94
  637. package/dist/plot/ScatterPlot3DControls.svelte +0 -437
  638. package/dist/plot/ScatterPlot3DControls.svelte.d.ts +0 -20
  639. package/dist/plot/ScatterPlot3DScene.svelte +0 -912
  640. package/dist/plot/ScatterPlot3DScene.svelte.d.ts +0 -74
  641. package/dist/plot/ScatterPlotControls.svelte +0 -307
  642. package/dist/plot/ScatterPlotControls.svelte.d.ts +0 -17
  643. package/dist/plot/ScatterPoint.svelte +0 -191
  644. package/dist/plot/ScatterPoint.svelte.d.ts +0 -21
  645. package/dist/plot/SpacegroupBarPlot.svelte +0 -293
  646. package/dist/plot/SpacegroupBarPlot.svelte.d.ts +0 -9
  647. package/dist/plot/Surface3D.svelte +0 -200
  648. package/dist/plot/Surface3D.svelte.d.ts +0 -13
  649. package/dist/plot/ZeroLines.svelte +0 -96
  650. package/dist/plot/ZeroLines.svelte.d.ts +0 -32
  651. package/dist/plot/ZoomRect.svelte +0 -23
  652. package/dist/plot/ZoomRect.svelte.d.ts +0 -8
  653. package/dist/plot/axis-utils.d.ts +0 -19
  654. package/dist/plot/axis-utils.js +0 -80
  655. package/dist/plot/data-cleaning.d.ts +0 -37
  656. package/dist/plot/data-cleaning.js +0 -855
  657. package/dist/plot/data-transform.d.ts +0 -16
  658. package/dist/plot/data-transform.js +0 -45
  659. package/dist/plot/defaults.d.ts +0 -19
  660. package/dist/plot/defaults.js +0 -9
  661. package/dist/plot/fill-utils.d.ts +0 -51
  662. package/dist/plot/fill-utils.js +0 -337
  663. package/dist/plot/hover-lock.svelte.d.ts +0 -14
  664. package/dist/plot/hover-lock.svelte.js +0 -46
  665. package/dist/plot/index.d.ts +0 -37
  666. package/dist/plot/index.js +0 -37
  667. package/dist/plot/interactions.d.ts +0 -12
  668. package/dist/plot/interactions.js +0 -100
  669. package/dist/plot/layout.d.ts +0 -60
  670. package/dist/plot/layout.js +0 -230
  671. package/dist/plot/reference-line.d.ts +0 -60
  672. package/dist/plot/reference-line.js +0 -316
  673. package/dist/plot/scales.d.ts +0 -48
  674. package/dist/plot/scales.js +0 -484
  675. package/dist/plot/svg.d.ts +0 -1
  676. package/dist/plot/svg.js +0 -11
  677. package/dist/plot/types.d.ts +0 -859
  678. package/dist/plot/types.js +0 -103
  679. package/dist/plot/utils/label-placement.d.ts +0 -47
  680. package/dist/plot/utils/label-placement.js +0 -256
  681. package/dist/plot/utils/series-visibility.d.ts +0 -9
  682. package/dist/plot/utils/series-visibility.js +0 -67
  683. package/dist/plot/utils.d.ts +0 -1
  684. package/dist/plot/utils.js +0 -14
  685. package/dist/rdf/RdfPlot.svelte +0 -247
  686. package/dist/rdf/RdfPlot.svelte.d.ts +0 -27
  687. package/dist/rdf/calc-rdf.d.ts +0 -4
  688. package/dist/rdf/calc-rdf.js +0 -111
  689. package/dist/rdf/index.d.ts +0 -23
  690. package/dist/rdf/index.js +0 -2
  691. package/dist/sanitize.d.ts +0 -4
  692. package/dist/sanitize.js +0 -114
  693. package/dist/settings.d.ts +0 -255
  694. package/dist/settings.js +0 -1132
  695. package/dist/spectral/Bands.svelte +0 -1040
  696. package/dist/spectral/Bands.svelte.d.ts +0 -40
  697. package/dist/spectral/BandsAndDos.svelte +0 -128
  698. package/dist/spectral/BandsAndDos.svelte.d.ts +0 -18
  699. package/dist/spectral/BrillouinBandsDos.svelte +0 -248
  700. package/dist/spectral/BrillouinBandsDos.svelte.d.ts +0 -20
  701. package/dist/spectral/Dos.svelte +0 -697
  702. package/dist/spectral/Dos.svelte.d.ts +0 -29
  703. package/dist/spectral/helpers.d.ts +0 -117
  704. package/dist/spectral/helpers.js +0 -1023
  705. package/dist/spectral/index.d.ts +0 -6
  706. package/dist/spectral/index.js +0 -7
  707. package/dist/spectral/types.d.ts +0 -84
  708. package/dist/spectral/types.js +0 -2
  709. package/dist/state.svelte.d.ts +0 -25
  710. package/dist/state.svelte.js +0 -45
  711. package/dist/structure/Arrow.svelte +0 -72
  712. package/dist/structure/Arrow.svelte.d.ts +0 -15
  713. package/dist/structure/AtomLegend.svelte +0 -798
  714. package/dist/structure/AtomLegend.svelte.d.ts +0 -34
  715. package/dist/structure/Bond.svelte +0 -140
  716. package/dist/structure/Bond.svelte.d.ts +0 -9
  717. package/dist/structure/CanvasTooltip.svelte +0 -33
  718. package/dist/structure/CanvasTooltip.svelte.d.ts +0 -12
  719. package/dist/structure/CellSelect.svelte +0 -351
  720. package/dist/structure/CellSelect.svelte.d.ts +0 -13
  721. package/dist/structure/Cylinder.svelte +0 -45
  722. package/dist/structure/Cylinder.svelte.d.ts +0 -10
  723. package/dist/structure/Lattice.svelte +0 -196
  724. package/dist/structure/Lattice.svelte.d.ts +0 -17
  725. package/dist/structure/Structure.svelte +0 -1999
  726. package/dist/structure/Structure.svelte.d.ts +0 -87
  727. package/dist/structure/StructureControls.svelte +0 -1298
  728. package/dist/structure/StructureControls.svelte.d.ts +0 -31
  729. package/dist/structure/StructureExportPane.svelte +0 -251
  730. package/dist/structure/StructureExportPane.svelte.d.ts +0 -17
  731. package/dist/structure/StructureInfoPane.svelte +0 -735
  732. package/dist/structure/StructureInfoPane.svelte.d.ts +0 -19
  733. package/dist/structure/StructureScene.svelte +0 -1905
  734. package/dist/structure/StructureScene.svelte.d.ts +0 -108
  735. package/dist/structure/atom-properties.d.ts +0 -37
  736. package/dist/structure/atom-properties.js +0 -200
  737. package/dist/structure/bond-order-perception.d.ts +0 -13
  738. package/dist/structure/bond-order-perception.js +0 -367
  739. package/dist/structure/bonding.d.ts +0 -42
  740. package/dist/structure/bonding.js +0 -525
  741. package/dist/structure/export.d.ts +0 -20
  742. package/dist/structure/export.js +0 -727
  743. package/dist/structure/index.d.ts +0 -125
  744. package/dist/structure/index.js +0 -171
  745. package/dist/structure/label-placement.d.ts +0 -14
  746. package/dist/structure/label-placement.js +0 -72
  747. package/dist/structure/measure.d.ts +0 -6
  748. package/dist/structure/measure.js +0 -29
  749. package/dist/structure/parse.d.ts +0 -66
  750. package/dist/structure/parse.js +0 -1363
  751. package/dist/structure/partial-occupancy.d.ts +0 -25
  752. package/dist/structure/partial-occupancy.js +0 -99
  753. package/dist/structure/pbc.d.ts +0 -9
  754. package/dist/structure/pbc.js +0 -123
  755. package/dist/structure/supercell.d.ts +0 -8
  756. package/dist/structure/supercell.js +0 -170
  757. package/dist/structure/validation.d.ts +0 -2
  758. package/dist/structure/validation.js +0 -10
  759. package/dist/symmetry/SymmetryStats.svelte +0 -226
  760. package/dist/symmetry/SymmetryStats.svelte.d.ts +0 -21
  761. package/dist/symmetry/WyckoffTable.svelte +0 -113
  762. package/dist/symmetry/WyckoffTable.svelte.d.ts +0 -11
  763. package/dist/symmetry/cell-transform.d.ts +0 -12
  764. package/dist/symmetry/cell-transform.js +0 -91
  765. package/dist/symmetry/index.d.ts +0 -43
  766. package/dist/symmetry/index.js +0 -229
  767. package/dist/symmetry/spacegroups.d.ts +0 -9
  768. package/dist/symmetry/spacegroups.js +0 -394
  769. package/dist/table/HeatmapTable.svelte +0 -1854
  770. package/dist/table/HeatmapTable.svelte.d.ts +0 -49
  771. package/dist/table/ToggleMenu.svelte +0 -376
  772. package/dist/table/ToggleMenu.svelte.d.ts +0 -11
  773. package/dist/table/index.d.ts +0 -74
  774. package/dist/table/index.js +0 -38
  775. package/dist/theme/ThemeControl.svelte +0 -53
  776. package/dist/theme/ThemeControl.svelte.d.ts +0 -9
  777. package/dist/theme/index.d.ts +0 -29
  778. package/dist/theme/index.js +0 -79
  779. package/dist/theme/themes.mjs +0 -285
  780. package/dist/time.d.ts +0 -4
  781. package/dist/time.js +0 -70
  782. package/dist/tooltip/TooltipContent.svelte +0 -58
  783. package/dist/tooltip/TooltipContent.svelte.d.ts +0 -31
  784. package/dist/tooltip/index.d.ts +0 -2
  785. package/dist/tooltip/index.js +0 -2
  786. package/dist/tooltip/types.d.ts +0 -8
  787. package/dist/tooltip/types.js +0 -1
  788. package/dist/trajectory/Trajectory.svelte +0 -1517
  789. package/dist/trajectory/Trajectory.svelte.d.ts +0 -77
  790. package/dist/trajectory/TrajectoryError.svelte +0 -128
  791. package/dist/trajectory/TrajectoryError.svelte.d.ts +0 -13
  792. package/dist/trajectory/TrajectoryExportPane.svelte +0 -357
  793. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +0 -17
  794. package/dist/trajectory/TrajectoryInfoPane.svelte +0 -313
  795. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +0 -17
  796. package/dist/trajectory/constants.d.ts +0 -6
  797. package/dist/trajectory/constants.js +0 -7
  798. package/dist/trajectory/extract.d.ts +0 -5
  799. package/dist/trajectory/extract.js +0 -162
  800. package/dist/trajectory/format-detect.d.ts +0 -9
  801. package/dist/trajectory/format-detect.js +0 -76
  802. package/dist/trajectory/frame-reader.d.ts +0 -17
  803. package/dist/trajectory/frame-reader.js +0 -332
  804. package/dist/trajectory/helpers.d.ts +0 -14
  805. package/dist/trajectory/helpers.js +0 -172
  806. package/dist/trajectory/index.d.ts +0 -63
  807. package/dist/trajectory/index.js +0 -126
  808. package/dist/trajectory/parse/ase.d.ts +0 -2
  809. package/dist/trajectory/parse/ase.js +0 -73
  810. package/dist/trajectory/parse/hdf5.d.ts +0 -2
  811. package/dist/trajectory/parse/hdf5.js +0 -127
  812. package/dist/trajectory/parse/index.d.ts +0 -12
  813. package/dist/trajectory/parse/index.js +0 -299
  814. package/dist/trajectory/parse/lammps.d.ts +0 -5
  815. package/dist/trajectory/parse/lammps.js +0 -179
  816. package/dist/trajectory/parse/vasp.d.ts +0 -2
  817. package/dist/trajectory/parse/vasp.js +0 -68
  818. package/dist/trajectory/parse/xyz.d.ts +0 -2
  819. package/dist/trajectory/parse/xyz.js +0 -110
  820. package/dist/trajectory/plotting.d.ts +0 -28
  821. package/dist/trajectory/plotting.js +0 -423
  822. package/dist/trajectory/types.d.ts +0 -11
  823. package/dist/trajectory/types.js +0 -1
  824. package/dist/utils.d.ts +0 -5
  825. package/dist/utils.js +0 -36
  826. package/dist/xrd/XrdPlot.svelte +0 -615
  827. package/dist/xrd/XrdPlot.svelte.d.ts +0 -28
  828. package/dist/xrd/broadening.d.ts +0 -20
  829. package/dist/xrd/broadening.js +0 -97
  830. package/dist/xrd/calc-xrd.d.ts +0 -37
  831. package/dist/xrd/calc-xrd.js +0 -337
  832. package/dist/xrd/index.d.ts +0 -37
  833. package/dist/xrd/index.js +0 -4
  834. package/dist/xrd/parse.d.ts +0 -13
  835. package/dist/xrd/parse.js +0 -749
  836. /package/dist/{EmptyState.svelte → src/lib/EmptyState.svelte} +0 -0
  837. /package/dist/{Icon.svelte → src/lib/Icon.svelte} +0 -0
  838. /package/dist/{app.css → src/lib/app.css} +0 -0
  839. /package/dist/{chempot-diagram → src/lib/chempot-diagram}/ChemPotScene3D.svelte +0 -0
  840. /package/dist/{colors → src/lib/colors}/alloy-colors.json +0 -0
  841. /package/dist/{colors → src/lib/colors}/dark-mode-colors.json +0 -0
  842. /package/dist/{colors → src/lib/colors}/jmol-colors.json +0 -0
  843. /package/dist/{colors → src/lib/colors}/muted-colors.json +0 -0
  844. /package/dist/{colors → src/lib/colors}/pastel-colors.json +0 -0
  845. /package/dist/{colors → src/lib/colors}/vesta-colors.json +0 -0
  846. /package/dist/{element → src/lib/element}/Nucleus.svelte +0 -0
  847. /package/dist/{element → src/lib/element}/data.json +0 -0
  848. /package/dist/{element → src/lib/element}/data.json.gz +0 -0
  849. /package/dist/{element → src/lib/element}/data.schema.json +0 -0
  850. /package/dist/{element-image-urls.json → src/lib/element-image-urls.json} +0 -0
  851. /package/dist/{feedback → src/lib/feedback}/Spinner.svelte +0 -0
  852. /package/dist/{feedback → src/lib/feedback}/StatusMessage.svelte +0 -0
  853. /package/dist/{periodic-table → src/lib/periodic-table}/TableInset.svelte +0 -0
  854. /package/dist/{plot → src/lib/plot}/ReferenceLine.svelte +0 -0
  855. /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
+ }