matterviz 0.4.0 → 0.4.2

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 (527) hide show
  1. package/dist/EmptyState.svelte +10 -4
  2. package/dist/FilePicker.svelte +12 -14
  3. package/dist/Icon.svelte +7 -4
  4. package/dist/MillerIndexInput.svelte +2 -2
  5. package/dist/app.css +53 -0
  6. package/dist/brillouin/BrillouinZone.svelte +132 -219
  7. package/dist/brillouin/BrillouinZone.svelte.d.ts +9 -20
  8. package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
  9. package/dist/brillouin/BrillouinZoneExportPane.svelte +47 -96
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  11. package/dist/brillouin/BrillouinZoneInfoPane.svelte +15 -42
  12. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +2 -3
  13. package/dist/brillouin/BrillouinZoneScene.svelte +63 -230
  14. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +3 -23
  15. package/dist/brillouin/ReciprocalVectors.svelte +39 -0
  16. package/dist/brillouin/ReciprocalVectors.svelte.d.ts +9 -0
  17. package/dist/brillouin/compute.d.ts +2 -0
  18. package/dist/brillouin/compute.js +80 -77
  19. package/dist/brillouin/geometry.d.ts +8 -0
  20. package/dist/brillouin/geometry.js +57 -0
  21. package/dist/brillouin/index.d.ts +2 -0
  22. package/dist/brillouin/index.js +2 -0
  23. package/dist/brillouin/types.d.ts +2 -2
  24. package/dist/chempot-diagram/ChemPotDiagram.svelte +33 -38
  25. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +1 -1
  26. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +143 -246
  27. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +4 -1
  28. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +652 -976
  29. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +7 -1
  30. package/dist/chempot-diagram/async-compute.svelte.js +1 -1
  31. package/dist/chempot-diagram/color.d.ts +3 -6
  32. package/dist/chempot-diagram/color.js +5 -5
  33. package/dist/chempot-diagram/compute.d.ts +3 -3
  34. package/dist/chempot-diagram/compute.js +3 -1
  35. package/dist/chempot-diagram/controls-state.svelte.d.ts +10 -0
  36. package/dist/chempot-diagram/controls-state.svelte.js +42 -0
  37. package/dist/chempot-diagram/export.d.ts +47 -0
  38. package/dist/chempot-diagram/export.js +133 -0
  39. package/dist/chempot-diagram/index.d.ts +1 -0
  40. package/dist/chempot-diagram/index.js +1 -0
  41. package/dist/chempot-diagram/pointer.d.ts +0 -10
  42. package/dist/chempot-diagram/pointer.js +4 -4
  43. package/dist/chempot-diagram/types.d.ts +3 -3
  44. package/dist/colors/index.d.ts +0 -4
  45. package/dist/colors/index.js +21 -22
  46. package/dist/composition/BarChart.svelte +37 -31
  47. package/dist/composition/BubbleChart.svelte +17 -17
  48. package/dist/composition/Composition.svelte +7 -11
  49. package/dist/composition/Formula.svelte +18 -25
  50. package/dist/composition/FormulaFilter.svelte +96 -98
  51. package/dist/composition/PieChart.svelte +60 -46
  52. package/dist/composition/chem-sys.js +3 -2
  53. package/dist/composition/format.js +4 -3
  54. package/dist/composition/index.d.ts +2 -0
  55. package/dist/composition/index.js +14 -0
  56. package/dist/composition/parse.d.ts +2 -3
  57. package/dist/composition/parse.js +27 -28
  58. package/dist/constants.js +11 -9
  59. package/dist/controls.d.ts +1 -0
  60. package/dist/controls.js +0 -1
  61. package/dist/convex-hull/ConvexHull.svelte +20 -25
  62. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -4
  63. package/dist/convex-hull/ConvexHull2D.svelte +176 -256
  64. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  65. package/dist/convex-hull/ConvexHull3D.svelte +269 -804
  66. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  67. package/dist/convex-hull/ConvexHull4D.svelte +236 -755
  68. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  69. package/dist/convex-hull/ConvexHullChrome.svelte +264 -0
  70. package/dist/convex-hull/ConvexHullChrome.svelte.d.ts +30 -0
  71. package/dist/convex-hull/ConvexHullControls.svelte +128 -49
  72. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +7 -6
  73. package/dist/convex-hull/ConvexHullInfoPane.svelte +18 -5
  74. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +6 -5
  75. package/dist/convex-hull/ConvexHullStats.svelte +210 -351
  76. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +3 -1
  77. package/dist/convex-hull/ConvexHullTooltip.svelte +16 -14
  78. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +2 -1
  79. package/dist/convex-hull/GasPressureControls.svelte +5 -12
  80. package/dist/convex-hull/StructurePopup.svelte +17 -21
  81. package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
  82. package/dist/convex-hull/TemperatureSlider.svelte +4 -10
  83. package/dist/convex-hull/barycentric-coords.d.ts +2 -4
  84. package/dist/convex-hull/barycentric-coords.js +6 -33
  85. package/dist/convex-hull/canvas-interactions.svelte.d.ts +79 -0
  86. package/dist/convex-hull/canvas-interactions.svelte.js +279 -0
  87. package/dist/convex-hull/helpers.d.ts +47 -17
  88. package/dist/convex-hull/helpers.js +186 -101
  89. package/dist/convex-hull/hull-state.svelte.d.ts +44 -0
  90. package/dist/convex-hull/hull-state.svelte.js +124 -0
  91. package/dist/convex-hull/index.d.ts +9 -7
  92. package/dist/convex-hull/index.js +7 -2
  93. package/dist/convex-hull/thermodynamics.js +109 -937
  94. package/dist/convex-hull/types.d.ts +12 -4
  95. package/dist/convex-hull/types.js +12 -0
  96. package/dist/coordination/CoordinationBarPlot.svelte +41 -43
  97. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  98. package/dist/coordination/calc-coordination.d.ts +1 -1
  99. package/dist/coordination/calc-coordination.js +28 -25
  100. package/dist/element/BohrAtom.svelte +6 -8
  101. package/dist/element/ElementHeading.svelte +4 -1
  102. package/dist/element/ElementPhoto.svelte +11 -9
  103. package/dist/element/ElementStats.svelte +12 -10
  104. package/dist/element/ElementTile.svelte +24 -29
  105. package/dist/element/ElementTile.svelte.d.ts +1 -1
  106. package/dist/element/Nucleus.svelte +4 -2
  107. package/dist/element/data.d.ts +1 -2
  108. package/dist/element/helpers.d.ts +4 -0
  109. package/dist/element/helpers.js +18 -0
  110. package/dist/element/index.d.ts +1 -0
  111. package/dist/element/index.js +3 -0
  112. package/dist/feedback/DragOverlay.svelte +5 -3
  113. package/dist/feedback/DragOverlay.svelte.d.ts +2 -1
  114. package/dist/feedback/StatusMessage.svelte +20 -7
  115. package/dist/fermi-surface/FermiSlice.svelte +21 -18
  116. package/dist/fermi-surface/FermiSurface.svelte +78 -165
  117. package/dist/fermi-surface/FermiSurface.svelte.d.ts +9 -20
  118. package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
  119. package/dist/fermi-surface/FermiSurfaceScene.svelte +93 -272
  120. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +3 -23
  121. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
  122. package/dist/fermi-surface/compute.js +14 -13
  123. package/dist/fermi-surface/export.js +4 -15
  124. package/dist/fermi-surface/index.d.ts +0 -1
  125. package/dist/fermi-surface/index.js +0 -1
  126. package/dist/fermi-surface/parse.d.ts +1 -1
  127. package/dist/fermi-surface/parse.js +84 -97
  128. package/dist/fermi-surface/types.d.ts +2 -2
  129. package/dist/heatmap-matrix/HeatmapMatrix.svelte +161 -185
  130. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +6 -5
  131. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +12 -9
  132. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +5 -5
  133. package/dist/heatmap-matrix/index.d.ts +8 -2
  134. package/dist/icons.d.ts +4 -0
  135. package/dist/icons.js +4 -0
  136. package/dist/index.d.ts +1 -0
  137. package/dist/index.js +1 -0
  138. package/dist/io/ExportPane.svelte +170 -0
  139. package/dist/io/ExportPane.svelte.d.ts +17 -0
  140. package/dist/io/decompress.d.ts +2 -1
  141. package/dist/io/decompress.js +22 -36
  142. package/dist/io/export.d.ts +9 -1
  143. package/dist/io/export.js +37 -29
  144. package/dist/io/fetch.d.ts +2 -4
  145. package/dist/io/fetch.js +0 -11
  146. package/dist/io/file-drop.d.ts +7 -0
  147. package/dist/io/file-drop.js +13 -0
  148. package/dist/io/index.d.ts +1 -0
  149. package/dist/io/index.js +3 -0
  150. package/dist/io/is-binary.d.ts +9 -0
  151. package/dist/io/is-binary.js +45 -1
  152. package/dist/io/types.d.ts +13 -0
  153. package/dist/io/url-drop.js +13 -25
  154. package/dist/isosurface/Isosurface.svelte +17 -23
  155. package/dist/isosurface/IsosurfaceControls.svelte +37 -42
  156. package/dist/isosurface/parse-vaspwave.d.ts +3 -0
  157. package/dist/isosurface/parse-vaspwave.js +138 -0
  158. package/dist/isosurface/parse.js +50 -48
  159. package/dist/labels.d.ts +6 -2
  160. package/dist/labels.js +44 -14
  161. package/dist/layout/FullscreenButton.svelte +34 -0
  162. package/dist/layout/FullscreenButton.svelte.d.ts +10 -0
  163. package/dist/layout/FullscreenToggle.svelte +12 -12
  164. package/dist/layout/InfoCard.svelte +7 -18
  165. package/dist/layout/InfoTag.svelte +1 -3
  166. package/dist/layout/NumberRangeInput.svelte +46 -0
  167. package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
  168. package/dist/layout/PropertyFilter.svelte +2 -6
  169. package/dist/layout/SettingsSection.svelte +21 -17
  170. package/dist/layout/SubpageGrid.svelte +3 -1
  171. package/dist/layout/ViewerChrome.svelte +115 -0
  172. package/dist/layout/ViewerChrome.svelte.d.ts +18 -0
  173. package/dist/layout/fullscreen.d.ts +4 -0
  174. package/dist/layout/fullscreen.js +3 -5
  175. package/dist/layout/fullscreen.svelte.d.ts +8 -0
  176. package/dist/layout/fullscreen.svelte.js +36 -0
  177. package/dist/layout/index.d.ts +4 -0
  178. package/dist/layout/index.js +4 -0
  179. package/dist/layout/json-tree/JsonNode.svelte +8 -11
  180. package/dist/layout/json-tree/JsonTree.svelte +53 -77
  181. package/dist/layout/json-tree/JsonValue.svelte +7 -15
  182. package/dist/layout/json-tree/utils.js +14 -23
  183. package/dist/math.d.ts +9 -3
  184. package/dist/math.js +37 -21
  185. package/dist/overlays/ContextMenu.svelte +4 -2
  186. package/dist/overlays/CopyButton.svelte +11 -5
  187. package/dist/overlays/DragControlTab.svelte +6 -1
  188. package/dist/overlays/DraggablePane.svelte +81 -26
  189. package/dist/overlays/DraggablePane.svelte.d.ts +1 -0
  190. package/dist/overlays/GlassChip.svelte +30 -0
  191. package/dist/overlays/GlassChip.svelte.d.ts +8 -0
  192. package/dist/overlays/InfoPaneCards.svelte +11 -23
  193. package/dist/overlays/index.d.ts +11 -0
  194. package/dist/overlays/index.js +26 -0
  195. package/dist/overlays/portal.d.ts +2 -0
  196. package/dist/overlays/portal.js +14 -0
  197. package/dist/periodic-table/PeriodicTable.svelte +115 -146
  198. package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
  199. package/dist/periodic-table/PeriodicTableControls.svelte +11 -63
  200. package/dist/periodic-table/TableInset.svelte +9 -4
  201. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +50 -71
  202. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
  203. package/dist/phase-diagram/PhaseDiagramControls.svelte +73 -96
  204. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +4 -3
  205. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +4 -2
  206. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +2 -3
  207. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +49 -134
  208. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +3 -4
  209. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
  210. package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
  211. package/dist/phase-diagram/build-diagram.js +3 -3
  212. package/dist/phase-diagram/colors.js +1 -1
  213. package/dist/phase-diagram/diagram-input.d.ts +1 -2
  214. package/dist/phase-diagram/parse.d.ts +2 -1
  215. package/dist/phase-diagram/parse.js +15 -15
  216. package/dist/phase-diagram/svg-to-diagram.js +21 -15
  217. package/dist/phase-diagram/utils.js +2 -3
  218. package/dist/plot/bar/BarPlot.svelte +494 -692
  219. package/dist/plot/bar/BarPlot.svelte.d.ts +9 -15
  220. package/dist/plot/bar/BarPlotControls.svelte +1 -3
  221. package/dist/plot/bar/BarPlotControls.svelte.d.ts +5 -7
  222. package/dist/plot/bar/SpacegroupBarPlot.svelte +31 -37
  223. package/dist/plot/bar/data.d.ts +5 -4
  224. package/dist/plot/bar/data.js +2 -1
  225. package/dist/plot/box/BoxPlot.svelte +361 -439
  226. package/dist/plot/box/BoxPlot.svelte.d.ts +6 -3
  227. package/dist/plot/box/BoxPlotControls.svelte.d.ts +1 -1
  228. package/dist/plot/box/Violin.svelte.d.ts +2 -1
  229. package/dist/plot/box/box-plot.d.ts +3 -2
  230. package/dist/plot/box/box-plot.js +6 -3
  231. package/dist/plot/box/kde.d.ts +2 -1
  232. package/dist/plot/box/kde.js +4 -4
  233. package/dist/plot/core/auto-place.d.ts +1 -1
  234. package/dist/plot/core/auto-place.js +5 -2
  235. package/dist/plot/core/axis-utils.d.ts +12 -7
  236. package/dist/plot/core/axis-utils.js +48 -48
  237. package/dist/plot/core/components/AxisLabel.svelte +82 -20
  238. package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
  239. package/dist/plot/core/components/ColorBar.svelte +106 -111
  240. package/dist/plot/core/components/ColorBar.svelte.d.ts +5 -4
  241. package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
  242. package/dist/plot/core/components/FillArea.svelte +10 -17
  243. package/dist/plot/core/components/HierarchyControls.svelte +249 -0
  244. package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
  245. package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
  246. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
  247. package/dist/plot/core/components/Line.svelte +21 -11
  248. package/dist/plot/core/components/Line.svelte.d.ts +5 -2
  249. package/dist/plot/core/components/PlotAxis.svelte +42 -18
  250. package/dist/plot/core/components/PlotAxis.svelte.d.ts +2 -1
  251. package/dist/plot/core/components/PlotControls.svelte +65 -41
  252. package/dist/plot/core/components/PlotControls.svelte.d.ts +1 -1
  253. package/dist/plot/core/components/PlotLegend.svelte +31 -35
  254. package/dist/plot/core/components/PlotMarginals.svelte +616 -0
  255. package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
  256. package/dist/plot/core/components/PlotTooltip.svelte +1 -1
  257. package/dist/plot/core/components/PortalSelect.svelte +4 -8
  258. package/dist/plot/core/components/ReferenceLine.svelte +27 -24
  259. package/dist/plot/core/components/ReferenceLine3D.svelte +56 -59
  260. package/dist/plot/core/components/ReferenceLine3D.svelte.d.ts +4 -4
  261. package/dist/plot/core/components/ReferencePlane.svelte +9 -10
  262. package/dist/plot/core/components/ReferencePlane.svelte.d.ts +4 -4
  263. package/dist/plot/core/components/ZeroLines.svelte +4 -8
  264. package/dist/plot/core/components/ZoomRect.svelte +1 -2
  265. package/dist/plot/core/components/index.d.ts +1 -0
  266. package/dist/plot/core/components/index.js +1 -0
  267. package/dist/plot/core/data-cleaning-signal.d.ts +46 -0
  268. package/dist/plot/core/data-cleaning-signal.js +467 -0
  269. package/dist/plot/core/data-cleaning.d.ts +2 -42
  270. package/dist/plot/core/data-cleaning.js +29 -476
  271. package/dist/plot/core/data-transform.js +9 -5
  272. package/dist/plot/core/fill-utils.d.ts +7 -4
  273. package/dist/plot/core/fill-utils.js +34 -9
  274. package/dist/plot/core/index.d.ts +1 -0
  275. package/dist/plot/core/index.js +1 -0
  276. package/dist/plot/core/interactions.d.ts +5 -1
  277. package/dist/plot/core/interactions.js +14 -2
  278. package/dist/plot/core/layout.d.ts +3 -1
  279. package/dist/plot/core/layout.js +22 -13
  280. package/dist/plot/core/marginals.d.ts +170 -0
  281. package/dist/plot/core/marginals.js +436 -0
  282. package/dist/plot/core/pan-zoom.svelte.d.ts +35 -0
  283. package/dist/plot/core/pan-zoom.svelte.js +221 -0
  284. package/dist/plot/core/placed-tween.svelte.d.ts +21 -0
  285. package/dist/plot/core/placed-tween.svelte.js +68 -0
  286. package/dist/plot/core/reference-line.d.ts +10 -10
  287. package/dist/plot/core/reference-line.js +7 -7
  288. package/dist/plot/core/scales.d.ts +40 -25
  289. package/dist/plot/core/scales.js +49 -21
  290. package/dist/plot/core/svg.d.ts +2 -1
  291. package/dist/plot/core/types/fills.d.ts +101 -0
  292. package/dist/plot/core/types/fills.js +15 -0
  293. package/dist/plot/core/types/plot-3d.d.ts +87 -0
  294. package/dist/plot/core/types/plot-3d.js +4 -0
  295. package/dist/plot/core/types/reference-lines.d.ts +140 -0
  296. package/dist/plot/core/types/reference-lines.js +9 -0
  297. package/dist/plot/core/types.d.ts +47 -331
  298. package/dist/plot/core/types.js +23 -20
  299. package/dist/plot/core/utils/hierarchy-chart.d.ts +51 -0
  300. package/dist/plot/core/utils/hierarchy-chart.js +179 -0
  301. package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
  302. package/dist/plot/core/utils/hierarchy-labels.js +99 -0
  303. package/dist/plot/core/utils/label-placement.d.ts +1 -1
  304. package/dist/plot/core/utils/label-placement.js +5 -5
  305. package/dist/plot/core/utils.d.ts +2 -1
  306. package/dist/plot/histogram/Histogram.svelte +373 -631
  307. package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
  308. package/dist/plot/histogram/HistogramControls.svelte +30 -28
  309. package/dist/plot/histogram/HistogramControls.svelte.d.ts +1 -1
  310. package/dist/plot/histogram/histogram.d.ts +31 -0
  311. package/dist/plot/histogram/histogram.js +70 -0
  312. package/dist/plot/histogram/index.d.ts +1 -0
  313. package/dist/plot/histogram/index.js +1 -0
  314. package/dist/plot/index.d.ts +1 -0
  315. package/dist/plot/index.js +1 -0
  316. package/dist/plot/sankey/Sankey.svelte +79 -73
  317. package/dist/plot/sankey/Sankey.svelte.d.ts +3 -3
  318. package/dist/plot/sankey/SankeyControls.svelte +22 -16
  319. package/dist/plot/sankey/sankey.js +3 -1
  320. package/dist/plot/scatter/BinnedScatterPlot.svelte +264 -112
  321. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +11 -4
  322. package/dist/plot/scatter/ElementScatter.svelte +4 -1
  323. package/dist/plot/scatter/ScatterPlot.svelte +623 -821
  324. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +9 -15
  325. package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
  326. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  327. package/dist/plot/scatter/ScatterPoint.svelte +16 -9
  328. package/dist/plot/scatter/binned-scatter-types.d.ts +6 -12
  329. package/dist/plot/scatter/binned-scatter-types.js +6 -1
  330. package/dist/plot/scatter/index.d.ts +1 -1
  331. package/dist/plot/scatter/scatter-data.d.ts +1 -1
  332. package/dist/plot/scatter/scatter-data.js +8 -7
  333. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +40 -60
  334. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +6 -14
  335. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +17 -15
  336. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte.d.ts +5 -5
  337. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +232 -234
  338. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +5 -14
  339. package/dist/plot/scatter-3d/Surface3D.svelte +9 -17
  340. package/dist/plot/scatter-3d/Surface3D.svelte.d.ts +4 -3
  341. package/dist/plot/sunburst/Sunburst.svelte +256 -338
  342. package/dist/plot/sunburst/Sunburst.svelte.d.ts +4 -3
  343. package/dist/plot/sunburst/index.d.ts +1 -1
  344. package/dist/plot/sunburst/index.js +2 -1
  345. package/dist/plot/sunburst/render.d.ts +2 -2
  346. package/dist/plot/sunburst/render.js +47 -22
  347. package/dist/plot/sunburst/sunburst.d.ts +5 -1
  348. package/dist/plot/sunburst/sunburst.js +14 -4
  349. package/dist/plot/treemap/Treemap.svelte +907 -0
  350. package/dist/plot/treemap/Treemap.svelte.d.ts +84 -0
  351. package/dist/plot/treemap/index.d.ts +3 -0
  352. package/dist/plot/treemap/index.js +4 -0
  353. package/dist/plot/treemap/treemap.d.ts +26 -0
  354. package/dist/plot/treemap/treemap.js +99 -0
  355. package/dist/rdf/RdfPlot.svelte +22 -26
  356. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  357. package/dist/rdf/calc-rdf.js +4 -8
  358. package/dist/sanitize.js +14 -3
  359. package/dist/scene/SceneCamera.svelte +62 -0
  360. package/dist/scene/SceneCamera.svelte.d.ts +19 -0
  361. package/dist/scene/bind-renderer.svelte.d.ts +2 -0
  362. package/dist/scene/bind-renderer.svelte.js +22 -0
  363. package/dist/scene/index.d.ts +4 -0
  364. package/dist/scene/index.js +5 -0
  365. package/dist/scene/props.js +52 -0
  366. package/dist/scene/types.d.ts +26 -0
  367. package/dist/scene/types.js +1 -0
  368. package/dist/settings.d.ts +33 -11
  369. package/dist/settings.js +136 -51
  370. package/dist/spectral/Bands.svelte +231 -237
  371. package/dist/spectral/Bands.svelte.d.ts +3 -2
  372. package/dist/spectral/BandsAndDos.svelte +29 -29
  373. package/dist/spectral/BrillouinBandsDos.svelte +21 -29
  374. package/dist/spectral/Dos.svelte +75 -77
  375. package/dist/spectral/Dos.svelte.d.ts +2 -1
  376. package/dist/spectral/helpers.d.ts +9 -9
  377. package/dist/spectral/helpers.js +66 -70
  378. package/dist/state.svelte.d.ts +0 -7
  379. package/dist/state.svelte.js +5 -24
  380. package/dist/structure/Arrow.svelte +6 -21
  381. package/dist/structure/ArrowInstances.svelte +160 -0
  382. package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
  383. package/dist/structure/AtomLegend.svelte +115 -75
  384. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  385. package/dist/structure/Bond.svelte +31 -23
  386. package/dist/structure/CanvasTooltip.svelte +16 -3
  387. package/dist/structure/CellSelect.svelte +22 -29
  388. package/dist/structure/CellSelect.svelte.d.ts +2 -1
  389. package/dist/structure/Cylinder.svelte +24 -40
  390. package/dist/structure/InstancedAtoms.svelte +114 -0
  391. package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
  392. package/dist/structure/Lattice.svelte +85 -149
  393. package/dist/structure/SiteLabels.svelte +122 -0
  394. package/dist/structure/SiteLabels.svelte.d.ts +18 -0
  395. package/dist/structure/Structure.svelte +725 -735
  396. package/dist/structure/Structure.svelte.d.ts +8 -16
  397. package/dist/structure/StructureCarousel.svelte +630 -0
  398. package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
  399. package/dist/structure/StructureControls.svelte +298 -325
  400. package/dist/structure/StructureControls.svelte.d.ts +5 -3
  401. package/dist/structure/StructureExportPane.svelte +62 -168
  402. package/dist/structure/StructureExportPane.svelte.d.ts +4 -5
  403. package/dist/structure/StructureInfoPane.svelte +77 -69
  404. package/dist/structure/StructureInfoPane.svelte.d.ts +6 -6
  405. package/dist/structure/StructureScene.svelte +758 -600
  406. package/dist/structure/StructureScene.svelte.d.ts +24 -20
  407. package/dist/structure/StructureViewport.svelte +386 -0
  408. package/dist/structure/StructureViewport.svelte.d.ts +63 -0
  409. package/dist/structure/atom-label-placement.d.ts +18 -0
  410. package/dist/structure/atom-label-placement.js +115 -0
  411. package/dist/structure/atom-properties.d.ts +3 -1
  412. package/dist/structure/atom-properties.js +115 -54
  413. package/dist/structure/bond-order-perception.js +2 -4
  414. package/dist/structure/bonding.d.ts +12 -2
  415. package/dist/structure/bonding.js +172 -73
  416. package/dist/structure/edit-history.d.ts +6 -0
  417. package/dist/structure/edit-history.js +27 -0
  418. package/dist/structure/export.d.ts +25 -4
  419. package/dist/structure/export.js +103 -153
  420. package/dist/structure/format-detect.d.ts +1 -0
  421. package/dist/structure/format-detect.js +22 -0
  422. package/dist/structure/geometry.d.ts +9 -0
  423. package/dist/structure/geometry.js +27 -0
  424. package/dist/structure/index.d.ts +18 -1
  425. package/dist/structure/index.js +15 -2
  426. package/dist/structure/measure.d.ts +1 -1
  427. package/dist/structure/measure.js +6 -12
  428. package/dist/structure/parse.d.ts +5 -3
  429. package/dist/structure/parse.js +551 -567
  430. package/dist/structure/partial-occupancy.d.ts +0 -1
  431. package/dist/structure/partial-occupancy.js +5 -3
  432. package/dist/structure/pbc.d.ts +1 -1
  433. package/dist/structure/pbc.js +204 -51
  434. package/dist/structure/polyhedra.d.ts +40 -0
  435. package/dist/structure/polyhedra.js +587 -0
  436. package/dist/structure/site.d.ts +4 -0
  437. package/dist/structure/site.js +1 -0
  438. package/dist/structure/supercell.d.ts +1 -2
  439. package/dist/structure/supercell.js +10 -15
  440. package/dist/structure/validation.js +5 -6
  441. package/dist/symmetry/SymmetryElementControls.svelte +69 -0
  442. package/dist/symmetry/SymmetryElementControls.svelte.d.ts +9 -0
  443. package/dist/symmetry/SymmetryElements.svelte +350 -0
  444. package/dist/symmetry/SymmetryElements.svelte.d.ts +24 -0
  445. package/dist/symmetry/SymmetryStats.svelte +142 -49
  446. package/dist/symmetry/WyckoffTable.svelte +58 -16
  447. package/dist/symmetry/WyckoffTable.svelte.d.ts +3 -0
  448. package/dist/symmetry/cell-transform.js +8 -14
  449. package/dist/symmetry/index.d.ts +15 -4
  450. package/dist/symmetry/index.js +308 -81
  451. package/dist/symmetry/spacegroups.d.ts +5 -1
  452. package/dist/symmetry/spacegroups.js +18 -3
  453. package/dist/symmetry/symmetry-elements.d.ts +33 -0
  454. package/dist/symmetry/symmetry-elements.js +521 -0
  455. package/dist/symmetry/wyckoff-db.d.ts +9 -0
  456. package/dist/symmetry/wyckoff-db.js +87 -0
  457. package/dist/table/HeatmapTable.svelte +1104 -378
  458. package/dist/table/HeatmapTable.svelte.d.ts +12 -2
  459. package/dist/table/ToggleMenu.svelte +5 -12
  460. package/dist/table/index.d.ts +21 -6
  461. package/dist/table/index.js +34 -21
  462. package/dist/theme/ThemeControl.svelte +16 -8
  463. package/dist/theme/index.d.ts +1 -5
  464. package/dist/theme/index.js +4 -10
  465. package/dist/theme/themes.mjs +14 -7
  466. package/dist/tooltip/KCoords.svelte +4 -1
  467. package/dist/tooltip/TooltipContent.svelte +2 -5
  468. package/dist/trajectory/Trajectory.svelte +556 -352
  469. package/dist/trajectory/Trajectory.svelte.d.ts +10 -22
  470. package/dist/trajectory/TrajectoryError.svelte +11 -8
  471. package/dist/trajectory/TrajectoryExportPane.svelte +28 -54
  472. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +4 -5
  473. package/dist/trajectory/TrajectoryInfoPane.svelte +88 -99
  474. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +3 -2
  475. package/dist/trajectory/constants.js +6 -2
  476. package/dist/trajectory/extract.js +73 -71
  477. package/dist/trajectory/format-detect.d.ts +0 -1
  478. package/dist/trajectory/format-detect.js +13 -17
  479. package/dist/trajectory/frame-reader.d.ts +2 -1
  480. package/dist/trajectory/frame-reader.js +74 -136
  481. package/dist/trajectory/helpers.d.ts +12 -2
  482. package/dist/trajectory/helpers.js +68 -37
  483. package/dist/trajectory/index.d.ts +1 -0
  484. package/dist/trajectory/index.js +3 -0
  485. package/dist/trajectory/parse/ase.d.ts +9 -1
  486. package/dist/trajectory/parse/ase.js +47 -32
  487. package/dist/trajectory/parse/diagnostics.d.ts +3 -0
  488. package/dist/trajectory/parse/diagnostics.js +14 -0
  489. package/dist/trajectory/parse/h5-utils.d.ts +13 -0
  490. package/dist/trajectory/parse/h5-utils.js +109 -0
  491. package/dist/trajectory/parse/hdf5.d.ts +1 -1
  492. package/dist/trajectory/parse/hdf5.js +116 -106
  493. package/dist/trajectory/parse/index.d.ts +3 -4
  494. package/dist/trajectory/parse/index.js +68 -119
  495. package/dist/trajectory/parse/lammps.d.ts +0 -2
  496. package/dist/trajectory/parse/lammps.js +14 -16
  497. package/dist/trajectory/parse/pymatgen.d.ts +2 -0
  498. package/dist/trajectory/parse/pymatgen.js +74 -0
  499. package/dist/trajectory/parse/vasp.js +13 -9
  500. package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
  501. package/dist/trajectory/parse/vaspout-electronic.js +207 -0
  502. package/dist/trajectory/parse/vaspout-h5.d.ts +5 -0
  503. package/dist/trajectory/parse/vaspout-h5.js +284 -0
  504. package/dist/trajectory/parse/xyz.d.ts +9 -21
  505. package/dist/trajectory/parse/xyz.js +38 -39
  506. package/dist/trajectory/plotting.d.ts +8 -10
  507. package/dist/trajectory/plotting.js +102 -127
  508. package/dist/utils.d.ts +4 -0
  509. package/dist/utils.js +8 -1
  510. package/dist/xrd/XrdPlot.svelte +56 -85
  511. package/dist/xrd/broadening.d.ts +2 -1
  512. package/dist/xrd/broadening.js +2 -1
  513. package/dist/xrd/calc-xrd.js +8 -15
  514. package/dist/xrd/index.d.ts +2 -2
  515. package/dist/xrd/parse.d.ts +0 -1
  516. package/dist/xrd/parse.js +56 -73
  517. package/package.json +77 -36
  518. package/dist/api/mp.d.ts +0 -6
  519. package/dist/api/mp.js +0 -22
  520. package/dist/element/data.json +0 -11864
  521. package/dist/fermi-surface/marching-cubes.d.ts +0 -2
  522. package/dist/fermi-surface/marching-cubes.js +0 -2
  523. package/dist/plot/core/hover-lock.svelte.d.ts +0 -14
  524. package/dist/plot/core/hover-lock.svelte.js +0 -45
  525. package/dist/plot/sunburst/SunburstControls.svelte +0 -200
  526. package/dist/structure/label-placement.d.ts +0 -14
  527. package/dist/structure/label-placement.js +0 -72
