matterviz 0.3.2 → 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 (280) hide show
  1. package/dist/EmptyState.svelte +10 -2
  2. package/dist/FilePicker.svelte +123 -82
  3. package/dist/Icon.svelte +18 -12
  4. package/dist/MillerIndexInput.svelte +27 -21
  5. package/dist/api/optimade.js +6 -6
  6. package/dist/app.css +216 -207
  7. package/dist/brillouin/BrillouinZone.svelte +292 -149
  8. package/dist/brillouin/BrillouinZone.svelte.d.ts +1 -1
  9. package/dist/brillouin/BrillouinZoneControls.svelte +32 -5
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte +69 -42
  11. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  12. package/dist/brillouin/BrillouinZoneInfoPane.svelte +99 -68
  13. package/dist/brillouin/BrillouinZoneScene.svelte +275 -163
  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 +162 -27
  18. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +451 -281
  19. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +2148 -1642
  20. package/dist/chempot-diagram/ChemPotScene3D.svelte +8 -5
  21. package/dist/chempot-diagram/async-compute.svelte.d.ts +3 -0
  22. package/dist/chempot-diagram/async-compute.svelte.js +77 -0
  23. package/dist/chempot-diagram/chempot-worker.d.ts +1 -0
  24. package/dist/chempot-diagram/chempot-worker.js +11 -0
  25. package/dist/chempot-diagram/color.js +1 -2
  26. package/dist/chempot-diagram/compute.d.ts +10 -0
  27. package/dist/chempot-diagram/compute.js +250 -88
  28. package/dist/chempot-diagram/index.d.ts +2 -1
  29. package/dist/chempot-diagram/index.js +2 -1
  30. package/dist/chempot-diagram/temperature.js +8 -9
  31. package/dist/chempot-diagram/types.d.ts +3 -0
  32. package/dist/chempot-diagram/types.js +1 -0
  33. package/dist/colors/index.d.ts +1 -1
  34. package/dist/colors/index.js +5 -3
  35. package/dist/composition/BarChart.svelte +128 -55
  36. package/dist/composition/BubbleChart.svelte +102 -49
  37. package/dist/composition/Composition.svelte +100 -79
  38. package/dist/composition/Formula.svelte +108 -62
  39. package/dist/composition/FormulaFilter.svelte +665 -537
  40. package/dist/composition/PieChart.svelte +183 -108
  41. package/dist/composition/format.d.ts +5 -0
  42. package/dist/composition/format.js +20 -3
  43. package/dist/composition/parse.js +14 -9
  44. package/dist/convex-hull/ConvexHull.svelte +93 -40
  45. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
  46. package/dist/convex-hull/ConvexHull2D.svelte +549 -360
  47. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  48. package/dist/convex-hull/ConvexHull3D.svelte +1296 -827
  49. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  50. package/dist/convex-hull/ConvexHull4D.svelte +1004 -688
  51. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  52. package/dist/convex-hull/ConvexHullControls.svelte +115 -28
  53. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +1 -1
  54. package/dist/convex-hull/ConvexHullInfoPane.svelte +29 -3
  55. package/dist/convex-hull/ConvexHullStats.svelte +425 -328
  56. package/dist/convex-hull/ConvexHullTooltip.svelte +40 -16
  57. package/dist/convex-hull/GasPressureControls.svelte +104 -61
  58. package/dist/convex-hull/StructurePopup.svelte +25 -4
  59. package/dist/convex-hull/TemperatureSlider.svelte +45 -25
  60. package/dist/convex-hull/barycentric-coords.js +13 -7
  61. package/dist/convex-hull/demo-temperature.js +8 -4
  62. package/dist/convex-hull/gas-thermodynamics.js +17 -12
  63. package/dist/convex-hull/helpers.d.ts +9 -0
  64. package/dist/convex-hull/helpers.js +77 -34
  65. package/dist/convex-hull/thermodynamics.js +61 -56
  66. package/dist/convex-hull/types.d.ts +9 -14
  67. package/dist/convex-hull/types.js +0 -17
  68. package/dist/coordination/CoordinationBarPlot.svelte +227 -154
  69. package/dist/element/BohrAtom.svelte +55 -12
  70. package/dist/element/ElementHeading.svelte +7 -2
  71. package/dist/element/ElementPhoto.svelte +15 -9
  72. package/dist/element/ElementStats.svelte +10 -4
  73. package/dist/element/ElementTile.svelte +137 -73
  74. package/dist/element/Nucleus.svelte +39 -11
  75. package/dist/feedback/ClickFeedback.svelte +16 -5
  76. package/dist/feedback/DragOverlay.svelte +10 -2
  77. package/dist/feedback/Spinner.svelte +4 -2
  78. package/dist/feedback/StatusMessage.svelte +8 -2
  79. package/dist/fermi-surface/FermiSlice.svelte +118 -88
  80. package/dist/fermi-surface/FermiSurface.svelte +328 -187
  81. package/dist/fermi-surface/FermiSurface.svelte.d.ts +1 -1
  82. package/dist/fermi-surface/FermiSurfaceControls.svelte +113 -46
  83. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  84. package/dist/fermi-surface/FermiSurfaceScene.svelte +535 -342
  85. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  86. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +14 -5
  87. package/dist/fermi-surface/compute.js +16 -20
  88. package/dist/fermi-surface/parse.js +24 -14
  89. package/dist/fermi-surface/symmetry.js +2 -7
  90. package/dist/fermi-surface/types.d.ts +3 -5
  91. package/dist/heatmap-matrix/HeatmapMatrix.svelte +1019 -765
  92. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +1 -1
  93. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +76 -22
  94. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +2 -3
  95. package/dist/icons.js +47 -0
  96. package/dist/index.d.ts +2 -1
  97. package/dist/index.js +2 -1
  98. package/dist/io/decompress.js +1 -1
  99. package/dist/io/export.d.ts +3 -0
  100. package/dist/io/export.js +129 -143
  101. package/dist/io/is-binary.js +2 -3
  102. package/dist/io/url-drop.js +1 -2
  103. package/dist/isosurface/Isosurface.svelte +202 -148
  104. package/dist/isosurface/IsosurfaceControls.svelte +46 -28
  105. package/dist/isosurface/parse.js +34 -29
  106. package/dist/isosurface/slice.js +5 -10
  107. package/dist/isosurface/types.d.ts +2 -1
  108. package/dist/isosurface/types.js +61 -12
  109. package/dist/labels.js +11 -8
  110. package/dist/layout/FullscreenToggle.svelte +11 -2
  111. package/dist/layout/InfoCard.svelte +38 -6
  112. package/dist/layout/InfoTag.svelte +63 -32
  113. package/dist/layout/PropertyFilter.svelte +82 -37
  114. package/dist/layout/SettingsSection.svelte +85 -55
  115. package/dist/layout/SubpageGrid.svelte +10 -2
  116. package/dist/layout/json-tree/JsonNode.svelte +183 -138
  117. package/dist/layout/json-tree/JsonTree.svelte +499 -413
  118. package/dist/layout/json-tree/JsonValue.svelte +127 -99
  119. package/dist/layout/json-tree/utils.js +4 -2
  120. package/dist/marching-cubes.js +25 -2
  121. package/dist/math.d.ts +13 -17
  122. package/dist/math.js +133 -67
  123. package/dist/overlays/ContextMenu.svelte +65 -40
  124. package/dist/overlays/DraggablePane.svelte +211 -139
  125. package/dist/periodic-table/PeriodicTable.svelte +278 -145
  126. package/dist/periodic-table/PeriodicTableControls.svelte +178 -128
  127. package/dist/periodic-table/PropertySelect.svelte +25 -7
  128. package/dist/periodic-table/TableInset.svelte +8 -3
  129. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +446 -309
  130. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +1 -1
  131. package/dist/phase-diagram/PhaseDiagramControls.svelte +102 -43
  132. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
  133. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +63 -40
  134. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +71 -28
  135. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +1 -1
  136. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +158 -101
  137. package/dist/phase-diagram/TdbInfoPanel.svelte +28 -4
  138. package/dist/phase-diagram/build-diagram.js +9 -9
  139. package/dist/phase-diagram/colors.js +1 -3
  140. package/dist/phase-diagram/parse.js +10 -9
  141. package/dist/phase-diagram/svg-to-diagram.js +53 -49
  142. package/dist/phase-diagram/utils.d.ts +1 -0
  143. package/dist/phase-diagram/utils.js +80 -25
  144. package/dist/plot/AxisLabel.svelte +28 -3
  145. package/dist/plot/BarPlot.svelte +1182 -734
  146. package/dist/plot/BarPlot.svelte.d.ts +2 -2
  147. package/dist/plot/BarPlotControls.svelte +31 -5
  148. package/dist/plot/BarPlotControls.svelte.d.ts +1 -1
  149. package/dist/plot/ColorBar.svelte +479 -329
  150. package/dist/plot/ColorScaleSelect.svelte +27 -6
  151. package/dist/plot/ElementScatter.svelte +36 -15
  152. package/dist/plot/FillArea.svelte +152 -95
  153. package/dist/plot/Histogram.svelte +934 -571
  154. package/dist/plot/Histogram.svelte.d.ts +1 -1
  155. package/dist/plot/HistogramControls.svelte +53 -9
  156. package/dist/plot/HistogramControls.svelte.d.ts +1 -1
  157. package/dist/plot/InteractiveAxisLabel.svelte +34 -11
  158. package/dist/plot/InteractiveAxisLabel.svelte.d.ts +1 -1
  159. package/dist/plot/Line.svelte +63 -28
  160. package/dist/plot/PlotControls.svelte +157 -114
  161. package/dist/plot/PlotControls.svelte.d.ts +1 -1
  162. package/dist/plot/PlotLegend.svelte +174 -91
  163. package/dist/plot/PlotTooltip.svelte +45 -6
  164. package/dist/plot/PortalSelect.svelte +175 -147
  165. package/dist/plot/ReferenceLine.svelte +76 -22
  166. package/dist/plot/ReferenceLine3D.svelte +132 -107
  167. package/dist/plot/ReferencePlane.svelte +146 -121
  168. package/dist/plot/ScatterPlot.svelte +1681 -1091
  169. package/dist/plot/ScatterPlot.svelte.d.ts +2 -2
  170. package/dist/plot/ScatterPlot3D.svelte +256 -131
  171. package/dist/plot/ScatterPlot3D.svelte.d.ts +2 -2
  172. package/dist/plot/ScatterPlot3DControls.svelte +113 -63
  173. package/dist/plot/ScatterPlot3DControls.svelte.d.ts +2 -1
  174. package/dist/plot/ScatterPlot3DScene.svelte +608 -403
  175. package/dist/plot/ScatterPlot3DScene.svelte.d.ts +2 -2
  176. package/dist/plot/ScatterPlotControls.svelte +65 -25
  177. package/dist/plot/ScatterPlotControls.svelte.d.ts +1 -1
  178. package/dist/plot/ScatterPoint.svelte +98 -26
  179. package/dist/plot/ScatterPoint.svelte.d.ts +1 -0
  180. package/dist/plot/SpacegroupBarPlot.svelte +142 -85
  181. package/dist/plot/Surface3D.svelte +159 -108
  182. package/dist/plot/ZeroLines.svelte +55 -3
  183. package/dist/plot/ZoomRect.svelte +4 -2
  184. package/dist/plot/axis-utils.js +1 -3
  185. package/dist/plot/data-cleaning.js +12 -28
  186. package/dist/plot/data-transform.js +2 -1
  187. package/dist/plot/fill-utils.js +2 -0
  188. package/dist/plot/layout.d.ts +4 -1
  189. package/dist/plot/layout.js +33 -14
  190. package/dist/plot/reference-line.d.ts +2 -2
  191. package/dist/plot/reference-line.js +7 -5
  192. package/dist/plot/scales.js +24 -36
  193. package/dist/plot/types.d.ts +11 -23
  194. package/dist/plot/types.js +6 -11
  195. package/dist/plot/utils/label-placement.d.ts +32 -15
  196. package/dist/plot/utils/label-placement.js +227 -66
  197. package/dist/plot/utils/series-visibility.js +2 -3
  198. package/dist/rdf/RdfPlot.svelte +143 -91
  199. package/dist/rdf/calc-rdf.js +4 -5
  200. package/dist/sanitize.d.ts +4 -0
  201. package/dist/sanitize.js +107 -0
  202. package/dist/settings.d.ts +18 -6
  203. package/dist/settings.js +46 -16
  204. package/dist/spectral/Bands.svelte +632 -453
  205. package/dist/spectral/BandsAndDos.svelte +90 -49
  206. package/dist/spectral/BrillouinBandsDos.svelte +151 -93
  207. package/dist/spectral/Dos.svelte +389 -258
  208. package/dist/spectral/helpers.js +55 -43
  209. package/dist/state.svelte.d.ts +1 -1
  210. package/dist/state.svelte.js +3 -2
  211. package/dist/structure/Arrow.svelte +59 -20
  212. package/dist/structure/AtomLegend.svelte +215 -134
  213. package/dist/structure/Bond.svelte +73 -47
  214. package/dist/structure/CanvasTooltip.svelte +10 -2
  215. package/dist/structure/CellSelect.svelte +72 -45
  216. package/dist/structure/Cylinder.svelte +33 -17
  217. package/dist/structure/Lattice.svelte +88 -33
  218. package/dist/structure/Structure.svelte +1063 -797
  219. package/dist/structure/Structure.svelte.d.ts +1 -1
  220. package/dist/structure/StructureControls.svelte +349 -118
  221. package/dist/structure/StructureExportPane.svelte +124 -89
  222. package/dist/structure/StructureExportPane.svelte.d.ts +1 -1
  223. package/dist/structure/StructureInfoPane.svelte +304 -237
  224. package/dist/structure/StructureScene.svelte +879 -443
  225. package/dist/structure/StructureScene.svelte.d.ts +15 -7
  226. package/dist/structure/atom-properties.js +8 -8
  227. package/dist/structure/bonding.js +6 -7
  228. package/dist/structure/export.js +14 -29
  229. package/dist/structure/ferrox-wasm.js +1 -1
  230. package/dist/structure/index.d.ts +13 -3
  231. package/dist/structure/index.js +83 -23
  232. package/dist/structure/measure.d.ts +2 -2
  233. package/dist/structure/measure.js +4 -44
  234. package/dist/structure/parse.js +113 -141
  235. package/dist/structure/partial-occupancy.js +7 -10
  236. package/dist/structure/pbc.d.ts +1 -0
  237. package/dist/structure/pbc.js +16 -6
  238. package/dist/structure/supercell.d.ts +2 -2
  239. package/dist/structure/supercell.js +12 -22
  240. package/dist/structure/validation.js +1 -2
  241. package/dist/symmetry/SymmetryStats.svelte +84 -41
  242. package/dist/symmetry/WyckoffTable.svelte +26 -6
  243. package/dist/symmetry/cell-transform.js +5 -3
  244. package/dist/symmetry/index.js +8 -7
  245. package/dist/symmetry/spacegroups.js +148 -148
  246. package/dist/table/HeatmapTable.svelte +790 -554
  247. package/dist/table/HeatmapTable.svelte.d.ts +1 -1
  248. package/dist/table/ToggleMenu.svelte +125 -92
  249. package/dist/table/index.js +2 -4
  250. package/dist/theme/ThemeControl.svelte +21 -12
  251. package/dist/time.js +4 -1
  252. package/dist/tooltip/TooltipContent.svelte +33 -8
  253. package/dist/trajectory/Trajectory.svelte +758 -558
  254. package/dist/trajectory/TrajectoryError.svelte +14 -3
  255. package/dist/trajectory/TrajectoryExportPane.svelte +137 -83
  256. package/dist/trajectory/TrajectoryInfoPane.svelte +272 -143
  257. package/dist/trajectory/extract.js +10 -26
  258. package/dist/trajectory/format-detect.js +5 -5
  259. package/dist/trajectory/frame-reader.d.ts +1 -1
  260. package/dist/trajectory/frame-reader.js +5 -12
  261. package/dist/trajectory/helpers.d.ts +0 -1
  262. package/dist/trajectory/helpers.js +2 -17
  263. package/dist/trajectory/index.js +14 -12
  264. package/dist/trajectory/parse/ase.js +5 -4
  265. package/dist/trajectory/parse/hdf5.js +26 -18
  266. package/dist/trajectory/parse/index.js +13 -18
  267. package/dist/trajectory/parse/lammps.js +17 -7
  268. package/dist/trajectory/parse/vasp.js +5 -2
  269. package/dist/trajectory/parse/xyz.js +8 -7
  270. package/dist/trajectory/plotting.js +13 -8
  271. package/dist/utils.d.ts +1 -0
  272. package/dist/utils.js +13 -0
  273. package/dist/xrd/XrdPlot.svelte +337 -247
  274. package/dist/xrd/broadening.js +14 -9
  275. package/dist/xrd/calc-xrd.js +12 -18
  276. package/dist/xrd/parse.d.ts +1 -1
  277. package/dist/xrd/parse.js +17 -17
  278. package/package.json +99 -103
  279. package/readme.md +1 -1
  280. /package/dist/theme/{themes.js → themes.mjs} +0 -0
