matterviz 0.4.1 → 0.4.3

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 (499) hide show
  1. package/dist/EmptyState.svelte +10 -4
  2. package/dist/FilePicker.svelte +48 -60
  3. package/dist/Icon.svelte +7 -4
  4. package/dist/MillerIndexInput.svelte +2 -2
  5. package/dist/api/optimade.js +10 -7
  6. package/dist/app.css +68 -0
  7. package/dist/brillouin/BrillouinZone.svelte +90 -91
  8. package/dist/brillouin/BrillouinZone.svelte.d.ts +5 -7
  9. package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte +18 -14
  11. package/dist/brillouin/BrillouinZoneInfoPane.svelte +6 -10
  12. package/dist/brillouin/BrillouinZoneScene.svelte +46 -68
  13. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  14. package/dist/brillouin/compute.js +10 -16
  15. package/dist/brillouin/geometry.js +2 -2
  16. package/dist/chempot-diagram/ChemPotDiagram.svelte +48 -50
  17. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +61 -169
  18. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +1 -1
  19. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +559 -755
  20. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +1 -1
  21. package/dist/chempot-diagram/async-compute.svelte.js +13 -14
  22. package/dist/chempot-diagram/color.d.ts +21 -1
  23. package/dist/chempot-diagram/color.js +70 -1
  24. package/dist/chempot-diagram/compute.d.ts +7 -0
  25. package/dist/chempot-diagram/compute.js +85 -26
  26. package/dist/chempot-diagram/controls-state.svelte.js +1 -1
  27. package/dist/chempot-diagram/export.js +1 -6
  28. package/dist/chempot-diagram/temperature.js +9 -10
  29. package/dist/colors/index.d.ts +0 -4
  30. package/dist/colors/index.js +19 -20
  31. package/dist/composition/BarChart.svelte +30 -26
  32. package/dist/composition/BubbleChart.svelte +17 -17
  33. package/dist/composition/Composition.svelte +10 -19
  34. package/dist/composition/Formula.svelte +20 -27
  35. package/dist/composition/FormulaFilter.svelte +115 -184
  36. package/dist/composition/PieChart.svelte +55 -41
  37. package/dist/composition/format.js +7 -9
  38. package/dist/composition/index.d.ts +2 -0
  39. package/dist/composition/index.js +14 -0
  40. package/dist/composition/parse.d.ts +2 -2
  41. package/dist/composition/parse.js +61 -115
  42. package/dist/constants.d.ts +0 -1
  43. package/dist/constants.js +17 -26
  44. package/dist/convex-hull/ConvexHull.svelte +12 -15
  45. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
  46. package/dist/convex-hull/ConvexHull2D.svelte +93 -94
  47. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  48. package/dist/convex-hull/ConvexHull3D.svelte +127 -186
  49. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  50. package/dist/convex-hull/ConvexHull4D.svelte +131 -180
  51. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  52. package/dist/convex-hull/ConvexHullChrome.svelte +36 -40
  53. package/dist/convex-hull/ConvexHullControls.svelte +46 -48
  54. package/dist/convex-hull/ConvexHullStats.svelte +193 -195
  55. package/dist/convex-hull/ConvexHullTooltip.svelte +5 -12
  56. package/dist/convex-hull/GasPressureControls.svelte +5 -12
  57. package/dist/convex-hull/StructurePopup.svelte +18 -22
  58. package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
  59. package/dist/convex-hull/TemperatureSlider.svelte +4 -10
  60. package/dist/convex-hull/canvas-interactions.svelte.js +2 -1
  61. package/dist/convex-hull/gas-thermodynamics.js +21 -53
  62. package/dist/convex-hull/helpers.d.ts +8 -10
  63. package/dist/convex-hull/helpers.js +37 -43
  64. package/dist/convex-hull/hull-state.svelte.d.ts +1 -1
  65. package/dist/convex-hull/thermodynamics.js +37 -44
  66. package/dist/coordination/CoordinationBarPlot.svelte +49 -53
  67. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  68. package/dist/coordination/calc-coordination.d.ts +1 -1
  69. package/dist/coordination/calc-coordination.js +28 -25
  70. package/dist/element/BohrAtom.svelte +5 -9
  71. package/dist/element/ElementHeading.svelte +4 -1
  72. package/dist/element/ElementPhoto.svelte +11 -9
  73. package/dist/element/ElementStats.svelte +12 -10
  74. package/dist/element/ElementTile.svelte +44 -67
  75. package/dist/element/Nucleus.svelte +4 -2
  76. package/dist/element/data.d.ts +3 -2
  77. package/dist/element/data.js +5 -1
  78. package/dist/element/helpers.d.ts +4 -0
  79. package/dist/element/helpers.js +18 -0
  80. package/dist/element/index.d.ts +2 -5
  81. package/dist/element/index.js +4 -19
  82. package/dist/feedback/DragOverlay.svelte +5 -5
  83. package/dist/feedback/DragOverlay.svelte.d.ts +2 -2
  84. package/dist/feedback/StatusMessage.svelte +7 -4
  85. package/dist/fermi-surface/FermiSlice.svelte +21 -18
  86. package/dist/fermi-surface/FermiSurface.svelte +35 -44
  87. package/dist/fermi-surface/FermiSurface.svelte.d.ts +7 -13
  88. package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
  89. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  90. package/dist/fermi-surface/FermiSurfaceScene.svelte +64 -136
  91. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  92. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
  93. package/dist/fermi-surface/compute.js +25 -58
  94. package/dist/fermi-surface/parse.js +54 -88
  95. package/dist/file-viewer/JsonBrowser.svelte +1043 -0
  96. package/dist/file-viewer/JsonBrowser.svelte.d.ts +9 -0
  97. package/dist/file-viewer/PlotPanel.svelte +350 -0
  98. package/dist/file-viewer/PlotPanel.svelte.d.ts +9 -0
  99. package/dist/file-viewer/TrajectoryWithDos.svelte +30 -0
  100. package/dist/file-viewer/TrajectoryWithDos.svelte.d.ts +10 -0
  101. package/dist/file-viewer/detect.d.ts +11 -0
  102. package/dist/file-viewer/detect.js +381 -0
  103. package/dist/file-viewer/eligibility.d.ts +4 -0
  104. package/dist/file-viewer/eligibility.js +53 -0
  105. package/dist/file-viewer/host-protocol.d.ts +50 -0
  106. package/dist/file-viewer/host-transfer.d.ts +25 -0
  107. package/dist/file-viewer/host-transfer.js +42 -0
  108. package/dist/file-viewer/index.d.ts +5 -0
  109. package/dist/file-viewer/index.js +5 -0
  110. package/dist/file-viewer/main.d.ts +44 -0
  111. package/dist/file-viewer/main.js +535 -0
  112. package/dist/file-viewer/parse.d.ts +9 -0
  113. package/dist/file-viewer/parse.js +170 -0
  114. package/dist/file-viewer/plot-utils.d.ts +24 -0
  115. package/dist/file-viewer/plot-utils.js +191 -0
  116. package/dist/file-viewer/types.d.ts +4 -0
  117. package/dist/file-viewer/types.js +5 -0
  118. package/dist/heatmap-matrix/HeatmapMatrix.svelte +153 -219
  119. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +2 -2
  120. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +9 -7
  121. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +1 -1
  122. package/dist/heatmap-matrix/index.d.ts +5 -0
  123. package/dist/icons.d.ts +4 -0
  124. package/dist/icons.js +4 -0
  125. package/dist/index.d.ts +2 -2
  126. package/dist/index.js +1 -1
  127. package/dist/io/ExportPane.svelte +11 -7
  128. package/dist/io/decompress.d.ts +4 -1
  129. package/dist/io/decompress.js +24 -36
  130. package/dist/io/export.d.ts +11 -4
  131. package/dist/io/export.js +75 -19
  132. package/dist/io/fetch.d.ts +0 -3
  133. package/dist/io/fetch.js +0 -11
  134. package/dist/io/file-drop.js +60 -35
  135. package/dist/io/index.d.ts +0 -1
  136. package/dist/io/index.js +2 -9
  137. package/dist/io/is-binary.d.ts +9 -0
  138. package/dist/io/is-binary.js +45 -1
  139. package/dist/io/url-drop.d.ts +2 -0
  140. package/dist/io/url-drop.js +40 -40
  141. package/dist/isosurface/Isosurface.svelte +700 -215
  142. package/dist/isosurface/Isosurface.svelte.d.ts +7 -1
  143. package/dist/isosurface/IsosurfaceControls.svelte +590 -116
  144. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +1 -1
  145. package/dist/isosurface/VolumeSlice.svelte +224 -0
  146. package/dist/isosurface/VolumeSlice.svelte.d.ts +28 -0
  147. package/dist/isosurface/coloring.d.ts +20 -0
  148. package/dist/isosurface/coloring.js +118 -0
  149. package/dist/isosurface/geometry-worker-types.d.ts +38 -0
  150. package/dist/isosurface/geometry.worker.d.ts +1 -0
  151. package/dist/isosurface/geometry.worker.js +59 -0
  152. package/dist/isosurface/grid.d.ts +10 -0
  153. package/dist/isosurface/grid.js +31 -0
  154. package/dist/isosurface/index.d.ts +4 -0
  155. package/dist/isosurface/index.js +4 -0
  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 +6 -6
  159. package/dist/isosurface/profile.d.ts +12 -0
  160. package/dist/isosurface/profile.js +19 -0
  161. package/dist/isosurface/sampling.d.ts +34 -0
  162. package/dist/isosurface/sampling.js +408 -0
  163. package/dist/isosurface/slice-rendering.d.ts +13 -0
  164. package/dist/isosurface/slice-rendering.js +79 -0
  165. package/dist/isosurface/slice.d.ts +22 -2
  166. package/dist/isosurface/slice.js +200 -116
  167. package/dist/isosurface/types.d.ts +24 -1
  168. package/dist/isosurface/types.js +120 -8
  169. package/dist/json-path.d.ts +4 -0
  170. package/dist/json-path.js +89 -0
  171. package/dist/labels.d.ts +6 -2
  172. package/dist/labels.js +44 -14
  173. package/dist/layout/FullscreenButton.svelte +2 -1
  174. package/dist/layout/FullscreenToggle.svelte +10 -4
  175. package/dist/layout/InfoCard.svelte +8 -21
  176. package/dist/layout/InfoTag.svelte +1 -3
  177. package/dist/layout/NumberRangeInput.svelte +46 -0
  178. package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
  179. package/dist/layout/PropertyFilter.svelte +2 -6
  180. package/dist/layout/SettingsSection.svelte +57 -62
  181. package/dist/layout/SettingsSection.svelte.d.ts +6 -7
  182. package/dist/layout/SubpageGrid.svelte +3 -1
  183. package/dist/layout/ViewerChrome.svelte +16 -11
  184. package/dist/layout/ViewerChrome.svelte.d.ts +2 -1
  185. package/dist/layout/fullscreen.js +3 -5
  186. package/dist/layout/fullscreen.svelte.js +1 -2
  187. package/dist/layout/index.d.ts +1 -0
  188. package/dist/layout/index.js +1 -0
  189. package/dist/layout/json-tree/JsonNode.svelte +22 -59
  190. package/dist/layout/json-tree/JsonTree.svelte +101 -172
  191. package/dist/layout/json-tree/JsonValue.svelte +9 -32
  192. package/dist/layout/json-tree/utils.d.ts +0 -3
  193. package/dist/layout/json-tree/utils.js +50 -188
  194. package/dist/marching-cubes.d.ts +8 -1
  195. package/dist/marching-cubes.js +115 -48
  196. package/dist/math.d.ts +5 -2
  197. package/dist/math.js +48 -38
  198. package/dist/overlays/ContextMenu.svelte +19 -34
  199. package/dist/overlays/CopyButton.svelte +11 -5
  200. package/dist/overlays/DragControlTab.svelte +6 -1
  201. package/dist/overlays/DraggablePane.svelte +110 -74
  202. package/dist/overlays/DraggablePane.svelte.d.ts +2 -1
  203. package/dist/overlays/GlassChip.svelte +32 -0
  204. package/dist/overlays/GlassChip.svelte.d.ts +8 -0
  205. package/dist/overlays/InfoPaneCards.svelte +11 -23
  206. package/dist/overlays/index.d.ts +7 -0
  207. package/dist/overlays/index.js +26 -0
  208. package/dist/overlays/portal.d.ts +2 -0
  209. package/dist/overlays/portal.js +14 -0
  210. package/dist/periodic-table/PeriodicTable.svelte +113 -145
  211. package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
  212. package/dist/periodic-table/PeriodicTableControls.svelte +37 -115
  213. package/dist/periodic-table/TableInset.svelte +9 -4
  214. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +68 -105
  215. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
  216. package/dist/phase-diagram/PhaseDiagramControls.svelte +70 -94
  217. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
  218. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +2 -1
  219. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +12 -12
  220. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
  221. package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
  222. package/dist/phase-diagram/build-diagram.js +4 -9
  223. package/dist/phase-diagram/diagram-input.d.ts +1 -2
  224. package/dist/phase-diagram/parse.js +15 -15
  225. package/dist/phase-diagram/svg-to-diagram.js +28 -27
  226. package/dist/phase-diagram/utils.js +2 -3
  227. package/dist/plot/bar/BarPlot.svelte +461 -426
  228. package/dist/plot/bar/BarPlot.svelte.d.ts +2 -0
  229. package/dist/plot/bar/BarPlotControls.svelte +1 -3
  230. package/dist/plot/bar/BarPlotControls.svelte.d.ts +4 -6
  231. package/dist/plot/bar/SpacegroupBarPlot.svelte +46 -77
  232. package/dist/plot/bar/data.d.ts +5 -4
  233. package/dist/plot/bar/data.js +2 -1
  234. package/dist/plot/box/BoxPlot.svelte +322 -226
  235. package/dist/plot/box/BoxPlot.svelte.d.ts +2 -0
  236. package/dist/plot/box/Violin.svelte.d.ts +1 -0
  237. package/dist/plot/box/box-plot.js +1 -1
  238. package/dist/plot/core/auto-place.d.ts +1 -1
  239. package/dist/plot/core/auto-place.js +2 -2
  240. package/dist/plot/core/axis-utils.d.ts +12 -7
  241. package/dist/plot/core/axis-utils.js +48 -48
  242. package/dist/plot/core/components/AxisLabel.svelte +82 -20
  243. package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
  244. package/dist/plot/core/components/ColorBar.svelte +101 -106
  245. package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
  246. package/dist/plot/core/components/FillArea.svelte +10 -17
  247. package/dist/plot/core/components/HierarchyControls.svelte +249 -0
  248. package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
  249. package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
  250. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
  251. package/dist/plot/core/components/Line.svelte +18 -9
  252. package/dist/plot/core/components/Line.svelte.d.ts +2 -0
  253. package/dist/plot/core/components/PlotAxis.svelte +40 -17
  254. package/dist/plot/core/components/PlotControls.svelte +65 -41
  255. package/dist/plot/core/components/PlotLegend.svelte +31 -35
  256. package/dist/plot/core/components/PlotMarginals.svelte +616 -0
  257. package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
  258. package/dist/plot/core/components/PlotTooltip.svelte +1 -1
  259. package/dist/plot/core/components/PortalSelect.svelte +4 -8
  260. package/dist/plot/core/components/ReferenceLine.svelte +27 -24
  261. package/dist/plot/core/components/ReferenceLine3D.svelte +54 -57
  262. package/dist/plot/core/components/ReferencePlane.svelte +7 -8
  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 +27 -474
  271. package/dist/plot/core/data-transform.d.ts +1 -2
  272. package/dist/plot/core/data-transform.js +9 -15
  273. package/dist/plot/core/fill-utils.d.ts +3 -1
  274. package/dist/plot/core/fill-utils.js +28 -6
  275. package/dist/plot/core/index.d.ts +1 -0
  276. package/dist/plot/core/index.js +1 -0
  277. package/dist/plot/core/interactions.js +0 -2
  278. package/dist/plot/core/layout.d.ts +15 -6
  279. package/dist/plot/core/layout.js +57 -38
  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 +2 -4
  283. package/dist/plot/core/pan-zoom.svelte.js +34 -17
  284. package/dist/plot/core/placed-tween.svelte.d.ts +3 -0
  285. package/dist/plot/core/placed-tween.svelte.js +68 -21
  286. package/dist/plot/core/reference-line.js +1 -1
  287. package/dist/plot/core/scales.d.ts +23 -0
  288. package/dist/plot/core/scales.js +39 -13
  289. package/dist/plot/core/svg.js +0 -1
  290. package/dist/plot/core/types/fills.d.ts +101 -0
  291. package/dist/plot/core/types/fills.js +15 -0
  292. package/dist/plot/core/types/plot-3d.d.ts +87 -0
  293. package/dist/plot/core/types/plot-3d.js +4 -0
  294. package/dist/plot/core/types/reference-lines.d.ts +140 -0
  295. package/dist/plot/core/types/reference-lines.js +9 -0
  296. package/dist/plot/core/types.d.ts +29 -324
  297. package/dist/plot/core/types.js +23 -20
  298. package/dist/plot/core/utils/hierarchy-chart.d.ts +52 -0
  299. package/dist/plot/core/utils/hierarchy-chart.js +191 -0
  300. package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
  301. package/dist/plot/core/utils/hierarchy-labels.js +100 -0
  302. package/dist/plot/core/utils/label-placement.js +2 -2
  303. package/dist/plot/histogram/Histogram.svelte +314 -340
  304. package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
  305. package/dist/plot/histogram/HistogramControls.svelte +30 -28
  306. package/dist/plot/histogram/histogram.d.ts +31 -0
  307. package/dist/plot/histogram/histogram.js +70 -0
  308. package/dist/plot/histogram/index.d.ts +1 -0
  309. package/dist/plot/histogram/index.js +1 -0
  310. package/dist/plot/index.d.ts +1 -0
  311. package/dist/plot/index.js +1 -0
  312. package/dist/plot/sankey/Sankey.svelte +78 -69
  313. package/dist/plot/sankey/Sankey.svelte.d.ts +2 -2
  314. package/dist/plot/sankey/SankeyControls.svelte +22 -16
  315. package/dist/plot/sankey/sankey.js +13 -9
  316. package/dist/plot/scatter/BinnedScatterPlot.svelte +311 -141
  317. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +7 -0
  318. package/dist/plot/scatter/ElementScatter.svelte +4 -1
  319. package/dist/plot/scatter/ScatterPlot.svelte +517 -410
  320. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +2 -0
  321. package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
  322. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  323. package/dist/plot/scatter/ScatterPoint.svelte +16 -9
  324. package/dist/plot/scatter/adaptive-density.d.ts +1 -1
  325. package/dist/plot/scatter/adaptive-density.js +36 -20
  326. package/dist/plot/scatter/binned-scatter-types.d.ts +3 -2
  327. package/dist/plot/scatter/binned-scatter-types.js +6 -1
  328. package/dist/plot/scatter/scatter-data.d.ts +1 -1
  329. package/dist/plot/scatter/scatter-data.js +8 -7
  330. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +25 -34
  331. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +2 -2
  332. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +8 -5
  333. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +113 -116
  334. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +2 -2
  335. package/dist/plot/scatter-3d/Surface3D.svelte +4 -13
  336. package/dist/plot/sunburst/Sunburst.svelte +269 -347
  337. package/dist/plot/sunburst/Sunburst.svelte.d.ts +2 -2
  338. package/dist/plot/sunburst/index.d.ts +1 -1
  339. package/dist/plot/sunburst/index.js +2 -1
  340. package/dist/plot/sunburst/render.d.ts +2 -2
  341. package/dist/plot/sunburst/render.js +47 -22
  342. package/dist/plot/sunburst/sunburst.d.ts +5 -1
  343. package/dist/plot/sunburst/sunburst.js +10 -3
  344. package/dist/plot/treemap/Treemap.svelte +1022 -0
  345. package/dist/plot/treemap/Treemap.svelte.d.ts +90 -0
  346. package/dist/plot/treemap/index.d.ts +4 -0
  347. package/dist/plot/treemap/index.js +4 -0
  348. package/dist/plot/treemap/labels.d.ts +38 -0
  349. package/dist/plot/treemap/labels.js +80 -0
  350. package/dist/plot/treemap/treemap.d.ts +28 -0
  351. package/dist/plot/treemap/treemap.js +102 -0
  352. package/dist/rdf/RdfPlot.svelte +37 -59
  353. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  354. package/dist/rdf/calc-rdf.js +63 -52
  355. package/dist/rdf/index.d.ts +0 -1
  356. package/dist/sanitize.js +85 -27
  357. package/dist/scene/SceneCamera.svelte +1 -1
  358. package/dist/scene/SceneCamera.svelte.d.ts +1 -1
  359. package/dist/scene/bind-renderer.svelte.js +14 -6
  360. package/dist/scene/index.d.ts +1 -2
  361. package/dist/scene/index.js +1 -1
  362. package/dist/scene/{props.js → props.svelte.js} +15 -1
  363. package/dist/settings.d.ts +19 -9
  364. package/dist/settings.js +229 -525
  365. package/dist/spectral/Bands.svelte +207 -221
  366. package/dist/spectral/BandsAndDos.svelte +11 -9
  367. package/dist/spectral/BrillouinBandsDos.svelte +19 -42
  368. package/dist/spectral/Dos.svelte +92 -93
  369. package/dist/spectral/helpers.d.ts +3 -3
  370. package/dist/spectral/helpers.js +65 -140
  371. package/dist/state.svelte.js +5 -18
  372. package/dist/structure/Arrow.svelte +5 -18
  373. package/dist/structure/ArrowInstances.svelte +160 -0
  374. package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
  375. package/dist/structure/AtomLegend.svelte +120 -85
  376. package/dist/structure/AtomLegend.svelte.d.ts +2 -3
  377. package/dist/structure/Bond.svelte +31 -23
  378. package/dist/structure/CanvasTooltip.svelte +15 -3
  379. package/dist/structure/CellSelect.svelte +45 -35
  380. package/dist/structure/Cylinder.svelte +24 -40
  381. package/dist/structure/InstancedAtoms.svelte +114 -0
  382. package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
  383. package/dist/structure/Lattice.svelte +85 -149
  384. package/dist/structure/SiteLabels.svelte +122 -0
  385. package/dist/structure/SiteLabels.svelte.d.ts +18 -0
  386. package/dist/structure/Structure.svelte +636 -504
  387. package/dist/structure/Structure.svelte.d.ts +4 -2
  388. package/dist/structure/StructureCarousel.svelte +637 -0
  389. package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
  390. package/dist/structure/StructureControls.svelte +165 -425
  391. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  392. package/dist/structure/StructureExportPane.svelte +17 -21
  393. package/dist/structure/StructureInfoPane.svelte +128 -133
  394. package/dist/structure/StructureInfoPane.svelte.d.ts +1 -1
  395. package/dist/structure/StructureScene.svelte +535 -578
  396. package/dist/structure/StructureScene.svelte.d.ts +6 -2
  397. package/dist/structure/StructureViewport.svelte +451 -0
  398. package/dist/structure/StructureViewport.svelte.d.ts +65 -0
  399. package/dist/structure/atom-label-placement.d.ts +16 -12
  400. package/dist/structure/atom-label-placement.js +70 -37
  401. package/dist/structure/atom-properties.d.ts +2 -0
  402. package/dist/structure/atom-properties.js +105 -38
  403. package/dist/structure/bond-order-perception.js +3 -8
  404. package/dist/structure/bonding.d.ts +9 -3
  405. package/dist/structure/bonding.js +95 -46
  406. package/dist/structure/edit-history.d.ts +6 -0
  407. package/dist/structure/edit-history.js +27 -0
  408. package/dist/structure/export.d.ts +1 -0
  409. package/dist/structure/export.js +89 -105
  410. package/dist/structure/format-detect.d.ts +1 -0
  411. package/dist/structure/format-detect.js +20 -0
  412. package/dist/structure/geometry.d.ts +9 -0
  413. package/dist/structure/geometry.js +27 -0
  414. package/dist/structure/index.d.ts +16 -1
  415. package/dist/structure/index.js +15 -10
  416. package/dist/structure/measure.d.ts +1 -1
  417. package/dist/structure/measure.js +6 -12
  418. package/dist/structure/parse.d.ts +2 -1
  419. package/dist/structure/parse.js +272 -313
  420. package/dist/structure/partial-occupancy.js +10 -5
  421. package/dist/structure/pbc.js +85 -107
  422. package/dist/structure/polyhedra.d.ts +0 -1
  423. package/dist/structure/polyhedra.js +7 -21
  424. package/dist/structure/prop-groups.d.ts +85 -0
  425. package/dist/structure/prop-groups.js +18 -0
  426. package/dist/structure/supercell.d.ts +1 -2
  427. package/dist/structure/supercell.js +7 -13
  428. package/dist/symmetry/SymmetryElements.svelte +11 -15
  429. package/dist/symmetry/SymmetryStats.svelte +55 -71
  430. package/dist/symmetry/WyckoffTable.svelte +10 -28
  431. package/dist/symmetry/cell-transform.js +6 -14
  432. package/dist/symmetry/index.d.ts +1 -0
  433. package/dist/symmetry/index.js +13 -10
  434. package/dist/symmetry/spacegroups.js +3 -2
  435. package/dist/table/HeatmapTable.svelte +1142 -447
  436. package/dist/table/HeatmapTable.svelte.d.ts +12 -2
  437. package/dist/table/ToggleMenu.svelte +168 -53
  438. package/dist/table/ToggleMenu.svelte.d.ts +1 -1
  439. package/dist/table/index.d.ts +21 -6
  440. package/dist/table/index.js +34 -21
  441. package/dist/theme/ThemeControl.svelte +16 -8
  442. package/dist/theme/embedded.d.ts +18 -0
  443. package/dist/theme/embedded.js +206 -0
  444. package/dist/theme/index.d.ts +5 -5
  445. package/dist/theme/index.js +5 -12
  446. package/dist/theme/themes.mjs +44 -66
  447. package/dist/tooltip/KCoords.svelte +4 -1
  448. package/dist/tooltip/TooltipContent.svelte +3 -6
  449. package/dist/tooltip/TooltipContent.svelte.d.ts +1 -1
  450. package/dist/tooltip/index.d.ts +8 -1
  451. package/dist/trajectory/Trajectory.svelte +613 -386
  452. package/dist/trajectory/Trajectory.svelte.d.ts +1 -1
  453. package/dist/trajectory/TrajectoryError.svelte +12 -74
  454. package/dist/trajectory/TrajectoryExportPane.svelte +14 -32
  455. package/dist/trajectory/TrajectoryInfoPane.svelte +127 -164
  456. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +2 -1
  457. package/dist/trajectory/extract.js +61 -49
  458. package/dist/trajectory/format-detect.d.ts +2 -0
  459. package/dist/trajectory/format-detect.js +17 -13
  460. package/dist/trajectory/frame-reader.d.ts +2 -0
  461. package/dist/trajectory/frame-reader.js +35 -32
  462. package/dist/trajectory/helpers.d.ts +2 -0
  463. package/dist/trajectory/helpers.js +34 -56
  464. package/dist/trajectory/index.d.ts +1 -0
  465. package/dist/trajectory/index.js +5 -8
  466. package/dist/trajectory/parse/ase.js +1 -1
  467. package/dist/trajectory/parse/h5-utils.d.ts +13 -0
  468. package/dist/trajectory/parse/h5-utils.js +109 -0
  469. package/dist/trajectory/parse/hdf5.d.ts +1 -1
  470. package/dist/trajectory/parse/hdf5.js +116 -106
  471. package/dist/trajectory/parse/index.d.ts +6 -6
  472. package/dist/trajectory/parse/index.js +25 -33
  473. package/dist/trajectory/parse/lammps.js +8 -12
  474. package/dist/trajectory/parse/vasp.js +10 -7
  475. package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
  476. package/dist/trajectory/parse/vaspout-electronic.js +207 -0
  477. package/dist/trajectory/parse/vaspout-h5.d.ts +4 -0
  478. package/dist/trajectory/parse/vaspout-h5.js +281 -0
  479. package/dist/trajectory/parse/xyz.js +59 -9
  480. package/dist/trajectory/plotting.d.ts +8 -9
  481. package/dist/trajectory/plotting.js +113 -64
  482. package/dist/utils.d.ts +3 -0
  483. package/dist/utils.js +7 -0
  484. package/dist/xrd/XrdPlot.svelte +79 -118
  485. package/dist/xrd/broadening.js +2 -1
  486. package/dist/xrd/calc-xrd.js +24 -62
  487. package/dist/xrd/parse.d.ts +0 -1
  488. package/dist/xrd/parse.js +69 -95
  489. package/package.json +94 -34
  490. package/readme.md +6 -5
  491. package/dist/api/mp.d.ts +0 -6
  492. package/dist/api/mp.js +0 -22
  493. package/dist/plot/sunburst/SunburstControls.svelte +0 -200
  494. package/dist/scene/types.d.ts +0 -26
  495. package/dist/tooltip/types.d.ts +0 -8
  496. package/dist/trajectory/constants.d.ts +0 -6
  497. package/dist/trajectory/constants.js +0 -11
  498. /package/dist/{scene/types.js → file-viewer/host-protocol.js} +0 -0
  499. /package/dist/{tooltip/types.js → isosurface/geometry-worker-types.js} +0 -0
