matterviz 0.4.0 → 0.4.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 (527) hide show
  1. package/dist/EmptyState.svelte +10 -4
  2. package/dist/FilePicker.svelte +12 -14
  3. package/dist/Icon.svelte +7 -4
  4. package/dist/MillerIndexInput.svelte +2 -2
  5. package/dist/app.css +53 -0
  6. package/dist/brillouin/BrillouinZone.svelte +132 -219
  7. package/dist/brillouin/BrillouinZone.svelte.d.ts +9 -20
  8. package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
  9. package/dist/brillouin/BrillouinZoneExportPane.svelte +47 -96
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  11. package/dist/brillouin/BrillouinZoneInfoPane.svelte +15 -42
  12. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +2 -3
  13. package/dist/brillouin/BrillouinZoneScene.svelte +63 -230
  14. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +3 -23
  15. package/dist/brillouin/ReciprocalVectors.svelte +39 -0
  16. package/dist/brillouin/ReciprocalVectors.svelte.d.ts +9 -0
  17. package/dist/brillouin/compute.d.ts +2 -0
  18. package/dist/brillouin/compute.js +80 -77
  19. package/dist/brillouin/geometry.d.ts +8 -0
  20. package/dist/brillouin/geometry.js +57 -0
  21. package/dist/brillouin/index.d.ts +2 -0
  22. package/dist/brillouin/index.js +2 -0
  23. package/dist/brillouin/types.d.ts +2 -2
  24. package/dist/chempot-diagram/ChemPotDiagram.svelte +33 -38
  25. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +1 -1
  26. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +143 -246
  27. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +4 -1
  28. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +652 -976
  29. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +7 -1
  30. package/dist/chempot-diagram/async-compute.svelte.js +1 -1
  31. package/dist/chempot-diagram/color.d.ts +3 -6
  32. package/dist/chempot-diagram/color.js +5 -5
  33. package/dist/chempot-diagram/compute.d.ts +3 -3
  34. package/dist/chempot-diagram/compute.js +3 -1
  35. package/dist/chempot-diagram/controls-state.svelte.d.ts +10 -0
  36. package/dist/chempot-diagram/controls-state.svelte.js +42 -0
  37. package/dist/chempot-diagram/export.d.ts +47 -0
  38. package/dist/chempot-diagram/export.js +133 -0
  39. package/dist/chempot-diagram/index.d.ts +1 -0
  40. package/dist/chempot-diagram/index.js +1 -0
  41. package/dist/chempot-diagram/pointer.d.ts +0 -10
  42. package/dist/chempot-diagram/pointer.js +4 -4
  43. package/dist/chempot-diagram/types.d.ts +3 -3
  44. package/dist/colors/index.d.ts +0 -4
  45. package/dist/colors/index.js +21 -22
  46. package/dist/composition/BarChart.svelte +37 -31
  47. package/dist/composition/BubbleChart.svelte +17 -17
  48. package/dist/composition/Composition.svelte +7 -11
  49. package/dist/composition/Formula.svelte +18 -25
  50. package/dist/composition/FormulaFilter.svelte +96 -98
  51. package/dist/composition/PieChart.svelte +60 -46
  52. package/dist/composition/chem-sys.js +3 -2
  53. package/dist/composition/format.js +4 -3
  54. package/dist/composition/index.d.ts +2 -0
  55. package/dist/composition/index.js +14 -0
  56. package/dist/composition/parse.d.ts +2 -3
  57. package/dist/composition/parse.js +27 -28
  58. package/dist/constants.js +11 -9
  59. package/dist/controls.d.ts +1 -0
  60. package/dist/controls.js +0 -1
  61. package/dist/convex-hull/ConvexHull.svelte +20 -25
  62. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -4
  63. package/dist/convex-hull/ConvexHull2D.svelte +176 -256
  64. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  65. package/dist/convex-hull/ConvexHull3D.svelte +269 -804
  66. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  67. package/dist/convex-hull/ConvexHull4D.svelte +236 -755
  68. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  69. package/dist/convex-hull/ConvexHullChrome.svelte +264 -0
  70. package/dist/convex-hull/ConvexHullChrome.svelte.d.ts +30 -0
  71. package/dist/convex-hull/ConvexHullControls.svelte +128 -49
  72. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +7 -6
  73. package/dist/convex-hull/ConvexHullInfoPane.svelte +18 -5
  74. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +6 -5
  75. package/dist/convex-hull/ConvexHullStats.svelte +210 -351
  76. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +3 -1
  77. package/dist/convex-hull/ConvexHullTooltip.svelte +16 -14
  78. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +2 -1
  79. package/dist/convex-hull/GasPressureControls.svelte +5 -12
  80. package/dist/convex-hull/StructurePopup.svelte +17 -21
  81. package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
  82. package/dist/convex-hull/TemperatureSlider.svelte +4 -10
  83. package/dist/convex-hull/barycentric-coords.d.ts +2 -4
  84. package/dist/convex-hull/barycentric-coords.js +6 -33
  85. package/dist/convex-hull/canvas-interactions.svelte.d.ts +79 -0
  86. package/dist/convex-hull/canvas-interactions.svelte.js +279 -0
  87. package/dist/convex-hull/helpers.d.ts +47 -17
  88. package/dist/convex-hull/helpers.js +186 -101
  89. package/dist/convex-hull/hull-state.svelte.d.ts +44 -0
  90. package/dist/convex-hull/hull-state.svelte.js +124 -0
  91. package/dist/convex-hull/index.d.ts +9 -7
  92. package/dist/convex-hull/index.js +7 -2
  93. package/dist/convex-hull/thermodynamics.js +109 -937
  94. package/dist/convex-hull/types.d.ts +12 -4
  95. package/dist/convex-hull/types.js +12 -0
  96. package/dist/coordination/CoordinationBarPlot.svelte +41 -43
  97. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  98. package/dist/coordination/calc-coordination.d.ts +1 -1
  99. package/dist/coordination/calc-coordination.js +28 -25
  100. package/dist/element/BohrAtom.svelte +6 -8
  101. package/dist/element/ElementHeading.svelte +4 -1
  102. package/dist/element/ElementPhoto.svelte +11 -9
  103. package/dist/element/ElementStats.svelte +12 -10
  104. package/dist/element/ElementTile.svelte +24 -29
  105. package/dist/element/ElementTile.svelte.d.ts +1 -1
  106. package/dist/element/Nucleus.svelte +4 -2
  107. package/dist/element/data.d.ts +1 -2
  108. package/dist/element/helpers.d.ts +4 -0
  109. package/dist/element/helpers.js +18 -0
  110. package/dist/element/index.d.ts +1 -0
  111. package/dist/element/index.js +3 -0
  112. package/dist/feedback/DragOverlay.svelte +5 -3
  113. package/dist/feedback/DragOverlay.svelte.d.ts +2 -1
  114. package/dist/feedback/StatusMessage.svelte +20 -7
  115. package/dist/fermi-surface/FermiSlice.svelte +21 -18
  116. package/dist/fermi-surface/FermiSurface.svelte +78 -165
  117. package/dist/fermi-surface/FermiSurface.svelte.d.ts +9 -20
  118. package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
  119. package/dist/fermi-surface/FermiSurfaceScene.svelte +93 -272
  120. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +3 -23
  121. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
  122. package/dist/fermi-surface/compute.js +14 -13
  123. package/dist/fermi-surface/export.js +4 -15
  124. package/dist/fermi-surface/index.d.ts +0 -1
  125. package/dist/fermi-surface/index.js +0 -1
  126. package/dist/fermi-surface/parse.d.ts +1 -1
  127. package/dist/fermi-surface/parse.js +84 -97
  128. package/dist/fermi-surface/types.d.ts +2 -2
  129. package/dist/heatmap-matrix/HeatmapMatrix.svelte +161 -185
  130. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +6 -5
  131. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +12 -9
  132. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +5 -5
  133. package/dist/heatmap-matrix/index.d.ts +8 -2
  134. package/dist/icons.d.ts +4 -0
  135. package/dist/icons.js +4 -0
  136. package/dist/index.d.ts +1 -0
  137. package/dist/index.js +1 -0
  138. package/dist/io/ExportPane.svelte +170 -0
  139. package/dist/io/ExportPane.svelte.d.ts +17 -0
  140. package/dist/io/decompress.d.ts +2 -1
  141. package/dist/io/decompress.js +22 -36
  142. package/dist/io/export.d.ts +9 -1
  143. package/dist/io/export.js +37 -29
  144. package/dist/io/fetch.d.ts +2 -4
  145. package/dist/io/fetch.js +0 -11
  146. package/dist/io/file-drop.d.ts +7 -0
  147. package/dist/io/file-drop.js +13 -0
  148. package/dist/io/index.d.ts +1 -0
  149. package/dist/io/index.js +3 -0
  150. package/dist/io/is-binary.d.ts +9 -0
  151. package/dist/io/is-binary.js +45 -1
  152. package/dist/io/types.d.ts +13 -0
  153. package/dist/io/url-drop.js +13 -25
  154. package/dist/isosurface/Isosurface.svelte +17 -23
  155. package/dist/isosurface/IsosurfaceControls.svelte +37 -42
  156. package/dist/isosurface/parse-vaspwave.d.ts +3 -0
  157. package/dist/isosurface/parse-vaspwave.js +138 -0
  158. package/dist/isosurface/parse.js +50 -48
  159. package/dist/labels.d.ts +6 -2
  160. package/dist/labels.js +44 -14
  161. package/dist/layout/FullscreenButton.svelte +34 -0
  162. package/dist/layout/FullscreenButton.svelte.d.ts +10 -0
  163. package/dist/layout/FullscreenToggle.svelte +12 -12
  164. package/dist/layout/InfoCard.svelte +7 -18
  165. package/dist/layout/InfoTag.svelte +1 -3
  166. package/dist/layout/NumberRangeInput.svelte +46 -0
  167. package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
  168. package/dist/layout/PropertyFilter.svelte +2 -6
  169. package/dist/layout/SettingsSection.svelte +21 -17
  170. package/dist/layout/SubpageGrid.svelte +3 -1
  171. package/dist/layout/ViewerChrome.svelte +115 -0
  172. package/dist/layout/ViewerChrome.svelte.d.ts +18 -0
  173. package/dist/layout/fullscreen.d.ts +4 -0
  174. package/dist/layout/fullscreen.js +3 -5
  175. package/dist/layout/fullscreen.svelte.d.ts +8 -0
  176. package/dist/layout/fullscreen.svelte.js +36 -0
  177. package/dist/layout/index.d.ts +4 -0
  178. package/dist/layout/index.js +4 -0
  179. package/dist/layout/json-tree/JsonNode.svelte +8 -11
  180. package/dist/layout/json-tree/JsonTree.svelte +53 -77
  181. package/dist/layout/json-tree/JsonValue.svelte +7 -15
  182. package/dist/layout/json-tree/utils.js +14 -23
  183. package/dist/math.d.ts +9 -3
  184. package/dist/math.js +37 -21
  185. package/dist/overlays/ContextMenu.svelte +4 -2
  186. package/dist/overlays/CopyButton.svelte +11 -5
  187. package/dist/overlays/DragControlTab.svelte +6 -1
  188. package/dist/overlays/DraggablePane.svelte +81 -26
  189. package/dist/overlays/DraggablePane.svelte.d.ts +1 -0
  190. package/dist/overlays/GlassChip.svelte +30 -0
  191. package/dist/overlays/GlassChip.svelte.d.ts +8 -0
  192. package/dist/overlays/InfoPaneCards.svelte +11 -23
  193. package/dist/overlays/index.d.ts +11 -0
  194. package/dist/overlays/index.js +26 -0
  195. package/dist/overlays/portal.d.ts +2 -0
  196. package/dist/overlays/portal.js +14 -0
  197. package/dist/periodic-table/PeriodicTable.svelte +115 -146
  198. package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
  199. package/dist/periodic-table/PeriodicTableControls.svelte +11 -63
  200. package/dist/periodic-table/TableInset.svelte +9 -4
  201. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +50 -71
  202. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
  203. package/dist/phase-diagram/PhaseDiagramControls.svelte +73 -96
  204. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +4 -3
  205. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +4 -2
  206. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +2 -3
  207. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +49 -134
  208. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +3 -4
  209. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
  210. package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
  211. package/dist/phase-diagram/build-diagram.js +3 -3
  212. package/dist/phase-diagram/colors.js +1 -1
  213. package/dist/phase-diagram/diagram-input.d.ts +1 -2
  214. package/dist/phase-diagram/parse.d.ts +2 -1
  215. package/dist/phase-diagram/parse.js +15 -15
  216. package/dist/phase-diagram/svg-to-diagram.js +21 -15
  217. package/dist/phase-diagram/utils.js +2 -3
  218. package/dist/plot/bar/BarPlot.svelte +494 -692
  219. package/dist/plot/bar/BarPlot.svelte.d.ts +9 -15
  220. package/dist/plot/bar/BarPlotControls.svelte +1 -3
  221. package/dist/plot/bar/BarPlotControls.svelte.d.ts +5 -7
  222. package/dist/plot/bar/SpacegroupBarPlot.svelte +31 -37
  223. package/dist/plot/bar/data.d.ts +5 -4
  224. package/dist/plot/bar/data.js +2 -1
  225. package/dist/plot/box/BoxPlot.svelte +361 -439
  226. package/dist/plot/box/BoxPlot.svelte.d.ts +6 -3
  227. package/dist/plot/box/BoxPlotControls.svelte.d.ts +1 -1
  228. package/dist/plot/box/Violin.svelte.d.ts +2 -1
  229. package/dist/plot/box/box-plot.d.ts +3 -2
  230. package/dist/plot/box/box-plot.js +6 -3
  231. package/dist/plot/box/kde.d.ts +2 -1
  232. package/dist/plot/box/kde.js +4 -4
  233. package/dist/plot/core/auto-place.d.ts +1 -1
  234. package/dist/plot/core/auto-place.js +5 -2
  235. package/dist/plot/core/axis-utils.d.ts +12 -7
  236. package/dist/plot/core/axis-utils.js +48 -48
  237. package/dist/plot/core/components/AxisLabel.svelte +82 -20
  238. package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
  239. package/dist/plot/core/components/ColorBar.svelte +106 -111
  240. package/dist/plot/core/components/ColorBar.svelte.d.ts +5 -4
  241. package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
  242. package/dist/plot/core/components/FillArea.svelte +10 -17
  243. package/dist/plot/core/components/HierarchyControls.svelte +249 -0
  244. package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
  245. package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
  246. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
  247. package/dist/plot/core/components/Line.svelte +21 -11
  248. package/dist/plot/core/components/Line.svelte.d.ts +5 -2
  249. package/dist/plot/core/components/PlotAxis.svelte +42 -18
  250. package/dist/plot/core/components/PlotAxis.svelte.d.ts +2 -1
  251. package/dist/plot/core/components/PlotControls.svelte +65 -41
  252. package/dist/plot/core/components/PlotControls.svelte.d.ts +1 -1
  253. package/dist/plot/core/components/PlotLegend.svelte +31 -35
  254. package/dist/plot/core/components/PlotMarginals.svelte +616 -0
  255. package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
  256. package/dist/plot/core/components/PlotTooltip.svelte +1 -1
  257. package/dist/plot/core/components/PortalSelect.svelte +4 -8
  258. package/dist/plot/core/components/ReferenceLine.svelte +27 -24
  259. package/dist/plot/core/components/ReferenceLine3D.svelte +56 -59
  260. package/dist/plot/core/components/ReferenceLine3D.svelte.d.ts +4 -4
  261. package/dist/plot/core/components/ReferencePlane.svelte +9 -10
  262. package/dist/plot/core/components/ReferencePlane.svelte.d.ts +4 -4
  263. package/dist/plot/core/components/ZeroLines.svelte +4 -8
  264. package/dist/plot/core/components/ZoomRect.svelte +1 -2
  265. package/dist/plot/core/components/index.d.ts +1 -0
  266. package/dist/plot/core/components/index.js +1 -0
  267. package/dist/plot/core/data-cleaning-signal.d.ts +46 -0
  268. package/dist/plot/core/data-cleaning-signal.js +467 -0
  269. package/dist/plot/core/data-cleaning.d.ts +2 -42
  270. package/dist/plot/core/data-cleaning.js +29 -476
  271. package/dist/plot/core/data-transform.js +9 -5
  272. package/dist/plot/core/fill-utils.d.ts +7 -4
  273. package/dist/plot/core/fill-utils.js +34 -9
  274. package/dist/plot/core/index.d.ts +1 -0
  275. package/dist/plot/core/index.js +1 -0
  276. package/dist/plot/core/interactions.d.ts +5 -1
  277. package/dist/plot/core/interactions.js +14 -2
  278. package/dist/plot/core/layout.d.ts +3 -1
  279. package/dist/plot/core/layout.js +22 -13
  280. package/dist/plot/core/marginals.d.ts +170 -0
  281. package/dist/plot/core/marginals.js +436 -0
  282. package/dist/plot/core/pan-zoom.svelte.d.ts +35 -0
  283. package/dist/plot/core/pan-zoom.svelte.js +221 -0
  284. package/dist/plot/core/placed-tween.svelte.d.ts +21 -0
  285. package/dist/plot/core/placed-tween.svelte.js +68 -0
  286. package/dist/plot/core/reference-line.d.ts +10 -10
  287. package/dist/plot/core/reference-line.js +7 -7
  288. package/dist/plot/core/scales.d.ts +40 -25
  289. package/dist/plot/core/scales.js +49 -21
  290. package/dist/plot/core/svg.d.ts +2 -1
  291. package/dist/plot/core/types/fills.d.ts +101 -0
  292. package/dist/plot/core/types/fills.js +15 -0
  293. package/dist/plot/core/types/plot-3d.d.ts +87 -0
  294. package/dist/plot/core/types/plot-3d.js +4 -0
  295. package/dist/plot/core/types/reference-lines.d.ts +140 -0
  296. package/dist/plot/core/types/reference-lines.js +9 -0
  297. package/dist/plot/core/types.d.ts +47 -331
  298. package/dist/plot/core/types.js +23 -20
  299. package/dist/plot/core/utils/hierarchy-chart.d.ts +51 -0
  300. package/dist/plot/core/utils/hierarchy-chart.js +179 -0
  301. package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
  302. package/dist/plot/core/utils/hierarchy-labels.js +99 -0
  303. package/dist/plot/core/utils/label-placement.d.ts +1 -1
  304. package/dist/plot/core/utils/label-placement.js +5 -5
  305. package/dist/plot/core/utils.d.ts +2 -1
  306. package/dist/plot/histogram/Histogram.svelte +373 -631
  307. package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
  308. package/dist/plot/histogram/HistogramControls.svelte +30 -28
  309. package/dist/plot/histogram/HistogramControls.svelte.d.ts +1 -1
  310. package/dist/plot/histogram/histogram.d.ts +31 -0
  311. package/dist/plot/histogram/histogram.js +70 -0
  312. package/dist/plot/histogram/index.d.ts +1 -0
  313. package/dist/plot/histogram/index.js +1 -0
  314. package/dist/plot/index.d.ts +1 -0
  315. package/dist/plot/index.js +1 -0
  316. package/dist/plot/sankey/Sankey.svelte +79 -73
  317. package/dist/plot/sankey/Sankey.svelte.d.ts +3 -3
  318. package/dist/plot/sankey/SankeyControls.svelte +22 -16
  319. package/dist/plot/sankey/sankey.js +3 -1
  320. package/dist/plot/scatter/BinnedScatterPlot.svelte +264 -112
  321. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +11 -4
  322. package/dist/plot/scatter/ElementScatter.svelte +4 -1
  323. package/dist/plot/scatter/ScatterPlot.svelte +623 -821
  324. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +9 -15
  325. package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
  326. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  327. package/dist/plot/scatter/ScatterPoint.svelte +16 -9
  328. package/dist/plot/scatter/binned-scatter-types.d.ts +6 -12
  329. package/dist/plot/scatter/binned-scatter-types.js +6 -1
  330. package/dist/plot/scatter/index.d.ts +1 -1
  331. package/dist/plot/scatter/scatter-data.d.ts +1 -1
  332. package/dist/plot/scatter/scatter-data.js +8 -7
  333. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +40 -60
  334. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +6 -14
  335. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +17 -15
  336. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte.d.ts +5 -5
  337. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +232 -234
  338. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +5 -14
  339. package/dist/plot/scatter-3d/Surface3D.svelte +9 -17
  340. package/dist/plot/scatter-3d/Surface3D.svelte.d.ts +4 -3
  341. package/dist/plot/sunburst/Sunburst.svelte +256 -338
  342. package/dist/plot/sunburst/Sunburst.svelte.d.ts +4 -3
  343. package/dist/plot/sunburst/index.d.ts +1 -1
  344. package/dist/plot/sunburst/index.js +2 -1
  345. package/dist/plot/sunburst/render.d.ts +2 -2
  346. package/dist/plot/sunburst/render.js +47 -22
  347. package/dist/plot/sunburst/sunburst.d.ts +5 -1
  348. package/dist/plot/sunburst/sunburst.js +14 -4
  349. package/dist/plot/treemap/Treemap.svelte +907 -0
  350. package/dist/plot/treemap/Treemap.svelte.d.ts +84 -0
  351. package/dist/plot/treemap/index.d.ts +3 -0
  352. package/dist/plot/treemap/index.js +4 -0
  353. package/dist/plot/treemap/treemap.d.ts +26 -0
  354. package/dist/plot/treemap/treemap.js +99 -0
  355. package/dist/rdf/RdfPlot.svelte +22 -26
  356. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  357. package/dist/rdf/calc-rdf.js +4 -8
  358. package/dist/sanitize.js +14 -3
  359. package/dist/scene/SceneCamera.svelte +62 -0
  360. package/dist/scene/SceneCamera.svelte.d.ts +19 -0
  361. package/dist/scene/bind-renderer.svelte.d.ts +2 -0
  362. package/dist/scene/bind-renderer.svelte.js +22 -0
  363. package/dist/scene/index.d.ts +4 -0
  364. package/dist/scene/index.js +5 -0
  365. package/dist/scene/props.js +52 -0
  366. package/dist/scene/types.d.ts +26 -0
  367. package/dist/scene/types.js +1 -0
  368. package/dist/settings.d.ts +33 -11
  369. package/dist/settings.js +136 -51
  370. package/dist/spectral/Bands.svelte +231 -237
  371. package/dist/spectral/Bands.svelte.d.ts +3 -2
  372. package/dist/spectral/BandsAndDos.svelte +29 -29
  373. package/dist/spectral/BrillouinBandsDos.svelte +21 -29
  374. package/dist/spectral/Dos.svelte +75 -77
  375. package/dist/spectral/Dos.svelte.d.ts +2 -1
  376. package/dist/spectral/helpers.d.ts +9 -9
  377. package/dist/spectral/helpers.js +66 -70
  378. package/dist/state.svelte.d.ts +0 -7
  379. package/dist/state.svelte.js +5 -24
  380. package/dist/structure/Arrow.svelte +6 -21
  381. package/dist/structure/ArrowInstances.svelte +160 -0
  382. package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
  383. package/dist/structure/AtomLegend.svelte +115 -75
  384. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  385. package/dist/structure/Bond.svelte +31 -23
  386. package/dist/structure/CanvasTooltip.svelte +16 -3
  387. package/dist/structure/CellSelect.svelte +22 -29
  388. package/dist/structure/CellSelect.svelte.d.ts +2 -1
  389. package/dist/structure/Cylinder.svelte +24 -40
  390. package/dist/structure/InstancedAtoms.svelte +114 -0
  391. package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
  392. package/dist/structure/Lattice.svelte +85 -149
  393. package/dist/structure/SiteLabels.svelte +122 -0
  394. package/dist/structure/SiteLabels.svelte.d.ts +18 -0
  395. package/dist/structure/Structure.svelte +725 -735
  396. package/dist/structure/Structure.svelte.d.ts +8 -16
  397. package/dist/structure/StructureCarousel.svelte +630 -0
  398. package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
  399. package/dist/structure/StructureControls.svelte +298 -325
  400. package/dist/structure/StructureControls.svelte.d.ts +5 -3
  401. package/dist/structure/StructureExportPane.svelte +62 -168
  402. package/dist/structure/StructureExportPane.svelte.d.ts +4 -5
  403. package/dist/structure/StructureInfoPane.svelte +77 -69
  404. package/dist/structure/StructureInfoPane.svelte.d.ts +6 -6
  405. package/dist/structure/StructureScene.svelte +758 -600
  406. package/dist/structure/StructureScene.svelte.d.ts +24 -20
  407. package/dist/structure/StructureViewport.svelte +386 -0
  408. package/dist/structure/StructureViewport.svelte.d.ts +63 -0
  409. package/dist/structure/atom-label-placement.d.ts +18 -0
  410. package/dist/structure/atom-label-placement.js +115 -0
  411. package/dist/structure/atom-properties.d.ts +3 -1
  412. package/dist/structure/atom-properties.js +115 -54
  413. package/dist/structure/bond-order-perception.js +2 -4
  414. package/dist/structure/bonding.d.ts +12 -2
  415. package/dist/structure/bonding.js +172 -73
  416. package/dist/structure/edit-history.d.ts +6 -0
  417. package/dist/structure/edit-history.js +27 -0
  418. package/dist/structure/export.d.ts +25 -4
  419. package/dist/structure/export.js +103 -153
  420. package/dist/structure/format-detect.d.ts +1 -0
  421. package/dist/structure/format-detect.js +22 -0
  422. package/dist/structure/geometry.d.ts +9 -0
  423. package/dist/structure/geometry.js +27 -0
  424. package/dist/structure/index.d.ts +18 -1
  425. package/dist/structure/index.js +15 -2
  426. package/dist/structure/measure.d.ts +1 -1
  427. package/dist/structure/measure.js +6 -12
  428. package/dist/structure/parse.d.ts +5 -3
  429. package/dist/structure/parse.js +551 -567
  430. package/dist/structure/partial-occupancy.d.ts +0 -1
  431. package/dist/structure/partial-occupancy.js +5 -3
  432. package/dist/structure/pbc.d.ts +1 -1
  433. package/dist/structure/pbc.js +204 -51
  434. package/dist/structure/polyhedra.d.ts +40 -0
  435. package/dist/structure/polyhedra.js +587 -0
  436. package/dist/structure/site.d.ts +4 -0
  437. package/dist/structure/site.js +1 -0
  438. package/dist/structure/supercell.d.ts +1 -2
  439. package/dist/structure/supercell.js +10 -15
  440. package/dist/structure/validation.js +5 -6
  441. package/dist/symmetry/SymmetryElementControls.svelte +69 -0
  442. package/dist/symmetry/SymmetryElementControls.svelte.d.ts +9 -0
  443. package/dist/symmetry/SymmetryElements.svelte +350 -0
  444. package/dist/symmetry/SymmetryElements.svelte.d.ts +24 -0
  445. package/dist/symmetry/SymmetryStats.svelte +142 -49
  446. package/dist/symmetry/WyckoffTable.svelte +58 -16
  447. package/dist/symmetry/WyckoffTable.svelte.d.ts +3 -0
  448. package/dist/symmetry/cell-transform.js +8 -14
  449. package/dist/symmetry/index.d.ts +15 -4
  450. package/dist/symmetry/index.js +308 -81
  451. package/dist/symmetry/spacegroups.d.ts +5 -1
  452. package/dist/symmetry/spacegroups.js +18 -3
  453. package/dist/symmetry/symmetry-elements.d.ts +33 -0
  454. package/dist/symmetry/symmetry-elements.js +521 -0
  455. package/dist/symmetry/wyckoff-db.d.ts +9 -0
  456. package/dist/symmetry/wyckoff-db.js +87 -0
  457. package/dist/table/HeatmapTable.svelte +1104 -378
  458. package/dist/table/HeatmapTable.svelte.d.ts +12 -2
  459. package/dist/table/ToggleMenu.svelte +5 -12
  460. package/dist/table/index.d.ts +21 -6
  461. package/dist/table/index.js +34 -21
  462. package/dist/theme/ThemeControl.svelte +16 -8
  463. package/dist/theme/index.d.ts +1 -5
  464. package/dist/theme/index.js +4 -10
  465. package/dist/theme/themes.mjs +14 -7
  466. package/dist/tooltip/KCoords.svelte +4 -1
  467. package/dist/tooltip/TooltipContent.svelte +2 -5
  468. package/dist/trajectory/Trajectory.svelte +556 -352
  469. package/dist/trajectory/Trajectory.svelte.d.ts +10 -22
  470. package/dist/trajectory/TrajectoryError.svelte +11 -8
  471. package/dist/trajectory/TrajectoryExportPane.svelte +28 -54
  472. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +4 -5
  473. package/dist/trajectory/TrajectoryInfoPane.svelte +88 -99
  474. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +3 -2
  475. package/dist/trajectory/constants.js +6 -2
  476. package/dist/trajectory/extract.js +73 -71
  477. package/dist/trajectory/format-detect.d.ts +0 -1
  478. package/dist/trajectory/format-detect.js +13 -17
  479. package/dist/trajectory/frame-reader.d.ts +2 -1
  480. package/dist/trajectory/frame-reader.js +74 -136
  481. package/dist/trajectory/helpers.d.ts +12 -2
  482. package/dist/trajectory/helpers.js +68 -37
  483. package/dist/trajectory/index.d.ts +1 -0
  484. package/dist/trajectory/index.js +3 -0
  485. package/dist/trajectory/parse/ase.d.ts +9 -1
  486. package/dist/trajectory/parse/ase.js +47 -32
  487. package/dist/trajectory/parse/diagnostics.d.ts +3 -0
  488. package/dist/trajectory/parse/diagnostics.js +14 -0
  489. package/dist/trajectory/parse/h5-utils.d.ts +13 -0
  490. package/dist/trajectory/parse/h5-utils.js +109 -0
  491. package/dist/trajectory/parse/hdf5.d.ts +1 -1
  492. package/dist/trajectory/parse/hdf5.js +116 -106
  493. package/dist/trajectory/parse/index.d.ts +3 -4
  494. package/dist/trajectory/parse/index.js +68 -119
  495. package/dist/trajectory/parse/lammps.d.ts +0 -2
  496. package/dist/trajectory/parse/lammps.js +14 -16
  497. package/dist/trajectory/parse/pymatgen.d.ts +2 -0
  498. package/dist/trajectory/parse/pymatgen.js +74 -0
  499. package/dist/trajectory/parse/vasp.js +13 -9
  500. package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
  501. package/dist/trajectory/parse/vaspout-electronic.js +207 -0
  502. package/dist/trajectory/parse/vaspout-h5.d.ts +5 -0
  503. package/dist/trajectory/parse/vaspout-h5.js +284 -0
  504. package/dist/trajectory/parse/xyz.d.ts +9 -21
  505. package/dist/trajectory/parse/xyz.js +38 -39
  506. package/dist/trajectory/plotting.d.ts +8 -10
  507. package/dist/trajectory/plotting.js +102 -127
  508. package/dist/utils.d.ts +4 -0
  509. package/dist/utils.js +8 -1
  510. package/dist/xrd/XrdPlot.svelte +56 -85
  511. package/dist/xrd/broadening.d.ts +2 -1
  512. package/dist/xrd/broadening.js +2 -1
  513. package/dist/xrd/calc-xrd.js +8 -15
  514. package/dist/xrd/index.d.ts +2 -2
  515. package/dist/xrd/parse.d.ts +0 -1
  516. package/dist/xrd/parse.js +56 -73
  517. package/package.json +77 -36
  518. package/dist/api/mp.d.ts +0 -6
  519. package/dist/api/mp.js +0 -22
  520. package/dist/element/data.json +0 -11864
  521. package/dist/fermi-surface/marching-cubes.d.ts +0 -2
  522. package/dist/fermi-surface/marching-cubes.js +0 -2
  523. package/dist/plot/core/hover-lock.svelte.d.ts +0 -14
  524. package/dist/plot/core/hover-lock.svelte.js +0 -45
  525. package/dist/plot/sunburst/SunburstControls.svelte +0 -200
  526. package/dist/structure/label-placement.d.ts +0 -14
  527. package/dist/structure/label-placement.js +0 -72