@@ -39,6 +39,6 @@ type Props = HTMLAttributes<HTMLDivElement> & {
39
39
  }
40
40
  ]>;
41
41
  };
42
- declare const IsobaricBinaryPhaseDiagram: import("svelte").Component<Props, {}, "controls_open" | "x_axis" | "y_axis" | "show_grid" | "fullscreen" | "wrapper" | "hovered_region" | "config" | "show_labels" | "export_pane_open" | "png_dpi" | "show_boundaries" | "show_special_points" | "show_component_labels" | "lever_rule_mode" | "editor_open" | "diagram_input" | "display_temp_unit">;
42
+ declare const IsobaricBinaryPhaseDiagram: import("svelte").Component<Props, {}, "fullscreen" | "controls_open" | "x_axis" | "y_axis" | "show_grid" | "wrapper" | "hovered_region" | "config" | "show_boundaries" | "show_labels" | "show_special_points" | "show_component_labels" | "png_dpi" | "export_pane_open" | "lever_rule_mode" | "editor_open" | "diagram_input" | "display_temp_unit">;
43
43
  type IsobaricBinaryPhaseDiagram = ReturnType<typeof IsobaricBinaryPhaseDiagram>;
44
44
  export default IsobaricBinaryPhaseDiagram;
@@ -1,46 +1,105 @@
1
- <script lang="ts">// NOTE: Axis config objects must be reassigned (not mutated) to trigger $bindable reactivity.
2
- import { css_color_to_hex } from '../colors';
3
- import { format_num } from '../labels';
4
- import SettingsSection from '../layout/SettingsSection.svelte';
5
- import DraggablePane from '../overlays/DraggablePane.svelte';
6
- import { tooltip } from 'svelte-multiselect/attachments';
7
- import { merge_phase_diagram_config, PHASE_DIAGRAM_DEFAULTS } from './utils';
8
- let { controls_open = $bindable(false),
9
- // Visibility toggles
10
- show_boundaries = $bindable(PHASE_DIAGRAM_DEFAULTS.show_boundaries), show_labels = $bindable(PHASE_DIAGRAM_DEFAULTS.show_labels), show_special_points = $bindable(PHASE_DIAGRAM_DEFAULTS.show_special_points), show_grid = $bindable(PHASE_DIAGRAM_DEFAULTS.show_grid), show_component_labels = $bindable(PHASE_DIAGRAM_DEFAULTS.show_component_labels),
11
- // Configuration
12
- config = $bindable({}),
13
- // Lever rule mode
14
- lever_rule_mode = $bindable(`horizontal`),
15
- // Axis configuration
16
- x_axis = $bindable({}), y_axis = $bindable({}),
17
- // Data
18
- data,
19
- // Export
20
- enable_export = true, png_dpi = $bindable(PHASE_DIAGRAM_DEFAULTS.png_dpi),
21
- // Pane props
22
- pane_props = {}, toggle_props = {},
23
- // Snippets
24
- children, post_children, ...rest } = $props();
25
- // Merged config using shared helper
26
- const merged_config = $derived(merge_phase_diagram_config(config));
27
- // Helper to update top-level config properties (e.g., font_size, special_point_radius)
28
- function update_config(key, value) {
29
- config = { ...config, [key]: value };
30
- }
31
- // Helper to update nested config properties
32
- function update_nested(key, prop, value) {
33
- config = { ...config, [key]: { ...config[key], [prop]: value } };
34
- }
35
- // Derive component info from data
36
- const component_a = $derived(data?.components?.[0]);
37
- const component_b = $derived(data?.components?.[1]);
38
- const title = $derived(component_a && component_b
39
- ? `${component_a}-${component_b} Phase Diagram`
40
- : `Phase Diagram Controls`);
41
- const temp_unit = $derived(data?.temperature_unit ?? `K`);
42
- const comp_unit = $derived(data?.composition_unit ?? `at%`);
43
- const has_special_points = $derived((data?.special_points?.length ?? 0) > 0);
1
+ <script lang="ts">
2
+ // NOTE: Axis config objects must be reassigned (not mutated) to trigger $bindable reactivity.
3
+ import { css_color_to_hex } from '../colors'
4
+ import { format_num } from '../labels'
5
+ import SettingsSection from '../layout/SettingsSection.svelte'
6
+ import DraggablePane from '../overlays/DraggablePane.svelte'
7
+ import type { AxisConfig } from '../plot'
8
+ import type { ComponentProps, Snippet } from 'svelte'
9
+ import { tooltip } from 'svelte-multiselect/attachments'
10
+ import type { LeverRuleMode, PhaseDiagramConfig, PhaseDiagramData } from './types'
11
+ import { merge_phase_diagram_config, PHASE_DIAGRAM_DEFAULTS } from './utils'
12
+
13
+ type Props = Omit<ComponentProps<typeof DraggablePane>, `children`> & {
14
+ controls_open?: boolean
15
+ // Visibility toggles
16
+ show_boundaries?: boolean
17
+ show_labels?: boolean
18
+ show_special_points?: boolean
19
+ show_grid?: boolean
20
+ show_component_labels?: boolean
21
+ // Configuration
22
+ config?: Partial<PhaseDiagramConfig>
23
+ // Lever rule mode
24
+ lever_rule_mode?: LeverRuleMode
25
+ // Axis configuration
26
+ x_axis?: AxisConfig
27
+ y_axis?: AxisConfig
28
+ // Data for context (components, units, etc.)
29
+ data?: PhaseDiagramData
30
+ // Export settings
31
+ enable_export?: boolean
32
+ png_dpi?: number
33
+ // Pane customization
34
+ pane_props?: ComponentProps<typeof DraggablePane>[`pane_props`]
35
+ toggle_props?: ComponentProps<typeof DraggablePane>[`toggle_props`]
36
+ // Custom content snippets
37
+ children?: Snippet<[{ controls_open: boolean }]>
38
+ post_children?: Snippet<[{ controls_open: boolean }]>
39
+ }
40
+
41
+ let {
42
+ controls_open = $bindable(false),
43
+ // Visibility toggles
44
+ show_boundaries = $bindable(PHASE_DIAGRAM_DEFAULTS.show_boundaries),
45
+ show_labels = $bindable(PHASE_DIAGRAM_DEFAULTS.show_labels),
46
+ show_special_points = $bindable(PHASE_DIAGRAM_DEFAULTS.show_special_points),
47
+ show_grid = $bindable(PHASE_DIAGRAM_DEFAULTS.show_grid),
48
+ show_component_labels = $bindable(PHASE_DIAGRAM_DEFAULTS.show_component_labels),
49
+ // Configuration
50
+ config = $bindable({}),
51
+ // Lever rule mode
52
+ lever_rule_mode = $bindable(`horizontal`),
53
+ // Axis configuration
54
+ x_axis = $bindable({}),
55
+ y_axis = $bindable({}),
56
+ // Data
57
+ data,
58
+ // Export
59
+ enable_export = true,
60
+ png_dpi = $bindable(PHASE_DIAGRAM_DEFAULTS.png_dpi),
61
+ // Pane props
62
+ pane_props = {},
63
+ toggle_props = {},
64
+ // Snippets
65
+ children,
66
+ post_children,
67
+ ...rest
68
+ }: Props = $props()
69
+
70
+ // Merged config using shared helper
71
+ const merged_config = $derived(merge_phase_diagram_config(config))
72
+
73
+ // Helper to update top-level config properties (e.g., font_size, special_point_radius)
74
+ function update_config<K extends keyof PhaseDiagramConfig>(
75
+ key: K,
76
+ value: PhaseDiagramConfig[K],
77
+ ) {
78
+ config = { ...config, [key]: value }
79
+ }
80
+
81
+ // Helper to update nested config properties
82
+ function update_nested<
83
+ K extends keyof Pick<PhaseDiagramConfig, `colors` | `tie_line`>,
84
+ >(
85
+ key: K,
86
+ prop: string,
87
+ value: string | number,
88
+ ) {
89
+ config = { ...config, [key]: { ...config[key], [prop]: value } }
90
+ }
91
+
92
+ // Derive component info from data
93
+ const component_a = $derived(data?.components?.[0])
94
+ const component_b = $derived(data?.components?.[1])
95
+ const title = $derived(
96
+ component_a && component_b
97
+ ? `${component_a}-${component_b} Phase Diagram`
98
+ : `Phase Diagram Controls`,
99
+ )
100
+ const temp_unit = $derived(data?.temperature_unit ?? `K`)
101
+ const comp_unit = $derived(data?.composition_unit ?? `at%`)
102
+ const has_special_points = $derived((data?.special_points?.length ?? 0) > 0)
44
103
  </script>
