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
@@ -1,120 +1,165 @@
1
- <script lang="ts">import { PLOT_COLORS } from '../colors';
2
- import { get_electro_neg_formula } from '../composition';
3
- import { StatusMessage } from '../feedback';
4
- import { decompress_file, handle_url_drop } from '../io';
5
- import { ScatterPlot } from '../plot';
6
- import { parse_any_structure } from '../structure/parse';
7
- import { is_crystal } from '../structure/validation';
8
- import { calculate_all_pair_rdfs, calculate_rdf } from './index';
9
- let { patterns, structures, mode = `element_pairs`, show_reference_line = true, x_axis = {}, y_axis = {}, cutoff = 15, n_bins = 75, pbc = [true, true, true], enable_drop = false, on_file_drop, loading = $bindable(false), error_msg = $bindable(), children, drag_dropped = $bindable([]), dragging = $bindable(false), ...rest } = $props();
10
- function format_structure_label(struct, label_base) {
11
- const formula = get_electro_neg_formula(struct);
12
- return formula && label_base ? `${formula}: ${label_base}` : formula || label_base;
13
- }
14
- async function handle_drop(event) {
15
- event.preventDefault();
16
- dragging = false;
17
- if (!enable_drop)
18
- return;
19
- loading = true;
20
- error_msg = undefined;
21
- const compute_and_add = (content, filename) => {
22
- try {
23
- const text = content instanceof ArrayBuffer
24
- ? new TextDecoder().decode(content)
25
- : content;
26
- const parsed_struct = parse_any_structure(text, filename);
27
- if (is_crystal(parsed_struct)) {
28
- drag_dropped = [...drag_dropped, parsed_struct];
29
- }
30
- else
31
- error_msg = `Crystal has no lattice or sites; cannot compute RDF`;
32
- }
33
- catch (exc) {
34
- error_msg = `Failed to process structure: ${exc instanceof Error ? exc.message : String(exc)}`;
35
- }
36
- };
1
+ <script lang="ts">
2
+ import { PLOT_COLORS } from '../colors'
3
+ import { get_electro_neg_formula } from '../composition'
4
+ import { StatusMessage } from '../feedback'
5
+ import { create_file_drop_handler } from '../io'
6
+ import type { DataSeries } from '../plot'
7
+ import { ScatterPlot } from '../plot'
8
+ import type { Crystal, Pbc } from '../structure'
9
+ import { parse_any_structure } from '../structure/parse'
10
+ import { is_crystal } from '../structure/validation'
11
+ import type { ComponentProps, Snippet } from 'svelte'
12
+ import { calculate_all_pair_rdfs, calculate_rdf, type RdfEntry } from './index'
13
+
14
+ let {
15
+ patterns,
16
+ structures,
17
+ mode = `element_pairs`,
18
+ show_reference_line = true,
19
+ x_axis = {},
20
+ y_axis = {},
21
+ cutoff = 15,
22
+ n_bins = 75,
23
+ pbc = [true, true, true],
24
+ enable_drop = false,
25
+ on_file_drop,
26
+ loading = $bindable(false),
27
+ error_msg = $bindable(),
28
+ children,
29
+ drag_dropped = $bindable([]),
30
+ dragging = $bindable(false),
31
+ ...rest
32
+ }: {
33
+ patterns?: RdfEntry | RdfEntry[]
34
+ structures?: Crystal | Crystal[] | Record<string, Crystal>
35
+ mode?: `element_pairs` | `full`
36
+ show_reference_line?: boolean
37
+ x_axis?: ComponentProps<typeof ScatterPlot>[`x_axis`]
38
+ y_axis?: ComponentProps<typeof ScatterPlot>[`y_axis`]
39
+ cutoff?: number
40
+ n_bins?: number
41
+ pbc?: Pbc
42
+ enable_drop?: boolean
43
+ on_file_drop?: (content: string | ArrayBuffer, filename: string) => void
44
+ loading?: boolean
45
+ error_msg?: string
46
+ children?: Snippet<[{ drag_dropped: Crystal[] }]>
47
+ drag_dropped?: Crystal[]
48
+ dragging?: boolean
49
+ } & ComponentProps<typeof ScatterPlot> = $props()
50
+
51
+ function format_structure_label(struct: Crystal, label_base: string): string {
52
+ const formula = get_electro_neg_formula(struct)
53
+ return formula && label_base ? `${formula}: ${label_base}` : formula || label_base
54
+ }
55
+
56
+ const compute_and_add = (content: string | ArrayBuffer, filename: string) => {
37
57
  try {
38
- const handled = await handle_url_drop(event, on_file_drop || compute_and_add)
39
- .catch(() => false);
40
- if (handled)
41
- return;
42
- const file = event.dataTransfer?.files?.[0];
43
- if (file) {
44
- const { content, filename } = await decompress_file(file);
45
- if (content)
46
- (on_file_drop || compute_and_add)(content, filename);
47
- }
58
+ const text = content instanceof ArrayBuffer
59
+ ? new TextDecoder().decode(content)
60
+ : content
61
+ const parsed_struct = parse_any_structure(text, filename)
62
+ if (is_crystal(parsed_struct)) {
63
+ drag_dropped = [...drag_dropped, parsed_struct]
64
+ } else {
65
+ error_msg = `Crystal has no lattice or sites; cannot compute RDF`
66
+ }
67
+ } catch (exc) {
68
+ error_msg = `Failed to process structure: ${
69
+ exc instanceof Error ? exc.message : String(exc)
70
+ }`
48
71
  }
49
- catch (exc) {
50
- error_msg = `Failed to load file: ${exc instanceof Error ? exc.message : String(exc)}`;
51
- }
52
- finally {
53
- loading = false;
54
- }
55
- }
56
- const entries = $derived.by(() => {
57
- const result = [];
72
+ }
73
+
74
+ const handle_drop = create_file_drop_handler({
75
+ allow: () => enable_drop,
76
+ on_drop: (content, filename) =>
77
+ (on_file_drop || compute_and_add)(content, filename),
78
+ on_error: (msg) => {
79
+ error_msg = msg
80
+ },
81
+ set_loading: (val) => {
82
+ loading = val
83
+ if (val) [error_msg, dragging] = [undefined, false]
84
+ },
85
+ })
86
+
87
+ function handle_dragover(ev: DragEvent) {
88
+ ev.preventDefault()
89
+ if (ev.dataTransfer) ev.dataTransfer.dropEffect = `copy`
90
+ dragging = true
91
+ }
92
+
93
+ const entries = $derived.by(() => {
94
+ const result: RdfEntry[] = []
95
+
58
96
  // Add patterns
59
97
  if (patterns) {
60
- if (Array.isArray(patterns))
61
- result.push(...patterns);
62
- else
63
- result.push(patterns);
98
+ if (Array.isArray(patterns)) result.push(...patterns)
99
+ else result.push(patterns)
64
100
  }
101
+
65
102
  // Add structures
66
- const struct_list = [];
103
+ const struct_list: { struct: Crystal; label: string }[] = []
67
104
  if (structures) {
68
- if (Array.isArray(structures)) {
69
- structures.forEach((struct, idx) => struct_list.push({
70
- struct,
71
- label: format_structure_label(struct, `Crystal ${idx + 1}`),
72
- }));
73
- }
74
- else if (is_crystal(structures)) {
75
- struct_list.push({
76
- struct: structures,
77
- label: format_structure_label(structures, ``),
78
- });
79
- }
80
- else {
81
- Object.entries(structures).forEach(([label, struct]) => struct_list.push({ struct, label: format_structure_label(struct, label) }));
82
- }
105
+ if (Array.isArray(structures)) {
106
+ structures.forEach((struct, idx) =>
107
+ struct_list.push({
108
+ struct,
109
+ label: format_structure_label(struct, `Crystal ${idx + 1}`),
110
+ })
111
+ )
112
+ } else if (is_crystal(structures)) {
113
+ struct_list.push({
114
+ struct: structures,
115
+ label: format_structure_label(structures, ``),
116
+ })
117
+ } else {
118
+ Object.entries(structures).forEach(([label, struct]) =>
119
+ struct_list.push({ struct, label: format_structure_label(struct, label) })
120
+ )
121
+ }
83
122
  }
84
- drag_dropped.forEach((struct, idx) => struct_list.push({
123
+ drag_dropped.forEach((struct, idx) =>
124
+ struct_list.push({
85
125
  struct,
86
126
  label: format_structure_label(struct, `Dropped ${idx + 1}`),
87
- }));
127
+ })
128
+ )
129
+
88
130
  for (const { struct, label } of struct_list) {
89
- if (mode === `element_pairs`) {
90
- const pairs = calculate_all_pair_rdfs(struct, { cutoff, n_bins, pbc });
91
- result.push(...pairs.map((p) => ({
92
- label: p.element_pair ? `${p.element_pair[0]}-${p.element_pair[1]}` : label,
93
- legend_group: label, // Group by structure name for multi-structure plots
94
- pattern: p,
95
- })));
96
- }
97
- else {
98
- const pattern = calculate_rdf(struct, { cutoff, n_bins, pbc });
99
- result.push({ label, pattern });
100
- }
131
+ if (mode === `element_pairs`) {
132
+ const pairs = calculate_all_pair_rdfs(struct, { cutoff, n_bins, pbc })
133
+ result.push(...pairs.map((p) => ({
134
+ label: p.element_pair ? `${p.element_pair[0]}-${p.element_pair[1]}` : label,
135
+ legend_group: label, // Group by structure name for multi-structure plots
136
+ pattern: p,
137
+ })))
138
+ } else {
139
+ const pattern = calculate_rdf(struct, { cutoff, n_bins, pbc })
140
+ result.push({ label, pattern })
141
+ }
101
142
  }
102
- return result;
103
- });
104
- const max_r = $derived(Math.max(...entries.flatMap((e) => e.pattern.r), 0));
105
- const max_g = $derived(Math.max(1.2, ...entries.flatMap((e) => e.pattern.g_r)));
106
- const series = $derived(entries.map((ent, idx) => ({
107
- x: ent.pattern.r,
108
- y: ent.pattern.g_r,
109
- label: ent.label,
110
- legend_group: ent.legend_group,
111
- visible: mode === `element_pairs` ? idx < 3 : true,
112
- markers: `line`,
113
- line_style: {
143
+ return result
144
+ })
145
+
146
+ const max_r = $derived(Math.max(...entries.flatMap((e) => e.pattern.r), 0))
147
+ const max_g = $derived(Math.max(1.2, ...entries.flatMap((e) => e.pattern.g_r)))
148
+
149
+ const series = $derived<DataSeries[]>(
150
+ entries.map((ent, idx) => ({
151
+ x: ent.pattern.r,
152
+ y: ent.pattern.g_r,
153
+ label: ent.label,
154
+ legend_group: ent.legend_group,
155
+ visible: mode === `element_pairs` ? idx < 3 : true,
156
+ markers: `line` as const,
157
+ line_style: {
114
158
  stroke: ent.color ?? PLOT_COLORS[idx % PLOT_COLORS.length],
115
159
  stroke_width: 2,
116
- },
117
- })));
160
+ },
161
+ })),
162
+ )
118
163
  </script>
