matterviz 0.3.3 → 0.3.5

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 (126) hide show
  1. package/dist/FilePicker.svelte +1 -1
  2. package/dist/app.css +7 -0
  3. package/dist/brillouin/BrillouinZone.svelte +5 -2
  4. package/dist/brillouin/compute.js +8 -4
  5. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +6 -6
  6. package/dist/chempot-diagram/async-compute.svelte.js +6 -5
  7. package/dist/chempot-diagram/chempot-worker.js +2 -2
  8. package/dist/chempot-diagram/compute.js +16 -16
  9. package/dist/composition/FormulaFilter.svelte +3 -3
  10. package/dist/constants.js +2 -8
  11. package/dist/convex-hull/ConvexHull.svelte +2 -2
  12. package/dist/convex-hull/ConvexHull2D.svelte +11 -10
  13. package/dist/convex-hull/ConvexHull3D.svelte +16 -14
  14. package/dist/convex-hull/ConvexHull4D.svelte +26 -14
  15. package/dist/convex-hull/ConvexHullControls.svelte +1 -1
  16. package/dist/convex-hull/ConvexHullInfoPane.svelte +68 -61
  17. package/dist/convex-hull/ConvexHullStats.svelte +23 -6
  18. package/dist/convex-hull/GasPressureControls.svelte +3 -3
  19. package/dist/convex-hull/TemperatureSlider.svelte +1 -1
  20. package/dist/convex-hull/barycentric-coords.js +2 -2
  21. package/dist/convex-hull/helpers.js +45 -27
  22. package/dist/convex-hull/thermodynamics.js +2 -2
  23. package/dist/element/BohrAtom.svelte +25 -27
  24. package/dist/element/BohrAtom.svelte.d.ts +2 -2
  25. package/dist/element/data.d.ts +2 -3
  26. package/dist/element/data.js +1 -1
  27. package/dist/fermi-surface/FermiSurface.svelte +5 -2
  28. package/dist/fermi-surface/compute.js +3 -3
  29. package/dist/fermi-surface/parse.js +2 -2
  30. package/dist/fermi-surface/symmetry.js +1 -1
  31. package/dist/heatmap-matrix/HeatmapMatrix.svelte +8 -8
  32. package/dist/icons.d.ts +6 -6
  33. package/dist/icons.js +6 -6
  34. package/dist/io/decompress.js +12 -7
  35. package/dist/io/export.js +20 -16
  36. package/dist/io/is-binary.js +19 -4
  37. package/dist/isosurface/parse.js +8 -8
  38. package/dist/isosurface/types.js +9 -9
  39. package/dist/layout/InfoTag.svelte +1 -1
  40. package/dist/layout/json-tree/JsonNode.svelte +1 -0
  41. package/dist/layout/json-tree/utils.js +2 -1
  42. package/dist/marching-cubes.js +1 -1
  43. package/dist/math.js +1 -1
  44. package/dist/overlays/CopyButton.svelte +45 -0
  45. package/dist/overlays/CopyButton.svelte.d.ts +8 -0
  46. package/dist/overlays/InfoPaneCards.svelte +149 -0
  47. package/dist/overlays/InfoPaneCards.svelte.d.ts +22 -0
  48. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +33 -35
  49. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +2 -2
  50. package/dist/phase-diagram/PhaseDiagramControls.svelte +27 -29
  51. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +2 -2
  52. package/dist/phase-diagram/parse.js +3 -3
  53. package/dist/phase-diagram/svg-to-diagram.js +10 -12
  54. package/dist/plot/BarPlot.svelte +24 -15
  55. package/dist/plot/BarPlot.svelte.d.ts +3 -2
  56. package/dist/plot/FillArea.svelte +2 -3
  57. package/dist/plot/FillArea.svelte.d.ts +3 -2
  58. package/dist/plot/Histogram.svelte +37 -19
  59. package/dist/plot/Line.svelte +2 -3
  60. package/dist/plot/Line.svelte.d.ts +2 -2
  61. package/dist/plot/PlotLegend.svelte +79 -8
  62. package/dist/plot/PlotLegend.svelte.d.ts +4 -0
  63. package/dist/plot/PortalSelect.svelte +5 -5
  64. package/dist/plot/ScatterPlot.svelte +47 -33
  65. package/dist/plot/ScatterPlot.svelte.d.ts +5 -4
  66. package/dist/plot/ScatterPlot3D.svelte +6 -3
  67. package/dist/plot/ScatterPoint.svelte +10 -4
  68. package/dist/plot/ScatterPoint.svelte.d.ts +4 -2
  69. package/dist/plot/SpacegroupBarPlot.svelte +5 -4
  70. package/dist/plot/data-cleaning.js +9 -9
  71. package/dist/plot/index.d.ts +0 -6
  72. package/dist/plot/scales.d.ts +3 -3
  73. package/dist/plot/scales.js +29 -29
  74. package/dist/plot/types.d.ts +5 -9
  75. package/dist/rdf/calc-rdf.js +1 -1
  76. package/dist/sanitize.js +22 -15
  77. package/dist/settings.d.ts +2 -0
  78. package/dist/settings.js +12 -3
  79. package/dist/spectral/Bands.svelte +6 -6
  80. package/dist/spectral/BandsAndDos.svelte +4 -4
  81. package/dist/spectral/BrillouinBandsDos.svelte +3 -3
  82. package/dist/spectral/Dos.svelte +2 -2
  83. package/dist/spectral/helpers.js +1 -1
  84. package/dist/structure/AtomLegend.svelte +4 -4
  85. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  86. package/dist/structure/Cylinder.svelte +7 -7
  87. package/dist/structure/Structure.svelte +169 -27
  88. package/dist/structure/Structure.svelte.d.ts +6 -2
  89. package/dist/structure/StructureControls.svelte +130 -16
  90. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  91. package/dist/structure/StructureInfoPane.svelte +519 -218
  92. package/dist/structure/StructureInfoPane.svelte.d.ts +2 -1
  93. package/dist/structure/StructureScene.svelte +399 -68
  94. package/dist/structure/StructureScene.svelte.d.ts +8 -4
  95. package/dist/structure/atom-properties.js +3 -1
  96. package/dist/structure/bond-order-perception.d.ts +13 -0
  97. package/dist/structure/bond-order-perception.js +367 -0
  98. package/dist/structure/bonding.d.ts +10 -1
  99. package/dist/structure/bonding.js +232 -11
  100. package/dist/structure/export.js +6 -4
  101. package/dist/structure/index.d.ts +19 -4
  102. package/dist/structure/index.js +3 -0
  103. package/dist/structure/label-placement.d.ts +14 -0
  104. package/dist/structure/label-placement.js +72 -0
  105. package/dist/structure/parse.d.ts +2 -1
  106. package/dist/structure/parse.js +25 -36
  107. package/dist/structure/supercell.js +35 -2
  108. package/dist/symmetry/SymmetryStats.svelte +1 -1
  109. package/dist/symmetry/cell-transform.js +15 -1
  110. package/dist/symmetry/index.js +3 -3
  111. package/dist/table/HeatmapTable.svelte +3 -3
  112. package/dist/table/ToggleMenu.svelte +1 -1
  113. package/dist/trajectory/Trajectory.svelte +2 -2
  114. package/dist/trajectory/TrajectoryInfoPane.svelte +14 -88
  115. package/dist/trajectory/extract.js +4 -4
  116. package/dist/trajectory/frame-reader.js +2 -2
  117. package/dist/trajectory/parse/ase.js +2 -6
  118. package/dist/trajectory/parse/hdf5.js +1 -3
  119. package/dist/trajectory/plotting.js +1 -1
  120. package/dist/utils.js +1 -1
  121. package/dist/xrd/calc-xrd.js +1 -1
  122. package/package.json +23 -38
  123. package/dist/structure/ferrox-wasm-types.d.ts +0 -46
  124. package/dist/structure/ferrox-wasm-types.js +0 -18
  125. package/dist/structure/ferrox-wasm.d.ts +0 -94
  126. package/dist/structure/ferrox-wasm.js +0 -249
