matterviz 0.3.1 → 0.3.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 (358) hide show
  1. package/dist/EmptyState.svelte +10 -2
  2. package/dist/FilePicker.svelte +154 -96
  3. package/dist/Icon.svelte +20 -14
  4. package/dist/MillerIndexInput.svelte +27 -21
  5. package/dist/api/optimade.js +6 -6
  6. package/dist/app.css +216 -178
  7. package/dist/brillouin/BrillouinZone.svelte +299 -198
  8. package/dist/brillouin/BrillouinZone.svelte.d.ts +1 -1
  9. package/dist/brillouin/BrillouinZoneControls.svelte +32 -5
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte +74 -55
  11. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  12. package/dist/brillouin/BrillouinZoneInfoPane.svelte +99 -68
  13. package/dist/brillouin/BrillouinZoneScene.svelte +277 -165
  14. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  15. package/dist/brillouin/BrillouinZoneTooltip.svelte +17 -7
  16. package/dist/brillouin/compute.js +11 -6
  17. package/dist/chempot-diagram/ChemPotDiagram.svelte +327 -0
  18. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +13 -0
  19. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +847 -0
  20. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +16 -0
  21. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +3194 -0
  22. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +16 -0
  23. package/dist/chempot-diagram/ChemPotScene3D.svelte +11 -0
  24. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +7 -0
  25. package/dist/chempot-diagram/async-compute.svelte.d.ts +3 -0
  26. package/dist/chempot-diagram/async-compute.svelte.js +77 -0
  27. package/dist/chempot-diagram/chempot-worker.d.ts +1 -0
  28. package/dist/chempot-diagram/chempot-worker.js +11 -0
  29. package/dist/chempot-diagram/color.d.ts +10 -0
  30. package/dist/chempot-diagram/color.js +32 -0
  31. package/dist/chempot-diagram/compute.d.ts +48 -0
  32. package/dist/chempot-diagram/compute.js +812 -0
  33. package/dist/chempot-diagram/index.d.ts +6 -0
  34. package/dist/chempot-diagram/index.js +6 -0
  35. package/dist/chempot-diagram/pointer.d.ts +16 -0
  36. package/dist/chempot-diagram/pointer.js +40 -0
  37. package/dist/chempot-diagram/temperature.d.ts +15 -0
  38. package/dist/chempot-diagram/temperature.js +36 -0
  39. package/dist/chempot-diagram/types.d.ts +86 -0
  40. package/dist/chempot-diagram/types.js +28 -0
  41. package/dist/colors/index.d.ts +3 -1
  42. package/dist/colors/index.js +9 -3
  43. package/dist/composition/BarChart.svelte +141 -77
  44. package/dist/composition/BubbleChart.svelte +107 -52
  45. package/dist/composition/Composition.svelte +100 -79
  46. package/dist/composition/Formula.svelte +108 -62
  47. package/dist/composition/FormulaFilter.svelte +973 -353
  48. package/dist/composition/FormulaFilter.svelte.d.ts +35 -1
  49. package/dist/composition/PieChart.svelte +199 -99
  50. package/dist/composition/PieChart.svelte.d.ts +1 -1
  51. package/dist/composition/format.d.ts +5 -0
  52. package/dist/composition/format.js +20 -3
  53. package/dist/composition/parse.js +14 -9
  54. package/dist/convex-hull/ConvexHull.svelte +93 -38
  55. package/dist/convex-hull/ConvexHull2D.svelte +551 -393
  56. package/dist/convex-hull/ConvexHull3D.svelte +1303 -825
  57. package/dist/convex-hull/ConvexHull4D.svelte +1012 -686
  58. package/dist/convex-hull/ConvexHullControls.svelte +115 -28
  59. package/dist/convex-hull/ConvexHullInfoPane.svelte +29 -3
  60. package/dist/convex-hull/ConvexHullStats.svelte +821 -249
  61. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +6 -1
  62. package/dist/convex-hull/ConvexHullTooltip.svelte +41 -16
  63. package/dist/convex-hull/GasPressureControls.svelte +104 -61
  64. package/dist/convex-hull/StructurePopup.svelte +25 -4
  65. package/dist/convex-hull/TemperatureSlider.svelte +45 -25
  66. package/dist/convex-hull/barycentric-coords.js +13 -7
  67. package/dist/convex-hull/demo-temperature.d.ts +6 -0
  68. package/dist/convex-hull/demo-temperature.js +40 -0
  69. package/dist/convex-hull/gas-thermodynamics.js +17 -12
  70. package/dist/convex-hull/helpers.d.ts +10 -1
  71. package/dist/convex-hull/helpers.js +79 -38
  72. package/dist/convex-hull/index.d.ts +1 -0
  73. package/dist/convex-hull/index.js +1 -0
  74. package/dist/convex-hull/thermodynamics.d.ts +8 -21
  75. package/dist/convex-hull/thermodynamics.js +163 -69
  76. package/dist/convex-hull/types.d.ts +12 -12
  77. package/dist/convex-hull/types.js +0 -12
  78. package/dist/coordination/CoordinationBarPlot.svelte +232 -176
  79. package/dist/element/BohrAtom.svelte +56 -13
  80. package/dist/element/ElementHeading.svelte +7 -2
  81. package/dist/element/ElementPhoto.svelte +15 -9
  82. package/dist/element/ElementStats.svelte +10 -4
  83. package/dist/element/ElementTile.svelte +137 -73
  84. package/dist/element/Nucleus.svelte +39 -11
  85. package/dist/element/data.js +2 -14
  86. package/dist/element/data.json.gz +0 -0
  87. package/dist/element/types.d.ts +1 -0
  88. package/dist/feedback/ClickFeedback.svelte +16 -5
  89. package/dist/feedback/DragOverlay.svelte +10 -2
  90. package/dist/feedback/Spinner.svelte +4 -2
  91. package/dist/feedback/StatusMessage.svelte +8 -2
  92. package/dist/fermi-surface/FermiSlice.svelte +118 -88
  93. package/dist/fermi-surface/FermiSurface.svelte +336 -239
  94. package/dist/fermi-surface/FermiSurface.svelte.d.ts +1 -1
  95. package/dist/fermi-surface/FermiSurfaceControls.svelte +113 -46
  96. package/dist/fermi-surface/FermiSurfaceScene.svelte +536 -343
  97. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  98. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +14 -5
  99. package/dist/fermi-surface/compute.js +16 -20
  100. package/dist/fermi-surface/parse.js +37 -33
  101. package/dist/fermi-surface/symmetry.js +2 -7
  102. package/dist/fermi-surface/types.d.ts +3 -5
  103. package/dist/heatmap-matrix/HeatmapMatrix.svelte +1527 -0
  104. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +110 -0
  105. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +225 -0
  106. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +30 -0
  107. package/dist/heatmap-matrix/index.d.ts +53 -0
  108. package/dist/heatmap-matrix/index.js +100 -0
  109. package/dist/heatmap-matrix/shared.d.ts +2 -0
  110. package/dist/heatmap-matrix/shared.js +4 -0
  111. package/dist/icons.d.ts +111 -0
  112. package/dist/icons.js +158 -0
  113. package/dist/index.d.ts +5 -2
  114. package/dist/index.js +5 -2
  115. package/dist/io/decompress.js +1 -1
  116. package/dist/io/export.d.ts +3 -0
  117. package/dist/io/export.js +138 -140
  118. package/dist/io/file-drop.d.ts +7 -0
  119. package/dist/io/file-drop.js +43 -0
  120. package/dist/io/index.d.ts +2 -2
  121. package/dist/io/index.js +2 -112
  122. package/dist/io/is-binary.js +2 -3
  123. package/dist/io/types.d.ts +1 -0
  124. package/dist/io/url-drop.d.ts +2 -0
  125. package/dist/io/url-drop.js +117 -0
  126. package/dist/isosurface/Isosurface.svelte +220 -110
  127. package/dist/isosurface/IsosurfaceControls.svelte +65 -28
  128. package/dist/isosurface/parse.js +104 -56
  129. package/dist/isosurface/slice.d.ts +2 -1
  130. package/dist/isosurface/slice.js +8 -13
  131. package/dist/isosurface/types.d.ts +14 -1
  132. package/dist/isosurface/types.js +152 -5
  133. package/dist/labels.d.ts +2 -1
  134. package/dist/labels.js +12 -8
  135. package/dist/layout/FullscreenToggle.svelte +11 -2
  136. package/dist/layout/InfoCard.svelte +38 -6
  137. package/dist/layout/InfoTag.svelte +125 -94
  138. package/dist/layout/PropertyFilter.svelte +82 -37
  139. package/dist/layout/SettingsSection.svelte +85 -55
  140. package/dist/layout/SubpageGrid.svelte +82 -0
  141. package/dist/layout/SubpageGrid.svelte.d.ts +14 -0
  142. package/dist/layout/index.d.ts +1 -0
  143. package/dist/layout/index.js +1 -0
  144. package/dist/layout/json-tree/JsonNode.svelte +266 -223
  145. package/dist/layout/json-tree/JsonTree.svelte +516 -429
  146. package/dist/layout/json-tree/JsonTree.svelte.d.ts +1 -1
  147. package/dist/layout/json-tree/JsonValue.svelte +281 -173
  148. package/dist/layout/json-tree/types.d.ts +10 -2
  149. package/dist/layout/json-tree/utils.d.ts +2 -0
  150. package/dist/layout/json-tree/utils.js +37 -2
  151. package/dist/marching-cubes.js +25 -2
  152. package/dist/math.d.ts +20 -17
  153. package/dist/math.js +474 -57
  154. package/dist/overlays/ContextMenu.svelte +66 -40
  155. package/dist/overlays/DraggablePane.svelte +331 -154
  156. package/dist/overlays/DraggablePane.svelte.d.ts +2 -0
  157. package/dist/periodic-table/PeriodicTable.svelte +278 -145
  158. package/dist/periodic-table/PeriodicTableControls.svelte +178 -128
  159. package/dist/periodic-table/PropertySelect.svelte +25 -7
  160. package/dist/periodic-table/TableInset.svelte +8 -3
  161. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +559 -267
  162. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -2
  163. package/dist/phase-diagram/PhaseDiagramControls.svelte +131 -51
  164. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +3 -2
  165. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +126 -0
  166. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +15 -0
  167. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +160 -110
  168. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +8 -1
  169. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +217 -86
  170. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +6 -3
  171. package/dist/phase-diagram/TdbInfoPanel.svelte +28 -4
  172. package/dist/phase-diagram/build-diagram.js +9 -9
  173. package/dist/phase-diagram/colors.js +1 -3
  174. package/dist/phase-diagram/index.d.ts +2 -0
  175. package/dist/phase-diagram/index.js +2 -0
  176. package/dist/phase-diagram/parse.js +10 -9
  177. package/dist/phase-diagram/svg-to-diagram.d.ts +2 -0
  178. package/dist/phase-diagram/svg-to-diagram.js +869 -0
  179. package/dist/phase-diagram/types.d.ts +10 -0
  180. package/dist/phase-diagram/utils.d.ts +8 -4
  181. package/dist/phase-diagram/utils.js +219 -74
  182. package/dist/plot/AxisLabel.svelte +51 -0
  183. package/dist/plot/AxisLabel.svelte.d.ts +16 -0
  184. package/dist/plot/BarPlot.svelte +1461 -768
  185. package/dist/plot/BarPlot.svelte.d.ts +3 -3
  186. package/dist/plot/BarPlotControls.svelte +33 -6
  187. package/dist/plot/BarPlotControls.svelte.d.ts +1 -1
  188. package/dist/plot/ColorBar.svelte +533 -383
  189. package/dist/plot/ColorBar.svelte.d.ts +1 -1
  190. package/dist/plot/ColorScaleSelect.svelte +28 -7
  191. package/dist/plot/ElementScatter.svelte +38 -16
  192. package/dist/plot/FillArea.svelte +152 -92
  193. package/dist/plot/Histogram.svelte +1162 -709
  194. package/dist/plot/Histogram.svelte.d.ts +1 -1
  195. package/dist/plot/HistogramControls.svelte +81 -18
  196. package/dist/plot/HistogramControls.svelte.d.ts +6 -2
  197. package/dist/plot/InteractiveAxisLabel.svelte +34 -11
  198. package/dist/plot/InteractiveAxisLabel.svelte.d.ts +1 -1
  199. package/dist/plot/Line.svelte +63 -28
  200. package/dist/plot/PlotControls.svelte +221 -96
  201. package/dist/plot/PlotControls.svelte.d.ts +1 -1
  202. package/dist/plot/PlotLegend.svelte +174 -91
  203. package/dist/plot/PlotTooltip.svelte +45 -6
  204. package/dist/plot/PortalSelect.svelte +175 -146
  205. package/dist/plot/ReferenceLine.svelte +77 -22
  206. package/dist/plot/ReferenceLine.svelte.d.ts +1 -0
  207. package/dist/plot/ReferenceLine3D.svelte +132 -107
  208. package/dist/plot/ReferencePlane.svelte +146 -123
  209. package/dist/plot/ScatterPlot.svelte +1880 -1156
  210. package/dist/plot/ScatterPlot.svelte.d.ts +3 -3
  211. package/dist/plot/ScatterPlot3D.svelte +256 -131
  212. package/dist/plot/ScatterPlot3D.svelte.d.ts +2 -2
  213. package/dist/plot/ScatterPlot3DControls.svelte +300 -297
  214. package/dist/plot/ScatterPlot3DControls.svelte.d.ts +2 -1
  215. package/dist/plot/ScatterPlot3DScene.svelte +608 -406
  216. package/dist/plot/ScatterPlot3DScene.svelte.d.ts +2 -2
  217. package/dist/plot/ScatterPlotControls.svelte +150 -70
  218. package/dist/plot/ScatterPlotControls.svelte.d.ts +1 -1
  219. package/dist/plot/ScatterPoint.svelte +98 -26
  220. package/dist/plot/ScatterPoint.svelte.d.ts +1 -0
  221. package/dist/plot/SpacegroupBarPlot.svelte +142 -85
  222. package/dist/plot/Surface3D.svelte +159 -108
  223. package/dist/plot/ZeroLines.svelte +96 -0
  224. package/dist/plot/ZeroLines.svelte.d.ts +32 -0
  225. package/dist/plot/ZoomRect.svelte +23 -0
  226. package/dist/plot/ZoomRect.svelte.d.ts +8 -0
  227. package/dist/plot/axis-utils.d.ts +1 -1
  228. package/dist/plot/axis-utils.js +1 -3
  229. package/dist/plot/data-cleaning.js +12 -28
  230. package/dist/plot/data-transform.js +2 -1
  231. package/dist/plot/fill-utils.js +2 -0
  232. package/dist/plot/index.d.ts +6 -2
  233. package/dist/plot/index.js +6 -2
  234. package/dist/plot/interactions.d.ts +8 -10
  235. package/dist/plot/interactions.js +2 -3
  236. package/dist/plot/layout.d.ts +11 -2
  237. package/dist/plot/layout.js +44 -17
  238. package/dist/plot/reference-line.d.ts +5 -22
  239. package/dist/plot/reference-line.js +12 -84
  240. package/dist/plot/scales.js +24 -36
  241. package/dist/plot/types.d.ts +53 -40
  242. package/dist/plot/types.js +12 -7
  243. package/dist/plot/utils/label-placement.d.ts +32 -15
  244. package/dist/plot/utils/label-placement.js +227 -63
  245. package/dist/plot/utils/series-visibility.js +2 -3
  246. package/dist/plot/utils.d.ts +1 -0
  247. package/dist/plot/utils.js +14 -0
  248. package/dist/rdf/RdfPlot.svelte +173 -132
  249. package/dist/rdf/calc-rdf.js +4 -5
  250. package/dist/sanitize.d.ts +4 -0
  251. package/dist/sanitize.js +107 -0
  252. package/dist/settings.d.ts +21 -6
  253. package/dist/settings.js +63 -19
  254. package/dist/spectral/Bands.svelte +963 -412
  255. package/dist/spectral/Bands.svelte.d.ts +22 -2
  256. package/dist/spectral/BandsAndDos.svelte +90 -49
  257. package/dist/spectral/BrillouinBandsDos.svelte +151 -93
  258. package/dist/spectral/Dos.svelte +389 -258
  259. package/dist/spectral/helpers.d.ts +23 -1
  260. package/dist/spectral/helpers.js +119 -51
  261. package/dist/spectral/types.d.ts +2 -0
  262. package/dist/state.svelte.d.ts +1 -1
  263. package/dist/state.svelte.js +3 -2
  264. package/dist/structure/Arrow.svelte +59 -20
  265. package/dist/structure/AtomLegend.svelte +231 -129
  266. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  267. package/dist/structure/Bond.svelte +73 -47
  268. package/dist/structure/CanvasTooltip.svelte +10 -2
  269. package/dist/structure/CellSelect.svelte +148 -51
  270. package/dist/structure/Cylinder.svelte +33 -17
  271. package/dist/structure/Lattice.svelte +88 -33
  272. package/dist/structure/Structure.svelte +1077 -821
  273. package/dist/structure/Structure.svelte.d.ts +1 -1
  274. package/dist/structure/StructureControls.svelte +373 -139
  275. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  276. package/dist/structure/StructureExportPane.svelte +124 -89
  277. package/dist/structure/StructureExportPane.svelte.d.ts +1 -1
  278. package/dist/structure/StructureInfoPane.svelte +304 -231
  279. package/dist/structure/StructureScene.svelte +919 -445
  280. package/dist/structure/StructureScene.svelte.d.ts +16 -7
  281. package/dist/structure/atom-properties.d.ts +6 -2
  282. package/dist/structure/atom-properties.js +42 -29
  283. package/dist/structure/bonding.js +6 -7
  284. package/dist/structure/export.js +22 -34
  285. package/dist/structure/ferrox-wasm-types.d.ts +3 -2
  286. package/dist/structure/ferrox-wasm-types.js +0 -3
  287. package/dist/structure/ferrox-wasm.d.ts +3 -2
  288. package/dist/structure/ferrox-wasm.js +2 -3
  289. package/dist/structure/index.d.ts +16 -0
  290. package/dist/structure/index.js +88 -6
  291. package/dist/structure/measure.d.ts +2 -2
  292. package/dist/structure/measure.js +4 -44
  293. package/dist/structure/parse.js +130 -155
  294. package/dist/structure/partial-occupancy.d.ts +25 -0
  295. package/dist/structure/partial-occupancy.js +99 -0
  296. package/dist/structure/pbc.d.ts +1 -0
  297. package/dist/structure/pbc.js +16 -6
  298. package/dist/structure/supercell.d.ts +2 -2
  299. package/dist/structure/supercell.js +12 -22
  300. package/dist/structure/validation.js +5 -3
  301. package/dist/symmetry/SymmetryStats.svelte +94 -37
  302. package/dist/symmetry/WyckoffTable.svelte +42 -14
  303. package/dist/symmetry/cell-transform.js +5 -3
  304. package/dist/symmetry/index.d.ts +7 -4
  305. package/dist/symmetry/index.js +87 -21
  306. package/dist/symmetry/spacegroups.js +148 -148
  307. package/dist/table/HeatmapTable.svelte +1112 -516
  308. package/dist/table/HeatmapTable.svelte.d.ts +12 -1
  309. package/dist/table/ToggleMenu.svelte +125 -90
  310. package/dist/table/index.d.ts +2 -0
  311. package/dist/table/index.js +2 -4
  312. package/dist/theme/ThemeControl.svelte +21 -12
  313. package/dist/time.js +4 -1
  314. package/dist/tooltip/TooltipContent.svelte +33 -8
  315. package/dist/trajectory/Trajectory.svelte +889 -687
  316. package/dist/trajectory/TrajectoryError.svelte +14 -3
  317. package/dist/trajectory/TrajectoryExportPane.svelte +148 -90
  318. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +1 -1
  319. package/dist/trajectory/TrajectoryInfoPane.svelte +272 -143
  320. package/dist/trajectory/constants.d.ts +6 -0
  321. package/dist/trajectory/constants.js +7 -0
  322. package/dist/trajectory/extract.js +13 -31
  323. package/dist/trajectory/format-detect.d.ts +9 -0
  324. package/dist/trajectory/format-detect.js +76 -0
  325. package/dist/trajectory/frame-reader.d.ts +17 -0
  326. package/dist/trajectory/frame-reader.js +332 -0
  327. package/dist/trajectory/helpers.d.ts +14 -0
  328. package/dist/trajectory/helpers.js +172 -0
  329. package/dist/trajectory/index.d.ts +1 -0
  330. package/dist/trajectory/index.js +23 -14
  331. package/dist/trajectory/parse/ase.d.ts +2 -0
  332. package/dist/trajectory/parse/ase.js +77 -0
  333. package/dist/trajectory/parse/hdf5.d.ts +2 -0
  334. package/dist/trajectory/parse/hdf5.js +129 -0
  335. package/dist/trajectory/parse/index.d.ts +12 -0
  336. package/dist/trajectory/parse/index.js +299 -0
  337. package/dist/trajectory/parse/lammps.d.ts +5 -0
  338. package/dist/trajectory/parse/lammps.js +179 -0
  339. package/dist/trajectory/parse/vasp.d.ts +2 -0
  340. package/dist/trajectory/parse/vasp.js +68 -0
  341. package/dist/trajectory/parse/xyz.d.ts +2 -0
  342. package/dist/trajectory/parse/xyz.js +110 -0
  343. package/dist/trajectory/plotting.js +13 -8
  344. package/dist/trajectory/types.d.ts +11 -0
  345. package/dist/trajectory/types.js +1 -0
  346. package/dist/utils.d.ts +3 -0
  347. package/dist/utils.js +17 -0
  348. package/dist/xrd/XrdPlot.svelte +337 -245
  349. package/dist/xrd/broadening.js +14 -9
  350. package/dist/xrd/calc-xrd.js +12 -19
  351. package/dist/xrd/parse.d.ts +1 -1
  352. package/dist/xrd/parse.js +17 -17
  353. package/package.json +103 -101
  354. package/readme.md +4 -4
  355. package/dist/trajectory/parse.d.ts +0 -42
  356. package/dist/trajectory/parse.js +0 -1267
  357. /package/dist/element/{data.json.d.ts → data.json.gz.d.ts} +0 -0
  358. /package/dist/theme/{themes.js → themes.mjs} +0 -0