@@ -3,6 +3,7 @@
3
3
  import EmptyState from '../EmptyState.svelte'
4
4
  import { format_num } from '../labels'
5
5
  import { sanitize_html } from '../sanitize'
6
+ import { is_plain_object } from '../utils'
6
7
  import { SettingsSection } from '../layout'
7
8
  import type { Vec2 } from '../math'
8
9
  import ScatterPlot from '../plot/scatter/ScatterPlot.svelte'
@@ -56,7 +57,7 @@
56
57
  path_mode?: PathMode
57
58
  band_type?: BandStructureType
58
59
  show_legend?: boolean
59
- x_positions?: Record<string, [number, number]>
60
+ x_positions?: Record<string, Vec2>
60
61
  reference_frequency?: number | null
61
62
  // Q-point index to highlight with a vertical line (synced from BZ k-path hover)
62
63
  highlighted_qpoint_index?: number | null
@@ -104,12 +105,12 @@
104
105
  }
105
106
  }
106
107
 
107
- if (typeof line_kwargs === `object` && line_kwargs !== null) {
108
+ if (is_plain_object(line_kwargs)) {
108
109
  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>
110
+ const mode_kwargs = line_kwargs[mode_key]
111
+ const source: Record<string, unknown> = is_plain_object(mode_kwargs)
112
+ ? mode_kwargs
113
+ : line_kwargs
113
114
  return {
114
115
  stroke: (source.stroke as string) ?? defaults.stroke,
115
116
  stroke_width: (source.stroke_width as number) ?? defaults.stroke_width,
@@ -142,25 +143,25 @@
142
143
  if (!band_structs) return {}
143
144
 
144
145
  // Detect single band structure by checking for characteristic fields
145
- // - pymatgen format: has @class or @module markers (may also have branches)
146
146
  // - matterviz format: has qpoints + branches (no pymatgen markers)
147
- const has_qpoints = `qpoints` in band_structs &&
147
+ const has_qpoints =
148
+ `qpoints` in band_structs &&
148
149
  Array.isArray(band_structs.qpoints) &&
149
150
  band_structs.qpoints.length > 0
150
- const has_kpoints = `kpoints` in band_structs &&
151
+ const has_kpoints =
152
+ `kpoints` in band_structs &&
151
153
  Array.isArray(band_structs.kpoints) &&
152
154
  band_structs.kpoints.length > 0
153
155
  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_frequencies_cm =
157
+ `frequencies_cm` in band_structs && Array.isArray(band_structs.frequencies_cm)
156
158
  const has_branches = `branches` in band_structs
157
159
  // Pymatgen structures have explicit class/module markers
158
160
  const is_pymatgen = `@class` in band_structs || `@module` in band_structs
159
161
 
160
162
  // 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)
163
+ const is_pymatgen_single =
164
+ is_pymatgen && (has_qpoints || has_kpoints) && (has_bands || has_frequencies_cm)
164
165
  // Matterviz single: has qpoints + branches but NO pymatgen markers
165
166
  const is_matterviz_single = !is_pymatgen && has_qpoints && has_branches
166
167
  const is_single = is_matterviz_single || is_pymatgen_single
@@ -185,8 +186,11 @@
185
186
  if (!band_structs) return `phonon`
186
187
 
187
188
  // 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
189
+ const is_single =
190
+ `@class` in band_structs ||
191
+ `@module` in band_structs ||
192
+ `kpoints` in band_structs ||
193
+ `qpoints` in band_structs
190
194
  const source = (is_single ? band_structs : Object.values(band_structs)[0]) as
191
195
  | Record<string, unknown>
192
196
  | undefined
@@ -195,12 +199,11 @@
195
199
  // Electronic: has kpoints, BandStructure* class (not Phonon*), or electronic_structure module
196
200
  const py_class_name = String(source[`@class`] ?? ``)
197
201
  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
+ (`kpoints` in source && Array.isArray(source.kpoints) && source.kpoints.length > 0) ||
203
+ (py_class_name.startsWith(`BandStructure`) && !py_class_name.startsWith(`Phonon`)) ||
202
204
  String(source[`@module`] ?? ``).includes(`electronic_structure`)
203
- ) return `electronic`
205
+ )
206
+ return `electronic`
204
207
 
205
208
  return `phonon`
206
209
  })
