matterviz 0.3.0 → 0.3.2

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 (286) hide show
  1. package/dist/FilePicker.svelte +37 -20
  2. package/dist/Icon.svelte +2 -2
  3. package/dist/MillerIndexInput.svelte +60 -0
  4. package/dist/MillerIndexInput.svelte.d.ts +7 -0
  5. package/dist/app.css +38 -2
  6. package/dist/brillouin/BrillouinZone.svelte +20 -62
  7. package/dist/brillouin/BrillouinZone.svelte.d.ts +1 -1
  8. package/dist/brillouin/BrillouinZoneExportPane.svelte +12 -20
  9. package/dist/brillouin/BrillouinZoneScene.svelte +2 -2
  10. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  11. package/dist/chempot-diagram/ChemPotDiagram.svelte +192 -0
  12. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +13 -0
  13. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +677 -0
  14. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +16 -0
  15. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +2688 -0
  16. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +16 -0
  17. package/dist/chempot-diagram/ChemPotScene3D.svelte +8 -0
  18. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +7 -0
  19. package/dist/chempot-diagram/color.d.ts +10 -0
  20. package/dist/chempot-diagram/color.js +33 -0
  21. package/dist/chempot-diagram/compute.d.ts +38 -0
  22. package/dist/chempot-diagram/compute.js +650 -0
  23. package/dist/chempot-diagram/index.d.ts +5 -0
  24. package/dist/chempot-diagram/index.js +5 -0
  25. package/dist/chempot-diagram/pointer.d.ts +16 -0
  26. package/dist/chempot-diagram/pointer.js +40 -0
  27. package/dist/chempot-diagram/temperature.d.ts +15 -0
  28. package/dist/chempot-diagram/temperature.js +37 -0
  29. package/dist/chempot-diagram/types.d.ts +83 -0
  30. package/dist/chempot-diagram/types.js +27 -0
  31. package/dist/colors/index.d.ts +3 -1
  32. package/dist/colors/index.js +4 -0
  33. package/dist/composition/BarChart.svelte +13 -22
  34. package/dist/composition/BubbleChart.svelte +5 -3
  35. package/dist/composition/FormulaFilter.svelte +770 -90
  36. package/dist/composition/FormulaFilter.svelte.d.ts +37 -1
  37. package/dist/composition/PieChart.svelte +43 -18
  38. package/dist/composition/PieChart.svelte.d.ts +1 -1
  39. package/dist/constants.d.ts +1 -0
  40. package/dist/constants.js +2 -0
  41. package/dist/convex-hull/ConvexHull.svelte +14 -1
  42. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
  43. package/dist/convex-hull/ConvexHull2D.svelte +14 -45
  44. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  45. package/dist/convex-hull/ConvexHull3D.svelte +396 -134
  46. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  47. package/dist/convex-hull/ConvexHull4D.svelte +93 -42
  48. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  49. package/dist/convex-hull/ConvexHullControls.svelte +94 -31
  50. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +4 -2
  51. package/dist/convex-hull/ConvexHullStats.svelte +697 -128
  52. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +6 -1
  53. package/dist/convex-hull/ConvexHullTooltip.svelte +1 -0
  54. package/dist/convex-hull/GasPressureControls.svelte +72 -38
  55. package/dist/convex-hull/GasPressureControls.svelte.d.ts +2 -1
  56. package/dist/convex-hull/TemperatureSlider.svelte +46 -19
  57. package/dist/convex-hull/TemperatureSlider.svelte.d.ts +2 -1
  58. package/dist/convex-hull/demo-temperature.d.ts +6 -0
  59. package/dist/convex-hull/demo-temperature.js +36 -0
  60. package/dist/convex-hull/gas-thermodynamics.js +16 -5
  61. package/dist/convex-hull/helpers.d.ts +7 -1
  62. package/dist/convex-hull/helpers.js +45 -15
  63. package/dist/convex-hull/index.d.ts +15 -1
  64. package/dist/convex-hull/index.js +1 -0
  65. package/dist/convex-hull/thermodynamics.d.ts +8 -21
  66. package/dist/convex-hull/thermodynamics.js +106 -17
  67. package/dist/convex-hull/types.d.ts +7 -0
  68. package/dist/convex-hull/types.js +11 -0
  69. package/dist/coordination/CoordinationBarPlot.svelte +29 -46
  70. package/dist/element/BohrAtom.svelte +1 -1
  71. package/dist/element/data.js +2 -14
  72. package/dist/element/data.json.gz +0 -0
  73. package/dist/element/index.d.ts +1 -1
  74. package/dist/element/index.js +1 -0
  75. package/dist/element/types.d.ts +1 -0
  76. package/dist/fermi-surface/FermiSurface.svelte +21 -65
  77. package/dist/fermi-surface/FermiSurface.svelte.d.ts +1 -1
  78. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  79. package/dist/fermi-surface/FermiSurfaceScene.svelte +1 -1
  80. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  81. package/dist/fermi-surface/compute.js +1 -21
  82. package/dist/fermi-surface/marching-cubes.d.ts +2 -13
  83. package/dist/fermi-surface/marching-cubes.js +2 -519
  84. package/dist/fermi-surface/parse.js +17 -23
  85. package/dist/heatmap-matrix/HeatmapMatrix.svelte +1273 -0
  86. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +110 -0
  87. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +171 -0
  88. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +31 -0
  89. package/dist/heatmap-matrix/index.d.ts +53 -0
  90. package/dist/heatmap-matrix/index.js +100 -0
  91. package/dist/heatmap-matrix/shared.d.ts +2 -0
  92. package/dist/heatmap-matrix/shared.js +4 -0
  93. package/dist/icons.d.ts +119 -0
  94. package/dist/icons.js +119 -0
  95. package/dist/index.d.ts +6 -1
  96. package/dist/index.js +6 -1
  97. package/dist/io/export.js +15 -3
  98. package/dist/io/file-drop.d.ts +7 -0
  99. package/dist/io/file-drop.js +43 -0
  100. package/dist/io/index.d.ts +2 -2
  101. package/dist/io/index.js +2 -112
  102. package/dist/io/types.d.ts +1 -0
  103. package/dist/io/url-drop.d.ts +2 -0
  104. package/dist/io/url-drop.js +118 -0
  105. package/dist/isosurface/Isosurface.svelte +231 -0
  106. package/dist/isosurface/Isosurface.svelte.d.ts +8 -0
  107. package/dist/isosurface/IsosurfaceControls.svelte +273 -0
  108. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +9 -0
  109. package/dist/isosurface/index.d.ts +5 -0
  110. package/dist/isosurface/index.js +6 -0
  111. package/dist/isosurface/parse.d.ts +6 -0
  112. package/dist/isosurface/parse.js +548 -0
  113. package/dist/isosurface/slice.d.ts +11 -0
  114. package/dist/isosurface/slice.js +145 -0
  115. package/dist/isosurface/types.d.ts +55 -0
  116. package/dist/isosurface/types.js +178 -0
  117. package/dist/labels.d.ts +2 -1
  118. package/dist/labels.js +1 -0
  119. package/dist/layout/InfoTag.svelte +62 -62
  120. package/dist/layout/SubpageGrid.svelte +74 -0
  121. package/dist/layout/SubpageGrid.svelte.d.ts +14 -0
  122. package/dist/layout/index.d.ts +1 -0
  123. package/dist/layout/index.js +1 -0
  124. package/dist/layout/json-tree/JsonNode.svelte +226 -53
  125. package/dist/layout/json-tree/JsonTree.svelte +425 -51
  126. package/dist/layout/json-tree/JsonTree.svelte.d.ts +1 -1
  127. package/dist/layout/json-tree/JsonValue.svelte +218 -97
  128. package/dist/layout/json-tree/types.d.ts +27 -2
  129. package/dist/layout/json-tree/utils.d.ts +14 -1
  130. package/dist/layout/json-tree/utils.js +254 -0
  131. package/dist/marching-cubes.d.ts +14 -0
  132. package/dist/marching-cubes.js +519 -0
  133. package/dist/math.d.ts +8 -0
  134. package/dist/math.js +374 -7
  135. package/dist/overlays/ContextMenu.svelte +3 -2
  136. package/dist/overlays/DraggablePane.svelte +163 -58
  137. package/dist/overlays/DraggablePane.svelte.d.ts +2 -0
  138. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +232 -77
  139. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -2
  140. package/dist/phase-diagram/PhaseDiagramControls.svelte +32 -11
  141. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +3 -2
  142. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +103 -0
  143. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +15 -0
  144. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +102 -95
  145. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +7 -0
  146. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +100 -26
  147. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +6 -3
  148. package/dist/phase-diagram/index.d.ts +2 -0
  149. package/dist/phase-diagram/index.js +2 -0
  150. package/dist/phase-diagram/svg-to-diagram.d.ts +2 -0
  151. package/dist/phase-diagram/svg-to-diagram.js +865 -0
  152. package/dist/phase-diagram/types.d.ts +10 -0
  153. package/dist/phase-diagram/utils.d.ts +7 -4
  154. package/dist/phase-diagram/utils.js +149 -59
  155. package/dist/plot/AxisLabel.svelte +26 -0
  156. package/dist/plot/AxisLabel.svelte.d.ts +16 -0
  157. package/dist/plot/BarPlot.svelte +473 -228
  158. package/dist/plot/BarPlot.svelte.d.ts +3 -3
  159. package/dist/plot/BarPlotControls.svelte +3 -2
  160. package/dist/plot/BarPlotControls.svelte.d.ts +1 -1
  161. package/dist/plot/ColorBar.svelte +54 -54
  162. package/dist/plot/ColorBar.svelte.d.ts +1 -1
  163. package/dist/plot/ElementScatter.svelte +4 -3
  164. package/dist/plot/FillArea.svelte +4 -1
  165. package/dist/plot/Histogram.svelte +320 -230
  166. package/dist/plot/Histogram.svelte.d.ts +2 -2
  167. package/dist/plot/HistogramControls.svelte +29 -10
  168. package/dist/plot/HistogramControls.svelte.d.ts +6 -2
  169. package/dist/plot/InteractiveAxisLabel.svelte.d.ts +2 -2
  170. package/dist/plot/PlotControls.svelte +109 -27
  171. package/dist/plot/PlotControls.svelte.d.ts +1 -1
  172. package/dist/plot/PlotLegend.svelte +1 -1
  173. package/dist/plot/PortalSelect.svelte +2 -1
  174. package/dist/plot/ReferenceLine.svelte +2 -1
  175. package/dist/plot/ReferenceLine.svelte.d.ts +1 -0
  176. package/dist/plot/ReferencePlane.svelte +1 -3
  177. package/dist/plot/ScatterPlot.svelte +343 -209
  178. package/dist/plot/ScatterPlot.svelte.d.ts +3 -3
  179. package/dist/plot/ScatterPlot3D.svelte.d.ts +2 -2
  180. package/dist/plot/ScatterPlot3DControls.svelte +203 -250
  181. package/dist/plot/ScatterPlot3DScene.svelte +4 -7
  182. package/dist/plot/ScatterPlot3DScene.svelte.d.ts +2 -2
  183. package/dist/plot/ScatterPlotControls.svelte +95 -55
  184. package/dist/plot/ScatterPlotControls.svelte.d.ts +1 -1
  185. package/dist/plot/ZeroLines.svelte +44 -0
  186. package/dist/plot/ZeroLines.svelte.d.ts +32 -0
  187. package/dist/plot/ZoomRect.svelte +21 -0
  188. package/dist/plot/ZoomRect.svelte.d.ts +8 -0
  189. package/dist/plot/axis-utils.d.ts +1 -1
  190. package/dist/plot/data-cleaning.js +1 -5
  191. package/dist/plot/index.d.ts +6 -2
  192. package/dist/plot/index.js +6 -2
  193. package/dist/plot/interactions.d.ts +8 -10
  194. package/dist/plot/interactions.js +10 -19
  195. package/dist/plot/layout.d.ts +7 -1
  196. package/dist/plot/layout.js +12 -4
  197. package/dist/plot/reference-line.d.ts +4 -21
  198. package/dist/plot/reference-line.js +7 -81
  199. package/dist/plot/types.d.ts +42 -17
  200. package/dist/plot/types.js +10 -0
  201. package/dist/plot/utils/label-placement.js +14 -11
  202. package/dist/plot/utils.d.ts +1 -0
  203. package/dist/plot/utils.js +14 -0
  204. package/dist/rdf/RdfPlot.svelte +55 -66
  205. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  206. package/dist/rdf/index.d.ts +1 -1
  207. package/dist/rdf/index.js +1 -1
  208. package/dist/settings.d.ts +5 -0
  209. package/dist/settings.js +37 -3
  210. package/dist/spectral/Bands.svelte +515 -143
  211. package/dist/spectral/Bands.svelte.d.ts +22 -2
  212. package/dist/spectral/helpers.d.ts +23 -1
  213. package/dist/spectral/helpers.js +65 -9
  214. package/dist/spectral/types.d.ts +2 -0
  215. package/dist/structure/AtomLegend.svelte +31 -10
  216. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  217. package/dist/structure/CellSelect.svelte +92 -22
  218. package/dist/structure/Lattice.svelte +2 -0
  219. package/dist/structure/Structure.svelte +716 -173
  220. package/dist/structure/Structure.svelte.d.ts +7 -2
  221. package/dist/structure/StructureControls.svelte +26 -14
  222. package/dist/structure/StructureControls.svelte.d.ts +5 -1
  223. package/dist/structure/StructureInfoPane.svelte +7 -1
  224. package/dist/structure/StructureScene.svelte +386 -95
  225. package/dist/structure/StructureScene.svelte.d.ts +15 -4
  226. package/dist/structure/atom-properties.d.ts +6 -2
  227. package/dist/structure/atom-properties.js +38 -25
  228. package/dist/structure/export.js +10 -7
  229. package/dist/structure/ferrox-wasm-types.d.ts +3 -2
  230. package/dist/structure/ferrox-wasm-types.js +0 -3
  231. package/dist/structure/ferrox-wasm.d.ts +3 -2
  232. package/dist/structure/ferrox-wasm.js +1 -2
  233. package/dist/structure/index.d.ts +7 -0
  234. package/dist/structure/index.js +22 -0
  235. package/dist/structure/parse.js +19 -16
  236. package/dist/structure/partial-occupancy.d.ts +25 -0
  237. package/dist/structure/partial-occupancy.js +102 -0
  238. package/dist/structure/validation.js +6 -3
  239. package/dist/symmetry/SymmetryStats.svelte +18 -4
  240. package/dist/symmetry/WyckoffTable.svelte +18 -10
  241. package/dist/symmetry/index.d.ts +7 -4
  242. package/dist/symmetry/index.js +83 -18
  243. package/dist/table/HeatmapTable.svelte +468 -69
  244. package/dist/table/HeatmapTable.svelte.d.ts +13 -1
  245. package/dist/table/ToggleMenu.svelte +291 -44
  246. package/dist/table/ToggleMenu.svelte.d.ts +4 -1
  247. package/dist/table/index.d.ts +3 -0
  248. package/dist/tooltip/index.d.ts +1 -1
  249. package/dist/tooltip/index.js +1 -0
  250. package/dist/trajectory/Trajectory.svelte +147 -145
  251. package/dist/trajectory/TrajectoryExportPane.svelte +13 -9
  252. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +1 -1
  253. package/dist/trajectory/constants.d.ts +6 -0
  254. package/dist/trajectory/constants.js +7 -0
  255. package/dist/trajectory/extract.js +3 -5
  256. package/dist/trajectory/format-detect.d.ts +9 -0
  257. package/dist/trajectory/format-detect.js +76 -0
  258. package/dist/trajectory/frame-reader.d.ts +17 -0
  259. package/dist/trajectory/frame-reader.js +339 -0
  260. package/dist/trajectory/helpers.d.ts +15 -0
  261. package/dist/trajectory/helpers.js +187 -0
  262. package/dist/trajectory/index.d.ts +1 -0
  263. package/dist/trajectory/index.js +11 -4
  264. package/dist/trajectory/parse/ase.d.ts +2 -0
  265. package/dist/trajectory/parse/ase.js +76 -0
  266. package/dist/trajectory/parse/hdf5.d.ts +2 -0
  267. package/dist/trajectory/parse/hdf5.js +121 -0
  268. package/dist/trajectory/parse/index.d.ts +12 -0
  269. package/dist/trajectory/parse/index.js +304 -0
  270. package/dist/trajectory/parse/lammps.d.ts +5 -0
  271. package/dist/trajectory/parse/lammps.js +169 -0
  272. package/dist/trajectory/parse/vasp.d.ts +2 -0
  273. package/dist/trajectory/parse/vasp.js +65 -0
  274. package/dist/trajectory/parse/xyz.d.ts +2 -0
  275. package/dist/trajectory/parse/xyz.js +109 -0
  276. package/dist/trajectory/types.d.ts +11 -0
  277. package/dist/trajectory/types.js +1 -0
  278. package/dist/utils.d.ts +2 -0
  279. package/dist/utils.js +4 -0
  280. package/dist/xrd/XrdPlot.svelte +6 -4
  281. package/dist/xrd/calc-xrd.js +0 -1
  282. package/package.json +33 -23
  283. package/readme.md +4 -4
  284. package/dist/trajectory/parse.d.ts +0 -42
  285. package/dist/trajectory/parse.js +0 -1267
  286. /package/dist/element/{data.json.d.ts → data.json.gz.d.ts} +0 -0
