matterviz 0.3.2 → 0.3.4

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 (281) 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/element/data.js +1 -1
  76. package/dist/feedback/ClickFeedback.svelte +16 -5
  77. package/dist/feedback/DragOverlay.svelte +10 -2
  78. package/dist/feedback/Spinner.svelte +4 -2
  79. package/dist/feedback/StatusMessage.svelte +8 -2
  80. package/dist/fermi-surface/FermiSlice.svelte +118 -88
  81. package/dist/fermi-surface/FermiSurface.svelte +328 -187
  82. package/dist/fermi-surface/FermiSurface.svelte.d.ts +1 -1
  83. package/dist/fermi-surface/FermiSurfaceControls.svelte +113 -46
  84. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  85. package/dist/fermi-surface/FermiSurfaceScene.svelte +535 -342
  86. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  87. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +14 -5
  88. package/dist/fermi-surface/compute.js +16 -20
  89. package/dist/fermi-surface/parse.js +24 -14
  90. package/dist/fermi-surface/symmetry.js +2 -7
  91. package/dist/fermi-surface/types.d.ts +3 -5
  92. package/dist/heatmap-matrix/HeatmapMatrix.svelte +1019 -765
  93. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +1 -1
  94. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +76 -22
  95. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +2 -3
  96. package/dist/icons.js +47 -0
  97. package/dist/index.d.ts +2 -1
  98. package/dist/index.js +2 -1
  99. package/dist/io/decompress.js +1 -1
  100. package/dist/io/export.d.ts +3 -0
  101. package/dist/io/export.js +129 -143
  102. package/dist/io/is-binary.js +2 -3
  103. package/dist/io/url-drop.js +1 -2
  104. package/dist/isosurface/Isosurface.svelte +202 -148
  105. package/dist/isosurface/IsosurfaceControls.svelte +46 -28
  106. package/dist/isosurface/parse.js +34 -29
  107. package/dist/isosurface/slice.js +5 -10
  108. package/dist/isosurface/types.d.ts +2 -1
  109. package/dist/isosurface/types.js +61 -12
  110. package/dist/labels.js +11 -8
  111. package/dist/layout/FullscreenToggle.svelte +11 -2
  112. package/dist/layout/InfoCard.svelte +38 -6
  113. package/dist/layout/InfoTag.svelte +63 -32
  114. package/dist/layout/PropertyFilter.svelte +82 -37
  115. package/dist/layout/SettingsSection.svelte +85 -55
  116. package/dist/layout/SubpageGrid.svelte +10 -2
  117. package/dist/layout/json-tree/JsonNode.svelte +183 -138
  118. package/dist/layout/json-tree/JsonTree.svelte +499 -413
  119. package/dist/layout/json-tree/JsonValue.svelte +127 -99
  120. package/dist/layout/json-tree/utils.js +4 -2
  121. package/dist/marching-cubes.js +25 -2
  122. package/dist/math.d.ts +13 -17
  123. package/dist/math.js +133 -67
  124. package/dist/overlays/ContextMenu.svelte +65 -40
  125. package/dist/overlays/DraggablePane.svelte +211 -139
  126. package/dist/periodic-table/PeriodicTable.svelte +278 -145
  127. package/dist/periodic-table/PeriodicTableControls.svelte +178 -128
  128. package/dist/periodic-table/PropertySelect.svelte +25 -7
  129. package/dist/periodic-table/TableInset.svelte +8 -3
  130. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +446 -309
  131. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +1 -1
  132. package/dist/phase-diagram/PhaseDiagramControls.svelte +102 -43
  133. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
  134. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +63 -40
  135. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +71 -28
  136. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +1 -1
  137. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +158 -101
  138. package/dist/phase-diagram/TdbInfoPanel.svelte +28 -4
  139. package/dist/phase-diagram/build-diagram.js +9 -9
  140. package/dist/phase-diagram/colors.js +1 -3
  141. package/dist/phase-diagram/parse.js +10 -9
  142. package/dist/phase-diagram/svg-to-diagram.js +53 -49
  143. package/dist/phase-diagram/utils.d.ts +1 -0
  144. package/dist/phase-diagram/utils.js +80 -25
  145. package/dist/plot/AxisLabel.svelte +28 -3
  146. package/dist/plot/BarPlot.svelte +1182 -734
  147. package/dist/plot/BarPlot.svelte.d.ts +2 -2
  148. package/dist/plot/BarPlotControls.svelte +31 -5
  149. package/dist/plot/BarPlotControls.svelte.d.ts +1 -1
  150. package/dist/plot/ColorBar.svelte +479 -329
  151. package/dist/plot/ColorScaleSelect.svelte +27 -6
  152. package/dist/plot/ElementScatter.svelte +36 -15
  153. package/dist/plot/FillArea.svelte +152 -95
  154. package/dist/plot/Histogram.svelte +934 -571
  155. package/dist/plot/Histogram.svelte.d.ts +1 -1
  156. package/dist/plot/HistogramControls.svelte +53 -9
  157. package/dist/plot/HistogramControls.svelte.d.ts +1 -1
  158. package/dist/plot/InteractiveAxisLabel.svelte +34 -11
  159. package/dist/plot/InteractiveAxisLabel.svelte.d.ts +1 -1
  160. package/dist/plot/Line.svelte +63 -28
  161. package/dist/plot/PlotControls.svelte +157 -114
  162. package/dist/plot/PlotControls.svelte.d.ts +1 -1
  163. package/dist/plot/PlotLegend.svelte +174 -91
  164. package/dist/plot/PlotTooltip.svelte +45 -6
  165. package/dist/plot/PortalSelect.svelte +175 -147
  166. package/dist/plot/ReferenceLine.svelte +76 -22
  167. package/dist/plot/ReferenceLine3D.svelte +132 -107
  168. package/dist/plot/ReferencePlane.svelte +146 -121
  169. package/dist/plot/ScatterPlot.svelte +1681 -1091
  170. package/dist/plot/ScatterPlot.svelte.d.ts +2 -2
  171. package/dist/plot/ScatterPlot3D.svelte +256 -131
  172. package/dist/plot/ScatterPlot3D.svelte.d.ts +2 -2
  173. package/dist/plot/ScatterPlot3DControls.svelte +113 -63
  174. package/dist/plot/ScatterPlot3DControls.svelte.d.ts +2 -1
  175. package/dist/plot/ScatterPlot3DScene.svelte +608 -403
  176. package/dist/plot/ScatterPlot3DScene.svelte.d.ts +2 -2
  177. package/dist/plot/ScatterPlotControls.svelte +65 -25
  178. package/dist/plot/ScatterPlotControls.svelte.d.ts +1 -1
  179. package/dist/plot/ScatterPoint.svelte +98 -26
  180. package/dist/plot/ScatterPoint.svelte.d.ts +1 -0
  181. package/dist/plot/SpacegroupBarPlot.svelte +142 -85
  182. package/dist/plot/Surface3D.svelte +159 -108
  183. package/dist/plot/ZeroLines.svelte +55 -3
  184. package/dist/plot/ZoomRect.svelte +4 -2
  185. package/dist/plot/axis-utils.js +1 -3
  186. package/dist/plot/data-cleaning.js +12 -28
  187. package/dist/plot/data-transform.js +2 -1
  188. package/dist/plot/fill-utils.js +2 -0
  189. package/dist/plot/layout.d.ts +4 -1
  190. package/dist/plot/layout.js +33 -14
  191. package/dist/plot/reference-line.d.ts +2 -2
  192. package/dist/plot/reference-line.js +7 -5
  193. package/dist/plot/scales.js +24 -36
  194. package/dist/plot/types.d.ts +11 -23
  195. package/dist/plot/types.js +6 -11
  196. package/dist/plot/utils/label-placement.d.ts +32 -15
  197. package/dist/plot/utils/label-placement.js +227 -66
  198. package/dist/plot/utils/series-visibility.js +2 -3
  199. package/dist/rdf/RdfPlot.svelte +143 -91
  200. package/dist/rdf/calc-rdf.js +4 -5
  201. package/dist/sanitize.d.ts +4 -0
  202. package/dist/sanitize.js +107 -0
  203. package/dist/settings.d.ts +18 -6
  204. package/dist/settings.js +46 -16
  205. package/dist/spectral/Bands.svelte +632 -453
  206. package/dist/spectral/BandsAndDos.svelte +90 -49
  207. package/dist/spectral/BrillouinBandsDos.svelte +151 -93
  208. package/dist/spectral/Dos.svelte +389 -258
  209. package/dist/spectral/helpers.js +55 -43
  210. package/dist/state.svelte.d.ts +1 -1
  211. package/dist/state.svelte.js +3 -2
  212. package/dist/structure/Arrow.svelte +59 -20
  213. package/dist/structure/AtomLegend.svelte +215 -134
  214. package/dist/structure/Bond.svelte +73 -47
  215. package/dist/structure/CanvasTooltip.svelte +10 -2
  216. package/dist/structure/CellSelect.svelte +72 -45
  217. package/dist/structure/Cylinder.svelte +33 -17
  218. package/dist/structure/Lattice.svelte +88 -33
  219. package/dist/structure/Structure.svelte +1063 -797
  220. package/dist/structure/Structure.svelte.d.ts +1 -1
  221. package/dist/structure/StructureControls.svelte +349 -118
  222. package/dist/structure/StructureExportPane.svelte +124 -89
  223. package/dist/structure/StructureExportPane.svelte.d.ts +1 -1
  224. package/dist/structure/StructureInfoPane.svelte +304 -237
  225. package/dist/structure/StructureScene.svelte +879 -443
  226. package/dist/structure/StructureScene.svelte.d.ts +15 -7
  227. package/dist/structure/atom-properties.js +8 -8
  228. package/dist/structure/bonding.js +6 -7
  229. package/dist/structure/export.js +14 -29
  230. package/dist/structure/ferrox-wasm.js +1 -1
  231. package/dist/structure/index.d.ts +13 -3
  232. package/dist/structure/index.js +83 -23
  233. package/dist/structure/measure.d.ts +2 -2
  234. package/dist/structure/measure.js +4 -44
  235. package/dist/structure/parse.js +113 -141
  236. package/dist/structure/partial-occupancy.js +7 -10
  237. package/dist/structure/pbc.d.ts +1 -0
  238. package/dist/structure/pbc.js +16 -6
  239. package/dist/structure/supercell.d.ts +2 -2
  240. package/dist/structure/supercell.js +12 -22
  241. package/dist/structure/validation.js +1 -2
  242. package/dist/symmetry/SymmetryStats.svelte +84 -41
  243. package/dist/symmetry/WyckoffTable.svelte +26 -6
  244. package/dist/symmetry/cell-transform.js +5 -3
  245. package/dist/symmetry/index.js +8 -7
  246. package/dist/symmetry/spacegroups.js +148 -148
  247. package/dist/table/HeatmapTable.svelte +790 -554
  248. package/dist/table/HeatmapTable.svelte.d.ts +1 -1
  249. package/dist/table/ToggleMenu.svelte +125 -92
  250. package/dist/table/index.js +2 -4
  251. package/dist/theme/ThemeControl.svelte +21 -12
  252. package/dist/time.js +4 -1
  253. package/dist/tooltip/TooltipContent.svelte +33 -8
  254. package/dist/trajectory/Trajectory.svelte +758 -558
  255. package/dist/trajectory/TrajectoryError.svelte +14 -3
  256. package/dist/trajectory/TrajectoryExportPane.svelte +137 -83
  257. package/dist/trajectory/TrajectoryInfoPane.svelte +272 -143
  258. package/dist/trajectory/extract.js +10 -26
  259. package/dist/trajectory/format-detect.js +5 -5
  260. package/dist/trajectory/frame-reader.d.ts +1 -1
  261. package/dist/trajectory/frame-reader.js +5 -12
  262. package/dist/trajectory/helpers.d.ts +0 -1
  263. package/dist/trajectory/helpers.js +2 -17
  264. package/dist/trajectory/index.js +14 -12
  265. package/dist/trajectory/parse/ase.js +5 -4
  266. package/dist/trajectory/parse/hdf5.js +26 -18
  267. package/dist/trajectory/parse/index.js +13 -18
  268. package/dist/trajectory/parse/lammps.js +17 -7
  269. package/dist/trajectory/parse/vasp.js +5 -2
  270. package/dist/trajectory/parse/xyz.js +8 -7
  271. package/dist/trajectory/plotting.js +13 -8
  272. package/dist/utils.d.ts +1 -0
  273. package/dist/utils.js +13 -0
  274. package/dist/xrd/XrdPlot.svelte +337 -247
  275. package/dist/xrd/broadening.js +14 -9
  276. package/dist/xrd/calc-xrd.js +12 -18
  277. package/dist/xrd/parse.d.ts +1 -1
  278. package/dist/xrd/parse.js +17 -17
  279. package/package.json +99 -103
  280. package/readme.md +1 -1
  281. /package/dist/theme/{themes.js → themes.mjs} +0 -0
