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
@@ -1,17 +1,19 @@
1
1
  <script lang="ts">
2
2
  import Icon from '../Icon.svelte'
3
+ import type { HTMLAttributes } from 'svelte/elements'
3
4
 
4
5
  let {
5
6
  visible = false,
6
- message = `Drop JSON file to load phase diagram data`,
7
+ message = `Drop file to load`,
8
+ ...rest
7
9
  }: {
8
10
  visible?: boolean
9
11
  message?: string
10
- } = $props()
12
+ } & HTMLAttributes<HTMLDivElement> = $props()
11
13
  </script>
12
14
 
13
15
  {#if visible}
14
- <div class="drag-overlay">
16
+ <div {...rest} class={[`drag-overlay`, rest.class]}>
15
17
  <div class="drag-message">
16
18
  <Icon icon="Info" />
17
19
  <span>{message}</span>
@@ -1,7 +1,8 @@
1
+ import type { HTMLAttributes } from 'svelte/elements';
1
2
  type $$ComponentProps = {
2
3
  visible?: boolean;
3
4
  message?: string;
4
- };
5
+ } & HTMLAttributes<HTMLDivElement>;
5
6
  declare const DragOverlay: import("svelte").Component<$$ComponentProps, {}, "">;
6
7
  type DragOverlay = ReturnType<typeof DragOverlay>;
7
8
  export default DragOverlay;
@@ -1,7 +1,12 @@
1
1
  <script lang="ts">
2
2
  import type { HTMLAttributes } from 'svelte/elements'
3
3
 
