matterviz 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. package/dist/EmptyState.svelte +10 -4
  2. package/dist/FilePicker.svelte +48 -60
  3. package/dist/Icon.svelte +7 -4
  4. package/dist/MillerIndexInput.svelte +2 -2
  5. package/dist/api/optimade.js +10 -7
  6. package/dist/app.css +68 -0
  7. package/dist/brillouin/BrillouinZone.svelte +90 -91
  8. package/dist/brillouin/BrillouinZone.svelte.d.ts +5 -7
  9. package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte +18 -14
  11. package/dist/brillouin/BrillouinZoneInfoPane.svelte +6 -10
  12. package/dist/brillouin/BrillouinZoneScene.svelte +46 -68
  13. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  14. package/dist/brillouin/compute.js +10 -16
  15. package/dist/brillouin/geometry.js +2 -2
  16. package/dist/chempot-diagram/ChemPotDiagram.svelte +48 -50
  17. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +61 -169
  18. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +1 -1
  19. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +559 -755
  20. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +1 -1
  21. package/dist/chempot-diagram/async-compute.svelte.js +13 -14
  22. package/dist/chempot-diagram/color.d.ts +21 -1
  23. package/dist/chempot-diagram/color.js +70 -1
  24. package/dist/chempot-diagram/compute.d.ts +7 -0
  25. package/dist/chempot-diagram/compute.js +85 -26
  26. package/dist/chempot-diagram/controls-state.svelte.js +1 -1
  27. package/dist/chempot-diagram/export.js +1 -6
  28. package/dist/chempot-diagram/temperature.js +9 -10
  29. package/dist/colors/index.d.ts +0 -4
  30. package/dist/colors/index.js +19 -20
  31. package/dist/composition/BarChart.svelte +30 -26
  32. package/dist/composition/BubbleChart.svelte +17 -17
  33. package/dist/composition/Composition.svelte +10 -19
  34. package/dist/composition/Formula.svelte +20 -27
  35. package/dist/composition/FormulaFilter.svelte +115 -184
  36. package/dist/composition/PieChart.svelte +55 -41
  37. package/dist/composition/format.js +7 -9
  38. package/dist/composition/index.d.ts +2 -0
  39. package/dist/composition/index.js +14 -0
  40. package/dist/composition/parse.d.ts +2 -2
  41. package/dist/composition/parse.js +61 -115
  42. package/dist/constants.d.ts +0 -1
  43. package/dist/constants.js +17 -26
  44. package/dist/convex-hull/ConvexHull.svelte +12 -15
  45. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
  46. package/dist/convex-hull/ConvexHull2D.svelte +93 -94
  47. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  48. package/dist/convex-hull/ConvexHull3D.svelte +127 -186
  49. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  50. package/dist/convex-hull/ConvexHull4D.svelte +131 -180
  51. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  52. package/dist/convex-hull/ConvexHullChrome.svelte +36 -40
  53. package/dist/convex-hull/ConvexHullControls.svelte +46 -48
  54. package/dist/convex-hull/ConvexHullStats.svelte +193 -195
  55. package/dist/convex-hull/ConvexHullTooltip.svelte +5 -12
  56. package/dist/convex-hull/GasPressureControls.svelte +5 -12
  57. package/dist/convex-hull/StructurePopup.svelte +18 -22
  58. package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
  59. package/dist/convex-hull/TemperatureSlider.svelte +4 -10
  60. package/dist/convex-hull/canvas-interactions.svelte.js +2 -1
  61. package/dist/convex-hull/gas-thermodynamics.js +21 -53
  62. package/dist/convex-hull/helpers.d.ts +8 -10
  63. package/dist/convex-hull/helpers.js +37 -43
  64. package/dist/convex-hull/hull-state.svelte.d.ts +1 -1
  65. package/dist/convex-hull/thermodynamics.js +37 -44
  66. package/dist/coordination/CoordinationBarPlot.svelte +49 -53
  67. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  68. package/dist/coordination/calc-coordination.d.ts +1 -1
  69. package/dist/coordination/calc-coordination.js +28 -25
  70. package/dist/element/BohrAtom.svelte +5 -9
  71. package/dist/element/ElementHeading.svelte +4 -1
  72. package/dist/element/ElementPhoto.svelte +11 -9
  73. package/dist/element/ElementStats.svelte +12 -10
  74. package/dist/element/ElementTile.svelte +44 -67
  75. package/dist/element/Nucleus.svelte +4 -2
  76. package/dist/element/data.d.ts +3 -2
  77. package/dist/element/data.js +5 -1
  78. package/dist/element/helpers.d.ts +4 -0
  79. package/dist/element/helpers.js +18 -0
  80. package/dist/element/index.d.ts +2 -5
  81. package/dist/element/index.js +4 -19
  82. package/dist/feedback/DragOverlay.svelte +5 -5
  83. package/dist/feedback/DragOverlay.svelte.d.ts +2 -2
  84. package/dist/feedback/StatusMessage.svelte +7 -4
  85. package/dist/fermi-surface/FermiSlice.svelte +21 -18
  86. package/dist/fermi-surface/FermiSurface.svelte +35 -44
  87. package/dist/fermi-surface/FermiSurface.svelte.d.ts +7 -13
  88. package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
  89. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  90. package/dist/fermi-surface/FermiSurfaceScene.svelte +64 -136
  91. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  92. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
  93. package/dist/fermi-surface/compute.js +25 -58
  94. package/dist/fermi-surface/parse.js +54 -88
  95. package/dist/file-viewer/JsonBrowser.svelte +1043 -0
  96. package/dist/file-viewer/JsonBrowser.svelte.d.ts +9 -0
  97. package/dist/file-viewer/PlotPanel.svelte +350 -0
  98. package/dist/file-viewer/PlotPanel.svelte.d.ts +9 -0
  99. package/dist/file-viewer/TrajectoryWithDos.svelte +30 -0
  100. package/dist/file-viewer/TrajectoryWithDos.svelte.d.ts +10 -0
  101. package/dist/file-viewer/detect.d.ts +11 -0
  102. package/dist/file-viewer/detect.js +381 -0
  103. package/dist/file-viewer/eligibility.d.ts +4 -0
  104. package/dist/file-viewer/eligibility.js +53 -0
  105. package/dist/file-viewer/host-protocol.d.ts +50 -0
  106. package/dist/file-viewer/host-transfer.d.ts +25 -0
  107. package/dist/file-viewer/host-transfer.js +42 -0
  108. package/dist/file-viewer/index.d.ts +5 -0
  109. package/dist/file-viewer/index.js +5 -0
  110. package/dist/file-viewer/main.d.ts +44 -0
  111. package/dist/file-viewer/main.js +535 -0
  112. package/dist/file-viewer/parse.d.ts +9 -0
  113. package/dist/file-viewer/parse.js +170 -0
  114. package/dist/file-viewer/plot-utils.d.ts +24 -0
  115. package/dist/file-viewer/plot-utils.js +191 -0
  116. package/dist/file-viewer/types.d.ts +4 -0
  117. package/dist/file-viewer/types.js +5 -0
  118. package/dist/heatmap-matrix/HeatmapMatrix.svelte +153 -219
  119. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +2 -2
  120. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +9 -7
  121. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +1 -1
  122. package/dist/heatmap-matrix/index.d.ts +5 -0
  123. package/dist/icons.d.ts +4 -0
  124. package/dist/icons.js +4 -0
  125. package/dist/index.d.ts +2 -2
  126. package/dist/index.js +1 -1
  127. package/dist/io/ExportPane.svelte +11 -7
  128. package/dist/io/decompress.d.ts +4 -1
  129. package/dist/io/decompress.js +24 -36
  130. package/dist/io/export.d.ts +11 -4
  131. package/dist/io/export.js +75 -19
  132. package/dist/io/fetch.d.ts +0 -3
  133. package/dist/io/fetch.js +0 -11
  134. package/dist/io/file-drop.js +60 -35
  135. package/dist/io/index.d.ts +0 -1
  136. package/dist/io/index.js +2 -9
  137. package/dist/io/is-binary.d.ts +9 -0
  138. package/dist/io/is-binary.js +45 -1
  139. package/dist/io/url-drop.d.ts +2 -0
  140. package/dist/io/url-drop.js +40 -40
  141. package/dist/isosurface/Isosurface.svelte +700 -215
  142. package/dist/isosurface/Isosurface.svelte.d.ts +7 -1
  143. package/dist/isosurface/IsosurfaceControls.svelte +590 -116
  144. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +1 -1
  145. package/dist/isosurface/VolumeSlice.svelte +224 -0
  146. package/dist/isosurface/VolumeSlice.svelte.d.ts +28 -0
  147. package/dist/isosurface/coloring.d.ts +20 -0
  148. package/dist/isosurface/coloring.js +118 -0
  149. package/dist/isosurface/geometry-worker-types.d.ts +38 -0
  150. package/dist/isosurface/geometry.worker.d.ts +1 -0
  151. package/dist/isosurface/geometry.worker.js +59 -0
  152. package/dist/isosurface/grid.d.ts +10 -0
  153. package/dist/isosurface/grid.js +31 -0
  154. package/dist/isosurface/index.d.ts +4 -0
  155. package/dist/isosurface/index.js +4 -0
  156. package/dist/isosurface/parse-vaspwave.d.ts +3 -0
  157. package/dist/isosurface/parse-vaspwave.js +138 -0
  158. package/dist/isosurface/parse.js +6 -6
  159. package/dist/isosurface/profile.d.ts +12 -0
  160. package/dist/isosurface/profile.js +19 -0
  161. package/dist/isosurface/sampling.d.ts +34 -0
  162. package/dist/isosurface/sampling.js +408 -0
  163. package/dist/isosurface/slice-rendering.d.ts +13 -0
  164. package/dist/isosurface/slice-rendering.js +79 -0
  165. package/dist/isosurface/slice.d.ts +22 -2
  166. package/dist/isosurface/slice.js +200 -116
  167. package/dist/isosurface/types.d.ts +24 -1
  168. package/dist/isosurface/types.js +120 -8
  169. package/dist/json-path.d.ts +4 -0
  170. package/dist/json-path.js +89 -0
  171. package/dist/labels.d.ts +6 -2
  172. package/dist/labels.js +44 -14
  173. package/dist/layout/FullscreenButton.svelte +2 -1
  174. package/dist/layout/FullscreenToggle.svelte +10 -4
  175. package/dist/layout/InfoCard.svelte +8 -21
  176. package/dist/layout/InfoTag.svelte +1 -3
  177. package/dist/layout/NumberRangeInput.svelte +46 -0
  178. package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
  179. package/dist/layout/PropertyFilter.svelte +2 -6
  180. package/dist/layout/SettingsSection.svelte +57 -62
  181. package/dist/layout/SettingsSection.svelte.d.ts +6 -7
  182. package/dist/layout/SubpageGrid.svelte +3 -1
  183. package/dist/layout/ViewerChrome.svelte +16 -11
  184. package/dist/layout/ViewerChrome.svelte.d.ts +2 -1
  185. package/dist/layout/fullscreen.js +3 -5
  186. package/dist/layout/fullscreen.svelte.js +1 -2
  187. package/dist/layout/index.d.ts +1 -0
  188. package/dist/layout/index.js +1 -0
  189. package/dist/layout/json-tree/JsonNode.svelte +22 -59
  190. package/dist/layout/json-tree/JsonTree.svelte +101 -172
  191. package/dist/layout/json-tree/JsonValue.svelte +9 -32
  192. package/dist/layout/json-tree/utils.d.ts +0 -3
  193. package/dist/layout/json-tree/utils.js +50 -188
  194. package/dist/marching-cubes.d.ts +8 -1
  195. package/dist/marching-cubes.js +115 -48
  196. package/dist/math.d.ts +5 -2
  197. package/dist/math.js +48 -38
  198. package/dist/overlays/ContextMenu.svelte +19 -34
  199. package/dist/overlays/CopyButton.svelte +11 -5
  200. package/dist/overlays/DragControlTab.svelte +6 -1
  201. package/dist/overlays/DraggablePane.svelte +110 -74
  202. package/dist/overlays/DraggablePane.svelte.d.ts +2 -1
  203. package/dist/overlays/GlassChip.svelte +32 -0
  204. package/dist/overlays/GlassChip.svelte.d.ts +8 -0
  205. package/dist/overlays/InfoPaneCards.svelte +11 -23
  206. package/dist/overlays/index.d.ts +7 -0
  207. package/dist/overlays/index.js +26 -0
  208. package/dist/overlays/portal.d.ts +2 -0
  209. package/dist/overlays/portal.js +14 -0
  210. package/dist/periodic-table/PeriodicTable.svelte +113 -145
  211. package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
  212. package/dist/periodic-table/PeriodicTableControls.svelte +37 -115
  213. package/dist/periodic-table/TableInset.svelte +9 -4
  214. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +68 -105
  215. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
  216. package/dist/phase-diagram/PhaseDiagramControls.svelte +70 -94
  217. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
  218. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +2 -1
  219. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +12 -12
  220. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
  221. package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
  222. package/dist/phase-diagram/build-diagram.js +4 -9
  223. package/dist/phase-diagram/diagram-input.d.ts +1 -2
  224. package/dist/phase-diagram/parse.js +15 -15
  225. package/dist/phase-diagram/svg-to-diagram.js +28 -27
  226. package/dist/phase-diagram/utils.js +2 -3
  227. package/dist/plot/bar/BarPlot.svelte +461 -426
  228. package/dist/plot/bar/BarPlot.svelte.d.ts +2 -0
  229. package/dist/plot/bar/BarPlotControls.svelte +1 -3
  230. package/dist/plot/bar/BarPlotControls.svelte.d.ts +4 -6
  231. package/dist/plot/bar/SpacegroupBarPlot.svelte +46 -77
  232. package/dist/plot/bar/data.d.ts +5 -4
  233. package/dist/plot/bar/data.js +2 -1
  234. package/dist/plot/box/BoxPlot.svelte +322 -226
  235. package/dist/plot/box/BoxPlot.svelte.d.ts +2 -0
  236. package/dist/plot/box/Violin.svelte.d.ts +1 -0
  237. package/dist/plot/box/box-plot.js +1 -1
  238. package/dist/plot/core/auto-place.d.ts +1 -1
  239. package/dist/plot/core/auto-place.js +2 -2
  240. package/dist/plot/core/axis-utils.d.ts +12 -7
  241. package/dist/plot/core/axis-utils.js +48 -48
  242. package/dist/plot/core/components/AxisLabel.svelte +82 -20
  243. package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
  244. package/dist/plot/core/components/ColorBar.svelte +101 -106
  245. package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
  246. package/dist/plot/core/components/FillArea.svelte +10 -17
  247. package/dist/plot/core/components/HierarchyControls.svelte +249 -0
  248. package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
  249. package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
  250. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
  251. package/dist/plot/core/components/Line.svelte +18 -9
  252. package/dist/plot/core/components/Line.svelte.d.ts +2 -0
  253. package/dist/plot/core/components/PlotAxis.svelte +40 -17
  254. package/dist/plot/core/components/PlotControls.svelte +65 -41
  255. package/dist/plot/core/components/PlotLegend.svelte +31 -35
  256. package/dist/plot/core/components/PlotMarginals.svelte +616 -0
  257. package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
  258. package/dist/plot/core/components/PlotTooltip.svelte +1 -1
  259. package/dist/plot/core/components/PortalSelect.svelte +4 -8
  260. package/dist/plot/core/components/ReferenceLine.svelte +27 -24
  261. package/dist/plot/core/components/ReferenceLine3D.svelte +54 -57
  262. package/dist/plot/core/components/ReferencePlane.svelte +7 -8
  263. package/dist/plot/core/components/ZeroLines.svelte +4 -8
  264. package/dist/plot/core/components/ZoomRect.svelte +1 -2
  265. package/dist/plot/core/components/index.d.ts +1 -0
  266. package/dist/plot/core/components/index.js +1 -0
  267. package/dist/plot/core/data-cleaning-signal.d.ts +46 -0
  268. package/dist/plot/core/data-cleaning-signal.js +467 -0
  269. package/dist/plot/core/data-cleaning.d.ts +2 -42
  270. package/dist/plot/core/data-cleaning.js +27 -474
  271. package/dist/plot/core/data-transform.d.ts +1 -2
  272. package/dist/plot/core/data-transform.js +9 -15
  273. package/dist/plot/core/fill-utils.d.ts +3 -1
  274. package/dist/plot/core/fill-utils.js +28 -6
  275. package/dist/plot/core/index.d.ts +1 -0
  276. package/dist/plot/core/index.js +1 -0
  277. package/dist/plot/core/interactions.js +0 -2
  278. package/dist/plot/core/layout.d.ts +15 -6
  279. package/dist/plot/core/layout.js +57 -38
  280. package/dist/plot/core/marginals.d.ts +170 -0
  281. package/dist/plot/core/marginals.js +436 -0
  282. package/dist/plot/core/pan-zoom.svelte.d.ts +2 -4
  283. package/dist/plot/core/pan-zoom.svelte.js +34 -17
  284. package/dist/plot/core/placed-tween.svelte.d.ts +3 -0
  285. package/dist/plot/core/placed-tween.svelte.js +68 -21
  286. package/dist/plot/core/reference-line.js +1 -1
  287. package/dist/plot/core/scales.d.ts +23 -0
  288. package/dist/plot/core/scales.js +39 -13
  289. package/dist/plot/core/svg.js +0 -1
  290. package/dist/plot/core/types/fills.d.ts +101 -0
  291. package/dist/plot/core/types/fills.js +15 -0
  292. package/dist/plot/core/types/plot-3d.d.ts +87 -0
  293. package/dist/plot/core/types/plot-3d.js +4 -0
  294. package/dist/plot/core/types/reference-lines.d.ts +140 -0
  295. package/dist/plot/core/types/reference-lines.js +9 -0
  296. package/dist/plot/core/types.d.ts +29 -324
  297. package/dist/plot/core/types.js +23 -20
  298. package/dist/plot/core/utils/hierarchy-chart.d.ts +52 -0
  299. package/dist/plot/core/utils/hierarchy-chart.js +191 -0
  300. package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
  301. package/dist/plot/core/utils/hierarchy-labels.js +100 -0
  302. package/dist/plot/core/utils/label-placement.js +2 -2
  303. package/dist/plot/histogram/Histogram.svelte +314 -340
  304. package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
  305. package/dist/plot/histogram/HistogramControls.svelte +30 -28
  306. package/dist/plot/histogram/histogram.d.ts +31 -0
  307. package/dist/plot/histogram/histogram.js +70 -0
  308. package/dist/plot/histogram/index.d.ts +1 -0
  309. package/dist/plot/histogram/index.js +1 -0
  310. package/dist/plot/index.d.ts +1 -0
  311. package/dist/plot/index.js +1 -0
  312. package/dist/plot/sankey/Sankey.svelte +78 -69
  313. package/dist/plot/sankey/Sankey.svelte.d.ts +2 -2
  314. package/dist/plot/sankey/SankeyControls.svelte +22 -16
  315. package/dist/plot/sankey/sankey.js +13 -9
  316. package/dist/plot/scatter/BinnedScatterPlot.svelte +311 -141
  317. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +7 -0
  318. package/dist/plot/scatter/ElementScatter.svelte +4 -1
  319. package/dist/plot/scatter/ScatterPlot.svelte +517 -410
  320. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +2 -0
  321. package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
  322. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  323. package/dist/plot/scatter/ScatterPoint.svelte +16 -9
  324. package/dist/plot/scatter/adaptive-density.d.ts +1 -1
  325. package/dist/plot/scatter/adaptive-density.js +36 -20
  326. package/dist/plot/scatter/binned-scatter-types.d.ts +3 -2
  327. package/dist/plot/scatter/binned-scatter-types.js +6 -1
  328. package/dist/plot/scatter/scatter-data.d.ts +1 -1
  329. package/dist/plot/scatter/scatter-data.js +8 -7
  330. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +25 -34
  331. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +2 -2
  332. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +8 -5
  333. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +113 -116
  334. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +2 -2
  335. package/dist/plot/scatter-3d/Surface3D.svelte +4 -13
  336. package/dist/plot/sunburst/Sunburst.svelte +269 -347
  337. package/dist/plot/sunburst/Sunburst.svelte.d.ts +2 -2
  338. package/dist/plot/sunburst/index.d.ts +1 -1
  339. package/dist/plot/sunburst/index.js +2 -1
  340. package/dist/plot/sunburst/render.d.ts +2 -2
  341. package/dist/plot/sunburst/render.js +47 -22
  342. package/dist/plot/sunburst/sunburst.d.ts +5 -1
  343. package/dist/plot/sunburst/sunburst.js +10 -3
  344. package/dist/plot/treemap/Treemap.svelte +1022 -0
  345. package/dist/plot/treemap/Treemap.svelte.d.ts +90 -0
  346. package/dist/plot/treemap/index.d.ts +4 -0
  347. package/dist/plot/treemap/index.js +4 -0
  348. package/dist/plot/treemap/labels.d.ts +38 -0
  349. package/dist/plot/treemap/labels.js +80 -0
  350. package/dist/plot/treemap/treemap.d.ts +28 -0
  351. package/dist/plot/treemap/treemap.js +102 -0
  352. package/dist/rdf/RdfPlot.svelte +37 -59
  353. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  354. package/dist/rdf/calc-rdf.js +63 -52
  355. package/dist/rdf/index.d.ts +0 -1
  356. package/dist/sanitize.js +85 -27
  357. package/dist/scene/SceneCamera.svelte +1 -1
  358. package/dist/scene/SceneCamera.svelte.d.ts +1 -1
  359. package/dist/scene/bind-renderer.svelte.js +14 -6
  360. package/dist/scene/index.d.ts +1 -2
  361. package/dist/scene/index.js +1 -1
  362. package/dist/scene/{props.js → props.svelte.js} +15 -1
  363. package/dist/settings.d.ts +19 -9
  364. package/dist/settings.js +229 -525
  365. package/dist/spectral/Bands.svelte +207 -221
  366. package/dist/spectral/BandsAndDos.svelte +11 -9
  367. package/dist/spectral/BrillouinBandsDos.svelte +19 -42
  368. package/dist/spectral/Dos.svelte +92 -93
  369. package/dist/spectral/helpers.d.ts +3 -3
  370. package/dist/spectral/helpers.js +65 -140
  371. package/dist/state.svelte.js +5 -18
  372. package/dist/structure/Arrow.svelte +5 -18
  373. package/dist/structure/ArrowInstances.svelte +160 -0
  374. package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
  375. package/dist/structure/AtomLegend.svelte +120 -85
  376. package/dist/structure/AtomLegend.svelte.d.ts +2 -3
  377. package/dist/structure/Bond.svelte +31 -23
  378. package/dist/structure/CanvasTooltip.svelte +15 -3
  379. package/dist/structure/CellSelect.svelte +45 -35
  380. package/dist/structure/Cylinder.svelte +24 -40
  381. package/dist/structure/InstancedAtoms.svelte +114 -0
  382. package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
  383. package/dist/structure/Lattice.svelte +85 -149
  384. package/dist/structure/SiteLabels.svelte +122 -0
  385. package/dist/structure/SiteLabels.svelte.d.ts +18 -0
  386. package/dist/structure/Structure.svelte +636 -504
  387. package/dist/structure/Structure.svelte.d.ts +4 -2
  388. package/dist/structure/StructureCarousel.svelte +637 -0
  389. package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
  390. package/dist/structure/StructureControls.svelte +165 -425
  391. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  392. package/dist/structure/StructureExportPane.svelte +17 -21
  393. package/dist/structure/StructureInfoPane.svelte +128 -133
  394. package/dist/structure/StructureInfoPane.svelte.d.ts +1 -1
  395. package/dist/structure/StructureScene.svelte +535 -578
  396. package/dist/structure/StructureScene.svelte.d.ts +6 -2
  397. package/dist/structure/StructureViewport.svelte +451 -0
  398. package/dist/structure/StructureViewport.svelte.d.ts +65 -0
  399. package/dist/structure/atom-label-placement.d.ts +16 -12
  400. package/dist/structure/atom-label-placement.js +70 -37
  401. package/dist/structure/atom-properties.d.ts +2 -0
  402. package/dist/structure/atom-properties.js +105 -38
  403. package/dist/structure/bond-order-perception.js +3 -8
  404. package/dist/structure/bonding.d.ts +9 -3
  405. package/dist/structure/bonding.js +95 -46
  406. package/dist/structure/edit-history.d.ts +6 -0
  407. package/dist/structure/edit-history.js +27 -0
  408. package/dist/structure/export.d.ts +1 -0
  409. package/dist/structure/export.js +89 -105
  410. package/dist/structure/format-detect.d.ts +1 -0
  411. package/dist/structure/format-detect.js +20 -0
  412. package/dist/structure/geometry.d.ts +9 -0
  413. package/dist/structure/geometry.js +27 -0
  414. package/dist/structure/index.d.ts +16 -1
  415. package/dist/structure/index.js +15 -10
  416. package/dist/structure/measure.d.ts +1 -1
  417. package/dist/structure/measure.js +6 -12
  418. package/dist/structure/parse.d.ts +2 -1
  419. package/dist/structure/parse.js +272 -313
  420. package/dist/structure/partial-occupancy.js +10 -5
  421. package/dist/structure/pbc.js +85 -107
  422. package/dist/structure/polyhedra.d.ts +0 -1
  423. package/dist/structure/polyhedra.js +7 -21
  424. package/dist/structure/prop-groups.d.ts +85 -0
  425. package/dist/structure/prop-groups.js +18 -0
  426. package/dist/structure/supercell.d.ts +1 -2
  427. package/dist/structure/supercell.js +7 -13
  428. package/dist/symmetry/SymmetryElements.svelte +11 -15
  429. package/dist/symmetry/SymmetryStats.svelte +55 -71
  430. package/dist/symmetry/WyckoffTable.svelte +10 -28
  431. package/dist/symmetry/cell-transform.js +6 -14
  432. package/dist/symmetry/index.d.ts +1 -0
  433. package/dist/symmetry/index.js +13 -10
  434. package/dist/symmetry/spacegroups.js +3 -2
  435. package/dist/table/HeatmapTable.svelte +1142 -447
  436. package/dist/table/HeatmapTable.svelte.d.ts +12 -2
  437. package/dist/table/ToggleMenu.svelte +168 -53
  438. package/dist/table/ToggleMenu.svelte.d.ts +1 -1
  439. package/dist/table/index.d.ts +21 -6
  440. package/dist/table/index.js +34 -21
  441. package/dist/theme/ThemeControl.svelte +16 -8
  442. package/dist/theme/embedded.d.ts +18 -0
  443. package/dist/theme/embedded.js +206 -0
  444. package/dist/theme/index.d.ts +5 -5
  445. package/dist/theme/index.js +5 -12
  446. package/dist/theme/themes.mjs +44 -66
  447. package/dist/tooltip/KCoords.svelte +4 -1
  448. package/dist/tooltip/TooltipContent.svelte +3 -6
  449. package/dist/tooltip/TooltipContent.svelte.d.ts +1 -1
  450. package/dist/tooltip/index.d.ts +8 -1
  451. package/dist/trajectory/Trajectory.svelte +613 -386
  452. package/dist/trajectory/Trajectory.svelte.d.ts +1 -1
  453. package/dist/trajectory/TrajectoryError.svelte +12 -74
  454. package/dist/trajectory/TrajectoryExportPane.svelte +14 -32
  455. package/dist/trajectory/TrajectoryInfoPane.svelte +127 -164
  456. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +2 -1
  457. package/dist/trajectory/extract.js +61 -49
  458. package/dist/trajectory/format-detect.d.ts +2 -0
  459. package/dist/trajectory/format-detect.js +17 -13
  460. package/dist/trajectory/frame-reader.d.ts +2 -0
  461. package/dist/trajectory/frame-reader.js +35 -32
  462. package/dist/trajectory/helpers.d.ts +2 -0
  463. package/dist/trajectory/helpers.js +34 -56
  464. package/dist/trajectory/index.d.ts +1 -0
  465. package/dist/trajectory/index.js +5 -8
  466. package/dist/trajectory/parse/ase.js +1 -1
  467. package/dist/trajectory/parse/h5-utils.d.ts +13 -0
  468. package/dist/trajectory/parse/h5-utils.js +109 -0
  469. package/dist/trajectory/parse/hdf5.d.ts +1 -1
  470. package/dist/trajectory/parse/hdf5.js +116 -106
  471. package/dist/trajectory/parse/index.d.ts +6 -6
  472. package/dist/trajectory/parse/index.js +25 -33
  473. package/dist/trajectory/parse/lammps.js +8 -12
  474. package/dist/trajectory/parse/vasp.js +10 -7
  475. package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
  476. package/dist/trajectory/parse/vaspout-electronic.js +207 -0
  477. package/dist/trajectory/parse/vaspout-h5.d.ts +4 -0
  478. package/dist/trajectory/parse/vaspout-h5.js +281 -0
  479. package/dist/trajectory/parse/xyz.js +59 -9
  480. package/dist/trajectory/plotting.d.ts +8 -9
  481. package/dist/trajectory/plotting.js +113 -64
  482. package/dist/utils.d.ts +3 -0
  483. package/dist/utils.js +7 -0
  484. package/dist/xrd/XrdPlot.svelte +79 -118
  485. package/dist/xrd/broadening.js +2 -1
  486. package/dist/xrd/calc-xrd.js +24 -62
  487. package/dist/xrd/parse.d.ts +0 -1
  488. package/dist/xrd/parse.js +69 -95
  489. package/package.json +94 -34
  490. package/readme.md +6 -5
  491. package/dist/api/mp.d.ts +0 -6
  492. package/dist/api/mp.js +0 -22
  493. package/dist/plot/sunburst/SunburstControls.svelte +0 -200
  494. package/dist/scene/types.d.ts +0 -26
  495. package/dist/tooltip/types.d.ts +0 -8
  496. package/dist/trajectory/constants.d.ts +0 -6
  497. package/dist/trajectory/constants.js +0 -11
  498. /package/dist/{scene/types.js → file-viewer/host-protocol.js} +0 -0
  499. /package/dist/{tooltip/types.js → isosurface/geometry-worker-types.js} +0 -0
