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,13 +1,45 @@
1
- <script lang="ts">import { format_num } from '../labels';
2
- let { data = [], title = ``, fallback = ``, fmt = `.2f`, as = `section`, title_snippet, fallback_snippet, ...rest } = $props();
3
- let default_fmt = $derived(fmt); // rename fmt to default_fmt for internal use
1
+ <script lang="ts">
2
+ import { format_num } from '../labels'
3
+ import { sanitize_html } from '../sanitize'
4
+ import type { Snippet } from 'svelte'
5
+ import type { HTMLAttributes } from 'svelte/elements'
6
+
7
+ interface Props<T extends keyof HTMLElementTagNameMap = `section`>
8
+ extends HTMLAttributes<HTMLElementTagNameMap[T]> {
9
+ data?: {
10
+ title: string
11
+ value?: string | number | number[] | null
12
+ unit?: string
13
+ fmt?: string
14
+ condition?: boolean | number | null
15
+ tooltip?: string
16
+ }[]
17
+ title?: string
18
+ fallback?: string
19
+ fmt?: string
20
+ as?: T
21
+ title_snippet?: Snippet
22
+ fallback_snippet?: Snippet
23
+ }
24
+ let {
25
+ data = [],
26
+ title = ``,
27
+ fallback = ``,
28
+ fmt = `.2f`,
29
+ as = `section`,
30
+ title_snippet,
31
+ fallback_snippet,
32
+ ...rest
33
+ }: Props = $props()
34
+
35
+ let default_fmt = $derived(fmt) // rename fmt to default_fmt for internal use
4
36
  </script>
5
37
 
6
38
  <svelte:element this={as} {...rest} class="info-card {rest.class ?? ``}">
