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,861 @@
1
+ import { get_electro_neg_formula } from '$lib/composition'
2
+ import { download } from '$lib/io/fetch'
3
+ import type { Vec3 } from '$lib/math'
4
+ import * as math from '$lib/math'
5
+ import type { AnyStructure } from '$lib/structure'
6
+ import type { BufferGeometry, InstancedMesh, Material, Object3D, Scene } from 'three'
7
+ import { Color, Group, Matrix4, Mesh, MeshStandardMaterial, ShaderMaterial } from 'three'
8
+ import { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter.js'
9
+ import { OBJExporter } from 'three/examples/jsm/exporters/OBJExporter.js'
10
+
11
+ // Type guard to check if a material has a color property (duck typing for bundler compatibility)
12
+ // Uses duck typing to work across different Three.js instances (Threlte vs vanilla Three.js)
13
+ export function has_color_property(mat: Material): mat is Material & { color: Color } {
14
+ if (!(`color` in mat)) return false
15
+ const color = (mat as { color: unknown }).color
16
+ if (!color || typeof color !== `object`) return false
17
+ // Check for Color-like object with numeric r/g/b channels (duck typing)
18
+ const color_obj = color as { r?: unknown; g?: unknown; b?: unknown }
19
+ const red_channel = color_obj.r
20
+ const green_channel = color_obj.g
21
+ const blue_channel = color_obj.b
22
+ return (
23
+ typeof red_channel === `number` &&
24
+ typeof green_channel === `number` &&
25
+ typeof blue_channel === `number`
26
+ )
27
+ }
28
+
29
+ // Extract color from a ShaderMaterial by checking common color uniform patterns
30
+ function extract_shader_color(shader_mat: ShaderMaterial): Color | null {
31
+ const uniforms = shader_mat.uniforms
32
+ if (!uniforms) return null
33
+
34
+ // Check for common color uniform names
35
+ for (const key of [`color`, `diffuse`, `baseColor`, `uColor`]) {
36
+ if (uniforms[key]?.value instanceof Color) {
37
+ return uniforms[key].value.clone()
38
+ }
39
+ }
40
+
41
+ // For gradient bonds, try to extract midpoint color from instanceColorStart/End attributes
42
+ // These are set as geometry attributes, not uniforms, so we return a default gray
43
+ return null
44
+ }
45
+
46
+ // Convert ShaderMaterial to MeshStandardMaterial for export compatibility
47
+ function convert_shader_to_standard(shader_mat: ShaderMaterial): MeshStandardMaterial {
48
+ const extracted_color = extract_shader_color(shader_mat)
49
+ const standard_mat = new MeshStandardMaterial({
50
+ color: extracted_color ?? new Color(0.5, 0.5, 0.5),
51
+ metalness: 0.1,
52
+ roughness: 0.5,
53
+ })
54
+ standard_mat.name = shader_mat.name || `converted_shader_material`
55
+ return standard_mat
56
+ }
57
+
58
+ // Extract bond gradient colors from geometry attributes for a specific instance
59
+ // Returns midpoint color between start and end colors for the bond
60
+ export function extract_bond_color_for_instance(
61
+ geometry: BufferGeometry,
62
+ instance_idx: number,
63
+ ): Color | null {
64
+ const color_start_attr = geometry.getAttribute(`instanceColorStart`)
65
+ const color_end_attr = geometry.getAttribute(`instanceColorEnd`)
66
+
67
+ if (!color_start_attr || !color_end_attr) return null
68
+ if (instance_idx < 0 || instance_idx >= color_start_attr.count) return null
69
+
70
+ // Get RGB values for this instance and compute midpoint color
71
+ const start_rgb: Vec3 = [
72
+ color_start_attr.getX(instance_idx),
73
+ color_start_attr.getY(instance_idx),
74
+ color_start_attr.getZ(instance_idx),
75
+ ]
76
+ const end_rgb: Vec3 = [
77
+ color_end_attr.getX(instance_idx),
78
+ color_end_attr.getY(instance_idx),
79
+ color_end_attr.getZ(instance_idx),
80
+ ]
81
+ const [mid_r, mid_g, mid_b] = math.scale(math.add(start_rgb, end_rgb), 0.5)
82
+ return new Color(mid_r, mid_g, mid_b)
83
+ }
84
+
85
+ // Remove custom/non-standard attributes from geometry that cause export issues
86
+ // Standard GLTF attributes: position, normal, tangent, texcoord_N, color_N, joints_N, weights_N
87
+ export function clean_geometry_for_export(geometry: BufferGeometry): void {
88
+ const standard_attrs = new Set([
89
+ `position`,
90
+ `normal`,
91
+ `tangent`,
92
+ `uv`,
93
+ `uv1`,
94
+ `uv2`,
95
+ `uv3`,
96
+ `color`,
97
+ `skinIndex`,
98
+ `skinWeight`,
99
+ ])
100
+
101
+ const attrs_to_remove: string[] = []
102
+ for (const attr_name of Object.keys(geometry.attributes)) {
103
+ // Keep standard attributes and those starting with underscore (GLTF custom)
104
+ // But remove instance-specific attributes that cause accessor count mismatches
105
+ const lower_name = attr_name.toLowerCase()
106
+ if (
107
+ lower_name.includes(`instance`) ||
108
+ (lower_name.includes(`color`) && !standard_attrs.has(lower_name))
109
+ )
110
+ attrs_to_remove.push(attr_name)
111
+ }
112
+
113
+ for (const attr_name of attrs_to_remove) {
114
+ geometry.deleteAttribute(attr_name)
115
+ }
116
+ }
117
+
118
+ // Generate MTL (Wavefront Material) content from scene materials
119
+ export function generate_mtl_content(scene: Scene): string {
120
+ const lines: string[] = [`# MTL file generated by MatterViz`, ``]
121
+ const processed_materials = new Set<string>()
122
+
123
+ scene.traverse((object) => {
124
+ if (!(object instanceof Mesh)) return
125
+
126
+ const materials = Array.isArray(object.material) ? object.material : [object.material]
127
+ for (const mat of materials) {
128
+ // Skip if already processed or no name
129
+ const mat_name = mat.name || `default_material`
130
+ if (processed_materials.has(mat_name)) continue
131
+ processed_materials.add(mat_name)
132
+
133
+ lines.push(`newmtl ${mat_name}`)
134
+
135
+ // Get diffuse color (main color)
136
+ if (has_color_property(mat)) {
137
+ const color = mat.color
138
+ lines.push(`Kd ${color.r.toFixed(6)} ${color.g.toFixed(6)} ${color.b.toFixed(6)}`)
139
+ // Ambient is typically a fraction of diffuse
140
+ lines.push(
141
+ `Ka ${(color.r * 0.2).toFixed(6)} ${(color.g * 0.2).toFixed(6)} ${(
142
+ color.b * 0.2
143
+ ).toFixed(6)}`,
144
+ )
145
+ } else {
146
+ // Default white if no color
147
+ lines.push(`Kd 1.000000 1.000000 1.000000`)
148
+ lines.push(`Ka 0.200000 0.200000 0.200000`)
149
+ }
150
+
151
+ // Specular properties
152
+ lines.push(`Ks 0.500000 0.500000 0.500000`)
153
+ lines.push(`Ns 96.078431`) // Specular exponent
154
+
155
+ // Transparency (d = 1.0 is fully opaque)
156
+ const opacity = `opacity` in mat && typeof mat.opacity === `number` ? mat.opacity : 1.0
157
+ lines.push(`d ${opacity.toFixed(6)}`)
158
+
159
+ // Illumination model (2 = highlight on)
160
+ lines.push(`illum 2`)
161
+ lines.push(``)
162
+ }
163
+ })
164
+
165
+ return lines.join(`\n`)
166
+ }
167
+
168
+ // Extract color from material, returning RGB values or null if not found
169
+ function extract_material_color(mat: Material): { r: number; g: number; b: number } | null {
170
+ if (has_color_property(mat)) {
171
+ return { r: mat.color.r, g: mat.color.g, b: mat.color.b }
172
+ }
173
+ return null
174
+ }
175
+
176
+ // Helper function to convert InstancedMesh to regular Mesh objects for export
177
+ // This is necessary because GLB/OBJ exporters don't handle InstancedMesh properly
178
+ // Note: Threlte's InstancedMesh sets isInstancedMesh=true but type remains "Mesh"
179
+ // Type guard for InstancedMesh (Three.js uses isInstancedMesh property, not exposed in Object3D type)
180
+ const is_instanced_mesh = (obj: Object3D): obj is InstancedMesh =>
181
+ (obj as InstancedMesh).isInstancedMesh || obj.type === `InstancedMesh`
182
+
183
+ function convert_instanced_meshes_to_regular(scene: Scene): Scene {
184
+ // STEP 1: Collect material colors from ORIGINAL scene BEFORE cloning
185
+ // This is crucial because scene.clone() may not properly preserve Threlte's material colors
186
+ const material_colors = new Map<string, { r: number; g: number; b: number }>()
187
+ const bond_colors_map = new Map<string, Map<number, Color>>()
188
+
189
+ scene.traverse((object) => {
190
+ const is_instanced = is_instanced_mesh(object)
191
+ if (!is_instanced) return
192
+
193
+ const instanced_mesh = object
194
+ const mesh_id = instanced_mesh.uuid
195
+
196
+ // Check if this is a shader material (bonds)
197
+ const mat = instanced_mesh.material
198
+ const is_shader = Array.isArray(mat)
199
+ ? mat.some((material) => material instanceof ShaderMaterial)
200
+ : mat instanceof ShaderMaterial
201
+
202
+ if (is_shader) {
203
+ // Extract bond colors for each instance from geometry attributes
204
+ const instance_colors = new Map<number, Color>()
205
+ for (let idx = 0; idx < instanced_mesh.count; idx++) {
206
+ const bond_color = extract_bond_color_for_instance(instanced_mesh.geometry, idx)
207
+ if (bond_color) {
208
+ instance_colors.set(idx, bond_color)
209
+ }
210
+ }
211
+ bond_colors_map.set(mesh_id, instance_colors)
212
+ } else {
213
+ // Extract shared material color for atoms
214
+ const single_mat = Array.isArray(mat) ? mat[0] : mat
215
+ const color = extract_material_color(single_mat)
216
+ if (color) {
217
+ material_colors.set(mesh_id, color)
218
+ }
219
+ }
220
+ })
221
+
222
+ // STEP 2: Clone the scene
223
+ const cloned_scene = scene.clone()
224
+
225
+ // STEP 3: Find all InstancedMesh objects in the cloned scene and build uuid mapping
226
+ const original_meshes: InstancedMesh[] = []
227
+ const cloned_meshes: InstancedMesh[] = []
228
+
229
+ scene.traverse((object) => {
230
+ if (is_instanced_mesh(object)) original_meshes.push(object)
231
+ })
232
+
233
+ cloned_scene.traverse((object) => {
234
+ if (is_instanced_mesh(object)) cloned_meshes.push(object)
235
+ })
236
+
237
+ // STEP 4: Convert each InstancedMesh to individual Mesh objects
238
+ for (let mesh_idx = 0; mesh_idx < cloned_meshes.length; mesh_idx++) {
239
+ const instanced_mesh = cloned_meshes[mesh_idx]
240
+ const original_mesh = original_meshes[mesh_idx]
241
+ const original_uuid = original_mesh?.uuid || instanced_mesh.uuid
242
+
243
+ const parent = instanced_mesh.parent
244
+ if (!parent || !instanced_mesh.instanceMatrix) continue
245
+
246
+ // Create a group to hold all the individual meshes
247
+ const group = new Group()
248
+ group.name = instanced_mesh.name
249
+
250
+ // Get the base transform from the InstancedMesh
251
+ const base_matrix = new Matrix4()
252
+ base_matrix.copy(instanced_mesh.matrix)
253
+
254
+ // Get stored colors for this mesh
255
+ const stored_color = material_colors.get(original_uuid)
256
+ const stored_bond_colors = bond_colors_map.get(original_uuid)
257
+
258
+ // Check if material is a ShaderMaterial
259
+ const original_material = instanced_mesh.material
260
+ const has_shader = Array.isArray(original_material)
261
+ ? original_material.some((mat) => mat instanceof ShaderMaterial)
262
+ : original_material instanceof ShaderMaterial
263
+
264
+ // Create individual meshes for each instance
265
+ const instance_matrix = new Matrix4()
266
+ for (let idx = 0; idx < instanced_mesh.count; idx++) {
267
+ instanced_mesh.getMatrixAt(idx, instance_matrix)
268
+
269
+ // Clone geometry
270
+ const cloned_geometry = instanced_mesh.geometry.clone()
271
+
272
+ // Clean up custom attributes from shader-based geometries
273
+ if (has_shader) {
274
+ clean_geometry_for_export(cloned_geometry)
275
+ }
276
+
277
+ // Create material - always create fresh MeshStandardMaterial for reliability
278
+ const new_material = new MeshStandardMaterial({
279
+ metalness: 0.1,
280
+ roughness: 0.5,
281
+ })
282
+ new_material.name = `material_${mesh_idx}_${idx}`
283
+
284
+ // Apply the correct color
285
+ const bond_color = stored_bond_colors?.get(idx)
286
+ if (bond_color) {
287
+ // Bond with gradient color - use stored midpoint color
288
+ new_material.color.copy(bond_color)
289
+ } else if (stored_color) {
290
+ // Atom with shared material color
291
+ new_material.color.setRGB(stored_color.r, stored_color.g, stored_color.b)
292
+ } else if (instanced_mesh.instanceColor) {
293
+ // Fallback: per-instance colors from instanceColor attribute
294
+ const color_r = instanced_mesh.instanceColor.getX(idx)
295
+ const color_g = instanced_mesh.instanceColor.getY(idx)
296
+ const color_b = instanced_mesh.instanceColor.getZ(idx)
297
+ new_material.color.setRGB(color_r, color_g, color_b)
298
+ }
299
+ // If no color found, material stays default white
300
+
301
+ const mesh = new Mesh(cloned_geometry, new_material)
302
+
303
+ // Combine base transform with instance transform
304
+ const combined_matrix = new Matrix4()
305
+ combined_matrix.multiplyMatrices(base_matrix, instance_matrix)
306
+ mesh.applyMatrix4(combined_matrix)
307
+
308
+ group.add(mesh)
309
+ }
310
+
311
+ // Replace the InstancedMesh with the Group in the parent
312
+ parent.remove(instanced_mesh)
313
+ parent.add(group)
314
+
315
+ // Update world matrices after scene graph modification
316
+ group.updateMatrixWorld(true)
317
+ }
318
+
319
+ // Update all world matrices in the modified scene
320
+ cloned_scene.updateMatrixWorld(true)
321
+
322
+ // Convert any remaining ShaderMaterials to standard materials (e.g. non-instanced bonds)
323
+ // Also clean up custom geometry attributes that cause export validation errors
324
+ cloned_scene.traverse((object) => {
325
+ if (object instanceof Mesh) {
326
+ let has_shader_material = false
327
+ if (object.material instanceof ShaderMaterial) {
328
+ object.material = convert_shader_to_standard(object.material)
329
+ has_shader_material = true
330
+ } else if (Array.isArray(object.material)) {
331
+ has_shader_material = object.material.some((mat) => mat instanceof ShaderMaterial)
332
+ object.material = object.material.map((mat) =>
333
+ mat instanceof ShaderMaterial ? convert_shader_to_standard(mat) : mat,
334
+ )
335
+ }
336
+ // Clean up custom attributes from geometries that had shader materials
337
+ if (has_shader_material && object.geometry) {
338
+ clean_geometry_for_export(object.geometry)
339
+ }
340
+ }
341
+ })
342
+
343
+ return cloned_scene
344
+ }
345
+
346
+ // Generate a filename for structure exports based on structure metadata
347
+ // Sanitize string for use in filenames by removing problematic characters.
348
+ const sanitize_filename_part = (text: string): string =>
349
+ text
350
+ .replace(/<\/?[^>]+>/g, ``) // strip HTML tags
351
+ .replace(/[/\\:*?"<>|]/g, `_`) // replace filesystem-invalid chars
352
+ .replace(/_+/g, `_`) // condense consecutive underscores
353
+ .replace(/^_|_$/g, ``) // remove leading/trailing underscores
354
+
355
+ export function create_structure_filename(
356
+ structure: AnyStructure | undefined,
357
+ extension: string,
358
+ ): string {
359
+ if (!structure) return `structure.${extension}`
360
+
361
+ const parts: string[] = []
362
+ // Helper to sanitize and push non-empty parts
363
+ const safe_push = (value: string | undefined) => {
364
+ const sanitized = value ? sanitize_filename_part(value) : ``
365
+ if (sanitized) parts.push(sanitized)
366
+ }
367
+ safe_push(structure.id)
368
+
369
+ // Add formula (plain text to avoid HTML in filenames)
370
+ const formula = get_electro_neg_formula(structure, true)
371
+ if (formula && formula !== `Unknown`) {
372
+ safe_push(formula.replaceAll(` `, ``))
373
+ }
374
+
375
+ // Add space group if available
376
+ if (
377
+ `symmetry` in structure &&
378
+ structure.symmetry &&
379
+ typeof structure.symmetry === `object` &&
380
+ `space_group_symbol` in structure.symmetry
381
+ ) {
382
+ const space_group = structure.symmetry.space_group_symbol
383
+ if (space_group && typeof space_group === `string`) {
384
+ safe_push(space_group.replaceAll(` `, ``))
385
+ }
386
+ }
387
+
388
+ // Add lattice system if available
389
+ if (
390
+ `lattice` in structure &&
391
+ structure.lattice &&
392
+ typeof structure.lattice === `object` &&
393
+ `lattice_system` in structure.lattice
394
+ ) {
395
+ const lattice_system = structure.lattice.lattice_system
396
+ if (lattice_system && typeof lattice_system === `string`) {
397
+ safe_push(lattice_system)
398
+ }
399
+ }
400
+
401
+ // Add number of sites
402
+ if (structure.sites?.length) parts.push(`${structure.sites.length}sites`)
403
+
404
+ const base_name = parts.length > 0 ? parts.join(`-`) : `structure`
405
+ return `${base_name}.${extension}`
406
+ }
407
+
408
+ // Generate XYZ content string without saving
409
+ export function structure_to_xyz_str(structure?: AnyStructure): string {
410
+ if (!structure?.sites) throw new Error(`No structure or sites to export`)
411
+
412
+ const lines: string[] = []
413
+
414
+ // First line: number of atoms
415
+ lines.push(String(structure.sites.length))
416
+
417
+ // Second line: comment (structure ID, formula, or default)
418
+ const comment_parts: string[] = []
419
+ if (structure.id) comment_parts.push(structure.id)
420
+ const formula = get_electro_neg_formula(structure, true)
421
+ if (formula && formula !== `Unknown`) comment_parts.push(formula)
422
+
423
+ // Include extended XYZ lattice information when available so round-trips preserve lattice
424
+ if (`lattice` in structure && structure.lattice?.matrix?.length === 3) {
425
+ const lattice_values = structure.lattice.matrix
426
+ .flat()
427
+ .map((value: number) => (Number.isFinite(value) ? value : 0).toFixed(8))
428
+ .join(` `)
429
+ comment_parts.push(`Lattice="${lattice_values}"`)
430
+ }
431
+
432
+ const comment =
433
+ comment_parts.length > 0 ? comment_parts.join(` `) : `Generated from structure`
434
+ lines.push(comment)
435
+
436
+ // Cache converter for fractional→Cartesian (if lattice available)
437
+ const frac_to_cart =
438
+ `lattice` in structure && structure.lattice?.matrix?.length === 3
439
+ ? math.create_frac_to_cart(structure.lattice.matrix)
440
+ : null
441
+
442
+ // Atom lines: element symbol followed by x, y, z coordinates
443
+ for (const site of structure.sites) {
444
+ // Extract element symbol from species
445
+ let element_symbol = `X` // default fallback
446
+ if (site.species && Array.isArray(site.species) && site.species.length > 0) {
447
+ // species is an array of Species objects with element property
448
+ const first_species = site.species[0]
449
+ if (first_species && `element` in first_species && first_species.element)
450
+ element_symbol = first_species.element
451
+ }
452
+
453
+ // Get coordinates - prefer xyz; fallback to abc (converted to cartesian if lattice available)
454
+ let coords: number[]
455
+ if (site.xyz && Array.isArray(site.xyz) && site.xyz.length >= 3) {
456
+ coords = site.xyz.slice(0, 3)
457
+ } else if (site.abc?.length >= 3 && frac_to_cart) {
458
+ coords = frac_to_cart(site.abc)
459
+ } else coords = [0, 0, 0] // fallback
460
+
461
+ // Format coordinates to reasonable precision
462
+ const [x, y, z] = coords.map((coord) => coord.toFixed(6))
463
+ lines.push(`${element_symbol} ${x} ${y} ${z}`)
464
+ }
465
+
466
+ return lines.join(`\n`)
467
+ }
468
+
469
+ // Generate a valid CIF data block name from structure formula
470
+ // CIF block names can contain alphanumerics, underscores, but no spaces or special chars
471
+ function get_cif_block_name(structure: AnyStructure): string {
472
+ try {
473
+ // Count atoms per element (rounded to nearest integer for occupancy)
474
+ const element_counts: Record<string, number> = {}
475
+ for (const site of structure.sites) {
476
+ if (!site.species || !Array.isArray(site.species)) continue
477
+ for (const species of site.species) {
478
+ if (!species.element) continue
479
+ const count = species.occu ?? 1
480
+ element_counts[species.element] = (element_counts[species.element] ?? 0) + count
481
+ }
482
+ }
483
+
484
+ // Sort elements alphabetically and build formula string
485
+ const elements = Object.keys(element_counts).sort()
486
+ if (elements.length === 0) throw new Error(`No elements found`)
487
+
488
+ const formula = elements
489
+ .map((el) => {
490
+ const count = Math.round(element_counts[el])
491
+ if (count === 0) return null // filter out near-zero occupancies
492
+ return count === 1 ? el : `${el}${count}`
493
+ })
494
+ .filter((part): part is string => part !== null)
495
+ .join(``)
496
+
497
+ if (!formula) throw new Error(`All occupancies round to zero`)
498
+ return formula
499
+ } catch {
500
+ // Fall back to structure.id (sanitized) or generic name
501
+ if (structure.id) {
502
+ // Remove invalid CIF characters (keep alphanumerics and underscores)
503
+ // and condense consecutive underscores for cleaner block names
504
+ return structure.id.replace(/[^a-zA-Z0-9_]/g, `_`).replace(/_+/g, `_`)
505
+ }
506
+ return `structure`
507
+ }
508
+ }
509
+
510
+ // Generate CIF content string without saving
511
+ export function structure_to_cif_str(structure?: AnyStructure): string {
512
+ if (!structure?.sites) throw new Error(`No structure or sites to export`)
513
+ if (!(`lattice` in structure) || !structure.lattice) {
514
+ throw new Error(`No lattice information for CIF export`)
515
+ }
516
+
517
+ const lines: string[] = []
518
+
519
+ // CIF header with data block (required by pymatgen and CIF spec)
520
+ lines.push(`# CIF file generated by MatterViz`)
521
+ const block_name = get_cif_block_name(structure)
522
+ lines.push(`data_${block_name}`)
523
+ lines.push(``)
524
+
525
+ // Cell parameters
526
+ const lattice = structure.lattice
527
+ if (lattice.a && lattice.b && lattice.c) {
528
+ lines.push(`_cell_length_a ${lattice.a.toFixed(6)}`)
529
+ lines.push(`_cell_length_b ${lattice.b.toFixed(6)}`)
530
+ lines.push(`_cell_length_c ${lattice.c.toFixed(6)}`)
531
+ }
532
+ if (lattice.alpha && lattice.beta && lattice.gamma) {
533
+ lines.push(`_cell_angle_alpha ${lattice.alpha.toFixed(6)}`)
534
+ lines.push(`_cell_angle_beta ${lattice.beta.toFixed(6)}`)
535
+ lines.push(`_cell_angle_gamma ${lattice.gamma.toFixed(6)}`)
536
+ }
537
+
538
+ // Space group information
539
+ if (
540
+ `symmetry` in structure &&
541
+ structure.symmetry &&
542
+ typeof structure.symmetry === `object`
543
+ ) {
544
+ const symmetry = structure.symmetry as Record<string, unknown>
545
+ const { space_group_number, space_group_symbol } = symmetry
546
+ if (typeof space_group_symbol === `string` && space_group_symbol) {
547
+ lines.push(`_space_group_name_H-M_alt ${space_group_symbol}`)
548
+ }
549
+ if (
550
+ (typeof space_group_number === `number` || typeof space_group_number === `string`) &&
551
+ space_group_number
552
+ ) {
553
+ lines.push(`_space_group_IT_number ${space_group_number}`)
554
+ }
555
+ }
556
+
557
+ lines.push(``)
558
+
559
+ // Atom site loop header
560
+ lines.push(`loop_`)
561
+ lines.push(`_atom_site_label`)
562
+ lines.push(`_atom_site_type_symbol`)
563
+ lines.push(`_atom_site_fract_x`)
564
+ lines.push(`_atom_site_fract_y`)
565
+ lines.push(`_atom_site_fract_z`)
566
+ lines.push(`_atom_site_occupancy`)
567
+
568
+ // Cache inverse transpose for Cartesian→fractional conversion (avoids recomputing per site)
569
+ const cart_to_frac =
570
+ lattice.matrix?.length === 3 ? math.create_cart_to_frac(lattice.matrix) : null
571
+
572
+ // Atom sites
573
+ for (let idx = 0; idx < structure.sites.length; idx++) {
574
+ const site = structure.sites[idx]
575
+ if (!site) continue // Skip if site is undefined
576
+
577
+ // Extract element symbol from species
578
+ let element_symbol = `X` // default fallback
579
+ let occupancy = 1
580
+ if (site.species && Array.isArray(site.species) && site.species.length > 0) {
581
+ const first_species = site.species[0]
582
+ if (first_species && `element` in first_species && first_species.element) {
583
+ element_symbol = first_species.element
584
+ occupancy = first_species?.occu ?? 1
585
+ }
586
+ }
587
+
588
+ // Get fractional coordinates
589
+ let frac_coords: number[]
590
+ if (site.abc && Array.isArray(site.abc) && site.abc.length >= 3) {
591
+ frac_coords = site.abc.slice(0, 3)
592
+ } else if (site.xyz?.length >= 3 && cart_to_frac) {
593
+ frac_coords = cart_to_frac(site.xyz)
594
+ } else throw new Error(`No valid coordinates found for site ${idx}`)
595
+
596
+ // Format: label element_symbol x y z
597
+ const label = site.label || `${element_symbol}${idx + 1}`
598
+ lines.push(
599
+ `${label} ${element_symbol} ${frac_coords[0].toFixed(8)} ${frac_coords[1].toFixed(
600
+ 8,
601
+ )} ${frac_coords[2].toFixed(8)} ${occupancy.toFixed(8)}`,
602
+ )
603
+ }
604
+
605
+ return lines.join(`\n`)
606
+ }
607
+
608
+ // Generate VASP POSCAR content string without saving
609
+ export function structure_to_poscar_str(structure?: AnyStructure): string {
610
+ if (!structure?.sites) throw new Error(`No structure or sites to export`)
611
+ if (!(`lattice` in structure) || !structure.lattice) {
612
+ throw new Error(`No lattice information for POSCAR export`)
613
+ }
614
+ const lines: string[] = []
615
+
616
+ // Use plain text formula for POSCAR title to avoid HTML tags
617
+ const formula = get_electro_neg_formula(structure, true)
618
+ const title =
619
+ structure.id ||
620
+ (formula && formula !== `Unknown` ? formula : null) ||
621
+ `Generated from structure`
622
+ lines.push(title)
623
+ lines.push(`1.0`) // Scale factor (1.0 for direct coordinates)
624
+
625
+ const lattice = structure.lattice
626
+ if (lattice.matrix && Array.isArray(lattice.matrix) && lattice.matrix.length >= 3) {
627
+ // Convert 3x3 matrix to 3 vectors
628
+ const matrix = lattice.matrix
629
+ lines.push(
630
+ `${matrix[0][0].toFixed(8)} ${matrix[0][1].toFixed(8)} ${matrix[0][2].toFixed(8)}`,
631
+ )
632
+ lines.push(
633
+ `${matrix[1][0].toFixed(8)} ${matrix[1][1].toFixed(8)} ${matrix[1][2].toFixed(8)}`,
634
+ )
635
+ lines.push(
636
+ `${matrix[2][0].toFixed(8)} ${matrix[2][1].toFixed(8)} ${matrix[2][2].toFixed(8)}`,
637
+ )
638
+ } else {
639
+ throw new Error(`No valid lattice matrix for POSCAR export`)
640
+ }
641
+
642
+ // Count atoms by element
643
+ const element_counts = new Map<string, number>()
644
+ const element_symbols: string[] = []
645
+
646
+ for (const site of structure.sites) {
647
+ let element_symbol = `X` // default fallback
648
+ if (site.species && Array.isArray(site.species) && site.species.length > 0) {
649
+ const first_species = site.species[0]
650
+ if (first_species && `element` in first_species && first_species.element) {
651
+ element_symbol = first_species.element
652
+ }
653
+ }
654
+
655
+ if (!element_counts.has(element_symbol)) {
656
+ element_counts.set(element_symbol, 0)
657
+ element_symbols.push(element_symbol)
658
+ }
659
+ element_counts.set(element_symbol, Number(element_counts.get(element_symbol)) + 1)
660
+ }
661
+
662
+ // Element symbols line
663
+ lines.push(element_symbols.join(` `))
664
+
665
+ // Atom counts line
666
+ lines.push(element_symbols.map((el) => element_counts.get(el)).join(` `))
667
+
668
+ // Check if any site has selective dynamics
669
+ const has_selective_dynamics = structure.sites.some(
670
+ (site) => site.properties?.selective_dynamics,
671
+ )
672
+ if (has_selective_dynamics) {
673
+ lines.push(`Selective dynamics`)
674
+ }
675
+
676
+ // Coordinate mode (Direct = fractional coordinates)
677
+ lines.push(`Direct`)
678
+
679
+ // Cache inverse transpose for Cartesian→fractional conversion (avoids recomputing per site)
680
+ const cart_to_frac =
681
+ lattice.matrix?.length === 3 ? math.create_cart_to_frac(lattice.matrix) : null
682
+
683
+ // Atom coordinates grouped by element
684
+ for (const element_symbol of element_symbols) {
685
+ for (const site of structure.sites) {
686
+ let site_element = `X`
687
+ if (site.species && Array.isArray(site.species) && site.species.length > 0) {
688
+ const first_species = site.species[0]
689
+ if (first_species && `element` in first_species && first_species.element) {
690
+ site_element = first_species.element
691
+ }
692
+ }
693
+
694
+ if (site_element === element_symbol) {
695
+ // Get fractional coordinates
696
+ let frac_coords: number[]
697
+ if (site.abc && Array.isArray(site.abc) && site.abc.length >= 3) {
698
+ frac_coords = site.abc.slice(0, 3)
699
+ } else if (site.xyz?.length >= 3 && cart_to_frac) {
700
+ frac_coords = cart_to_frac(site.xyz.slice(0, 3) as Vec3)
701
+ } else {
702
+ throw new Error(`No valid coordinates found for site`)
703
+ }
704
+
705
+ let selective_dynamics_str = ``
706
+ if (has_selective_dynamics) {
707
+ const sel_dyn = (site.properties?.selective_dynamics ?? [
708
+ true,
709
+ true,
710
+ true,
711
+ ]) as boolean[]
712
+ selective_dynamics_str = ` ${sel_dyn[0] ? `T` : `F`} ${
713
+ sel_dyn[1] ? `T` : `F`
714
+ } ${sel_dyn[2] ? `T` : `F`}`
715
+ }
716
+
717
+ lines.push(
718
+ `${frac_coords[0].toFixed(8)} ${frac_coords[1].toFixed(8)} ${frac_coords[2].toFixed(
719
+ 8,
720
+ )}${selective_dynamics_str}`,
721
+ )
722
+ }
723
+ }
724
+ }
725
+
726
+ return lines.join(`\n`)
727
+ }
728
+
729
+ // Generate JSON content string without saving
730
+ export function structure_to_json_str(structure?: AnyStructure): string {
731
+ if (!structure) throw new Error(`No structure to export`)
732
+ return JSON.stringify(structure, null, 2)
733
+ }
734
+
735
+ // Export structure as CIF format
736
+ export function export_structure_as_cif(structure?: AnyStructure): void {
737
+ try {
738
+ const content = structure_to_cif_str(structure)
739
+ const filename = create_structure_filename(structure, `cif`)
740
+ download(content, filename, `chemical/x-cif`)
741
+ } catch (error) {
742
+ console.error(`Failed to export CIF:`, error)
743
+ }
744
+ }
745
+
746
+ // Export structure as VASP POSCAR format
747
+ export function export_structure_as_poscar(structure?: AnyStructure): void {
748
+ try {
749
+ const content = structure_to_poscar_str(structure)
750
+ const filename = create_structure_filename(structure, `poscar`)
751
+ download(content, filename, `text/plain`)
752
+ } catch (error) {
753
+ console.error(`Failed to export POSCAR:`, error)
754
+ }
755
+ }
756
+
757
+ // Export structure as XYZ format. Format specification:
758
+ // - Line 1: Number of atoms
759
+ // - Line 2: Comment line (structure ID, formula, etc.)
760
+ // - Remaining lines: Element symbol followed by x, y, z coordinates (in Angstrom)
761
+ export function export_structure_as_xyz(structure?: AnyStructure): void {
762
+ try {
763
+ const xyz_content = structure_to_xyz_str(structure)
764
+ const filename = create_structure_filename(structure, `xyz`)
765
+ download(xyz_content, filename, `text/plain`)
766
+ } catch (error) {
767
+ console.error(`Error exporting XYZ:`, error)
768
+ }
769
+ }
770
+
771
+ // Export structure in pymatgen JSON format
772
+ export function export_structure_as_json(structure?: AnyStructure): void {
773
+ try {
774
+ const data = structure_to_json_str(structure)
775
+ const filename = create_structure_filename(structure, `json`)
776
+ download(data, filename, `application/json`)
777
+ } catch (error) {
778
+ console.error(`Error exporting JSON:`, error)
779
+ }
780
+ }
781
+
782
+ // Export Three.js scene as GLB (binary GLTF) file
783
+ // GLB preserves materials and colors, making it ideal for element visualization
784
+ export function export_structure_as_glb(
785
+ scene: Scene | null,
786
+ structure: AnyStructure | undefined,
787
+ ): void {
788
+ try {
789
+ if (!scene) {
790
+ console.warn(`No scene available for GLB export`)
791
+ return
792
+ }
793
+
794
+ // Convert instanced meshes to regular meshes for export
795
+ const export_scene = convert_instanced_meshes_to_regular(scene)
796
+
797
+ const exporter = new GLTFExporter()
798
+ const filename = create_structure_filename(structure, `glb`)
799
+
800
+ // Export as binary GLB format
801
+ exporter.parse(
802
+ export_scene,
803
+ (result) => {
804
+ if (result instanceof ArrayBuffer) {
805
+ const blob = new Blob([result], { type: `model/gltf-binary` })
806
+ download(blob, filename, `model/gltf-binary`)
807
+ } else {
808
+ console.error(`GLB export returned unexpected format`)
809
+ }
810
+ },
811
+ (error) => {
812
+ console.error(`GLB export failed:`, error)
813
+ },
814
+ { binary: true },
815
+ )
816
+ } catch (error) {
817
+ console.error(`Error exporting GLB:`, error)
818
+ }
819
+ }
820
+
821
+ // Export Three.js scene as OBJ (Wavefront Object) file with accompanying MTL file for materials
822
+ // OBJ exports geometry with material references, MTL contains color definitions
823
+ export function export_structure_as_obj(
824
+ scene: Scene | null,
825
+ structure: AnyStructure | undefined,
826
+ ): void {
827
+ try {
828
+ if (!scene) {
829
+ console.warn(`No scene available for OBJ export`)
830
+ return
831
+ }
832
+
833
+ // Convert instanced meshes to regular meshes for export
834
+ const export_scene = convert_instanced_meshes_to_regular(scene)
835
+
836
+ const obj_exporter = new OBJExporter()
837
+
838
+ const base_filename = create_structure_filename(structure, ``).replace(/\.$/, ``)
839
+ const obj_filename = `${base_filename}.obj`
840
+ const mtl_filename = `${base_filename}.mtl`
841
+
842
+ // Generate OBJ content with material library reference
843
+ let obj_content = obj_exporter.parse(export_scene)
844
+ // Add material library reference at the beginning of the OBJ file
845
+ obj_content = `mtllib ${mtl_filename}\n${obj_content}`
846
+
847
+ // Generate MTL content with material color definitions
848
+ const mtl_content = generate_mtl_content(export_scene)
849
+
850
+ // Download both files
851
+ const obj_blob = new Blob([obj_content], { type: `text/plain` })
852
+ const mtl_blob = new Blob([mtl_content], { type: `text/plain` })
853
+
854
+ download(obj_blob, obj_filename, `text/plain`)
855
+ // Small delay to prevent some browsers from blocking rapid successive downloads as potential abuse.
856
+ // A more robust solution might be to zip both files together.
857
+ setTimeout(() => download(mtl_blob, mtl_filename, `text/plain`), 100)
858
+ } catch (error) {
859
+ console.error(`Error exporting OBJ:`, error)
860
+ }
861
+ }