@@ -112,21 +112,91 @@
112
112
  }
113
113
  })
114
114
 
115
+ const hex_color_pattern = /^#[0-9a-f]{3}([0-9a-f]{3})?$/i
116
+ const color_mix_pattern =
117
+ /^color-mix\(in srgb,\s*(#[0-9a-f]{3}(?:[0-9a-f]{3})?)\s+(\d+(?:\.\d+)?)%,\s*transparent\)$/i
118
+
119
+ const as_hex_color = (color: string | undefined, fallback: string): string =>
120
+ color?.match(hex_color_pattern)?.[0] ?? fallback
121
+
122
+ const parse_label_bg_color = (
123
+ color: string | undefined,
124
+ fallback_hex_color: string,
125
+ fallback_opacity: number,
126
+ ): { hex_color: string; opacity: number } => {
127
+ if (color === `transparent`) {
128
+ return { hex_color: fallback_hex_color, opacity: 0 }
129
+ }
130
+ const color_mix = color?.match(color_mix_pattern)
131
+ if (color_mix) {
132
+ const percentage = Math.max(0, Math.min(100, Number(color_mix[2])))
133
+ return {
134
+ hex_color: color_mix[1],
135
+ opacity: percentage / 100,
136
+ }
137
+ }
138
+ const hex_color = color?.match(hex_color_pattern)?.[0]
139
+ return hex_color === undefined
140
+ ? { hex_color: fallback_hex_color, opacity: fallback_opacity }
141
+ : { hex_color, opacity: 1 }
142
+ }
143
+
144
+ const default_site_label_color = as_hex_color(
145
+ DEFAULTS.structure.site_label_color,
146
+ `#111111`,
147
+ )
148
+ const default_site_label_bg = parse_label_bg_color(
149
+ DEFAULTS.structure.site_label_bg_color,
150
+ `#000000`,
151
+ 0,
152
+ )
153
+ const initial_site_label_bg = parse_label_bg_color(
154
+ scene_props.site_label_bg_color,
155
+ default_site_label_bg.hex_color,
156
+ default_site_label_bg.opacity,
157
+ )
158
+
115
159
  // Atom label color management
116
160
  let site_label_hex_color = $state(
117
- scene_props.site_label_color || DEFAULTS.structure.site_label_color,
118
- )
119
- let site_label_bg_hex_color = $state(
120
- scene_props.site_label_bg_color || DEFAULTS.structure.site_label_bg_color,
161
+ as_hex_color(scene_props.site_label_color, default_site_label_color),
121
162
  )
122
- let site_label_background_opacity = $state(0)
163
+ let site_label_bg_hex_color = $state(initial_site_label_bg.hex_color)
164
+ let site_label_background_opacity = $state(initial_site_label_bg.opacity)
165
+ let last_synced_site_label_color = scene_props.site_label_color
166
+ let last_synced_site_label_bg_color = scene_props.site_label_bg_color
123
167
 
124
168
  $effect(() => {
125
- scene_props.site_label_color = site_label_hex_color
126
- scene_props.site_label_bg_color =
127
- `color-mix(in srgb, ${site_label_bg_hex_color} ${
128
- format_num(site_label_background_opacity, `.1~%`)
129
- }, transparent)`
169
+ const external_color_changed =
170
+ scene_props.site_label_color !== last_synced_site_label_color
171
+ const external_bg_changed =
172
+ scene_props.site_label_bg_color !== last_synced_site_label_bg_color
173
+
174
+ if (external_color_changed) {
175
+ site_label_hex_color = as_hex_color(
176
+ scene_props.site_label_color,
177
+ default_site_label_color,
178
+ )
179
+ }
180
+ if (external_bg_changed) {
181
+ const next_bg = parse_label_bg_color(
182
+ scene_props.site_label_bg_color,
183
+ default_site_label_bg.hex_color,
184
+ default_site_label_bg.opacity,
185
+ )
186
+ site_label_bg_hex_color = next_bg.hex_color
187
+ site_label_background_opacity = next_bg.opacity
188
+ }
189
+
190
+ if (!external_color_changed) scene_props.site_label_color = site_label_hex_color
191
+ if (!external_bg_changed) {
192
+ scene_props.site_label_bg_color =
193
+ `color-mix(in srgb, ${site_label_bg_hex_color} ${
194
+ format_num(site_label_background_opacity, `.1~%`)
195
+ }, transparent)`
196
+ }
197
+
198
+ last_synced_site_label_color = scene_props.site_label_color
199
+ last_synced_site_label_bg_color = scene_props.site_label_bg_color
130
200
  })
131
201
 
132
202
  // Ensure site_label_offset is always available
@@ -638,15 +708,19 @@
638
708
  scene_props.site_label_size = DEFAULTS.structure.site_label_size
639
709
  scene_props.site_label_padding = DEFAULTS.structure.site_label_padding
640
710
  scene_props.site_label_offset = [...DEFAULTS.structure.site_label_offset]
641
- site_label_hex_color = DEFAULTS.structure.site_label_color
642
- site_label_bg_hex_color = DEFAULTS.structure.site_label_bg_color
643
- site_label_background_opacity = 0
711
+ site_label_hex_color = default_site_label_color
712
+ site_label_bg_hex_color = default_site_label_bg.hex_color
713
+ site_label_background_opacity = default_site_label_bg.opacity
644
714
  }}
