matterviz 0.3.6 → 0.4.0

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 (926) hide show
  1. package/dist/EmptyState.svelte.d.ts +9 -0
  2. package/dist/FilePicker.svelte +360 -0
  3. package/dist/FilePicker.svelte.d.ts +17 -0
  4. package/dist/Icon.svelte +44 -0
  5. package/dist/Icon.svelte.d.ts +13 -0
  6. package/dist/MillerIndexInput.svelte +66 -0
  7. package/dist/MillerIndexInput.svelte.d.ts +7 -0
  8. package/dist/api/mp.d.ts +6 -0
  9. package/dist/api/mp.js +22 -0
  10. package/dist/api/optimade.d.ts +45 -0
  11. package/dist/api/optimade.js +141 -0
  12. package/dist/app.css +244 -0
  13. package/dist/brillouin/BrillouinZone.svelte +554 -0
  14. package/dist/brillouin/BrillouinZone.svelte.d.ts +84 -0
  15. package/dist/brillouin/BrillouinZoneControls.svelte +144 -0
  16. package/dist/brillouin/BrillouinZoneControls.svelte.d.ts +17 -0
  17. package/dist/brillouin/BrillouinZoneExportPane.svelte +146 -0
  18. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +15 -0
  19. package/dist/brillouin/BrillouinZoneInfoPane.svelte +146 -0
  20. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +13 -0
  21. package/dist/brillouin/BrillouinZoneScene.svelte +522 -0
  22. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +49 -0
  23. package/dist/brillouin/BrillouinZoneTooltip.svelte +83 -0
  24. package/dist/brillouin/BrillouinZoneTooltip.svelte.d.ts +8 -0
  25. package/dist/brillouin/compute.d.ts +17 -0
  26. package/dist/brillouin/compute.js +422 -0
  27. package/dist/brillouin/index.d.ts +8 -0
  28. package/dist/brillouin/index.js +7 -0
  29. package/dist/brillouin/types.d.ts +43 -0
  30. package/dist/brillouin/types.js +1 -0
  31. package/dist/chempot-diagram/ChemPotDiagram.svelte +328 -0
  32. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +13 -0
  33. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +843 -0
  34. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +16 -0
  35. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +3191 -0
  36. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +16 -0
  37. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +7 -0
  38. package/dist/chempot-diagram/async-compute.svelte.d.ts +3 -0
  39. package/dist/chempot-diagram/async-compute.svelte.js +80 -0
  40. package/dist/chempot-diagram/chempot-worker.d.ts +1 -0
  41. package/dist/chempot-diagram/chempot-worker.js +12 -0
  42. package/dist/chempot-diagram/color.d.ts +10 -0
  43. package/dist/chempot-diagram/color.js +32 -0
  44. package/dist/chempot-diagram/compute.d.ts +48 -0
  45. package/dist/chempot-diagram/compute.js +804 -0
  46. package/dist/chempot-diagram/index.d.ts +6 -0
  47. package/dist/chempot-diagram/index.js +6 -0
  48. package/dist/chempot-diagram/pointer.d.ts +16 -0
  49. package/dist/chempot-diagram/pointer.js +40 -0
  50. package/dist/chempot-diagram/temperature.d.ts +15 -0
  51. package/dist/chempot-diagram/temperature.js +34 -0
  52. package/dist/chempot-diagram/types.d.ts +81 -0
  53. package/dist/chempot-diagram/types.js +28 -0
  54. package/dist/colors/index.d.ts +47 -0
  55. package/dist/colors/index.js +204 -0
  56. package/dist/composition/BarChart.svelte +297 -0
  57. package/dist/composition/BarChart.svelte.d.ts +39 -0
  58. package/dist/composition/BubbleChart.svelte +218 -0
  59. package/dist/composition/BubbleChart.svelte.d.ts +28 -0
  60. package/dist/composition/Composition.svelte +165 -0
  61. package/dist/composition/Composition.svelte.d.ts +15 -0
  62. package/dist/composition/Formula.svelte +268 -0
  63. package/dist/composition/Formula.svelte.d.ts +19 -0
  64. package/dist/composition/FormulaFilter.svelte +1263 -0
  65. package/dist/composition/FormulaFilter.svelte.d.ts +51 -0
  66. package/dist/composition/PieChart.svelte +324 -0
  67. package/dist/composition/PieChart.svelte.d.ts +37 -0
  68. package/dist/composition/chem-sys.d.ts +8 -0
  69. package/dist/composition/chem-sys.js +85 -0
  70. package/dist/composition/format.d.ts +15 -0
  71. package/dist/composition/format.js +111 -0
  72. package/dist/composition/index.d.ts +21 -0
  73. package/dist/composition/index.js +15 -0
  74. package/dist/composition/parse.d.ts +56 -0
  75. package/dist/composition/parse.js +486 -0
  76. package/dist/constants.d.ts +29 -0
  77. package/dist/constants.js +99 -0
  78. package/dist/controls.d.ts +14 -0
  79. package/dist/controls.js +30 -0
  80. package/dist/convex-hull/ConvexHull.svelte +157 -0
  81. package/dist/convex-hull/ConvexHull.svelte.d.ts +13 -0
  82. package/dist/convex-hull/ConvexHull2D.svelte +827 -0
  83. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +11 -0
  84. package/dist/convex-hull/ConvexHull3D.svelte +1801 -0
  85. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +8 -0
  86. package/dist/convex-hull/ConvexHull4D.svelte +1394 -0
  87. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +8 -0
  88. package/dist/convex-hull/ConvexHullControls.svelte +535 -0
  89. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +48 -0
  90. package/dist/convex-hull/ConvexHullInfoPane.svelte +125 -0
  91. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +20 -0
  92. package/dist/convex-hull/ConvexHullStats.svelte +929 -0
  93. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +17 -0
  94. package/dist/convex-hull/ConvexHullTooltip.svelte +131 -0
  95. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +33 -0
  96. package/dist/convex-hull/GasPressureControls.svelte +247 -0
  97. package/dist/convex-hull/GasPressureControls.svelte.d.ts +11 -0
  98. package/dist/convex-hull/StructurePopup.svelte +151 -0
  99. package/dist/convex-hull/StructurePopup.svelte.d.ts +18 -0
  100. package/dist/convex-hull/TemperatureSlider.svelte +140 -0
  101. package/dist/convex-hull/TemperatureSlider.svelte.d.ts +8 -0
  102. package/dist/convex-hull/barycentric-coords.d.ts +18 -0
  103. package/dist/convex-hull/barycentric-coords.js +182 -0
  104. package/dist/convex-hull/demo-temperature.d.ts +6 -0
  105. package/dist/convex-hull/demo-temperature.js +38 -0
  106. package/dist/convex-hull/gas-thermodynamics.d.ts +16 -0
  107. package/dist/convex-hull/gas-thermodynamics.js +306 -0
  108. package/dist/convex-hull/helpers.d.ts +117 -0
  109. package/dist/convex-hull/helpers.js +718 -0
  110. package/dist/convex-hull/index.d.ts +119 -0
  111. package/dist/convex-hull/index.js +58 -0
  112. package/dist/convex-hull/thermodynamics.d.ts +67 -0
  113. package/dist/convex-hull/thermodynamics.js +1757 -0
  114. package/dist/convex-hull/types.d.ts +162 -0
  115. package/dist/convex-hull/types.js +36 -0
  116. package/dist/coordination/CoordinationBarPlot.svelte +311 -0
  117. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +30 -0
  118. package/dist/coordination/calc-coordination.d.ts +15 -0
  119. package/dist/coordination/calc-coordination.js +63 -0
  120. package/dist/coordination/index.d.ts +8 -0
  121. package/dist/coordination/index.js +7 -0
  122. package/dist/effects.svelte.d.ts +12 -0
  123. package/dist/effects.svelte.js +37 -0
  124. package/dist/element/BohrAtom.svelte.d.ts +20 -0
  125. package/dist/element/ElementHeading.svelte +26 -0
  126. package/dist/element/ElementHeading.svelte.d.ts +8 -0
  127. package/dist/element/ElementPhoto.svelte +57 -0
  128. package/dist/element/ElementPhoto.svelte.d.ts +9 -0
  129. package/dist/element/ElementStats.svelte +80 -0
  130. package/dist/element/ElementStats.svelte.d.ts +8 -0
  131. package/dist/element/ElementTile.svelte +484 -0
  132. package/dist/element/ElementTile.svelte.d.ts +29 -0
  133. package/dist/element/Nucleus.svelte.d.ts +17 -0
  134. package/dist/element/data.d.ts +2 -0
  135. package/dist/element/data.js +2 -0
  136. package/dist/element/index.d.ts +8 -0
  137. package/dist/element/index.js +7 -0
  138. package/dist/element/types.d.ts +57 -0
  139. package/dist/element/types.js +1 -0
  140. package/dist/feedback/ClickFeedback.svelte +58 -0
  141. package/dist/feedback/ClickFeedback.svelte.d.ts +12 -0
  142. package/dist/feedback/DragOverlay.svelte +42 -0
  143. package/dist/feedback/DragOverlay.svelte.d.ts +7 -0
  144. package/dist/feedback/Spinner.svelte.d.ts +7 -0
  145. package/dist/feedback/StatusMessage.svelte.d.ts +9 -0
  146. package/dist/feedback/index.d.ts +4 -0
  147. package/dist/feedback/index.js +4 -0
  148. package/dist/fermi-surface/FermiSlice.svelte +197 -0
  149. package/dist/fermi-surface/FermiSlice.svelte.d.ts +24 -0
  150. package/dist/fermi-surface/FermiSurface.svelte +606 -0
  151. package/dist/fermi-surface/FermiSurface.svelte.d.ts +83 -0
  152. package/dist/fermi-surface/FermiSurfaceControls.svelte +448 -0
  153. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +35 -0
  154. package/dist/fermi-surface/FermiSurfaceScene.svelte +797 -0
  155. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +50 -0
  156. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +85 -0
  157. package/dist/fermi-surface/FermiSurfaceTooltip.svelte.d.ts +8 -0
  158. package/dist/fermi-surface/compute.d.ts +5 -0
  159. package/dist/fermi-surface/compute.js +538 -0
  160. package/dist/fermi-surface/constants.d.ts +9 -0
  161. package/dist/fermi-surface/constants.js +27 -0
  162. package/dist/fermi-surface/export.d.ts +5 -0
  163. package/dist/fermi-surface/export.js +51 -0
  164. package/dist/fermi-surface/index.d.ts +12 -0
  165. package/dist/fermi-surface/index.js +13 -0
  166. package/dist/fermi-surface/marching-cubes.d.ts +2 -0
  167. package/dist/fermi-surface/marching-cubes.js +2 -0
  168. package/dist/fermi-surface/parse.d.ts +2 -0
  169. package/dist/fermi-surface/parse.js +494 -0
  170. package/dist/fermi-surface/symmetry.d.ts +3 -0
  171. package/dist/fermi-surface/symmetry.js +46 -0
  172. package/dist/fermi-surface/types.d.ts +111 -0
  173. package/dist/fermi-surface/types.js +4 -0
  174. package/dist/heatmap-matrix/HeatmapMatrix.svelte +1547 -0
  175. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +110 -0
  176. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +225 -0
  177. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +30 -0
  178. package/dist/heatmap-matrix/index.d.ts +53 -0
  179. package/dist/heatmap-matrix/index.js +100 -0
  180. package/dist/heatmap-matrix/shared.d.ts +2 -0
  181. package/dist/heatmap-matrix/shared.js +4 -0
  182. package/dist/icons.d.ts +569 -0
  183. package/dist/icons.js +648 -0
  184. package/dist/index.d.ts +39 -0
  185. package/dist/index.js +39 -0
  186. package/dist/io/decompress.d.ts +11 -0
  187. package/dist/io/decompress.js +76 -0
  188. package/dist/io/export.d.ts +16 -0
  189. package/dist/io/export.js +338 -0
  190. package/dist/io/fetch.d.ts +5 -0
  191. package/dist/io/fetch.js +43 -0
  192. package/dist/io/file-drop.d.ts +7 -0
  193. package/dist/io/file-drop.js +42 -0
  194. package/dist/io/index.d.ts +7 -0
  195. package/dist/io/index.js +6 -0
  196. package/dist/io/is-binary.d.ts +1 -0
  197. package/dist/io/is-binary.js +20 -0
  198. package/dist/io/types.d.ts +8 -0
  199. package/dist/io/types.js +1 -0
  200. package/dist/io/url-drop.d.ts +2 -0
  201. package/dist/io/url-drop.js +154 -0
  202. package/dist/isosurface/Isosurface.svelte +285 -0
  203. package/dist/isosurface/Isosurface.svelte.d.ts +8 -0
  204. package/dist/isosurface/IsosurfaceControls.svelte +277 -0
  205. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +9 -0
  206. package/dist/isosurface/index.d.ts +5 -0
  207. package/dist/isosurface/index.js +6 -0
  208. package/dist/isosurface/parse.d.ts +6 -0
  209. package/dist/isosurface/parse.js +552 -0
  210. package/dist/isosurface/slice.d.ts +11 -0
  211. package/dist/isosurface/slice.js +141 -0
  212. package/dist/isosurface/types.d.ts +56 -0
  213. package/dist/isosurface/types.js +227 -0
  214. package/dist/keyboard.d.ts +3 -0
  215. package/dist/keyboard.js +23 -0
  216. package/dist/labels.d.ts +53 -0
  217. package/dist/labels.js +278 -0
  218. package/dist/layout/FullscreenToggle.svelte +50 -0
  219. package/dist/layout/FullscreenToggle.svelte.d.ts +7 -0
  220. package/dist/layout/InfoCard.svelte +120 -0
  221. package/dist/layout/InfoCard.svelte.d.ts +21 -0
  222. package/dist/layout/InfoTag.svelte +185 -0
  223. package/dist/layout/InfoTag.svelte.d.ts +19 -0
  224. package/dist/layout/PropertyFilter.svelte +247 -0
  225. package/dist/layout/PropertyFilter.svelte.d.ts +24 -0
  226. package/dist/layout/SettingsSection.svelte +148 -0
  227. package/dist/layout/SettingsSection.svelte.d.ts +17 -0
  228. package/dist/layout/SubpageGrid.svelte +82 -0
  229. package/dist/layout/SubpageGrid.svelte.d.ts +14 -0
  230. package/dist/layout/fullscreen.d.ts +9 -0
  231. package/dist/layout/fullscreen.js +53 -0
  232. package/dist/layout/index.d.ts +10 -0
  233. package/dist/layout/index.js +8 -0
  234. package/dist/layout/json-tree/JsonNode.svelte +548 -0
  235. package/dist/layout/json-tree/JsonNode.svelte.d.ts +11 -0
  236. package/dist/layout/json-tree/JsonTree.svelte +1230 -0
  237. package/dist/layout/json-tree/JsonTree.svelte.d.ts +6 -0
  238. package/dist/layout/json-tree/JsonValue.svelte.d.ts +9 -0
  239. package/dist/layout/json-tree/index.d.ts +3 -0
  240. package/dist/layout/json-tree/index.js +3 -0
  241. package/dist/layout/json-tree/types.d.ts +74 -0
  242. package/dist/layout/json-tree/types.js +2 -0
  243. package/dist/layout/json-tree/utils.d.ts +29 -0
  244. package/dist/layout/json-tree/utils.js +642 -0
  245. package/dist/marching-cubes.d.ts +14 -0
  246. package/dist/marching-cubes.js +535 -0
  247. package/dist/math.d.ts +105 -0
  248. package/dist/math.js +920 -0
  249. package/dist/overlays/ContextMenu.svelte +162 -0
  250. package/dist/overlays/ContextMenu.svelte.d.ts +25 -0
  251. package/dist/overlays/CopyButton.svelte +45 -0
  252. package/dist/overlays/CopyButton.svelte.d.ts +8 -0
  253. package/dist/overlays/DragControlTab.svelte +98 -0
  254. package/dist/overlays/DragControlTab.svelte.d.ts +8 -0
  255. package/dist/overlays/DraggablePane.svelte +487 -0
  256. package/dist/overlays/DraggablePane.svelte.d.ts +36 -0
  257. package/dist/overlays/InfoPaneCards.svelte +149 -0
  258. package/dist/overlays/InfoPaneCards.svelte.d.ts +22 -0
  259. package/dist/overlays/index.d.ts +3 -0
  260. package/dist/overlays/index.js +3 -0
  261. package/dist/periodic-table/PeriodicTable.svelte +480 -0
  262. package/dist/periodic-table/PeriodicTable.svelte.d.ts +55 -0
  263. package/dist/periodic-table/PeriodicTableControls.svelte +557 -0
  264. package/dist/periodic-table/PeriodicTableControls.svelte.d.ts +24 -0
  265. package/dist/periodic-table/PropertySelect.svelte +38 -0
  266. package/dist/periodic-table/PropertySelect.svelte.d.ts +13 -0
  267. package/dist/periodic-table/TableInset.svelte.d.ts +9 -0
  268. package/dist/periodic-table/index.d.ts +10 -0
  269. package/dist/periodic-table/index.js +4 -0
  270. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +1092 -0
  271. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +44 -0
  272. package/dist/phase-diagram/PhaseDiagramControls.svelte +444 -0
  273. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +30 -0
  274. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +127 -0
  275. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +15 -0
  276. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +184 -0
  277. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +19 -0
  278. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +391 -0
  279. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +16 -0
  280. package/dist/phase-diagram/TdbInfoPanel.svelte +203 -0
  281. package/dist/phase-diagram/TdbInfoPanel.svelte.d.ts +12 -0
  282. package/dist/phase-diagram/build-diagram.d.ts +11 -0
  283. package/dist/phase-diagram/build-diagram.js +160 -0
  284. package/dist/phase-diagram/colors.d.ts +35 -0
  285. package/dist/phase-diagram/colors.js +51 -0
  286. package/dist/phase-diagram/diagram-input.d.ts +29 -0
  287. package/dist/phase-diagram/diagram-input.js +3 -0
  288. package/dist/phase-diagram/index.d.ts +13 -0
  289. package/dist/phase-diagram/index.js +11 -0
  290. package/dist/phase-diagram/parse.d.ts +55 -0
  291. package/dist/phase-diagram/parse.js +273 -0
  292. package/dist/phase-diagram/svg-to-diagram.d.ts +2 -0
  293. package/dist/phase-diagram/svg-to-diagram.js +867 -0
  294. package/dist/phase-diagram/types.d.ts +93 -0
  295. package/dist/phase-diagram/types.js +1 -0
  296. package/dist/phase-diagram/utils.d.ts +118 -0
  297. package/dist/phase-diagram/utils.js +600 -0
  298. package/dist/plot/bar/BarPlot.svelte +1755 -0
  299. package/dist/plot/bar/BarPlot.svelte.d.ts +84 -0
  300. package/dist/plot/bar/BarPlotControls.svelte +67 -0
  301. package/dist/plot/bar/BarPlotControls.svelte.d.ts +18 -0
  302. package/dist/plot/bar/SpacegroupBarPlot.svelte +293 -0
  303. package/dist/plot/bar/SpacegroupBarPlot.svelte.d.ts +9 -0
  304. package/dist/plot/bar/data.d.ts +40 -0
  305. package/dist/plot/bar/data.js +154 -0
  306. package/dist/plot/bar/geometry.d.ts +39 -0
  307. package/dist/plot/bar/geometry.js +60 -0
  308. package/dist/plot/bar/index.d.ts +3 -0
  309. package/dist/plot/bar/index.js +3 -0
  310. package/dist/plot/box/BoxPlot.svelte +1462 -0
  311. package/dist/plot/box/BoxPlot.svelte.d.ts +94 -0
  312. package/dist/plot/box/BoxPlotControls.svelte +109 -0
  313. package/dist/plot/box/BoxPlotControls.svelte.d.ts +19 -0
  314. package/dist/plot/box/Violin.svelte +14 -0
  315. package/dist/plot/box/Violin.svelte.d.ts +70 -0
  316. package/dist/plot/box/box-plot.d.ts +55 -0
  317. package/dist/plot/box/box-plot.js +126 -0
  318. package/dist/plot/box/index.d.ts +5 -0
  319. package/dist/plot/box/index.js +5 -0
  320. package/dist/plot/box/kde.d.ts +16 -0
  321. package/dist/plot/box/kde.js +160 -0
  322. package/dist/plot/box/quantile.d.ts +3 -0
  323. package/dist/plot/box/quantile.js +53 -0
  324. package/dist/plot/core/auto-place.d.ts +43 -0
  325. package/dist/plot/core/auto-place.js +122 -0
  326. package/dist/plot/core/axis-utils.d.ts +46 -0
  327. package/dist/plot/core/axis-utils.js +110 -0
  328. package/dist/plot/core/components/AxisLabel.svelte +51 -0
  329. package/dist/plot/core/components/AxisLabel.svelte.d.ts +16 -0
  330. package/dist/plot/core/components/ColorBar.svelte +724 -0
  331. package/dist/plot/core/components/ColorBar.svelte.d.ts +31 -0
  332. package/dist/plot/core/components/ColorScaleSelect.svelte +55 -0
  333. package/dist/plot/core/components/ColorScaleSelect.svelte.d.ts +15 -0
  334. package/dist/plot/core/components/ControlPane.svelte +46 -0
  335. package/dist/plot/core/components/ControlPane.svelte.d.ts +13 -0
  336. package/dist/plot/core/components/FillArea.svelte +234 -0
  337. package/dist/plot/core/components/FillArea.svelte.d.ts +21 -0
  338. package/dist/plot/core/components/InteractiveAxisLabel.svelte +96 -0
  339. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +14 -0
  340. package/dist/plot/core/components/Line.svelte +101 -0
  341. package/dist/plot/core/components/Line.svelte.d.ts +15 -0
  342. package/dist/plot/core/components/PlotAxis.svelte +171 -0
  343. package/dist/plot/core/components/PlotAxis.svelte.d.ts +25 -0
  344. package/dist/plot/core/components/PlotControls.svelte +525 -0
  345. package/dist/plot/core/components/PlotControls.svelte.d.ts +4 -0
  346. package/dist/plot/core/components/PlotLegend.svelte +580 -0
  347. package/dist/plot/core/components/PlotLegend.svelte.d.ts +30 -0
  348. package/dist/plot/core/components/PlotTooltip.svelte +83 -0
  349. package/dist/plot/core/components/PlotTooltip.svelte.d.ts +25 -0
  350. package/dist/plot/core/components/PortalSelect.svelte +257 -0
  351. package/dist/plot/core/components/PortalSelect.svelte.d.ts +16 -0
  352. package/dist/plot/core/components/ReferenceLine.svelte +204 -0
  353. package/dist/plot/core/components/ReferenceLine.svelte.d.ts +20 -0
  354. package/dist/plot/core/components/ReferenceLine3D.svelte +156 -0
  355. package/dist/plot/core/components/ReferenceLine3D.svelte.d.ts +14 -0
  356. package/dist/plot/core/components/ReferencePlane.svelte +175 -0
  357. package/dist/plot/core/components/ReferencePlane.svelte.d.ts +14 -0
  358. package/dist/plot/core/components/ZeroLines.svelte +97 -0
  359. package/dist/plot/core/components/ZeroLines.svelte.d.ts +33 -0
  360. package/dist/plot/core/components/ZoomRect.svelte +23 -0
  361. package/dist/plot/core/components/ZoomRect.svelte.d.ts +8 -0
  362. package/dist/plot/core/components/index.d.ts +17 -0
  363. package/dist/plot/core/components/index.js +17 -0
  364. package/dist/plot/core/data-cleaning.d.ts +107 -0
  365. package/dist/plot/core/data-cleaning.js +853 -0
  366. package/dist/plot/core/data-transform.d.ts +16 -0
  367. package/dist/plot/core/data-transform.js +45 -0
  368. package/dist/plot/core/fill-utils.d.ts +33 -0
  369. package/dist/plot/core/fill-utils.js +388 -0
  370. package/dist/plot/core/hover-lock.svelte.d.ts +14 -0
  371. package/dist/plot/core/hover-lock.svelte.js +45 -0
  372. package/dist/plot/core/index.d.ts +10 -0
  373. package/dist/plot/core/index.js +11 -0
  374. package/dist/plot/core/interactions.d.ts +35 -0
  375. package/dist/plot/core/interactions.js +195 -0
  376. package/dist/plot/core/layout.d.ts +79 -0
  377. package/dist/plot/core/layout.js +281 -0
  378. package/dist/plot/core/reference-line.d.ts +60 -0
  379. package/dist/plot/core/reference-line.js +301 -0
  380. package/dist/plot/core/scales.d.ts +48 -0
  381. package/dist/plot/core/scales.js +480 -0
  382. package/dist/plot/core/svg.d.ts +2 -0
  383. package/dist/plot/core/svg.js +41 -0
  384. package/dist/plot/core/types.d.ts +771 -0
  385. package/dist/plot/core/types.js +99 -0
  386. package/dist/plot/core/utils/label-placement.d.ts +68 -0
  387. package/dist/plot/core/utils/label-placement.js +326 -0
  388. package/dist/plot/core/utils/series-visibility.d.ts +26 -0
  389. package/dist/plot/core/utils/series-visibility.js +112 -0
  390. package/dist/plot/core/utils.d.ts +11 -0
  391. package/dist/plot/core/utils.js +27 -0
  392. package/dist/plot/histogram/Histogram.svelte +1418 -0
  393. package/dist/plot/histogram/Histogram.svelte.d.ts +50 -0
  394. package/dist/plot/histogram/HistogramControls.svelte +212 -0
  395. package/dist/plot/histogram/HistogramControls.svelte.d.ts +22 -0
  396. package/dist/plot/histogram/index.d.ts +2 -0
  397. package/dist/plot/histogram/index.js +2 -0
  398. package/dist/plot/index.d.ts +8 -0
  399. package/dist/plot/index.js +10 -0
  400. package/dist/plot/sankey/Sankey.svelte +700 -0
  401. package/dist/plot/sankey/Sankey.svelte.d.ts +74 -0
  402. package/dist/plot/sankey/SankeyControls.svelte +98 -0
  403. package/dist/plot/sankey/SankeyControls.svelte.d.ts +19 -0
  404. package/dist/plot/sankey/index.d.ts +4 -0
  405. package/dist/plot/sankey/index.js +3 -0
  406. package/dist/plot/sankey/sankey-types.d.ts +42 -0
  407. package/dist/plot/sankey/sankey-types.js +4 -0
  408. package/dist/plot/sankey/sankey.d.ts +52 -0
  409. package/dist/plot/sankey/sankey.js +187 -0
  410. package/dist/plot/scatter/BinnedScatterPlot.svelte +1116 -0
  411. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +66 -0
  412. package/dist/plot/scatter/ElementScatter.svelte +63 -0
  413. package/dist/plot/scatter/ElementScatter.svelte.d.ts +14 -0
  414. package/dist/plot/scatter/ScatterPlot.svelte +2357 -0
  415. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +96 -0
  416. package/dist/plot/scatter/ScatterPlotControls.svelte +307 -0
  417. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +17 -0
  418. package/dist/plot/scatter/ScatterPoint.svelte +182 -0
  419. package/dist/plot/scatter/ScatterPoint.svelte.d.ts +22 -0
  420. package/dist/plot/scatter/adaptive-density.d.ts +79 -0
  421. package/dist/plot/scatter/adaptive-density.js +217 -0
  422. package/dist/plot/scatter/binned-scatter-types.d.ts +59 -0
  423. package/dist/plot/scatter/binned-scatter-types.js +1 -0
  424. package/dist/plot/scatter/index.d.ts +7 -0
  425. package/dist/plot/scatter/index.js +5 -0
  426. package/dist/plot/scatter/scatter-data.d.ts +19 -0
  427. package/dist/plot/scatter/scatter-data.js +212 -0
  428. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +531 -0
  429. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +95 -0
  430. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +438 -0
  431. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte.d.ts +20 -0
  432. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +912 -0
  433. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +74 -0
  434. package/dist/plot/scatter-3d/Surface3D.svelte +197 -0
  435. package/dist/plot/scatter-3d/Surface3D.svelte.d.ts +13 -0
  436. package/dist/plot/scatter-3d/index.d.ts +4 -0
  437. package/dist/plot/scatter-3d/index.js +4 -0
  438. package/dist/plot/sunburst/Sunburst.svelte +1045 -0
  439. package/dist/plot/sunburst/Sunburst.svelte.d.ts +96 -0
  440. package/dist/plot/sunburst/SunburstControls.svelte +200 -0
  441. package/dist/plot/sunburst/SunburstControls.svelte.d.ts +26 -0
  442. package/dist/plot/sunburst/index.d.ts +4 -0
  443. package/dist/plot/sunburst/index.js +4 -0
  444. package/dist/plot/sunburst/render.d.ts +34 -0
  445. package/dist/plot/sunburst/render.js +122 -0
  446. package/dist/plot/sunburst/sunburst.d.ts +62 -0
  447. package/dist/plot/sunburst/sunburst.js +266 -0
  448. package/dist/rdf/RdfPlot.svelte +248 -0
  449. package/dist/rdf/RdfPlot.svelte.d.ts +27 -0
  450. package/dist/rdf/calc-rdf.d.ts +4 -0
  451. package/dist/rdf/calc-rdf.js +98 -0
  452. package/dist/rdf/index.d.ts +23 -0
  453. package/dist/rdf/index.js +2 -0
  454. package/dist/sanitize.d.ts +6 -0
  455. package/dist/sanitize.js +116 -0
  456. package/dist/settings.d.ts +319 -0
  457. package/dist/settings.js +1394 -0
  458. package/dist/spectral/Bands.svelte +1050 -0
  459. package/dist/spectral/Bands.svelte.d.ts +39 -0
  460. package/dist/spectral/BandsAndDos.svelte +134 -0
  461. package/dist/spectral/BandsAndDos.svelte.d.ts +18 -0
  462. package/dist/spectral/BrillouinBandsDos.svelte +264 -0
  463. package/dist/spectral/BrillouinBandsDos.svelte.d.ts +20 -0
  464. package/dist/spectral/Dos.svelte +688 -0
  465. package/dist/spectral/Dos.svelte.d.ts +29 -0
  466. package/dist/spectral/helpers.d.ts +121 -0
  467. package/dist/spectral/helpers.js +1098 -0
  468. package/dist/spectral/index.d.ts +6 -0
  469. package/dist/spectral/index.js +6 -0
  470. package/dist/spectral/types.d.ts +84 -0
  471. package/dist/spectral/types.js +2 -0
  472. package/dist/state.svelte.d.ts +25 -0
  473. package/dist/state.svelte.js +45 -0
  474. package/dist/structure/Arrow.svelte +72 -0
  475. package/dist/structure/Arrow.svelte.d.ts +15 -0
  476. package/dist/structure/AtomLegend.svelte +814 -0
  477. package/dist/structure/AtomLegend.svelte.d.ts +35 -0
  478. package/dist/structure/Bond.svelte +140 -0
  479. package/dist/structure/Bond.svelte.d.ts +9 -0
  480. package/dist/structure/CanvasTooltip.svelte +33 -0
  481. package/dist/structure/CanvasTooltip.svelte.d.ts +12 -0
  482. package/dist/structure/CellSelect.svelte +348 -0
  483. package/dist/structure/CellSelect.svelte.d.ts +13 -0
  484. package/dist/structure/Cylinder.svelte +49 -0
  485. package/dist/structure/Cylinder.svelte.d.ts +13 -0
  486. package/dist/structure/Lattice.svelte +196 -0
  487. package/dist/structure/Lattice.svelte.d.ts +17 -0
  488. package/dist/structure/Structure.svelte +2254 -0
  489. package/dist/structure/Structure.svelte.d.ts +89 -0
  490. package/dist/structure/StructureControls.svelte +1273 -0
  491. package/dist/structure/StructureControls.svelte.d.ts +31 -0
  492. package/dist/structure/StructureExportPane.svelte +252 -0
  493. package/dist/structure/StructureExportPane.svelte.d.ts +17 -0
  494. package/dist/structure/StructureInfoPane.svelte +736 -0
  495. package/dist/structure/StructureInfoPane.svelte.d.ts +19 -0
  496. package/dist/structure/StructureScene.svelte +2256 -0
  497. package/dist/structure/StructureScene.svelte.d.ts +111 -0
  498. package/dist/structure/atom-properties.d.ts +37 -0
  499. package/dist/structure/atom-properties.js +200 -0
  500. package/dist/structure/bond-order-perception.d.ts +13 -0
  501. package/dist/structure/bond-order-perception.js +384 -0
  502. package/dist/structure/bonding.d.ts +69 -0
  503. package/dist/structure/bonding.js +724 -0
  504. package/dist/structure/export.d.ts +20 -0
  505. package/dist/structure/export.js +731 -0
  506. package/dist/structure/index.d.ts +124 -0
  507. package/dist/structure/index.js +167 -0
  508. package/dist/structure/label-placement.d.ts +14 -0
  509. package/dist/structure/label-placement.js +72 -0
  510. package/dist/structure/measure.d.ts +7 -0
  511. package/dist/structure/measure.js +30 -0
  512. package/dist/structure/parse.d.ts +66 -0
  513. package/dist/structure/parse.js +1410 -0
  514. package/dist/structure/partial-occupancy.d.ts +25 -0
  515. package/dist/structure/partial-occupancy.js +99 -0
  516. package/dist/structure/pbc.d.ts +9 -0
  517. package/dist/structure/pbc.js +127 -0
  518. package/dist/structure/supercell.d.ts +8 -0
  519. package/dist/structure/supercell.js +170 -0
  520. package/dist/structure/validation.d.ts +2 -0
  521. package/dist/structure/validation.js +10 -0
  522. package/dist/symmetry/SymmetryStats.svelte +226 -0
  523. package/dist/symmetry/SymmetryStats.svelte.d.ts +21 -0
  524. package/dist/symmetry/WyckoffTable.svelte +120 -0
  525. package/dist/symmetry/WyckoffTable.svelte.d.ts +11 -0
  526. package/dist/symmetry/cell-transform.d.ts +12 -0
  527. package/dist/symmetry/cell-transform.js +91 -0
  528. package/dist/symmetry/index.d.ts +43 -0
  529. package/dist/symmetry/index.js +226 -0
  530. package/dist/symmetry/spacegroups.d.ts +16 -0
  531. package/dist/symmetry/spacegroups.js +429 -0
  532. package/dist/table/HeatmapTable.svelte +1885 -0
  533. package/dist/table/HeatmapTable.svelte.d.ts +49 -0
  534. package/dist/table/ToggleMenu.svelte +385 -0
  535. package/dist/table/ToggleMenu.svelte.d.ts +11 -0
  536. package/dist/table/index.d.ts +72 -0
  537. package/dist/table/index.js +38 -0
  538. package/dist/theme/ThemeControl.svelte +53 -0
  539. package/dist/theme/ThemeControl.svelte.d.ts +9 -0
  540. package/dist/theme/index.d.ts +29 -0
  541. package/dist/theme/index.js +79 -0
  542. package/dist/time.d.ts +4 -0
  543. package/dist/time.js +70 -0
  544. package/dist/tooltip/KCoords.svelte +45 -0
  545. package/dist/tooltip/KCoords.svelte.d.ts +8 -0
  546. package/dist/tooltip/TooltipContent.svelte +58 -0
  547. package/dist/tooltip/TooltipContent.svelte.d.ts +31 -0
  548. package/dist/tooltip/index.d.ts +3 -0
  549. package/dist/tooltip/index.js +2 -0
  550. package/dist/tooltip/types.d.ts +8 -0
  551. package/dist/tooltip/types.js +1 -0
  552. package/dist/trajectory/Trajectory.svelte +1571 -0
  553. package/dist/trajectory/Trajectory.svelte.d.ts +78 -0
  554. package/dist/trajectory/TrajectoryError.svelte +128 -0
  555. package/dist/trajectory/TrajectoryError.svelte.d.ts +13 -0
  556. package/dist/trajectory/TrajectoryExportPane.svelte +358 -0
  557. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +17 -0
  558. package/dist/trajectory/TrajectoryInfoPane.svelte +314 -0
  559. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +17 -0
  560. package/dist/trajectory/constants.d.ts +6 -0
  561. package/dist/trajectory/constants.js +7 -0
  562. package/dist/trajectory/extract.d.ts +5 -0
  563. package/dist/trajectory/extract.js +162 -0
  564. package/dist/trajectory/format-detect.d.ts +10 -0
  565. package/dist/trajectory/format-detect.js +90 -0
  566. package/dist/trajectory/frame-reader.d.ts +17 -0
  567. package/dist/trajectory/frame-reader.js +299 -0
  568. package/dist/trajectory/helpers.d.ts +15 -0
  569. package/dist/trajectory/helpers.js +164 -0
  570. package/dist/trajectory/index.d.ts +63 -0
  571. package/dist/trajectory/index.js +126 -0
  572. package/dist/trajectory/parse/ase.d.ts +2 -0
  573. package/dist/trajectory/parse/ase.js +73 -0
  574. package/dist/trajectory/parse/hdf5.d.ts +2 -0
  575. package/dist/trajectory/parse/hdf5.js +127 -0
  576. package/dist/trajectory/parse/index.d.ts +12 -0
  577. package/dist/trajectory/parse/index.js +306 -0
  578. package/dist/trajectory/parse/lammps.d.ts +5 -0
  579. package/dist/trajectory/parse/lammps.js +179 -0
  580. package/dist/trajectory/parse/vasp.d.ts +2 -0
  581. package/dist/trajectory/parse/vasp.js +87 -0
  582. package/dist/trajectory/parse/xyz.d.ts +26 -0
  583. package/dist/trajectory/parse/xyz.js +123 -0
  584. package/dist/trajectory/plotting.d.ts +28 -0
  585. package/dist/trajectory/plotting.js +423 -0
  586. package/dist/trajectory/types.d.ts +11 -0
  587. package/dist/trajectory/types.js +1 -0
  588. package/dist/utils.d.ts +7 -0
  589. package/dist/utils.js +47 -0
  590. package/dist/xrd/XrdPlot.svelte +616 -0
  591. package/dist/xrd/XrdPlot.svelte.d.ts +28 -0
  592. package/dist/xrd/broadening.d.ts +20 -0
  593. package/dist/xrd/broadening.js +97 -0
  594. package/dist/xrd/calc-xrd.d.ts +37 -0
  595. package/dist/xrd/calc-xrd.js +339 -0
  596. package/dist/xrd/index.d.ts +37 -0
  597. package/dist/xrd/index.js +4 -0
  598. package/dist/xrd/parse.d.ts +13 -0
  599. package/dist/xrd/parse.js +749 -0
  600. package/license +1 -1
  601. package/package.json +237 -1458
  602. package/readme.md +98 -171
  603. package/.vscode/launch.json +0 -13
  604. package/.vscodeignore +0 -7
  605. package/dist/assets/STLExporter-BpTH3YHE.js +0 -8
  606. package/dist/assets/browser-DdDecX_W.js +0 -1
  607. package/dist/assets/export-qgn-H9y6.js +0 -2
  608. package/dist/assets/main-DiKYzti2.css +0 -1
  609. package/dist/assets/moyo_wasm_bg-0ocwg7xY.wasm +0 -0
  610. package/dist/extension.js +0 -31293
  611. package/dist/src/lib/FilePicker.svelte +0 -360
  612. package/dist/src/lib/Icon.svelte +0 -41
  613. package/dist/src/lib/MillerIndexInput.svelte +0 -66
  614. package/dist/src/lib/api/mp.ts +0 -26
  615. package/dist/src/lib/api/optimade.ts +0 -204
  616. package/dist/src/lib/app.css +0 -247
  617. package/dist/src/lib/brillouin/BrillouinZone.svelte +0 -549
  618. package/dist/src/lib/brillouin/BrillouinZoneControls.svelte +0 -144
  619. package/dist/src/lib/brillouin/BrillouinZoneExportPane.svelte +0 -146
  620. package/dist/src/lib/brillouin/BrillouinZoneInfoPane.svelte +0 -146
  621. package/dist/src/lib/brillouin/BrillouinZoneScene.svelte +0 -476
  622. package/dist/src/lib/brillouin/BrillouinZoneTooltip.svelte +0 -92
  623. package/dist/src/lib/brillouin/compute.ts +0 -529
  624. package/dist/src/lib/brillouin/index.ts +0 -8
  625. package/dist/src/lib/brillouin/types.ts +0 -51
  626. package/dist/src/lib/chempot-diagram/ChemPotDiagram.svelte +0 -327
  627. package/dist/src/lib/chempot-diagram/ChemPotDiagram2D.svelte +0 -846
  628. package/dist/src/lib/chempot-diagram/ChemPotDiagram3D.svelte +0 -3193
  629. package/dist/src/lib/chempot-diagram/async-compute.svelte.ts +0 -94
  630. package/dist/src/lib/chempot-diagram/chempot-worker.ts +0 -11
  631. package/dist/src/lib/chempot-diagram/color.ts +0 -42
  632. package/dist/src/lib/chempot-diagram/compute.ts +0 -1014
  633. package/dist/src/lib/chempot-diagram/index.ts +0 -6
  634. package/dist/src/lib/chempot-diagram/pointer.ts +0 -56
  635. package/dist/src/lib/chempot-diagram/temperature.ts +0 -77
  636. package/dist/src/lib/chempot-diagram/types.ts +0 -130
  637. package/dist/src/lib/colors/index.ts +0 -249
  638. package/dist/src/lib/composition/BarChart.svelte +0 -297
  639. package/dist/src/lib/composition/BubbleChart.svelte +0 -218
  640. package/dist/src/lib/composition/Composition.svelte +0 -165
  641. package/dist/src/lib/composition/Formula.svelte +0 -268
  642. package/dist/src/lib/composition/FormulaFilter.svelte +0 -1257
  643. package/dist/src/lib/composition/PieChart.svelte +0 -323
  644. package/dist/src/lib/composition/format.ts +0 -155
  645. package/dist/src/lib/composition/index.ts +0 -37
  646. package/dist/src/lib/composition/parse.ts +0 -605
  647. package/dist/src/lib/constants.ts +0 -134
  648. package/dist/src/lib/controls.ts +0 -42
  649. package/dist/src/lib/convex-hull/ConvexHull.svelte +0 -157
  650. package/dist/src/lib/convex-hull/ConvexHull2D.svelte +0 -825
  651. package/dist/src/lib/convex-hull/ConvexHull3D.svelte +0 -1801
  652. package/dist/src/lib/convex-hull/ConvexHull4D.svelte +0 -1398
  653. package/dist/src/lib/convex-hull/ConvexHullControls.svelte +0 -535
  654. package/dist/src/lib/convex-hull/ConvexHullInfoPane.svelte +0 -125
  655. package/dist/src/lib/convex-hull/ConvexHullStats.svelte +0 -929
  656. package/dist/src/lib/convex-hull/ConvexHullTooltip.svelte +0 -131
  657. package/dist/src/lib/convex-hull/GasPressureControls.svelte +0 -247
  658. package/dist/src/lib/convex-hull/StructurePopup.svelte +0 -151
  659. package/dist/src/lib/convex-hull/TemperatureSlider.svelte +0 -140
  660. package/dist/src/lib/convex-hull/barycentric-coords.ts +0 -246
  661. package/dist/src/lib/convex-hull/demo-temperature.ts +0 -63
  662. package/dist/src/lib/convex-hull/gas-thermodynamics.ts +0 -405
  663. package/dist/src/lib/convex-hull/helpers.ts +0 -932
  664. package/dist/src/lib/convex-hull/index.ts +0 -202
  665. package/dist/src/lib/convex-hull/thermodynamics.ts +0 -2192
  666. package/dist/src/lib/convex-hull/types.ts +0 -267
  667. package/dist/src/lib/coordination/CoordinationBarPlot.svelte +0 -311
  668. package/dist/src/lib/coordination/calc-coordination.ts +0 -93
  669. package/dist/src/lib/coordination/index.ts +0 -9
  670. package/dist/src/lib/effects.svelte.ts +0 -48
  671. package/dist/src/lib/element/ElementHeading.svelte +0 -26
  672. package/dist/src/lib/element/ElementPhoto.svelte +0 -57
  673. package/dist/src/lib/element/ElementStats.svelte +0 -80
  674. package/dist/src/lib/element/ElementTile.svelte +0 -484
  675. package/dist/src/lib/element/data.ts +0 -14
  676. package/dist/src/lib/element/index.ts +0 -8
  677. package/dist/src/lib/element/types.ts +0 -62
  678. package/dist/src/lib/feedback/ClickFeedback.svelte +0 -58
  679. package/dist/src/lib/feedback/DragOverlay.svelte +0 -42
  680. package/dist/src/lib/feedback/index.ts +0 -4
  681. package/dist/src/lib/fermi-surface/FermiSlice.svelte +0 -189
  682. package/dist/src/lib/fermi-surface/FermiSurface.svelte +0 -600
  683. package/dist/src/lib/fermi-surface/FermiSurfaceControls.svelte +0 -448
  684. package/dist/src/lib/fermi-surface/FermiSurfaceScene.svelte +0 -794
  685. package/dist/src/lib/fermi-surface/FermiSurfaceTooltip.svelte +0 -111
  686. package/dist/src/lib/fermi-surface/compute.ts +0 -728
  687. package/dist/src/lib/fermi-surface/constants.ts +0 -32
  688. package/dist/src/lib/fermi-surface/export.ts +0 -64
  689. package/dist/src/lib/fermi-surface/index.ts +0 -14
  690. package/dist/src/lib/fermi-surface/marching-cubes.ts +0 -3
  691. package/dist/src/lib/fermi-surface/parse.ts +0 -574
  692. package/dist/src/lib/fermi-surface/symmetry.ts +0 -56
  693. package/dist/src/lib/fermi-surface/types.ts +0 -159
  694. package/dist/src/lib/heatmap-matrix/HeatmapMatrix.svelte +0 -1545
  695. package/dist/src/lib/heatmap-matrix/HeatmapMatrixControls.svelte +0 -225
  696. package/dist/src/lib/heatmap-matrix/index.ts +0 -167
  697. package/dist/src/lib/heatmap-matrix/shared.ts +0 -7
  698. package/dist/src/lib/icons.ts +0 -650
  699. package/dist/src/lib/index.ts +0 -61
  700. package/dist/src/lib/io/decompress.ts +0 -92
  701. package/dist/src/lib/io/export.ts +0 -385
  702. package/dist/src/lib/io/fetch.ts +0 -46
  703. package/dist/src/lib/io/file-drop.ts +0 -51
  704. package/dist/src/lib/io/index.ts +0 -7
  705. package/dist/src/lib/io/is-binary.ts +0 -24
  706. package/dist/src/lib/io/types.ts +0 -8
  707. package/dist/src/lib/io/url-drop.ts +0 -141
  708. package/dist/src/lib/isosurface/Isosurface.svelte +0 -285
  709. package/dist/src/lib/isosurface/IsosurfaceControls.svelte +0 -277
  710. package/dist/src/lib/isosurface/index.ts +0 -7
  711. package/dist/src/lib/isosurface/parse.ts +0 -656
  712. package/dist/src/lib/isosurface/slice.ts +0 -175
  713. package/dist/src/lib/isosurface/types.ts +0 -309
  714. package/dist/src/lib/labels.ts +0 -320
  715. package/dist/src/lib/layout/FullscreenToggle.svelte +0 -50
  716. package/dist/src/lib/layout/InfoCard.svelte +0 -120
  717. package/dist/src/lib/layout/InfoTag.svelte +0 -185
  718. package/dist/src/lib/layout/PropertyFilter.svelte +0 -246
  719. package/dist/src/lib/layout/SettingsSection.svelte +0 -148
  720. package/dist/src/lib/layout/SubpageGrid.svelte +0 -82
  721. package/dist/src/lib/layout/fullscreen.ts +0 -65
  722. package/dist/src/lib/layout/index.ts +0 -11
  723. package/dist/src/lib/layout/json-tree/JsonNode.svelte +0 -548
  724. package/dist/src/lib/layout/json-tree/JsonTree.svelte +0 -1230
  725. package/dist/src/lib/layout/json-tree/index.ts +0 -3
  726. package/dist/src/lib/layout/json-tree/types.ts +0 -126
  727. package/dist/src/lib/layout/json-tree/utils.ts +0 -682
  728. package/dist/src/lib/marching-cubes.ts +0 -614
  729. package/dist/src/lib/math.ts +0 -1081
  730. package/dist/src/lib/overlays/ContextMenu.svelte +0 -162
  731. package/dist/src/lib/overlays/CopyButton.svelte +0 -45
  732. package/dist/src/lib/overlays/DragControlTab.svelte +0 -98
  733. package/dist/src/lib/overlays/DraggablePane.svelte +0 -487
  734. package/dist/src/lib/overlays/InfoPaneCards.svelte +0 -149
  735. package/dist/src/lib/overlays/index.ts +0 -3
  736. package/dist/src/lib/periodic-table/PeriodicTable.svelte +0 -469
  737. package/dist/src/lib/periodic-table/PeriodicTableControls.svelte +0 -557
  738. package/dist/src/lib/periodic-table/PropertySelect.svelte +0 -37
  739. package/dist/src/lib/periodic-table/index.ts +0 -12
  740. package/dist/src/lib/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +0 -1086
  741. package/dist/src/lib/phase-diagram/PhaseDiagramControls.svelte +0 -444
  742. package/dist/src/lib/phase-diagram/PhaseDiagramEditorPane.svelte +0 -126
  743. package/dist/src/lib/phase-diagram/PhaseDiagramExportPane.svelte +0 -184
  744. package/dist/src/lib/phase-diagram/PhaseDiagramTooltip.svelte +0 -391
  745. package/dist/src/lib/phase-diagram/TdbInfoPanel.svelte +0 -203
  746. package/dist/src/lib/phase-diagram/build-diagram.ts +0 -186
  747. package/dist/src/lib/phase-diagram/colors.ts +0 -58
  748. package/dist/src/lib/phase-diagram/diagram-input.ts +0 -40
  749. package/dist/src/lib/phase-diagram/index.ts +0 -13
  750. package/dist/src/lib/phase-diagram/parse.ts +0 -348
  751. package/dist/src/lib/phase-diagram/svg-to-diagram.ts +0 -1023
  752. package/dist/src/lib/phase-diagram/types.ts +0 -144
  753. package/dist/src/lib/phase-diagram/utils.ts +0 -775
  754. package/dist/src/lib/plot/AxisLabel.svelte +0 -51
  755. package/dist/src/lib/plot/BarPlot.svelte +0 -2113
  756. package/dist/src/lib/plot/BarPlotControls.svelte +0 -66
  757. package/dist/src/lib/plot/BinnedScatterPlot.svelte +0 -1114
  758. package/dist/src/lib/plot/ColorBar.svelte +0 -721
  759. package/dist/src/lib/plot/ColorScaleSelect.svelte +0 -54
  760. package/dist/src/lib/plot/ElementScatter.svelte +0 -63
  761. package/dist/src/lib/plot/FillArea.svelte +0 -223
  762. package/dist/src/lib/plot/Histogram.svelte +0 -1558
  763. package/dist/src/lib/plot/HistogramControls.svelte +0 -212
  764. package/dist/src/lib/plot/InteractiveAxisLabel.svelte +0 -96
  765. package/dist/src/lib/plot/Line.svelte +0 -84
  766. package/dist/src/lib/plot/PlotAxis.svelte +0 -169
  767. package/dist/src/lib/plot/PlotControls.svelte +0 -537
  768. package/dist/src/lib/plot/PlotLegend.svelte +0 -569
  769. package/dist/src/lib/plot/PlotTooltip.svelte +0 -67
  770. package/dist/src/lib/plot/PortalSelect.svelte +0 -253
  771. package/dist/src/lib/plot/ReferenceLine.svelte +0 -204
  772. package/dist/src/lib/plot/ReferenceLine3D.svelte +0 -156
  773. package/dist/src/lib/plot/ReferencePlane.svelte +0 -175
  774. package/dist/src/lib/plot/ScatterPlot.svelte +0 -2778
  775. package/dist/src/lib/plot/ScatterPlot3D.svelte +0 -529
  776. package/dist/src/lib/plot/ScatterPlot3DControls.svelte +0 -437
  777. package/dist/src/lib/plot/ScatterPlot3DScene.svelte +0 -912
  778. package/dist/src/lib/plot/ScatterPlotControls.svelte +0 -306
  779. package/dist/src/lib/plot/ScatterPoint.svelte +0 -182
  780. package/dist/src/lib/plot/SpacegroupBarPlot.svelte +0 -293
  781. package/dist/src/lib/plot/Surface3D.svelte +0 -197
  782. package/dist/src/lib/plot/ZeroLines.svelte +0 -97
  783. package/dist/src/lib/plot/ZoomRect.svelte +0 -23
  784. package/dist/src/lib/plot/adaptive-density.ts +0 -316
  785. package/dist/src/lib/plot/auto-place.ts +0 -184
  786. package/dist/src/lib/plot/axis-utils.ts +0 -122
  787. package/dist/src/lib/plot/binned-scatter-types.ts +0 -83
  788. package/dist/src/lib/plot/data-cleaning.ts +0 -1069
  789. package/dist/src/lib/plot/data-transform.ts +0 -69
  790. package/dist/src/lib/plot/defaults.ts +0 -9
  791. package/dist/src/lib/plot/fill-utils.ts +0 -494
  792. package/dist/src/lib/plot/hover-lock.svelte.ts +0 -60
  793. package/dist/src/lib/plot/index.ts +0 -53
  794. package/dist/src/lib/plot/interactions.ts +0 -119
  795. package/dist/src/lib/plot/layout.ts +0 -425
  796. package/dist/src/lib/plot/reference-line.ts +0 -426
  797. package/dist/src/lib/plot/scales.ts +0 -654
  798. package/dist/src/lib/plot/svg.ts +0 -23
  799. package/dist/src/lib/plot/types.ts +0 -1144
  800. package/dist/src/lib/plot/utils/label-placement.ts +0 -541
  801. package/dist/src/lib/plot/utils/series-visibility.ts +0 -140
  802. package/dist/src/lib/plot/utils.ts +0 -11
  803. package/dist/src/lib/rdf/RdfPlot.svelte +0 -247
  804. package/dist/src/lib/rdf/calc-rdf.ts +0 -167
  805. package/dist/src/lib/rdf/index.ts +0 -27
  806. package/dist/src/lib/sanitize.ts +0 -126
  807. package/dist/src/lib/settings.ts +0 -1479
  808. package/dist/src/lib/spectral/Bands.svelte +0 -1040
  809. package/dist/src/lib/spectral/BandsAndDos.svelte +0 -134
  810. package/dist/src/lib/spectral/BrillouinBandsDos.svelte +0 -252
  811. package/dist/src/lib/spectral/Dos.svelte +0 -697
  812. package/dist/src/lib/spectral/helpers.ts +0 -1381
  813. package/dist/src/lib/spectral/index.ts +0 -8
  814. package/dist/src/lib/spectral/types.ts +0 -112
  815. package/dist/src/lib/state.svelte.ts +0 -64
  816. package/dist/src/lib/structure/Arrow.svelte +0 -72
  817. package/dist/src/lib/structure/AtomLegend.svelte +0 -815
  818. package/dist/src/lib/structure/Bond.svelte +0 -140
  819. package/dist/src/lib/structure/CanvasTooltip.svelte +0 -33
  820. package/dist/src/lib/structure/CellSelect.svelte +0 -349
  821. package/dist/src/lib/structure/Cylinder.svelte +0 -45
  822. package/dist/src/lib/structure/Lattice.svelte +0 -196
  823. package/dist/src/lib/structure/Structure.svelte +0 -2248
  824. package/dist/src/lib/structure/StructureControls.svelte +0 -1273
  825. package/dist/src/lib/structure/StructureExportPane.svelte +0 -252
  826. package/dist/src/lib/structure/StructureInfoPane.svelte +0 -737
  827. package/dist/src/lib/structure/StructureScene.svelte +0 -2255
  828. package/dist/src/lib/structure/atom-properties.ts +0 -316
  829. package/dist/src/lib/structure/bond-order-perception.ts +0 -447
  830. package/dist/src/lib/structure/bonding.ts +0 -944
  831. package/dist/src/lib/structure/export.ts +0 -861
  832. package/dist/src/lib/structure/index.ts +0 -291
  833. package/dist/src/lib/structure/label-placement.ts +0 -130
  834. package/dist/src/lib/structure/measure.ts +0 -45
  835. package/dist/src/lib/structure/parse.ts +0 -1705
  836. package/dist/src/lib/structure/partial-occupancy.ts +0 -183
  837. package/dist/src/lib/structure/pbc.ts +0 -164
  838. package/dist/src/lib/structure/supercell.ts +0 -226
  839. package/dist/src/lib/structure/validation.ts +0 -11
  840. package/dist/src/lib/symmetry/SymmetryStats.svelte +0 -226
  841. package/dist/src/lib/symmetry/WyckoffTable.svelte +0 -120
  842. package/dist/src/lib/symmetry/cell-transform.ts +0 -118
  843. package/dist/src/lib/symmetry/index.ts +0 -348
  844. package/dist/src/lib/symmetry/spacegroups.ts +0 -404
  845. package/dist/src/lib/table/HeatmapTable.svelte +0 -1833
  846. package/dist/src/lib/table/ToggleMenu.svelte +0 -385
  847. package/dist/src/lib/table/index.ts +0 -139
  848. package/dist/src/lib/theme/ThemeControl.svelte +0 -53
  849. package/dist/src/lib/theme/index.ts +0 -107
  850. package/dist/src/lib/time.ts +0 -71
  851. package/dist/src/lib/tooltip/TooltipContent.svelte +0 -58
  852. package/dist/src/lib/tooltip/index.ts +0 -2
  853. package/dist/src/lib/tooltip/types.ts +0 -13
  854. package/dist/src/lib/trajectory/Trajectory.svelte +0 -1545
  855. package/dist/src/lib/trajectory/TrajectoryError.svelte +0 -128
  856. package/dist/src/lib/trajectory/TrajectoryExportPane.svelte +0 -357
  857. package/dist/src/lib/trajectory/TrajectoryInfoPane.svelte +0 -313
  858. package/dist/src/lib/trajectory/constants.ts +0 -7
  859. package/dist/src/lib/trajectory/extract.ts +0 -196
  860. package/dist/src/lib/trajectory/format-detect.ts +0 -96
  861. package/dist/src/lib/trajectory/frame-reader.ts +0 -456
  862. package/dist/src/lib/trajectory/helpers.ts +0 -217
  863. package/dist/src/lib/trajectory/index.ts +0 -218
  864. package/dist/src/lib/trajectory/parse/ase.ts +0 -109
  865. package/dist/src/lib/trajectory/parse/hdf5.ts +0 -173
  866. package/dist/src/lib/trajectory/parse/index.ts +0 -411
  867. package/dist/src/lib/trajectory/parse/lammps.ts +0 -215
  868. package/dist/src/lib/trajectory/parse/vasp.ts +0 -102
  869. package/dist/src/lib/trajectory/parse/xyz.ts +0 -143
  870. package/dist/src/lib/trajectory/plotting.ts +0 -599
  871. package/dist/src/lib/trajectory/types.ts +0 -13
  872. package/dist/src/lib/utils.ts +0 -56
  873. package/dist/src/lib/xrd/XrdPlot.svelte +0 -615
  874. package/dist/src/lib/xrd/broadening.ts +0 -130
  875. package/dist/src/lib/xrd/calc-xrd.ts +0 -397
  876. package/dist/src/lib/xrd/index.ts +0 -38
  877. package/dist/src/lib/xrd/parse.ts +0 -858
  878. package/dist/webview.js +0 -29421
  879. package/icon.png +0 -0
  880. package/matterviz-0.3.2.vsix +0 -0
  881. package/matterviz-0.3.4.vsix +0 -0
  882. package/matterviz-0.3.5.vsix +0 -0
  883. package/scripts/sync-config.ts +0 -101
  884. package/src/declarations.d.ts +0 -2
  885. package/src/extension.ts +0 -972
  886. package/src/node-io.ts +0 -65
  887. package/src/types.ts +0 -17
  888. package/src/webview/JsonBrowser.svelte +0 -1079
  889. package/src/webview/PlotPanel.svelte +0 -346
  890. package/src/webview/detect.ts +0 -444
  891. package/src/webview/main.ts +0 -764
  892. package/src/webview/plot-utils.ts +0 -250
  893. package/test-fixtures/all-viz-types.json.gz +0 -0
  894. package/test-fixtures/plot-demo-data.json.gz +0 -0
  895. package/tests/detect.test.ts +0 -604
  896. package/tests/extension.test.ts +0 -2041
  897. package/tests/node-io.test.ts +0 -39
  898. package/tests/plot-utils.test.ts +0 -302
  899. package/tests/vite-plugin-json-gz.test.ts +0 -114
  900. package/tests/vscode-mock.ts +0 -18
  901. package/tests/webview.test.ts +0 -231
  902. package/tsconfig.json +0 -20
  903. package/vite-plugin-json-gz.ts +0 -29
  904. package/vite.config.ts +0 -34
  905. package/vite.extension.config.ts +0 -34
  906. /package/dist/{src/lib/EmptyState.svelte → EmptyState.svelte} +0 -0
  907. /package/dist/{src/lib/chempot-diagram → chempot-diagram}/ChemPotScene3D.svelte +0 -0
  908. /package/dist/{src/lib/colors → colors}/alloy-colors.json +0 -0
  909. /package/dist/{src/lib/colors → colors}/dark-mode-colors.json +0 -0
  910. /package/dist/{src/lib/colors → colors}/jmol-colors.json +0 -0
  911. /package/dist/{src/lib/colors → colors}/muted-colors.json +0 -0
  912. /package/dist/{src/lib/colors → colors}/pastel-colors.json +0 -0
  913. /package/dist/{src/lib/colors → colors}/vesta-colors.json +0 -0
  914. /package/dist/{src/lib/element → element}/BohrAtom.svelte +0 -0
  915. /package/dist/{src/lib/element → element}/Nucleus.svelte +0 -0
  916. /package/dist/{src/lib/element → element}/data.json +0 -0
  917. /package/dist/{src/lib/element → element}/data.json.gz +0 -0
  918. /package/dist/{src/lib/element → element}/data.json.gz.d.ts +0 -0
  919. /package/dist/{src/lib/element → element}/data.schema.json +0 -0
  920. /package/dist/{src/lib/element-image-urls.json → element-image-urls.json} +0 -0
  921. /package/dist/{src/lib/feedback → feedback}/Spinner.svelte +0 -0
  922. /package/dist/{src/lib/feedback → feedback}/StatusMessage.svelte +0 -0
  923. /package/dist/{src/lib/layout → layout}/json-tree/JsonValue.svelte +0 -0
  924. /package/dist/{src/lib/periodic-table → periodic-table}/TableInset.svelte +0 -0
  925. /package/dist/{src/lib/theme → theme}/themes.mjs +0 -0
  926. /package/dist/{src/lib/xrd → xrd}/atomic_scattering_params.json +0 -0