@@ -2,10 +2,11 @@
2
2
  import type { PaneProps, PaneToggleProps } from '../overlays'
3
3
  import type { ColorSchemeName, D3InterpolateName } from '../colors'
4
4
  import { AXIS_COLORS, ELEMENT_COLOR_SCHEMES } from '../colors'
5
+ import Spinner from '../feedback/Spinner.svelte'
5
6
  import IsosurfaceControls from '../isosurface/IsosurfaceControls.svelte'
6
7
  import type { IsosurfaceSettings, VolumetricData } from '../isosurface/types'
7
8
  import { format_num } from '../labels'
8
- import { SettingsSection } from '../layout'
9
+ import { NumberRangeInput, SettingsSection } from '../layout'
9
10
  import { to_degrees, to_radians } from '../math'
10
11
  import DraggablePane from '../overlays/DraggablePane.svelte'
11
12
  import { ColorScaleSelect } from '../plot'
@@ -97,15 +98,13 @@
97
98
 
98
99
  // Sync local selection to config
99
100
  $effect(() => {
100
- if (
101
- color_scale_selected[0] && color_scale_selected[0] !== atom_color_config.scale
102
- ) atom_color_config.scale = color_scale_selected[0]
101
+ if (color_scale_selected[0] && color_scale_selected[0] !== atom_color_config.scale)
102
+ atom_color_config.scale = color_scale_selected[0]
103
103
  })