@@ -211,16 +214,15 @@
211
214
  if (detected_band_type !== `electronic`) return undefined
212
215
 
213
216
  // 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 source =
218
+ `efermi` in (band_structs as object) ? band_structs : Object.values(band_structs)[0]
217
219
  const efermi = (source as Record<string, unknown>)?.efermi
218
220
  return typeof efermi === `number` ? efermi : undefined
219
221
  })
220
222
 
221
223
  let effective_spin_mode = $derived.by((): BandsSpinMode => {
222
224
  if (detected_band_type !== `electronic`) return null
223
- return (band_spin_mode === `up_only` || band_spin_mode === `down_only`)
225
+ return band_spin_mode === `up_only` || band_spin_mode === `down_only`
224
226
  ? band_spin_mode
225
227
  : `overlay`
226
228
  })
@@ -251,13 +253,15 @@
251
253
  let common_segment_keys = $derived.by(() =>
252
254
  all_segment_keys.filter(
253
255
  (segment_key) => all_segments[segment_key].length === num_structures,
254
- )
256
+ ),
255
257
  )
256
258
  let empty_state_attrs = $derived.by(() => {
257
259
  const attrs: Record<string, Dom_attr_value> = {}
258
260
  for (const [attr_name, attr_value] of Object.entries(rest)) {
259
261
  if (
260
- (attr_name === `class` || attr_name === `style` || attr_name === `role` ||
262
+ (attr_name === `class` ||
263
+ attr_name === `style` ||
264
+ attr_name === `role` ||
261
265
  attr_name.startsWith(`aria-`)) &&
262
266
  is_dom_attr_value(attr_value)
263
267
  ) {
@@ -287,7 +291,7 @@
287
291
  x_positions = {}
288
292
  return
289
293
  }
290
- const positions: Record<string, [number, number]> = {}
294
+ const positions: Record<string, Vec2> = {}
291
295
  let current_x = 0
292
296
 
293
297
  // Preserve physical path order using the first available structure
@@ -298,8 +302,7 @@
298
302
  }
299
303
  const ordered_segments = helpers.get_ordered_segments(canonical, segments_to_plot)
300
304
 
301
- for (let seg_idx = 0; seg_idx < ordered_segments.length; seg_idx++) {
302
- const segment_key = ordered_segments[seg_idx]
305
+ for (const segment_key of ordered_segments) {
303
306
  if (positions[segment_key]) continue
304
307
 
305
308
  const [start_label, end_label] = segment_key.split(`_`)
@@ -321,8 +324,8 @@
321
324
  // Place at same x position as current, no advancement
322
325
  positions[segment_key] = [current_x, current_x]
323
326
  } else {
324
- const segment_len = bs.distance[matching_branch.end_index] -
325
- bs.distance[matching_branch.start_index]
327
+ const segment_len =
328
+ bs.distance[matching_branch.end_index] - bs.distance[matching_branch.start_index]
326
329
  positions[segment_key] = [current_x, current_x + segment_len]
327
330
  current_x += segment_len
328
331
  }
@@ -335,130 +338,130 @@
335
338
  })
336
339
 
337
340
  // 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
- }
341
+ let { series_data, max_abs_slope } = $derived.by(
342
+ (): {
343
+ series_data: DataSeries[]
344
+ max_abs_slope: number
345
+ } => {
346
+ if (Object.keys(band_structs_dict).length === 0 || segments_to_plot.size === 0) {
347
+ return { series_data: [], max_abs_slope: 1 }
348
+ }
345
349
 
346
- const all_series: DataSeries[] = []
347
- let max_slope = 0
350
+ const all_series: DataSeries[] = []
351
+ let max_slope = 0
348
352
 
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
- : []
353
+ for (const [bs_idx, [label, bs]] of Object.entries(band_structs_dict).entries()) {
354
+ const color = PLOT_COLORS[bs_idx % PLOT_COLORS.length]
355
+ const structure_label = label || `Structure ${bs_idx + 1}`
356
+ const gamma_indices =
357
+ detected_band_type === `phonon` ? helpers.find_gamma_indices(bs) : []
355
358
 
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
359
+ for (const branch of bs.branches) {
360
+ const start_idx = branch.start_index
361
+ const end_idx = branch.end_index + 1
362
+ const start_label = bs.qpoints[start_idx]?.label ?? undefined
363
+ const end_label = bs.qpoints[end_idx - 1]?.label ?? undefined
364
+ const segment_key = helpers.get_segment_key(start_label, end_label)
364
365
 
365
- // Skip discontinuous segments (consecutive labeled points)
366
- const is_discontinuity = branch.end_index - branch.start_index === 1
367
- if (is_discontinuity) continue
366
+ if (!segments_to_plot.has(segment_key)) continue
368
367
 
369
- const [x_start, x_end] = x_positions?.[segment_key] || [0, 1]
368
+ // Skip discontinuous segments (consecutive labeled points)
369
+ const is_discontinuity = branch.end_index - branch.start_index === 1
370
+ if (is_discontinuity) continue
370
371
 
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
- )
372
+ const [x_start, x_end] = x_positions?.[segment_key] || [0, 1]
378
373
 
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),
374
+ // Scale distances for this segment
375
+ const segment_distances = bs.distance.slice(start_idx, end_idx)
376
+ const scaled_distances = helpers.scale_segment_distances(
377
+ segment_distances,
378
+ x_start,
379
+ x_end,
383
380
  )
384
- const is_acoustic = helpers.classify_acoustic(bs, band_idx, gamma_indices)
385
381
 
386
- const line_style_up = get_line_style(
387
- color,
388
- is_acoustic === true,
389
- frequencies,
390
- band_idx,
391
- )
382
+ // Create series for each band (and spin channel for electronic structures)
383
+ for (let band_idx = 0; band_idx < bs.nb_bands; band_idx++) {
384
+ const frequencies = convert_band_values(
385
+ bs.bands[band_idx].slice(start_idx, end_idx),
386
+ )
387
+ const is_acoustic = helpers.classify_acoustic(bs, band_idx, gamma_indices)
392
388
 
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
389
+ const line_style_up = get_line_style(
390
+ color,
391
+ is_acoustic === true,
392
+ frequencies,
393
+ band_idx,
394
+ )
397
395
 
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))
396
+ const spin_down_band = bs.spin_down_bands?.[band_idx]
397
+ const has_spin_down_channel =
398
+ detected_band_type === `electronic` &&
399
+ Array.isArray(spin_down_band) &&
400
+ spin_down_band.length >= end_idx
401
+
402
+ const track_max_slope = (meta: helpers.BandPointMeta[]) => {
403
+ for (const pt of meta) {
404
+ if (typeof pt.slope === `number` && Number.isFinite(pt.slope)) {
405
+ max_slope = Math.max(max_slope, Math.abs(pt.slope))
406
+ }
402
407
  }
403
408
  }
404
- }
405
409
 
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
- }
410
+ if (effective_spin_mode !== `down_only`) {
411
+ const meta = helpers.build_point_metadata({
412
+ x_vals: scaled_distances,
413
+ y_vals: frequencies,
414
+ band_idx,
415
+ spin: `up`,
416
+ is_acoustic,
417
+ bs,
418
+ start_idx,
419
+ })
420
+ track_max_slope(meta)
421
+ all_series.push({
422
+ x: scaled_distances,
423
+ y: frequencies,
424
+ markers: `line`,
425
+ label: has_spin_down_channel ? `${structure_label} (↑)` : structure_label,
426
+ line_style: line_style_up,
427
+ metadata: meta,
428
+ })
429
+ }
428
430
 
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
- })
431
+ if (has_spin_down_channel && effective_spin_mode !== `up_only`) {
432
+ const spin_down_frequencies = convert_band_values(
433
+ spin_down_band.slice(start_idx, end_idx),
434
+ )
435
+ const meta = helpers.build_point_metadata({
436
+ x_vals: scaled_distances,
437
+ y_vals: spin_down_frequencies,
438
+ band_idx,
439
+ spin: `down`,
440
+ is_acoustic,
441
+ bs,
442
+ start_idx,
443
+ })
444
+ track_max_slope(meta)
445
+ all_series.push({
446
+ x: scaled_distances,
447
+ y: spin_down_frequencies,
448
+ markers: `line`,
449
+ label: `${structure_label} (↓)`,
450
+ line_style: {
451
+ ...line_style_up,
452
+ line_dash: `4,2`,
453
+ stroke_width: Math.max(1, line_style_up.stroke_width - 0.1),
454
+ },
455
+ metadata: meta,
456
+ })
457
+ }
455
458
  }