@@ -1,58 +1,85 @@
1
- <script lang="ts">import Icon from '../Icon.svelte';
2
- import Spinner from '../feedback/Spinner.svelte';
3
- import { is_valid_supercell_input } from './supercell';
4
- import { click_outside, tooltip } from 'svelte-multiselect/attachments';
5
- import { fade } from 'svelte/transition';
6
- let { supercell_scaling = $bindable(`1x1x1`), cell_type = $bindable(`original`), sym_data = null, loading = $bindable(false), direction = `down`, align = `right`, } = $props();
7
- let menu_open = $state(false);
8
- let input_value = $state(supercell_scaling);
9
- let input_valid = $derived(is_valid_supercell_input(input_value));
10
- const supercell_presets = [`1x1x1`, `2x2x2`, `3x3x3`, `2x2x1`, `3x3x1`, `2x1x1`];
11
- // Always show all 3 cell types - Prim/Conv disabled without sym_data
12
- const cell_types = [`original`, `primitive`, `conventional`];
13
- const cell_labels = {
1
+ <script lang="ts">
2
+ import Icon from '../Icon.svelte'
3
+ import Spinner from '../feedback/Spinner.svelte'
4
+ import { is_valid_supercell_input } from './supercell'
5
+ import type { CellType } from '../symmetry'
6
+ import type { MoyoDataset } from '@spglib/moyo-wasm'
7
+ import { click_outside, tooltip } from 'svelte-multiselect/attachments'
8
+ import { fade } from 'svelte/transition'
9
+
10
+ let {
11
+ supercell_scaling = $bindable(`1x1x1`),
12
+ cell_type = $bindable(`original`),
13
+ sym_data = null,
14
+ loading = $bindable(false),
15
+ direction = `down`,
16
+ align = `right`,
17
+ }: {
18
+ supercell_scaling: string
19
+ cell_type?: CellType
20
+ sym_data?: MoyoDataset | null
21
+ loading?: boolean
22
+ direction?: `up` | `down`
23
+ align?: `left` | `right`
24
+ } = $props()
25
+
26
+ let menu_open = $state(false)
27
+ let input_value = $state(supercell_scaling)
28
+ let input_valid = $derived(is_valid_supercell_input(input_value))
29
+
30
+ const supercell_presets = [`1x1x1`, `2x2x2`, `3x3x3`, `2x2x1`, `3x3x1`, `2x1x1`]
31
+
32
+ // Always show all 3 cell types - Prim/Conv disabled without sym_data
33
+ const cell_types: CellType[] = [`original`, `primitive`, `conventional`]
34
+ const cell_labels: Record<CellType, string> = {
14
35
  original: `Orig`,
15
36
  primitive: `Prim`,
16
37
  conventional: `Conv`,
17
- };
18
- const cell_tooltips = {
38
+ }
39
+ const cell_tooltips: Record<CellType, string> = {
19
40
  original: `Original unit cell (as provided)`,
20
41
  primitive: `Primitive cell (smallest repeating unit)`,
21
42
  conventional: `Conventional cell (standardized representation)`,
22
- };
23
- const hair_space = `\u200A`;
24
- const format_supercell_label = (supercell_value) => supercell_value.replaceAll(`x`, `${hair_space}x${hair_space}`);
25
- function apply_preset(preset) {
26
- supercell_scaling = preset;
27
- input_value = preset;
28
- menu_open = false;
29
- }
30
- function handle_input_submit() {
43
+ }
44
+ const hair_space = `\u200A`
45
+
46
+ const format_supercell_label = (supercell_value: string): string =>
47
+ supercell_value.replaceAll(`x`, `${hair_space}x${hair_space}`)
48
+
49
+ function apply_preset(preset: string) {
50
+ supercell_scaling = preset
51
+ input_value = preset
52
+ menu_open = false
53
+ }
54
+
55
+ function handle_input_submit() {
31
56
  if (input_valid && input_value !== supercell_scaling) {
32
- supercell_scaling = input_value;
33
- menu_open = false;
57
+ supercell_scaling = input_value
58
+ menu_open = false
34
59
  }
35
- }
36
- function handle_focus_out(event) {
37
- const next_target = event.relatedTarget;
38
- const current_target = event.currentTarget;
39
- if (!(current_target instanceof Node) ||
40
- !(next_target instanceof Node) ||
41
- !current_target.contains(next_target))
42
- menu_open = false;
43
- }
44
- function handle_key_down(event, submit_on_enter = false) {
45
- if (event.key === `Escape`)
46
- menu_open = false;
47
- if (submit_on_enter && event.key === `Enter`)
48
- handle_input_submit();
49
- }
50
- // Sync input value when external prop changes
51
- $effect(() => {
60
+ }
61
+
62
+ function handle_focus_out(event: FocusEvent) {
63
+ const next_target = event.relatedTarget
64
+ const current_target = event.currentTarget
65
+ if (
66
+ !(current_target instanceof Node) ||
67
+ !(next_target instanceof Node) ||
68
+ !current_target.contains(next_target)
69
+ ) menu_open = false
70
+ }
71
+
72
+ function handle_key_down(event: KeyboardEvent, submit_on_enter: boolean = false) {
73
+ if (event.key === `Escape`) menu_open = false
74
+ if (submit_on_enter && event.key === `Enter`) handle_input_submit()
75
+ }
76
+
77
+ // Sync input value when external prop changes
78
+ $effect(() => {
52
79
  if (!menu_open && supercell_scaling && supercell_scaling !== input_value) {
53
- input_value = supercell_scaling;
80
+ input_value = supercell_scaling
54
81
  }
55
- });
82
+ })
56
83
  </script>