104
104
  // Sync config to local selection (for external updates)
105
105
  $effect(() => {
106
- if (
107
- atom_color_config.scale && atom_color_config.scale !== color_scale_selected[0]
108
- ) color_scale_selected = [atom_color_config.scale]
106
+ if (atom_color_config.scale && atom_color_config.scale !== color_scale_selected[0])
107
+ color_scale_selected = [atom_color_config.scale]
109
108
  })
110
109
  // Auto-set scale_type based on mode
111
110
  $effect(() => {
@@ -121,9 +120,7 @@
121
120
  // actually use as centers - minority occupancies of disordered sites never are.
122
121
  let structure_elements = $derived(
123
122
  [
124
- ...new Set(
125
- (structure?.sites ?? []).flatMap((site) => get_majority_element(site) ?? []),
126
- ),
123
+ ...new Set((structure?.sites ?? []).flatMap((site) => get_majority_element(site) ?? [])),
127
124
  ].sort(),
128
125
  )
129
126
 
@@ -135,8 +132,10 @@
135
132
  const is_polyhedra_center_enabled = (element: string): boolean => {
136
133
  const excluded = scene_props.polyhedra_excluded_elements ?? []
137
134
  const included = scene_props.polyhedra_included_elements ?? []
138
- return !excluded.includes(element) &&
135
+ return (
136
+ !excluded.includes(element) &&
139
137
  (included.includes(element) || polyhedra_rendered_elements.includes(element))
138
+ )
140
139
  }
141
140
 
142
141
  // Toggle an element as polyhedra center. Enabled elements get excluded; disabled
@@ -154,9 +153,9 @@
154
153
  }
155
154
  }