456
459
  }
457
460
  }
458
- }
459
461
 
460
- return { series_data: all_series, max_abs_slope: max_slope || 1 }
461
- })
462
+ return { series_data: all_series, max_abs_slope: max_slope || 1 }
463
+ },
464
+ )
462
465
 
463
466
  // Compute ribbon data for bands with width information
464
467
  let ribbon_data = $derived.by((): RibbonData[] => {
@@ -508,9 +511,7 @@
508
511
  // Skip if all widths are zero or missing
509
512
  if (width_values.every((wv) => !wv || wv <= 0)) continue
510
513
 
511
- const y_values = convert_band_values(
512
- bs.bands[band_idx].slice(start_idx, end_idx),
513
- )
514
+ const y_values = convert_band_values(bs.bands[band_idx].slice(start_idx, end_idx))
514
515
 
515
516
  all_ribbons.push({
516
517
  x_values: scaled_distances,
@@ -547,9 +548,7 @@
547
548
  .sort(([, [a]], [, [b]]) => a - b)
548
549
  .forEach(([segment_key, [x_start, x_end]]) => {
549
550
  const [start_lbl, end_lbl] = segment_key.split(`_`)
550
- const pretty_start = start_lbl !== `null`
551
- ? helpers.pretty_sym_point(start_lbl)
552
- : ``
551
+ const pretty_start = start_lbl !== `null` ? helpers.pretty_sym_point(start_lbl) : ``
553
552
  const pretty_end = end_lbl !== `null` ? helpers.pretty_sym_point(end_lbl) : ``
554
553
 
555
554
  // Check if this is a discontinuity (zero-length segment)
@@ -568,10 +567,7 @@
568
567
 
569
568
  // Merge labels at same position with pipe separator
570
569
  return Object.fromEntries(
571
- Array.from(tick_map.entries()).map(([pos, labels]) => [
572
- pos,
573
- labels.join(` | `),
574
- ]),
570
+ Array.from(tick_map.entries()).map(([pos, labels]) => [pos, labels.join(` | `)]),
575
571
  )
576
572
  })
577
573
 
@@ -587,16 +583,17 @@
587
583
  ...(bs.spin_down_bands?.flat() ?? []),
588
584
  ])
589
585
  // 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
586
+ const display_values =
587
+ detected_band_type === `phonon` ? convert_band_values(all_freqs) : all_freqs
593
588
  if (display_values.length === 0) return undefined
594
589
  const finite = display_values.filter(Number.isFinite)
595
590
  if (finite.length === 0) return undefined
596
- let min_val = Math.min(...finite), max_val = Math.max(...finite)
591
+ let min_val = Math.min(...finite),
592
+ max_val = Math.max(...finite)
597
593
  if (
598
594
  // clamp phonon min to 0 if negatives are noise
599
- detected_band_type === `phonon` && min_val < 0 &&
595
+ detected_band_type === `phonon` &&
596
+ min_val < 0 &&
600
597
  helpers.negative_fraction(finite) < helpers.IMAGINARY_MODE_NOISE_THRESHOLD
601
598
  ) {
602
599
  min_val = 0
@@ -630,48 +627,47 @@
630
627
  !shade_imaginary_modes ||
631
628
  !y_range ||
632
629
  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
- }]
630
+ )
631
+ return []
632
+ return [
633
+ {
634
+ lower: y_range[0],
635
+ upper: 0,
636
+ fill: `var(--bands-imaginary-region-color, light-dark(#f8d7da, #5a1a1f))`,
637
+ fill_opacity: 0.2,
638
+ label: `Imaginary modes`,
639
+ show_in_legend: false,
640
+ z_index: `below-lines`,
641
+ },
642
+ ]
643
643
  })