@@ -1,4 +1,4 @@
1
- import type { CellSnippet, ExportData, InitialSort, Label, Pagination, RowData, Search, SortHint, SpecialCells } from './';
1
+ import type { CellSnippet, ExportData, InitialSort, Label, Pagination, VirtualScroll, RowData, Search, SortHint, SpecialCells } from './';
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLAttributes } from 'svelte/elements';
4
4
  type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
@@ -17,14 +17,24 @@ type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
17
17
  default_num_format?: string;
18
18
  show_heatmap?: boolean;
19
19
  heatmap_class?: string;
20
+ onrowpointerdown?: (event: PointerEvent, row: RowData) => void;
20
21
  onrowclick?: (event: MouseEvent | KeyboardEvent, row: RowData) => void;
21
22
  onrowdblclick?: (event: MouseEvent, row: RowData) => void;
23
+ row_title?: (row: RowData) => string | null | undefined;
22
24
  column_order?: string[];
23
25
  export_data?: ExportData;
24
26
  show_column_toggle?: boolean;
25
27
  search?: Search;
28
+ search_query?: string;
26
29
  show_row_select?: boolean;
27
30
  pagination?: Pagination;
31
+ virtual?: VirtualScroll;
32
+ on_visible_range?: (range: {
33
+ start: number;
34
+ end: number;
35
+ total: number;
36
+ }) => void;
37
+ controls_target?: HTMLElement | null;
28
38
  selected_rows?: RowData[];