119
164
 
120
165
  <StatusMessage bind:message={error_msg} type="error" dismissible />
@@ -127,11 +172,20 @@ const series = $derived(entries.map((ent, idx) => ({
127
172
  {/if}
128
173
 
129
174
  {#if series.length === 0}
130
- <StatusMessage
131
- message={enable_drop
132
- ? `Drag and drop structure files here to visualize RDFs`
133
- : `No RDF data to display`}
134
- />
175
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
176
+ <div
177
+ class="empty-drop {dragging ? `dragging` : ``}"
178
+ ondragover={enable_drop ? handle_dragover : undefined}
179
+ ondragleave={enable_drop ? () => (dragging = false) : undefined}
180
+ ondrop={enable_drop ? handle_drop : undefined}
181
+ >
182
+ <StatusMessage
183
+ message={enable_drop
184
+ ? `Drag and drop structure files here to visualize RDFs`
185
+ : `No RDF data to display`}
186
+ style="border: none"
187
+ />
188
+ </div>
135
189
  {:else}
136
190
  <ScatterPlot
137
191
  {...rest}
@@ -139,15 +193,9 @@ const series = $derived(entries.map((ent, idx) => ({
139
193
  x_axis={{ label: `r (Å)`, range: [0, max_r], ...x_axis }}
140
194
  y_axis={{ label: `g(r)`, range: [0, max_g * 1.05], ...y_axis }}
141
195
  styles={{ show_lines: true, show_points: false }}
142
- class={`${rest.class ?? ``} ${dragging ? `dragging` : ``}`}
196
+ class="{rest.class ?? ``} {dragging ? `dragging` : ``}"
143
197
  style={rest.style ?? `height: 400px;`}
144
- ondragover={enable_drop
145
- ? (ev) => {
146
- ev.preventDefault()
147
- if (ev.dataTransfer) ev.dataTransfer.dropEffect = `copy`
148
- dragging = true
149
- }
150
- : undefined}
198
+ ondragover={enable_drop ? handle_dragover : undefined}
151
199
  ondragleave={enable_drop ? () => (dragging = false) : undefined}
152
200
  ondrop={enable_drop ? handle_drop : undefined}
153
201
  >
@@ -155,22 +203,10 @@ const series = $derived(entries.map((ent, idx) => ({
155
203
  {#if show_reference_line}
156
204
  {@const y1 = y_scale_fn(1)}
157
205
  {#if isFinite(y1)}
158
- <line
159
- x1={pad.l}
160
- x2={width - pad.r}
161
- {y1}
162
- y2={y1}
163
- stroke="gray"
164
- stroke-dasharray="4"
165
- opacity="0.5"
166
- />
167
- <text
168
- x={width - pad.r - 5}
169
- y={y1 - 5}
170
- text-anchor="end"
171
- fill="gray"
172
- font-size="0.8em"
173
- >
206
+ {@const [x1, x2] = [pad.l, width - pad.r]}
207
+ {@const [x, y] = [width - pad.r - 5, y1 - 5]}
208
+ <line {x1} {x2} {y1} y2={y1} stroke="gray" stroke-dasharray="4" opacity="0.5" />
209
+ <text {x} {y} text-anchor="end" fill="gray" font-size="0.8em">
174
210
  g(r) = 1
175
211
  </text>
176
212
  {/if}
@@ -186,6 +222,11 @@ const series = $derived(entries.map((ent, idx) => ({
186
222
  outline: 2px dashed #4e79a7;
187
223
  outline-offset: 4px;
188
224
  }
225
+ .empty-drop {
226
+ outline: 2px dashed #ccc;
227
+ border-radius: var(--border-radius, 3pt);
228
+ text-align: center;
229
+ }
189
230
  .dropped-info {
190
231
  padding: 0.5em;
191
232
  margin-bottom: 0.5em;
@@ -1,4 +1,4 @@
1
- import { calc_lattice_params, euclidean_dist, matrix_inverse_3x3, pbc_dist, } from '../math';
1
+ import { calc_lattice_params, create_lattice_converters, euclidean_dist, pbc_dist, } from '../math';
2
2
  import { make_supercell } from '../structure/supercell';
3
3
  // Calculate radial distribution function
4
4
  export function calculate_rdf(structure, options = {}) {
@@ -45,18 +45,17 @@ export function calculate_rdf(structure, options = {}) {
45
45
  }
46
46
  // Calculate distances and bin them with occupancy weighting
47
47
  const use_pbc = pbc.some((flag) => flag);
48
- const lattice_inv = use_pbc ? matrix_inverse_3x3(lattice) : undefined;
48
+ const converters = use_pbc ? create_lattice_converters(lattice) : undefined;
49
49
  for (const center of centers) {
50
50
  for (const neighbor of neighbors) {
51
51
  if (center === neighbor)
52
52
  continue;
53
53
  const dist = use_pbc
54
- ? pbc_dist(center.xyz, neighbor.xyz, lattice, lattice_inv, pbc)
54
+ ? pbc_dist(center.xyz, neighbor.xyz, lattice, converters, pbc)
55
55
  : euclidean_dist(center.xyz, neighbor.xyz);
56
56
  if (dist > 0 && dist < cutoff) {
57
57
  // Weight by product of occupancies for the species pair
58
- const weight = get_occu(center, center_species) *
59
- get_occu(neighbor, neighbor_species);
58
+ const weight = get_occu(center, center_species) * get_occu(neighbor, neighbor_species);
60
59
  g_r[Math.min(Math.floor(dist / bin_size), n_bins - 1)] += weight;
61
60
  }
62
61
  }
@@ -0,0 +1,4 @@
1
+ export declare function sanitize_html(html: unknown): string;
2
+ export declare const sanitize_formula: (formula: string, use_subscripts?: boolean) => string;
3
+ export declare const sanitize_svg: (html: string) => string;
4
+ export declare const sanitize_icon_svg: (html: string) => string;
@@ -0,0 +1,107 @@
1
+ import DOMPurify from 'dompurify';
2
+ import { format_formula_html } from './phase-diagram/utils';
3
+ // SSR: provide a DOM for DOMPurify when no browser window exists (e.g. during vite build)
4
+ let ssr_window;
5
+ if (typeof globalThis.window === `undefined`) {
6
+ try {
7
+ const { Window } = await import(`happy-dom`);
8
+ ssr_window = new Window();
9
+ }
10
+ catch {
11
+ // happy-dom not available at runtime — get_purify() will fall back to pass-through
12
+ }
13
+ }
14
+ const SAFE_TAGS = [`a`, `b`, `i`, `em`, `strong`, `sub`, `sup`, `br`, `span`, `code`, `small`];
15
+ const SAFE_ATTRS = [`style`, `class`, `title`, `href`, `target`, `rel`];
16
+ // only allow safe CSS properties for text formatting
17
+ const SAFE_STYLE_RE = /^\s*(color|font-weight|font-style|font-size|text-decoration|vertical-align)\s*:/;
18
+ // Add a token to a space-separated string if not already present
19
+ const ensure_token = (value, token) => {
20
+ const tokens = new Set(value.split(/\s+/).filter(Boolean));
21
+ tokens.add(token);
22
+ return [...tokens].join(` `);
23
+ };
24
+ // undefined = not yet checked, null = no DOM available, instance = ready
25
+ let purify;
26
+ function get_purify() {
27
+ if (purify !== undefined)
28
+ return purify;
29
+ const instance = ssr_window
30
+ ? DOMPurify(ssr_window)
31
+ : DOMPurify();
32
+ if (typeof instance.sanitize !== `function`) {
33
+ purify = null;
34
+ return null;
35
+ }
36
+ purify = instance;
37
+ instance.addHook(`uponSanitizeAttribute`, (node, data) => {
38
+ if (data.attrName === `style`) {
39
+ const rules = data.attrValue.split(`;`).filter((rule) => SAFE_STYLE_RE.test(rule));
40
+ if (rules.length === 0)
41
+ data.keepAttr = false;
42
+ else
43
+ data.attrValue = rules.join(`;`);
44
+ }
45
+ // force rel="noopener" on links to prevent window.opener attacks
46
+ if (data.attrName === `href`) {
47
+ node.setAttribute(`rel`, ensure_token(node.getAttribute(`rel`) ?? ``, `noopener`));
48
+ }
49
+ if (data.attrName === `rel`) {
50
+ data.attrValue = ensure_token(data.attrValue, `noopener`);
51
+ }
52
+ });
53
+ return instance;
54
+ }
55
+ // Wrap in <svg>, sanitize with allowlist, then unwrap. Required because DOMPurify
56
+ // needs the <svg> parent to parse children in the SVG namespace.
57
+ function sanitize_svg_content(html, allowed_tags, allowed_attrs) {
58
+ const dp = get_purify();
59
+ if (!dp)
60
+ return html;
61
+ const wrapped = dp.sanitize(`<svg>${html}</svg>`, {
62
+ ALLOWED_TAGS: [...allowed_tags, `svg`],
63
+ ALLOWED_ATTR: allowed_attrs,
64
+ });
65
+ const open_end = wrapped.indexOf(`>`);
66
+ const close_start = wrapped.lastIndexOf(`</svg>`);
67
+ if (open_end < 0 || close_start < 0)
68
+ return wrapped;
69
+ return wrapped.slice(open_end + 1, close_start);
70
+ }
71
+ // Sanitize HTML string, allowing only safe formatting tags and links.
72
+ // Two-pass: happy-dom promotes dangerous children when a non-allowed parent is
73
+ // stripped (e.g. <div><script>…</script></div> → <script>…</script>). The first
74
+ // pass explicitly removes dangerous tags so they can't survive promotion.
75
+ export function sanitize_html(html) {
76
+ const str = html == null ? `` : String(html);
77
+ const dp = get_purify();
78
+ if (!dp)
79
+ return str;
80
+ // oxfmt-ignore
81
+ const safe = dp.sanitize(str, { ADD_ATTR: [`target`], FORBID_TAGS: [
82
+ `script`, `style`, `iframe`, `object`, `embed`, `form`, `input`, `textarea`,
83
+ `select`, `button`, `meta`, `link`, `base`, `template`, `noscript`,
84
+ ] });
85
+ return dp.sanitize(safe, { ALLOWED_TAGS: SAFE_TAGS, ALLOWED_ATTR: SAFE_ATTRS });
86
+ }
87
+ // Sanitize a chemical formula with optional subscript formatting
88
+ export const sanitize_formula = (formula, use_subscripts = true) => sanitize_html(format_formula_html(formula, use_subscripts));
89
+ const SVG_TEXT_TAGS = [`tspan`, `title`];
90
+ // oxfmt-ignore
91
+ const SVG_TEXT_ATTRS = [`dx`, `dy`, `x`, `y`, `fill`, `font-size`, `font-weight`, `baseline-shift`];
92
+ // Sanitize HTML intended for SVG text contexts (tspan, title)
93
+ export const sanitize_svg = (html) => sanitize_svg_content(html, SVG_TEXT_TAGS, SVG_TEXT_ATTRS);
94
+ // oxfmt-ignore
95
+ const SVG_ICON_TAGS = [
96
+ `path`, `circle`, `rect`, `line`, `polyline`, `polygon`, `g`, `ellipse`,
97
+ `clipPath`, `defs`, `mask`, `use`, `title`,
98
+ ];
99
+ // oxfmt-ignore
100
+ const SVG_ICON_ATTRS = [
101
+ `d`, `fill`, `stroke`, `stroke-width`, `stroke-linecap`, `stroke-linejoin`,
102
+ `cx`, `cy`, `r`, `rx`, `ry`, `x`, `y`, `x1`, `y1`, `x2`, `y2`,
103
+ `width`, `height`, `viewBox`, `points`, `transform`, `opacity`,
104
+ `clip-path`, `clip-rule`, `fill-rule`, `id`, `class`,
105
+ ];
106
+ // Sanitize inline SVG markup (path, circle, rect, etc.) for icon rendering
107
+ export const sanitize_icon_svg = (html) => sanitize_svg_content(html, SVG_ICON_TAGS, SVG_ICON_ATTRS);
@@ -17,6 +17,13 @@ export interface SettingType<T = unknown> {
17
17
  export declare const SHOW_BONDS_OPTIONS: readonly ["never", "always", "crystals", "molecules"];
18
18
  export type ShowBonds = (typeof SHOW_BONDS_OPTIONS)[number];
19
19
  export type CameraProjection = `perspective` | `orthographic`;
20
+ export declare const VECTOR_COLOR_MODES: readonly ["auto", "element", "spin_direction", "magnitude", "uniform"];
21
+ export type VectorColorMode = (typeof VECTOR_COLOR_MODES)[number];
22
+ export type VectorLayerConfig = {
23
+ visible: boolean;
24
+ color: string | null;
25
+ scale: number | null;
26
+ };
20
27
  export declare const ATOM_COLOR_MODE_OPTIONS: readonly ["element", "coordination", "wyckoff", "custom"];
21
28
  export type AtomColorMode = (typeof ATOM_COLOR_MODE_OPTIONS)[number];
22
29
  type DisplayConfigType = {
@@ -50,6 +57,7 @@ type LineStyleType = {
50
57
  type SimpleBarStyleType = {
51
58
  color: SettingType<string>;
52
59
  opacity: SettingType<number>;
60
+ border_radius: SettingType<number>;
53
61
  };
54
62
  type SimpleLineStyleType = {
55
63
  width: SettingType<number>;
@@ -121,12 +129,17 @@ export interface SettingsConfig {
121
129
  site_label_offset: SettingType<Vec3>;
122
130
  ambient_light: SettingType<number>;
123
131
  directional_light: SettingType<number>;
124
- show_force_vectors: SettingType<boolean>;
125
- force_scale: SettingType<number>;
126
- force_color: SettingType<string>;
127
- force_shaft_radius: SettingType<number>;
128
- force_arrow_head_radius: SettingType<number>;
129
- force_arrow_head_length: SettingType<number>;
132
+ vector_configs: SettingType<Record<string, VectorLayerConfig>>;
133
+ vector_scale: SettingType<number>;
134
+ vector_color: SettingType<string>;
135
+ vector_color_mode: SettingType<VectorColorMode>;
136
+ vector_color_scale: SettingType<D3InterpolateName>;
137
+ vector_normalize: SettingType<boolean>;
138
+ vector_uniform_thickness: SettingType<boolean>;
139
+ vector_origin_gap: SettingType<number>;
140
+ vector_shaft_radius: SettingType<number>;
141
+ vector_arrow_head_radius: SettingType<number>;
142
+ vector_arrow_head_length: SettingType<number>;
130
143
  show_cell: SettingType<boolean>;
131
144
  show_cell_vectors: SettingType<boolean>;
132
145
  cell_edge_opacity: SettingType<number>;
@@ -178,9 +191,11 @@ export interface SettingsConfig {
178
191
  show_x_zero_line: SettingType<boolean>;
179
192
  show_y_zero_line: SettingType<boolean>;
180
193
  show_x_grid: SettingType<boolean>;
194
+ show_x2_grid: SettingType<boolean>;
181
195
  show_y_grid: SettingType<boolean>;
182
196
  show_y2_grid: SettingType<boolean>;
183
197
  x_format: SettingType<string>;
198
+ x2_format: SettingType<string>;
184
199
  y_format: SettingType<string>;
185
200
  y2_format: SettingType<string>;
186
201
  x_scale_type: SettingType<string>;