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