156
155
 
157
- const hex_color_pattern = /^#[0-9a-f]{3}([0-9a-f]{3})?$/i
156
+ const hex_color_pattern = /^#[0-9a-f]{3}(?:[0-9a-f]{3})?$/i
158
157
  const color_mix_pattern =
159
- /^color-mix\(in srgb,\s*(#[0-9a-f]{3}(?:[0-9a-f]{3})?)\s+(\d+(?:\.\d+)?)%,\s*transparent\)$/i
158
+ /^color-mix\(in srgb,\s*(?<hex>#[0-9a-f]{3}(?:[0-9a-f]{3})?)\s+(?<pct>\d+(?:\.\d+)?)%,\s*transparent\)$/i
160
159
 
161
160
  const as_hex_color = (color: string | undefined, fallback: string): string =>
162
161
  color?.match(hex_color_pattern)?.[0] ?? fallback
@@ -183,10 +182,7 @@
183
182
  : { hex_color, opacity: 1 }
184
183
  }
185
184
 
186
- const default_site_label_color = as_hex_color(
187
- DEFAULTS.structure.site_label_color,
188
- `#111111`,
189
- )
185
+ const default_site_label_color = as_hex_color(DEFAULTS.structure.site_label_color, `#111111`)
190
186
  const default_site_label_bg = parse_label_bg_color(
191
187
  DEFAULTS.structure.site_label_bg_color,
192
188
  `#000000`,
@@ -231,10 +227,10 @@
231
227
 
232
228
  if (!external_color_changed) scene_props.site_label_color = site_label_hex_color
233
229
  if (!external_bg_changed) {
234
- scene_props.site_label_bg_color =
235
- `color-mix(in srgb, ${site_label_bg_hex_color} ${
236
- format_num(site_label_background_opacity, `.1~%`)
237
- }, transparent)`
230
+ scene_props.site_label_bg_color = `color-mix(in srgb, ${site_label_bg_hex_color} ${format_num(
231
+ site_label_background_opacity,
232
+ `.1~%`,
233
+ )}, transparent)`
238
234
  }
239
235
 
240
236
  last_synced_site_label_color = scene_props.site_label_color
@@ -245,9 +241,7 @@
245
241
  scene_props.site_label_offset ??= [...DEFAULTS.structure.site_label_offset]
246
242
 
247
243
  // Collect available vector property keys from the structure
248
- let available_vector_keys = $derived(
249
- structure ? get_structure_vector_keys(structure) : [],
250
- )
244
+ let available_vector_keys = $derived(structure ? get_structure_vector_keys(structure) : [])
251
245
  const is_key_visible = (key: string): boolean =>
252
246
  scene_props.vector_configs?.[key]?.visible !== false
253
247
 
@@ -293,17 +287,11 @@
293
287
  scene_props.rotation = [...scene_props.rotation]
294
288
  }
295
289
 
296
- // Helper function to get example set of colors from an element color scheme
290
+ // Sample colors for common elements, used to preview an element color scheme
297
291
  function get_representative_colors(scheme_name: string): string[] {
298
292
  const scheme = ELEMENT_COLOR_SCHEMES[scheme_name as ColorSchemeName]
299
293
  if (!scheme) return []
300
-
301
- // Get colors for common elements: H, C, N, O, Fe, Ca, Si, Al
302
- const sample_elements = [`H`, `C`, `N`, `O`, `Fe`, `Ca`, `Si`, `Al`]
303
- return sample_elements
304
- .slice(0, 4) // Take first 4
305
- .map((el) => scheme[el] || scheme.H || `#cccccc`)
306
- .filter(Boolean)
294
+ return [`H`, `C`, `N`, `O`].map((elem) => scheme[elem] || scheme.H || `#cccccc`)
307
295
  }
308
296
  </script>
309
297
 
@@ -325,7 +313,7 @@
325
313
  {#if volumetric_data?.length && isosurface_settings}
326
314
  <IsosurfaceControls
327
315
  bind:settings={isosurface_settings}
328
- volumes={volumetric_data}
316
+ bind:volumes={volumetric_data}
329
317
  bind:active_volume_idx
330
318
  />
331
319
  {/if}
@@ -384,6 +372,7 @@
384
372
  </label>
385
373
  {#if available_vector_keys.length > 0}
386
374
  {#each available_vector_keys as key, idx (key)}
375
+ {@const key_visible = is_key_visible(key)}
387
376
  <label
388
377
  {@attach tooltip({
389
378
  content: `Toggle ${key} vectors`,
@@ -392,18 +381,18 @@
392
381
  >
393
382
  <input
394
383
  type="checkbox"
395
- checked={is_key_visible(key)}
396
- onchange={() => update_vector_config(key, { visible: !is_key_visible(key) })}
384
+ checked={key_visible}
385
+ onchange={() => update_vector_config(key, { visible: !key_visible })}
397
386
  />
398
387
  <input
399
388
  type="color"
400
389
  aria-label={`${key} vector color`}
401
390
  value={scene_props.vector_configs?.[key]?.color ??
402
- VECTOR_PALETTE[idx % VECTOR_PALETTE.length]}
391
+ VECTOR_PALETTE[idx % VECTOR_PALETTE.length]}
403
392
  onchange={(evt) =>
404
- update_vector_config(key, {
405
- color: evt.currentTarget.value,
406
- })}
393
+ update_vector_config(key, {
394
+ color: evt.currentTarget.value,
395
+ })}
407
396
  style="width: 22px; height: 22px; padding: 0; border: none; cursor: pointer"
408
397
  />
409
398
  {key}
@@ -430,10 +419,7 @@
430
419
  >
431
420
  Bonds:
432
421
  <select bind:value={scene_props.show_bonds}>
433
- {#each Object.entries(SETTINGS_CONFIG.structure.show_bonds.enum ?? {}) as
434
- [value, label]
435
- (value)
436
- }
422
+ {#each Object.entries(SETTINGS_CONFIG.structure.show_bonds.enum ?? {}) as [value, label] (value)}
437
423
  <option {value}>{label}</option>
438
424
  {/each}
439
425
  </select>
@@ -444,10 +430,7 @@
444
430
  >
445
431
  Polyhedra:
446
432
  <select bind:value={scene_props.show_polyhedra}>
447
- {#each Object.entries(SETTINGS_CONFIG.structure.show_polyhedra.enum ?? {}) as
448
- [value, label]
449
- (value)
450
- }
433
+ {#each Object.entries(SETTINGS_CONFIG.structure.show_polyhedra.enum ?? {}) as [value, label] (value)}
451
434
  <option {value}>{label}</option>
452
435
  {/each}
453
436
  </select>
@@ -484,127 +467,60 @@
484
467
  Projection
485
468
  </span>
486
469
  <select bind:value={scene_props.camera_projection}>
487
- {#each Object.entries(
488
- SETTINGS_CONFIG.structure.camera_projection.enum ?? {},
489
- ) as
490
- [value, label]
491
- (value)
492
- }
470
+ {#each Object.entries(SETTINGS_CONFIG.structure.camera_projection.enum ?? {}) as [value, label] (value)}
493
471
  <option {value}>{label}</option>
494
472
  {/each}
495
473
  </select>
496
474
  </label>
497
- <label
498
- {@attach tooltip({ content: SETTINGS_CONFIG.structure.auto_rotate.description })}
475
+ <NumberRangeInput
476
+ min={0}
477
+ max={2}
478
+ step={0.01}
479
+ bind:value={scene_props.auto_rotate}
480
+ title={SETTINGS_CONFIG.structure.auto_rotate.description}
481
+ >Auto-rotate speed</NumberRangeInput
499
482
  >
500
- Auto-rotate speed
501
- <input
502
- type="number"
503
- min={0}
504
- max={2}
505
- step={0.01}
506
- bind:value={scene_props.auto_rotate}
507
- />
508
- <input
509
- type="range"
510
- min={0}
511
- max={2}
512
- step={0.01}
513
- bind:value={scene_props.auto_rotate}
514
- />
515
- </label>
516
- <label
517
- {@attach tooltip({ content: SETTINGS_CONFIG.structure.rotate_speed.description })}
483
+ <NumberRangeInput
484
+ min={0}
485
+ max={2}
486
+ step={0.05}
487
+ bind:value={scene_props.rotate_speed}
488
+ title={SETTINGS_CONFIG.structure.rotate_speed.description}>Rotate speed</NumberRangeInput
518
489
  >
519
- Rotate speed
520
- <input
521
- type="number"
522
- min={0}
523
- max={2}
524
- step={0.05}
525
- bind:value={scene_props.rotate_speed}
526
- />
527
- <input
528
- type="range"
529
- min={0}
530
- max={2}
531
- step={0.05}
532
- bind:value={scene_props.rotate_speed}
533
- />
534
- </label>
535
- <label
536
- {@attach tooltip({ content: SETTINGS_CONFIG.structure.zoom_speed.description })}
490
+ <NumberRangeInput
491
+ min={0.1}
492
+ max={0.8}
493
+ step={0.02}
494
+ bind:value={scene_props.zoom_speed}
495
+ title={SETTINGS_CONFIG.structure.zoom_speed.description}>Zoom speed</NumberRangeInput
537
496
  >
538
- Zoom speed
539
- <input
540
- type="number"
541
- min={0.1}
542
- max={0.8}
543
- step={0.02}
544
- bind:value={scene_props.zoom_speed}
545
- />
546
- <input
547
- type="range"
548
- min={0.1}
549
- max={0.8}
550
- step={0.02}
551
- bind:value={scene_props.zoom_speed}
552
- />
553
- </label>
554
- <label
555
- {@attach tooltip({ content: SETTINGS_CONFIG.structure.pan_speed.description })}
497
+ <NumberRangeInput
498
+ min={0}
499
+ max={2}
500
+ step={0.01}
501
+ bind:value={scene_props.pan_speed}
502
+ title={SETTINGS_CONFIG.structure.pan_speed.description}>Pan speed</NumberRangeInput
556
503
  >
557
- Pan speed
558
- <input
559
- type="number"
560
- min={0}
561
- max={2}
562
- step={0.01}
563
- bind:value={scene_props.pan_speed}
564
- />
565
- <input
566
- type="range"
567
- min={0}
568
- max={2}
569
- step={0.01}
570
- bind:value={scene_props.pan_speed}
571
- />
572
- </label>
573
504
  <label
574
505
  {@attach tooltip({ content: SETTINGS_CONFIG.structure.zoom_to_cursor.description })}
575
506
  >
576
507
  <input type="checkbox" bind:checked={scene_props.zoom_to_cursor} />
577
508
  <span>Zoom to cursor</span>
578
509
  </label>
579
- <label
580
- {@attach tooltip({ content: SETTINGS_CONFIG.structure.rotation_damping.description })}
510
+ <NumberRangeInput
511
+ min={0.01}
512
+ max={0.3}
513
+ step={0.01}
514
+ bind:value={scene_props.rotation_damping}
515
+ title={SETTINGS_CONFIG.structure.rotation_damping.description}
516
+ >Rotation damping</NumberRangeInput
581
517
  >
582
- Rotation damping
583
- <input
584
- type="number"
585
- min={0.01}
586
- max={0.3}
587
- step={0.01}
588
- bind:value={scene_props.rotation_damping}
589
- />
590
- <input
591
- type="range"
592
- min={0.01}
593
- max={0.3}
594
- step={0.01}
595
- bind:value={scene_props.rotation_damping}
596
- />
597
- </label>
598
518
 
599
519
  Axis Rotation
600
520
  <div class="rotation-axes">
601
521
  {#each AXIS_COLORS as [axis, color], idx (axis)}
602
522
  <div>
603
- <div
604
- {@attach tooltip()}
605
- title="{axis}-axis rotation in degrees"
606
- style:color
607
- >
523
+ <div {@attach tooltip()} title="{axis}-axis rotation in degrees" style:color>
608
524
  <span>{axis.toUpperCase()} = </span>
609
525
  <input
610
526
  type="number"
@@ -612,8 +528,7 @@
612
528
  max={360}
613
529
  step={1}
614
530
  value={rotation_degrees[idx].toFixed(0)}
615
- oninput={(event) =>
616
- update_rotation(axis, Number(event.currentTarget.value))}
531
+ oninput={(event) => update_rotation(axis, Number(event.currentTarget.value))}
617
532
  style:color
618
533
  style="margin: 0"
619
534
  />
@@ -653,34 +568,21 @@
653
568
  color_scale_selected = [DEFAULTS.structure.atom_color_scale]
654
569
  }}
655
570
  >
656
- <label
657
- {@attach tooltip({ content: SETTINGS_CONFIG.structure.atom_radius.description })}
571
+ <NumberRangeInput
572
+ min={0.2}
573
+ max={2}
574
+ step={0.05}
575
+ bind:value={scene_props.atom_radius}
576
+ title={SETTINGS_CONFIG.structure.atom_radius.description}
577
+ >Radius <small>(Å)</small></NumberRangeInput
658
578
  >
659
- Radius <small>(Å)</small>
660
- <input
661
- type="number"
662
- min={0.2}
663
- max={2}
664
- step={0.05}
665
- bind:value={scene_props.atom_radius}
666
- />
667
- <input
668
- type="range"
669
- min={0.2}
670
- max={2}
671
- step={0.05}
672
- bind:value={scene_props.atom_radius}
673
- />
674
- </label>
675
579
  <label
676
580
  {@attach tooltip({ content: SETTINGS_CONFIG.structure.same_size_atoms.description })}
677
581
  >
678
582
  Same size atoms
679
583
  <input type="checkbox" bind:checked={scene_props.same_size_atoms} />
680
584
  </label>
681
- <label
682
- {@attach tooltip({ content: SETTINGS_CONFIG.color_scheme.description })}
683
- >
585
+ <label {@attach tooltip({ content: SETTINGS_CONFIG.color_scheme.description })}>
684
586
  Color scheme
685
587
  <Select
686
588
  options={Object.keys(ELEMENT_COLOR_SCHEMES)}
@@ -695,14 +597,12 @@
695
597
  aria-label="Color scheme"
696
598
  >
697
599
  {#snippet children({ option })}
698
- {@const option_style =
699
- `display: flex; align-items: center; gap: 6pt; justify-content: space-between;`}
600
+ {@const option_style = `display: flex; align-items: center; gap: 6pt; justify-content: space-between;`}
700
601
  <div style={option_style}>
701
602
  {option}
702
603
  <div style="display: flex; gap: 3pt">
703
604
  {#each get_representative_colors(String(option)) as color (color)}
704
- {@const color_style =
705
- `width: 15px; height: 15px; border-radius: 2px; background: ${color};`}
605
+ {@const color_style = `width: 15px; height: 15px; border-radius: 2px; background: ${color};`}
706
606
  <div style={color_style}></div>
707
607
  {/each}
708
608
  </div>
@@ -715,10 +615,7 @@
715
615
  >
716
616
  Atom coloring
717
617
  <select bind:value={atom_color_config.mode}>
718
- {#each Object.entries(SETTINGS_CONFIG.structure.atom_color_mode.enum || {}) as
719
- [value, label]
720
- (value)
721
- }
618
+ {#each Object.entries(SETTINGS_CONFIG.structure.atom_color_mode.enum || {}) as [value, label] (value)}
722
619
  <option {value} disabled={!sym_data && value === `wyckoff`}>{label}</option>
723
620
  {/each}
724
621
  </select>
@@ -866,31 +763,16 @@
866
763
  scene_props.vector_color_mode = DEFAULTS.structure.vector_color_mode
867
764
  scene_props.vector_color_scale = DEFAULTS.structure.vector_color_scale
868
765
  scene_props.vector_normalize = DEFAULTS.structure.vector_normalize
869
- scene_props.vector_uniform_thickness =
870
- DEFAULTS.structure.vector_uniform_thickness
766
+ scene_props.vector_uniform_thickness = DEFAULTS.structure.vector_uniform_thickness
871
767
  scene_props.vector_origin_gap = DEFAULTS.structure.vector_origin_gap
872
768
  for (const key of available_vector_keys) {
873
769
  update_vector_config(key, { scale: null })
874
770
  }
875
771
  }}
876
772
  >
877
- <label>
878
- Global Scale
879
- <input
880
- type="number"
881
- min={0.001}
882
- max={5}
883
- step={0.001}
884
- bind:value={scene_props.vector_scale}
885
- />
886
- <input
887
- type="range"
888
- min={0.001}
889
- max={5}
890
- step={0.001}
891
- bind:value={scene_props.vector_scale}
892
- />
893
- </label>
773
+ <NumberRangeInput min={0.001} max={5} step={0.001} bind:value={scene_props.vector_scale}
774
+ >Global Scale</NumberRangeInput
775
+ >
894
776
  <label
895
777
  {@attach tooltip({ content: SETTINGS_CONFIG.structure.vector_normalize.description })}
896
778
  style="gap: 6pt"
@@ -899,7 +781,9 @@
899
781
  Normalize
900
782
  </label>
901
783
  <label
902
- {@attach tooltip({ content: SETTINGS_CONFIG.structure.vector_uniform_thickness.description })}
784
+ {@attach tooltip({
785
+ content: SETTINGS_CONFIG.structure.vector_uniform_thickness.description,
786
+ })}
903
787
  style="gap: 6pt"
904
788
  >
905
789
  <input type="checkbox" bind:checked={scene_props.vector_uniform_thickness} />
@@ -931,35 +815,24 @@
931
815
  </label>
932
816
  {/if}
933
817
  {#if available_vector_keys.length > 1}
934
- <label
935
- {@attach tooltip({ content: SETTINGS_CONFIG.structure.vector_origin_gap.description })}
818
+ <NumberRangeInput
819
+ min={0}
820
+ max={0.5}
821
+ step={0.02}
822
+ bind:value={scene_props.vector_origin_gap}
823
+ title={SETTINGS_CONFIG.structure.vector_origin_gap.description}
824
+ >Origin Gap</NumberRangeInput
936
825
  >
937
- Origin Gap
938
- <input
939
- type="number"
940
- min={0}
941
- max={0.5}
942
- step={0.02}
943
- bind:value={scene_props.vector_origin_gap}
944
- />
945
- <input
946
- type="range"
947
- min={0}
948
- max={0.5}
949
- step={0.02}
950
- bind:value={scene_props.vector_origin_gap}
951
- />
952
- </label>
953
826
  {#each available_vector_keys as key (key)}
954
827
  {#if is_key_visible(key)}
955
- {@const on_scale = (
956
- evt: Event & { currentTarget: HTMLInputElement },
957
- ) => {
958
- const parsed = parseFloat(evt.currentTarget.value)
959
- update_vector_config(key, { scale: Number.isNaN(parsed) ? 1.0 : parsed })
960
- }}
828
+ {@const on_scale = (evt: Event & { currentTarget: HTMLInputElement }) => {
829
+ const parsed = parseFloat(evt.currentTarget.value)
830
+ update_vector_config(key, { scale: Number.isNaN(parsed) ? 1.0 : parsed })
831
+ }}
961
832
  <label
962
- {@attach tooltip({ content: `Scale multiplier for ${key} arrows (applied on top of global scale)` })}
833
+ {@attach tooltip({
834
+ content: `Scale multiplier for ${key} arrows (applied on top of global scale)`,
835
+ })}
963
836
  >
964
837
  {key} scale
965
838
  <input
@@ -1021,7 +894,9 @@
1021
894
  </label>
1022
895
  <label>
1023
896
  <span
1024
- {@attach tooltip({ content: `Create supercells by repeating the unit cell. Examples: "2x2x2", "3x1x2", or "2"` })}
897
+ {@attach tooltip({
898
+ content: `Create supercells by repeating the unit cell. Examples: "2x2x2", "3x1x2", or "2"`,
899
+ })}
1025
900
  >
1026
901
  Supercell Scaling
1027
902
  </span>
@@ -1038,20 +913,15 @@
1038
913
  pattern="^(\d+|\d+x\d+x\d+)$"
1039
914
  aria-invalid={!supercell_input_valid}
1040
915
  title={supercell_input_valid
1041
- ? `Valid supercell scaling: ${supercell_scaling}`
1042
- : `Invalid format. Use "2x2x2", "3x1x2", or "2"`}
916
+ ? `Valid supercell scaling: ${supercell_scaling}`
917
+ : `Invalid format. Use "2x2x2", "3x1x2", or "2"`}
1043
918
  />
1044
919
  </label>
1045
920
  {#if supercell_loading}
1046
- <div
1047
- style="display: flex; align-items: center; gap: 8px; font-size: 0.85em; color: var(--accent-color); margin-top: 4pt"
1048
- >
1049
- <span
1050
- class="spinner-icon"
1051
- style="display: inline-block; width: 12px; height: 12px; border: 2px solid currentColor; border-right-color: transparent; border-radius: 50%; animation: spin 0.8s linear infinite"
1052
- ></span>
1053
- <span>Generating supercell...</span>
1054
- </div>
921
+ <Spinner
922
+ text="Generating supercell..."
923
+ style="--spinner-size: 12px; --spinner-border-width: 2px; --spinner-margin: 4pt 0 0; font-size: 0.85em; color: var(--accent-color)"
924
+ />
1055
925
  {/if}
1056
926
 
1057
927
  {#if !supercell_input_valid}
@@ -1063,48 +933,15 @@
1063
933
  </div>
1064
934
  {/if}
1065
935
 
1066
- {#each [
1067
- {
1068
- label: `Edge color`,
1069
- color_prop: `cell_edge_color`,
1070
- opacity_prop: `cell_edge_opacity`,
1071
- step: 0.05,
1072
- },
1073
- {
1074
- label: `Surface color`,
1075
- color_prop: `cell_surface_color`,
1076
- opacity_prop: `cell_surface_opacity`,
1077
- step: 0.01,
1078
- },
1079
- ] as const as
1080
- { label, color_prop, opacity_prop, step }
1081
- (label)
1082
- }
936
+ {#each [{ label: `Edge color`, color_prop: `cell_edge_color`, opacity_prop: `cell_edge_opacity`, step: 0.05 }, { label: `Surface color`, color_prop: `cell_surface_color`, opacity_prop: `cell_surface_opacity`, step: 0.01 }] as const as { label, color_prop, opacity_prop, step } (label)}
1083
937
  <div class="pane-row">
1084
938
  <label>
1085
939
  {label}
1086
- <input
1087
- type="color"
1088
- bind:value={lattice_props[color_prop]}
1089
- />
940
+ <input type="color" bind:value={lattice_props[color_prop]} />
1090
941
  </label>
1091
- <label>
942
+ <NumberRangeInput min={0} max={1} {step} bind:value={lattice_props[opacity_prop]}>
1092
943
  opacity
1093
- <input
1094
- type="number"
1095
- min={0}
1096
- max={1}
1097
- {step}
1098
- bind:value={lattice_props[opacity_prop]}
1099
- />
1100
- <input
1101
- type="range"
1102
- min={0}
1103
- max={1}
1104
- {step}
1105
- bind:value={lattice_props[opacity_prop]}
1106
- />
1107
- </label>
944
+ </NumberRangeInput>
1108
945
  </div>
1109
946
  {/each}
1110
947
  </SettingsSection>
@@ -1133,17 +970,9 @@
1133
970
  }}
1134
971
  />
1135
972
  </label>
1136
- <label>
973
+ <NumberRangeInput min={0} max={1} step={0.02} bind:value={background_opacity}>
1137
974
  Opacity
1138
- <input
1139
- type="number"
1140
- min={0}
1141
- max={1}
1142
- step={0.02}
1143
- bind:value={background_opacity}
1144
- />
1145
- <input type="range" min={0} max={1} step={0.02} bind:value={background_opacity} />
1146
- </label>
975
+ </NumberRangeInput>
1147
976
  </div>
1148
977
  </SettingsSection>
1149
978
 
@@ -1158,44 +987,22 @@
1158
987
  scene_props.ambient_light = DEFAULTS.structure.ambient_light
1159
988
  }}
1160
989
  >
1161
- <label>
1162
- <span title="Intensity of the directional light" {@attach tooltip()}>
1163
- Directional light
1164
- </span>
1165
- <input
1166
- type="number"
1167
- min={0}
1168
- max={4}
1169
- step={0.01}
1170
- bind:value={scene_props.directional_light}
1171
- />
1172
- <input
1173
- type="range"
1174
- min={0}
1175
- max={4}
1176
- step={0.01}
1177
- bind:value={scene_props.directional_light}
1178
- />
1179
- </label>
1180
- <label>
1181
- <span title="Intensity of the ambient light" {@attach tooltip()}>
1182
- Ambient light
1183
- </span>
1184
- <input
1185
- type="number"
1186
- min={0.5}
1187
- max={3}
1188
- step={0.05}
1189
- bind:value={scene_props.ambient_light}
1190
- />
1191
- <input
1192
- type="range"
1193
- min={0.5}
1194
- max={3}
1195
- step={0.05}
1196
- bind:value={scene_props.ambient_light}
1197
- />
1198
- </label>
990
+ <NumberRangeInput
991
+ min={0}
992
+ max={4}
993
+ step={0.01}
994
+ bind:value={scene_props.directional_light}
995
+ title={SETTINGS_CONFIG.structure.directional_light.description}
996
+ >Directional light</NumberRangeInput
997
+ >
998
+ <NumberRangeInput
999
+ min={0.5}
1000
+ max={3}
1001
+ step={0.05}
1002
+ bind:value={scene_props.ambient_light}
1003
+ title={SETTINGS_CONFIG.structure.ambient_light.description}
1004
+ >Ambient light</NumberRangeInput
1005
+ >
1199
1006
  </SettingsSection>
1200
1007
 
1201
1008
  {#if scene_props.show_bonds && scene_props.show_bonds !== `never`}
@@ -1218,12 +1025,7 @@
1218
1025
  >
1219
1026
  <label>
1220
1027
  Strategy <select bind:value={scene_props.bonding_strategy}>
1221
- {#each Object.entries(
1222
- SETTINGS_CONFIG.structure.bonding_strategy.enum ?? {},
1223
- ) as
1224
- [value, label]
1225
- (value)
1226
- }
1028
+ {#each Object.entries(SETTINGS_CONFIG.structure.bonding_strategy.enum ?? {}) as [value, label] (value)}
1227
1029
  <option {value}>{label}</option>
1228
1030
  {/each}
1229
1031
  </select>
@@ -1237,15 +1039,12 @@
1237
1039
  </label>
1238
1040
  {#if scene_props.auto_bond_order}
1239
1041
  <label
1240
- {@attach tooltip({ content: SETTINGS_CONFIG.structure.aromatic_display.description })}
1042
+ {@attach tooltip({
1043
+ content: SETTINGS_CONFIG.structure.aromatic_display.description,
1044
+ })}
1241
1045
  >
1242
1046
  Aromatic display <select bind:value={scene_props.aromatic_display}>
1243
- {#each Object.entries(
1244
- SETTINGS_CONFIG.structure.aromatic_display.enum ?? {},
1245
- ) as
1246
- [value, label]
1247
- (value)
1248
- }
1047
+ {#each Object.entries(SETTINGS_CONFIG.structure.aromatic_display.enum ?? {}) as [value, label] (value)}
1249
1048
  <option {value}>{label}</option>
1250
1049
  {/each}
1251
1050
  </select>
@@ -1254,23 +1053,14 @@
1254
1053
  <label>
1255
1054
  Color <input type="color" bind:value={scene_props.bond_color} />
1256
1055
  </label>
1257
- <label>
1056
+ <NumberRangeInput
1057
+ min={0.05}
1058
+ max={0.5}
1059
+ step={0.05}
1060
+ bind:value={scene_props.bond_thickness}
1061
+ >
1258
1062
  Thickness
1259
- <input
1260
- type="number"
1261
- min={0.05}
1262
- max={0.5}
1263
- step={0.05}
1264
- bind:value={scene_props.bond_thickness}
1265
- />
1266
- <input
1267
- type="range"
1268
- min={0.05}
1269
- max={0.5}
1270
- step={0.05}
1271
- bind:value={scene_props.bond_thickness}
1272
- />
1273
- </label>
1063
+ </NumberRangeInput>
1274
1064
  </SettingsSection>
1275
1065
  {/if}
1276
1066
 
@@ -1305,39 +1095,21 @@
1305
1095
  DEFAULTS.structure.polyhedra_included_elements
1306
1096
  }}
1307
1097
  >
1308
- <label
1309
- {@attach tooltip({
1310
- content: SETTINGS_CONFIG.structure.polyhedra_opacity.description,
1311
- })}
1098
+ <NumberRangeInput
1099
+ min={0}
1100
+ max={1}
1101
+ step={0.05}
1102
+ bind:value={scene_props.polyhedra_opacity}
1103
+ title={SETTINGS_CONFIG.structure.polyhedra_opacity.description}
1104
+ >Opacity</NumberRangeInput
1312
1105
  >
1313
- Opacity
1314
- <input
1315
- type="number"
1316
- min={0}
1317
- max={1}
1318
- step={0.05}
1319
- bind:value={scene_props.polyhedra_opacity}
1320
- />
1321
- <input
1322
- type="range"
1323
- min={0}
1324
- max={1}
1325
- step={0.05}
1326
- bind:value={scene_props.polyhedra_opacity}
1327
- />
1328
- </label>
1329
1106
  <label
1330
1107
  {@attach tooltip({
1331
1108
  content: SETTINGS_CONFIG.structure.polyhedra_color_mode.description,
1332
1109
  })}
1333
1110
  >
1334
1111
  Color <select bind:value={scene_props.polyhedra_color_mode}>
1335
- {#each Object.entries(
1336
- SETTINGS_CONFIG.structure.polyhedra_color_mode.enum ?? {},
1337
- ) as
1338
- [value, label]
1339
- (value)
1340
- }
1112
+ {#each Object.entries(SETTINGS_CONFIG.structure.polyhedra_color_mode.enum ?? {}) as [value, label] (value)}
1341
1113
  <option {value}>{label}</option>
1342
1114
  {/each}
1343
1115
  </select>
@@ -1366,53 +1138,29 @@
1366
1138
  <input type="checkbox" bind:checked={scene_props.polyhedra_hide_center_atoms} />
1367
1139
  Hide center atoms
1368
1140
  </label>
1369
- <label
1370
- {@attach tooltip({
1371
- content: SETTINGS_CONFIG.structure.polyhedra_min_neighbors.description,
1372
- })}
1141
+ <NumberRangeInput
1142
+ min={4}
1143
+ max={12}
1144
+ step={1}
1145
+ bind:value={scene_props.polyhedra_min_neighbors}
1146
+ title={SETTINGS_CONFIG.structure.polyhedra_min_neighbors.description}
1147
+ >Min neighbors</NumberRangeInput
1373
1148
  >
1374
- Min neighbors
1375
- <input
1376
- type="number"
1377
- min={4}
1378
- max={12}
1379
- step={1}
1380
- bind:value={scene_props.polyhedra_min_neighbors}
1381
- />
1382
- <input
1383
- type="range"
1384
- min={4}
1385
- max={12}
1386
- step={1}
1387
- bind:value={scene_props.polyhedra_min_neighbors}
1388
- />
1389
- </label>
1390
- <label
1391
- {@attach tooltip({
1392
- content: SETTINGS_CONFIG.structure.polyhedra_max_neighbors.description,
1393
- })}
1149
+ <NumberRangeInput
1150
+ min={4}
1151
+ max={16}
1152
+ step={1}
1153
+ bind:value={scene_props.polyhedra_max_neighbors}
1154
+ title={SETTINGS_CONFIG.structure.polyhedra_max_neighbors.description}
1155
+ >Max neighbors</NumberRangeInput
1394
1156
  >
1395
- Max neighbors
1396
- <input
1397
- type="number"
1398
- min={4}
1399
- max={16}
1400
- step={1}
1401
- bind:value={scene_props.polyhedra_max_neighbors}
1402
- />
1403
- <input
1404
- type="range"
1405
- min={4}
1406
- max={16}
1407
- step={1}
1408
- bind:value={scene_props.polyhedra_max_neighbors}
1409
- />
1410
- </label>
1411
1157
  {#if structure_elements.length > 0}
1412
1158
  <div
1413
1159
  style="display: flex; flex-wrap: wrap; gap: 8pt; align-items: center"
1414
1160
  {@attach tooltip({
1415
- content: SETTINGS_CONFIG.structure.polyhedra_excluded_elements.description,
1161
+ content: `${
1162
+ SETTINGS_CONFIG.structure.polyhedra_excluded_elements.description
1163
+ }. Force-including a spectator center (alkali or heavy alkaline-earth, e.g. Li, Na, Ba) may render its polyhedra truncated at cell boundaries.`,
1416
1164
  })}
1417
1165
  >
1418
1166
  Centers:
@@ -1477,12 +1225,4 @@
1477
1225
  flex: 1;
1478
1226
  min-width: 40px;
1479
1227
  }
1480
- @keyframes spin {
1481
- from {
1482
- transform: rotate(0deg);
1483
- }
1484
- to {
1485
- transform: rotate(360deg);
1486
- }
1487
- }
1488
1228
  </style>