7
39
  {#if title || title_snippet}
8
40
  <h2>
9
41
  {#if title_snippet}{@render title_snippet()}{:else}
10
- {@html title}
42
+ {@html sanitize_html(title)}
11
43
  {/if}
12
44
  </h2>
13
45
  {/if}
@@ -20,10 +52,10 @@ let default_fmt = $derived(fmt); // rename fmt to default_fmt for internal use
20
52
  }
21
53
  <div>
22
54
  <span class="title" {title}>
23
- {@html title}
55
+ {@html sanitize_html(title)}
24
56
  </span>
25
57
  <strong title={tooltip ?? null}>
26
- {@html typeof value == `number` ? format_num(value, fmt) : value}
58
+ {@html sanitize_html(typeof value == `number` ? format_num(value, fmt) : value)}
27
59
  {#if unit}
28
60
  <small>{unit}</small>
29
61
  {/if}
@@ -1,33 +1,64 @@
1
- <script lang="ts">import Icon from '../Icon.svelte';
2
- import { tooltip } from 'svelte-multiselect';
3
- let { label, value, copy_value, title, variant = `default`, size = `md`, removable = false, disabled = false, onclick, onremove, children, ...rest } = $props();
4
- let just_copied = $state(false);
5
- async function copy_to_clipboard() {
6
- const to_copy = copy_value ?? value;
7
- if (to_copy === undefined)
8
- return;
9
- await navigator.clipboard.writeText(String(to_copy));
10
- just_copied = true;
11
- setTimeout(() => (just_copied = false), 1000);
12
- }
13
- function handle_click(event) {
14
- if (disabled)
15
- return;
16
- if (onclick)
17
- onclick(event);
18
- else
19
- void copy_to_clipboard();
20
- }
21
- function handle_keydown(event) {
22
- if (disabled || (event.key !== `Enter` && event.key !== ` `))
23
- return;
24
- event.preventDefault();
25
- event.currentTarget?.click();
26
- }
27
- function handle_remove(event) {
28
- event.stopPropagation();
29
- onremove?.();
30
- }
1
+ <script lang="ts">
2
+ import Icon from '../Icon.svelte'
3
+ import { sanitize_html } from '../sanitize'
4
+ import type { Snippet } from 'svelte'
5
+ import { tooltip } from 'svelte-multiselect'
6
+ import type { HTMLAttributes } from 'svelte/elements'
7
+ import type { InfoTagSize, InfoTagVariant } from './index'
8
+
9
+ let {
10
+ label,
11
+ value,
12
+ copy_value,
13
+ title,
14
+ variant = `default`,
15
+ size = `md`,
16
+ removable = false,
17
+ disabled = false,
18
+ onclick,
19
+ onremove,
20
+ children,
21
+ ...rest
22
+ }: {
23
+ label: string // Label text (supports HTML)
24
+ value: string | number | undefined // Value to display (supports HTML)
25
+ copy_value?: string | number // Value to copy to clipboard (defaults to value)
26
+ title?: string // Tooltip text
27
+ variant?: InfoTagVariant // Visual variant for semantic meaning
28
+ size?: InfoTagSize // Size variant
29
+ removable?: boolean // Show remove/close button
30
+ disabled?: boolean // Disable interactions
31
+ onclick?: (event: MouseEvent) => void // Custom click handler (overrides copy-to-clipboard default)
32
+ onremove?: () => void // Callback when remove button is clicked
33
+ children?: Snippet<[]> // Additional content to render inside the tag
34
+ } & Omit<HTMLAttributes<HTMLSpanElement>, `onclick` | `onkeydown`> = $props()
35
+
36
+ let just_copied = $state(false)
37
+
38
+ async function copy_to_clipboard(): Promise<void> {
39
+ const to_copy = copy_value ?? value
40
+ if (to_copy === undefined) return
41
+ await navigator.clipboard.writeText(String(to_copy))
42
+ just_copied = true
43
+ setTimeout(() => (just_copied = false), 1000)
44
+ }
45
+
46
+ function handle_click(event: MouseEvent): void {
47
+ if (disabled) return
48
+ if (onclick) onclick(event)
49
+ else void copy_to_clipboard()
50
+ }
51
+
52
+ function handle_keydown(event: KeyboardEvent): void {
53
+ if (disabled || (event.key !== `Enter` && event.key !== ` `)) return
54
+ event.preventDefault()
55
+ ;(event.currentTarget as HTMLElement)?.click()
56
+ }
57
+
58
+ function handle_remove(event: MouseEvent): void {
59
+ event.stopPropagation()
60
+ onremove?.()
61
+ }
31
62
  </script>
32
63
 
33
64
  <span
@@ -42,8 +73,8 @@ function handle_remove(event) {
42
73
  aria-disabled={disabled}
43
74
  {...rest}
44
75
  >
45
- {@html label}
46
- <em>{@html value}</em>
76
+ {@html sanitize_html(label)}
77
+ <em>{@html sanitize_html(value)}</em>
47
78
  {#if just_copied}
48
79
  <Icon
49
80
  icon="Check"
@@ -67,63 +98,63 @@ function handle_remove(event) {
67
98
  border: 1px solid;
68
99
  white-space: nowrap;
69
100
  border-color: color-mix(in srgb, var(--tag-color) 25%, transparent);
70
- }
71
- .info-tag em {
72
- font-style: normal;
73
- font-weight: 600;
74
- color: var(--tag-color);
75
- }
76
- .info-tag:hover:not(.disabled) {
77
- background: color-mix(in srgb, var(--tag-color) 18%, transparent);
78
- border-color: color-mix(in srgb, var(--tag-color) 40%, transparent);
79
- }
80
- .info-tag.sm {
81
- font-size: 0.72em;
82
- padding: 0 5pt;
83
- border-radius: 4px;
84
- }
85
- .info-tag.md {
86
- font-size: 0.8em;
87
- padding: 1pt 6pt;
88
- border-radius: 5px;
89
- }
90
- .info-tag.lg {
91
- font-size: 0.9em;
92
- padding: 3pt 8pt;
93
- border-radius: 6px;
94
- }
95
- .info-tag.default {
96
- --tag-color: var(--highlight, #4db6ff);
97
- }
98
- .info-tag.success {
99
- --tag-color: var(--success-color, #10b981);
100
- }
101
- .info-tag.warning {
102
- --tag-color: var(--warning-color, #f59e0b);
103
- }
104
- .info-tag.error {
105
- --tag-color: var(--error-color, #ef4444);
106
- }
107
- .info-tag.info {
108
- --tag-color: var(--info-color, #3b82f6);
109
- }
110
- .info-tag.disabled {
111
- opacity: 0.5;
112
- cursor: not-allowed;
113
- }
114
- .info-tag:active:not(.disabled) {
115
- transform: scale(0.97);
116
- }
117
- .info-tag :global(.copy-checkmark) {
118
- position: absolute;
119
- top: 50%;
120
- right: 3pt;
121
- transform: translateY(-50%);
122
- background: rgba(16, 185, 129, 0.9);
123
- border-radius: 50%;
124
- padding: 2pt;
125
- display: flex;
126
- animation: pop-in 0.15s ease-out;
101
+ em {
102
+ font-style: normal;
103
+ font-weight: 600;
104
+ color: var(--tag-color);
105
+ }
106
+ &:hover:not(.disabled) {
107
+ background: color-mix(in srgb, var(--tag-color) 18%, transparent);
108
+ border-color: color-mix(in srgb, var(--tag-color) 40%, transparent);
109
+ }
110
+ &.sm {
111
+ font-size: 0.72em;
112
+ padding: 0 5pt;
113
+ border-radius: 4px;
114
+ }
115
+ &.md {
116
+ font-size: 0.8em;
117
+ padding: 1pt 6pt;
118
+ border-radius: 5px;
119
+ }
120
+ &.lg {
121
+ font-size: 0.9em;
122
+ padding: 3pt 8pt;
123
+ border-radius: 6px;
124
+ }
125
+ &.default {
126
+ --tag-color: var(--highlight, #4db6ff);
127
+ }
128
+ &.success {
129
+ --tag-color: var(--success-color, #10b981);
130
+ }
131
+ &.warning {
132
+ --tag-color: var(--warning-color, #f59e0b);
133
+ }
134
+ &.error {
135
+ --tag-color: var(--error-color, #ef4444);
136
+ }
137
+ &.info {
138
+ --tag-color: var(--info-color, #3b82f6);
139
+ }
140
+ &.disabled {
141
+ opacity: 0.5;
142
+ cursor: not-allowed;
143
+ }
144
+ &:active:not(.disabled) {
145
+ transform: scale(0.97);
146
+ }
147
+ :global(.copy-checkmark) {
148
+ position: absolute;
149
+ top: 50%;
150
+ right: 3pt;
151
+ transform: translateY(-50%);
152
+ background: rgba(16, 185, 129, 0.9);
153
+ border-radius: 50%;
154
+ padding: 2pt;
155
+ display: flex;
156
+ animation: pop-in 0.15s ease-out;
157
+ }
127
158
  }
128
159
  [aria-label='Remove'] {
129
160
  display: flex;
@@ -137,11 +168,11 @@ function handle_remove(event) {
137
168
  border-radius: 50%;
138
169
  color: inherit;
139
170
  opacity: 0.5;
140
- }
141
- [aria-label='Remove']:hover {
142
- opacity: 1;
143
- background: rgba(239, 68, 68, 0.2);
144
- color: var(--error-color, #ef4444);
171
+ &:hover {
172
+ opacity: 1;
173
+ background: rgba(239, 68, 68, 0.2);
174
+ color: var(--error-color, #ef4444);
175
+ }
145
176
  }
146
177
  @keyframes pop-in {
147
178
  from {
@@ -1,50 +1,95 @@
1
- <script lang="ts">import Icon from '../Icon.svelte';
2
- import { Histogram } from '../plot';
3
- let { label, min_value = $bindable(), max_value = $bindable(), placeholders = {}, title, histogram_data, histogram_height = 30, histogram_color = `rgba(0, 0, 0, 0.2)`, histogram_position = `top`, log = false, disabled = false, unit, show_clear_button = true, onchange, onclear, ...rest } = $props();
4
- let show_histogram = $derived(histogram_position !== `none` && histogram_data?.length);
5
- // Active when either bound is set (undefined = unbounded)
6
- let active = $derived(min_value !== undefined || max_value !== undefined);
7
- let plain_label = $derived(label.replace(/<[^>]*>/g, ``));
8
- let filtered_data = $derived.by(() => {
9
- if (!histogram_data)
10
- return [];
1
+ <script lang="ts">
2
+ import Icon from '../Icon.svelte'
3
+ import { sanitize_html } from '../sanitize'
4
+ import type { AxisConfig, DataSeries } from '../plot'
5
+ import { Histogram } from '../plot'
6
+ import type { HTMLAttributes } from 'svelte/elements'
7
+
8
+ let {
9
+ label,
10
+ min_value = $bindable(),
11
+ max_value = $bindable(),
12
+ placeholders = {},
13
+ title,
14
+ histogram_data,
15
+ histogram_height = 30,
16
+ histogram_color = `rgba(0, 0, 0, 0.2)`,
17
+ histogram_position = `top`,
18
+ log = false,
19
+ disabled = false,
20
+ unit,
21
+ show_clear_button = true,
22
+ onchange,
23
+ onclear,
24
+ ...rest
25
+ }: {
26
+ label: string // Label text (supports HTML)
27
+ min_value?: number // Minimum value for filtering (undefined = unbounded)
28
+ max_value?: number // Maximum value for filtering (undefined = unbounded)
29
+ placeholders?: { min?: string; max?: string } // Placeholder text for min/max inputs
30
+ title?: string // Tooltip title for the label
31
+ histogram_data?: number[] // Data array for histogram visualization
32
+ histogram_height?: number // Height of histogram in pixels
33
+ histogram_color?: string // Color for histogram bars (unfilled data)
34
+ histogram_position?: `top` | `bottom` | `none` // Position of histogram relative to inputs, or 'none' to hide
35
+ log?: boolean // Use logarithmic scale for histogram y-axis
36
+ disabled?: boolean // Disable all inputs
37
+ unit?: string // Unit label to display after inputs
38
+ show_clear_button?: boolean // Show clear button when filters are active
39
+ onchange?: (min: number | undefined, max: number | undefined) => void // Callback when filter values change
40
+ onclear?: () => void // Callback when clear button is clicked (fires before onchange)
41
+ } & HTMLAttributes<HTMLDivElement> = $props()
42
+
43
+ let show_histogram = $derived(
44
+ histogram_position !== `none` && histogram_data?.length,
45
+ )
46
+
47
+ // Active when either bound is set (undefined = unbounded)
48
+ let active = $derived(min_value !== undefined || max_value !== undefined)
49
+ let plain_label = $derived(label.replace(/<[^>]*>/g, ``))
50
+
51
+ let filtered_data = $derived.by(() => {
52
+ if (!histogram_data) return []
11
53
  // undefined means unbounded (-Infinity for min, +Infinity for max)
12
- const min = min_value ?? -Infinity;
13
- const max = max_value ?? Infinity;
14
- return histogram_data.filter((val) => val >= min && val <= max);
15
- });
16
- function onkeydown(event) {
54
+ const min = min_value ?? -Infinity
55
+ const max = max_value ?? Infinity
56
+ return histogram_data.filter((val) => val >= min && val <= max)
57
+ })
58
+
59
+ function onkeydown(event: KeyboardEvent): void {
17
60
  if (event.key === `Enter`) {
18
- event.preventDefault();
19
- event.target.blur();
20
- }
21
- else if (event.key === `Escape` && active) {
22
- event.preventDefault();
23
- clear_filter();
61
+ event.preventDefault()
62
+ ;(event.target as HTMLInputElement).blur()
63
+ } else if (event.key === `Escape` && active) {
64
+ event.preventDefault()
65
+ clear_filter()
24
66
  }
25
- }
26
- function clear_filter() {
27
- min_value = max_value = undefined;
28
- onclear?.();
29
- onchange?.(undefined, undefined);
30
- }
31
- const axis_config = {
67
+ }
68
+
69
+ function clear_filter(): void {
70
+ min_value = max_value = undefined
71
+ onclear?.()
72
+ onchange?.(undefined, undefined)
73
+ }
74
+
75
+ const axis_config: AxisConfig = {
32
76
  ticks: 0,
33
77
  label: ``,
34
78
  grid_style: { style: `opacity: 0` },
35
79
  tick: { label: { inside: true } },
36
80
  color: `color-mix(in srgb, currentColor 60%, transparent)`,
37
- };
38
- // x: [] satisfies DataSeries type requirement; Histogram bins on y values only
39
- const series = $derived([
81
+ }
82
+
83
+ // x: [] satisfies DataSeries type requirement; Histogram bins on y values only
84
+ const series: DataSeries[] = $derived([
40
85
  { y: histogram_data ?? [], color: histogram_color, label: `All`, x: [] },
41
86
  {
42
- y: filtered_data,
43
- color: `var(--accent-color, #228be6)`,
44
- label: `Filtered`,
45
- x: [],
87
+ y: filtered_data,
88
+ color: `var(--accent-color, #228be6)`,
89
+ label: `Filtered`,
90
+ x: [],
46
91
  },
47
- ]);
92
+ ])
48
93
  </script>
49
94
 
50
95
  {#snippet histogram_snippet()}
@@ -76,7 +121,7 @@ const series = $derived([
76
121
  {@render histogram_snippet()}
77
122
  {/if}
78
123
  <div class="filter-row">
79
- <span {title} class="filter-label">{@html label}</span>
124
+ <span {title} class="filter-label">{@html sanitize_html(label)}</span>
80
125
  <div class="filter-inputs">
81
126
  <input
82
127
  bind:value={min_value}
@@ -1,64 +1,94 @@
1
- <script lang="ts">import Icon from '../Icon.svelte';
2
- import { untrack } from 'svelte';
3
- let { title, current_values, children, on_reset = () => { }, ...rest } = $props();
4
- // Create a deep copy of current_values on mount to use as reference values
5
- function deep_copy(obj) {
6
- if (obj === null || typeof obj !== `object`)
7
- return obj;
8
- if (obj instanceof Date)
9
- return new Date(obj.getTime());
10
- if (obj instanceof RegExp)
11
- return new RegExp(obj);
1
+ <script lang="ts">
2
+ import Icon from '../Icon.svelte'
3
+ import type { Snippet } from 'svelte'
4
+ import { untrack } from 'svelte'
5
+ import type { HTMLAttributes } from 'svelte/elements'
6
+
7
+ let {
8
+ title,
9
+ current_values,
10
+ children,
11
+ on_reset = () => {},
12
+ ...rest
13
+ }: HTMLAttributes<HTMLElementTagNameMap[`section`]> & {
14
+ title: string
15
+ current_values: Record<string, unknown>
16
+ children: Snippet<
17
+ [{
18
+ current_values: Record<string, unknown>
19
+ has_changes: boolean
20
+ reference_values: Record<string, unknown>
21
+ }]
22
+ >
23
+ on_reset?: () => void
24
+ } = $props()
25
+
26
+ // Create a deep copy of current_values on mount to use as reference values
27
+ function deep_copy(obj: unknown): unknown {
28
+ if (obj === null || typeof obj !== `object`) return obj
29
+ if (obj instanceof Date) return new Date(obj.getTime())
30
+ if (obj instanceof RegExp) return new RegExp(obj)
12
31
  if (Array.isArray(obj)) {
13
- return obj.map((item) => typeof item === `object` && item !== null ? deep_copy(item) : item);
32
+ return obj.map((item) =>
33
+ typeof item === `object` && item !== null ? deep_copy(item) : item
34
+ )
14
35
  }
15
- const copy = {};
16
- for (const [key, value] of Object.entries(obj)) {
17
- copy[key] = typeof value === `object` && value !== null
18
- ? deep_copy(value)
19
- : value;
36
+
37
+ const copy: Record<string, unknown> = {}
38
+ for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {
39
+ copy[key] = typeof value === `object` && value !== null
40
+ ? deep_copy(value)
41
+ : value
20
42
  }
21
- return copy;
22
- }
23
- // Capture initial values once at mount - must NOT be $derived or it tracks changes
24
- const reference_values = untrack(() => deep_copy(current_values));
25
- // Check if any values have changed from reference values
26
- let has_changes = $derived.by(() => {
43
+ return copy
44
+ }
45
+
46
+ // Capture initial values once at mount - must NOT be $derived or it tracks changes
47
+ const reference_values = untrack(() =>
48
+ deep_copy(current_values) as Record<string, unknown>
49
+ )
50
+
51
+ // Check if any values have changed from reference values
52
+ let has_changes = $derived.by(() => {
27
53
  for (const [key, reference_value] of Object.entries(reference_values)) {
28
- const current_value = current_values[key];
29
- // Deep comparison for arrays
30
- if (Array.isArray(reference_value) && Array.isArray(current_value)) {
31
- if (reference_value.length !== current_value.length)
32
- return true;
33
- if (reference_value.some((val, idx) => {
34
- const curr_val = current_value[idx];
35
- // Handle nested objects/arrays in arrays
36
- if (typeof val === `object` && val !== null &&
37
- typeof curr_val === `object` && curr_val !== null)
38
- return JSON.stringify(val) !== JSON.stringify(curr_val); // Quick deep comparison fallback
39
- return val !== curr_val;
40
- })) {
41
- return true;
42
- }
43
- continue;
44
- }
45
- // Handle undefined/null comparisons properly
46
- if (reference_value === undefined && current_value === undefined)
47
- continue;
48
- if (reference_value === null && current_value === null)
49
- continue;
50
- // Basic comparison for primitives
51
- if (current_value !== reference_value) {
52
- return true;
54
+ const current_value = current_values[key]
55
+
56
+ // Deep comparison for arrays
57
+ if (Array.isArray(reference_value) && Array.isArray(current_value)) {
58
+ if (reference_value.length !== current_value.length) return true
59
+ if (
60
+ reference_value.some((val, idx) => {
61
+ const curr_val = current_value[idx]
62
+ // Handle nested objects/arrays in arrays
63
+ if (
64
+ typeof val === `object` && val !== null &&
65
+ typeof curr_val === `object` && curr_val !== null
66
+ ) return JSON.stringify(val) !== JSON.stringify(curr_val) // Quick deep comparison fallback
67
+ return val !== curr_val
68
+ })
69
+ ) {
70
+ return true
53
71
  }
72
+ continue
73
+ }
74
+
75
+ // Handle undefined/null comparisons properly
76
+ if (reference_value === undefined && current_value === undefined) continue
77
+ if (reference_value === null && current_value === null) continue
78
+
79
+ // Basic comparison for primitives
80
+ if (current_value !== reference_value) {
81
+ return true
82
+ }
54
83
  }
55
- return false;
56
- });
57
- function handle_reset(event) {
58
- event.stopPropagation();
59
- event.preventDefault();
60
- on_reset();
61
- }
84
+ return false
85
+ })
86
+
87
+ function handle_reset(event: MouseEvent) {
88
+ event.stopPropagation()
89
+ event.preventDefault()
90
+ on_reset()
91
+ }
62
92
  </script>
63
93
 
64
94
  <h4 id="settings-section-title">