@@ -17,6 +17,7 @@ type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
17
17
  default_num_format?: string;
18
18
  show_heatmap?: boolean;
19
19
  heatmap_class?: string;
20
+ onrowclick?: (event: MouseEvent | KeyboardEvent, row: RowData) => void;
20
21
  onrowdblclick?: (event: MouseEvent, row: RowData) => void;
21
22
  column_order?: string[];
22
23
  export_data?: ExportData;
@@ -27,11 +28,22 @@ type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
27
28
  selected_rows?: RowData[];
28
29
  hidden_columns?: string[];
29
30
  scroll_style?: string;
31
+ root_style?: string;
30
32
  onsort?: (column: string, dir: `asc` | `desc`) => Promise<RowData[]>;
31
33
  onsorterror?: (error: unknown, column: string, dir: `asc` | `desc`) => void;
32
34
  loading?: boolean;
33
35
  sort_data?: boolean;
36
+ heatmap_opacity?: number;
37
+ empty_message?: string;
38
+ show_row_numbers?: boolean;
39
+ allow_better_toggle?: boolean;
40
+ show_controls?: boolean;
41
+ controls_open?: boolean;
42
+ header_cell?: Snippet<[{
43
+ col: Label;
44
+ }]>;
45
+ footer?: Snippet;
34
46
  };