@@ -78,6 +78,6 @@ type $$ComponentProps = {
78
78
  on_camera_move?: EventHandler;
79
79
  on_camera_reset?: EventHandler;
80
80
  } & Omit<ComponentProps<typeof StructureControls>, `children` | `onclose`> & Omit<HTMLAttributes<HTMLDivElement>, `children`>;
81
- declare const Structure: import("svelte").Component<$$ComponentProps, {}, "height" | "width" | "dragover" | "fullscreen" | "structure" | "hovered" | "controls_open" | "color_scheme" | "background_color" | "background_opacity" | "show_image_atoms" | "info_pane_open" | "loading" | "error_msg" | "atom_color_config" | "hidden_elements" | "hidden_prop_vals" | "element_mapping" | "element_radius_overrides" | "site_radius_overrides" | "selected_sites" | "sym_data" | "supercell_scaling" | "cell_type" | "active_volume_idx" | "measured_sites" | "scene_props" | "lattice_props" | "volumetric_data" | "isosurface_settings" | "wrapper" | "png_dpi" | "measure_mode" | "enable_measure_mode" | "performance_mode" | "displayed_structure" | "symmetry_settings">;
81
+ declare const Structure: import("svelte").Component<$$ComponentProps, {}, "structure" | "height" | "width" | "dragover" | "fullscreen" | "hovered" | "controls_open" | "loading" | "color_scheme" | "background_color" | "background_opacity" | "show_image_atoms" | "info_pane_open" | "wrapper" | "sym_data" | "png_dpi" | "error_msg" | "atom_color_config" | "hidden_elements" | "hidden_prop_vals" | "element_mapping" | "element_radius_overrides" | "site_radius_overrides" | "selected_sites" | "supercell_scaling" | "cell_type" | "active_volume_idx" | "measured_sites" | "scene_props" | "lattice_props" | "volumetric_data" | "isosurface_settings" | "measure_mode" | "enable_measure_mode" | "performance_mode" | "displayed_structure" | "symmetry_settings">;
82
82
  type Structure = ReturnType<typeof Structure>;