45
104
 
46
105
  <!-- Reusable snippet for number + range input pairs -->
@@ -25,6 +25,6 @@ type Props = Omit<ComponentProps<typeof DraggablePane>, `children`> & {
25
25
  controls_open: boolean;
26
26
  }]>;
27
27
  };
28
- declare const PhaseDiagramControls: import("svelte").Component<Props, {}, "controls_open" | "x_axis" | "y_axis" | "show_grid" | "config" | "show_labels" | "png_dpi" | "show_boundaries" | "show_special_points" | "show_component_labels" | "lever_rule_mode">;
28
+ declare const PhaseDiagramControls: import("svelte").Component<Props, {}, "controls_open" | "x_axis" | "y_axis" | "show_grid" | "config" | "show_boundaries" | "show_labels" | "show_special_points" | "show_component_labels" | "png_dpi" | "lever_rule_mode">;
29
29
  type PhaseDiagramControls = ReturnType<typeof PhaseDiagramControls>;
30
30
  export default PhaseDiagramControls;
@@ -1,45 +1,68 @@
1
- <script lang="ts">import { JsonTree } from '../layout/json-tree';
2
- import { set_at_path } from '../layout/json-tree/utils';
3
- import DraggablePane from '../overlays/DraggablePane.svelte';
4
- import { build_diagram } from './build-diagram';
5
- let { editor_open = $bindable(false), diagram_input = $bindable(null), data = null, ondata, icon_style = ``, toggle_props: caller_toggle_props = {}, } = $props();
6
- // The source object currently displayed (DiagramInput or PhaseDiagramData)
7
- const display_source = $derived(diagram_input ?? data);
8
- const root_label = `diagram`;
9
- // Brief error flash when an edit is rejected by build_diagram
10
- let rejection_msg = $state(null);
11
- let rejection_timer;
12
- function show_rejection(msg) {
13
- if (rejection_timer)
14
- clearTimeout(rejection_timer);
15
- rejection_msg = msg;
16
- rejection_timer = setTimeout(() => (rejection_msg = null), 3000);
17
- }
18
- // Shared format detection: true if obj looks like a DiagramInput
19
- function is_diagram_input(obj) {
20
- const meta = obj.meta;
21
- return Boolean(meta && Array.isArray(meta.components) && `curves` in obj);
22
- }
23
- // Handle inline value edits from JsonTree
24
- function handle_change(path, new_value, _old_value) {
25
- if (!display_source)
26
- return;
27
- const updated = set_at_path(display_source, path, new_value, root_label);
28
- if (is_diagram_input(updated)) {
29
- try {
30
- build_diagram(updated);
31
- diagram_input = updated;
32
- }
33
- catch (err) {
34
- const msg = err instanceof Error ? err.message : String(err);
35
- show_rejection(msg);
36
- }
37
- return;
1
+ <script lang="ts">
2
+ import { JsonTree } from '../layout/json-tree'
3
+ import { set_at_path } from '../layout/json-tree/utils'
4
+ import DraggablePane from '../overlays/DraggablePane.svelte'
5
+ import type { ComponentProps } from 'svelte'
6
+ import { build_diagram } from './build-diagram'
7
+ import type { DiagramInput } from './diagram-input'
8
+ import type { PhaseDiagramData } from './types'
9
+
10
+ let {
11
+ editor_open = $bindable(false),
12
+ diagram_input = $bindable<DiagramInput | null>(null),
13
+ data = null,
14
+ ondata,
15
+ icon_style = ``,
16
+ toggle_props: caller_toggle_props = {},
17
+ }: {
18
+ editor_open?: boolean
19
+ diagram_input?: DiagramInput | null
20
+ data?: PhaseDiagramData | null
21
+ ondata?: (data: PhaseDiagramData) => void
22
+ icon_style?: string
23
+ toggle_props?: ComponentProps<typeof DraggablePane>[`toggle_props`]
24
+ } = $props()
25
+
26
+ // The source object currently displayed (DiagramInput or PhaseDiagramData)
27
+ const display_source = $derived(diagram_input ?? data)
28
+
29
+ const root_label = `diagram`
30
+
31
+ // Brief error flash when an edit is rejected by build_diagram
32
+ let rejection_msg = $state<string | null>(null)
33
+ let rejection_timer: ReturnType<typeof setTimeout> | undefined
34
+
35
+ function show_rejection(msg: string) {
36
+ if (rejection_timer) clearTimeout(rejection_timer)
37
+ rejection_msg = msg
38
+ rejection_timer = setTimeout(() => (rejection_msg = null), 3000)
39
+ }
40
+
41
+ // Shared format detection: true if obj looks like a DiagramInput
42
+ function is_diagram_input(obj: Record<string, unknown>): boolean {
43
+ const meta = obj.meta as Record<string, unknown> | undefined
44
+ return Boolean(meta && Array.isArray(meta.components) && `curves` in obj)
45
+ }
46
+
47
+ // Handle inline value edits from JsonTree
48
+ function handle_change(path: string, new_value: unknown, _old_value: unknown) {
49
+ if (!display_source) return
50
+ const updated = set_at_path(display_source, path, new_value, root_label)
51
+
52
+ if (is_diagram_input(updated as Record<string, unknown>)) {
53
+ try {
54
+ build_diagram(updated as DiagramInput)
55
+ diagram_input = updated as DiagramInput
56
+ } catch (error) {
57
+ const msg = error instanceof Error ? error.message : String(error)
58
+ show_rejection(msg)
59
+ }
60
+ return
38
61
  }
39
62
  // PhaseDiagramData format — clear diagram_input so rebuilt_data doesn't shadow
40
- diagram_input = null;
41
- ondata?.(updated);
42
- }
63
+ diagram_input = null
64
+ ondata?.(updated as PhaseDiagramData)
65
+ }
43
66
  </script>
44
67
 
45
68
  <DraggablePane
@@ -1,31 +1,74 @@
1
- <script lang="ts">import { export_svg_as_png, export_svg_as_svg } from '../io/export';
2
- import DraggablePane from '../overlays/DraggablePane.svelte';
3
- import { CopyButton } from 'svelte-multiselect';
4
- import { tooltip } from 'svelte-multiselect/attachments';
5
- let { export_pane_open = $bindable(false), data, json_payload = undefined, wrapper, svg_element = undefined, svg_query_selector = `svg.binary-phase-diagram`, filename = `phase-diagram`, png_dpi = $bindable(150), icon_style = ``, toggle_props: caller_toggle_props = {}, ...rest } = $props();
6
- let json_copy_state = $state(`ready`);
7
- let svg_copy_state = $state(`ready`);
8
- // Generate filename with components if available (requires exactly 2 components)
9
- const full_filename = $derived(data?.components?.length === 2
10
- ? `${filename}-${data.components[0]}-${data.components[1]}`
11
- : filename);
12
- const svg = $derived(svg_element ??
13
- wrapper?.querySelector(svg_query_selector));
14
- const json_export_data = $derived(json_payload ?? data);
15
- const svg_string = $derived(svg ? new XMLSerializer().serializeToString(svg) : null);
16
- function download_json() {
17
- if (!json_export_data)
18
- return;
19
- const json_string = JSON.stringify(json_export_data, null, 2);
20
- const blob = new Blob([json_string], { type: `application/json` });
21
- const url = URL.createObjectURL(blob);
22
- const link = document.createElement(`a`);
23
- link.href = url;
24
- link.download = `${full_filename}.json`;
25
- link.click();
26
- URL.revokeObjectURL(url);
27
- }
28
- const json_string = $derived(json_export_data ? JSON.stringify(json_export_data, null, 2) : null);
1
+ <script lang="ts">
2
+ import { export_svg_as_png, export_svg_as_svg } from '../io/export'
3
+ import DraggablePane from '../overlays/DraggablePane.svelte'
4
+ import type { ComponentProps } from 'svelte'
5
+ import { CopyButton } from 'svelte-multiselect'
6
+ import { tooltip } from 'svelte-multiselect/attachments'
7
+ import type { HTMLAttributes } from 'svelte/elements'
8
+ import type { PhaseDiagramData } from './types'
9
+
10
+ let {
11
+ export_pane_open = $bindable(false),
12
+ data,
13
+ json_payload = undefined,
14
+ wrapper,
15
+ svg_element = undefined,
16
+ svg_query_selector = `svg.binary-phase-diagram`,
17
+ filename = `phase-diagram`,
18
+ png_dpi = $bindable(150),
19
+ icon_style = ``,
20
+ toggle_props: caller_toggle_props = {},
21
+ ...rest
22
+ }: HTMLAttributes<HTMLDivElement> & {
23
+ export_pane_open?: boolean
24
+ data?: PhaseDiagramData
25
+ json_payload?: unknown
26
+ wrapper?: HTMLDivElement
27
+ svg_element?: SVGSVGElement | null
28
+ svg_query_selector?: string
29
+ filename?: string
30
+ png_dpi?: number
31
+ icon_style?: string
32
+ toggle_props?: ComponentProps<typeof DraggablePane>[`toggle_props`]
33
+ } = $props()
34
+
35
+ let json_copy_state = $state<ComponentProps<typeof CopyButton>[`state`]>(`ready`)
36
+ let svg_copy_state = $state<ComponentProps<typeof CopyButton>[`state`]>(`ready`)
37
+
38
+ // Generate filename with components if available (requires exactly 2 components)
39
+ const full_filename = $derived(
40
+ data?.components?.length === 2
41
+ ? `${filename}-${data.components[0]}-${data.components[1]}`
42
+ : filename,
43
+ )
44
+
45
+ const svg = $derived(
46
+ svg_element ??
47
+ (wrapper?.querySelector(svg_query_selector) as SVGSVGElement | null),
48
+ )
49
+
50
+ const json_export_data = $derived(json_payload ?? data)
51
+
52
+ const svg_string = $derived(svg ? new XMLSerializer().serializeToString(svg) : null)
53
+
54
+ function download_json() {
55
+ if (!json_export_data) return
56
+
57
+ const json_string = JSON.stringify(json_export_data, null, 2)
58
+ const blob = new Blob([json_string], { type: `application/json` })
59
+ const url = URL.createObjectURL(blob)
60
+
61
+ const link = document.createElement(`a`)
62
+ link.href = url
63
+ link.download = `${full_filename}.json`
64
+ link.click()
65
+
66
+ URL.revokeObjectURL(url)
67
+ }
68
+
69
+ const json_string = $derived(
70
+ json_export_data ? JSON.stringify(json_export_data, null, 2) : null,
71
+ )
29
72
  </script>
30
73
 
31
74
  <DraggablePane
@@ -14,6 +14,6 @@ type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
14
14
  icon_style?: string;
15
15
  toggle_props?: ComponentProps<typeof DraggablePane>[`toggle_props`];
16
16
  };
17
- declare const PhaseDiagramExportPane: import("svelte").Component<$$ComponentProps, {}, "export_pane_open" | "png_dpi">;
17
+ declare const PhaseDiagramExportPane: import("svelte").Component<$$ComponentProps, {}, "png_dpi" | "export_pane_open">;
18
18
  type PhaseDiagramExportPane = ReturnType<typeof PhaseDiagramExportPane>;
19
19
  export default PhaseDiagramExportPane;