29
39
  hidden_columns?: string[];
30
40
  scroll_style?: string;
@@ -44,6 +54,6 @@ type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
44
54
  }]>;
45
55
  footer?: Snippet;
46
56
  };
47
- declare const HeatmapTable: import("svelte").Component<$$ComponentProps, {}, "sort" | "data" | "show_controls" | "controls_open" | "loading" | "show_heatmap" | "column_order" | "selected_rows" | "hidden_columns" | "heatmap_opacity">;
57
+ declare const HeatmapTable: import("svelte").Component<$$ComponentProps, {}, "sort" | "show_controls" | "data" | "controls_open" | "loading" | "show_heatmap" | "column_order" | "search_query" | "selected_rows" | "hidden_columns" | "heatmap_opacity">;
48
58
  type HeatmapTable = ReturnType<typeof HeatmapTable>;
49
59
  export default HeatmapTable;
@@ -1,7 +1,8 @@
1
1
  <script lang="ts">
2
2
  import Icon from '../Icon.svelte'
3
+ import { portal } from '../overlays/portal'
3
4
  import { sanitize_html } from '../sanitize'
4
- import type { Label } from './'
5
+ import { type Label, strip_html } from './'
5
6
  import { click_outside, tooltip } from 'svelte-multiselect/attachments'
