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
@@ -1,1023 +0,0 @@
1
- // Helper utilities for band structure and DOS data processing
2
- import { SUBSCRIPT_MAP } from '../labels';
3
- import { centered_frac, euclidean_dist } from '../math';
4
- // Check if range is a valid [min, max] tuple (strict 2-element array of finite numbers)
5
- export const is_valid_range = (range) => Array.isArray(range) &&
6
- range.length === 2 &&
7
- Number.isFinite(range[0]) &&
8
- Number.isFinite(range[1]);
9
- // Check if two ranges are approximately equal (within tolerance)
10
- // Returns false if either range is invalid (null, undefined, or fails is_valid_range)
11
- // Negative tol is clamped to 0; tol=0 checks exact equality
12
- export const ranges_equal = (a, b, tol = 0.001) => {
13
- const safe_tol = Math.max(0, tol);
14
- return (is_valid_range(a) &&
15
- is_valid_range(b) &&
16
- Math.abs(a[0] - b[0]) <= safe_tol &&
17
- Math.abs(a[1] - b[1]) <= safe_tol);
18
- };
19
- // Detect which plot triggered a zoom change and return the new synced range.
20
- // Returns null to reset to shared range, undefined for no change, or Vec2 for new zoom.
21
- export function detect_zoom_change(bands_range, dos_range, shared_range, current_synced, dos_enabled = true) {
22
- const bands_valid = is_valid_range(bands_range);
23
- const dos_valid = dos_enabled && is_valid_range(dos_range);
24
- // Reset if either becomes invalid (auto-range reset) or returns to shared range
25
- if (current_synced !== null) {
26
- const bands_at_shared = bands_valid && ranges_equal(bands_range, shared_range);
27
- const dos_at_shared = dos_valid && ranges_equal(dos_range, shared_range);
28
- if (bands_at_shared || dos_at_shared || !bands_valid || (dos_enabled && !dos_valid)) {
29
- return null;
30
- }
31
- }
32
- // Check for new zoom from either plot
33
- const bands_is_new = bands_valid &&
34
- !ranges_equal(bands_range, shared_range) &&
35
- !ranges_equal(bands_range, current_synced);
36
- const dos_is_new = dos_valid &&
37
- !ranges_equal(dos_range, shared_range) &&
38
- !ranges_equal(dos_range, current_synced);
39
- if (bands_is_new && !dos_is_new)
40
- return bands_range;
41
- if (dos_is_new && !bands_is_new)
42
- return dos_range;
43
- return undefined; // no change
44
- }
45
- // Physical constants for unit conversions (SI units)
46
- const PLANCK = 6.62607015e-34; // J⋅s
47
- const EV_TO_J = 1.602176634e-19; // J
48
- const C_LIGHT = 299792458; // m/s
49
- const THz_TO_HZ = 1e12;
50
- const THz_TO_EV = (PLANCK * THz_TO_HZ) / EV_TO_J;
51
- const THz_TO_MEV = THz_TO_EV * 1000;
52
- const THz_TO_HA = THz_TO_EV / 27.211386245988; // Hartree
53
- const THz_TO_CM = THz_TO_HZ / (C_LIGHT * 100); // cm^-1 (c in cm/s)
54
- // Band structure constants
55
- export const IMAGINARY_MODE_NOISE_THRESHOLD = 0.005; // Clamp negatives < 0.5% as noise
56
- // Convert symmetry point symbols to pretty-printed versions.
57
- // Handles Greek letters (both plain and LaTeX backslash-prefixed) and subscripts.
58
- export function pretty_sym_point(symbol) {
59
- if (!symbol)
60
- return ``;
61
- // Remove underscores (htmlify maps S0 → S<sub>0</sub> but leaves S_0 as is)
62
- // Replace common symmetry point names with Greek letters
63
- // Handle both plain names (GAMMA) and LaTeX notation (\Gamma) from pymatgen
64
- // Handle subscripts: convert S0 to S₀, K1 to K₁, Γ1 to Γ₁, etc.
65
- // Use \p{L} to match any Unicode letter (not just ASCII A-Z)
66
- return symbol
67
- .replace(/_/g, ``)
68
- .replace(/\\?GAMMA/gi, `Γ`)
69
- .replace(/\\?DELTA/gi, `Δ`)
70
- .replace(/\\?SIGMA/gi, `Σ`)
71
- .replace(/\\?LAMBDA/gi, `Λ`)
72
- .replace(/(\p{L})(\d+)/gu, (_, letter, num) => letter +
73
- num
74
- .split(``)
75
- .map((digit) => SUBSCRIPT_MAP[digit] ?? digit)
76
- .join(``));
77
- }
78
- // Create segment key from start and end labels
79
- export const get_segment_key = (start_label, end_label) => `${start_label ?? `null`}_${end_label ?? `null`}`;
80
- // Get ordered segment keys from a band structure, preserving physical path order.
81
- export const get_ordered_segments = (band_struct, segments) => {
82
- if (!band_struct)
83
- return Array.from(segments);
84
- const ordered = band_struct.branches.map((br) => get_segment_key(band_struct.qpoints[br.start_index]?.label ?? undefined, band_struct.qpoints[br.end_index]?.label ?? undefined));
85
- const remaining = Array.from(segments).filter((seg) => !ordered.includes(seg));
86
- return [...ordered, ...remaining];
87
- };
88
- // Scale segment distances to a target x-axis range [x_start, x_end].
89
- // Used by both band line series and fat band ribbons for consistent x-axis positioning.
90
- export function scale_segment_distances(segment_distances, x_start, x_end) {
91
- if (segment_distances.length === 0)
92
- return [];
93
- const dist_min = segment_distances[0];
94
- const dist_range = (segment_distances.at(-1) ?? dist_min) - dist_min;
95
- if (dist_range === 0) {
96
- // All points at same distance - place at midpoint
97
- return segment_distances.map(() => (x_start + x_end) / 2);
98
- }
99
- return segment_distances.map((dist) => x_start + ((dist - dist_min) / dist_range) * (x_end - x_start));
100
- }
101
- // Get ribbon config for a specific band structure label.
102
- // Supports both single global config (with primitive keys like opacity, max_width, scale, color)
103
- // and per-structure config (keyed by structure label).
104
- // Distinguishes between a global config and a per-structure config by checking if any
105
- // primitive-typed keys (opacity, max_width, scale, color) exist at the top level.
106
- export function get_ribbon_config(ribbon_config, label) {
107
- const defaults = { opacity: 0.3, max_width: 6, scale: 1 };
108
- // Check for primitive config values (not objects) to distinguish single vs per-structure config
109
- const cfg = ribbon_config;
110
- const has_primitive = [`opacity`, `max_width`, `scale`, `color`].some((key) => cfg[key] !== undefined && typeof cfg[key] !== `object`);
111
- if (has_primitive) {
112
- // Single global config with primitive values - apply to all structures
113
- return { ...defaults, ...ribbon_config };
114
- }
115
- // Otherwise, treat as Record<string, RibbonConfig> and look up by label
116
- // Empty label skips lookup and uses defaults only
117
- const per_struct = ribbon_config;
118
- return { ...defaults, ...(label ? per_struct[label] : {}) };
119
- }
120
- // Extract tick positions and labels for a band structure plot.
121
- export function get_band_xaxis_ticks(band_struct, branches = []) {
122
- const ticks_x_pos = [];
123
- const tick_labels = [];
124
- let prev_label = band_struct.qpoints[0]?.label || null;
125
- let prev_branch = band_struct.branches[0]?.name || null;
126
- // Convert branches to Set for consistent handling
127
- const branches_set = Array.isArray(branches) ? new Set(branches) : branches;
128
- for (let idx = 0; idx < band_struct.qpoints.length; idx++) {
129
- const point = band_struct.qpoints[idx];
130
- if (point.label === null)
131
- continue;
132
- // Find which branch this point belongs to
133
- const branch_names = band_struct.branches
134
- .filter((branch) => branch.start_index <= idx && idx <= branch.end_index)
135
- .map((b) => b.name);
136
- const this_branch = branch_names[0] || null;
137
- if (point.label !== prev_label && prev_branch !== this_branch) {
138
- // Branch transition - combine labels
139
- tick_labels[tick_labels.length - 1] = `${prev_label || ``}|${point.label}`;
140
- ticks_x_pos[ticks_x_pos.length - 1] = band_struct.distance[idx];
141
- }
142
- else if (branches_set.size === 0 || (this_branch && branches_set.has(this_branch))) {
143
- tick_labels.push(point.label);
144
- ticks_x_pos.push(band_struct.distance[idx]);
145
- }
146
- prev_label = point.label;
147
- prev_branch = this_branch;
148
- }
149
- return [ticks_x_pos, tick_labels.map(pretty_sym_point)];
150
- }
151
- // Convert frequencies from THz to specified units.
152
- export function convert_frequencies(frequencies, unit = `THz`) {
153
- const conversion_factors = {
154
- THz: 1,
155
- eV: THz_TO_EV,
156
- meV: THz_TO_MEV,
157
- Ha: THz_TO_HA,
158
- 'cm-1': THz_TO_CM,
159
- };
160
- const factor = conversion_factors[unit];
161
- if (!factor) {
162
- const valid_units = Object.keys(conversion_factors).join(`, `);
163
- throw new Error(`Invalid unit: ${unit}. Must be one of ${valid_units}`);
164
- }
165
- return frequencies.map((freq) => freq * factor);
166
- }
167
- // Normalize DOS densities according to specified mode.
168
- export function normalize_densities(densities, freqs_or_energies, mode) {
169
- if (!mode)
170
- return densities;
171
- const normalized = [...densities];
172
- if (mode === `max`) {
173
- const max_val = Math.max(...normalized);
174
- if (max_val === 0)
175
- return normalized;
176
- return normalized.map((dens) => dens / max_val);
177
- }
178
- else if (mode === `sum`) {
179
- const sum = normalized.reduce((acc, d) => acc + d, 0);
180
- if (sum === 0)
181
- return normalized;
182
- return normalized.map((dens) => dens / sum);
183
- }
184
- else if (mode === `integral`) {
185
- if (freqs_or_energies.length < 2)
186
- return normalized;
187
- const bin_width = freqs_or_energies[1] - freqs_or_energies[0];
188
- if (bin_width === 0)
189
- return normalized;
190
- const sum = normalized.reduce((acc, d) => acc + d, 0);
191
- if (sum === 0)
192
- return normalized;
193
- return normalized.map((dens) => dens / (sum * bin_width));
194
- }
195
- return normalized;
196
- }
197
- // Simple LRU cache for Gaussian smearing results
198
- // Key: hash of (frequencies, densities, sigma), Value: smeared densities
199
- const SMEARING_CACHE_MAX_SIZE = 10;
200
- const smearing_cache = new Map();
201
- // FNV-1a hash for number arrays (fast, good distribution, O(n))
202
- function fnv1a_hash(arr) {
203
- let hash = 2166136261; // FNV offset basis
204
- for (const val of arr) {
205
- // Convert float to int32 bits for consistent hashing
206
- const bits = new Float64Array([val]);
207
- const int_view = new Uint32Array(bits.buffer);
208
- hash ^= int_view[0];
209
- hash = Math.imul(hash, 16777619); // FNV prime
210
- hash ^= int_view[1];
211
- hash = Math.imul(hash, 16777619);
212
- }
213
- return hash >>> 0; // Ensure unsigned
214
- }
215
- // Generate cache key using FNV-1a hash over full arrays (O(n), low collision risk)
216
- function generate_smearing_cache_key(freqs_or_energies, densities, sigma) {
217
- const len = freqs_or_energies.length;
218
- if (len === 0)
219
- return `0:${sigma.toFixed(6)}:0:0`;
220
- return `${len}:${sigma.toFixed(6)}:${fnv1a_hash(freqs_or_energies).toString(16)}:${fnv1a_hash(densities).toString(16)}`;
221
- }
222
- // Core Gaussian smearing computation (unmemoized)
223
- function apply_gaussian_smearing_core(freqs_or_energies, densities, sigma) {
224
- const orig_sum = densities.reduce((acc, d) => acc + d, 0);
225
- if (sigma <= 0 || orig_sum === 0)
226
- return densities;
227
- const smeared = Array(densities.length).fill(0);
228
- const truncation_width = 4; // Truncate Gaussian at ±4σ (contribution < 0.01%)
229
- for (let idx = 0; idx < freqs_or_energies.length; idx++) {
230
- const energy = freqs_or_energies[idx];
231
- const cutoff = truncation_width * sigma;
232
- for (let jdx = 0; jdx < freqs_or_energies.length; jdx++) {
233
- const e_j = freqs_or_energies[jdx];
234
- const delta = Math.abs(energy - e_j);
235
- // Skip points beyond truncation width
236
- if (delta > cutoff)
237
- continue;
238
- const gaussian = Math.exp(-((energy - e_j) ** 2) / (2 * sigma ** 2));
239
- smeared[idx] += densities[jdx] * gaussian;
240
- }
241
- }
242
- // Normalize to preserve integral
243
- const smeared_sum = smeared.reduce((acc, d) => acc + d, 0);
244
- if (smeared_sum === 0)
245
- return densities;
246
- const normalization = orig_sum / smeared_sum;
247
- return smeared.map((dens) => dens * normalization);
248
- }
249
- // Apply Gaussian smearing to DOS densities with memoization.
250
- // Uses truncated Gaussian (±4σ) for O(n·w) complexity instead of O(n²).
251
- // Results are cached using an LRU cache to avoid recomputation on reactive updates.
252
- export function apply_gaussian_smearing(freqs_or_energies, densities, sigma) {
253
- // Fast path: no smearing needed
254
- if (sigma <= 0)
255
- return densities;
256
- const cache_key = generate_smearing_cache_key(freqs_or_energies, densities, sigma);
257
- // Check cache
258
- const cached = smearing_cache.get(cache_key);
259
- if (cached) {
260
- // Move to end (LRU behavior: most recently used last)
261
- smearing_cache.delete(cache_key);
262
- smearing_cache.set(cache_key, cached);
263
- return cached;
264
- }
265
- // Compute and cache
266
- const result = apply_gaussian_smearing_core(freqs_or_energies, densities, sigma);
267
- // Evict oldest entry if cache is full (LRU: first entry is oldest)
268
- if (smearing_cache.size >= SMEARING_CACHE_MAX_SIZE) {
269
- const oldest_key = smearing_cache.keys().next().value;
270
- if (oldest_key !== undefined)
271
- smearing_cache.delete(oldest_key);
272
- }
273
- smearing_cache.set(cache_key, result);
274
- return result;
275
- }
276
- // Clear the smearing cache (useful for testing or memory management)
277
- export function clear_smearing_cache() {
278
- smearing_cache.clear();
279
- }
280
- // Type guards for pymatgen qpoint formats
281
- const is_vec3 = (val) => Array.isArray(val) && val.length >= 3 && val.slice(0, 3).every(Number.isFinite);
282
- const is_kpoint = (val) => !!val &&
283
- typeof val === `object` &&
284
- `frac_coords` in val &&
285
- is_vec3(val.frac_coords);
286
- const is_pymatgen_format = (obj) => {
287
- // Check for explicit pymatgen markers
288
- if (typeof obj[`@class`] === `string` || typeof obj[`@module`] === `string`) {
289
- return true;
290
- }
291
- // Check for pymatgen-style qpoints (phonon) or kpoints (electronic) without branches
292
- const points = obj.qpoints ?? obj.kpoints;
293
- if (Array.isArray(points) && points.length > 0 && !Array.isArray(obj.branches)) {
294
- return is_vec3(points[0]) || is_kpoint(points[0]);
295
- }
296
- return false;
297
- };
298
- // Extract frac_coords/label from pymatgen qpoint, matching label from labels_dict if needed
299
- const parse_qpoint = (qpt, labels_dict) => {
300
- const frac_coords = is_vec3(qpt)
301
- ? [qpt[0], qpt[1], qpt[2]]
302
- : is_kpoint(qpt)
303
- ? qpt.frac_coords
304
- : null;
305
- if (!frac_coords)
306
- return null;
307
- const label = (is_kpoint(qpt) && typeof qpt.label === `string` && qpt.label) ||
308
- Object.entries(labels_dict ?? {}).find(([, c]) => euclidean_dist(frac_coords, c) < 1e-4)?.[0] ||
309
- null;
310
- return { label, frac_coords };
311
- };
312
- // Inverse conversion factors (derived from THz_TO_* for consistency)
313
- const EV_TO_THZ = 1 / THz_TO_EV;
314
- const CM_TO_THZ = 1 / THz_TO_CM;
315
- // Spin key constants for pymatgen spin-polarized data
316
- const SPIN_UP_KEYS = [`1`, `Spin.up`];
317
- const SPIN_DOWN_KEYS = [`-1`, `Spin.down`];
318
- // Extract both spin channels from pymatgen spin-keyed data.
319
- // Returns { up: T, down: T | null } where down is null for non-spin-polarized data.
320
- export function extract_spin_channels(data) {
321
- if (Array.isArray(data))
322
- return { up: data, down: null };
323
- if (data && typeof data === `object`) {
324
- const record = data;
325
- let spin_up = null;
326
- let spin_down = null;
327
- // Extract spin-up channel
328
- for (const key of SPIN_UP_KEYS) {
329
- if (key in record) {
330
- spin_up = record[key];
331
- break;
332
- }
333
- }
334
- // Extract spin-down channel
335
- for (const key of SPIN_DOWN_KEYS) {
336
- if (key in record) {
337
- spin_down = record[key];
338
- break;
339
- }
340
- }
341
- // Fall back to first key if no spin-up key found
342
- if (spin_up === null) {
343
- const keys = Object.keys(record);
344
- if (keys.length > 0)
345
- spin_up = record[keys[0]];
346
- }
347
- if (spin_up === null)
348
- return null;
349
- return { up: spin_up, down: spin_down };
350
- }
351
- return null;
352
- }
353
- // Convert pymatgen PhononBandStructureSymmLine or BandStructure to matterviz format
354
- function convert_pymatgen_band_structure(pmg) {
355
- // Support both qpoints (phonon) and kpoints (electronic)
356
- const raw_qpts = (pmg.qpoints ?? pmg.kpoints);
357
- // Handle bands in multiple formats:
358
- // 1. Standard pymatgen: bands as dict with spin keys {1: [[...], ...]}
359
- // 2. Custom phonon format: frequencies_cm as 2D array [[...], ...]
360
- // 3. Already normalized: bands as 2D array [[...], ...]
361
- const spin_channels = extract_spin_channels(pmg.bands);
362
- let raw_bands = spin_channels?.up ?? null;
363
- let raw_spin_down_bands = spin_channels?.down ?? null;
364
- const has_frequencies_cm = Array.isArray(pmg.frequencies_cm);
365
- if (!raw_bands && has_frequencies_cm) {
366
- // Phonon format: frequencies_cm is [n_qpoints x n_branches] - needs transpose
367
- const freqs = pmg.frequencies_cm;
368
- if (freqs.length > 0 && Array.isArray(freqs[0])) {
369
- // Transpose: [n_qpoints x n_branches] -> [n_branches x n_qpoints]
370
- raw_bands = Array.from({ length: freqs[0].length }, (_, band_idx) => freqs.map((qpt_freqs) => qpt_freqs[band_idx]));
371
- raw_spin_down_bands = null;
372
- }
373
- }
374
- const labels_dict = pmg.labels_dict;
375
- const lattice_rec = pmg.lattice_rec;
376
- // Determine unit: cm-1 if frequencies_cm present, else check explicit unit or default to THz
377
- const unit = pmg.unit?.toLowerCase() ?? (has_frequencies_cm ? `cm-1` : `thz`);
378
- if (!Array.isArray(raw_qpts) ||
379
- !Array.isArray(raw_bands) ||
380
- !raw_qpts.length ||
381
- !raw_bands.length)
382
- return null;
383
- const qpoints = raw_qpts
384
- .map((q) => parse_qpoint(q, labels_dict))
385
- .filter((q) => q !== null);
386
- if (!qpoints.length)
387
- return null;
388
- // Step distances and discontinuity detection (5x median threshold)
389
- const steps = qpoints
390
- .slice(1)
391
- .map((q, idx) => euclidean_dist(qpoints[idx].frac_coords, q.frac_coords));
392
- const sorted = steps.slice().sort((a, b) => a - b);
393
- const threshold = (sorted[Math.floor(sorted.length / 2)] ?? 0) * 5;
394
- const disc_set = new Set(steps.map((s, idx) => (s > threshold ? idx + 1 : -1)).filter((i) => i >= 0));
395
- // Cumulative distance (skip discontinuities)
396
- const distance = steps.reduce((acc, step, idx) => [...acc, disc_set.has(idx + 1) ? acc[idx] : acc[idx] + step], [0]);
397
- // Use pymatgen's branches if available - they correctly handle discontinuities
398
- // Otherwise, infer branches from discontinuities (robust fallback covering all qpoints)
399
- const pmg_branches = pmg.branches;
400
- let branches = [];
401
- if (Array.isArray(pmg_branches) && pmg_branches.length > 0) {
402
- // Validate and use pymatgen branches directly
403
- branches = pmg_branches.filter((br) => typeof br.start_index === `number` &&
404
- typeof br.end_index === `number` &&
405
- br.start_index >= 0 &&
406
- br.end_index < qpoints.length &&
407
- br.start_index <= br.end_index);
408
- }
409
- // Fallback: infer branches from discontinuities when none provided or all invalid
410
- if (branches.length === 0) {
411
- console.warn(`Band structure missing 'branches' field - inferring from path discontinuities`);
412
- // Discontinuity indices mark points where the path jumps (disc before that index)
413
- // Create continuous segments between discontinuities
414
- const disc_indices = [...disc_set].sort((a, b) => a - b);
415
- // Segment boundaries: [0, first_disc), [first_disc, second_disc), ..., [last_disc, end]
416
- const segment_starts = [0, ...disc_indices];
417
- const segment_ends = [...disc_indices.map((idx) => idx - 1), qpoints.length - 1];
418
- branches = segment_starts
419
- .map((start, idx) => {
420
- const end = segment_ends[idx];
421
- const start_label = qpoints[start]?.label ?? `?`;
422
- const end_label = qpoints[end]?.label ?? `?`;
423
- return {
424
- start_index: start,
425
- end_index: end,
426
- name: `${start_label}-${end_label}`,
427
- };
428
- })
429
- .filter((br) => br.start_index <= br.end_index);
430
- }
431
- if (!branches.length) {
432
- branches.push({ start_index: 0, end_index: qpoints.length - 1, name: `path` });
433
- }
434
- // Convert bands to THz based on input unit
435
- const convert_to_thz = (val) => {
436
- if (unit === `ev`)
437
- return val * EV_TO_THZ;
438
- if (unit === `cm-1`)
439
- return val * CM_TO_THZ;
440
- return val; // THz (default) - no conversion
441
- };
442
- const converted_bands = raw_bands.map((band) => band.map(convert_to_thz));
443
- const valid_spin_down_bands = Array.isArray(raw_spin_down_bands) &&
444
- raw_spin_down_bands.length === raw_bands.length &&
445
- raw_spin_down_bands.every((band, band_idx) => Array.isArray(band) && band.length === raw_bands[band_idx]?.length)
446
- ? raw_spin_down_bands
447
- : null;
448
- const converted_spin_down_bands = valid_spin_down_bands?.map((band) => band.map(convert_to_thz));
449
- return {
450
- qpoints,
451
- branches,
452
- distance,
453
- bands: converted_bands,
454
- spin_down_bands: converted_spin_down_bands,
455
- nb_bands: raw_bands.length,
456
- labels_dict: labels_dict ?? {},
457
- recip_lattice: {
458
- matrix: lattice_rec?.matrix ?? [
459
- [1, 0, 0],
460
- [0, 1, 0],
461
- [0, 0, 1],
462
- ],
463
- },
464
- };
465
- }
466
- export function normalize_band_structure(bs) {
467
- if (!bs || typeof bs !== `object`)
468
- return null;
469
- const band_struct = bs;
470
- // Check if this is pymatgen format and convert if so
471
- if (is_pymatgen_format(band_struct)) {
472
- return convert_pymatgen_band_structure(band_struct);
473
- }
474
- // Standard matterviz format validation
475
- const { qpoints, branches, bands, distance } = band_struct;
476
- if (!Array.isArray(qpoints) ||
477
- !Array.isArray(branches) ||
478
- !Array.isArray(bands) ||
479
- !Array.isArray(distance))
480
- return null;
481
- // Validate array lengths and branch indices
482
- const n_qpts = qpoints.length;
483
- if (distance.length !== n_qpts ||
484
- bands.some((band) => !Array.isArray(band) || band.length !== n_qpts) ||
485
- branches.some((br) => typeof br.start_index !== `number` ||
486
- typeof br.end_index !== `number` ||
487
- br.start_index < 0 ||
488
- br.end_index >= n_qpts ||
489
- br.start_index > br.end_index))
490
- return null;
491
- return band_struct;
492
- }
493
- // Validate and normalize a DOS object.
494
- // Supports both matterviz and pymatgen formats.
495
- // Also auto-detects and converts cm⁻¹ to THz for legacy data (disable with auto_convert_units: false).
496
- export function normalize_dos(dos, options = {}) {
497
- const { auto_convert_units = true } = options;
498
- if (!dos || typeof dos !== `object`)
499
- return null;
500
- const dos_obj = dos;
501
- // Check for pymatgen format (has @class or @module)
502
- const is_pymatgen = typeof dos_obj[`@class`] === `string` || typeof dos_obj[`@module`] === `string`;
503
- const { frequencies, energies, spin_polarized } = dos_obj;
504
- // Handle densities as either array or dict with spin keys (pymatgen format)
505
- // Pymatgen stores densities as {1: [...], -1: [...]} or {"Spin.up": [...], ...}
506
- const spin_channels = extract_spin_channels(dos_obj.densities);
507
- if (!spin_channels)
508
- return null;
509
- const densities = spin_channels.up;
510
- // Use extracted spin-down or fallback to explicit field (for already-normalized DosData)
511
- const spin_down_densities = spin_channels.down ?? dos_obj.spin_down_densities ?? null;
512
- if (!Array.isArray(densities))
513
- return null;
514
- // Phonon DOS: has frequencies
515
- if (Array.isArray(frequencies)) {
516
- if (frequencies.length !== densities.length)
517
- return null;
518
- // Auto-detect if frequencies are in cm⁻¹ instead of THz (unless disabled)
519
- // Typical phonon frequencies are < 50 THz for most materials
520
- // If max frequency > 100, it's almost certainly in cm⁻¹
521
- const max_freq = Math.max(...frequencies);
522
- let final_frequencies = frequencies;
523
- if (auto_convert_units && max_freq > 100) {
524
- // Likely in cm⁻¹, convert to THz
525
- final_frequencies = frequencies.map((f) => f * CM_TO_THZ);
526
- console.warn(`Phonon DOS frequencies appear to be in cm⁻¹ (max: ${max_freq.toFixed(1)}). ` +
527
- `Converting to THz (max: ${(max_freq * CM_TO_THZ).toFixed(1)} THz).`);
528
- }
529
- return { type: `phonon`, frequencies: final_frequencies, densities };
530
- }
531
- // Electronic DOS: has energies
532
- if (Array.isArray(energies)) {
533
- if (energies.length !== densities.length)
534
- return null;
535
- // Detect spin-polarized from data if not explicitly set
536
- const is_spin_polarized = spin_polarized ??
537
- (spin_down_densities !== null && spin_down_densities.length === densities.length);
538
- return {
539
- type: `electronic`,
540
- energies,
541
- densities,
542
- spin_down_densities: is_spin_polarized ? (spin_down_densities ?? undefined) : undefined,
543
- spin_polarized: is_spin_polarized,
544
- };
545
- }
546
- // For pymatgen format, log a helpful message if format wasn't recognized
547
- if (is_pymatgen) {
548
- console.warn(`Pymatgen DOS format detected but missing required fields. ` +
549
- `Expected 'frequencies' (phonon) or 'energies' (electronic) arrays.`);
550
- }
551
- return null;
552
- }
553
- // Extract k-path points from band structure and convert to reciprocal space coordinates
554
- // Accepts a reciprocal lattice matrix (should include 2π factor for consistency with BZ)
555
- // Handles both matterviz format (qpoints as objects) and normalized pymatgen format
556
- // Optionally wraps fractional coordinates to first BZ (default: true)
557
- export function extract_k_path_points(band_struct, recip_lattice_matrix, options = {}) {
558
- const { wrap_to_bz = true } = options;
559
- if (!band_struct?.qpoints || !recip_lattice_matrix)
560
- return [];
561
- if (recip_lattice_matrix.length !== 3 ||
562
- recip_lattice_matrix.some((row) => row?.length !== 3))
563
- throw new Error(`reciprocal_lattice_matrix must be a 3×3 matrix`);
564
- const [[m00, m01, m02], [m10, m11, m12], [m20, m21, m22]] = recip_lattice_matrix;
565
- return band_struct.qpoints.map((qpoint) => {
566
- let [x, y, z] = qpoint.frac_coords;
567
- // Wrap to first BZ if enabled (handles [0,1] vs [-0.5,0.5] convention difference)
568
- if (wrap_to_bz) {
569
- x = centered_frac(x);
570
- y = centered_frac(y);
571
- z = centered_frac(z);
572
- }
573
- const kx = x * m00 + y * m10 + z * m20;
574
- const ky = x * m01 + y * m11 + z * m21;
575
- const kz = x * m02 + y * m12 + z * m22;
576
- return [kx, ky, kz];
577
- });
578
- }
579
- // Find the q-point index closest to a given distance along the band structure path
580
- export function find_qpoint_at_distance(band_struct, target) {
581
- const { distance } = band_struct;
582
- if (!distance?.length)
583
- return null;
584
- return distance.reduce((closest, dist, idx) => Math.abs(dist - target) < Math.abs(distance[closest] - target) ? idx : closest, 0);
585
- }
586
- // Find q-point index from rescaled x-coordinate (used in band structure plots)
587
- // This handles the case where the plot uses custom x-axis scaling per segment
588
- export function find_qpoint_at_rescaled_x(band_struct, rescaled_x, x_positions) {
589
- if (!band_struct?.branches?.length || !x_positions)
590
- return null;
591
- // Find which segment contains this x coordinate
592
- for (const branch of band_struct.branches) {
593
- const start_idx = branch.start_index;
594
- const end_idx = branch.end_index;
595
- const start_label = band_struct.qpoints[start_idx]?.label ?? undefined;
596
- const end_label = band_struct.qpoints[end_idx]?.label ?? undefined;
597
- const segment_key = get_segment_key(start_label, end_label);
598
- const segment_range = x_positions[segment_key];
599
- if (!segment_range)
600
- continue;
601
- const [x_start, x_end] = segment_range;
602
- // Check if discontinuity (zero-length segment)
603
- const is_discontinuity = Math.abs(x_end - x_start) < 1e-6;
604
- if (is_discontinuity) {
605
- // For discontinuities, check if x is exactly at this point
606
- if (Math.abs(rescaled_x - x_start) < 1e-6) {
607
- return start_idx;
608
- }
609
- continue;
610
- }
611
- // Check if x is within this segment (with small tolerance for edges)
612
- if (rescaled_x >= x_start - 1e-6 && rescaled_x <= x_end + 1e-6) {
613
- // Map from rescaled x back to original distance
614
- const segment_distances = band_struct.distance.slice(start_idx, end_idx + 1);
615
- const dist_min = segment_distances[0];
616
- const dist_max = segment_distances.at(-1) ?? dist_min;
617
- const dist_range = dist_max - dist_min;
618
- // Handle zero-length segments
619
- if (dist_range === 0) {
620
- return start_idx;
621
- }
622
- // Inverse of the scaling: x = x_start + ((dist - dist_min) / dist_range) * (x_end - x_start)
623
- // Solving for dist: dist = dist_min + ((x - x_start) / (x_end - x_start)) * dist_range
624
- const normalized_x = (rescaled_x - x_start) / (x_end - x_start);
625
- const target_dist = dist_min + normalized_x * dist_range;
626
- // Find closest qpoint in this branch to the target distance
627
- let closest_idx = start_idx;
628
- let min_diff = Math.abs(band_struct.distance[start_idx] - target_dist);
629
- for (let idx = start_idx; idx <= end_idx; idx++) {
630
- const diff = Math.abs(band_struct.distance[idx] - target_dist);
631
- if (diff < min_diff) {
632
- min_diff = diff;
633
- closest_idx = idx;
634
- }
635
- }
636
- return closest_idx;
637
- }
638
- }
639
- // Fallback: find closest labeled point
640
- let closest_idx = 0;
641
- let min_dist = Infinity;
642
- for (const branch of band_struct.branches) {
643
- const start_idx = branch.start_index;
644
- const end_idx = branch.end_index;
645
- const start_label = band_struct.qpoints[start_idx]?.label ?? undefined;
646
- const end_label = band_struct.qpoints[end_idx]?.label ?? undefined;
647
- const segment_key = get_segment_key(start_label, end_label);
648
- const segment_range = x_positions[segment_key];
649
- if (!segment_range)
650
- continue;
651
- const [x_start, x_end] = segment_range;
652
- for (const [x_pos, idx] of [
653
- [x_start, start_idx],
654
- [x_end, end_idx],
655
- ]) {
656
- const dist = Math.abs(rescaled_x - x_pos);
657
- if (dist < min_dist) {
658
- min_dist = dist;
659
- closest_idx = idx;
660
- }
661
- }
662
- }
663
- return closest_idx;
664
- }
665
- // Extract projected DOS from pymatgen CompleteDos format.
666
- // Returns a dict of label → DosData for each atom or orbital.
667
- // filter_keys: optional list of keys to include (e.g., ["Fe", "O"] for atoms or ["s", "p", "d"] for orbitals)
668
- export function extract_pdos(dos, pdos_type, filter_keys) {
669
- if (!dos || typeof dos !== `object`)
670
- return null;
671
- const dos_obj = dos;
672
- // Get the appropriate projected DOS dict
673
- const pdos_dict = pdos_type === `atom`
674
- ? dos_obj.atom_dos
675
- : dos_obj.spd_dos;
676
- if (!pdos_dict || typeof pdos_dict !== `object`)
677
- return null;
678
- const result = {};
679
- for (const [key, nested_dos] of Object.entries(pdos_dict)) {
680
- // Apply filter if provided
681
- if (filter_keys && filter_keys.length > 0 && !filter_keys.includes(key))
682
- continue;
683
- if (!nested_dos || typeof nested_dos !== `object`)
684
- continue;
685
- const energies = nested_dos.energies;
686
- const spin_channels = extract_spin_channels(nested_dos.densities);
687
- if (!Array.isArray(energies) || !spin_channels)
688
- continue;
689
- const densities = spin_channels.up;
690
- if (!Array.isArray(densities) || energies.length !== densities.length)
691
- continue;
692
- const is_spin_polarized = spin_channels.down !== null && spin_channels.down.length === densities.length;
693
- result[key] = {
694
- type: `electronic`,
695
- energies,
696
- densities,
697
- spin_down_densities: is_spin_polarized ? (spin_channels.down ?? undefined) : undefined,
698
- spin_polarized: is_spin_polarized,
699
- efermi: nested_dos.efermi,
700
- };
701
- }
702
- return Object.keys(result).length > 0 ? result : null;
703
- }
704
- // Shift a single DOS object's energies by the given amount
705
- const shift_dos_energies = (dos, shift) => ({
706
- ...dos,
707
- efermi: dos.efermi - shift,
708
- energies: dos.energies.map((energy) => energy - shift),
709
- });
710
- // Shift DOS energies relative to Fermi energy so E_F = 0
711
- // Recursively shifts nested DOS in atom_dos and spd_dos for consistency
712
- export function shift_to_fermi(dos) {
713
- const shift = dos.efermi;
714
- // Shift root DOS energies using the shared helper
715
- const shifted_root = shift_dos_energies(dos, shift);
716
- // Shift nested atom_dos if present
717
- const atom_dos = dos.atom_dos
718
- ? Object.fromEntries(Object.entries(dos.atom_dos).map(([key, nested_dos]) => [
719
- key,
720
- shift_dos_energies(nested_dos, shift),
721
- ]))
722
- : undefined;
723
- // Shift nested spd_dos if present
724
- const spd_dos = dos.spd_dos
725
- ? Object.fromEntries(Object.entries(dos.spd_dos).map(([key, nested_dos]) => [
726
- key,
727
- shift_dos_energies(nested_dos, shift),
728
- ]))
729
- : undefined;
730
- return {
731
- ...shifted_root,
732
- efermi: 0, // Explicitly set to 0 (shift_dos_energies would give efermi - shift)
733
- ...(atom_dos && { atom_dos }),
734
- ...(spd_dos && { spd_dos }),
735
- };
736
- }
737
- // Generate an SVG path for a fat band ribbon.
738
- // Creates a closed polygon by tracing the upper edge (y - half_width) forward,
739
- // then tracing the lower edge (y + half_width) backward.
740
- // Non-finite or non-positive widths are clamped to 0.
741
- export function generate_ribbon_path(x_values, y_values, width_values, x_scale_fn, y_scale_fn, max_width_px, scale = 1) {
742
- const len = x_values.length;
743
- if (len < 2 || len !== y_values.length || len !== width_values.length)
744
- return ``;
745
- // Normalize width values to [0, 1] range based on the max positive finite value
746
- const finite_positive_widths = width_values.filter((width) => Number.isFinite(width) && width > 0);
747
- if (finite_positive_widths.length === 0)
748
- return ``;
749
- const max_width_val = Math.max(...finite_positive_widths);
750
- // Build upper edge path (forward direction)
751
- const upper_points = [];
752
- const lower_points = [];
753
- for (let idx = 0; idx < x_values.length; idx++) {
754
- const x_px = x_scale_fn(x_values[idx]);
755
- const y_data = y_values[idx];
756
- const raw_width = width_values[idx] ?? 0;
757
- const width_normalized = Number.isFinite(raw_width) && raw_width > 0 ? raw_width / max_width_val : 0;
758
- const half_width_px = width_normalized * max_width_px * scale;
759
- // In SVG, y increases downward, so upper edge has smaller y value
760
- const y_upper_px = y_scale_fn(y_data) - half_width_px;
761
- const y_lower_px = y_scale_fn(y_data) + half_width_px;
762
- upper_points.push(`${x_px.toFixed(2)},${y_upper_px.toFixed(2)}`);
763
- lower_points.push(`${x_px.toFixed(2)},${y_lower_px.toFixed(2)}`);
764
- }
765
- // Combine: upper edge forward, lower edge backward, close path
766
- const path_parts = [
767
- `M${upper_points[0]}`,
768
- ...upper_points.slice(1).map((pt) => `L${pt}`),
769
- ...lower_points.toReversed().map((pt) => `L${pt}`),
770
- `Z`,
771
- ];
772
- return path_parts.join(` `);
773
- }
774
- // Extract efermi from a data source (band structure or DOS).
775
- // Handles both single objects with an efermi field and dicts of objects.
776
- // Returns undefined if no valid efermi is found or if the source is empty.
777
- export function extract_efermi(data) {
778
- if (!data || typeof data !== `object`)
779
- return undefined;
780
- const obj = data;
781
- // Direct efermi field on the object
782
- if (`efermi` in obj && typeof obj.efermi === `number`)
783
- return obj.efermi;
784
- // Dict of objects - try to get efermi from first value
785
- const values = Object.values(obj);
786
- if (values.length === 0)
787
- return undefined;
788
- const first_val = values[0];
789
- if (first_val && typeof first_val === `object`) {
790
- const efermi = first_val.efermi;
791
- if (typeof efermi === `number`)
792
- return efermi;
793
- }
794
- return undefined;
795
- }
796
- // Calculate fraction of |values| that are negative. Used to detect imaginary phonon modes.
797
- export function negative_fraction(values) {
798
- let [neg, total] = [0, 0];
799
- for (const val of values) {
800
- if (!Number.isFinite(val))
801
- continue;
802
- const abs_val = Math.abs(val);
803
- total += abs_val;
804
- if (val < 0)
805
- neg += abs_val;
806
- }
807
- return total > 0 ? neg / total : 0;
808
- }
809
- // Check if raw band structure input has electronic markers (efermi, kpoints, or electronic @class).
810
- // Must be called on raw input before normalization since these fields aren't preserved.
811
- function is_electronic_band_struct(bs) {
812
- if (!bs || typeof bs !== `object`)
813
- return false;
814
- const obj = bs;
815
- // Electronic band structures have efermi field
816
- if (`efermi` in obj && typeof obj.efermi === `number`)
817
- return true;
818
- // Pymatgen electronic format uses kpoints (not qpoints)
819
- if (`kpoints` in obj && Array.isArray(obj.kpoints) && obj.kpoints.length > 0) {
820
- return true;
821
- }
822
- // Pymatgen @class: BandStructure* but not Phonon*
823
- const raw_class = obj[`@class`];
824
- const py_class_name = typeof raw_class === `string` ? raw_class : ``;
825
- if (py_class_name.startsWith(`BandStructure`) && !py_class_name.includes(`Phonon`)) {
826
- return true;
827
- }
828
- return false;
829
- }
830
- // Compute frequency/energy range from bands and DOS. Clamps phonon min to 0 if noise < 0.5%.
831
- export function compute_frequency_range(band_structs, doses, padding_factor = 0.02) {
832
- let [min_val, max_val, is_phonon] = [Infinity, -Infinity, false];
833
- const all_freqs = [];
834
- // Check raw band_structs for electronic markers before normalization
835
- // (normalized structures always have qpoints, so we can't detect from them)
836
- let has_electronic_bs = false;
837
- // Support both qpoints (phonon) and kpoints (electronic) to detect single vs dict
838
- const is_single_bs = band_structs &&
839
- typeof band_structs === `object` &&
840
- (`qpoints` in band_structs || `kpoints` in band_structs);
841
- if (band_structs && typeof band_structs === `object`) {
842
- // Single structure check
843
- if (is_electronic_band_struct(band_structs)) {
844
- has_electronic_bs = true;
845
- }
846
- else if (!is_single_bs) {
847
- // Dict of band structures - check each value
848
- for (const bs_val of Object.values(band_structs)) {
849
- if (is_electronic_band_struct(bs_val)) {
850
- has_electronic_bs = true;
851
- break;
852
- }
853
- }
854
- }
855
- }
856
- const bs_list = band_structs
857
- ? is_single_bs
858
- ? [normalize_band_structure(band_structs)]
859
- : Object.values(band_structs).map(normalize_band_structure)
860
- : [];
861
- // If band structures exist and aren't electronic, mark as phonon
862
- const has_band_structs = bs_list.some(Boolean);
863
- if (has_band_structs && !has_electronic_bs)
864
- is_phonon = true;
865
- for (const bs of bs_list) {
866
- if (!bs)
867
- continue;
868
- for (const band of bs.bands) {
869
- for (const val of band) {
870
- if (!Number.isFinite(val))
871
- continue;
872
- all_freqs.push(val);
873
- min_val = Math.min(min_val, val);
874
- max_val = Math.max(max_val, val);
875
- }
876
- }
877
- }
878
- const dos_list = doses
879
- ? `densities` in doses
880
- ? [normalize_dos(doses)]
881
- : Object.values(doses).map((dos) => normalize_dos(dos))
882
- : [];
883
- for (const dos of dos_list) {
884
- if (!dos)
885
- continue;
886
- // DOS type detection: explicit type field is authoritative
887
- if (dos.type === `phonon`)
888
- is_phonon = true;
889
- if (dos.type === `electronic`)
890
- is_phonon = false;
891
- for (const val of dos.type === `phonon` ? dos.frequencies : dos.energies) {
892
- if (!Number.isFinite(val))
893
- continue;
894
- all_freqs.push(val);
895
- min_val = Math.min(min_val, val);
896
- max_val = Math.max(max_val, val);
897
- }
898
- }
899
- if (!Number.isFinite(min_val) || !Number.isFinite(max_val))
900
- return undefined;
901
- const clamp_min = is_phonon &&
902
- min_val < 0 && // clamp phonon noise to 0
903
- negative_fraction(all_freqs) < IMAGINARY_MODE_NOISE_THRESHOLD;
904
- if (clamp_min)
905
- min_val = 0;
906
- // Calculate padding from (possibly clamped) range for consistency with Bands.svelte
907
- const padding = (max_val - min_val) * padding_factor;
908
- return [min_val === 0 ? 0 : min_val - padding, max_val + padding];
909
- }
910
- // Parse axis label: "Frequency (THz)" → { name: "Frequency", unit: "THz" }
911
- function parse_axis_label(label) {
912
- const match = /^(.+?)\s*\(([^)]+)\)$/.exec(label);
913
- return match ? { name: match[1], unit: match[2] } : { name: label };
914
- }
915
- // Format DOS tooltip content from axis labels and values
916
- export function format_dos_tooltip(x_formatted, y_formatted, label, is_horizontal, is_phonon, units, x_axis_label, y_axis_label, num_series) {
917
- const x_parsed = parse_axis_label(x_axis_label);
918
- const y_parsed = parse_axis_label(y_axis_label);
919
- const freq_defaults = {
920
- name: is_phonon ? `Frequency` : `Energy`,
921
- unit: is_phonon ? units : `eV`,
922
- };
923
- const format_line = (name, value, unit) => `${name}: ${value}${unit ? ` ${unit}` : ``}`;
924
- const lines = is_horizontal
925
- ? [
926
- format_line(y_parsed.name || freq_defaults.name, y_formatted, y_parsed.unit || freq_defaults.unit),
927
- format_line(x_parsed.name || `Density`, x_formatted),
928
- ]
929
- : [
930
- format_line(y_parsed.name || `Density`, y_formatted),
931
- format_line(x_parsed.name || freq_defaults.name, x_formatted, x_parsed.unit || freq_defaults.unit),
932
- ];
933
- return { title: num_series > 1 && label ? label : undefined, lines };
934
- }
935
- // Spin mode options for DOS visualization
936
- export const SPIN_MODES = [
937
- { value: `mirror`, label: `↕`, title: `Mirror: spin-up above, spin-down below zero` },
938
- { value: `overlay`, label: `≡`, title: `Overlay: both spins on same axis` },
939
- { value: `up_only`, label: `↑`, title: `Show spin-up only` },
940
- { value: `down_only`, label: `↓`, title: `Show spin-down only` },
941
- ];
942
- // Normalization mode options
943
- export const NORMALIZATION_MODES = [
944
- { value: null, label: `None` },
945
- { value: `max`, label: `Max=1` },
946
- { value: `sum`, label: `Sum=1` },
947
- { value: `integral`, label: `∫=1` },
948
- ];
949
- // Available frequency units for phonon DOS
950
- export const FREQUENCY_UNITS = [`THz`, `eV`, `meV`, `cm-1`, `Ha`];
951
- // Default values for DOS controls
952
- export const DEFAULT_SPIN_MODE = `mirror`;
953
- export const DEFAULT_SIGMA = 0;
954
- export const DEFAULT_NORMALIZE = null;
955
- export const DEFAULT_UNITS = `THz`;
956
- // Format sigma with adaptive precision: 0→"0", <0.01→exp, <1→3dp, else→2dp
957
- export function format_sigma(val) {
958
- if (val === 0)
959
- return `0`;
960
- if (val < 0.01)
961
- return val.toExponential(1);
962
- return val.toFixed(val < 1 ? 3 : 2);
963
- }
964
- // Validate sigma_range: ensures min < max, returns [0, 1] if invalid
965
- export function validate_sigma_range([min, max]) {
966
- return Number.isFinite(min) && Number.isFinite(max) && min < max ? [min, max] : [0, 1];
967
- }
968
- // Calculate slider step: 1/100th of range, or 0.01 fallback
969
- export function calculate_sigma_step(range) {
970
- const [min, max] = validate_sigma_range(range);
971
- return (max - min) / 100 || 0.01;
972
- }
973
- // Central difference for local slope (dω/dk or dE/dk).
974
- // Uses forward/backward difference at endpoints, central difference for interior points.
975
- export function compute_slope(x_vals, y_vals, idx) {
976
- const len = Math.min(x_vals.length, y_vals.length);
977
- if (len < 2 || idx < 0 || idx >= len)
978
- return null;
979
- const lo = idx === 0 ? 0 : idx - 1;
980
- const hi = idx >= len - 1 ? len - 1 : idx + 1;
981
- const dx = x_vals[hi] - x_vals[lo];
982
- return dx ? (y_vals[hi] - y_vals[lo]) / dx : null;
983
- }
984
- // Find Gamma-point indices (q ≈ integer lattice point) in a band structure.
985
- // Returns indices of q-points whose fractional coordinates are all within 0.01 of integers.
986
- export function find_gamma_indices(bs) {
987
- const indices = [];
988
- for (let q_idx = 0; q_idx < bs.qpoints.length; q_idx++) {
989
- const coords = bs.qpoints[q_idx]?.frac_coords;
990
- if (coords?.every((coord) => Math.abs(coord - Math.round(coord)) < 0.01)) {
991
- indices.push(q_idx);
992
- }
993
- }
994
- return indices;
995
- }
996
- // Threshold below which a band's frequency at Gamma is considered acoustic (THz).
997
- // Assumes bands are stored in THz (normalize_band_structure converts to THz).
998
- export const ACOUSTIC_FREQ_THRESHOLD = 0.5;
999
- // Classify a band as acoustic based on near-zero frequency at Gamma points.
1000
- // Returns true (acoustic), false (optical), or null (no Gamma points → can't determine).
1001
- export function classify_acoustic(bs, band_idx, gamma_indices, threshold = ACOUSTIC_FREQ_THRESHOLD) {
1002
- if (gamma_indices.length === 0)
1003
- return null;
1004
- return gamma_indices.some((gamma_idx) => Math.abs(bs.bands[band_idx]?.[gamma_idx] ?? Infinity) < threshold);
1005
- }
1006
- // Build per-point metadata array for a band series in the tooltip.
1007
- export function build_point_metadata(opts) {
1008
- const { x_vals, y_vals, band_idx, spin, is_acoustic, bs, start_idx } = opts;
1009
- return x_vals.map((_, pt_idx) => {
1010
- const global_idx = start_idx + pt_idx;
1011
- const qpoint = bs.qpoints[global_idx];
1012
- return {
1013
- band_idx,
1014
- spin,
1015
- is_acoustic,
1016
- nb_bands: bs.nb_bands,
1017
- frac_coords: qpoint?.frac_coords ?? null,
1018
- qpoint_label: qpoint?.label ?? null,
1019
- band_width: bs.band_widths?.[band_idx]?.[global_idx] ?? null,
1020
- slope: compute_slope(x_vals, y_vals, pt_idx),
1021
- };
1022
- });
1023
- }