35
- declare const HeatmapTable: import("svelte").Component<$$ComponentProps, {}, "sort" | "data" | "loading" | "show_heatmap" | "column_order" | "selected_rows" | "hidden_columns">;
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">;
36
48
  type HeatmapTable = ReturnType<typeof HeatmapTable>;
37
49
  export default HeatmapTable;
@@ -1,12 +1,124 @@
1
1
  <script lang="ts">import Icon from '../Icon.svelte';
2
2
  import { click_outside, tooltip } from 'svelte-multiselect/attachments';
3
- let { columns = $bindable([]), column_panel_open = $bindable(false) } = $props();
4
- function toggle_column_visibility(idx, event) {
5
- columns[idx].visible = event.target.checked;
6
- columns = [...columns]; // needed to trigger reactivity
3
+ import { slide } from 'svelte/transition';
4
+ let { columns = $bindable([]), column_panel_open = $bindable(false), n_columns, collapsed_sections = $bindable([]), on_reset, } = $props();
5
+ const col_id = (col) => col.key ?? col.label;
6
+ // Snapshot default visibility when column set changes (new dataset).
7
+ // Compare by column keys to avoid re-snapshotting on internal columns = [...columns] reactivity.
8
+ // Intentionally non-reactive: mutated only inside snapshot_defaults() and compared manually.
9
+ let prev_col_keys = ``;
10
+ let default_visibility = {};
11
+ function snapshot_defaults() {
12
+ default_visibility = {};
13
+ for (const col of columns) {
14
+ default_visibility[col_id(col)] = col.visible !== false;
15
+ }
16
+ prev_col_keys = columns.map(col_id).join(`\0`);
17
+ }
18
+ snapshot_defaults();
19
+ $effect(() => {
20
+ const current_keys = columns.map(col_id).join(`\0`);
21
+ if (current_keys !== prev_col_keys) {
22
+ snapshot_defaults();
23
+ }
24
+ });
25
+ // Check if a column's visibility differs from its default
26
+ const is_changed = (col) => (col.visible !== false) !== (default_visibility[col_id(col)] ?? true);
27
+ let has_any_changes = $derived(columns.some(is_changed));
28
+ // Reset columns to default visibility
29
+ function reset_columns(items) {
30
+ for (const col of items) {
31
+ col.visible = default_visibility[col_id(col)] ?? true;
32
+ }
33
+ columns = [...columns];
34
+ }
35
+ function reset_all() {
36
+ reset_columns(columns);
37
+ on_reset?.();
38
+ }
39
+ function reset_section(section_name) {
40
+ const section = sections.find((sec) => sec.name === section_name);
41
+ if (!section)
42
+ return;
43
+ reset_columns(section.items);
44
+ on_reset?.(section_name);
7
45
  }
46
+ // Group columns by their group property
47
+ let sections = $derived.by(() => {
48
+ const grouped = {};
49
+ const ungrouped = [];
50
+ for (const col of columns) {
51
+ if (col.group) {
52
+ grouped[col.group] ??= [];
53
+ grouped[col.group].push(col);
54
+ }
55
+ else {
56
+ ungrouped.push(col);
57
+ }
58
+ }
59
+ const result = Object.entries(grouped).map(([name, items]) => ({ name, items }));
60
+ if (ungrouped.length > 0)
61
+ result.push({ name: ``, items: ungrouped });
62
+ return result;
63
+ });
64
+ // Check if any column defines a group (to decide whether to show sections)
65
+ let has_sections = $derived(columns.some((col) => col.group));
66
+ function toggle_section(name) {
67
+ collapsed_sections = collapsed_sections.includes(name)
68
+ ? collapsed_sections.filter((s) => s !== name)
69
+ : [...collapsed_sections, name];
70
+ }
71
+ function toggle_column_visibility(col, event) {
72
+ if (!(event.target instanceof HTMLInputElement))
73
+ return;
74
+ col.visible = event.target.checked;
75
+ columns = [...columns]; // trigger reactivity on parent binding
76
+ }
77
+ // Grid template for section items
78
+ let grid_template = $derived(n_columns
79
+ ? `repeat(${n_columns}, max-content)`
80
+ : `repeat(auto-fill, minmax(135px, 1fr))`);
81
+ // Reposition dropdown: left-aligned by default, switch to right if it overflows viewport
82
+ let details_el;
83
+ $effect(() => {
84
+ if (!column_panel_open || !details_el)
85
+ return;
86
+ // Re-run when section state changes while open
87
+ void n_columns;
88
+ void collapsed_sections;
89
+ void sections;
90
+ const dropdown = details_el.querySelector(`.column-menu, .sections-container`);
91
+ if (!dropdown)
92
+ return;
93
+ // Reset to left-aligned
94
+ dropdown.style.left = `0`;
95
+ dropdown.style.right = `auto`;
96
+ requestAnimationFrame(() => {
97
+ const rect = dropdown.getBoundingClientRect();
98
+ if (rect.right > window.innerWidth) {
99
+ dropdown.style.left = `auto`;
100
+ dropdown.style.right = `0`;
101
+ }
102
+ });
103
+ });
8
104
  </script>
9
105
 
106
+ {#snippet toggle_item(col: Label)}
107
+ <label
108
+ class="toggle-label"
109
+ class:disabled={col.disabled}
110
+ {@attach tooltip({ content: col.description })}
111
+ >
112
+ <input
113
+ type="checkbox"
114
+ checked={col.visible !== false}
115
+ disabled={col.disabled}
116
+ onchange={(event) => toggle_column_visibility(col, event)}
117
+ />
118
+ {@html col.label}
119
+ </label>
120
+ {/snippet}
121
+
10
122
  <svelte:window
11
123
  onkeydown={(event) => {
12
124
  if (event.key === `Escape` && column_panel_open) {
@@ -18,65 +130,193 @@ function toggle_column_visibility(idx, event) {
18
130
 
19
131
  <details
20
132
  class="column-toggles"
133
+ bind:this={details_el}
21
134
  bind:open={column_panel_open}
22
135
  {@attach click_outside({ callback: () => (column_panel_open = false) })}
23
136
  >
24
137
  <summary aria-expanded={column_panel_open}>
25
138
  Columns <Icon icon="Columns" />
26
- </summary>
27
- <div class="column-menu" role="menu">
28
- {#each columns as col, idx (col.key ?? col.label ?? idx)}
29
- <label
30
- class="toggle-label"
31
- title={col.description}
139
+ {#if has_any_changes}
140
+ <button
141
+ class="reset-btn"
142
+ onclick={(event) => {
143
+ event.stopPropagation()
144
+ event.preventDefault()
145
+ reset_all()
146
+ }}
147
+ type="button"
148
+ aria-label="Reset all columns to defaults"
32
149
  {@attach tooltip()}
33
150
  >
34
- <input
35
- type="checkbox"
36
- checked={col.visible !== false}
37
- onchange={(event) => toggle_column_visibility(idx, event)}
38
- />
39
- {@html col.label}
40
- </label>
41
- {/each}
42
- </div>
151
+ <Icon icon="Reset" width="12px" />
152
+ </button>
153
+ {/if}
154
+ </summary>
155
+
156
+ {#if has_sections}
157
+ <div class="sections-container" role="group">
158
+ {#each sections as section (section.name)}
159
+ {@const is_collapsed = section.name !== `` &&
160
+ collapsed_sections.includes(section.name)}
161
+ <div class="section">
162
+ {#if section.name}
163
+ <div class="section-header-row">
164
+ <button
165
+ class="section-header"
166
+ aria-expanded={!is_collapsed}
167
+ onclick={() => toggle_section(section.name)}
168
+ type="button"
169
+ >
170
+ <span class="collapse-icon">{is_collapsed ? `▶` : `▼`}</span>
171
+ {section.name}
172
+ </button>
173
+ {#if section.items.some(is_changed)}
174
+ <button
175
+ class="reset-btn"
176
+ onclick={() => reset_section(section.name)}
177
+ type="button"
178
+ aria-label="Reset {section.name} to defaults"
179
+ {@attach tooltip()}
180
+ >
181
+ <Icon icon="Reset" width="12px" />
182
+ </button>
183
+ {/if}
184
+ </div>
185
+ {/if}
186
+ {#if !is_collapsed}
187
+ <div
188
+ class="section-items"
189
+ style:grid-template-columns={grid_template}
190
+ transition:slide={{ duration: 200 }}
191
+ >
192
+ {#each section.items as col, idx (col.key ?? col.label ?? idx)}
193
+ {@render toggle_item(col)}
194
+ {/each}
195
+ </div>
196
+ {/if}
197
+ </div>
198
+ {/each}
199
+ </div>
200
+ {:else}
201
+ <div class="column-menu" role="group" style:grid-template-columns={grid_template}>
202
+ {#each columns as col, idx (col.key ?? col.label ?? idx)}
203
+ {@render toggle_item(col)}
204
+ {/each}
205
+ </div>
206
+ {/if}
43
207
  </details>
44
208
 
45
209
  <style>
46
210
  .column-toggles {
47
211
  position: relative;
212
+ summary {
213
+ background: var(--tgl-btn-bg, var(--btn-bg));
214
+ padding: 0 6pt;
215
+ margin: 4pt 0;
216
+ border-radius: var(--tgl-border-radius, 4pt);
217
+ cursor: pointer;
218
+ display: flex;
219
+ align-items: center;
220
+ gap: 4px;
221
+ &:hover {
222
+ background: var(--tgl-hover-bg, var(--nav-bg));
223
+ }
224
+ &::-webkit-details-marker {
225
+ display: none;
226
+ }
227
+ }
228
+ }
229
+ /* Shared dropdown styling */
230
+ .column-menu,
231
+ .sections-container {
232
+ font-size: var(--tgl-font-size, 1.1em);
233
+ position: absolute;
234
+ left: 0;
235
+ top: calc(100% + 1pt);
236
+ background: var(--tgl-dropdown-bg, var(--page-bg));
237
+ border: 1px solid
238
+ var(--tgl-dropdown-border, color-mix(in srgb, currentColor 10%, transparent));
239
+ border-radius: var(--tgl-border-radius, 4pt);
240
+ box-shadow: var(
241
+ --tgl-dropdown-shadow,
242
+ 0 4px 12px color-mix(in srgb, currentColor 8%, transparent)
243
+ );
244
+ min-width: 150px;
245
+ max-height: var(--tgl-dropdown-max-height, min(70vh, 600px));
246
+ overflow-y: auto;
247
+ z-index: 1;
248
+ }
249
+ .column-menu {
250
+ padding: 3pt 5pt;
251
+ display: grid;
48
252
  }
49
- .column-toggles summary {
50
- background: var(--btn-bg);
51
- padding: 0 6pt;
52
- margin: 4pt 0;
53
- border-radius: 4pt;
253
+ .sections-container {
254
+ padding: 6pt 8pt;
255
+ display: flex;
256
+ flex-direction: column;
257
+ gap: 8px;
258
+ }
259
+ .reset-btn {
260
+ display: flex;
261
+ align-items: center;
262
+ justify-content: center;
263
+ padding: 2pt;
264
+ border: none;
265
+ border-radius: var(--tgl-border-radius, 3pt);
266
+ background: transparent;
54
267
  cursor: pointer;
268
+ color: inherit;
269
+ opacity: 0.5;
270
+ flex-shrink: 0;
271
+ &:hover {
272
+ background: color-mix(in srgb, currentColor 12%, transparent);
273
+ opacity: 1;
274
+ }
275
+ }
276
+ summary .reset-btn {
277
+ margin-left: auto;
278
+ }
279
+ .section-header-row {
55
280
  display: flex;
56
281
  align-items: center;
57
282
  gap: 4px;
283
+ margin-bottom: 4pt;
284
+ padding: 2pt 4pt;
285
+ border-radius: var(--tgl-border-radius, 3pt);
286
+ background: var(
287
+ --tgl-section-header-bg,
288
+ color-mix(in srgb, currentColor 5%, transparent)
289
+ );
290
+ &:hover {
291
+ background: var(
292
+ --tgl-section-header-hover-bg,
293
+ color-mix(in srgb, currentColor 12%, transparent)
294
+ );
295
+ }
58
296
  }
59
- .column-toggles summary:hover {
60
- background: var(--nav-bg);
297
+ .section-header {
298
+ display: flex;
299
+ align-items: center;
300
+ gap: 4px;
301
+ font-weight: 600;
302
+ font-size: 0.9em;
303
+ padding: 0;
304
+ border: none;
305
+ background: transparent;
306
+ cursor: pointer;
307
+ flex: 1;
308
+ text-align: left;
309
+ color: inherit;
61
310
  }
62
- .column-toggles summary::-webkit-details-marker {
63
- display: none;
311
+ .collapse-icon {
312
+ font-size: 0.7em;
313
+ width: 1em;
314
+ flex-shrink: 0;
64
315
  }
65
- .column-menu {
66
- font-size: 1.1em;
67
- position: absolute;
68
- right: 0;
69
- top: calc(100% + 4pt);
70
- background: var(--page-bg);
71
- border: 1px solid var(--border);
72
- border-radius: 4pt;
73
- padding: 3pt 5pt;
74
- min-width: 150px;
316
+ .section-items {
75
317
  display: grid;
76
- grid-template-columns: repeat(auto-fill, minmax(135px, 1fr));
77
- z-index: 1; /* needed to ensure column toggle menu is above HeatmapTable header row */
78
318
  }
79
- .column-menu .toggle-label {
319
+ .toggle-label {
80
320
  display: inline-block;
81
321
  margin: 1px 2px;
82
322
  border-radius: 3px;
@@ -85,9 +325,16 @@ function toggle_column_visibility(idx, event) {
85
325
  white-space: nowrap;
86
326
  overflow: hidden;
87
327
  text-overflow: ellipsis;
88
- }
89
- .column-menu .toggle-label:hover {
90
- background: var(--nav-bg);
328
+ &:hover:not(.disabled) {
329
+ background: var(--tgl-hover-bg, var(--nav-bg));
330
+ }
331
+ &.disabled {
332
+ opacity: 0.5;
333
+ cursor: not-allowed;
334
+ input {
335
+ cursor: not-allowed;
336
+ }
337
+ }
91
338
  }
92
339
  details :global(:is(sub, sup)) {
93
340
  transform: translate(-3pt, 6pt);
@@ -2,7 +2,10 @@ import type { Label } from './';
2
2
  type $$ComponentProps = {
3
3
  columns: Label[];
4
4
  column_panel_open?: boolean;
5
+ n_columns?: number;
6
+ collapsed_sections?: string[];
7
+ on_reset?: (section?: string) => void;
5
8
  };
6
- declare const ToggleMenu: import("svelte").Component<$$ComponentProps, {}, "columns" | "column_panel_open">;
9
+ declare const ToggleMenu: import("svelte").Component<$$ComponentProps, {}, "columns" | "column_panel_open" | "collapsed_sections">;
7
10
  type ToggleMenu = ReturnType<typeof ToggleMenu>;
8
11
  export default ToggleMenu;
@@ -22,6 +22,8 @@ export type Label = {
22
22
  sticky?: boolean;
23
23
  visible?: boolean;
24
24
  sortable?: boolean;
25
+ show_sort_indicator?: boolean;
26
+ disabled?: boolean;
25
27
  style?: string;
26
28
  cell_style?: string;
27
29
  };
@@ -50,6 +52,7 @@ export type InitialSort = string | {
50
52
  };
51
53
  export type Pagination = boolean | {
52
54
  page_size?: number;
55
+ page_sizes?: number[];
53
56
  };
54
57
  export type Search = boolean | {
55
58
  placeholder?: string;
@@ -1,2 +1,2 @@
1
1
  export { default as TooltipContent } from './TooltipContent.svelte';
2
- export type { TooltipConfig, TooltipProp } from './types';
2
+ export * from './types';
@@ -1 +1,2 @@
1
1
  export { default as TooltipContent } from './TooltipContent.svelte';
2
+ export * from './types';