6
7
  import { slide } from 'svelte/transition'
7
8
 
@@ -14,7 +15,7 @@
14
15
  }: {
15
16
  columns: Label[]
16
17
  column_panel_open?: boolean
17
- // Number of grid columns for toggle layout
18
+ // Maximum number of grid columns for toggle layout
18
19
  n_columns?: number
19
20
  collapsed_sections?: string[]
20
21
  // Called after reset with the section name (or undefined for global reset)
@@ -22,6 +23,24 @@
22
23
  } = $props()
23
24
 
24
25
  const col_id = (col: Label) => col.key ?? col.label
26
+ const toggle_menu_id = $props.id()
27
+ const dropdown_selector = `[data-toggle-menu-id="${toggle_menu_id}"]`
28
+ const COLUMN_FILTER_THRESHOLD = 20
29
+ const DEFAULT_MAX_MENU_COLUMNS = 3
30
+ const PREFERRED_MAX_MENU_ROWS = 10
31
+ let column_filter = $state(``)
32
+ let show_column_filter = $derived(columns.length > COLUMN_FILTER_THRESHOLD)
33
+ let normalized_column_filter = $derived(
34
+ show_column_filter ? column_filter.trim().toLowerCase() : ``,
35
+ )
36
+ const column_matches_filter = (col: Label): boolean =>
37
+ !normalized_column_filter ||
38
+ [col.key, strip_html(col.label), col.description, col.group]
39
+ .filter(Boolean)
40
+ .join(` `)
41
+ .toLowerCase()
42
+ .includes(normalized_column_filter)
43
+ let filtered_columns = $derived(columns.filter(column_matches_filter))
25
44
 