644
644
 
645
645
  let custom_highlight_regions = $derived.by((): FillRegion[] =>
646
646
  (highlight_regions ?? [])
647
- .filter((region) =>
648
- Number.isFinite(region.y_min) && Number.isFinite(region.y_max)
649
- )
647
+ .filter((region) => Number.isFinite(region.y_min) && Number.isFinite(region.y_max))
650
648
  .map((region) => ({
651
649
  lower: Math.min(region.y_min, region.y_max),
652
650
  upper: Math.max(region.y_min, region.y_max),
653
- fill: region.color ??
654
- `var(--bands-highlight-region-color, light-dark(#f6e8c3, #4d3f20))`,
651
+ fill:
652
+ region.color ?? `var(--bands-highlight-region-color, light-dark(#f6e8c3, #4d3f20))`,
655
653
  fill_opacity: region.opacity ?? 0.2,
656
654
  label: region.label,
657
655
  show_in_legend: Boolean(region.label),
658
656
  z_index: `below-lines` as const,
659
- }))
657
+ })),
660
658
  )
661
659
 
662
- let fill_regions = $derived([
663
- ...imaginary_mode_region,
664
- ...custom_highlight_regions,
665
- ])
660
+ let fill_regions = $derived([...imaginary_mode_region, ...custom_highlight_regions])
666
661
 