83
83
  export default Structure;
@@ -1,109 +1,209 @@
1
- <script lang="ts">import { AXIS_COLORS, ELEMENT_COLOR_SCHEMES } from '../colors';
2
- import { format_num } from '../labels';
3
- import { SettingsSection } from '../layout';
4
- import { to_degrees, to_radians } from '../math';
5
- import DraggablePane from '../overlays/DraggablePane.svelte';
6
- import { ColorScaleSelect } from '../plot';
7
- import { DEFAULTS, SETTINGS_CONFIG } from '../settings';
8
- import IsosurfaceControls from '../isosurface/IsosurfaceControls.svelte';
9
- import { Lattice, StructureScene } from './';
10
- import { is_valid_supercell_input } from './supercell';
11
- import Select from 'svelte-multiselect';
12
- import { tooltip } from 'svelte-multiselect/attachments';
13
- let { controls_open = $bindable(false), scene_props = $bindable({}), lattice_props = $bindable({
14
- show_cell_vectors: DEFAULTS.structure.show_cell_vectors,
15
- cell_edge_color: DEFAULTS.structure.cell_edge_color,
16
- cell_edge_opacity: DEFAULTS.structure.cell_edge_opacity,
17
- cell_surface_color: DEFAULTS.structure.cell_surface_color,
18
- cell_surface_opacity: DEFAULTS.structure.cell_surface_opacity,
19
- cell_edge_width: DEFAULTS.structure.cell_edge_width,
20
- }), show_image_atoms = $bindable(DEFAULTS.structure.show_image_atoms), supercell_scaling = $bindable(`1x1x1`), background_color = $bindable(), background_opacity = $bindable(DEFAULTS.background_opacity), color_scheme = $bindable(DEFAULTS.color_scheme), atom_color_config = $bindable({
21
- mode: DEFAULTS.structure.atom_color_mode,
22
- scale: DEFAULTS.structure.atom_color_scale,
23
- scale_type: DEFAULTS.structure.atom_color_scale_type,
24
- }), structure = undefined, supercell_loading = $bindable(false), sym_data = null, cell_type = $bindable(`original`), volumetric_data = $bindable(), isosurface_settings = $bindable(), active_volume_idx = $bindable(0), pane_props = {}, toggle_props = {}, ...rest } = $props();
25
- // Color scheme selection state
26
- let color_scheme_selected = $state([color_scheme]);
27
- $effect(() => {
1
+ <script lang="ts">
2
+ import type { ColorSchemeName, D3InterpolateName } from '../colors'
3
+ import { AXIS_COLORS, ELEMENT_COLOR_SCHEMES } from '../colors'
4
+ import IsosurfaceControls from '../isosurface/IsosurfaceControls.svelte'
5
+ import type { IsosurfaceSettings, VolumetricData } from '../isosurface/types'
6
+ import { format_num } from '../labels'
7
+ import { SettingsSection } from '../layout'
8
+ import { to_degrees, to_radians } from '../math'
9
+ import DraggablePane from '../overlays/DraggablePane.svelte'
10
+ import { ColorScaleSelect } from '../plot'
11
+ import type { VectorLayerConfig } from '../settings'
12
+ import { DEFAULTS, SETTINGS_CONFIG, VECTOR_COLOR_MODES } from '../settings'
13
+ import type { AnyStructure } from './'
14
+ import {
15
+ default_vector_configs,
16
+ get_structure_vector_keys,
17
+ Lattice,
18
+ StructureScene,
19
+ VECTOR_PALETTE,
20
+ } from './'
21
+ import type { AtomColorConfig } from './atom-properties'
22
+ import { is_valid_supercell_input } from './supercell'
23
+ import type { CellType } from '../symmetry'
24
+ import type { MoyoDataset } from '@spglib/moyo-wasm'
25
+ import type { ComponentProps } from 'svelte'
26
+ import Select from 'svelte-multiselect'
27
+ import { tooltip } from 'svelte-multiselect/attachments'
28
+
29
+ let {
30
+ controls_open = $bindable(false),
31
+ scene_props = $bindable({}),
32
+ lattice_props = $bindable({
33
+ show_cell_vectors: DEFAULTS.structure.show_cell_vectors,
34
+ cell_edge_color: DEFAULTS.structure.cell_edge_color,
35
+ cell_edge_opacity: DEFAULTS.structure.cell_edge_opacity,
36
+ cell_surface_color: DEFAULTS.structure.cell_surface_color,
37
+ cell_surface_opacity: DEFAULTS.structure.cell_surface_opacity,
38
+ cell_edge_width: DEFAULTS.structure.cell_edge_width,
39
+ }),
40
+ show_image_atoms = $bindable(DEFAULTS.structure.show_image_atoms),
41
+ supercell_scaling = $bindable(`1x1x1`),
42
+ background_color = $bindable(),
43
+ background_opacity = $bindable(DEFAULTS.background_opacity),
44
+ color_scheme = $bindable(DEFAULTS.color_scheme),
45
+ atom_color_config = $bindable({
46
+ mode: DEFAULTS.structure.atom_color_mode,
47
+ scale: DEFAULTS.structure.atom_color_scale,
48
+ scale_type: DEFAULTS.structure.atom_color_scale_type,
49
+ }),
50
+ structure = undefined,
51
+ supercell_loading = $bindable(false),
52
+ sym_data = null,
53
+ cell_type = $bindable(`original`),
54
+ volumetric_data = $bindable<VolumetricData[]>(),
55
+ isosurface_settings = $bindable<IsosurfaceSettings>(),
56
+ active_volume_idx = $bindable(0),
57
+ pane_props = {},
58
+ toggle_props = {},
59
+ ...rest
60
+ }: Omit<ComponentProps<typeof DraggablePane>, `children`> & {
61
+ controls_open?: boolean // Control pane state
62
+ scene_props?: ComponentProps<typeof StructureScene>
63
+ lattice_props?: ComponentProps<typeof Lattice>
64
+ show_image_atoms?: boolean
65
+ supercell_scaling?: string
66
+ background_color?: string
67
+ background_opacity?: number
68
+ color_scheme?: string
69
+ atom_color_config?: Partial<AtomColorConfig>
70
+ structure?: AnyStructure
71
+ supercell_loading?: boolean
72
+ sym_data?: MoyoDataset | null
73
+ cell_type?: CellType // Cell type: original, conventional, or primitive
74
+ volumetric_data?: VolumetricData[] // Volumetric data volumes for isosurface controls
75
+ isosurface_settings?: IsosurfaceSettings // Isosurface rendering settings
76
+ active_volume_idx?: number // Active volume index
77
+ pane_props?: ComponentProps<typeof DraggablePane>[`pane_props`]
78
+ toggle_props?: ComponentProps<typeof DraggablePane>[`toggle_props`]
79
+ } = $props()
80
+
81
+ // Color scheme selection state
82
+ let color_scheme_selected = $state([color_scheme])
83
+ $effect(() => {
28
84
  if (color_scheme_selected.length > 0) {
29
- color_scheme = color_scheme_selected[0];
85
+ color_scheme = color_scheme_selected[0] as string
30
86
  }
31
- });
32
- // Atom color config selection state
33
- let color_scale_selected = $state([
87
+ })
88
+
89
+ // Atom color config selection state
90
+ let color_scale_selected = $state<D3InterpolateName[]>([
34
91
  atom_color_config.scale || DEFAULTS.structure.atom_color_scale,
35
- ]);
36
- // Sync local selection to config
37
- $effect(() => {
38
- if (color_scale_selected[0] && color_scale_selected[0] !== atom_color_config.scale)
39
- atom_color_config.scale = color_scale_selected[0];
40
- });
41
- // Sync config to local selection (for external updates)
42
- $effect(() => {
43
- if (atom_color_config.scale && atom_color_config.scale !== color_scale_selected[0])
44
- color_scale_selected = [atom_color_config.scale];
45
- });
46
- // Auto-set scale_type based on mode
47
- $effect(() => {
92
+ ])
93
+
94
+ // Sync local selection to config
95
+ $effect(() => {
96
+ if (
97
+ color_scale_selected[0] && color_scale_selected[0] !== atom_color_config.scale
98
+ ) atom_color_config.scale = color_scale_selected[0]
99
+ })
100
+ // Sync config to local selection (for external updates)
101
+ $effect(() => {
102
+ if (
103
+ atom_color_config.scale && atom_color_config.scale !== color_scale_selected[0]
104
+ ) color_scale_selected = [atom_color_config.scale]
105
+ })
106
+ // Auto-set scale_type based on mode
107
+ $effect(() => {
48
108
  if (atom_color_config.mode === `wyckoff`) {
49
- atom_color_config.scale_type = `categorical`;
109
+ atom_color_config.scale_type = `categorical`
110
+ } else if (atom_color_config.mode === `coordination`) {
111
+ atom_color_config.scale_type = `continuous`
50
112
  }
51
- else if (atom_color_config.mode === `coordination`) {
52
- atom_color_config.scale_type = `continuous`;
53
- }
54
- });
55
- // Atom label color management
56
- let site_label_hex_color = $state(scene_props.site_label_color || DEFAULTS.structure.site_label_color);
57
- let site_label_bg_hex_color = $state(scene_props.site_label_bg_color || DEFAULTS.structure.site_label_bg_color);
58
- let site_label_background_opacity = $state(0);
59
- $effect(() => {
60
- scene_props.site_label_color = site_label_hex_color;
113
+ })
114
+
115
+ // Atom label color management
116
+ let site_label_hex_color = $state(
117
+ scene_props.site_label_color || DEFAULTS.structure.site_label_color,
118
+ )
119
+ let site_label_bg_hex_color = $state(
120
+ scene_props.site_label_bg_color || DEFAULTS.structure.site_label_bg_color,
121
+ )
122
+ let site_label_background_opacity = $state(0)
123
+
124
+ $effect(() => {
125
+ scene_props.site_label_color = site_label_hex_color
61
126
  scene_props.site_label_bg_color =
62
- `color-mix(in srgb, ${site_label_bg_hex_color} ${format_num(site_label_background_opacity, `.1~%`)}, transparent)`;
63
- });
64
- // Ensure site_label_offset is always available
65
- scene_props.site_label_offset ??= [...DEFAULTS.structure.site_label_offset];
66
- // Detect if structure has force data
67
- let has_forces = $derived(structure?.sites?.some((site) => site.properties?.force && Array.isArray(site.properties.force)) ?? false);
68
- // Detect if structure has lattice (can create supercells)
69
- let has_lattice = $derived(structure && `lattice` in structure && structure.lattice !== undefined);
70
- // Validate supercell input
71
- let supercell_input_valid = $derived(is_valid_supercell_input(supercell_scaling));
72
- // Ensure rotation is always an array
73
- $effect(() => {
74
- scene_props.rotation ??= [...DEFAULTS.structure.rotation];
75
- });
76
- let rotation_degrees = $derived(scene_props.rotation?.map((rad) => {
77
- const deg = to_degrees(rad);
78
- // Convert to [0, 360] range for UI display
79
- return ((deg % 360) + 360) % 360;
80
- }) ?? [0, 0, 0]);
81
- function update_rotation(axis, degrees) {
82
- scene_props.rotation ??= [0, 0, 0];
83
- const axis_index = { x: 0, y: 1, z: 2 }[axis];
84
- const clamped = Math.max(0, Math.min(360, degrees));
85
- const norm = ((clamped % 360) + 360) % 360;
86
- scene_props.rotation[axis_index] = to_radians(norm);
127
+ `color-mix(in srgb, ${site_label_bg_hex_color} ${
128
+ format_num(site_label_background_opacity, `.1~%`)
129
+ }, transparent)`
130
+ })
131
+
132
+ // Ensure site_label_offset is always available
133
+ scene_props.site_label_offset ??= [...DEFAULTS.structure.site_label_offset]
134
+
135
+ // Collect available vector property keys from the structure
136
+ let available_vector_keys = $derived(
137
+ structure ? get_structure_vector_keys(structure) : [],
138
+ )
139
+ function is_key_visible(key: string): boolean {
140
+ return scene_props.vector_configs?.[key]?.visible !== false
141
+ }
142
+
143
+ let any_vectors_visible = $derived(available_vector_keys.some(is_key_visible))
144
+
145
+ function update_vector_config(key: string, patch: Partial<VectorLayerConfig>) {
146
+ const configs = { ...scene_props.vector_configs }
147
+ configs[key] = {
148
+ ...(configs[key] ?? { visible: true, color: null, scale: null }),
149
+ ...patch,
150
+ }
151
+ scene_props.vector_configs = configs
152
+ }
153
+
154
+ // Detect if structure has lattice (can create supercells)
155
+ let has_lattice = $derived(
156
+ structure && `lattice` in structure && structure.lattice !== undefined,
157
+ )
158
+
159
+ // Validate supercell input
160
+ let supercell_input_valid = $derived(is_valid_supercell_input(supercell_scaling))
161
+
162
+ // Ensure rotation is always an array
163
+ $effect(() => {
164
+ scene_props.rotation ??= [...DEFAULTS.structure.rotation]
165
+ })
166
+
167
+ let rotation_degrees = $derived(
168
+ scene_props.rotation?.map((rad) => {
169
+ const deg = to_degrees(rad)
170
+ // Convert to [0, 360] range for UI display
171
+ return ((deg % 360) + 360) % 360
172
+ }) ?? [0, 0, 0],
173
+ )
174
+
175
+ function update_rotation(axis: `x` | `y` | `z`, degrees: number) {
176
+ scene_props.rotation ??= [0, 0, 0]
177
+ const axis_index = { x: 0, y: 1, z: 2 }[axis]
178
+ const clamped = Math.max(0, Math.min(360, degrees))
179
+ const norm = ((clamped % 360) + 360) % 360
180
+ scene_props.rotation[axis_index] = to_radians(norm)
87
181
  // Trigger reactivity by creating new array
88
- scene_props.rotation = [...scene_props.rotation];
89
- }
90
- // Helper function to get example set of colors from an element color scheme
91
- function get_representative_colors(scheme_name) {
92
- const scheme = ELEMENT_COLOR_SCHEMES[scheme_name];
93
- if (!scheme)
94
- return [];
182
+ scene_props.rotation = [...scene_props.rotation]
183
+ }
184
+
185
+ // Helper function to get example set of colors from an element color scheme
186
+ function get_representative_colors(scheme_name: string): string[] {
187
+ const scheme = ELEMENT_COLOR_SCHEMES[scheme_name as ColorSchemeName]
188
+ if (!scheme) return []
189
+
95
190
  // Get colors for common elements: H, C, N, O, Fe, Ca, Si, Al
96
- const sample_elements = [`H`, `C`, `N`, `O`, `Fe`, `Ca`, `Si`, `Al`];
191
+ const sample_elements = [`H`, `C`, `N`, `O`, `Fe`, `Ca`, `Si`, `Al`]
97
192
  return sample_elements
98
- .slice(0, 4) // Take first 4
99
- .map((el) => scheme[el] || scheme.H || `#cccccc`)
100
- .filter(Boolean);
101
- }
193
+ .slice(0, 4) // Take first 4
194
+ .map((el) => scheme[el] || scheme.H || `#cccccc`)
195
+ .filter(Boolean)
196
+ }
102
197
  </script>
