matterviz 0.1.0

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 (131) hide show
  1. package/dist/BohrAtom.svelte +105 -0
  2. package/dist/BohrAtom.svelte.d.ts +21 -0
  3. package/dist/ControlPanel.svelte +158 -0
  4. package/dist/ControlPanel.svelte.d.ts +18 -0
  5. package/dist/Icon.svelte +23 -0
  6. package/dist/Icon.svelte.d.ts +8 -0
  7. package/dist/InfoCard.svelte +79 -0
  8. package/dist/InfoCard.svelte.d.ts +23 -0
  9. package/dist/Nucleus.svelte +64 -0
  10. package/dist/Nucleus.svelte.d.ts +16 -0
  11. package/dist/Spinner.svelte +44 -0
  12. package/dist/Spinner.svelte.d.ts +7 -0
  13. package/dist/api.d.ts +6 -0
  14. package/dist/api.js +30 -0
  15. package/dist/colors/alloy-colors.json +111 -0
  16. package/dist/colors/dark-mode-colors.json +111 -0
  17. package/dist/colors/index.d.ts +26 -0
  18. package/dist/colors/index.js +72 -0
  19. package/dist/colors/jmol-colors.json +111 -0
  20. package/dist/colors/muted-colors.json +111 -0
  21. package/dist/colors/pastel-colors.json +111 -0
  22. package/dist/colors/vesta-colors.json +111 -0
  23. package/dist/composition/BarChart.svelte +260 -0
  24. package/dist/composition/BarChart.svelte.d.ts +33 -0
  25. package/dist/composition/BubbleChart.svelte +166 -0
  26. package/dist/composition/BubbleChart.svelte.d.ts +30 -0
  27. package/dist/composition/Composition.svelte +73 -0
  28. package/dist/composition/Composition.svelte.d.ts +27 -0
  29. package/dist/composition/PieChart.svelte +236 -0
  30. package/dist/composition/PieChart.svelte.d.ts +36 -0
  31. package/dist/composition/index.d.ts +5 -0
  32. package/dist/composition/index.js +5 -0
  33. package/dist/composition/parse.d.ts +14 -0
  34. package/dist/composition/parse.js +307 -0
  35. package/dist/element/ElementHeading.svelte +21 -0
  36. package/dist/element/ElementHeading.svelte.d.ts +8 -0
  37. package/dist/element/ElementPhoto.svelte +56 -0
  38. package/dist/element/ElementPhoto.svelte.d.ts +9 -0
  39. package/dist/element/ElementStats.svelte +73 -0
  40. package/dist/element/ElementStats.svelte.d.ts +8 -0
  41. package/dist/element/ElementTile.svelte +449 -0
  42. package/dist/element/ElementTile.svelte.d.ts +25 -0
  43. package/dist/element/data.d.ts +4958 -0
  44. package/dist/element/data.js +5628 -0
  45. package/dist/element/index.d.ts +4 -0
  46. package/dist/element/index.js +4 -0
  47. package/dist/icons.d.ts +435 -0
  48. package/dist/icons.js +435 -0
  49. package/dist/index.d.ts +82 -0
  50. package/dist/index.js +43 -0
  51. package/dist/io/decompress.d.ts +16 -0
  52. package/dist/io/decompress.js +78 -0
  53. package/dist/io/export.d.ts +9 -0
  54. package/dist/io/export.js +205 -0
  55. package/dist/io/parse.d.ts +53 -0
  56. package/dist/io/parse.js +747 -0
  57. package/dist/labels.d.ts +31 -0
  58. package/dist/labels.js +209 -0
  59. package/dist/material/MaterialCard.svelte +135 -0
  60. package/dist/material/MaterialCard.svelte.d.ts +10 -0
  61. package/dist/material/SymmetryCard.svelte +23 -0
  62. package/dist/material/SymmetryCard.svelte.d.ts +9 -0
  63. package/dist/material/index.d.ts +2 -0
  64. package/dist/material/index.js +2 -0
  65. package/dist/math.d.ts +24 -0
  66. package/dist/math.js +216 -0
  67. package/dist/periodic-table/PeriodicTable.svelte +284 -0
  68. package/dist/periodic-table/PeriodicTable.svelte.d.ts +50 -0
  69. package/dist/periodic-table/PropertySelect.svelte +20 -0
  70. package/dist/periodic-table/PropertySelect.svelte.d.ts +13 -0
  71. package/dist/periodic-table/TableInset.svelte +18 -0
  72. package/dist/periodic-table/TableInset.svelte.d.ts +9 -0
  73. package/dist/periodic-table/index.d.ts +9 -0
  74. package/dist/periodic-table/index.js +3 -0
  75. package/dist/plot/ColorBar.svelte +414 -0
  76. package/dist/plot/ColorBar.svelte.d.ts +22 -0
  77. package/dist/plot/ColorScaleSelect.svelte +31 -0
  78. package/dist/plot/ColorScaleSelect.svelte.d.ts +15 -0
  79. package/dist/plot/ElementScatter.svelte +38 -0
  80. package/dist/plot/ElementScatter.svelte.d.ts +14 -0
  81. package/dist/plot/Line.svelte +42 -0
  82. package/dist/plot/Line.svelte.d.ts +15 -0
  83. package/dist/plot/PlotLegend.svelte +206 -0
  84. package/dist/plot/PlotLegend.svelte.d.ts +18 -0
  85. package/dist/plot/ScatterPlot.svelte +1753 -0
  86. package/dist/plot/ScatterPlot.svelte.d.ts +114 -0
  87. package/dist/plot/ScatterPlotControls.svelte +505 -0
  88. package/dist/plot/ScatterPlotControls.svelte.d.ts +33 -0
  89. package/dist/plot/ScatterPoint.svelte +72 -0
  90. package/dist/plot/ScatterPoint.svelte.d.ts +17 -0
  91. package/dist/plot/index.d.ts +168 -0
  92. package/dist/plot/index.js +46 -0
  93. package/dist/state.svelte.d.ts +12 -0
  94. package/dist/state.svelte.js +11 -0
  95. package/dist/structure/Bond.svelte +68 -0
  96. package/dist/structure/Bond.svelte.d.ts +13 -0
  97. package/dist/structure/Lattice.svelte +115 -0
  98. package/dist/structure/Lattice.svelte.d.ts +15 -0
  99. package/dist/structure/Structure.svelte +298 -0
  100. package/dist/structure/Structure.svelte.d.ts +28 -0
  101. package/dist/structure/StructureCard.svelte +26 -0
  102. package/dist/structure/StructureCard.svelte.d.ts +9 -0
  103. package/dist/structure/StructureControls.svelte +383 -0
  104. package/dist/structure/StructureControls.svelte.d.ts +23 -0
  105. package/dist/structure/StructureLegend.svelte +130 -0
  106. package/dist/structure/StructureLegend.svelte.d.ts +17 -0
  107. package/dist/structure/StructureScene.svelte +331 -0
  108. package/dist/structure/StructureScene.svelte.d.ts +47 -0
  109. package/dist/structure/bonding.d.ts +16 -0
  110. package/dist/structure/bonding.js +150 -0
  111. package/dist/structure/index.d.ts +98 -0
  112. package/dist/structure/index.js +114 -0
  113. package/dist/structure/pbc.d.ts +6 -0
  114. package/dist/structure/pbc.js +72 -0
  115. package/dist/trajectory/Sidebar.svelte +412 -0
  116. package/dist/trajectory/Sidebar.svelte.d.ts +14 -0
  117. package/dist/trajectory/Trajectory.svelte +1084 -0
  118. package/dist/trajectory/Trajectory.svelte.d.ts +49 -0
  119. package/dist/trajectory/TrajectoryError.svelte +120 -0
  120. package/dist/trajectory/TrajectoryError.svelte.d.ts +12 -0
  121. package/dist/trajectory/extract.d.ts +5 -0
  122. package/dist/trajectory/extract.js +157 -0
  123. package/dist/trajectory/index.d.ts +16 -0
  124. package/dist/trajectory/index.js +49 -0
  125. package/dist/trajectory/parse.d.ts +13 -0
  126. package/dist/trajectory/parse.js +1093 -0
  127. package/dist/trajectory/plotting.d.ts +12 -0
  128. package/dist/trajectory/plotting.js +148 -0
  129. package/license +21 -0
  130. package/package.json +131 -0
  131. package/readme.md +95 -0