@@ -0,0 +1,1050 @@
1
+ <script lang="ts">
2
+ import { PLOT_COLORS } from '../colors'
3
+ import EmptyState from '../EmptyState.svelte'
4
+ import { format_num } from '../labels'
5
+ import { sanitize_html } from '../sanitize'
6
+ import { SettingsSection } from '../layout'
7
+ import type { Vec2 } from '../math'
8
+ import ScatterPlot from '../plot/scatter/ScatterPlot.svelte'
9
+ import type { AxisConfig, DataSeries, FillRegion } from '../plot/core/types'
10
+ import * as helpers from './helpers'
11
+ import type {
12
+ BandsSpinMode,
13
+ BandStructureType,
14
+ BaseBandStructure,
15
+ FrequencyUnit,
16
+ LineKwargs,
17
+ PathMode,
18
+ RibbonConfig,
19
+ } from './types'
20
+ import type { ComponentProps } from 'svelte'
21
+ import { SvelteMap } from 'svelte/reactivity'
22
+
23
+ type Dom_attr_value = string | number | boolean
24
+
25
+ let {
26
+ band_structs,
27
+ line_kwargs = {},
28
+ path_mode = `strict`,
29
+ band_type = undefined,
30
+ show_legend = true,
31
+ x_axis = {},
32
+ y_axis = $bindable({}),
33
+ x_positions = $bindable(),
34
+ reference_frequency = null,
35
+ highlighted_qpoint_index = null,
36
+ ribbon_config = {},
37
+ fermi_level = undefined,
38
+ units = $bindable(`THz`),
39
+ band_spin_mode = $bindable(`overlay`),
40
+ highlight_regions = [],
41
+ shade_imaginary_modes = true,
42
+ show_gap_annotation = true,
43
+ show_controls = true,
44
+ show_path_mode_control = true,
45
+ show_units_control = true,
46
+ show_spin_control = true,
47
+ show_annotation_controls = true,
48
+ id = undefined,
49
+ 'data-testid': data_testid = undefined,
50
+ ...rest
51
+ }: ComponentProps<typeof ScatterPlot> & {
52
+ band_structs: BaseBandStructure | Record<string, BaseBandStructure>
53
+ x_axis?: AxisConfig
54
+ y_axis?: AxisConfig
55
+ line_kwargs?: LineKwargs
56
+ path_mode?: PathMode
57
+ band_type?: BandStructureType
58
+ show_legend?: boolean
59
+ x_positions?: Record<string, [number, number]>
60
+ reference_frequency?: number | null
61
+ // Q-point index to highlight with a vertical line (synced from BZ k-path hover)
62
+ highlighted_qpoint_index?: number | null
63
+ ribbon_config?: RibbonConfig | Record<string, RibbonConfig>
64
+ fermi_level?: number // Fermi level for electronic bands (auto-detected if not provided)
65
+ units?: FrequencyUnit // Phonon frequency display units (electronic always eV)
66
+ band_spin_mode?: BandsSpinMode // Electronic spin display: overlay (default), up_only, down_only
67
+ highlight_regions?: {
68
+ y_min: number
69
+ y_max: number
70
+ color?: string
71
+ opacity?: number
72
+ label?: string
73
+ }[]
74
+ shade_imaginary_modes?: boolean // Shade y<0 region for phonon plots with imaginary modes
75
+ show_gap_annotation?: boolean // Annotate electronic VBM/CBM and gap when available
76
+ show_controls?: boolean
77
+ show_path_mode_control?: boolean
78
+ show_units_control?: boolean
79
+ show_spin_control?: boolean
80
+ show_annotation_controls?: boolean
81
+ id?: string
82
+ 'data-testid'?: string
83
+ } = $props()
84
+
85
+ const is_dom_attr_value = (attr_value: unknown): attr_value is Dom_attr_value =>
86
+ typeof attr_value === `string` ||
87
+ typeof attr_value === `number` ||
88
+ typeof attr_value === `boolean`
89
+
90
+ // Helper function to get line styling for a band
91
+ function get_line_style(
92
+ color: string,
93
+ is_acoustic: boolean,
94
+ frequencies: number[],
95
+ band_idx: number,
96
+ ): { stroke: string; stroke_width: number } {
97
+ const defaults = { stroke: color, stroke_width: is_acoustic ? 1.5 : 1 }
98
+
99
+ if (typeof line_kwargs === `function`) {
100
+ const custom = line_kwargs(frequencies, band_idx)
101
+ return {
102
+ stroke: (custom.stroke as string) ?? defaults.stroke,
103
+ stroke_width: (custom.stroke_width as number) ?? defaults.stroke_width,
104
+ }
105
+ }
106
+
107
+ if (typeof line_kwargs === `object` && line_kwargs !== null) {
108
+ const mode_key = is_acoustic ? `acoustic` : `optical`
109
+ const mode_kwargs = (line_kwargs as Record<string, unknown>)[mode_key] as
110
+ | Record<string, unknown>
111
+ | undefined
112
+ const source = (mode_kwargs ?? line_kwargs) as Record<string, unknown>
113
+ return {
114
+ stroke: (source.stroke as string) ?? defaults.stroke,
115
+ stroke_width: (source.stroke_width as number) ?? defaults.stroke_width,
116
+ }
117
+ }
118
+
119
+ return defaults
120
+ }
121
+
122
+ // Ribbon data structure for rendering
123
+ interface RibbonData {
124
+ x_values: number[]
125
+ y_values: number[]
126
+ width_values: number[]
127
+ color: string
128
+ opacity: number
129
+ max_width: number
130
+ scale: number
131
+ band_idx: number
132
+ structure_label: string
133
+ segment_key: string
134
+ }
135
+
136
+ // Normalize input to dict format
137
+ // Supports multiple formats:
138
+ // - matterviz format: qpoints + branches arrays
139
+ // - pymatgen phonon: qpoints + bands (or frequencies_cm) arrays
140
+ // - pymatgen electronic: kpoints + bands arrays
141
+ let band_structs_dict = $derived.by(() => {
142
+ if (!band_structs) return {}
143
+
144
+ // Detect single band structure by checking for characteristic fields
145
+ // - pymatgen format: has @class or @module markers (may also have branches)
146
+ // - matterviz format: has qpoints + branches (no pymatgen markers)
147
+ const has_qpoints = `qpoints` in band_structs &&
148
+ Array.isArray(band_structs.qpoints) &&
149
+ band_structs.qpoints.length > 0
150
+ const has_kpoints = `kpoints` in band_structs &&
151
+ Array.isArray(band_structs.kpoints) &&
152
+ band_structs.kpoints.length > 0
153
+ const has_bands = `bands` in band_structs
154
+ const has_frequencies_cm = `frequencies_cm` in band_structs &&
155
+ Array.isArray(band_structs.frequencies_cm)
156
+ const has_branches = `branches` in band_structs
157
+ // Pymatgen structures have explicit class/module markers
158
+ const is_pymatgen = `@class` in band_structs || `@module` in band_structs
159
+
160
+ // Pymatgen single: has markers and point/band data (may have branches too)
161
+ const is_pymatgen_single = is_pymatgen &&
162
+ (has_qpoints || has_kpoints) &&
163
+ (has_bands || has_frequencies_cm)
164
+ // Matterviz single: has qpoints + branches but NO pymatgen markers
165
+ const is_matterviz_single = !is_pymatgen && has_qpoints && has_branches
166
+ const is_single = is_matterviz_single || is_pymatgen_single
167
+
168
+ const result: Record<string, BaseBandStructure> = {}
169
+
170
+ if (is_single) {
171
+ const normalized = helpers.normalize_band_structure(band_structs)
172
+ if (normalized) result.default = normalized
173
+ } else {
174
+ for (const [key, bs] of Object.entries(band_structs)) {
175
+ const normalized = helpers.normalize_band_structure(bs)
176
+ if (normalized) result[key] = normalized
177
+ }
178
+ }
179
+ return result
180
+ })
181
+
182
+ // Auto-detect band type if not explicitly set
183
+ let detected_band_type = $derived.by((): BandStructureType => {
184
+ if (band_type) return band_type
185
+ if (!band_structs) return `phonon`
186
+
187
+ // Single structure has marker fields; dict of structures has label keys
188
+ const is_single = `@class` in band_structs || `@module` in band_structs ||
189
+ `kpoints` in band_structs || `qpoints` in band_structs
190
+ const source = (is_single ? band_structs : Object.values(band_structs)[0]) as
191
+ | Record<string, unknown>
192
+ | undefined
193
+ if (!source) return `phonon`
194
+
195
+ // Electronic: has kpoints, BandStructure* class (not Phonon*), or electronic_structure module
196
+ const py_class_name = String(source[`@class`] ?? ``)
197
+ if (
198
+ (`kpoints` in source && Array.isArray(source.kpoints) &&
199
+ source.kpoints.length > 0) ||
200
+ (py_class_name.startsWith(`BandStructure`) &&
201
+ !py_class_name.startsWith(`Phonon`)) ||
202
+ String(source[`@module`] ?? ``).includes(`electronic_structure`)
203
+ ) return `electronic`
204
+
205
+ return `phonon`
206
+ })
207
+
208
+ // Auto-detect Fermi level from electronic band structure data if not explicitly provided
209
+ let effective_fermi_level = $derived.by((): number | undefined => {
210
+ if (fermi_level !== undefined) return fermi_level
211
+ if (detected_band_type !== `electronic`) return undefined
212
+
213
+ // Check raw input for efermi field
214
+ const source = `efermi` in (band_structs as object)
215
+ ? band_structs
216
+ : Object.values(band_structs)[0]
217
+ const efermi = (source as Record<string, unknown>)?.efermi
218
+ return typeof efermi === `number` ? efermi : undefined
219
+ })
220
+
221
+ let effective_spin_mode = $derived.by((): BandsSpinMode => {
222
+ if (detected_band_type !== `electronic`) return null
223
+ return (band_spin_mode === `up_only` || band_spin_mode === `down_only`)
224
+ ? band_spin_mode
225
+ : `overlay`
226
+ })
227
+
228
+ const convert_band_values = (values: number[]): number[] => {
229
+ if (detected_band_type !== `phonon`) return values
230
+ if (units === `THz`) return values
231
+ return helpers.convert_frequencies(values, units)
232
+ }
233
+
234
+ // Collect all path segments across structures once (shared by strict checks and plotting)
235
+ let all_segments = $derived.by(() => {
236
+ const collected_segments: Record<string, [string, BaseBandStructure][]> = {}
237
+ for (const [label, bs] of Object.entries(band_structs_dict)) {
238
+ for (const branch of bs.branches) {
239
+ const start_label = bs.qpoints[branch.start_index]?.label ?? undefined
240
+ const end_label = bs.qpoints[branch.end_index]?.label ?? undefined
241
+ const segment_key = helpers.get_segment_key(start_label, end_label)
242
+ collected_segments[segment_key] ??= []
243
+ collected_segments[segment_key].push([label, bs])
244
+ }
245
+ }
246
+ return collected_segments
247
+ })
248
+
249
+ let num_structures = $derived(Object.keys(band_structs_dict).length)
250
+ let all_segment_keys = $derived(Object.keys(all_segments))
251
+ let common_segment_keys = $derived.by(() =>
252
+ all_segment_keys.filter(
253
+ (segment_key) => all_segments[segment_key].length === num_structures,
254
+ )
255
+ )
256
+ let empty_state_attrs = $derived.by(() => {
257
+ const attrs: Record<string, Dom_attr_value> = {}
258
+ for (const [attr_name, attr_value] of Object.entries(rest)) {
259
+ if (
260
+ (attr_name === `class` || attr_name === `style` || attr_name === `role` ||
261
+ attr_name.startsWith(`aria-`)) &&
262
+ is_dom_attr_value(attr_value)
263
+ ) {
264
+ attrs[attr_name] = attr_value
265
+ }
266
+ }
267
+ return attrs
268
+ })
269
+
270
+ // Compute path mismatch details for strict mode handling
271
+ let strict_path_error = $derived.by((): string | null => {
272
+ if (path_mode !== `strict`) return null
273
+ return common_segment_keys.length === all_segment_keys.length
274
+ ? null
275
+ : `Band structures have different q-point paths. Switch to path_mode="union" or "intersection" to compare non-identical paths.`
276
+ })
277
+
278
+ // Determine which segments to plot based on path_mode
279
+ let segments_to_plot = $derived.by(() => {
280
+ if (path_mode === `union`) return new Set(all_segment_keys)
281
+ return new Set(common_segment_keys)
282
+ })
283
+
284
+ // Map segments to x-axis positions
285
+ $effect(() => {
286
+ if (Object.keys(band_structs_dict).length === 0 || segments_to_plot.size === 0) {
287
+ x_positions = {}
288
+ return
289
+ }
290
+ const positions: Record<string, [number, number]> = {}
291
+ let current_x = 0
292
+
293
+ // Preserve physical path order using the first available structure
294
+ const canonical = Object.values(band_structs_dict)[0]
295
+ if (!canonical) {
296
+ x_positions = {}
297
+ return
298
+ }
299
+ const ordered_segments = helpers.get_ordered_segments(canonical, segments_to_plot)
300
+
301
+ for (let seg_idx = 0; seg_idx < ordered_segments.length; seg_idx++) {
302
+ const segment_key = ordered_segments[seg_idx]
303
+ if (positions[segment_key]) continue
304
+
305
+ const [start_label, end_label] = segment_key.split(`_`)
306
+
307
+ // Find the first band structure that has this segment
308
+ for (const bs of Object.values(band_structs_dict)) {
309
+ const matching_branch = bs.branches.find((branch) => {
310
+ const branch_start = bs.qpoints[branch.start_index]?.label || `null`
311
+ const branch_end = bs.qpoints[branch.end_index]?.label || `null`
312
+ return branch_start === start_label && branch_end === end_label
313
+ })
314
+
315
+ if (matching_branch) {
316
+ // Check if this is a discontinuity: consecutive indices mean no path between points
317
+ const is_discontinuity =
318
+ matching_branch.end_index - matching_branch.start_index === 1
319
+
320
+ if (is_discontinuity) {
321
+ // Place at same x position as current, no advancement
322
+ positions[segment_key] = [current_x, current_x]
323
+ } else {
324
+ const segment_len = bs.distance[matching_branch.end_index] -
325
+ bs.distance[matching_branch.start_index]
326
+ positions[segment_key] = [current_x, current_x + segment_len]
327
+ current_x += segment_len
328
+ }
329
+ break
330
+ }
331
+ }
332
+ }
333
+
334
+ x_positions = positions
335
+ })
336
+
337
+ // Convert band structures to scatter plot series + track max slope in one pass
338
+ let { series_data, max_abs_slope } = $derived.by((): {
339
+ series_data: DataSeries[]
340
+ max_abs_slope: number
341
+ } => {
342
+ if (Object.keys(band_structs_dict).length === 0 || segments_to_plot.size === 0) {
343
+ return { series_data: [], max_abs_slope: 1 }
344
+ }
345
+
346
+ const all_series: DataSeries[] = []
347
+ let max_slope = 0
348
+
349
+ for (const [bs_idx, [label, bs]] of Object.entries(band_structs_dict).entries()) {
350
+ const color = PLOT_COLORS[bs_idx % PLOT_COLORS.length]
351
+ const structure_label = label || `Structure ${bs_idx + 1}`
352
+ const gamma_indices = detected_band_type === `phonon`
353
+ ? helpers.find_gamma_indices(bs)
354
+ : []
355
+
356
+ for (const branch of bs.branches) {
357
+ const start_idx = branch.start_index
358
+ const end_idx = branch.end_index + 1
359
+ const start_label = bs.qpoints[start_idx]?.label ?? undefined
360
+ const end_label = bs.qpoints[end_idx - 1]?.label ?? undefined
361
+ const segment_key = helpers.get_segment_key(start_label, end_label)
362
+
363
+ if (!segments_to_plot.has(segment_key)) continue
364
+
365
+ // Skip discontinuous segments (consecutive labeled points)
366
+ const is_discontinuity = branch.end_index - branch.start_index === 1
367
+ if (is_discontinuity) continue
368
+
369
+ const [x_start, x_end] = x_positions?.[segment_key] || [0, 1]
370
+
371
+ // Scale distances for this segment
372
+ const segment_distances = bs.distance.slice(start_idx, end_idx)
373
+ const scaled_distances = helpers.scale_segment_distances(
374
+ segment_distances,
375
+ x_start,
376
+ x_end,
377
+ )
378
+
379
+ // Create series for each band (and spin channel for electronic structures)
380
+ for (let band_idx = 0; band_idx < bs.nb_bands; band_idx++) {
381
+ const frequencies = convert_band_values(
382
+ bs.bands[band_idx].slice(start_idx, end_idx),
383
+ )
384
+ const is_acoustic = helpers.classify_acoustic(bs, band_idx, gamma_indices)
385
+
386
+ const line_style_up = get_line_style(
387
+ color,
388
+ is_acoustic === true,
389
+ frequencies,
390
+ band_idx,
391
+ )
392
+
393
+ const spin_down_band = bs.spin_down_bands?.[band_idx]
394
+ const has_spin_down_channel = detected_band_type === `electronic` &&
395
+ Array.isArray(spin_down_band) &&
396
+ spin_down_band.length >= end_idx
397
+
398
+ const track_max_slope = (meta: helpers.BandPointMeta[]) => {
399
+ for (const pt of meta) {
400
+ if (typeof pt.slope === `number` && Number.isFinite(pt.slope)) {
401
+ max_slope = Math.max(max_slope, Math.abs(pt.slope))
402
+ }
403
+ }
404
+ }
405
+
406
+ if (effective_spin_mode !== `down_only`) {
407
+ const meta = helpers.build_point_metadata({
408
+ x_vals: scaled_distances,
409
+ y_vals: frequencies,
410
+ band_idx,
411
+ spin: `up`,
412
+ is_acoustic,
413
+ bs,
414
+ start_idx,
415
+ })
416
+ track_max_slope(meta)
417
+ all_series.push({
418
+ x: scaled_distances,
419
+ y: frequencies,
420
+ markers: `line`,
421
+ label: has_spin_down_channel
422
+ ? `${structure_label} (↑)`
423
+ : structure_label,
424
+ line_style: line_style_up,
425
+ metadata: meta,
426
+ })
427
+ }
428
+
429
+ if (has_spin_down_channel && effective_spin_mode !== `up_only`) {
430
+ const spin_down_frequencies = convert_band_values(
431
+ spin_down_band.slice(start_idx, end_idx),
432
+ )
433
+ const meta = helpers.build_point_metadata({
434
+ x_vals: scaled_distances,
435
+ y_vals: spin_down_frequencies,
436
+ band_idx,
437
+ spin: `down`,
438
+ is_acoustic,
439
+ bs,
440
+ start_idx,
441
+ })
442
+ track_max_slope(meta)
443
+ all_series.push({
444
+ x: scaled_distances,
445
+ y: spin_down_frequencies,
446
+ markers: `line`,
447
+ label: `${structure_label} (↓)`,
448
+ line_style: {
449
+ ...line_style_up,
450
+ line_dash: `4,2`,
451
+ stroke_width: Math.max(1, line_style_up.stroke_width - 0.1),
452
+ },
453
+ metadata: meta,
454
+ })
455
+ }
456
+ }
457
+ }
458
+ }
459
+
460
+ return { series_data: all_series, max_abs_slope: max_slope || 1 }
461
+ })
462
+
463
+ // Compute ribbon data for bands with width information
464
+ let ribbon_data = $derived.by((): RibbonData[] => {
465
+ if (Object.keys(band_structs_dict).length === 0 || segments_to_plot.size === 0) {
466
+ return []
467
+ }
468
+
469
+ const all_ribbons: RibbonData[] = []
470
+
471
+ for (const [bs_idx, [label, bs]] of Object.entries(band_structs_dict).entries()) {
472
+ // Skip if this band structure has no width data
473
+ if (!bs.band_widths || bs.band_widths.length === 0) continue
474
+
475
+ const color = PLOT_COLORS[bs_idx % PLOT_COLORS.length]
476
+ const structure_label = label || `Structure ${bs_idx + 1}`
477
+ const config = helpers.get_ribbon_config(ribbon_config, label)
478
+
479
+ for (const branch of bs.branches) {
480
+ const start_idx = branch.start_index
481
+ const end_idx = branch.end_index + 1
482
+ const start_label = bs.qpoints[start_idx]?.label ?? undefined
483
+ const end_label = bs.qpoints[end_idx - 1]?.label ?? undefined
484
+ const segment_key = helpers.get_segment_key(start_label, end_label)
485
+
486
+ if (!segments_to_plot.has(segment_key)) continue
487
+
488
+ // Skip discontinuous segments
489
+ const is_discontinuity = branch.end_index - branch.start_index === 1
490
+ if (is_discontinuity) continue
491
+
492
+ const [x_start, x_end] = x_positions?.[segment_key] || [0, 1]
493
+
494
+ // Scale distances for this segment
495
+ const segment_distances = bs.distance.slice(start_idx, end_idx)
496
+ const scaled_distances = helpers.scale_segment_distances(
497
+ segment_distances,
498
+ x_start,
499
+ x_end,
500
+ )
501
+
502
+ // Create ribbon data for each band that has width data
503
+ for (let band_idx = 0; band_idx < bs.nb_bands; band_idx++) {
504
+ const band_widths = bs.band_widths[band_idx]
505
+ if (!band_widths) continue
506
+
507
+ const width_values = band_widths.slice(start_idx, end_idx)
508
+ // Skip if all widths are zero or missing
509
+ if (width_values.every((wv) => !wv || wv <= 0)) continue
510
+
511
+ const y_values = convert_band_values(
512
+ bs.bands[band_idx].slice(start_idx, end_idx),
513
+ )
514
+
515
+ all_ribbons.push({
516
+ x_values: scaled_distances,
517
+ y_values,
518
+ width_values,
519
+ color: config.color ?? color,
520
+ opacity: config.opacity ?? 0.3,
521
+ max_width: config.max_width ?? 6,
522
+ scale: config.scale ?? 1,
523
+ band_idx,
524
+ structure_label,
525
+ segment_key,
526
+ })
527
+ }
528
+ }
529
+ }
530
+
531
+ return all_ribbons
532
+ })
533
+
534
+ // Get x-axis tick positions with custom labels for symmetry points
535
+ let x_axis_ticks = $derived.by(() => {
536
+ const tick_map = new SvelteMap<number, string[]>()
537
+ const add_label = (pos: number, label: string) => {
538
+ let labels = tick_map.get(pos)
539
+ if (!labels) {
540
+ labels = []
541
+ tick_map.set(pos, labels)
542
+ }
543
+ if (!labels.includes(label)) labels.push(label)
544
+ }
545
+
546
+ Object.entries(x_positions ?? {})
547
+ .sort(([, [a]], [, [b]]) => a - b)
548
+ .forEach(([segment_key, [x_start, x_end]]) => {
549
+ const [start_lbl, end_lbl] = segment_key.split(`_`)
550
+ const pretty_start = start_lbl !== `null`
551
+ ? helpers.pretty_sym_point(start_lbl)
552
+ : ``
553
+ const pretty_end = end_lbl !== `null` ? helpers.pretty_sym_point(end_lbl) : ``
554
+
555
+ // Check if this is a discontinuity (zero-length segment)
556
+ const is_discontinuity = Math.abs(x_end - x_start) < 1e-6
557
+
558
+ if (is_discontinuity && pretty_start && pretty_end) {
559
+ // Combine labels at discontinuity points
560
+ add_label(x_start, pretty_start)
561
+ add_label(x_start, pretty_end)
562
+ } else {
563
+ // Normal segment with distinct start/end
564
+ if (pretty_start) add_label(x_start, pretty_start)
565
+ if (pretty_end) add_label(x_end, pretty_end)
566
+ }
567
+ })
568
+
569
+ // Merge labels at same position with pipe separator
570
+ return Object.fromEntries(
571
+ Array.from(tick_map.entries()).map(([pos, labels]) => [
572
+ pos,
573
+ labels.join(` | `),
574
+ ]),
575
+ )
576
+ })
577
+
578
+ let x_range = $derived.by((): Vec2 => {
579
+ const flat = Object.values(x_positions ?? {}).flat()
580
+ return [flat[0] ?? 0, flat.at(-1) ?? 1]
581
+ })
582
+
583
+ // Calculate y-range, enforcing 0 minimum for phonon bands without imaginary modes
584
+ let y_range = $derived.by((): Vec2 | undefined => {
585
+ const all_freqs = Object.values(band_structs_dict).flatMap((bs) => [
586
+ ...bs.bands.flat(),
587
+ ...(bs.spin_down_bands?.flat() ?? []),
588
+ ])
589
+ // Keep electronic y-range independent of phonon unit conversion options.
590
+ const display_values = detected_band_type === `phonon`
591
+ ? convert_band_values(all_freqs)
592
+ : all_freqs
593
+ if (display_values.length === 0) return undefined
594
+ const finite = display_values.filter(Number.isFinite)
595
+ if (finite.length === 0) return undefined
596
+ let min_val = Math.min(...finite), max_val = Math.max(...finite)
597
+ if (
598
+ // clamp phonon min to 0 if negatives are noise
599
+ detected_band_type === `phonon` && min_val < 0 &&
600
+ helpers.negative_fraction(finite) < helpers.IMAGINARY_MODE_NOISE_THRESHOLD
601
+ ) {
602
+ min_val = 0
603
+ }
604
+ const padding = (max_val - min_val) * 0.02
605
+ return [min_val === 0 ? 0 : min_val - padding, max_val + padding]
606
+ })
607
+
608
+ // Internal y_axis that ScatterPlot binds to - syncs zoom changes back to parent
609
+ let internal_y_axis = $derived({
610
+ label: detected_band_type === `phonon` ? `Frequency (${units})` : `Energy (eV)`,
611
+ format: `.2f`,
612
+ label_shift: { y: 15 },
613
+ range: y_range,
614
+ ...y_axis,
615
+ })
616
+
617
+ // Sync zoom changes from ScatterPlot back to parent via bindable y_axis
618
+ // Also clears parent range when internal range becomes invalid (auto-range reset)
619
+ $effect(() => {
620
+ const next = helpers.sync_axis_range(y_axis, internal_y_axis.range)
621
+ if (next !== y_axis) y_axis = next
622
+ })
623
+
624
+ let has_series = $derived(series_data.length > 0)
625
+ let is_strict_path_error = $derived(path_mode === `strict` && Boolean(strict_path_error))
626
+
627
+ let imaginary_mode_region = $derived.by((): FillRegion[] => {
628
+ if (
629
+ detected_band_type !== `phonon` ||
630
+ !shade_imaginary_modes ||
631
+ !y_range ||
632
+ y_range[0] >= 0
633
+ ) return []
634
+ return [{
635
+ lower: y_range[0],
636
+ upper: 0,
637
+ fill: `var(--bands-imaginary-region-color, light-dark(#f8d7da, #5a1a1f))`,
638
+ fill_opacity: 0.2,
639
+ label: `Imaginary modes`,
640
+ show_in_legend: false,
641
+ z_index: `below-lines`,
642
+ }]
643
+ })
644
+
645
+ let custom_highlight_regions = $derived.by((): FillRegion[] =>
646
+ (highlight_regions ?? [])
647
+ .filter((region) =>
648
+ Number.isFinite(region.y_min) && Number.isFinite(region.y_max)
649
+ )
650
+ .map((region) => ({
651
+ lower: Math.min(region.y_min, region.y_max),
652
+ upper: Math.max(region.y_min, region.y_max),
653
+ fill: region.color ??
654
+ `var(--bands-highlight-region-color, light-dark(#f6e8c3, #4d3f20))`,
655
+ fill_opacity: region.opacity ?? 0.2,
656
+ label: region.label,
657
+ show_in_legend: Boolean(region.label),
658
+ z_index: `below-lines` as const,
659
+ }))
660
+ )
661
+
662
+ let fill_regions = $derived([
663
+ ...imaginary_mode_region,
664
+ ...custom_highlight_regions,
665
+ ])
666
+
667
+ let electronic_gap_annotation = $derived.by(() => {
668
+ if (
669
+ !show_gap_annotation ||
670
+ detected_band_type !== `electronic` ||
671
+ effective_fermi_level === undefined
672
+ ) return null
673
+ const all_energies = series_data.flatMap((series_item) =>
674
+ series_item.y.filter(Number.isFinite)
675
+ )
676
+ const occupied = all_energies.filter((energy) => energy <= effective_fermi_level)
677
+ const unoccupied = all_energies.filter((energy) => energy > effective_fermi_level)
678
+ if (occupied.length === 0 || unoccupied.length === 0) return null
679
+ const vbm = Math.max(...occupied)
680
+ const cbm = Math.min(...unoccupied)
681
+ const gap = cbm - vbm
682
+ if (!(gap > 0)) return null
683
+ return { vbm, cbm, gap }
684
+ })
685
+
686
+ let empty_state_msg = $derived.by(() => {
687
+ if (is_strict_path_error) {
688
+ return strict_path_error ?? `Path mismatch in strict mode.`
689
+ }
690
+ if (!band_structs || Object.keys(band_structs_dict).length === 0) {
691
+ return `No valid band structure data to display.`
692
+ }
693
+ if (!has_series) {
694
+ return `No plottable band segments were found in the provided data.`
695
+ }
696
+ return `No valid band structure data to display.`
697
+ })
698
+
699
+ // X-position of the externally hovered q-point (from BZ k-path), for the highlight line
700
+ let highlight_x = $derived.by(() => {
701
+ if (highlighted_qpoint_index == null) return null
702
+ const bs = Object.values(band_structs_dict)[0]
703
+ return bs ? helpers.qpoint_x_position(bs, highlighted_qpoint_index, x_positions ?? {}) : null
704
+ })
705
+
706
+ let display = $state({ x_grid: false, y_grid: true, y_zero_line: true })
707
+ </script>
708
+ {#if has_series && !is_strict_path_error}
709
+ <ScatterPlot
710
+ {id}
711
+ data-testid={data_testid}
712
+ series={series_data}
713
+ {fill_regions}
714
+ x_axis={{
715
+ label: `Wave Vector`,
716
+ ticks: Object.keys(x_axis_ticks).length > 0 ? x_axis_ticks : undefined,
717
+ format: ``,
718
+ range: x_range,
719
+ ...x_axis,
720
+ }}
721
+ bind:y_axis={internal_y_axis}
722
+ bind:display
723
+ legend={show_legend && Object.keys(band_structs_dict).length > 1 ? {} : null}
724
+ hover_config={{ threshold_px: 50 }}
725
+ controls={{ show: show_controls }}
726
+ {...rest}
727
+ >
728
+ {#snippet tooltip({ x, y, y_formatted, label, metadata })}
729
+ {@const y_label_full = internal_y_axis.label ?? ``}
730
+ {@const [, y_label, y_unit] = y_label_full.match(/^(.+?)\s*\(([^)]+)\)$/) ??
731
+ [, y_label_full, ``]}
732
+ {@const segment = Object.entries(x_positions ?? {}).find(([, [start, end]]) =>
733
+ x >= start && x <= end
734
+ )}
735
+ {@const path = segment?.[0].split(`_`).map((lbl) =>
736
+ lbl !== `null` ? helpers.pretty_sym_point(lbl) : ``
737
+ ).filter(Boolean).join(` → `) || null}
738
+ {@const {
739
+ band_idx,
740
+ spin,
741
+ is_acoustic,
742
+ nb_bands,
743
+ frac_coords,
744
+ qpoint_label,
745
+ band_width,
746
+ slope,
747
+ } = (metadata ?? {}) as Partial<helpers.BandPointMeta>}
748
+ {@const num_structs = Object.keys(band_structs_dict).length}
749
+ {#if num_structs > 1 && label}<strong>{label}</strong><br />{/if}
750
+ {@html sanitize_html(y_label || `Value`)}: {y_formatted}{y_unit ? ` ${y_unit}` : ``}<br />
751
+ {#if path}Path: {path}<br />{/if}
752
+ {#if typeof band_idx === `number`}
753
+ Band: {band_idx + 1}{#if typeof nb_bands === `number`}&thinsp;/&thinsp;{
754
+ nb_bands
755
+ }{/if}
756
+ {#if typeof is_acoustic === `boolean`}
757
+ ({is_acoustic ? `acoustic` : `optical`})
758
+ {:else if detected_band_type === `electronic` && effective_fermi_level !== undefined}
759
+ ({y <= effective_fermi_level ? `valence` : `conduction`})
760
+ {/if}
761
+ {#if spin === `up` || spin === `down`}
762
+ {spin === `up` ? `↑` : `↓`}
763
+ {/if}
764
+ {/if}
765
+ {#if typeof qpoint_label === `string` && qpoint_label}
766
+ <br />At: {helpers.pretty_sym_point(qpoint_label)}
767
+ {/if}
768
+ {#if Array.isArray(frac_coords)}
769
+ <br />{detected_band_type === `electronic` ? `k` : `q`}: [{
770
+ frac_coords.map((coord: number) => format_num(coord, `.3f`)).join(`, `)
771
+ }]
772
+ {/if}
773
+ {#if typeof band_width === `number` && band_width > 0}
774
+ <br />Projection: {format_num(band_width, `.3~g`)}
775
+ {/if}
776
+ {#if typeof slope === `number` && Number.isFinite(slope)}
777
+ {@const rel = Math.abs(slope) / max_abs_slope}
778
+ <br />Dispersion: {rel < 0.15 ? `flat` : rel < 0.5 ? `moderate` : `steep`}
779
+ {/if}
780
+ {/snippet}
781
+
782
+ {#snippet controls_extra()}
783
+ {#if show_path_mode_control}
784
+ <SettingsSection
785
+ title="Path Mode"
786
+ current_values={{ path_mode }}
787
+ on_reset={() => (path_mode = `strict`)}
788
+ >
789
+ <div class="pane-row">
790
+ <label for="bands-path-mode">Mode:</label>
791
+ <select id="bands-path-mode" bind:value={path_mode}>
792
+ <option value="strict">strict</option>
793
+ <option value="intersection">intersection</option>
794
+ <option value="union">union</option>
795
+ </select>
796
+ </div>
797
+ </SettingsSection>
798
+ {/if}
799
+
800
+ {#if show_units_control && detected_band_type === `phonon`}
801
+ <SettingsSection
802
+ title="Units"
803
+ current_values={{ units }}
804
+ on_reset={() => (units = `THz`)}
805
+ >
806
+ <div class="pane-row">
807
+ <label for="bands-units">Frequency:</label>
808
+ <select id="bands-units" bind:value={units}>
809
+ <option value="THz">THz</option>
810
+ <option value="eV">eV</option>
811
+ <option value="meV">meV</option>
812
+ <option value="cm-1">cm-1</option>
813
+ <option value="Ha">Ha</option>
814
+ </select>
815
+ </div>
816
+ </SettingsSection>
817
+ {/if}
818
+
819
+ {#if show_spin_control && detected_band_type === `electronic`}
820
+ <SettingsSection
821
+ title="Spin Display"
822
+ current_values={{ band_spin_mode }}
823
+ on_reset={() => (band_spin_mode = `overlay`)}
824
+ >
825
+ <div class="pane-row">
826
+ <label for="bands-spin-mode">Mode:</label>
827
+ <select id="bands-spin-mode" bind:value={band_spin_mode}>
828
+ <option value="overlay">overlay</option>
829
+ <option value="up_only">up only</option>
830
+ <option value="down_only">down only</option>
831
+ </select>
832
+ </div>
833
+ </SettingsSection>
834
+ {/if}
835
+
836
+ {#if show_annotation_controls && detected_band_type === `electronic`}
837
+ <SettingsSection
838
+ title="Annotations"
839
+ current_values={{ show_gap_annotation }}
840
+ on_reset={() => (show_gap_annotation = true)}
841
+ >
842
+ <div class="pane-row pane-checkbox">
843
+ <input
844
+ id="bands-gap-annotation"
845
+ type="checkbox"
846
+ bind:checked={show_gap_annotation}
847
+ />
848
+ <label for="bands-gap-annotation">Show band gap annotation</label>
849
+ </div>
850
+ </SettingsSection>
851
+ {/if}
852
+ {/snippet}
853
+
854
+ {#snippet user_content({ height, x_scale_fn, y_scale_fn, pad })}
855
+ <!-- Fat band ribbons (rendered behind band lines) -->
856
+ {#each ribbon_data as
857
+ ribbon
858
+ (`${ribbon.structure_label}-${ribbon.segment_key}-${ribbon.band_idx}`)
859
+ }
860
+ {@const path_d = helpers.generate_ribbon_path(
861
+ ribbon.x_values,
862
+ ribbon.y_values,
863
+ ribbon.width_values,
864
+ x_scale_fn,
865
+ y_scale_fn,
866
+ ribbon.max_width,
867
+ ribbon.scale,
868
+ )}
869
+ {#if path_d}
870
+ <path
871
+ d={path_d}
872
+ fill={ribbon.color}
873
+ opacity={ribbon.opacity}
874
+ stroke="none"
875
+ class="fat-band-ribbon"
876
+ />
877
+ {/if}
878
+ {/each}
879
+
880
+ <!-- Symmetry point vertical lines (filter NaN from scale) -->
881
+ {#each Object.keys(x_axis_ticks).map(Number).map((tick) => x_scale_fn(tick)).filter(
882
+ Number.isFinite,
883
+ ) as
884
+ scaled_x
885
+ (scaled_x)
886
+ }
887
+ <line
888
+ x1={scaled_x}
889
+ x2={scaled_x}
890
+ y1={pad.t}
891
+ y2={height - pad.b}
892
+ stroke="var(--bands-symmetry-line-color, light-dark(black, white))"
893
+ stroke-width="var(--bands-symmetry-line-width, 1)"
894
+ opacity="var(--bands-symmetry-line-opacity, 0.5)"
895
+ />
896
+ {/each}
897
+
898
+ <!-- Hovered q-point vertical line (synced from Brillouin zone k-path hover) -->
899
+ {#if highlight_x != null}
900
+ {@const hover_x = x_scale_fn(highlight_x)}
901
+ {#if Number.isFinite(hover_x)}
902
+ <line
903
+ x1={hover_x}
904
+ x2={hover_x}
905
+ y1={pad.t}
906
+ y2={height - pad.b}
907
+ stroke="var(--bands-hover-line-color, #ff6b35)"
908
+ stroke-width="var(--bands-hover-line-width, 2)"
909
+ opacity="var(--bands-hover-line-opacity, 0.85)"
910
+ pointer-events="none"
911
+ />
912
+ {/if}
913
+ {/if}
914
+
915
+ <!-- Shared geometry for Fermi level and gap annotations -->
916
+ {@const fermi_y = effective_fermi_level !== undefined
917
+ ? y_scale_fn(effective_fermi_level)
918
+ : NaN}
919
+ {@const bands_x_end = x_scale_fn(Object.values(x_positions ?? {}).flat().at(-1) ?? 1)}
920
+ {@const gap_data = electronic_gap_annotation}
921
+ {@const vbm_y = gap_data ? y_scale_fn(gap_data.vbm) : NaN}
922
+ {@const cbm_y = gap_data ? y_scale_fn(gap_data.cbm) : NaN}
923
+ {@const gap_mid_y = (vbm_y + cbm_y) / 2}
924
+ {@const ef_needs_offset = Number.isFinite(gap_mid_y) &&
925
+ Math.abs(fermi_y - gap_mid_y) < 16}
926
+ {@const ef_label_y = ef_needs_offset
927
+ ? gap_mid_y + (fermi_y >= gap_mid_y ? 16 : -16)
928
+ : fermi_y}
929
+
930
+ <!-- Fermi level line for electronic bands -->
931
+ {#if Number.isFinite(fermi_y) && Number.isFinite(bands_x_end)}
932
+ <line
933
+ class="fermi-level-line"
934
+ x1={pad.l}
935
+ x2={bands_x_end}
936
+ y1={fermi_y}
937
+ y2={fermi_y}
938
+ stroke="var(--bands-fermi-line-color, light-dark(#e74c3c, #ff6b6b))"
939
+ stroke-width="var(--bands-fermi-line-width, 1.5)"
940
+ stroke-dasharray="var(--bands-fermi-line-dash, 6,3)"
941
+ opacity="var(--bands-fermi-line-opacity, 0.8)"
942
+ />
943
+ {#if ef_needs_offset}
944
+ <line
945
+ x1={bands_x_end}
946
+ y1={fermi_y}
947
+ x2={bands_x_end + 3}
948
+ y2={ef_label_y}
949
+ stroke="var(--bands-fermi-line-color, light-dark(#e74c3c, #ff6b6b))"
950
+ stroke-width="0.7"
951
+ opacity="0.5"
952
+ />
953
+ {/if}
954
+ <text
955
+ class="fermi-level-label"
956
+ x={bands_x_end + 4}
957
+ y={ef_label_y}
958
+ dy="0.35em"
959
+ font-size="10"
960
+ fill="var(--bands-fermi-line-color, light-dark(#e74c3c, #ff6b6b))"
961
+ opacity="0.9"
962
+ >
963
+ E<tspan dy="2" font-size="8">F</tspan>
964
+ </text>
965
+ {/if}
966
+
967
+ <!-- Reference frequency horizontal line -->
968
+ {@const ref_freq = reference_frequency != null
969
+ ? convert_band_values([reference_frequency])[0]
970
+ : NaN}
971
+ {@const ref_y = Number.isFinite(ref_freq) ? y_scale_fn(ref_freq) : NaN}
972
+ {#if Number.isFinite(ref_y) && Number.isFinite(bands_x_end)}
973
+ <line
974
+ x1={pad.l}
975
+ x2={bands_x_end}
976
+ y1={ref_y}
977
+ y2={ref_y}
978
+ stroke="var(--bands-reference-line-color, light-dark(#d48860, #c47850))"
979
+ stroke-width="var(--bands-reference-line-width, 1)"
980
+ stroke-dasharray="var(--bands-reference-line-dash, 4,3)"
981
+ opacity="var(--bands-reference-line-opacity, 0.5)"
982
+ />
983
+ {/if}
984
+
985
+ <!-- Electronic band edge and gap annotation -->
986
+ {#if gap_data && Number.isFinite(vbm_y) && Number.isFinite(cbm_y) &&
987
+ Number.isFinite(bands_x_end)}
988
+ {#each [
989
+ [vbm_y, `var(--bands-gap-vbm-color, light-dark(#1f77b4, #7db7ff))`],
990
+ [cbm_y, `var(--bands-gap-cbm-color, light-dark(#2ca02c, #7ddc7d))`],
991
+ ] as [number, string][] as
992
+ [edge_y, color]
993
+ (edge_y)
994
+ }
995
+ <line
996
+ x1={pad.l}
997
+ x2={bands_x_end + 3}
998
+ y1={edge_y}
999
+ y2={edge_y}
1000
+ stroke={color}
1001
+ stroke-width="var(--bands-gap-line-width, 1)"
1002
+ stroke-dasharray="var(--bands-gap-line-dash, 2,2)"
1003
+ opacity="0.7"
1004
+ />
1005
+ {/each}
1006
+ <text
1007
+ x={bands_x_end + 4}
1008
+ y={gap_mid_y}
1009
+ dy="0.35em"
1010
+ font-size="10"
1011
+ fill="var(--text-color)"
1012
+ >
1013
+ E<tspan dy="2" font-size="8">g:</tspan>
1014
+ <tspan dy="-2">{Number(gap_data.gap.toPrecision(4))} eV</tspan>
1015
+ </text>
1016
+ {/if}
1017
+ {/snippet}
1018
+ </ScatterPlot>
1019
+ {:else}
1020
+ <EmptyState
1021
+ {id}
1022
+ data-testid={data_testid}
1023
+ {...empty_state_attrs}
1024
+ message={empty_state_msg}
1025
+ />
1026
+ {/if}
1027
+
1028
+ <style>
1029
+ .pane-row {
1030
+ display: flex;
1031
+ align-items: center;
1032
+ gap: 0.5em;
1033
+ margin: 0.3em 0;
1034
+ font-size: 0.9em;
1035
+ }
1036
+ .pane-row label {
1037
+ min-width: 4.5em;
1038
+ flex-shrink: 0;
1039
+ }
1040
+ .pane-row select {
1041
+ flex: 1;
1042
+ min-width: 0;
1043
+ }
1044
+ .pane-checkbox {
1045
+ gap: 0.4em;
1046
+ }
1047
+ .pane-checkbox label {
1048
+ min-width: 0;
1049
+ }
1050
+ </style>