103
198
 
104
199
  <DraggablePane
105
200
  bind:show={controls_open}
106
- pane_props={{ ...pane_props, class: `controls-pane ${pane_props?.class ?? ``}` }}
201
+ resizable="both"
202
+ pane_props={{
203
+ ...pane_props,
204
+ class: `controls-pane ${pane_props?.class ?? ``}`,
205
+ style: `--pane-max-height: 70vh; ${pane_props?.style ?? ``}`,
206
+ }}
107
207
  toggle_props={{
108
208
  title: controls_open ? `` : `Structure controls`,
109
209
  ...toggle_props,
@@ -111,6 +211,14 @@ function get_representative_colors(scheme_name) {
111
211
  }}
112
212
  {...rest}
113
213
  >
214
+ {#if volumetric_data?.length && isosurface_settings}
215
+ <IsosurfaceControls
216
+ bind:settings={isosurface_settings}
217
+ volumes={volumetric_data}
218
+ bind:active_volume_idx
219
+ />
220
+ {/if}
221
+
114
222
  <SettingsSection
115
223
  title="Visibility"
116
224
  current_values={{
@@ -119,7 +227,7 @@ function get_representative_colors(scheme_name) {
119
227
  show_image_atoms,
120
228
  show_site_labels: scene_props.show_site_labels,
121
229
  show_site_indices: scene_props.show_site_indices,
122
- show_force_vectors: scene_props.show_force_vectors,
230
+ vector_configs: scene_props.vector_configs,
123
231
  show_cell_vectors: lattice_props.show_cell_vectors,
124
232
  }}
125
233
  on_reset={() => {
@@ -127,7 +235,7 @@ function get_representative_colors(scheme_name) {
127
235
  scene_props.show_bonds = DEFAULTS.structure.show_bonds
128
236
  scene_props.show_site_labels = DEFAULTS.structure.show_site_labels
129
237
  scene_props.show_site_indices = DEFAULTS.structure.show_site_indices
130
- scene_props.show_force_vectors = DEFAULTS.structure.show_force_vectors
238
+ scene_props.vector_configs = default_vector_configs(available_vector_keys)
131
239
  show_image_atoms = DEFAULTS.structure.show_image_atoms
132
240
  lattice_props.show_cell_vectors = DEFAULTS.structure.show_cell_vectors
133
241
  }}
@@ -167,16 +275,43 @@ function get_representative_colors(scheme_name) {
167
275
  <input type="checkbox" bind:checked={scene_props.show_site_indices} />
168
276
  Site Indices
169
277
  </label>
170
- {#if has_forces}
171
- <label
172
- {@attach tooltip({
173
- content: SETTINGS_CONFIG.structure.show_force_vectors.description,
174
- })}
175
- style="gap: 6pt"
176
- >
177
- <input type="checkbox" bind:checked={scene_props.show_force_vectors} />
178
- Force Vectors
179
- </label>
278
+ {#if available_vector_keys.length > 0}
279
+ {#each available_vector_keys as key, idx (key)}
280
+ <label
281
+ {@attach tooltip({
282
+ content: `Toggle ${key} vectors`,
283
+ })}
284
+ style="gap: 4pt"
285
+ >
286
+ <input
287
+ type="checkbox"
288
+ checked={is_key_visible(key)}
289
+ onchange={() => update_vector_config(key, { visible: !is_key_visible(key) })}
290
+ />
291
+ <input
292
+ type="color"
293
+ aria-label={`${key} vector color`}
294
+ value={scene_props.vector_configs?.[key]?.color ??
295
+ VECTOR_PALETTE[idx % VECTOR_PALETTE.length]}
296
+ onchange={(evt) =>
297
+ update_vector_config(key, {
298
+ color: (evt.target as HTMLInputElement).value,
299
+ })}
300
+ style="width: 22px; height: 22px; padding: 0; border: none; cursor: pointer"
301
+ />
302
+ {key}
303
+ {#if scene_props.vector_configs?.[key]?.color != null}
304
+ <button
305
+ type="button"
306
+ aria-label={`Reset ${key} color to default`}
307
+ onclick={() => update_vector_config(key, { color: null })}
308
+ style="padding: 0 3pt; font-size: 0.8em; line-height: 1; cursor: pointer"
309
+ >
310
+ ×
311
+ </button>
312
+ {/if}
313
+ </label>
314
+ {/each}
180
315
  {/if}
181
316
  <label style="gap: 6pt">
182
317
  <input type="checkbox" bind:checked={lattice_props.show_cell_vectors} />
@@ -424,9 +559,7 @@ function get_representative_colors(scheme_name) {
424
559
  Same size atoms
425
560
  <input type="checkbox" bind:checked={scene_props.same_size_atoms} />
426
561
  </label>
427
- <span
428
- class="label"
429
- style="align-items: start"
562
+ <label
430
563
  {@attach tooltip({ content: SETTINGS_CONFIG.color_scheme.description })}
431
564
  >
432
565
  Color scheme
@@ -436,7 +569,10 @@ function get_representative_colors(scheme_name) {
436
569
  minSelect={1}
437
570
  bind:selected={color_scheme_selected}
438
571
  liOptionStyle="padding: 3pt 6pt;"
439
- style="width: 10em; border: none"
572
+ liSelectedStyle="background-color: transparent;"
573
+ ulSelectedStyle="display: contents;"
574
+ inputStyle="flex: none; min-width: 0; width: 0; opacity: 0;"
575
+ style="flex: 1; min-width: 0; border: none; margin-left: 4pt"
440
576
  aria-label="Color scheme"
441
577
  >
442
578
  {#snippet children({ option })}
@@ -454,13 +590,12 @@ function get_representative_colors(scheme_name) {
454
590
  </div>
455
591
  {/snippet}
456
592
  </Select>
457
- </span>
593
+ </label>
458
594
  <label
459
- style="align-items: start"
460
595
  {@attach tooltip({ content: SETTINGS_CONFIG.structure.atom_color_mode.description })}
461
596
  >
462
597
  Atom coloring
463
- <select bind:value={atom_color_config.mode} style="font-size: 0.95em">
598
+ <select bind:value={atom_color_config.mode}>
464
599
  {#each Object.entries(SETTINGS_CONFIG.structure.atom_color_mode.enum || {}) as
465
600
  [value, label]
466
601
  (value)
@@ -470,9 +605,7 @@ function get_representative_colors(scheme_name) {
470
605
  </select>
471
606
  </label>
472
607
  {#if atom_color_config.mode !== `element`}
473
- <span
474
- class="label"
475
- style="align-items: start; white-space: nowrap"
608
+ <label
476
609
  {@attach tooltip({ content: SETTINGS_CONFIG.structure.atom_color_scale.description })}
477
610
  >
478
611
  Color scale
@@ -482,12 +615,11 @@ function get_representative_colors(scheme_name) {
482
615
  colorbar={{
483
616
  tick_labels: 0,
484
617
  wrapper_style: `width: 100%;`,
485
- title_style: `font-size: 0.95em;`,
486
618
  }}
487
- style="width: 100%; border: none"
619
+ style="flex: 1; min-width: 0; border: none"
488
620
  aria-label="Color scale"
489
621
  />
490
- </span>
622
+ </label>
491
623
  {/if}
492
624
  </SettingsSection>
493
625
 
@@ -587,39 +719,149 @@ function get_representative_colors(scheme_name) {
587
719
  </SettingsSection>
588
720
  {/if}
589
721
 
590
- {#if has_forces && scene_props.show_force_vectors}
722
+ {#if available_vector_keys.length > 0 && any_vectors_visible}
591
723
  <SettingsSection
592
- title="Force Vectors"
724
+ title="Site Vectors"
593
725
  current_values={{
594
- force_scale: scene_props.force_scale,
595
- force_color: scene_props.force_color,
726
+ vector_scale: scene_props.vector_scale,
727
+ vector_color: scene_props.vector_color,
728
+ vector_normalize: scene_props.vector_normalize,
729
+ vector_uniform_thickness: scene_props.vector_uniform_thickness,
730
+ vector_color_mode: scene_props.vector_color_mode,
731
+ vector_color_scale: scene_props.vector_color_scale,
732
+ vector_origin_gap: scene_props.vector_origin_gap,
596
733
  }}
597
734
  on_reset={() => {
598
- scene_props.force_scale = DEFAULTS.structure.force_scale
599
- scene_props.force_color = DEFAULTS.structure.force_color
735
+ scene_props.vector_scale = DEFAULTS.structure.vector_scale
736
+ scene_props.vector_color = DEFAULTS.structure.vector_color
737
+ scene_props.vector_color_mode = DEFAULTS.structure.vector_color_mode
738
+ scene_props.vector_color_scale = DEFAULTS.structure.vector_color_scale
739
+ scene_props.vector_normalize = DEFAULTS.structure.vector_normalize
740
+ scene_props.vector_uniform_thickness =
741
+ DEFAULTS.structure.vector_uniform_thickness
742
+ scene_props.vector_origin_gap = DEFAULTS.structure.vector_origin_gap
743
+ for (const key of available_vector_keys) {
744
+ update_vector_config(key, { scale: null })
745
+ }
600
746
  }}
601
747
  >
602
748
  <label>
603
- Scale
749
+ Global Scale
604
750
  <input
605
751
  type="number"
606
752
  min={0.001}
607
753
  max={5}
608
754
  step={0.001}
609
- bind:value={scene_props.force_scale}
755
+ bind:value={scene_props.vector_scale}
610
756
  />
611
757
  <input
612
758
  type="range"
613
759
  min={0.001}
614
760
  max={5}
615
761
  step={0.001}
616
- bind:value={scene_props.force_scale}
762
+ bind:value={scene_props.vector_scale}
617
763
  />
618
764
  </label>
619
- <label>
620
- Color
621
- <input type="color" bind:value={scene_props.force_color} />
765
+ <label
766
+ {@attach tooltip({
767
+ content: SETTINGS_CONFIG.structure.vector_normalize.description,
768
+ })}
769
+ style="gap: 6pt"
770
+ >
771
+ <input type="checkbox" bind:checked={scene_props.vector_normalize} />
772
+ Normalize
773
+ </label>
774
+ <label
775
+ {@attach tooltip({
776
+ content: SETTINGS_CONFIG.structure.vector_uniform_thickness.description,
777
+ })}
778
+ style="gap: 6pt"
779
+ >
780
+ <input type="checkbox" bind:checked={scene_props.vector_uniform_thickness} />
781
+ Uniform Thickness
622
782
  </label>
783
+ <label
784
+ {@attach tooltip({
785
+ content: SETTINGS_CONFIG.structure.vector_color_mode.description,
786
+ })}
787
+ >
788
+ Color Mode
789
+ <select bind:value={scene_props.vector_color_mode}>
790
+ {#each VECTOR_COLOR_MODES as mode (mode)}
791
+ <option value={mode}>{mode.replaceAll(`_`, ` `)}</option>
792
+ {/each}
793
+ </select>
794
+ </label>
795
+ {#if scene_props.vector_color_mode === `magnitude`}
796
+ <label>
797
+ Scale
798
+ <ColorScaleSelect
799
+ bind:value={scene_props.vector_color_scale}
800
+ style="max-width: 180px"
801
+ />
802
+ </label>
803
+ {/if}
804
+ {#if scene_props.vector_color_mode === `uniform`}
805
+ <label>
806
+ Color
807
+ <input type="color" bind:value={scene_props.vector_color} />
808
+ </label>
809
+ {/if}
810
+ {#if available_vector_keys.length > 1}
811
+ <label
812
+ {@attach tooltip({
813
+ content: SETTINGS_CONFIG.structure.vector_origin_gap.description,
814
+ })}
815
+ >
816
+ Origin Gap
817
+ <input
818
+ type="number"
819
+ min={0}
820
+ max={0.5}
821
+ step={0.02}
822
+ bind:value={scene_props.vector_origin_gap}
823
+ />
824
+ <input
825
+ type="range"
826
+ min={0}
827
+ max={0.5}
828
+ step={0.02}
829
+ bind:value={scene_props.vector_origin_gap}
830
+ />
831
+ </label>
832
+ {#each available_vector_keys as key (key)}
833
+ {#if is_key_visible(key)}
834
+ {@const on_scale = (evt: Event) => {
835
+ const parsed = parseFloat((evt.target as HTMLInputElement).value)
836
+ update_vector_config(key, { scale: Number.isNaN(parsed) ? 1.0 : parsed })
837
+ }}
838
+ <label
839
+ {@attach tooltip({
840
+ content:
841
+ `Scale multiplier for ${key} arrows (applied on top of global scale)`,
842
+ })}
843
+ >
844
+ {key} scale
845
+ <input
846
+ type="number"
847
+ min={0.1}
848
+ max={5}
849
+ step={0.1}
850
+ value={scene_props.vector_configs?.[key]?.scale ?? 1.0}
851
+ onchange={on_scale}
852
+ />
853
+ <input
854
+ type="range"
855
+ min={0.1}
856
+ max={5}
857
+ step={0.1}
858
+ value={scene_props.vector_configs?.[key]?.scale ?? 1.0}
859
+ oninput={on_scale}
860
+ />
861
+ </label>
862
+ {/if}
863
+ {/each}
864
+ {/if}
623
865
  </SettingsSection>
624
866
  {/if}
625
867
 
@@ -884,14 +1126,6 @@ function get_representative_colors(scheme_name) {
884
1126
  </label>
885
1127
  </SettingsSection>
886
1128
  {/if}
887
-
888
- {#if volumetric_data?.length && isosurface_settings}
889
- <IsosurfaceControls
890
- bind:settings={isosurface_settings}
891
- volumes={volumetric_data}
892
- bind:active_volume_idx
893
- />
894
- {/if}
895
1129
  </DraggablePane>
896
1130
 
897
1131
  <style>
@@ -925,7 +1159,7 @@ function get_representative_colors(scheme_name) {
925
1159
  justify-content: space-between;
926
1160
  width: 100%;
927
1161
  }
928
- label, .label {
1162
+ label {
929
1163
  display: flex;
930
1164
  align-items: center;
931
1165
  gap: 10pt;
@@ -1,5 +1,5 @@
1
- import DraggablePane from '../overlays/DraggablePane.svelte';
2
1
  import type { IsosurfaceSettings, VolumetricData } from '../isosurface/types';
2
+ import DraggablePane from '../overlays/DraggablePane.svelte';
3
3
  import type { AnyStructure } from './';
4
4
  import { Lattice, StructureScene } from './';
5
5
  import type { AtomColorConfig } from './atom-properties';