645
715
  >
646
716
  <div class="pane-row">
647
717
  <label>
648
718
  Color
649
- <input type="color" bind:value={site_label_hex_color} />
719
+ <input
720
+ type="color"
721
+ aria-label="Site label color"
722
+ bind:value={site_label_hex_color}
723
+ />
650
724
  </label>
651
725
  <label>
652
726
  Size
@@ -662,7 +736,11 @@
662
736
  <div class="pane-row">
663
737
  <label>
664
738
  Background
665
- <input type="color" bind:value={site_label_bg_hex_color} />
739
+ <input
740
+ type="color"
741
+ aria-label="Site label background color"
742
+ bind:value={site_label_bg_hex_color}
743
+ />
666
744
  </label>
667
745
  <label>
668
746
  Opacity
@@ -671,6 +749,7 @@
671
749
  min="0"
672
750
  max="1"
673
751
  step="0.01"
752
+ aria-label="Site label background opacity"
674
753
  bind:value={site_label_background_opacity}
675
754
  />
676
755
  <input
@@ -678,6 +757,7 @@
678
757
  min="0"
679
758
  max="1"
680
759
  step="0.01"
760
+ aria-label="Site label background opacity slider"
681
761
  bind:value={site_label_background_opacity}
682
762
  />
683
763
  </label>