@@ -5,7 +5,15 @@
5
5
  import type { HTMLAttributes } from 'svelte/elements'
6
6
  import { SETTINGS_CONFIG } from '../settings'
7
7
  import type { SymmetrySettings } from './index'
8
- import { default_sym_settings, wyckoff_positions_from_moyo } from './index'
8
+ import {
9
+ count_structure_free_params,
10
+ default_sym_settings,
11
+ enrich_wyckoff_rows,
12
+ spacegroup_settings,
13
+ spacegroup_wyckoff_positions,
14
+ wyckoff_positions_from_moyo,
15
+ wyckoff_sequence,
16
+ } from './index'
9
17
  import * as spg from './spacegroups'
10
18
 
11
19
  type SymmetrySnippet = Snippet<
@@ -29,10 +37,34 @@
29
37
  header?: SymmetrySnippet
30
38
  } = $props()
31
39
 
32
- const wyckoff_count = $derived(
33
- sym_data ? wyckoff_positions_from_moyo(sym_data).length : 0,
40
+ // Space-group Wyckoff database + all settings (empty when WASM is not initialized,
41
+ // e.g. SSR or unit tests — the stats below degrade gracefully)
42
+ const wyckoff_db = $derived(
43
+ sym_data ? spacegroup_wyckoff_positions(sym_data.hall_number) : [],
34
44
  )
45
+ const settings_entries = $derived(sym_data ? spacegroup_settings(sym_data.number) : [])
46
+ const current_setting = $derived(
47
+ settings_entries.find((entry) => entry.hall_number === sym_data?.hall_number),
48
+ )
49
+ const occupied_rows = $derived(
50
+ sym_data ? enrich_wyckoff_rows(wyckoff_positions_from_moyo(sym_data), wyckoff_db) : [],
51
+ )
52
+ const wyckoff_count = $derived(occupied_rows.length)
53
+ const wyckoff_seq = $derived(wyckoff_sequence(occupied_rows))
54
+ // Internal degrees of freedom (null when ITA coordinates are unavailable)
55
+ const free_params = $derived(count_structure_free_params(occupied_rows))
35
56
  const display_hm_symbol = $derived(sym_data?.hm_symbol?.replaceAll(/\s+/g, ``) ?? `?`)
57
+ // Crystal system, plus the lattice system in parens when it differs (e.g. trigonal
58
+ // space groups split into rhombohedral R-centered and hexagonal P lattices)
59
+ const crystal_system_label = $derived.by(() => {
60
+ if (!sym_data) return `?`
61
+ const crystal_sys = spg.spacegroup_to_crystal_sys(sym_data.number)
62
+ const lattice_sys = spg.spacegroup_num_to_lattice_system(sym_data.number)
63
+ if (!crystal_sys) return `?`
64
+ const suffix =
65
+ lattice_sys && lattice_sys !== crystal_sys ? ` (${lattice_sys} lattice)` : ``
66
+ return `${crystal_sys}${suffix}`
67
+ })
36
68
 
37
69
  const sym_ops_counts = $derived.by(() => {
38
70
  const EPS = 1e-10
@@ -56,24 +88,18 @@
56
88
  })
57
89
 
58
90
  const titles = {
59
- symprec:
60
- `Symmetry precision control in spglib/moyo. Lower values (e.g. 1e-4, the default) are more strict, higher values (e.g. 1e-1) are more tolerant of numerical errors in atomic positions.`,
61
- algo:
62
- `Symmetry detection algorithm: Moyo uses moyo's newer recommended settings, Spglib is useful if you need compatible results to an existing set of spglib-detected symmetries.`,
63
- space_group:
64
- `International Tables Space group number (1-230) - unique identifier for each space group. Higher numbers indicate more symmetries in the crystal.`,
65
- crystal_system:
66
- `Crystal system classification based on the unit cell symmetry. Seven systems: triclinic, monoclinic, orthorhombic, tetragonal, trigonal, hexagonal, and cubic.`,
67
- hermann_mauguin:
68
- `Hermann-Mauguin symbol describes symmetry operations. Format: Lattice type + Point group symmetry. Example: P4/mmm = Primitive + 4-fold rotation + mirror planes`,
69
- hall_number:
70
- `Hall number: alternative numbering system for space groups. Useful for crystallographic software compatibility.`,
71
- pearson_symbol:
72
- `Pearson symbol. Format: Crystal system + Number of atoms per unit cell. Example: tP2 = tetragonal primitive with 2 atoms`,
73
- symmetry_operations:
74
- `Total symmetry operations that map the crystal structure onto itself. Includes rotations, translations, and combinations.`,
75
- distinct_orbits:
76
- `Number of unique Wyckoff positions (symmetry-equivalent atomic sites) in the crystal structure.`,
91
+ symprec: `Symmetry precision control in spglib/moyo. Lower values (e.g. 1e-4, the default) are more strict, higher values (e.g. 1e-1) are more tolerant of numerical errors in atomic positions.`,
92
+ algo: `Symmetry detection algorithm: Moyo uses moyo's newer recommended settings, Spglib is useful if you need compatible results to an existing set of spglib-detected symmetries.`,
93
+ space_group: `International Tables Space group number (1-230) - unique identifier for each space group. Higher numbers indicate more symmetries in the crystal.`,
94
+ crystal_system: `Crystal system classification based on the unit cell symmetry. Seven systems: triclinic, monoclinic, orthorhombic, tetragonal, trigonal, hexagonal, and cubic. For trigonal space groups, the lattice system (rhombohedral for R-centered groups, hexagonal otherwise) is shown in parentheses when it differs from the crystal system.`,
95
+ hermann_mauguin: `Hermann-Mauguin symbol describes symmetry operations. Format: Lattice type + Point group symmetry. Example: P4/mmm = Primitive + 4-fold rotation + mirror planes`,
96
+ hall_number: `Hall number: alternative numbering system for space groups. Useful for crystallographic software compatibility.`,
97
+ pearson_symbol: `Pearson symbol. Format: Crystal system + Number of atoms per unit cell. Example: tP2 = tetragonal primitive with 2 atoms`,
98
+ symmetry_operations: `Total symmetry operations that map the crystal structure onto itself. Includes rotations, translations, and combinations.`,
99
+ distinct_orbits: `Number of unique Wyckoff positions (symmetry-equivalent atomic sites) in the crystal structure.`,
100
+ wyckoff_sequence: `Wyckoff sequence: letters of all occupied Wyckoff positions in descending alphabetical order, with superscript counts for letters occupied by multiple orbits. A standard structure-type fingerprint (complements the Pearson symbol).`,
101
+ free_params: `Internal degrees of freedom: number of free fractional-coordinate parameters (x, y, z in the ITA representative coordinates) summed over occupied Wyckoff orbits. 0 means all atomic positions are fully fixed by symmetry.`,
102
+ settings: `All settings of this space group in the International Tables (origin choices, unique axes, cell choices, hexagonal vs rhombohedral axes). The setting detected for this structure is highlighted.`,
77
103
  translations: `Number of translations in the crystal structure.`,
78
104
  rotations: `Number of rotations in the crystal structure.`,
79
105
  roto_translations: `Number of roto-translations in the crystal structure.`,
@@ -89,7 +115,7 @@
89
115
  const symprec_step = $derived(get_step_from_order_of_magnitude(settings.symprec))
90
116
  </script>
91
117
 
92
- <div {...rest} class="symmetry-stats {rest.class ?? ``}">
118
+ <div {...rest} class={[`symmetry-stats`, rest.class]}>
93
119
  {#if sym_data}
94
120
  {@render header?.({ sym_data, settings })}
95
121
  {/if}
@@ -129,10 +155,10 @@
129
155
  <select
130
156
  value={settings.algo}
131
157
  onchange={(evt) =>
132
- settings = {
133
- ...settings,
134
- algo: evt.currentTarget.value as `Moyo` | `Spglib`,
135
- }}
158
+ (settings = {
159
+ ...settings,
160
+ algo: evt.currentTarget.value as `Moyo` | `Spglib`,
161
+ })}
136
162
  >
137
163
  {#each Object.keys(SETTINGS_CONFIG.symmetry.algo.enum ?? {}) as value (value)}
138
164
  <option {value}>{value}</option>
@@ -143,36 +169,85 @@
143
169
 
144
170
  {@render children?.({ sym_data, settings })}
145
171
  {#if sym_data}
172
+ {@const stat_tiles = [
173
+ {
174
+ label: `Space Group`,
175
+ title: `${tooltips?.space_group} at ${settings.symprec} (using ${settings.algo} algo). ${tooltips?.hermann_mauguin}`,
176
+ value: `${sym_data.number} (${display_hm_symbol})`,
177
+ },
178
+ {
179
+ label: `Crystal System`,
180
+ title: tooltips?.crystal_system,
181
+ value: crystal_system_label,
182
+ },
183
+ {
184
+ label: `Hall Number`,
185
+ title: tooltips?.hall_number,
186
+ value: `${sym_data.hall_number}${
187
+ current_setting ? ` (${current_setting.hall_symbol})` : ``
188
+ }`,
189
+ },
190
+ { label: `Pearson`, title: tooltips?.pearson_symbol, value: sym_data.pearson_symbol },
191
+ { label: `Wyckoff Positions`, title: tooltips?.distinct_orbits, value: wyckoff_count },
192
+ wyckoff_seq && {
193
+ label: `Wyckoff Sequence`,
194
+ title: tooltips?.wyckoff_sequence,
195
+ value: wyckoff_seq,
196
+ },
197
+ free_params !== null && {
198
+ label: `Free Parameters`,
199
+ title: tooltips?.free_params,
200
+ value: free_params,
201
+ },
202
+ ].filter((tile) => typeof tile === `object`)}
146
203
  <div class="stats-grid">
147
- <div
148
- title="{tooltips?.space_group} at {settings.symprec} (using {settings.algo} algo). {tooltips?.hermann_mauguin}"
149
- {@attach tooltip()}
150
- >
151
- Space Group <strong>{sym_data.number} ({display_hm_symbol})</strong>
152
- </div>
153
- <div title={tooltips?.crystal_system} {@attach tooltip()}>
154
- Crystal System <strong>{spg.spacegroup_to_crystal_sys(sym_data.number)}</strong>
155
- </div>
156
- <div title={tooltips?.hall_number} {@attach tooltip()}>
157
- Hall Number <strong>{sym_data.hall_number}</strong>
158
- </div>
159
- <div title={tooltips?.pearson_symbol} {@attach tooltip()}>
160
- Pearson <strong>{sym_data.pearson_symbol}</strong>
161
- </div>
162
- <div title={tooltips?.distinct_orbits} {@attach tooltip()}>
163
- Wyckoff Positions <strong>{wyckoff_count}</strong>
164
- </div>
204
+ {#each stat_tiles as tile (tile.label)}
205
+ <div title={tile.title} {@attach tooltip()}>
206
+ {tile.label} <strong>{tile.value}</strong>
207
+ </div>
208
+ {/each}
165
209
  <div
166
210
  class="sym-ops-summary"
167
211
  title="{sym_ops_counts.translations} translations + {sym_ops_counts.rotations} rotations + {sym_ops_counts.roto_translations} roto-translations"
168
212
  {@attach tooltip()}
169
213
  >
170
214
  Total sym ops: <strong>{sym_data.operations.length}</strong>
171
- ({sym_ops_counts.translations}T + {sym_ops_counts.rotations}R + {
172
- sym_ops_counts.roto_translations
173
- }RT)
215
+ ({sym_ops_counts.translations}T + {sym_ops_counts.rotations}R + {sym_ops_counts.roto_translations}RT)
174
216
  </div>
175
217
  </div>
218
+ {#if settings_entries.length > 1}
219
+ <details class="settings-explorer">
220
+ <summary title={tooltips?.settings} {@attach tooltip()}>
221
+ {settings_entries.length} settings of space group {sym_data.number}
222
+ </summary>
223
+ <table>
224
+ <thead>
225
+ <tr>
226
+ <th>Hall #</th>
227
+ <th>H-M full</th>
228
+ <th>Hall symbol</th>
229
+ <th>Setting</th>
230
+ <th>Centering</th>
231
+ </tr>
232
+ </thead>
233
+ <tbody>
234
+ {#each settings_entries as entry (entry.hall_number)}
235
+ {@const is_current = entry.hall_number === sym_data.hall_number}
236
+ <tr
237
+ class:current={is_current}
238
+ title={is_current ? `Setting detected for this structure` : null}
239
+ >
240
+ <td>{entry.hall_number}</td>
241
+ <td>{entry.hm_full}</td>
242
+ <td>{entry.hall_symbol}</td>
243
+ <td>{entry.setting || `—`}</td>
244
+ <td>{entry.centering}</td>
245
+ </tr>
246
+ {/each}
247
+ </tbody>
248
+ </table>
249
+ </details>
250
+ {/if}
176
251
  {:else}
177
252
  <div class="no-data">
178
253
  <p>No symmetry data available</p>
@@ -201,8 +276,7 @@
201
276
  }
202
277
  .stats-grid {
203
278
  display: var(--sym-stats-display, grid);
204
- grid-template-columns:
205
- var(--sym-stats-grid-columns, repeat(auto-fit, minmax(275px, 1fr)));
279
+ grid-template-columns: var(--sym-stats-grid-columns, repeat(auto-fit, minmax(275px, 1fr)));
206
280
  gap: var(--sym-stats-grid-gap, 1ex 1em);
207
281
  margin-block: var(--sym-stats-grid-margin-block, 1ex);
208
282
  align-items: var(--sym-stats-grid-align, start);
@@ -210,6 +284,25 @@
210
284
  .stats-grid strong {
211
285
  margin: var(--sym-stats-strong-margin, 0 0 0 3pt);
212
286
  }
287
+ .settings-explorer {
288
+ margin-block: var(--sym-stats-grid-margin-block, 1ex);
289
+ }
290
+ .settings-explorer summary {
291
+ cursor: pointer;
292
+ color: var(--text-muted, #666);
293
+ }
294
+ .settings-explorer table {
295
+ margin-top: 1ex;
296
+ border-collapse: collapse;
297
+ }
298
+ .settings-explorer :is(th, td) {
299
+ padding: 1px 8px;
300
+ text-align: left;
301
+ }
302
+ .settings-explorer tr.current {
303
+ background: color-mix(in srgb, var(--accent-color, #0066cc) 18%, transparent);
304
+ font-weight: bold;
305
+ }
213
306
  .no-data {
214
307
  display: flex;
215
308
  align-items: center;
@@ -2,17 +2,27 @@
2
2
  import { contrast_color } from '../colors'
3
3
  import { format_fractional } from '../labels'
4
4
  import { colors } from '../state.svelte'
5
+ import type { MoyoWyckoffPosition } from '@spglib/moyo-wasm'
6
+ import { SvelteSet } from 'svelte/reactivity'
5
7
  import type { HTMLAttributes } from 'svelte/elements'
6
8
  import type { WyckoffPos } from '.'
9
+ import { enrich_wyckoff_rows, wyckoff_letter } from '.'
7
10
 
8
11
  let {
9
12
  wyckoff_positions,
13
+ // Full Wyckoff-position database of the space group (from
14
+ // spacegroup_wyckoff_positions). When given, occupied rows gain an ITA coordinates
15
+ // column and unoccupied positions can be listed via show_unoccupied.
16
+ db_positions = [],
17
+ show_unoccupied = false,
10
18
  on_hover,
11
19
  on_click,
12
20
  active_color = `#2563eb`,
13
21
  ...rest
14
22
  }: HTMLAttributes<HTMLTableElement> & {
15
23
  wyckoff_positions: WyckoffPos[]
24
+ db_positions?: MoyoWyckoffPosition[]
25
+ show_unoccupied?: boolean
16
26
  on_hover?: (site_indices: number[] | null) => void
17
27
  on_click?: (site_indices: number[] | null) => void
18
28
  active_color?: string
@@ -20,12 +30,33 @@
20
30
 
21
31
  let selected_key = $state<string | null>(null)
22
32
 
33
+ // Occupied orbits enriched with ITA representative coordinates + site symmetry
34
+ const rows = $derived(enrich_wyckoff_rows(wyckoff_positions ?? [], db_positions))
35
+ // Wyckoff positions of the space group not occupied by any atom, smallest
36
+ // multiplicity first (matches the ascending sort of occupied rows)
37
+ const unoccupied_rows = $derived.by(() => {
38
+ if (!show_unoccupied) return []
39
+ const occupied_letters = new SvelteSet(rows.map((row) => wyckoff_letter(row.wyckoff)))
40
+ return db_positions
41
+ .filter((pos) => !occupied_letters.has(pos.letter))
42
+ .toSorted(
43
+ (pos_1, pos_2) =>
44
+ pos_1.multiplicity - pos_2.multiplicity || pos_1.letter.localeCompare(pos_2.letter),
45
+ )
46
+ })
47
+ const has_ita_coords = $derived(
48
+ rows.some((pos) => pos.coordinates) || unoccupied_rows.length > 0,
49
+ )
50
+ const has_site_symmetry = $derived(
51
+ rows.some((pos) => pos.site_symmetry) || unoccupied_rows.length > 0,
52
+ )
53
+
23
54
  const get_row_key = (wyckoff_pos: WyckoffPos, row_idx: number) =>
24
55
  `${wyckoff_pos.wyckoff}-${wyckoff_pos.elem}-${
25
56
  wyckoff_pos.site_indices?.join(`,`) ?? `none`
26
57
  }-${row_idx}`
27
58
  $effect(() => {
28
- if (!selected_key || wyckoff_positions?.some((pos, idx) => get_row_key(pos, idx) === selected_key)) {
59
+ if (!selected_key || rows.some((pos, idx) => get_row_key(pos, idx) === selected_key)) {
29
60
  return
30
61
  }
31
62
  selected_key = null
@@ -33,28 +64,17 @@
33
64
  })
34
65
  </script>
35
66
 
36
- {#if wyckoff_positions && wyckoff_positions.length > 0}
37
- <table {...rest} class="wyckoff-table {rest.class ?? ``}">
67
+ {#if rows.length > 0 || unoccupied_rows.length > 0}
68
+ <table {...rest} class={[`wyckoff-table`, rest.class]}>
38
69
  <thead>
39
70
  <tr>
40
- {#each [
41
- [`Wyckoff`, `Wyckoff position: Multiplicity + Letter`],
42
- [`Element`, `Chemical element symbol`],
43
- [`Fractional Coords`, `Fractional coordinates within the unit cell`],
44
- ] as
45
- [col, title]
46
- (col)
47
- }
71
+ {#each [[`Wyckoff`, `Wyckoff position: Multiplicity + Letter`], [`Element`, `Chemical element symbol`], [`Fractional Coords`, `Fractional coordinates within the unit cell`], ...(has_ita_coords ? [[`ITA Coords`, `Representative coordinates from the International Tables: x/y/z mark free parameters, fractions mark symmetry-fixed coordinates`]] : []), ...(has_site_symmetry ? [[`Site Symm.`, `Site symmetry: point group of operations leaving the site invariant`]] : [])] as [col, title] (col)}
48
72
  <th {title}>{col}</th>
49
73
  {/each}
50
74
  </tr>
51
75
  </thead>
52
76
  <tbody>
53
- {#each wyckoff_positions as
54
- wyckoff_pos,
55
- row_idx
56
- (get_row_key(wyckoff_pos, row_idx))
57
- }
77
+ {#each rows as wyckoff_pos, row_idx (get_row_key(wyckoff_pos, row_idx))}
58
78
  {@const { wyckoff, elem, abc, site_indices } = wyckoff_pos}
59
79
  {@const row_key = get_row_key(wyckoff_pos, row_idx)}
60
80
  {@const is_selected = selected_key === row_key}
@@ -89,6 +109,25 @@
89
109
  </span>
90
110
  </td>
91
111
  <td>({abc?.map(format_fractional).join(` , `) ?? `N/A`})</td>
112
+ {#if has_ita_coords}
113
+ <td>{wyckoff_pos.coordinates ? `(${wyckoff_pos.coordinates})` : ``}</td>
114
+ {/if}
115
+ {#if has_site_symmetry}
116
+ <td>{wyckoff_pos.site_symmetry ?? ``}</td>
117
+ {/if}
118
+ </tr>
119
+ {/each}
120
+ {#each unoccupied_rows as db_pos (db_pos.letter)}
121
+ <tr class="unoccupied" title="Wyckoff position not occupied in this structure">
122
+ <td>{db_pos.multiplicity}{db_pos.letter}</td>
123
+ <td>&mdash;</td>
124
+ <td>&mdash;</td>
125
+ {#if has_ita_coords}
126
+ <td>({db_pos.coordinates})</td>
127
+ {/if}
128
+ {#if has_site_symmetry}
129
+ <td>{db_pos.site_symmetry}</td>
130
+ {/if}
92
131
  </tr>
93
132
  {/each}
94
133
  </tbody>
@@ -117,4 +156,7 @@
117
156
  .wyckoff-row.selected:hover {
118
157
  background-color: color-mix(in srgb, var(--active-color) 35%, transparent);
119
158
  }
159
+ .unoccupied {
160
+ opacity: 0.5;
161
+ }
120
162
  </style>
@@ -1,7 +1,10 @@
1
+ import type { MoyoWyckoffPosition } from '@spglib/moyo-wasm';
1
2
  import type { HTMLAttributes } from 'svelte/elements';
2
3
  import type { WyckoffPos } from '.';
3
4
  type $$ComponentProps = HTMLAttributes<HTMLTableElement> & {
4
5
  wyckoff_positions: WyckoffPos[];
6
+ db_positions?: MoyoWyckoffPosition[];
7
+ show_unoccupied?: boolean;
5
8
  on_hover?: (site_indices: number[] | null) => void;
6
9
  on_click?: (site_indices: number[] | null) => void;
7
10
  active_color?: string;
@@ -1,6 +1,8 @@
1
+ // Cell transformation utilities for converting between original, conventional, and primitive cells
1
2
  import { ATOMIC_NUMBER_TO_SYMBOL } from '../composition/parse';
2
3
  import * as math from '../math';
3
4
  import { wrap_to_unit_cell } from '../structure/pbc';
5
+ import { make_site } from '../structure/site';
4
6
  const transferable_properties = (properties) => {
5
7
  if (properties === undefined)
6
8
  return undefined;
@@ -13,17 +15,10 @@ const transferable_properties = (properties) => {
13
15
  // the full Crystal with lattice parameters and element symbols.
14
16
  export function moyo_cell_to_structure(cell, // The MoyoCell from symmetry analysis (std_cell or prim_std_cell)
15
17
  original_structure) {
16
- // Convert flat 9-element basis to 3x3 matrix
17
- // moyo-wasm uses the same row-major serialization for both input and output
18
- // (see to_cell_json comment: column-major(B) == row-major(RB))
19
- // So the flat array is row-major: [a1, a2, a3, b1, b2, b3, c1, c2, c3]
20
- // where each row is a lattice vector in the pymatgen convention
21
- const basis = cell.lattice.basis;
22
- const lattice_matrix = [
23
- [basis[0], basis[1], basis[2]], // First lattice vector (a)
24
- [basis[3], basis[4], basis[5]], // Second lattice vector (b)
25
- [basis[6], basis[7], basis[8]], // Third lattice vector (c)
26
- ];
18
+ // Convert flat 9-element basis to 3x3 matrix. moyo-wasm uses the same row-major
19
+ // serialization for both input and output (see to_cell_json: column-major(B) ==
20
+ // row-major(RB)), so the flat array is row-major with each row a lattice vector.
21
+ const lattice_matrix = math.vec9_to_mat3x3([...cell.lattice.basis]);
27
22
  // Calculate lattice parameters from matrix
28
23
  const lattice_params = math.calc_lattice_params(lattice_matrix);
29
24
  const frac_to_cart = math.create_frac_to_cart(lattice_matrix);
@@ -40,8 +35,7 @@ original_structure) {
40
35
  // Oxidation state is set to 0 (unknown) because moyo-wasm only provides atomic numbers.
41
36
  // transformed cell may have different/reordered sites, making it non-trivial to
42
37
  // map oxidation states from original structure.
43
- const species = [{ element, occu: 1, oxidation_state: 0 }];
44
- return { species, abc: wrapped_abc, xyz, label: element, properties: {} };
38
+ return make_site(element, wrapped_abc, xyz, element);
45
39
  });
46
40
  const lattice = {
47
41
  matrix: lattice_matrix,
@@ -86,6 +80,6 @@ sym_data) {
86
80
  if (cell_type === `primitive`) {
87
81
  return get_primitive_cell(structure, sym_data);
88
82
  }
89
- // Fallback to original (should never reach here with proper typing)
83
+ // Unknown cell_type at runtime (e.g. from stale persisted settings): leave unchanged
90
84
  return structure;
91
85
  }
@@ -1,8 +1,12 @@
1
1
  import type { Vec3 } from '../math';
2
2
  import type { AnyStructure, Crystal } from '../structure';
3
- import type { MoyoDataset } from '@spglib/moyo-wasm';
3
+ import type { MoyoCell, MoyoDataset } from '@spglib/moyo-wasm';
4
4
  export * from './cell-transform';
5
5
  export * from './spacegroups';
6
+ export * from './symmetry-elements';
7
+ export * from './wyckoff-db';
8
+ export { default as SymmetryElementControls } from './SymmetryElementControls.svelte';
9
+ export { default as SymmetryElements } from './SymmetryElements.svelte';
6
10
  export { default as SymmetryStats } from './SymmetryStats.svelte';
7
11
  export { default as WyckoffTable } from './WyckoffTable.svelte';
8
12
  export declare const BRAVAIS_LATTICES: {
@@ -28,16 +32,23 @@ export type WyckoffPos = {
28
32
  elem: string;
29
33
  abc: Vec3;
30
34
  site_indices?: number[];
35
+ site_symmetry?: string;
36
+ coordinates?: string;
31
37
  };
32
38
  export type SymmetryDataset = MoyoDataset & {
33
- orig_indices?: number[];
34
39
  orig_site_indices_by_std_idx?: number[][];
40
+ input_cell?: Pick<MoyoCell, `positions` | `numbers`>;
41
+ orig_site_indices_by_input_idx?: number[][];
35
42
  };
36
43
  export declare function ensure_moyo_wasm_ready(wasm_url?: string): Promise<void>;
37
44
  export declare function to_cell_json(structure: Crystal): string;
38
- export declare const map_std_to_orig_site_indices: (std_positions: Vec3[], std_numbers: number[], input_positions: Vec3[], input_numbers: number[], orig_site_indices_by_input_idx: number[][]) => number[][];
45
+ export declare const map_std_to_orig_site_indices: (std_positions: Vec3[], std_numbers: number[], input_positions: Vec3[], input_numbers: number[], orig_site_indices_by_input_idx: number[][], transform?: {
46
+ std_linear: readonly number[];
47
+ std_origin_shift: readonly number[];
48
+ }, tol?: number) => number[][];
39
49
  export declare function analyze_structure_symmetry(struct_or_mol: AnyStructure, settings: Partial<SymmetrySettings>): Promise<SymmetryDataset>;
40
50
  export declare function simplicity_score(vec: number[]): number;
51
+ export declare const wyckoff_multiplicity: (label: string) => number;
41
52
  export declare function wyckoff_positions_from_moyo(sym_data: SymmetryDataset | null): WyckoffPos[];
42
- export declare function apply_symmetry_operations(position: Vec3, operations: MoyoDataset[`operations`], _tolerance?: number): Vec3[];
53
+ export declare function apply_symmetry_operations(position: Vec3, operations: MoyoDataset[`operations`]): Vec3[];
43
54
  export declare function map_wyckoff_to_all_atoms(wyckoff_positions: WyckoffPos[], displayed_structure: Crystal, orig_structure: Crystal, sym_data: MoyoDataset | null, tolerance?: number): WyckoffPos[];