57
84
 
58
85
  <div
@@ -1,26 +1,42 @@
1
- <script lang="ts">import { T } from '@threlte/core';
2
- import { Euler, Quaternion, Vector3 } from 'three';
3
- let { from, to, color = `#808080`, thickness = 0.1 } = $props();
4
- let from_vec = $derived(new Vector3(...from));
5
- let to_vec = $derived(new Vector3(...to));
6
- let { position, rotation, height } = $derived(calc_bond(from_vec, to_vec));
7
- function calc_bond(from_vec, to_vec) {
1
+ <script lang="ts">
2
+ import type { Vec3 } from '../math'
3
+ import { T } from '@threlte/core'
4
+ import { Euler, Quaternion, Vector3 } from 'three'
5
+
6
+ let { from, to, color = `#808080`, thickness = 0.1 }: {
7
+ from: Vec3
8
+ to: Vec3
9
+ color?: string
10
+ thickness?: number
11
+ } = $props()
12
+
13
+ let from_vec = $derived(new Vector3(...from))
14
+ let to_vec = $derived(new Vector3(...to))
15
+ let { position, rotation, height } = $derived(calc_bond(from_vec, to_vec))
16
+
17
+ function calc_bond(
18
+ from_vec: Vector3,
19
+ to_vec: Vector3,
20
+ ): { position: Vec3; rotation: Vec3; height: number } {
8
21
  // find the axis of the cylinder
9
- const delta_vec = to_vec.clone().sub(from_vec);
22
+ const delta_vec = to_vec.clone().sub(from_vec)
10
23
  // length of the cylinder
11
- const height = delta_vec.length();
24
+ const height = delta_vec.length()
12
25
  // calculate position (midpoint between from and to)
13
26
  const position = from_vec
14
- .clone()
15
- .add(delta_vec.multiplyScalar(0.5))
16
- .toArray();
27
+ .clone()
28
+ .add(delta_vec.multiplyScalar(0.5))
29
+ .toArray() as Vec3
17
30
  // calculate rotation
18
- const quaternion = new Quaternion().setFromUnitVectors(new Vector3(0, 1, 0), delta_vec.normalize());
19
- const euler = new Euler().setFromQuaternion(quaternion);
20
- const rotation = [euler.x, euler.y, euler.z];
31
+ const quaternion = new Quaternion().setFromUnitVectors(
32
+ new Vector3(0, 1, 0),
33
+ delta_vec.normalize(),
34
+ )
35
+ const euler = new Euler().setFromQuaternion(quaternion)
36
+ const rotation: Vec3 = [euler.x, euler.y, euler.z]
21
37
  // return results
22
- return { height, position, rotation };
23
- }
38
+ return { height, position, rotation }
39
+ }
24
40
  </script>