@@ -938,7 +1018,10 @@
938
1018
  {/if}
939
1019
 
940
1020
  {#if !supercell_input_valid}
941
- <div style="color: red; font-size: 0.8em; margin-top: 4pt">
1021
+ <div
1022
+ data-testid="supercell-input-error"
1023
+ style="color: red; font-size: 0.8em; margin-top: 4pt"
1024
+ >
942
1025
  Invalid format. Use patterns like "2x2x2", "3x1x2", or "2".
943
1026
  </div>
944
1027
  {/if}
@@ -1083,11 +1166,15 @@
1083
1166
  title="Bonds"
1084
1167
  current_values={{
1085
1168
  bonding_strategy: scene_props.bonding_strategy,
1169
+ auto_bond_order: scene_props.auto_bond_order,
1170
+ aromatic_display: scene_props.aromatic_display,
1086
1171
  bond_color: scene_props.bond_color,
1087
1172
  bond_thickness: scene_props.bond_thickness,
1088
1173
  }}
1089
1174
  on_reset={() => {
1090
1175
  scene_props.bonding_strategy = DEFAULTS.structure.bonding_strategy
1176
+ scene_props.auto_bond_order = DEFAULTS.structure.auto_bond_order
1177
+ scene_props.aromatic_display = DEFAULTS.structure.aromatic_display
1091
1178
  scene_props.bond_color = DEFAULTS.structure.bond_color
1092
1179
  scene_props.bond_thickness = DEFAULTS.structure.bond_thickness
1093
1180
  }}
@@ -1104,6 +1191,33 @@
1104
1191
  {/each}
1105
1192
  </select>
1106
1193
  </label>
1194
+ <label
1195
+ style="gap: 6pt"
1196
+ {@attach tooltip({
1197
+ content: SETTINGS_CONFIG.structure.auto_bond_order.description,
1198
+ })}
1199
+ >
1200
+ <input type="checkbox" bind:checked={scene_props.auto_bond_order} />
1201
+ Auto bond order (perceive double/triple/aromatic)
1202
+ </label>
1203
+ {#if scene_props.auto_bond_order}
1204
+ <label
1205
+ {@attach tooltip({
1206
+ content: SETTINGS_CONFIG.structure.aromatic_display.description,
1207
+ })}
1208
+ >
1209
+ Aromatic display <select bind:value={scene_props.aromatic_display}>
1210
+ {#each Object.entries(
1211
+ SETTINGS_CONFIG.structure.aromatic_display.enum ?? {},
1212
+ ) as
1213
+ [value, label]
1214
+ (value)
1215
+ }
1216
+ <option {value}>{label}</option>
1217
+ {/each}
1218
+ </select>
1219
+ </label>
1220
+ {/if}
1107
1221
  <label>
1108
1222
  Color <input type="color" bind:value={scene_props.bond_color} />
1109
1223
  </label>
@@ -26,6 +26,6 @@ type $$ComponentProps = Omit<ComponentProps<typeof DraggablePane>, `children`> &
26
26
  pane_props?: ComponentProps<typeof DraggablePane>[`pane_props`];
27
27
  toggle_props?: ComponentProps<typeof DraggablePane>[`toggle_props`];
28
28
  };
29
- declare const StructureControls: import("svelte").Component<$$ComponentProps, {}, "controls_open" | "color_scheme" | "background_color" | "background_opacity" | "show_image_atoms" | "atom_color_config" | "supercell_scaling" | "cell_type" | "active_volume_idx" | "scene_props" | "lattice_props" | "supercell_loading" | "volumetric_data" | "isosurface_settings">;
29
+ declare const StructureControls: import("svelte").Component<$$ComponentProps, {}, "controls_open" | "color_scheme" | "background_color" | "background_opacity" | "show_image_atoms" | "atom_color_config" | "lattice_props" | "volumetric_data" | "isosurface_settings" | "supercell_scaling" | "cell_type" | "active_volume_idx" | "scene_props" | "supercell_loading">;
30
30
  type StructureControls = ReturnType<typeof StructureControls>;
31
31
  export default StructureControls;