26
45
  // Snapshot default visibility when column set changes (new dataset).
27
46
  // Compare by keys and visibility defaults. Internal updates opt out below.
@@ -96,6 +115,14 @@
96
115
  if (ungrouped.length > 0) result.push({ name: ``, items: ungrouped })
97
116
  return result
98
117
  })
118
+ let filtered_sections = $derived(
119
+ sections
120
+ .map((section) => ({
121
+ ...section,
122
+ items: section.items.filter(column_matches_filter),
123
+ }))
124
+ .filter((section) => section.items.length > 0),
125
+ )
99
126
 
100
127
  // Check if any column defines a group (to decide whether to show sections)
101
128
  let has_sections = $derived(columns.some((col) => col.group))
@@ -113,35 +140,56 @@
113
140
  columns = [...columns] // trigger reactivity on parent binding
114
141
  }
115
142
 
116
- // Grid template for section items
117
- let grid_template = $derived(
118
- n_columns
119
- ? `repeat(${n_columns}, max-content)`
120
- : `repeat(auto-fill, minmax(135px, 1fr))`,
121
- )
143
+ // Prefer two tall columns, adding more only when the item count would make them unwieldy.
144
+ // n_columns caps large menus rather than forcing sparse menus to fill every column.
145
+ const grid_column_count = (item_count: number): number => {
146
+ const preferred_column_count =
147
+ item_count <= 1 ? 1 : Math.max(2, Math.ceil(item_count / PREFERRED_MAX_MENU_ROWS))
148
+ return Math.min(Math.max(1, n_columns ?? DEFAULT_MAX_MENU_COLUMNS), preferred_column_count)
149
+ }
150
+ const grid_template = (item_count: number): string =>
151
+ `repeat(${grid_column_count(item_count)}, max-content)`
122
152
 
