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,86 +1,150 @@
1
- <script lang="ts">// NOTE: Axis config objects (x_axis, y_axis, y2_axis) must be reassigned (not mutated)
2
- // to trigger $bindable reactivity propagation to parent components.
3
- // Pattern: `x_axis = { ...x_axis, prop: value }` instead of `x_axis.prop = value`
4
- import SettingsSection from '../layout/SettingsSection.svelte';
5
- import DraggablePane from '../overlays/DraggablePane.svelte';
6
- import { DEFAULTS } from '../settings';
7
- import { format } from 'd3-format';
8
- import { timeFormat } from 'd3-time-format';
9
- import { tooltip } from 'svelte-multiselect/attachments';
10
- import { normalize_y2_sync } from './interactions';
11
- import { get_scale_type_name } from './types';
12
- let { show_controls = $bindable(false), controls_open = $bindable(false), children, post_children, x_axis = $bindable({}), y_axis = $bindable({}), y2_axis = $bindable({}), display = $bindable({}), auto_x_range = [0, 1], auto_y_range = [0, 1], auto_y2_range = undefined, has_y2_points = false, show_ticks = false, controls_title = `plot`, controls_class = ``, toggle_props = {}, pane_props = {}, } = $props();
13
- // Range input state
14
- let range_inputs = $state({ x: [null, null], y: [null, null], y2: [null, null] });
15
- let range_els = $state({});
16
- let x_includes_zero = $derived(((x_axis.range?.[0] ?? auto_x_range[0]) <= 0) &&
17
- ((x_axis.range?.[1] ?? auto_x_range[1]) >= 0));
18
- let y_includes_zero = $derived(((y_axis.range?.[0] ?? auto_y_range[0]) <= 0) &&
19
- ((y_axis.range?.[1] ?? auto_y_range[1]) >= 0));
20
- // Validation function for format specifiers
21
- function is_valid_format(format_string) {
22
- if (!format_string)
23
- return true;
1
+ <script lang="ts">
2
+ // NOTE: Axis config objects (x_axis, x2_axis, y_axis, y2_axis) must be reassigned (not mutated)
3
+ // to trigger $bindable reactivity propagation to parent components.
4
+ // Pattern: `x_axis = { ...x_axis, prop: value }` instead of `x_axis.prop = value`
5
+ import SettingsSection from '../layout/SettingsSection.svelte'
6
+ import DraggablePane from '../overlays/DraggablePane.svelte'
7
+ import { DEFAULTS } from '../settings'
8
+ import { format } from 'd3-format'
9
+ import { timeFormat } from 'd3-time-format'
10
+ import { tooltip } from 'svelte-multiselect/attachments'
11
+ import type { Vec2 } from '../math'
12
+ import type { AxisKey, PlotControlsProps } from './index'
13
+ import { normalize_y2_sync } from './interactions'
14
+ import { get_scale_type_name, is_scale_type_name, is_y2_sync_mode } from './types'
15
+
16
+ let {
17
+ show_controls = $bindable(false),
18
+ controls_open = $bindable(false),
19
+ children,
20
+ post_children,
21
+ x_axis = $bindable({}),
22
+ x2_axis = $bindable({}),
23
+ y_axis = $bindable({}),
24
+ y2_axis = $bindable({}),
25
+ display = $bindable({}),
26
+ auto_x_range = [0, 1],
27
+ auto_x2_range = undefined,
28
+ auto_y_range = [0, 1],
29
+ auto_y2_range = undefined,
30
+ has_x2_points = false,
31
+ has_y2_points = false,
32
+ show_ticks = false,
33
+ controls_title = `plot`,
34
+ controls_class = ``,
35
+ toggle_props = {},
36
+ pane_props = {},
37
+ }: PlotControlsProps = $props()
38
+
39
+ // Range input state
40
+ let range_inputs: Record<AxisKey, [number | null, number | null]> = $state(
41
+ { x: [null, null], x2: [null, null], y: [null, null], y2: [null, null] },
42
+ )
43
+ let range_els = $state<Record<string, HTMLInputElement>>({})
44
+
45
+ // Check if an axis range spans zero (handles inverted ranges like [3.5, 1.4])
46
+ const range_spans_zero = (lo: number, hi: number): boolean =>
47
+ Math.min(lo, hi) <= 0 && Math.max(lo, hi) >= 0
48
+
49
+ let x_includes_zero = $derived(
50
+ range_spans_zero(
51
+ x_axis.range?.[0] ?? auto_x_range[0],
52
+ x_axis.range?.[1] ?? auto_x_range[1],
53
+ ),
54
+ )
55
+ let x2_includes_zero = $derived(
56
+ has_x2_points && auto_x2_range != null &&
57
+ range_spans_zero(
58
+ x2_axis.range?.[0] ?? auto_x2_range[0],
59
+ x2_axis.range?.[1] ?? auto_x2_range[1],
60
+ ),
61
+ )
62
+ let y_includes_zero = $derived(
63
+ range_spans_zero(
64
+ y_axis.range?.[0] ?? auto_y_range[0],
65
+ y_axis.range?.[1] ?? auto_y_range[1],
66
+ ),
67
+ )
68
+ let y2_includes_zero = $derived(
69
+ has_y2_points && auto_y2_range != null &&
70
+ range_spans_zero(
71
+ y2_axis.range?.[0] ?? auto_y2_range[0],
72
+ y2_axis.range?.[1] ?? auto_y2_range[1],
73
+ ),
74
+ )
75
+
76
+ // Validation function for format specifiers
77
+ function is_valid_format(format_string: string): boolean {
78
+ if (!format_string) return true
24
79
  try {
25
- if (format_string.startsWith(`%`)) {
26
- timeFormat(format_string)(new Date());
27
- return true;
28
- }
29
- else {
30
- format(format_string)(123.456);
31
- return true;
32
- }
33
- }
34
- catch {
35
- return false;
80
+ if (format_string.startsWith(`%`)) {
81
+ timeFormat(format_string)(new Date())
82
+ return true
83
+ } else {
84
+ format(format_string)(123.456)
85
+ return true
86
+ }
87
+ } catch {
88
+ return false
36
89
  }
37
- }
38
- // Handle format input changes
39
- const format_input_handler = (format_type) => (event) => {
40
- const input = event.target;
41
- const axes = { x: x_axis, y: y_axis, y2: y2_axis };
42
- const axis = axes[format_type];
43
- if (is_valid_format(input.value)) {
44
- input.classList.remove(`invalid`);
45
- axis.format = input.value;
90
+ }
91
+
92
+ // Handle format input changes
93
+ const format_input_handler = (format_type: AxisKey) => (event: Event) => {
94
+ const input = event.target
95
+ if (!(input instanceof HTMLInputElement)) return
96
+ if (!is_valid_format(input.value)) {
97
+ input.classList.add(`invalid`)
98
+ return
46
99
  }
47
- else
48
- input.classList.add(`invalid`);
49
- };
50
- // Handle range input changes
51
- const update_range = (axis, bound, value) => {
52
- const parsed = value === `` ? null : Number(value);
53
- range_inputs[axis][bound] = Number.isFinite(parsed) ? parsed : null;
54
- const [min, max] = range_inputs[axis];
55
- const auto = { x: auto_x_range, y: auto_y_range, y2: auto_y2_range }[axis];
56
- const invalid = min !== null && max !== null && min >= max;
57
- range_els[`${axis}-min`]?.classList.toggle(`invalid`, invalid);
58
- range_els[`${axis}-max`]?.classList.toggle(`invalid`, invalid);
59
- if (invalid)
60
- return;
61
- const axis_config = { x: x_axis, y: y_axis, y2: y2_axis }[axis];
100
+ input.classList.remove(`invalid`)
101
+ if (format_type === `x`) x_axis = { ...x_axis, format: input.value }
102
+ else if (format_type === `x2`) x2_axis = { ...x2_axis, format: input.value }
103
+ else if (format_type === `y`) y_axis = { ...y_axis, format: input.value }
104
+ else y2_axis = { ...y2_axis, format: input.value }
105
+ }
106
+
107
+ // Handle range input changes
108
+ const update_range = (axis: AxisKey, bound: 0 | 1, value: string) => {
109
+ const parsed = value === `` ? null : Number(value)
110
+ range_inputs[axis][bound] = Number.isFinite(parsed) ? parsed : null
111
+ const [min, max] = range_inputs[axis]
112
+ const auto =
113
+ { x: auto_x_range, x2: auto_x2_range, y: auto_y_range, y2: auto_y2_range }[axis]
114
+ const invalid = min !== null && max !== null && min >= max
115
+ range_els[`${axis}-min`]?.classList.toggle(`invalid`, invalid)
116
+ range_els[`${axis}-max`]?.classList.toggle(`invalid`, invalid)
117
+ if (invalid) return
118
+ const axis_config = { x: x_axis, x2: x2_axis, y: y_axis, y2: y2_axis }[axis]
119
+ const next_range = min === null && max === null
120
+ ? undefined
121
+ : [min ?? auto?.[0] ?? 0, max ?? auto?.[1] ?? 1] as Vec2
62
122
  // If auto range is undefined, only set if both min and max are provided
63
- if (!auto && (min === null || max === null))
64
- return;
65
- axis_config.range = min === null && max === null
66
- ? undefined
67
- : [min ?? auto?.[0] ?? 0, max ?? auto?.[1] ?? 1];
68
- };
69
- // Sync range inputs from props
70
- $effect(() => {
71
- range_inputs.x = [x_axis.range?.[0] ?? null, x_axis.range?.[1] ?? null];
72
- range_inputs.y = [y_axis.range?.[0] ?? null, y_axis.range?.[1] ?? null];
73
- range_inputs.y2 = [y2_axis.range?.[0] ?? null, y2_axis.range?.[1] ?? null];
74
- });
75
- let ctrl_state = $derived({
123
+ if (!auto && (min === null || max === null)) return
124
+ if (axis === `x`) x_axis = { ...axis_config, range: next_range }
125
+ else if (axis === `x2`) x2_axis = { ...axis_config, range: next_range }
126
+ else if (axis === `y`) y_axis = { ...axis_config, range: next_range }
127
+ else y2_axis = { ...axis_config, range: next_range }
128
+ }
129
+
130
+ // Sync range inputs from props
131
+ $effect(() => {
132
+ range_inputs.x = [x_axis.range?.[0] ?? null, x_axis.range?.[1] ?? null]
133
+ range_inputs.x2 = [x2_axis.range?.[0] ?? null, x2_axis.range?.[1] ?? null]
134
+ range_inputs.y = [y_axis.range?.[0] ?? null, y_axis.range?.[1] ?? null]
135
+ range_inputs.y2 = [y2_axis.range?.[0] ?? null, y2_axis.range?.[1] ?? null]
136
+ })
137
+
138
+ let ctrl_state = $derived({
76
139
  show_controls,
77
140
  controls_open,
78
141
  x_axis,
142
+ x2_axis,
79
143
  y_axis,
80
144
  y2_axis,
81
145
  display,
82
146
  range_inputs,
83
- });
147
+ })
84
148
  </script>
85
149
 
86
150
  {#if show_controls}
@@ -109,32 +173,49 @@ let ctrl_state = $derived({
109
173
  title="Display"
110
174
  current_values={{
111
175
  x_zero_line: display.x_zero_line,
176
+ x2_zero_line: display.x2_zero_line,
112
177
  y_zero_line: display.y_zero_line,
178
+ y2_zero_line: display.y2_zero_line,
113
179
  x_grid: display.x_grid,
180
+ x2_grid: display.x2_grid,
114
181
  y_grid: display.y_grid,
115
182
  y2_grid: display.y2_grid,
116
183
  }}
117
184
  on_reset={() => {
118
185
  display.x_zero_line = false
186
+ display.x2_zero_line = false
119
187
  display.y_zero_line = false
188
+ display.y2_zero_line = false
120
189
  display.x_grid = DEFAULTS.plot.show_x_grid
190
+ display.x2_grid = DEFAULTS.plot.show_x2_grid
121
191
  display.y_grid = DEFAULTS.plot.show_y_grid
122
192
  display.y2_grid = DEFAULTS.plot.show_y2_grid
123
193
  }}
124
194
  style="display: flex; flex-wrap: wrap; gap: 1ex; align-items: center"
125
195
  >
126
- {#if x_includes_zero || y_includes_zero}
196
+ {#if x_includes_zero || x2_includes_zero || y_includes_zero || y2_includes_zero}
127
197
  <span class="control-group" data-label="zero line">Zero line:
128
198
  {#if x_includes_zero}
129
199
  <label><input type="checkbox" bind:checked={display.x_zero_line} /> X</label>
130
200
  {/if}
201
+ {#if x2_includes_zero}
202
+ <label><input type="checkbox" bind:checked={display.x2_zero_line} />
203
+ X2</label>
204
+ {/if}
131
205
  {#if y_includes_zero}
132
206
  <label><input type="checkbox" bind:checked={display.y_zero_line} /> Y</label>
133
207
  {/if}
208
+ {#if y2_includes_zero}
209
+ <label><input type="checkbox" bind:checked={display.y2_zero_line} />
210
+ Y2</label>
211
+ {/if}
134
212
  </span>
135
213
  {/if}
136
214
  <span class="control-group" data-label="grid">Grid:
137
215
  <label><input type="checkbox" bind:checked={display.x_grid} /> X</label>
216
+ {#if has_x2_points}
217
+ <label><input type="checkbox" bind:checked={display.x2_grid} /> X2</label>
218
+ {/if}
138
219
  <label><input type="checkbox" bind:checked={display.y_grid} /> Y</label>
139
220
  {#if has_y2_points}
140
221
  <label><input type="checkbox" bind:checked={display.y2_grid} /> Y2</label>
@@ -145,9 +226,15 @@ let ctrl_state = $derived({
145
226
  <!-- Base Axis Range controls -->
146
227
  <SettingsSection
147
228
  title="Axis Range"
148
- current_values={{ x_range: x_axis.range, y_range: y_axis.range, y2_range: y2_axis.range }}
229
+ current_values={{
230
+ x_range: x_axis.range,
231
+ x2_range: x2_axis.range,
232
+ y_range: y_axis.range,
233
+ y2_range: y2_axis.range,
234
+ }}
149
235
  on_reset={() => {
150
236
  x_axis = { ...x_axis, range: [null, null] }
237
+ x2_axis = { ...x2_axis, range: [null, null] }
151
238
  y_axis = { ...y_axis, range: [null, null] }
152
239
  y2_axis = { ...y2_axis, range: [null, null] }
153
240
  Object.values(range_els).forEach((el) => el.classList.remove(`invalid`))
@@ -156,6 +243,7 @@ let ctrl_state = $derived({
156
243
  >
157
244
  {#each [
158
245
  [`x`, `X`],
246
+ ...(has_x2_points ? [[`x2`, `X2`]] : []),
159
247
  [`y`, `Y`],
160
248
  ...(has_y2_points ? [[`y2`, `Y2`]] : []),
161
249
  ] as
@@ -170,16 +258,16 @@ let ctrl_state = $derived({
170
258
  bind:this={range_els[`${axis}-min`]}
171
259
  placeholder="auto"
172
260
  class="range-input"
173
- oninput={(e) => update_range(axis, 0, e.currentTarget.value)}
174
- onkeydown={(e) => e.key === `Enter` && e.currentTarget.blur()}
261
+ oninput={(evt) => update_range(axis, 0, evt.currentTarget.value)}
262
+ onkeydown={(evt) => evt.key === `Enter` && evt.currentTarget?.blur()}
175
263
  /> to <input
176
264
  type="number"
177
265
  value={range_inputs[axis][1] ?? ``}
178
266
  bind:this={range_els[`${axis}-max`]}
179
267
  placeholder="auto"
180
268
  class="range-input"
181
- oninput={(e) => update_range(axis, 1, e.currentTarget.value)}
182
- onkeydown={(e) => e.key === `Enter` && e.currentTarget.blur()}
269
+ oninput={(evt) => update_range(axis, 1, evt.currentTarget.value)}
270
+ onkeydown={(evt) => evt.key === `Enter` && evt.currentTarget?.blur()}
183
271
  />
184
272
  </label>
185
273
  {/each}
@@ -204,12 +292,12 @@ let ctrl_state = $derived({
204
292
  max={max_ticks}
205
293
  step="1"
206
294
  value={typeof x_axis.ticks === `number` ? x_axis.ticks : 8}
207
- oninput={(e) => {
208
- const v = parseInt(e.currentTarget.value, 10)
209
- if (isNaN(v)) return
295
+ oninput={(evt) => {
296
+ const parsed = parseInt(evt.currentTarget.value, 10)
297
+ if (isNaN(parsed)) return
210
298
  x_axis = {
211
299
  ...x_axis,
212
- ticks: Math.max(min_ticks, Math.min(max_ticks, v)),
300
+ ticks: Math.max(min_ticks, Math.min(max_ticks, parsed)),
213
301
  }
214
302
  }}
215
303
  />
@@ -221,12 +309,12 @@ let ctrl_state = $derived({
221
309
  max={max_ticks}
222
310
  step="1"
223
311
  value={typeof y_axis.ticks === `number` ? y_axis.ticks : 6}
224
- oninput={(e) => {
225
- const v = parseInt(e.currentTarget.value, 10)
226
- if (isNaN(v)) return
312
+ oninput={(evt) => {
313
+ const parsed = parseInt(evt.currentTarget.value, 10)
314
+ if (isNaN(parsed)) return
227
315
  y_axis = {
228
316
  ...y_axis,
229
- ticks: Math.max(min_ticks, Math.min(max_ticks, v)),
317
+ ticks: Math.max(min_ticks, Math.min(max_ticks, parsed)),
230
318
  }
231
319
  }}
232
320
  />
@@ -239,11 +327,13 @@ let ctrl_state = $derived({
239
327
  title="Scale Type"
240
328
  current_values={{
241
329
  x_scale: get_scale_type_name(x_axis.scale_type),
330
+ x2_scale: get_scale_type_name(x2_axis.scale_type),
242
331
  y_scale: get_scale_type_name(y_axis.scale_type),
243
332
  y2_scale: get_scale_type_name(y2_axis.scale_type),
244
333
  }}
245
334
  on_reset={() => {
246
335
  x_axis = { ...x_axis, scale_type: `linear` }
336
+ x2_axis = { ...x2_axis, scale_type: `linear` }
247
337
  y_axis = { ...y_axis, scale_type: `linear` }
248
338
  y2_axis = { ...y2_axis, scale_type: `linear` }
249
339
  }}
@@ -252,10 +342,11 @@ let ctrl_state = $derived({
252
342
  <label>X:
253
343
  <select
254
344
  value={get_scale_type_name(x_axis.scale_type)}
255
- onchange={(e) => {
345
+ onchange={(evt) => {
346
+ const val = evt.currentTarget.value
256
347
  x_axis = {
257
348
  ...x_axis,
258
- scale_type: e.currentTarget.value as ScaleTypeName,
349
+ scale_type: is_scale_type_name(val) ? val : `linear`,
259
350
  }
260
351
  }}
261
352
  >
@@ -264,13 +355,32 @@ let ctrl_state = $derived({
264
355
  <option value="arcsinh">Arcsinh</option>
265
356
  </select>
266
357
  </label>
358
+ {#if has_x2_points}
359
+ <label>X2:
360
+ <select
361
+ value={get_scale_type_name(x2_axis.scale_type)}
362
+ onchange={(evt) => {
363
+ const val = evt.currentTarget.value
364
+ x2_axis = {
365
+ ...x2_axis,
366
+ scale_type: is_scale_type_name(val) ? val : `linear`,
367
+ }
368
+ }}
369
+ >
370
+ <option value="linear">Linear</option>
371
+ <option value="log">Log</option>
372
+ <option value="arcsinh">Arcsinh</option>
373
+ </select>
374
+ </label>
375
+ {/if}
267
376
  <label>Y:
268
377
  <select
269
378
  value={get_scale_type_name(y_axis.scale_type)}
270
- onchange={(e) => {
379
+ onchange={(evt) => {
380
+ const val = evt.currentTarget.value
271
381
  y_axis = {
272
382
  ...y_axis,
273
- scale_type: e.currentTarget.value as ScaleTypeName,
383
+ scale_type: is_scale_type_name(val) ? val : `linear`,
274
384
  }
275
385
  }}
276
386
  >
@@ -283,10 +393,11 @@ let ctrl_state = $derived({
283
393
  <label>Y2:
284
394
  <select
285
395
  value={get_scale_type_name(y2_axis.scale_type)}
286
- onchange={(e) => {
396
+ onchange={(evt) => {
397
+ const val = evt.currentTarget.value
287
398
  y2_axis = {
288
399
  ...y2_axis,
289
- scale_type: e.currentTarget.value as ScaleTypeName,
400
+ scale_type: is_scale_type_name(val) ? val : `linear`,
290
401
  }
291
402
  }}
292
403
  >
@@ -317,8 +428,9 @@ let ctrl_state = $derived({
317
428
  <select
318
429
  value={current_sync.mode}
319
430
  aria-label="Y2 axis synchronization mode"
320
- onchange={(e) => {
321
- const mode = e.currentTarget.value as Y2SyncMode
431
+ onchange={(evt) => {
432
+ const val = evt.currentTarget.value
433
+ const mode = is_y2_sync_mode(val) ? val : `none`
322
434
  if (mode === `none`) {
323
435
  y2_axis = { ...y2_axis, sync: undefined }
324
436
  } else if (mode === `align`) {
@@ -343,8 +455,8 @@ let ctrl_state = $derived({
343
455
  value={current_sync.align_value ?? 0}
344
456
  aria-label="Value to align on both axes"
345
457
  style="width: 5em"
346
- onchange={(e) => {
347
- const val = parseFloat(e.currentTarget.value)
458
+ onchange={(evt) => {
459
+ const val = parseFloat(evt.currentTarget.value)
348
460
  y2_axis = {
349
461
  ...y2_axis,
350
462
  sync: {
@@ -365,11 +477,13 @@ let ctrl_state = $derived({
365
477
  data-testid="tick-format-section"
366
478
  current_values={{
367
479
  x_format: x_axis.format,
480
+ x2_format: x2_axis.format,
368
481
  y_format: y_axis.format,
369
482
  y2_format: y2_axis.format,
370
483
  }}
371
484
  on_reset={() => {
372
485
  x_axis = { ...x_axis, format: DEFAULTS.plot.x_format }
486
+ x2_axis = { ...x2_axis, format: DEFAULTS.plot.x2_format }
373
487
  y_axis = { ...y_axis, format: DEFAULTS.plot.y_format }
374
488
  y2_axis = { ...y2_axis, format: DEFAULTS.plot.y2_format }
375
489
  }}
@@ -384,6 +498,17 @@ let ctrl_state = $derived({
384
498
  oninput={format_input_handler(`x`)}
385
499
  />
386
500
  </label>
501
+ {#if has_x2_points}
502
+ <label style="white-space: nowrap">X2-axis:
503
+ <input
504
+ type="text"
505
+ value={x2_axis.format ?? DEFAULTS.plot.x2_format}
506
+ placeholder=".2~s / .0% / %Y-%m-%d"
507
+ oninput={format_input_handler(`x2`)}
508
+ style="width: 100%"
509
+ />
510
+ </label>
511
+ {/if}
387
512
  <label style="white-space: nowrap">Y-axis:
388
513
  <input
389
514
  type="text"
@@ -1,4 +1,4 @@
1
1
  import type { PlotControlsProps } from './index';
2
- declare const PlotControls: import("svelte").Component<PlotControlsProps, {}, "display" | "show_controls" | "controls_open" | "x_axis" | "y_axis" | "y2_axis">;
2
+ declare const PlotControls: import("svelte").Component<PlotControlsProps, {}, "display" | "show_controls" | "controls_open" | "x_axis" | "y_axis" | "x2_axis" | "y2_axis">;
3
3
  type PlotControls = ReturnType<typeof PlotControls>;
4
4
  export default PlotControls;