667
662
  let electronic_gap_annotation = $derived.by(() => {
668
663
  if (
669
664
  !show_gap_annotation ||
670
665
  detected_band_type !== `electronic` ||
671
666
  effective_fermi_level === undefined
672
- ) return null
667
+ )
668
+ return null
673
669
  const all_energies = series_data.flatMap((series_item) =>
674
- series_item.y.filter(Number.isFinite)
670
+ series_item.y.filter(Number.isFinite),
675
671
  )
676
672
  const occupied = all_energies.filter((energy) => energy <= effective_fermi_level)
677
673
  const unoccupied = all_energies.filter((energy) => energy > effective_fermi_level)
@@ -700,11 +696,14 @@
700
696
  let highlight_x = $derived.by(() => {
701
697
  if (highlighted_qpoint_index == null) return null
702
698
  const bs = Object.values(band_structs_dict)[0]
703
- return bs ? helpers.qpoint_x_position(bs, highlighted_qpoint_index, x_positions ?? {}) : null
699
+ return bs
700
+ ? helpers.qpoint_x_position(bs, highlighted_qpoint_index, x_positions ?? {})
701
+ : null
704
702
  })
705
703
 
706
704
  let display = $state({ x_grid: false, y_grid: true, y_zero_line: true })
707
705
  </script>
706
+
708
707
  {#if has_series && !is_strict_path_error}
709
708
  <ScatterPlot
710
709
  {id}
@@ -727,32 +726,37 @@
727
726
  >
728
727
  {#snippet tooltip({ x, y, y_formatted, label, metadata })}
729
728
  {@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}
729
+ {@const [, y_label, y_unit] = y_label_full.match(/^(.+?)\s*\(([^)]+)\)$/) ?? [
730
+ ,
731
+ y_label_full,
732
+ ``,
733
+ ]}
734
+ {@const segment = Object.entries(x_positions ?? {}).find(
735
+ ([, [start, end]]) => x >= start && x <= end,
736
+ )}
737
+ {@const path =
738
+ segment?.[0]
739
+ .split(`_`)
740
+ .map((lbl) => (lbl !== `null` ? helpers.pretty_sym_point(lbl) : ``))
741
+ .filter(Boolean)
742
+ .join(` → `) || null}
738
743
  {@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>}
744
+ band_idx,
745
+ spin,
746
+ is_acoustic,
747
+ nb_bands,
748
+ frac_coords,
749
+ qpoint_label,
750
+ band_width,
751
+ slope,
752
+ } = (metadata ?? {}) as Partial<helpers.BandPointMeta>}
748
753
  {@const num_structs = Object.keys(band_structs_dict).length}