123
- // Reposition dropdown: left-aligned by default, switch to right if it overflows viewport
124
- let details_el: HTMLElement | undefined = undefined
153
+ // Portal the dropdown to <body> so ancestor overflow/stacking contexts cannot clip it.
154
+ const dropdown_target = typeof document === `undefined` ? undefined : document.body
155
+ let details_el = $state<HTMLElement>()
156
+ let dropdown_el = $state<HTMLElement>()
157
+ const position_dropdown = (): void => {
158
+ const trigger = details_el?.querySelector(`summary`)
159
+ if (!column_panel_open || !trigger || !dropdown_el) return
160
+ const trigger_rect = trigger.getBoundingClientRect()
161
+ const dropdown_rect = dropdown_el.getBoundingClientRect()
162
+ const viewport_padding = 8
163
+ const gap = 4
164
+ const max_left = Math.max(
165
+ viewport_padding,
166
+ globalThis.innerWidth - dropdown_rect.width - viewport_padding,
167
+ )
168
+ const left = Math.min(
169
+ Math.max(viewport_padding, trigger_rect.right - dropdown_rect.width),
170
+ max_left,
171
+ )
172
+ const below = trigger_rect.bottom + gap
173
+ const top =
174
+ below + dropdown_rect.height <= globalThis.innerHeight - viewport_padding
175
+ ? below
176
+ : Math.max(viewport_padding, trigger_rect.top - dropdown_rect.height - gap)
177
+ Object.assign(dropdown_el.style, {
178
+ left: `${left}px`,
179
+ right: `auto`,
180
+ top: `${top}px`,
181
+ visibility: `visible`,
182
+ })
183
+ }
125
184
  $effect(() => {
126
- if (!column_panel_open || !details_el) return
185
+ if (!column_panel_open || !details_el || !dropdown_el) return
127
186
  // Re-run when section state changes while open
128
187
  void n_columns
129
188
  void collapsed_sections
130
- void sections
131
- const dropdown = details_el.querySelector<HTMLElement>(
132
- `.column-menu, .sections-container`,
133
- )
134
- if (!dropdown) return
135
- // Reset to left-aligned
136
- dropdown.style.left = `0`
137
- dropdown.style.right = `auto`
138
- requestAnimationFrame(() => {
139
- const rect = dropdown.getBoundingClientRect()
140
- if (rect.right > window.innerWidth) {
141
- dropdown.style.left = `auto`
142
- dropdown.style.right = `0`
143
- }
144
- })
189
+ void filtered_columns
190
+ void filtered_sections
191
+ const frame = requestAnimationFrame(position_dropdown)
192
+ return () => cancelAnimationFrame(frame)
145
193
  })
146
194
  </script>
147
195
 
@@ -173,10 +221,19 @@
173
221
  <details
174
222
  class="column-toggles"
175
223
  bind:this={details_el}
176
- bind:open={column_panel_open}
177
- {@attach click_outside({ callback: () => (column_panel_open = false) })}
224
+ open={column_panel_open}
225
+ {@attach click_outside({
226
+ callback: () => (column_panel_open = false),
227
+ exclude: [dropdown_selector],
228
+ })}
178
229
  >
179
- <summary aria-expanded={column_panel_open}>
230
+ <summary
231
+ aria-expanded={column_panel_open}
232
+ onclick={(event) => {
233
+ event.preventDefault()
234
+ column_panel_open = !column_panel_open
235
+ }}
236
+ >
180
237
  Columns <Icon icon="Columns" />