4
- let { message = $bindable(), type = `info`, dismissible = false, ...rest }: {
4
+ let {
5
+ message = $bindable(),
6
+ type = `info`,
7
+ dismissible = false,
8
+ ...rest
9
+ }: {
5
10
  message?: string
6
11
  type?: `info` | `error` | `warning`
7
12
  dismissible?: boolean
@@ -17,16 +22,18 @@
17
22
  >
18
23
  {message}
19
24
  {#if dismissible}
20
- <button onclick={() => (message = undefined)} aria-label="Dismiss message">
21
-
22
- </button>
25
+ <button onclick={() => (message = undefined)} aria-label="Dismiss message"> ✕ </button>
23
26
  {/if}
24
27
  </div>
25
28
  {/if}
26
29
 
27
30
  <style>
28
31
  .status-message {
32
+ display: flex;
33
+ align-items: center;
34
+ gap: 1em;
29
35
  border-radius: var(--border-radius, 3pt);
36
+ backdrop-filter: blur(8px);
30
37
  &.info {
31
38
  border: 2px dashed var(--text-color-muted, #ccc);
32
39
  background: transparent;
@@ -47,11 +54,17 @@
47
54
  }
48
55
  }
49
56
  button {
50
- margin-left: 1em;
51
- padding: 0.2em 0.5em;
57
+ flex: none;
58
+ display: grid;
59
+ place-items: center;
60
+ margin-left: auto;
61
+ box-sizing: border-box;
62
+ width: 1.6em;
63
+ height: 1.6em;
64
+ padding: 0;
52
65
  background: var(--btn-bg, #ddd);
53
66
  border: 1px solid var(--border-color, #bbb);
54
- border-radius: var(--border-radius, 3pt);
67
+ border-radius: 50%;
55
68
  cursor: pointer;
56
69
  &:hover {
57
70
  background: var(--btn-bg-hover, #ccc);
@@ -86,7 +86,10 @@
86
86
  const isolines = slice_data?.isolines
87
87
  if (!isolines?.length) return { min: [-1, -1], max: [1, 1] }
88
88
 
89
- let xmin = Infinity, xmax = -Infinity, ymin = Infinity, ymax = -Infinity
89
+ let xmin = Infinity,
90
+ xmax = -Infinity,
91
+ ymin = Infinity,
92
+ ymax = -Infinity
90
93
  for (const iso of isolines) {
91
94
  for (const pt of iso.points_2d) {
92
95
  if (pt[0] < xmin) xmin = pt[0]
@@ -97,13 +100,14 @@
97
100
  }
98
101
  if (!isFinite(xmin)) return { min: [-1, -1], max: [1, 1] }
99
102
 
100
- const pad = 0.1, rx = xmax - xmin || 1, ry = ymax - ymin || 1
103
+ const pad = 0.1,
104
+ rx = xmax - xmin || 1,
105
+ ry = ymax - ymin || 1
101
106
  return {
102
107
  min: [xmin - rx * pad, ymin - ry * pad],
103
108
  max: [xmax + rx * pad, ymax + ry * pad],
104
109
  }
105
110
  })
106
-
107
111
  function toggle_band(series_idx: number) {
108
112
  const band = slice_data?.isolines[series_idx]?.band_index
109
113
  if (band === undefined) return
@@ -114,9 +118,7 @@
114
118
  function isolate_band(series_idx: number) {
115
119
  const band = slice_data?.isolines[series_idx]?.band_index
116
120
  if (band === undefined) return
117
- const all_bands = [
118
- ...new Set(slice_data?.isolines.map((iso) => iso.band_index)),
119
- ]
121
+ const all_bands = [...new Set(slice_data?.isolines.map((iso) => iso.band_index))]
120
122
  const is_solo = all_bands.every((bid) => bid === band || hidden_bands.has(bid))
121
123
  hidden_bands.clear()
122
124
  if (!is_solo) {
@@ -127,8 +129,7 @@
127
129
  }
128
130
 
129
131
  // Returns null if SVG not found, making export failures explicit
130
- const export_svg = (): string | null =>
131
- wrapper?.querySelector(`svg`)?.outerHTML ?? null
132
+ const export_svg = (): string | null => wrapper?.querySelector(`svg`)?.outerHTML ?? null
132
133
  </script>
133
134
 
134
135
  <ScatterPlot
@@ -143,16 +144,16 @@
143
144
  controls={{ show: false }}
144
145
  fullscreen_toggle={false}
145
146
  legend={show_legend && series.length > 0
146
- ? {
147
- on_toggle: toggle_band,
148
- on_double_click: isolate_band,
149
- draggable: false,
150
- // pin bottom-right so it clears the top-left title/controls overlay (e.g. in the demo)
151
- style: `left: auto; top: auto; right: 8px; bottom: 8px`,
152
- }
153
- : null}
147
+ ? {
148
+ on_toggle: toggle_band,
149
+ on_double_click: isolate_band,
150
+ draggable: false,
151
+ // pin bottom-right so it clears the top-left title/controls overlay (e.g. in the demo)
152
+ style: `left: auto; top: auto; right: 8px; bottom: 8px`,
153
+ }
154
+ : null}
154
155
  padding={{ t: 5, b: 5, l: 5, r: 5 }}
155
- class="fermi-slice {rest.class ?? ``}"
156
+ class={[`fermi-slice`, rest.class]}
156
157
  style={rest.style}
157
158
  >
158
159
  {#snippet user_content({ x_scale_fn, y_scale_fn, pad, width, height })}
@@ -192,6 +193,8 @@
192
193
  }
193
194
  .fermi-label {
194
195
  fill: var(--fermi-surface-axis-color, #888);
195
- font: 12px system-ui, sans-serif;
196
+ font:
197
+ 12px system-ui,
198
+ sans-serif;
196
199
  }
197
200
  </style>
@@ -1,14 +1,13 @@
1
1
  <script lang="ts">
2
2
  import type { BrillouinZoneData } from '../brillouin'
3
3
  import { compute_brillouin_zone, reciprocal_lattice } from '../brillouin'
4
- import type { ShowControlsProp } from '../controls'
5
- import { normalize_show_controls } from '../controls'
4
+ import { normalize_show_controls, type ShowControlsProp } from '../controls'
6
5
  import EmptyState from '../EmptyState.svelte'
7
6
  import { StatusMessage } from '../feedback'
8
7
  import Spinner from '../feedback/Spinner.svelte'
9
- import Icon from '../Icon.svelte'
10
- import { create_file_drop_handler, load_from_url } from '../io'
11
- import { set_fullscreen_bg, toggle_fullscreen } from '../layout'
8
+ import { create_file_drop_handler, drag_over_handlers, load_from_url } from '../io'
9
+ import { type FullscreenToggleProp, toggle_fullscreen, ViewerChrome } from '../layout'
10
+ import { sync_fullscreen } from '../layout/fullscreen.svelte'
12
11
  import { PlotTooltip } from '../plot'
13
12
  import type { CameraProjection } from '../settings'
14
13
  import { DEFAULTS } from '../settings'
@@ -16,7 +15,6 @@
16
15
  import { Canvas } from '@threlte/core'
17
16
  import type { ComponentProps, Snippet } from 'svelte'
18
17
  import { untrack } from 'svelte'
19
- import { tooltip } from 'svelte-multiselect/attachments'
20
18
  import type { HTMLAttributes } from 'svelte/elements'
21
19
  import type { Camera, Scene } from 'three'
22
20
  import { detect_irreducible_bz, extract_fermi_surface } from './compute'
@@ -91,6 +89,7 @@
91
89
  on_error,
92
90
  on_fullscreen_change,
93
91
  on_mu_change,
92
+ on_point_hover,
94
93
  on_hover,
95
94
  ...rest
96
95
  }: {
@@ -117,15 +116,13 @@
117
116
  clip_flip?: boolean
118
117
  interpolation_factor?: number
119
118
  camera_projection?: CameraProjection
120
- /**
121
- * Controls visibility configuration.
122
- * - 'always': controls always visible
123
- * - 'hover': controls visible on component hover (default)
124
- * - 'never': controls never visible
125
- * - object: { mode, hidden, style } for fine-grained control
126
- *
127
- * Control names: 'filename', 'fullscreen', 'controls'
128
- */
119
+ // Controls visibility configuration.
120
+ // - 'always': controls always visible
121
+ // - 'hover': controls visible on component hover (default)
122
+ // - 'never': controls never visible
123
+ // - object: { mode, hidden, style } for fine-grained control
124
+ //
125
+ // Control names: 'filename', 'fullscreen', 'controls'
129
126
  show_controls?: ShowControlsProp
130
127
  fullscreen?: boolean
131
128
  width?: number
@@ -134,20 +131,20 @@
134
131
  hovered?: boolean
135
132
  dragover?: boolean
136
133
  allow_file_drop?: boolean
137
- fullscreen_toggle?: Snippet<[{ fullscreen: boolean }]> | boolean
134
+ fullscreen_toggle?: FullscreenToggleProp
138
135
  data_url?: string
139
136
  spinner_props?: ComponentProps<typeof Spinner>
140
137
  loading?: boolean
141
138
  error_msg?: string
142
- children?: Snippet<
143
- [{ fermi_data?: FermiSurfaceData; bz_data?: BrillouinZoneData }]
144
- >
139
+ children?: Snippet<[{ fermi_data?: FermiSurfaceData; bz_data?: BrillouinZoneData }]>
145
140
  on_file_drop?: (filename: string) => void
146
141
  on_file_load?: (data: FermiFileLoadData) => void
147
142
  on_error?: (data: FermiErrorData) => void
148
143
  on_fullscreen_change?: (data: FermiHandlerData) => void
149
144
  on_mu_change?: (mu: number) => void
150
145
  tooltip_config?: Snippet<[{ hover_data: FermiHoverData }]> | FermiTooltipConfig
146
+ on_point_hover?: (data: FermiHoverData | null) => void
147
+ // Deprecated alias for on_point_hover (honored when on_point_hover is unset)
151
148
  on_hover?: (data: FermiHoverData | null) => void
152
149
  } & HTMLAttributes<HTMLDivElement> = $props()
153
150
 
@@ -157,9 +154,16 @@
157
154
  let recompute_job_id = 0 // monotonic counter to track latest recompute call
158
155
  let hover_data = $state<FermiHoverData | null>(null)
159
156
 
160
- // Call on_hover callback when hover_data changes
157
+ // Call on_point_hover callback when hover_data changes (on_hover is a deprecated alias)
158
+ let warned_deprecated_on_hover = false
161
159
  $effect(() => {
162
- on_hover?.(hover_data)
160
+ if (on_hover && !on_point_hover && !warned_deprecated_on_hover) {
161
+ warned_deprecated_on_hover = true
162
+ console.warn(
163
+ `FermiSurface: the on_hover prop was renamed to on_point_hover; the alias will be removed in a future release`,
164
+ )
165
+ }
166
+ ;(on_point_hover ?? on_hover)?.(hover_data)
163
167
  })
164
168
 
165
169
  let controls_config = $derived(normalize_show_controls(show_controls))
@@ -167,20 +171,15 @@
167
171
  // Yield to browser so spinner can render before heavy computation
168
172
  const tick = () =>
169
173
  new Promise<void>((resolve) =>
170
- requestAnimationFrame(() => requestAnimationFrame(() => resolve()))
174
+ requestAnimationFrame(() => requestAnimationFrame(() => resolve())),
171
175
  )
172
176
 
173
177
  // Parse and load Fermi surface from content (async for UI responsiveness)
174
- async function parse_fermi_content(
175
- content: string | ArrayBuffer,
176
- filename: string,
177
- ) {
178
- const text = content instanceof ArrayBuffer
179
- ? new TextDecoder().decode(content)
180
- : content
178
+ async function parse_fermi_content(content: string | ArrayBuffer, filename: string) {
179
+ const text = content instanceof ArrayBuffer ? new TextDecoder().decode(content) : content
181
180
 
181
+ // parse_fermi_file throws a descriptive error when parsing fails
182
182
  const parsed = parse_fermi_file(text, filename)
183
- if (!parsed) throw new Error(`Failed to parse Fermi surface from ${filename}`)
184
183
 
185
184
  const file_size = new Blob([content]).size
186
185
  current_filename = filename
@@ -202,9 +201,7 @@
202
201
  try {
203
202
  await parse_fermi_content(content, filename)
204
203
  } catch (err) {
205
- error_msg = `Failed to parse ${filename}: ${
206
- to_error(err).message
207
- }`
204
+ error_msg = `Failed to parse ${filename}: ${to_error(err).message}`
208
205
  on_error?.({ error_msg, filename })
209
206
  }
210
207
  }
@@ -271,11 +268,10 @@
271
268
  // Compute BZ when structure or fermi_data changes
272
269
  $effect(() => {
273
270
  // Get k_lattice from available sources (priority order)
274
- const k_lattice = fermi_data?.k_lattice ??
271
+ const k_lattice =
272
+ fermi_data?.k_lattice ??
275
273
  band_data?.k_lattice ??
276
- (structure?.lattice?.matrix
277
- ? reciprocal_lattice(structure.lattice.matrix)
278
- : null)
274
+ (structure?.lattice?.matrix ? reciprocal_lattice(structure.lattice.matrix) : null)
279
275
 
280
276
  if (!k_lattice) {
281
277
  bz_data = undefined
@@ -349,28 +345,18 @@
349
345
  else if (event.key === `Escape`) controls_open = false
350
346
  }
351
347
 
352
- $effect(() => {
353
- if (typeof window === `undefined`) return
354
- const fs_el = document.fullscreenElement
355
- if (fullscreen && fs_el !== wrapper && wrapper) {
356
- wrapper.requestFullscreen().catch((err) => {
357
- console.error(err)
358
- fullscreen = false
359
- })
360
- } else if (!fullscreen && fs_el === wrapper) document.exitFullscreen()
361
- set_fullscreen_bg(wrapper, fullscreen, `--fermi-bg-fullscreen`)
348
+ sync_fullscreen({
349
+ get_wrapper: () => wrapper,
350
+ get_fullscreen: () => fullscreen,
351
+ set_fullscreen: (val) => (fullscreen = val),
352
+ bg_css_var: `--fermi-bg-fullscreen`,
353
+ on_request_error: () => (fullscreen = false),
354
+ on_change: (val) => on_fullscreen_change?.({ fermi_data, bz_data, fullscreen: val }),
362
355
  })
363
356
  </script>
364
357
 
365
358
  <svelte:window onkeydown={handle_keydown} />
366
359
 
367
- <svelte:document
368
- onfullscreenchange={() => {
369
- fullscreen = Boolean(document.fullscreenElement)
370
- on_fullscreen_change?.({ fermi_data, bz_data, fullscreen })
371
- }}
372
- />
373
-
374
360
  <div
375
361
  class:dragover
376
362
  class:active={controls_open}
@@ -382,17 +368,12 @@
382
368
  onmouseenter={() => (hovered = true)}
383
369
  onmouseleave={() => (hovered = false)}
384
370
  ondrop={handle_file_drop}
385
- ondragover={(event) => {
386
- event.preventDefault()
387
- if (!allow_file_drop) return
388
- dragover = true
389
- }}
390
- ondragleave={(event) => {
391
- event.preventDefault()
392
- dragover = false
393
- }}
371
+ {...drag_over_handlers({
372
+ allow: () => allow_file_drop,
373
+ set_dragover: (over) => (dragover = over),
374
+ })}
394
375
  {...rest}
395
- class="fermi-surface {rest.class ?? ``}"
376
+ class={[`fermi-surface`, rest.class]}
396
377
  >
397
378
  {@render children?.({ fermi_data, bz_data })}
398
379
  {#if loading}
@@ -409,61 +390,41 @@
409
390
  style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); max-width: 90%; text-align: center"
410
391
  />
411
392
  {:else if fermi_data || band_data}
412
- <section
413
- class="control-buttons {controls_config.class}"
414
- style={controls_config.style}
393
+ <ViewerChrome
394
+ {controls_config}
395
+ filename={current_filename}
396
+ {fullscreen}
397
+ {fullscreen_toggle}
398
+ {wrapper}
415
399
  >
416
- {#if controls_config.mode !== `never`}
417
- {#if current_filename && controls_config.visible(`filename`)}
418
- <span class="filename">{current_filename}</span>
419
- {/if}
420
-
421
- {#if fullscreen_toggle && controls_config.visible(`fullscreen`)}
422
- <button
423
- type="button"
424
- onclick={() => fullscreen_toggle && toggle_fullscreen(wrapper)}
425
- title="{fullscreen ? `Exit` : `Enter`} fullscreen"
426
- aria-pressed={fullscreen}
427
- class="fullscreen-toggle"
428
- {@attach tooltip()}
429
- >
430
- {#if typeof fullscreen_toggle === `function`}
431
- {@render fullscreen_toggle({ fullscreen })}
432
- {:else}
433
- <Icon icon="{fullscreen ? `Exit` : ``}Fullscreen" />
434
- {/if}
435
- </button>
436
- {/if}
437
-
438
- {#if controls_config.visible(`controls`)}
439
- <FermiSurfaceControls
440
- bind:controls_open
441
- {fermi_data}
442
- {band_data}
443
- bind:mu
444
- bind:color_property
445
- bind:color_scale
446
- {custom_property_label}
447
- bind:representation
448
- bind:surface_opacity
449
- bind:selected_bands
450
- bind:show_bz
451
- bind:bz_opacity
452
- bind:show_vectors
453
- bind:tile_bz
454
- bind:clip_enabled
455
- bind:clip_axis
456
- bind:clip_position
457
- bind:clip_flip
458
- bind:interpolation_factor
459
- bind:camera_projection
460
- on_mu_change={handle_mu_change}
461
- on_interpolation_change={handle_interpolation_change}
462
- on_export={handle_export}
463
- />
464
- {/if}
400
+ {#if controls_config.visible(`controls`)}
401
+ <FermiSurfaceControls
402
+ bind:controls_open
403
+ {fermi_data}
404
+ {band_data}
405
+ bind:mu
406
+ bind:color_property
407
+ bind:color_scale
408
+ {custom_property_label}
409
+ bind:representation
410
+ bind:surface_opacity
411
+ bind:selected_bands
412
+ bind:show_bz
413
+ bind:bz_opacity
414
+ bind:show_vectors
415
+ bind:tile_bz
416
+ bind:clip_enabled
417
+ bind:clip_axis
418
+ bind:clip_position
419
+ bind:clip_flip
420
+ bind:interpolation_factor
421
+ bind:camera_projection
422
+ on_mu_change={handle_mu_change}
423
+ on_interpolation_change={handle_interpolation_change}
424
+ on_export={handle_export}
425
+ />
465
426
  {/if}
466
- </section>
427
+ </ViewerChrome>
467
428
 
468
429
  {#if typeof WebGLRenderingContext !== `undefined`}
469
430
  <Canvas renderMode="on-demand" dpr={Math.min(2, window.devicePixelRatio)}>
@@ -555,52 +516,4 @@
555
516
  .fermi-surface :global(canvas) {
556
517
  user-select: none;
557
518
  }
558
- section.control-buttons {
559
- position: absolute;
560
- display: flex;
561
- top: var(--fermi-buttons-top, var(--ctrl-btn-top, 1ex));
562
- right: var(--fermi-buttons-right, var(--ctrl-btn-right, 1ex));
563
- gap: clamp(6pt, 1cqmin, 9pt);
564
- z-index: var(
565
- --fermi-buttons-z-index,
566
- var(--z-index-overlay-controls, 100000000)
567
- );
568
- opacity: 0;
569
- pointer-events: none;
570
- transition: opacity 0.2s ease;
571
- align-items: center;
572
- }
573
- /* Mode: always - controls always visible */
574
- section.control-buttons.always-visible {
575
- opacity: 1;
576
- pointer-events: auto;
577
- }
578
- /* Mode: hover - controls visible on component hover */
579
- .fermi-surface:hover section.control-buttons.hover-visible,
580
- .fermi-surface:focus-within section.control-buttons.hover-visible {
581
- opacity: 1;
582
- pointer-events: auto;
583
- }
584
- /* Mode: never - stays hidden (default state, no additional CSS needed) */
585
- section.control-buttons > :global(button) {
586
- background-color: transparent;
587
- display: flex;
588
- padding: 4px;
589
- border-radius: var(--border-radius, 3pt);
590
- font-size: clamp(0.85em, 2cqmin, 1.3em);
591
- }
592
- section.control-buttons :global(button:hover) {
593
- background-color: color-mix(in srgb, currentColor 8%, transparent);
594
- }
595
- .filename {
596
- font-family: monospace;
597
- font-size: 0.9em;
598
- background: var(--code-bg, rgba(0, 0, 0, 0.1));
599
- padding: 3pt 6pt;
600
- border-radius: 3pt;
601
- max-width: 200px;
602
- overflow: hidden;
603
- text-overflow: ellipsis;
604
- white-space: nowrap;
605
- }
606
519
  </style>
@@ -1,6 +1,7 @@
1
1
  import type { BrillouinZoneData } from '../brillouin';
2
- import type { ShowControlsProp } from '../controls';
2
+ import { type ShowControlsProp } from '../controls';
3
3
  import Spinner from '../feedback/Spinner.svelte';
4
+ import { type FullscreenToggleProp } from '../layout';
4
5
  import type { CameraProjection } from '../settings';
5
6
  import type { Crystal } from '../structure';
6
7
  import type { ComponentProps, Snippet } from 'svelte';
@@ -38,15 +39,6 @@ type $$ComponentProps = {
38
39
  clip_flip?: boolean;
39
40
  interpolation_factor?: number;
40
41
  camera_projection?: CameraProjection;
41
- /**
42
- * Controls visibility configuration.
43
- * - 'always': controls always visible
44
- * - 'hover': controls visible on component hover (default)
45
- * - 'never': controls never visible
46
- * - object: { mode, hidden, style } for fine-grained control
47
- *
48
- * Control names: 'filename', 'fullscreen', 'controls'
49
- */
50
42
  show_controls?: ShowControlsProp;
51
43
  fullscreen?: boolean;
52
44
  width?: number;
@@ -55,19 +47,15 @@ type $$ComponentProps = {
55
47
  hovered?: boolean;
56
48
  dragover?: boolean;
57
49
  allow_file_drop?: boolean;
58
- fullscreen_toggle?: Snippet<[{
59
- fullscreen: boolean;
60
- }]> | boolean;
50
+ fullscreen_toggle?: FullscreenToggleProp;
61
51
  data_url?: string;
62
52
  spinner_props?: ComponentProps<typeof Spinner>;
63
53
  loading?: boolean;
64
54
  error_msg?: string;
65
- children?: Snippet<[
66
- {
67
- fermi_data?: FermiSurfaceData;
68
- bz_data?: BrillouinZoneData;
69
- }
70
- ]>;
55
+ children?: Snippet<[{
56
+ fermi_data?: FermiSurfaceData;
57
+ bz_data?: BrillouinZoneData;
58
+ }]>;
71
59
  on_file_drop?: (filename: string) => void;
72
60
  on_file_load?: (data: FermiFileLoadData) => void;
73
61
  on_error?: (data: FermiErrorData) => void;
@@ -76,8 +64,9 @@ type $$ComponentProps = {
76
64
  tooltip_config?: Snippet<[{
77
65
  hover_data: FermiHoverData;
78
66
  }]> | FermiTooltipConfig;
67
+ on_point_hover?: (data: FermiHoverData | null) => void;
79
68
  on_hover?: (data: FermiHoverData | null) => void;
80
69
  } & HTMLAttributes<HTMLDivElement>;
81
- declare const FermiSurface: import("svelte").Component<$$ComponentProps, {}, "dragover" | "height" | "width" | "fullscreen" | "hovered" | "controls_open" | "loading" | "camera_projection" | "color_scale" | "wrapper" | "error_msg" | "surface_opacity" | "show_vectors" | "bz_data" | "mu" | "selected_bands" | "interpolation_factor" | "fermi_data" | "band_data" | "color_property" | "representation" | "show_bz" | "bz_opacity" | "tile_bz" | "clip_enabled" | "clip_axis" | "clip_position" | "clip_flip">;
70
+ declare const FermiSurface: import("svelte").Component<$$ComponentProps, {}, "height" | "width" | "dragover" | "fullscreen" | "wrapper" | "hovered" | "controls_open" | "camera_projection" | "color_scale" | "loading" | "error_msg" | "surface_opacity" | "show_vectors" | "bz_data" | "mu" | "selected_bands" | "interpolation_factor" | "fermi_data" | "band_data" | "color_property" | "representation" | "show_bz" | "bz_opacity" | "tile_bz" | "clip_enabled" | "clip_axis" | "clip_position" | "clip_flip">;
82
71
  type FermiSurface = ReturnType<typeof FermiSurface>;
83
72
  export default FermiSurface;
@@ -2,7 +2,7 @@
2
2
  import SettingsSection from '../layout/SettingsSection.svelte'
3
3
  import DraggablePane from '../overlays/DraggablePane.svelte'
4
4
  import type { CameraProjection } from '../settings'
5
- import { make_change_detector } from '../utils'
5
+ import { make_change_detector, parse_num_token } from '../utils'
6
6
  import type { Snippet } from 'svelte'
7
7
  import type {
8
8
  BandGridData,
@@ -90,8 +90,8 @@
90
90
  let available_bands = $derived(
91
91
  fermi_data
92
92
  ? [...new Set(fermi_data.isosurfaces.map((iso) => iso.band_index))].toSorted(
93
- (a, b) => a - b,
94
- )
93
+ (a, b) => a - b,
94
+ )
95
95
  : [],
96
96
  )
97
97
  let available_bands_key = $derived(available_bands.join(`,`))
@@ -119,8 +119,7 @@
119
119
  }
120
120
 
121
121
  function handle_mu_change(event: Event & { currentTarget: HTMLInputElement }) {
122
- const trimmed = event.currentTarget.value.trim()
123
- const parsed = parseFloat(trimmed)
122
+ const parsed = parse_num_token(event.currentTarget.value)
124
123
  // Only update mu when input is valid; keep last valid value during transient
125
124
  // invalid states (e.g. empty string while user is typing a new value)
126
125
  if (Number.isFinite(parsed)) {
@@ -147,14 +146,7 @@
147
146
  >
148
147
  <label>
149
148
  <span>μ offset (eV):</span>
150
- <input
151
- type="range"
152
- min="-1"
153
- max="1"
154
- step="0.01"
155
- value={mu}
156
- oninput={handle_mu_change}
157
- />
149
+ <input type="range" min="-1" max="1" step="0.01" value={mu} oninput={handle_mu_change} />
158
150
  <input
159
151
  type="number"
160
152
  step="0.01"
@@ -300,13 +292,7 @@
300
292
  </label>
301
293
  <label>
302
294
  <span>Position:</span>
303
- <input
304
- type="range"
305
- min="-1"
306
- max="1"
307
- step="0.01"
308
- bind:value={clip_position}
309
- />
295
+ <input type="range" min="-1" max="1" step="0.01" bind:value={clip_position} />
310
296
  <span class="value">{clip_position.toFixed(2)}</span>
311
297
  </label>
312
298
  <label>