749
754
  {#if num_structs > 1 && label}<strong>{label}</strong><br />{/if}
750
- {@html sanitize_html(y_label || `Value`)}: {y_formatted}{y_unit ? ` ${y_unit}` : ``}<br />
755
+ {@html sanitize_html(y_label || `Value`)}: {y_formatted}{y_unit ? ` ${y_unit}` : ``}<br
756
+ />
751
757
  {#if path}Path: {path}<br />{/if}
752
758
  {#if typeof band_idx === `number`}
753
- Band: {band_idx + 1}{#if typeof nb_bands === `number`}&thinsp;/&thinsp;{
754
- nb_bands
755
- }{/if}
759
+ Band: {band_idx + 1}{#if typeof nb_bands === `number`}&thinsp;/&thinsp;{nb_bands}{/if}
756
760
  {#if typeof is_acoustic === `boolean`}
757
761
  ({is_acoustic ? `acoustic` : `optical`})
758
762
  {:else if detected_band_type === `electronic` && effective_fermi_level !== undefined}
@@ -766,9 +770,9 @@
766
770
  <br />At: {helpers.pretty_sym_point(qpoint_label)}
767
771
  {/if}
768
772
  {#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
- }]
773
+ <br />{detected_band_type === `electronic` ? `k` : `q`}: [{frac_coords
774
+ .map((coord: number) => format_num(coord, `.3f`))
775
+ .join(`, `)}]
772
776
  {/if}
773
777
  {#if typeof band_width === `number` && band_width > 0}
774
778
  <br />Projection: {format_num(band_width, `.3~g`)}
@@ -853,19 +857,16 @@
853
857
 
854
858
  {#snippet user_content({ height, x_scale_fn, y_scale_fn, pad })}
855
859
  <!-- 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
+ {#each ribbon_data as ribbon (`${ribbon.structure_label}-${ribbon.segment_key}-${ribbon.band_idx}`)}
860
861
  {@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
- )}
862
+ ribbon.x_values,
863
+ ribbon.y_values,
864
+ ribbon.width_values,
865
+ x_scale_fn,
866
+ y_scale_fn,
867
+ ribbon.max_width,
868
+ ribbon.scale,
869
+ )}
869
870
  {#if path_d}
870
871
  <path
871
872
  d={path_d}
@@ -878,12 +879,10 @@
878
879
  {/each}
879
880
 
880
881
  <!-- 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
- }
882
+ {#each Object.keys(x_axis_ticks)
883
+ .map(Number)
884
+ .map((tick) => x_scale_fn(tick))
885
+ .filter(Number.isFinite) as scaled_x (scaled_x)}
887
886
  <line
888
887
  x1={scaled_x}
889
888
  x2={scaled_x}
@@ -913,19 +912,22 @@
913
912
  {/if}
914
913
 
915
914
  <!-- 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)}
915
+ {@const fermi_y =
916
+ effective_fermi_level !== undefined ? y_scale_fn(effective_fermi_level) : NaN}
917
+ {@const bands_x_end = x_scale_fn(
918
+ Object.values(x_positions ?? {})
919
+ .flat()
920
+ .at(-1) ?? 1,
921
+ )}
920
922
  {@const gap_data = electronic_gap_annotation}
921
923
  {@const vbm_y = gap_data ? y_scale_fn(gap_data.vbm) : NaN}
922
924
  {@const cbm_y = gap_data ? y_scale_fn(gap_data.cbm) : NaN}
923
925
  {@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_needs_offset =
927
+ Number.isFinite(gap_mid_y) && Math.abs(fermi_y - gap_mid_y) < 16}
926
928
  {@const ef_label_y = ef_needs_offset
927
- ? gap_mid_y + (fermi_y >= gap_mid_y ? 16 : -16)
928
- : fermi_y}
929
+ ? gap_mid_y + (fermi_y >= gap_mid_y ? 16 : -16)
930
+ : fermi_y}
929
931
 
930
932
  <!-- Fermi level line for electronic bands -->
931
933
  {#if Number.isFinite(fermi_y) && Number.isFinite(bands_x_end)}
@@ -965,9 +967,8 @@
965
967
  {/if}
966
968
 
967
969
  <!-- Reference frequency horizontal line -->
968
- {@const ref_freq = reference_frequency != null
969
- ? convert_band_values([reference_frequency])[0]
970
- : NaN}
970
+ {@const ref_freq =
971
+ reference_frequency != null ? convert_band_values([reference_frequency])[0] : NaN}
971
972
  {@const ref_y = Number.isFinite(ref_freq) ? y_scale_fn(ref_freq) : NaN}
972
973
  {#if Number.isFinite(ref_y) && Number.isFinite(bands_x_end)}
973
974
  <line
@@ -983,15 +984,8 @@
983
984
  {/if}
984
985
 
985
986
  <!-- 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
- }
987
+ {#if gap_data && Number.isFinite(vbm_y) && Number.isFinite(cbm_y) && Number.isFinite(bands_x_end)}
988
+ {#each [[vbm_y, `var(--bands-gap-vbm-color, light-dark(#1f77b4, #7db7ff))`], [cbm_y, `var(--bands-gap-cbm-color, light-dark(#2ca02c, #7ddc7d))`]] as [number, string][] as [edge_y, color] (edge_y)}
995
989
  <line
996
990
  x1={pad.l}
997
991
  x2={bands_x_end + 3}