181
238
  {#if has_any_changes}
182
239
  <button
@@ -195,11 +252,32 @@
195
252
  {/if}
196
253
  </summary>
197
254
 
198
- {#if has_sections}
199
- <div class="sections-container" role="group">
200
- {#each sections as section (section.name)}
201
- {@const is_collapsed = section.name !== `` &&
202
- collapsed_sections.includes(section.name)}
255
+ <div
256
+ bind:this={dropdown_el}
257
+ class={has_sections ? `sections-container` : `column-menu`}
258
+ data-toggle-menu-id={toggle_menu_id}
259
+ hidden={!column_panel_open}
260
+ role="group"
261
+ style:grid-template-columns={has_sections
262
+ ? undefined
263
+ : grid_template(filtered_columns.length)}
264
+ {@attach portal(dropdown_target)}
265
+ >
266
+ {#if show_column_filter}
267
+ <input
268
+ aria-label="Filter columns"
269
+ bind:value={column_filter}
270
+ class="column-filter"
271
+ placeholder="Filter columns…"
272
+ type="search"
273
+ />
274
+ {/if}
275
+ {#if has_sections}
276
+ {#each filtered_sections as section (section.name)}
277
+ {@const is_collapsed =
278
+ !normalized_column_filter &&
279
+ section.name !== `` &&
280
+ collapsed_sections.includes(section.name)}
203
281
  <div class="section">
204
282
  {#if section.name}
205
283
  <div class="section-header-row">
@@ -228,7 +306,7 @@
228
306
  {#if !is_collapsed}
229
307
  <div
230
308
  class="section-items"
231
- style:grid-template-columns={grid_template}
309
+ style:grid-template-columns={grid_template(section.items.length)}
232
310
  transition:slide={{ duration: 200 }}
233
311
  >
234
312
  {#each section.items as col, idx (col.key ?? col.label ?? idx)}
@@ -238,14 +316,15 @@
238
316
  {/if}
239
317
  </div>
240
318
  {/each}
241
- </div>
242
- {:else}
243
- <div class="column-menu" role="group" style:grid-template-columns={grid_template}>
244
- {#each columns as col, idx (col.key ?? col.label ?? idx)}
319
+ {:else}
320
+ {#each filtered_columns as col, idx (col.key ?? col.label ?? idx)}
245
321
  {@render toggle_item(col)}
246
322
  {/each}
247
- </div>
248
- {/if}
323
+ {/if}
324
+ {#if filtered_columns.length === 0}
325
+ <span class="no-matching-columns">No matching columns</span>
326
+ {/if}
327
+ </div>
249
328
  </details>
250
329
 
251
330
  <style>
@@ -272,9 +351,12 @@
272
351
  .column-menu,
273
352
  .sections-container {
274
353
  font-size: var(--tgl-font-size, 1.1em);
275
- position: absolute;
354
+ position: fixed;
276
355
  left: 0;
277
- top: calc(100% + 1pt);
356
+ top: 0;
357
+ visibility: hidden;
358
+ box-sizing: border-box;
359
+ width: max-content;
278
360
  background: var(--tgl-dropdown-bg, var(--page-bg));
279
361
  border: 1px solid
280
362
  var(--tgl-dropdown-border, color-mix(in srgb, currentColor 10%, transparent));
@@ -284,13 +366,18 @@
284
366
  0 4px 12px color-mix(in srgb, currentColor 8%, transparent)
285
367
  );
286
368
  min-width: 150px;
369
+ max-width: calc(100vw - 16px);
287
370
  max-height: var(--tgl-dropdown-max-height, min(70vh, 600px));
288
- overflow-y: auto;
289
- z-index: 1;
371
+ overflow: auto;
372
+ z-index: var(--tgl-dropdown-z-index, 10000);
373
+ }
374
+ .column-menu,
375
+ .section-items {
376
+ display: grid;
377
+ column-gap: var(--tgl-column-gap, 8px);
290
378
  }
291
379
  .column-menu {
292
380
  padding: 3pt 5pt;
293
- display: grid;
294
381
  }
295
382
  .sections-container {
296
383
  padding: 6pt 8pt;
@@ -298,6 +385,40 @@
298
385
  flex-direction: column;
299
386
  gap: 8px;
300
387
  }
388
+ .column-menu[hidden],
389
+ .sections-container[hidden] {
390
+ display: none;
391
+ }
392
+ .column-filter {
393
+ position: sticky;
394
+ z-index: 2;
395
+ top: 0;
396
+ grid-column: 1 / -1;
397
+ box-sizing: border-box;
398
+ width: 100%;
399
+ height: 1.35rem;
400
+ min-height: 0;
401
+ margin: 0 0 4px;
402
+ padding: 0 0.35rem;
403
+ border: 1px solid
404
+ var(--tgl-dropdown-border, color-mix(in srgb, currentColor 18%, transparent));
405
+ border-radius: var(--tgl-border-radius, 4pt);
406
+ outline: none;
407
+ background: var(--tgl-dropdown-bg, var(--page-bg));
408
+ color: inherit;
409
+ font: inherit;
410
+ font-size: 0.72rem;
411
+ line-height: 1.2;
412
+ &:focus {
413
+ border-color: var(--active-color, #6ea8ff);
414
+ }
415
+ }
416
+ .no-matching-columns {
417
+ grid-column: 1 / -1;
418
+ padding: 4px;
419
+ color: color-mix(in srgb, currentColor 65%, transparent);
420
+ font-size: 0.9em;
421
+ }
301
422
  .reset-btn {
302
423
  display: flex;
303
424
  align-items: center;
@@ -325,10 +446,7 @@
325
446
  margin-bottom: 4pt;
326
447
  padding: 2pt 4pt;
327
448
  border-radius: var(--tgl-border-radius, 3pt);
328
- background: var(
329
- --tgl-section-header-bg,
330
- color-mix(in srgb, currentColor 5%, transparent)
331
- );
449
+ background: var(--tgl-section-header-bg, color-mix(in srgb, currentColor 5%, transparent));
332
450
  &:hover {
333
451
  background: var(
334
452
  --tgl-section-header-hover-bg,
@@ -355,9 +473,6 @@
355
473
  width: 1em;
356
474
  flex-shrink: 0;
357
475
  }
358
- .section-items {
359
- display: grid;
360
- }
361
476
  .toggle-label {
362
477
  display: inline-block;
363
478
  margin: 1px 2px;
@@ -1,4 +1,4 @@
1
- import type { Label } from './';
1
+ import { type Label } from './';
2
2
  type $$ComponentProps = {
3
3
  columns: Label[];
4
4
  column_panel_open?: boolean;
@@ -1,19 +1,22 @@
1
- import * as d3sc from 'd3-scale-chromatic';
1
+ import type * as d3sc from 'd3-scale-chromatic';
2
2
  import type { Snippet } from 'svelte';
3
3
  export { default as HeatmapTable } from './HeatmapTable.svelte';
4
4
  export { default as ToggleMenu } from './ToggleMenu.svelte';
5
- export type CellVal = string | number | boolean | undefined | null | Record<string, unknown> | Record<string, string | number | null | undefined | boolean>[];
5
+ export type CellVal = string | number | boolean | Date | undefined | null | Record<string, unknown> | Record<string, string | number | null | undefined | boolean>[];
6
6
  export type RowData = {
7
7
  style?: string;
8
8
  class?: string;
9
9
  [key: string]: CellVal;
10
10
  };
11
+ export type DateTimeFormatMode = `date` | `time` | `datetime` | `iso` | `relative`;
11
12
  export type Label = {
12
13
  label: string;
13
14
  key?: string;
14
15
  group?: string;
15
16
  description?: string;
16
17
  format?: string;
18
+ format_type?: `datetime`;
19
+ datetime_format?: DateTimeFormatMode;
17
20
  better?: `higher` | `lower`;
18
21
  color_scale?: keyof typeof d3sc | null;
19
22
  scale_type?: `linear` | `log`;
@@ -51,10 +54,17 @@ export type InitialSort = string | {
51
54
  export type Pagination = boolean | {
52
55
  page_size?: number;
53
56
  page_sizes?: number[];
57
+ on_page_size_change?: (page_size: number) => void;
58
+ };
59
+ export type VirtualScroll = boolean | {
60
+ overscan?: number;
61
+ min_window?: number;
54
62
  };
55
63
  export type Search = boolean | {
56
64
  placeholder?: string;
57
65
  expanded?: boolean;
66
+ keys?: string[];
67
+ fuzzy?: boolean;
58
68
  };
59
69
  export type ExportData = boolean | {
60
70
  formats?: (`csv` | `json`)[];
@@ -62,11 +72,16 @@ export type ExportData = boolean | {
62
72
  };
63
73
  export type OnSortCallback = (column: string, dir: `asc` | `desc`) => Promise<RowData[]>;
64
74
  export declare const strip_html: (str: string) => string;
75
+ export type CellColor = {
76
+ bg: string | null;
77
+ text: string | null;
78
+ };
79
+ export declare function make_cell_color_scale(all_values: CellVal[], // all values in the column
80
+ better: `higher` | `lower` | undefined, // sort direction
81
+ color_scale?: keyof typeof d3sc | null, // color scale name
82
+ scale_type?: `linear` | `log`): (val: number | null | undefined) => CellColor;
65
83
  export declare function calc_cell_color(val: number | null | undefined, // cell value
66
84
  all_values: CellVal[], // all values in the column
67
85
  better: `higher` | `lower` | undefined, // sort direction
68
86
  color_scale?: keyof typeof d3sc | null, // color scale name
69
- scale_type?: `linear` | `log`): {
70
- bg: string | null;
71
- text: string | null;
72
- };
87
+ scale_type?: `linear` | `log`): CellColor;
@@ -1,38 +1,51 @@
1
- import { pick_contrast_color } from '../colors';
1
+ import { get_d3_interpolator, pick_contrast_color } from '../colors';
2
2
  import { max, min } from 'd3-array';
3
3
  import { scaleLog, scaleSequential } from 'd3-scale';
4
- import * as d3sc from 'd3-scale-chromatic';
5
4
  export { default as HeatmapTable } from './HeatmapTable.svelte';
6
5
  export { default as ToggleMenu } from './ToggleMenu.svelte';
7
6
  // Strip HTML tags from a string (for search, export, etc.)
8
7
  export const strip_html = (str) => str.replaceAll(/<[^>]*>/g, ``);
9
- // Calculate table cell background color based on its value and column config
10
- export function calc_cell_color(val, // cell value
11
- all_values, // all values in the column
8
+ const NULL_CELL_COLOR = { bg: null, text: null };
9
+ // Build a memoized value→color mapper for one column. The O(column-length)
10
+ // work (numeric filter + min/max) and d3 scale construction happen ONCE here;
11
+ // the returned function is O(1) per cell. HeatmapTable derives one mapper per
12
+ // colored column instead of rescanning the full column for every cell render.
13
+ export function make_cell_color_scale(all_values, // all values in the column
12
14
  better, // sort direction
13
15
  color_scale = `interpolateViridis`, // color scale name
14
16
  scale_type = `linear`) {
15
- // Skip color calculation for null/undefined/NaN values or if color_scale is null
16
- if (val == null || Number.isNaN(val) || color_scale === null) {
17
- return { bg: null, text: null };
18
- }
19
- // Log scale cannot handle non-positive values, return null colors
20
- if (scale_type === `log` && val <= 0) {
21
- return { bg: null, text: null };
22
- }
17
+ if (color_scale === null)
18
+ return () => NULL_CELL_COLOR;
23
19
  const numeric_vals = all_values.filter((v) => typeof v === `number` && !Number.isNaN(v) && (scale_type === `log` ? v > 0 : true));
24
20
  if (numeric_vals.length === 0)
25
- return { bg: null, text: null };
21
+ return () => NULL_CELL_COLOR;
26
22
  const range = [min(numeric_vals) ?? 0, max(numeric_vals) ?? 1];
27
23
  // Reverse the range if lower values are better
28
24
  if (better === `lower`)
29
25
  range.reverse();
30
- // Get interpolator function, fallback to viridis if not a valid function
31
- const scale_fn = d3sc[color_scale];
32
- const interpolator = (typeof scale_fn === `function` ? scale_fn : d3sc.interpolateViridis);
26
+ const interpolator = get_d3_interpolator(color_scale);
33
27
  // Use log scale for positive values, otherwise linear/sequential scale
34
- const bg = scale_type === `log` && range[0] > 0 && range[1] > 0
35
- ? interpolator(scaleLog().domain(range).range([0, 1]).clamp(true)(val))
36
- : scaleSequential().domain(range).interpolator(interpolator)(val);
37
- return { bg, text: pick_contrast_color({ bg_color: bg }) };
28
+ const use_log = scale_type === `log` && range[0] > 0 && range[1] > 0;
29
+ const log_scale = use_log ? scaleLog().domain(range).range([0, 1]).clamp(true) : null;
30
+ const seq_scale = scaleSequential().domain(range).interpolator(interpolator);
31
+ return (val) => {
32
+ // Skip color calculation for null/undefined/NaN values
33
+ if (val == null || Number.isNaN(val))
34
+ return NULL_CELL_COLOR;
35
+ // Log scale cannot handle non-positive values, return null colors
36
+ if (scale_type === `log` && val <= 0)
37
+ return NULL_CELL_COLOR;
38
+ const bg = log_scale ? interpolator(log_scale(val)) : seq_scale(val);
39
+ return { bg, text: pick_contrast_color({ bg_color: bg }) };
40
+ };
41
+ }
42
+ // Calculate table cell background color based on its value and column config.
43
+ // One-shot convenience wrapper around make_cell_color_scale — prefer the
44
+ // factory when coloring many cells of the same column.
45
+ export function calc_cell_color(val, // cell value
46
+ all_values, // all values in the column
47
+ better, // sort direction
48
+ color_scale = `interpolateViridis`, // color scale name
49
+ scale_type = `linear`) {
50
+ return make_cell_color_scale(all_values, better, color_scale, scale_type)(val);
38
51
  }
@@ -4,14 +4,17 @@
4
4
  import type { ThemeMode } from './index'
5
5
  import { apply_theme_to_dom, save_theme_preference, THEME_OPTIONS } from './index'
6
6
 
7
- let { theme_mode = $bindable(theme_state.mode), onchange = () => {}, ...rest }:
8
- & Omit<HTMLAttributes<HTMLSelectElement>, `onchange`>
9
- & {
10
- theme_mode?: ThemeMode // Current theme mode (now bindable to global state)
11
- onchange?: (mode: ThemeMode) => void // Callback when theme changes
12
- } = $props()
7
+ let {
8
+ theme_mode = $bindable(theme_state.mode),
9
+ onchange = () => {},
10
+ ...rest
11
+ }: Omit<HTMLAttributes<HTMLSelectElement>, `onchange`> & {
12
+ theme_mode?: ThemeMode // Current theme mode (now bindable to global state)
13
+ onchange?: (mode: ThemeMode) => void // Callback when theme changes
14
+ } = $props()
13
15
 
14
- $effect(() => { // Sync and save to local storage when theme changes
16
+ $effect(() => {
17
+ // Sync and save to local storage when theme changes
15
18
  const prev = theme_state.mode
16
19
  if (prev === theme_mode) return
17
20
  theme_state.mode = theme_mode
@@ -21,7 +24,12 @@
21
24
  })
22
25
  </script>
23
26
 
24
- <select bind:value={theme_mode} {...rest} class="theme-control {rest.class ?? ``}">
27
+ <select
28
+ aria-label="Color theme"
29
+ bind:value={theme_mode}
30
+ {...rest}
31
+ class={[`theme-control`, rest.class]}
32
+ >
25
33
  {#each THEME_OPTIONS as { label, icon, value } (value)}
26
34
  <option {value}>{icon}&ensp;{label}</option>
27
35
  {/each}
@@ -0,0 +1,18 @@
1
+ import { type ThemeType } from './';
2
+ import './themes.mjs';
3
+ declare global {
4
+ var jupyterlab: {
5
+ application?: {
6
+ shell?: {
7
+ dataset?: {
8
+ theme?: string;
9
+ };
10
+ };
11
+ };
12
+ } | undefined;
13
+ }
14
+ type ThemeCallback = (theme_type: ThemeType) => void;
15
+ export declare function detect_parent_theme(target_element?: HTMLElement): ThemeType;
16
+ export declare function watch_theme(target_element: HTMLElement, callback: ThemeCallback): () => void;
17
+ export declare function get_theme_css(theme_type: ThemeType, is_shadow_dom?: boolean): string;
18
+ export {};