25
41
 
26
42
  <T.Mesh {position} {rotation} scale={[thickness, height, thickness]}>
@@ -1,43 +1,98 @@
1
1
  <!-- Export default values for use in other components -->
2
- <script lang="ts">import { format_num } from '../labels';
3
- import * as math from '../math';
4
- import { DEFAULTS } from '../settings';
5
- import { CanvasTooltip } from './';
6
- import { T } from '@threlte/core';
7
- import { BoxGeometry, EdgesGeometry, Euler, Matrix4, Quaternion, Vector3, } from 'three';
8
- let { matrix = undefined, cell_edge_color = DEFAULTS.structure.cell_edge_color, cell_surface_color = DEFAULTS.structure.cell_surface_color, cell_edge_width = DEFAULTS.structure.cell_edge_width, cell_edge_opacity = DEFAULTS.structure.cell_edge_opacity, cell_surface_opacity = DEFAULTS.structure.cell_surface_opacity, show_cell_vectors = true, vector_colors = [`red`, `green`, `blue`], vector_origin = [-1, -1, -1], float_fmt = `.2f`, } = $props();
9
- let hovered_idx = $state(null); // track hovered vector
10
- let lattice_center = $derived(matrix
11
- ? math.scale(math.add(...matrix), 0.5)
12
- : [0, 0, 0]);
13
- // Extract line segments from EdgesGeometry for cylinder-based thick lines
14
- function get_edge_segments(edges_geometry) {
15
- const positions = edges_geometry.getAttribute(`position`).array;
16
- const segments = [];
2
+ <script lang="ts">
3
+ import { format_num } from '../labels'
4
+ import type { Vec3 } from '../math'
5
+ import * as math from '../math'
6
+ import { DEFAULTS } from '../settings'
7
+ import { CanvasTooltip } from './'
8
+ import { T } from '@threlte/core'
9
+ import {
10
+ BoxGeometry,
11
+ EdgesGeometry,
12
+ Euler,
13
+ Matrix4,
14
+ Quaternion,
15
+ Vector3,
16
+ } from 'three'
17
+
18
+ let {
19
+ matrix = undefined,
20
+ cell_edge_color = DEFAULTS.structure.cell_edge_color,
21
+ cell_surface_color = DEFAULTS.structure.cell_surface_color,
22
+ cell_edge_width = DEFAULTS.structure.cell_edge_width,
23
+ cell_edge_opacity = DEFAULTS.structure.cell_edge_opacity,
24
+ cell_surface_opacity = DEFAULTS.structure.cell_surface_opacity,
25
+ show_cell_vectors = true,
26
+ vector_colors = [`red`, `green`, `blue`],
27
+ vector_origin = [-1, -1, -1] satisfies Vec3,
28
+ float_fmt = `.2f`,
29
+ }: {
30
+ matrix?: math.Matrix3x3
31
+ cell_edge_color?: string
32
+ cell_surface_color?: string
33
+ cell_edge_width?: number // thickness of the cell edges
34
+ cell_edge_opacity?: number // opacity of the cell edges
35
+ cell_surface_opacity?: number // opacity of the cell surfaces
36
+ show_cell_vectors?: boolean // whether to show the lattice vectors
37
+ vector_colors?: readonly [string, string, string] // lattice vector colors
38
+ vector_origin?: Vec3 // lattice vector origin (all arrows start from this point)
39
+ float_fmt?: string
40
+ } = $props()
41
+
42
+ let hovered_idx = $state<number | null>(null) // track hovered vector
43
+ let lattice_center = $derived(
44
+ matrix
45
+ ? (math.scale(math.add(...matrix), 0.5) satisfies Vec3)
46
+ : ([0, 0, 0] satisfies Vec3),
47
+ )
48
+
49
+ // Extract line segments from EdgesGeometry for cylinder-based thick lines
50
+ function get_edge_segments(edges_geometry: EdgesGeometry): [Vector3, Vector3][] {
51
+ const positions = edges_geometry.getAttribute(`position`).array as Float32Array
52
+ const segments: [Vector3, Vector3][] = []
53
+
17
54
  for (let idx = 0; idx < positions.length; idx += 6) {
18
- const start = new Vector3(positions[idx + 0], positions[idx + 1], positions[idx + 2]);
19
- const end = new Vector3(positions[idx + 3], positions[idx + 4], positions[idx + 5]);
20
- segments.push([start, end]);
55
+ const start = new Vector3(
56
+ positions[idx + 0],
57
+ positions[idx + 1],
58
+ positions[idx + 2],
59
+ )
60
+ const end = new Vector3(
61
+ positions[idx + 3],
62
+ positions[idx + 4],
63
+ positions[idx + 5],
64
+ )
65
+ segments.push([start, end])
21
66
  }
22
- return segments;
23
- }
24
- // Calculate cylinder transform for a line segment
25
- function get_cylinder_transform(start, end) {
26
- const direction = end.clone().sub(start);
27
- const length = direction.length();
28
- const center = start.clone().add(end).multiplyScalar(0.5);
67
+
68
+ return segments
69
+ }
70
+
71
+ // Calculate cylinder transform for a line segment
72
+ function get_cylinder_transform(
73
+ start: Vector3,
74
+ end: Vector3,
75
+ ): { position: Vec3; rotation: Vec3; length: number } {
76
+ const direction = end.clone().sub(start)
77
+ const length = direction.length()
78
+ const center = start.clone().add(end).multiplyScalar(0.5)
79
+
29
80
  if (length === 0) { // Zero-length: no rotation; render a degenerate cylinder
30
- return { position: center.toArray(), rotation: [0, 0, 0], length };
81
+ return { position: center.toArray(), rotation: [0, 0, 0], length }
31
82
  }
32
83
  // Calculate rotation to align cylinder with the line (zero-length guarded above)
33
- const quaternion = new Quaternion().setFromUnitVectors(new Vector3(0, 1, 0), direction.normalize());
34
- const euler = new Euler().setFromQuaternion(quaternion);
84
+ const quaternion = new Quaternion().setFromUnitVectors(
85
+ new Vector3(0, 1, 0),
86
+ direction.normalize(),
87
+ )
88
+ const euler = new Euler().setFromQuaternion(quaternion)
89
+
35
90
  return {
36
- position: center.toArray(),
37
- rotation: euler.toArray().slice(0, 3),
38
- length,
39
- };
40
- }
91
+ position: center.toArray(),
92
+ rotation: euler.toArray().slice(0, 3) as Vec3,
93
+ length,
94
+ }
95
+ }
41
96
  </script>
42
97
 
43
98
  {#if matrix}