@@ -0,0 +1,206 @@
1
+ <script lang="ts">import { onDestroy } from 'svelte';
2
+ let { series_data = [], layout = `vertical`, layout_tracks = 1, // Default to 1 column/row
3
+ wrapper_style = ``, item_style = ``, on_toggle = () => { }, on_double_click = () => { }, on_drag_start = () => { }, on_drag = () => { }, on_drag_end = () => { }, draggable = true, ...rest } = $props();
4
+ let is_dragging = $state(false);
5
+ let drag_start_coords = $state(null);
6
+ // Cleanup function prevents memory leaks on component destroy (remove event listeners and reset styles)
7
+ function cleanup_drag_listeners() {
8
+ if (is_dragging) {
9
+ // Remove global event listeners
10
+ window.removeEventListener(`mousemove`, handle_window_mouse_move);
11
+ window.removeEventListener(`mouseup`, handle_window_mouse_up);
12
+ // Reset cursor and text selection
13
+ document.body.style.cursor = `default`;
14
+ document.body.style.userSelect = `auto`;
15
+ }
16
+ }
17
+ onDestroy(cleanup_drag_listeners);
18
+ function handle_click(event, series_idx) {
19
+ event.preventDefault(); // Prevent any default browser behavior
20
+ event.stopPropagation(); // Prevent event bubbling to SVG
21
+ on_toggle(series_idx);
22
+ }
23
+ function handle_double_click(event, series_idx) {
24
+ event.preventDefault();
25
+ event.stopPropagation();
26
+ on_double_click(series_idx);
27
+ }
28
+ function handle_legend_mouse_down(event) {
29
+ if (!draggable)
30
+ return;
31
+ // Only start drag if clicking on empty areas (not on legend items)
32
+ const target = event.target;
33
+ if (target.closest(`.legend-item`))
34
+ return;
35
+ event.preventDefault();
36
+ event.stopPropagation();
37
+ is_dragging = true;
38
+ drag_start_coords = { x: event.clientX, y: event.clientY };
39
+ on_drag_start(event);
40
+ // Add global event listeners
41
+ window.addEventListener(`mousemove`, handle_window_mouse_move);
42
+ window.addEventListener(`mouseup`, handle_window_mouse_up);
43
+ }
44
+ function handle_window_mouse_move(event) {
45
+ if (!is_dragging || !drag_start_coords)
46
+ return;
47
+ event.preventDefault();
48
+ on_drag(event);
49
+ }
50
+ function handle_window_mouse_up(event) {
51
+ if (!is_dragging)
52
+ return;
53
+ is_dragging = false;
54
+ drag_start_coords = null;
55
+ on_drag_end(event);
56
+ // Remove global event listeners
57
+ window.removeEventListener(`mousemove`, handle_window_mouse_move);
58
+ window.removeEventListener(`mouseup`, handle_window_mouse_up);
59
+ }
60
+ let div_style = $derived({
61
+ horizontal: `grid-template-columns: repeat(${layout_tracks}, auto);`,
62
+ vertical: `grid-template-rows: repeat(${layout_tracks}, auto); grid-template-columns: auto;`,
63
+ }[layout] + wrapper_style);
64
+ </script>
65
+
66
+ <div
67
+ class="legend {draggable ? `draggable` : ``} {is_dragging ? `is-dragging` : ``}"
68
+ style={div_style}
69
+ onmousedown={handle_legend_mouse_down}
70
+ {...rest}
71
+ >
72
+ {#each series_data as series (series.series_idx)}
73
+ <div
74
+ class="legend-item {series.visible ? `` : `hidden`}"
75
+ style={item_style}
76
+ onclick={(event) => handle_click(event, series.series_idx)}
77
+ ondblclick={(event) => handle_double_click(event, series.series_idx)}
78
+ onkeydown={(event) => {
79
+ if (event.key === `Enter` || event.key === ` `) {
80
+ event.preventDefault()
81
+ on_toggle(series.series_idx)
82
+ }
83
+ }}
84
+ role="button"
85
+ tabindex="0"
86
+ aria-pressed={series.visible}
87
+ aria-label="Toggle visibility for {series.label}"
88
+ >
89
+ <span class="legend-marker">
90
+ <!-- Line segment -->
91
+ {#if series.display_style.line_color}
92
+ <svg width="20" height="10" viewBox="0 0 20 10">
93
+ <line
94
+ x1="0"
95
+ y1="5"
96
+ x2="20"
97
+ y2="5"
98
+ stroke={series.display_style.line_color ?? `currentColor`}
99
+ stroke-width="2"
100
+ stroke-dasharray={series.display_style.line_dash ?? `none`}
101
+ />
102
+ </svg>
103
+ {/if}
104
+
105
+ <!-- Marker symbol -->
106
+ {#if series.display_style.symbol_type}
107
+ <svg width="10" height="10" viewBox="0 0 10 10">
108
+ {#if series.display_style.symbol_type === `Circle`}
109
+ <circle
110
+ cx="5"
111
+ cy="5"
112
+ r="4"
113
+ fill={series.display_style.symbol_color ?? `currentColor`}
114
+ />
115
+ {:else if series.display_style.symbol_type === `Square`}
116
+ <rect
117
+ x="1"
118
+ y="1"
119
+ width="8"
120
+ height="8"
121
+ fill={series.display_style.symbol_color ?? `currentColor`}
122
+ />
123
+ {:else if series.display_style.symbol_type === `Triangle`}
124
+ <polygon
125
+ points="5,1 9,9 1,9"
126
+ fill={series.display_style.symbol_color ?? `currentColor`}
127
+ />
128
+ {:else if series.display_style.symbol_type === `Cross`}
129
+ <path
130
+ d="M2 2 L8 8 M2 8 L8 2"
131
+ stroke={series.display_style.symbol_color ?? `currentColor`}
132
+ stroke-width="2"
133
+ fill="none"
134
+ />
135
+ {:else if series.display_style.symbol_type === `Star`}
136
+ <polygon
137
+ points="5,0 6.1,3.5 9.8,4.1 7.4,6.7 7.9,10 5,8.3 2.1,10 2.6,6.7 0.2,4.1 3.9,3.5"
138
+ fill={series.display_style.symbol_color ?? `currentColor`}
139
+ />
140
+ {/if}
141
+ </svg>
142
+ {/if}
143
+ </span>
144
+ <span class="legend-label">{@html series.label}</span>
145
+ </div>
146
+ {/each}
147
+ </div>
148
+
149
+ <style>
150
+ .legend {
151
+ display: grid;
152
+ gap: 1px 6px; /* row-gap column-gap */
153
+ background-color: var(--plot-legend-background-color, rgba(0, 0, 0, 0.2));
154
+ border: var(--plot-legend-border, 1px solid rgba(255, 255, 255, 0.2));
155
+ border-radius: var(--plot-legend-border-radius, 3px);
156
+ font-size: var(--plot-legend-font-size, 0.8em);
157
+ max-width: var(--plot-legend-max-width);
158
+ z-index: var(--plot-legend-z-index, 2);
159
+ box-sizing: border-box;
160
+ }
161
+ .legend.draggable {
162
+ cursor: grab;
163
+ }
164
+ .legend.draggable:active {
165
+ cursor: grabbing;
166
+ }
167
+ .legend.is-dragging {
168
+ cursor: move;
169
+ user-select: none;
170
+ }
171
+ .legend-item {
172
+ display: flex;
173
+ align-items: center;
174
+ cursor: pointer;
175
+ white-space: nowrap;
176
+ padding: var(--plot-legend-item-padding, 3px 6px);
177
+ opacity: var(--plot-legend-item-opacity, 1);
178
+ transition: var(--plot-legend-item-transition, opacity 0.3s ease);
179
+ color: var(--plot-legend-item-color, inherit);
180
+ }
181
+ .legend-item.hidden {
182
+ opacity: var(--plot-legend-item-hidden-opacity, 0.5);
183
+ }
184
+ .legend-item:hover,
185
+ .legend-item:focus {
186
+ background-color: var(
187
+ --plot-legend-item-hover-background-color,
188
+ rgba(255, 255, 255, 0.1)
189
+ );
190
+ }
191
+ .legend-marker {
192
+ display: inline-flex; /* Use flex to align items */
193
+ align-items: center; /* Vertically center items */
194
+ justify-content: center; /* Horizontally center items */
195
+ width: var(--plot-legend-marker-width, 25px); /* Fixed width for alignment */
196
+ margin: var(--plot-legend-marker-margin, 0 3px 0 0);
197
+ /* Prevent extra space from svg */
198
+ line-height: var(--plot-legend-marker-line-height, 0);
199
+ }
200
+ .legend-marker svg {
201
+ vertical-align: middle;
202
+ }
203
+ .legend-label {
204
+ display: inline-block;
205
+ }
206
+ </style>
@@ -0,0 +1,18 @@
1
+ import type { LegendItem } from './';
2
+ interface Props {
3
+ series_data: LegendItem[];
4
+ layout?: `horizontal` | `vertical`;
5
+ layout_tracks?: number;
6
+ wrapper_style?: string;
7
+ item_style?: string;
8
+ on_toggle?: (series_idx: number) => void;
9
+ on_double_click?: (series_idx: number) => void;
10
+ on_drag_start?: (event: MouseEvent) => void;
11
+ on_drag?: (event: MouseEvent) => void;
12
+ on_drag_end?: (event: MouseEvent) => void;
13
+ draggable?: boolean;
14
+ [key: string]: unknown;
15
+ }
16
+ declare const PlotLegend: import("svelte").Component<Props, {}, "">;
17
+ type PlotLegend = ReturnType<typeof PlotLegend>;
18
+ export default PlotLegend;