matterviz 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. package/dist/EmptyState.svelte +10 -4
  2. package/dist/FilePicker.svelte +48 -60
  3. package/dist/Icon.svelte +7 -4
  4. package/dist/MillerIndexInput.svelte +2 -2
  5. package/dist/api/optimade.js +10 -7
  6. package/dist/app.css +68 -0
  7. package/dist/brillouin/BrillouinZone.svelte +90 -91
  8. package/dist/brillouin/BrillouinZone.svelte.d.ts +5 -7
  9. package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte +18 -14
  11. package/dist/brillouin/BrillouinZoneInfoPane.svelte +6 -10
  12. package/dist/brillouin/BrillouinZoneScene.svelte +46 -68
  13. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  14. package/dist/brillouin/compute.js +10 -16
  15. package/dist/brillouin/geometry.js +2 -2
  16. package/dist/chempot-diagram/ChemPotDiagram.svelte +48 -50
  17. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +61 -169
  18. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +1 -1
  19. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +559 -755
  20. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +1 -1
  21. package/dist/chempot-diagram/async-compute.svelte.js +13 -14
  22. package/dist/chempot-diagram/color.d.ts +21 -1
  23. package/dist/chempot-diagram/color.js +70 -1
  24. package/dist/chempot-diagram/compute.d.ts +7 -0
  25. package/dist/chempot-diagram/compute.js +85 -26
  26. package/dist/chempot-diagram/controls-state.svelte.js +1 -1
  27. package/dist/chempot-diagram/export.js +1 -6
  28. package/dist/chempot-diagram/temperature.js +9 -10
  29. package/dist/colors/index.d.ts +0 -4
  30. package/dist/colors/index.js +19 -20
  31. package/dist/composition/BarChart.svelte +30 -26
  32. package/dist/composition/BubbleChart.svelte +17 -17
  33. package/dist/composition/Composition.svelte +10 -19
  34. package/dist/composition/Formula.svelte +20 -27
  35. package/dist/composition/FormulaFilter.svelte +115 -184
  36. package/dist/composition/PieChart.svelte +55 -41
  37. package/dist/composition/format.js +7 -9
  38. package/dist/composition/index.d.ts +2 -0
  39. package/dist/composition/index.js +14 -0
  40. package/dist/composition/parse.d.ts +2 -2
  41. package/dist/composition/parse.js +61 -115
  42. package/dist/constants.d.ts +0 -1
  43. package/dist/constants.js +17 -26
  44. package/dist/convex-hull/ConvexHull.svelte +12 -15
  45. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
  46. package/dist/convex-hull/ConvexHull2D.svelte +93 -94
  47. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  48. package/dist/convex-hull/ConvexHull3D.svelte +127 -186
  49. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  50. package/dist/convex-hull/ConvexHull4D.svelte +131 -180
  51. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  52. package/dist/convex-hull/ConvexHullChrome.svelte +36 -40
  53. package/dist/convex-hull/ConvexHullControls.svelte +46 -48
  54. package/dist/convex-hull/ConvexHullStats.svelte +193 -195
  55. package/dist/convex-hull/ConvexHullTooltip.svelte +5 -12
  56. package/dist/convex-hull/GasPressureControls.svelte +5 -12
  57. package/dist/convex-hull/StructurePopup.svelte +18 -22
  58. package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
  59. package/dist/convex-hull/TemperatureSlider.svelte +4 -10
  60. package/dist/convex-hull/canvas-interactions.svelte.js +2 -1
  61. package/dist/convex-hull/gas-thermodynamics.js +21 -53
  62. package/dist/convex-hull/helpers.d.ts +8 -10
  63. package/dist/convex-hull/helpers.js +37 -43
  64. package/dist/convex-hull/hull-state.svelte.d.ts +1 -1
  65. package/dist/convex-hull/thermodynamics.js +37 -44
  66. package/dist/coordination/CoordinationBarPlot.svelte +49 -53
  67. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  68. package/dist/coordination/calc-coordination.d.ts +1 -1
  69. package/dist/coordination/calc-coordination.js +28 -25
  70. package/dist/element/BohrAtom.svelte +5 -9
  71. package/dist/element/ElementHeading.svelte +4 -1
  72. package/dist/element/ElementPhoto.svelte +11 -9
  73. package/dist/element/ElementStats.svelte +12 -10
  74. package/dist/element/ElementTile.svelte +44 -67
  75. package/dist/element/Nucleus.svelte +4 -2
  76. package/dist/element/data.d.ts +3 -2
  77. package/dist/element/data.js +5 -1
  78. package/dist/element/helpers.d.ts +4 -0
  79. package/dist/element/helpers.js +18 -0
  80. package/dist/element/index.d.ts +2 -5
  81. package/dist/element/index.js +4 -19
  82. package/dist/feedback/DragOverlay.svelte +5 -5
  83. package/dist/feedback/DragOverlay.svelte.d.ts +2 -2
  84. package/dist/feedback/StatusMessage.svelte +7 -4
  85. package/dist/fermi-surface/FermiSlice.svelte +21 -18
  86. package/dist/fermi-surface/FermiSurface.svelte +35 -44
  87. package/dist/fermi-surface/FermiSurface.svelte.d.ts +7 -13
  88. package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
  89. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  90. package/dist/fermi-surface/FermiSurfaceScene.svelte +64 -136
  91. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  92. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
  93. package/dist/fermi-surface/compute.js +25 -58
  94. package/dist/fermi-surface/parse.js +54 -88
  95. package/dist/file-viewer/JsonBrowser.svelte +1043 -0
  96. package/dist/file-viewer/JsonBrowser.svelte.d.ts +9 -0
  97. package/dist/file-viewer/PlotPanel.svelte +350 -0
  98. package/dist/file-viewer/PlotPanel.svelte.d.ts +9 -0
  99. package/dist/file-viewer/TrajectoryWithDos.svelte +30 -0
  100. package/dist/file-viewer/TrajectoryWithDos.svelte.d.ts +10 -0
  101. package/dist/file-viewer/detect.d.ts +11 -0
  102. package/dist/file-viewer/detect.js +381 -0
  103. package/dist/file-viewer/eligibility.d.ts +4 -0
  104. package/dist/file-viewer/eligibility.js +53 -0
  105. package/dist/file-viewer/host-protocol.d.ts +50 -0
  106. package/dist/file-viewer/host-transfer.d.ts +25 -0
  107. package/dist/file-viewer/host-transfer.js +42 -0
  108. package/dist/file-viewer/index.d.ts +5 -0
  109. package/dist/file-viewer/index.js +5 -0
  110. package/dist/file-viewer/main.d.ts +44 -0
  111. package/dist/file-viewer/main.js +535 -0
  112. package/dist/file-viewer/parse.d.ts +9 -0
  113. package/dist/file-viewer/parse.js +170 -0
  114. package/dist/file-viewer/plot-utils.d.ts +24 -0
  115. package/dist/file-viewer/plot-utils.js +191 -0
  116. package/dist/file-viewer/types.d.ts +4 -0
  117. package/dist/file-viewer/types.js +5 -0
  118. package/dist/heatmap-matrix/HeatmapMatrix.svelte +153 -219
  119. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +2 -2
  120. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +9 -7
  121. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +1 -1
  122. package/dist/heatmap-matrix/index.d.ts +5 -0
  123. package/dist/icons.d.ts +4 -0
  124. package/dist/icons.js +4 -0
  125. package/dist/index.d.ts +2 -2
  126. package/dist/index.js +1 -1
  127. package/dist/io/ExportPane.svelte +11 -7
  128. package/dist/io/decompress.d.ts +4 -1
  129. package/dist/io/decompress.js +24 -36
  130. package/dist/io/export.d.ts +11 -4
  131. package/dist/io/export.js +75 -19
  132. package/dist/io/fetch.d.ts +0 -3
  133. package/dist/io/fetch.js +0 -11
  134. package/dist/io/file-drop.js +60 -35
  135. package/dist/io/index.d.ts +0 -1
  136. package/dist/io/index.js +2 -9
  137. package/dist/io/is-binary.d.ts +9 -0
  138. package/dist/io/is-binary.js +45 -1
  139. package/dist/io/url-drop.d.ts +2 -0
  140. package/dist/io/url-drop.js +40 -40
  141. package/dist/isosurface/Isosurface.svelte +700 -215
  142. package/dist/isosurface/Isosurface.svelte.d.ts +7 -1
  143. package/dist/isosurface/IsosurfaceControls.svelte +590 -116
  144. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +1 -1
  145. package/dist/isosurface/VolumeSlice.svelte +224 -0
  146. package/dist/isosurface/VolumeSlice.svelte.d.ts +28 -0
  147. package/dist/isosurface/coloring.d.ts +20 -0
  148. package/dist/isosurface/coloring.js +118 -0
  149. package/dist/isosurface/geometry-worker-types.d.ts +38 -0
  150. package/dist/isosurface/geometry.worker.d.ts +1 -0
  151. package/dist/isosurface/geometry.worker.js +59 -0
  152. package/dist/isosurface/grid.d.ts +10 -0
  153. package/dist/isosurface/grid.js +31 -0
  154. package/dist/isosurface/index.d.ts +4 -0
  155. package/dist/isosurface/index.js +4 -0
  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 +6 -6
  159. package/dist/isosurface/profile.d.ts +12 -0
  160. package/dist/isosurface/profile.js +19 -0
  161. package/dist/isosurface/sampling.d.ts +34 -0
  162. package/dist/isosurface/sampling.js +408 -0
  163. package/dist/isosurface/slice-rendering.d.ts +13 -0
  164. package/dist/isosurface/slice-rendering.js +79 -0
  165. package/dist/isosurface/slice.d.ts +22 -2
  166. package/dist/isosurface/slice.js +200 -116
  167. package/dist/isosurface/types.d.ts +24 -1
  168. package/dist/isosurface/types.js +120 -8
  169. package/dist/json-path.d.ts +4 -0
  170. package/dist/json-path.js +89 -0
  171. package/dist/labels.d.ts +6 -2
  172. package/dist/labels.js +44 -14
  173. package/dist/layout/FullscreenButton.svelte +2 -1
  174. package/dist/layout/FullscreenToggle.svelte +10 -4
  175. package/dist/layout/InfoCard.svelte +8 -21
  176. package/dist/layout/InfoTag.svelte +1 -3
  177. package/dist/layout/NumberRangeInput.svelte +46 -0
  178. package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
  179. package/dist/layout/PropertyFilter.svelte +2 -6
  180. package/dist/layout/SettingsSection.svelte +57 -62
  181. package/dist/layout/SettingsSection.svelte.d.ts +6 -7
  182. package/dist/layout/SubpageGrid.svelte +3 -1
  183. package/dist/layout/ViewerChrome.svelte +16 -11
  184. package/dist/layout/ViewerChrome.svelte.d.ts +2 -1
  185. package/dist/layout/fullscreen.js +3 -5
  186. package/dist/layout/fullscreen.svelte.js +1 -2
  187. package/dist/layout/index.d.ts +1 -0
  188. package/dist/layout/index.js +1 -0
  189. package/dist/layout/json-tree/JsonNode.svelte +22 -59
  190. package/dist/layout/json-tree/JsonTree.svelte +101 -172
  191. package/dist/layout/json-tree/JsonValue.svelte +9 -32
  192. package/dist/layout/json-tree/utils.d.ts +0 -3
  193. package/dist/layout/json-tree/utils.js +50 -188
  194. package/dist/marching-cubes.d.ts +8 -1
  195. package/dist/marching-cubes.js +115 -48
  196. package/dist/math.d.ts +5 -2
  197. package/dist/math.js +48 -38
  198. package/dist/overlays/ContextMenu.svelte +19 -34
  199. package/dist/overlays/CopyButton.svelte +11 -5
  200. package/dist/overlays/DragControlTab.svelte +6 -1
  201. package/dist/overlays/DraggablePane.svelte +110 -74
  202. package/dist/overlays/DraggablePane.svelte.d.ts +2 -1
  203. package/dist/overlays/GlassChip.svelte +32 -0
  204. package/dist/overlays/GlassChip.svelte.d.ts +8 -0
  205. package/dist/overlays/InfoPaneCards.svelte +11 -23
  206. package/dist/overlays/index.d.ts +7 -0
  207. package/dist/overlays/index.js +26 -0
  208. package/dist/overlays/portal.d.ts +2 -0
  209. package/dist/overlays/portal.js +14 -0
  210. package/dist/periodic-table/PeriodicTable.svelte +113 -145
  211. package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
  212. package/dist/periodic-table/PeriodicTableControls.svelte +37 -115
  213. package/dist/periodic-table/TableInset.svelte +9 -4
  214. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +68 -105
  215. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
  216. package/dist/phase-diagram/PhaseDiagramControls.svelte +70 -94
  217. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
  218. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +2 -1
  219. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +12 -12
  220. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
  221. package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
  222. package/dist/phase-diagram/build-diagram.js +4 -9
  223. package/dist/phase-diagram/diagram-input.d.ts +1 -2
  224. package/dist/phase-diagram/parse.js +15 -15
  225. package/dist/phase-diagram/svg-to-diagram.js +28 -27
  226. package/dist/phase-diagram/utils.js +2 -3
  227. package/dist/plot/bar/BarPlot.svelte +461 -426
  228. package/dist/plot/bar/BarPlot.svelte.d.ts +2 -0
  229. package/dist/plot/bar/BarPlotControls.svelte +1 -3
  230. package/dist/plot/bar/BarPlotControls.svelte.d.ts +4 -6
  231. package/dist/plot/bar/SpacegroupBarPlot.svelte +46 -77
  232. package/dist/plot/bar/data.d.ts +5 -4
  233. package/dist/plot/bar/data.js +2 -1
  234. package/dist/plot/box/BoxPlot.svelte +322 -226
  235. package/dist/plot/box/BoxPlot.svelte.d.ts +2 -0
  236. package/dist/plot/box/Violin.svelte.d.ts +1 -0
  237. package/dist/plot/box/box-plot.js +1 -1
  238. package/dist/plot/core/auto-place.d.ts +1 -1
  239. package/dist/plot/core/auto-place.js +2 -2
  240. package/dist/plot/core/axis-utils.d.ts +12 -7
  241. package/dist/plot/core/axis-utils.js +48 -48
  242. package/dist/plot/core/components/AxisLabel.svelte +82 -20
  243. package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
  244. package/dist/plot/core/components/ColorBar.svelte +101 -106
  245. package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
  246. package/dist/plot/core/components/FillArea.svelte +10 -17
  247. package/dist/plot/core/components/HierarchyControls.svelte +249 -0
  248. package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
  249. package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
  250. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
  251. package/dist/plot/core/components/Line.svelte +18 -9
  252. package/dist/plot/core/components/Line.svelte.d.ts +2 -0
  253. package/dist/plot/core/components/PlotAxis.svelte +40 -17
  254. package/dist/plot/core/components/PlotControls.svelte +65 -41
  255. package/dist/plot/core/components/PlotLegend.svelte +31 -35
  256. package/dist/plot/core/components/PlotMarginals.svelte +616 -0
  257. package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
  258. package/dist/plot/core/components/PlotTooltip.svelte +1 -1
  259. package/dist/plot/core/components/PortalSelect.svelte +4 -8
  260. package/dist/plot/core/components/ReferenceLine.svelte +27 -24
  261. package/dist/plot/core/components/ReferenceLine3D.svelte +54 -57
  262. package/dist/plot/core/components/ReferencePlane.svelte +7 -8
  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 +27 -474
  271. package/dist/plot/core/data-transform.d.ts +1 -2
  272. package/dist/plot/core/data-transform.js +9 -15
  273. package/dist/plot/core/fill-utils.d.ts +3 -1
  274. package/dist/plot/core/fill-utils.js +28 -6
  275. package/dist/plot/core/index.d.ts +1 -0
  276. package/dist/plot/core/index.js +1 -0
  277. package/dist/plot/core/interactions.js +0 -2
  278. package/dist/plot/core/layout.d.ts +15 -6
  279. package/dist/plot/core/layout.js +57 -38
  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 +2 -4
  283. package/dist/plot/core/pan-zoom.svelte.js +34 -17
  284. package/dist/plot/core/placed-tween.svelte.d.ts +3 -0
  285. package/dist/plot/core/placed-tween.svelte.js +68 -21
  286. package/dist/plot/core/reference-line.js +1 -1
  287. package/dist/plot/core/scales.d.ts +23 -0
  288. package/dist/plot/core/scales.js +39 -13
  289. package/dist/plot/core/svg.js +0 -1
  290. package/dist/plot/core/types/fills.d.ts +101 -0
  291. package/dist/plot/core/types/fills.js +15 -0
  292. package/dist/plot/core/types/plot-3d.d.ts +87 -0
  293. package/dist/plot/core/types/plot-3d.js +4 -0
  294. package/dist/plot/core/types/reference-lines.d.ts +140 -0
  295. package/dist/plot/core/types/reference-lines.js +9 -0
  296. package/dist/plot/core/types.d.ts +29 -324
  297. package/dist/plot/core/types.js +23 -20
  298. package/dist/plot/core/utils/hierarchy-chart.d.ts +52 -0
  299. package/dist/plot/core/utils/hierarchy-chart.js +191 -0
  300. package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
  301. package/dist/plot/core/utils/hierarchy-labels.js +100 -0
  302. package/dist/plot/core/utils/label-placement.js +2 -2
  303. package/dist/plot/histogram/Histogram.svelte +314 -340
  304. package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
  305. package/dist/plot/histogram/HistogramControls.svelte +30 -28
  306. package/dist/plot/histogram/histogram.d.ts +31 -0
  307. package/dist/plot/histogram/histogram.js +70 -0
  308. package/dist/plot/histogram/index.d.ts +1 -0
  309. package/dist/plot/histogram/index.js +1 -0
  310. package/dist/plot/index.d.ts +1 -0
  311. package/dist/plot/index.js +1 -0
  312. package/dist/plot/sankey/Sankey.svelte +78 -69
  313. package/dist/plot/sankey/Sankey.svelte.d.ts +2 -2
  314. package/dist/plot/sankey/SankeyControls.svelte +22 -16
  315. package/dist/plot/sankey/sankey.js +13 -9
  316. package/dist/plot/scatter/BinnedScatterPlot.svelte +311 -141
  317. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +7 -0
  318. package/dist/plot/scatter/ElementScatter.svelte +4 -1
  319. package/dist/plot/scatter/ScatterPlot.svelte +517 -410
  320. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +2 -0
  321. package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
  322. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  323. package/dist/plot/scatter/ScatterPoint.svelte +16 -9
  324. package/dist/plot/scatter/adaptive-density.d.ts +1 -1
  325. package/dist/plot/scatter/adaptive-density.js +36 -20
  326. package/dist/plot/scatter/binned-scatter-types.d.ts +3 -2
  327. package/dist/plot/scatter/binned-scatter-types.js +6 -1
  328. package/dist/plot/scatter/scatter-data.d.ts +1 -1
  329. package/dist/plot/scatter/scatter-data.js +8 -7
  330. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +25 -34
  331. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +2 -2
  332. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +8 -5
  333. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +113 -116
  334. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +2 -2
  335. package/dist/plot/scatter-3d/Surface3D.svelte +4 -13
  336. package/dist/plot/sunburst/Sunburst.svelte +269 -347
  337. package/dist/plot/sunburst/Sunburst.svelte.d.ts +2 -2
  338. package/dist/plot/sunburst/index.d.ts +1 -1
  339. package/dist/plot/sunburst/index.js +2 -1
  340. package/dist/plot/sunburst/render.d.ts +2 -2
  341. package/dist/plot/sunburst/render.js +47 -22
  342. package/dist/plot/sunburst/sunburst.d.ts +5 -1
  343. package/dist/plot/sunburst/sunburst.js +10 -3
  344. package/dist/plot/treemap/Treemap.svelte +1022 -0
  345. package/dist/plot/treemap/Treemap.svelte.d.ts +90 -0
  346. package/dist/plot/treemap/index.d.ts +4 -0
  347. package/dist/plot/treemap/index.js +4 -0
  348. package/dist/plot/treemap/labels.d.ts +38 -0
  349. package/dist/plot/treemap/labels.js +80 -0
  350. package/dist/plot/treemap/treemap.d.ts +28 -0
  351. package/dist/plot/treemap/treemap.js +102 -0
  352. package/dist/rdf/RdfPlot.svelte +37 -59
  353. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  354. package/dist/rdf/calc-rdf.js +63 -52
  355. package/dist/rdf/index.d.ts +0 -1
  356. package/dist/sanitize.js +85 -27
  357. package/dist/scene/SceneCamera.svelte +1 -1
  358. package/dist/scene/SceneCamera.svelte.d.ts +1 -1
  359. package/dist/scene/bind-renderer.svelte.js +14 -6
  360. package/dist/scene/index.d.ts +1 -2
  361. package/dist/scene/index.js +1 -1
  362. package/dist/scene/{props.js → props.svelte.js} +15 -1
  363. package/dist/settings.d.ts +19 -9
  364. package/dist/settings.js +229 -525
  365. package/dist/spectral/Bands.svelte +207 -221
  366. package/dist/spectral/BandsAndDos.svelte +11 -9
  367. package/dist/spectral/BrillouinBandsDos.svelte +19 -42
  368. package/dist/spectral/Dos.svelte +92 -93
  369. package/dist/spectral/helpers.d.ts +3 -3
  370. package/dist/spectral/helpers.js +65 -140
  371. package/dist/state.svelte.js +5 -18
  372. package/dist/structure/Arrow.svelte +5 -18
  373. package/dist/structure/ArrowInstances.svelte +160 -0
  374. package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
  375. package/dist/structure/AtomLegend.svelte +120 -85
  376. package/dist/structure/AtomLegend.svelte.d.ts +2 -3
  377. package/dist/structure/Bond.svelte +31 -23
  378. package/dist/structure/CanvasTooltip.svelte +15 -3
  379. package/dist/structure/CellSelect.svelte +45 -35
  380. package/dist/structure/Cylinder.svelte +24 -40
  381. package/dist/structure/InstancedAtoms.svelte +114 -0
  382. package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
  383. package/dist/structure/Lattice.svelte +85 -149
  384. package/dist/structure/SiteLabels.svelte +122 -0
  385. package/dist/structure/SiteLabels.svelte.d.ts +18 -0
  386. package/dist/structure/Structure.svelte +636 -504
  387. package/dist/structure/Structure.svelte.d.ts +4 -2
  388. package/dist/structure/StructureCarousel.svelte +637 -0
  389. package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
  390. package/dist/structure/StructureControls.svelte +165 -425
  391. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  392. package/dist/structure/StructureExportPane.svelte +17 -21
  393. package/dist/structure/StructureInfoPane.svelte +128 -133
  394. package/dist/structure/StructureInfoPane.svelte.d.ts +1 -1
  395. package/dist/structure/StructureScene.svelte +535 -578
  396. package/dist/structure/StructureScene.svelte.d.ts +6 -2
  397. package/dist/structure/StructureViewport.svelte +451 -0
  398. package/dist/structure/StructureViewport.svelte.d.ts +65 -0
  399. package/dist/structure/atom-label-placement.d.ts +16 -12
  400. package/dist/structure/atom-label-placement.js +70 -37
  401. package/dist/structure/atom-properties.d.ts +2 -0
  402. package/dist/structure/atom-properties.js +105 -38
  403. package/dist/structure/bond-order-perception.js +3 -8
  404. package/dist/structure/bonding.d.ts +9 -3
  405. package/dist/structure/bonding.js +95 -46
  406. package/dist/structure/edit-history.d.ts +6 -0
  407. package/dist/structure/edit-history.js +27 -0
  408. package/dist/structure/export.d.ts +1 -0
  409. package/dist/structure/export.js +89 -105
  410. package/dist/structure/format-detect.d.ts +1 -0
  411. package/dist/structure/format-detect.js +20 -0
  412. package/dist/structure/geometry.d.ts +9 -0
  413. package/dist/structure/geometry.js +27 -0
  414. package/dist/structure/index.d.ts +16 -1
  415. package/dist/structure/index.js +15 -10
  416. package/dist/structure/measure.d.ts +1 -1
  417. package/dist/structure/measure.js +6 -12
  418. package/dist/structure/parse.d.ts +2 -1
  419. package/dist/structure/parse.js +272 -313
  420. package/dist/structure/partial-occupancy.js +10 -5
  421. package/dist/structure/pbc.js +85 -107
  422. package/dist/structure/polyhedra.d.ts +0 -1
  423. package/dist/structure/polyhedra.js +7 -21
  424. package/dist/structure/prop-groups.d.ts +85 -0
  425. package/dist/structure/prop-groups.js +18 -0
  426. package/dist/structure/supercell.d.ts +1 -2
  427. package/dist/structure/supercell.js +7 -13
  428. package/dist/symmetry/SymmetryElements.svelte +11 -15
  429. package/dist/symmetry/SymmetryStats.svelte +55 -71
  430. package/dist/symmetry/WyckoffTable.svelte +10 -28
  431. package/dist/symmetry/cell-transform.js +6 -14
  432. package/dist/symmetry/index.d.ts +1 -0
  433. package/dist/symmetry/index.js +13 -10
  434. package/dist/symmetry/spacegroups.js +3 -2
  435. package/dist/table/HeatmapTable.svelte +1142 -447
  436. package/dist/table/HeatmapTable.svelte.d.ts +12 -2
  437. package/dist/table/ToggleMenu.svelte +168 -53
  438. package/dist/table/ToggleMenu.svelte.d.ts +1 -1
  439. package/dist/table/index.d.ts +21 -6
  440. package/dist/table/index.js +34 -21
  441. package/dist/theme/ThemeControl.svelte +16 -8
  442. package/dist/theme/embedded.d.ts +18 -0
  443. package/dist/theme/embedded.js +206 -0
  444. package/dist/theme/index.d.ts +5 -5
  445. package/dist/theme/index.js +5 -12
  446. package/dist/theme/themes.mjs +44 -66
  447. package/dist/tooltip/KCoords.svelte +4 -1
  448. package/dist/tooltip/TooltipContent.svelte +3 -6
  449. package/dist/tooltip/TooltipContent.svelte.d.ts +1 -1
  450. package/dist/tooltip/index.d.ts +8 -1
  451. package/dist/trajectory/Trajectory.svelte +613 -386
  452. package/dist/trajectory/Trajectory.svelte.d.ts +1 -1
  453. package/dist/trajectory/TrajectoryError.svelte +12 -74
  454. package/dist/trajectory/TrajectoryExportPane.svelte +14 -32
  455. package/dist/trajectory/TrajectoryInfoPane.svelte +127 -164
  456. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +2 -1
  457. package/dist/trajectory/extract.js +61 -49
  458. package/dist/trajectory/format-detect.d.ts +2 -0
  459. package/dist/trajectory/format-detect.js +17 -13
  460. package/dist/trajectory/frame-reader.d.ts +2 -0
  461. package/dist/trajectory/frame-reader.js +35 -32
  462. package/dist/trajectory/helpers.d.ts +2 -0
  463. package/dist/trajectory/helpers.js +34 -56
  464. package/dist/trajectory/index.d.ts +1 -0
  465. package/dist/trajectory/index.js +5 -8
  466. package/dist/trajectory/parse/ase.js +1 -1
  467. package/dist/trajectory/parse/h5-utils.d.ts +13 -0
  468. package/dist/trajectory/parse/h5-utils.js +109 -0
  469. package/dist/trajectory/parse/hdf5.d.ts +1 -1
  470. package/dist/trajectory/parse/hdf5.js +116 -106
  471. package/dist/trajectory/parse/index.d.ts +6 -6
  472. package/dist/trajectory/parse/index.js +25 -33
  473. package/dist/trajectory/parse/lammps.js +8 -12
  474. package/dist/trajectory/parse/vasp.js +10 -7
  475. package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
  476. package/dist/trajectory/parse/vaspout-electronic.js +207 -0
  477. package/dist/trajectory/parse/vaspout-h5.d.ts +4 -0
  478. package/dist/trajectory/parse/vaspout-h5.js +281 -0
  479. package/dist/trajectory/parse/xyz.js +59 -9
  480. package/dist/trajectory/plotting.d.ts +8 -9
  481. package/dist/trajectory/plotting.js +113 -64
  482. package/dist/utils.d.ts +3 -0
  483. package/dist/utils.js +7 -0
  484. package/dist/xrd/XrdPlot.svelte +79 -118
  485. package/dist/xrd/broadening.js +2 -1
  486. package/dist/xrd/calc-xrd.js +24 -62
  487. package/dist/xrd/parse.d.ts +0 -1
  488. package/dist/xrd/parse.js +69 -95
  489. package/package.json +94 -34
  490. package/readme.md +6 -5
  491. package/dist/api/mp.d.ts +0 -6
  492. package/dist/api/mp.js +0 -22
  493. package/dist/plot/sunburst/SunburstControls.svelte +0 -200
  494. package/dist/scene/types.d.ts +0 -26
  495. package/dist/tooltip/types.d.ts +0 -8
  496. package/dist/trajectory/constants.d.ts +0 -6
  497. package/dist/trajectory/constants.js +0 -11
  498. /package/dist/{scene/types.js → file-viewer/host-protocol.js} +0 -0
  499. /package/dist/{tooltip/types.js → isosurface/geometry-worker-types.js} +0 -0
@@ -20,6 +20,7 @@ color/opacity instead of one mesh per element) and disposed on change/unmount. -
20
20
  <script lang="ts">
21
21
  import type { Matrix3x3, Vec2, Vec3 } from '../math'
22
22
  import * as math from '../math'
23
+ import { quaternion_from_direction } from '../structure/geometry'
23
24
  import type { ShowSymmetryKinds, SymmetryElement } from './symmetry-elements'
24
25
  import {
25
26
  clip_line_to_cell,
@@ -39,7 +40,6 @@ color/opacity instead of one mesh per element) and disposed on change/unmount. -
39
40
  LinearFilter,
40
41
  Matrix4,
41
42
  OctahedronGeometry,
42
- Quaternion,
43
43
  RepeatWrapping,
44
44
  RGBAFormat,
45
45
  Vector3,
@@ -92,7 +92,6 @@ color/opacity instead of one mesh per element) and disposed on change/unmount. -
92
92
  inversion_color?: string
93
93
  } = $props()
94
94
 
95
- const UP = new Vector3(0, 1, 0)
96
95
  const UNIT_SCALE = new Vector3(1, 1, 1)
97
96
 
98
97
  // 1D stripe alpha texture for glide fills (three.js alphaMap samples the GREEN
@@ -136,14 +135,12 @@ color/opacity instead of one mesh per element) and disposed on change/unmount. -
136
135
  dir_unit: Vector3,
137
136
  radius: number,
138
137
  length: number,
139
- ): CylinderGeometry =>
140
- new CylinderGeometry(radius, radius, length, 12).applyMatrix4(
141
- new Matrix4().compose(
142
- center,
143
- new Quaternion().setFromUnitVectors(UP, dir_unit),
144
- UNIT_SCALE,
145
- ),
138
+ ): CylinderGeometry => {
139
+ const orientation = quaternion_from_direction(dir_unit.toArray() as Vec3)
140
+ return new CylinderGeometry(radius, radius, length, 12).applyMatrix4(
141
+ new Matrix4().compose(center, orientation, UNIT_SCALE),
146
142
  )
143
+ }
147
144
 
148
145
  // Axes (cylinders) + rotoinversion center markers (spheres), merged per color/radius.
149
146
  // Pure rotations render solid; screw axes render DASHED so the two are
@@ -152,9 +149,9 @@ color/opacity instead of one mesh per element) and disposed on change/unmount. -
152
149
  const axis_groups: MaterialGroup[] = $derived.by(() => {
153
150
  const axis_elements = elements.filter(
154
151
  (elem) =>
155
- (elem.kind === `rotation` || elem.kind === `screw` ||
156
- elem.kind === `rotoinversion`) &&
157
- show_kinds[elem.kind] && elem.axis,
152
+ (elem.kind === `rotation` || elem.kind === `screw` || elem.kind === `rotoinversion`) &&
153
+ show_kinds[elem.kind] &&
154
+ elem.axis,
158
155
  )
159
156
  // Drop 2-fold axes coincident with a higher-order axis (4 contains 2, 6 contains
160
157
  // 2 and 3, -4 contains 2, …) to reduce visual clutter. Computed over the VISIBLE
@@ -168,9 +165,8 @@ color/opacity instead of one mesh per element) and disposed on change/unmount. -
168
165
 
169
166
  const parts_by_group = new Map<string, BufferGeometry[]>()
170
167
  for (const elem of axis_elements) {
171
- if (
172
- hide_redundant_axes && elem.order < (max_order_by_line.get(line_key(elem)) ?? 0)
173
- ) continue
168
+ if (hide_redundant_axes && elem.order < (max_order_by_line.get(line_key(elem)) ?? 0))
169
+ continue
174
170
  const clipped = clip_line_to_cell(elem.point, elem.axis as Vec3, lattice)
175
171
  if (!clipped) continue
176
172
  const [start, end] = clipped
@@ -61,9 +61,8 @@
61
61
  const crystal_sys = spg.spacegroup_to_crystal_sys(sym_data.number)
62
62
  const lattice_sys = spg.spacegroup_num_to_lattice_system(sym_data.number)
63
63
  if (!crystal_sys) return `?`
64
- const suffix = lattice_sys && lattice_sys !== crystal_sys
65
- ? ` (${lattice_sys} lattice)`
66
- : ``
64
+ const suffix =
65
+ lattice_sys && lattice_sys !== crystal_sys ? ` (${lattice_sys} lattice)` : ``
67
66
  return `${crystal_sys}${suffix}`
68
67
  })
69
68
 
@@ -89,33 +88,17 @@
89
88
  })
90
89
 
91
90
  const titles = {
92
- symprec:
93
- `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.`,
94
- algo:
95
- `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.`,
96
- space_group:
97
- `International Tables Space group number (1-230) - unique identifier for each space group. Higher numbers indicate more symmetries in the crystal.`,
98
- crystal_system:
99
- `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.`,
100
- hermann_mauguin:
101
- `Hermann-Mauguin symbol describes symmetry operations. Format: Lattice type + Point group symmetry. Example: P4/mmm = Primitive + 4-fold rotation + mirror planes`,
102
- hall_number:
103
- `Hall number: alternative numbering system for space groups. Useful for crystallographic software compatibility.`,
104
- pearson_symbol:
105
- `Pearson symbol. Format: Crystal system + Number of atoms per unit cell. Example: tP2 = tetragonal primitive with 2 atoms`,
106
- symmetry_operations:
107
- `Total symmetry operations that map the crystal structure onto itself. Includes rotations, translations, and combinations.`,
108
- distinct_orbits:
109
- `Number of unique Wyckoff positions (symmetry-equivalent atomic sites) in the crystal structure.`,
110
- wyckoff_sequence:
111
- `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).`,
112
- free_params:
113
- `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.`,
114
- settings:
115
- `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.`,
116
- translations: `Number of translations in the crystal structure.`,
117
- rotations: `Number of rotations in the crystal structure.`,
118
- roto_translations: `Number of roto-translations 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
+ distinct_orbits: `Number of unique Wyckoff positions (symmetry-equivalent atomic sites) in the crystal structure.`,
99
+ 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).`,
100
+ 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.`,
101
+ 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.`,
119
102
  }
120
103
  const tooltips: Record<string, string> = $derived(show_tooltips ? titles : {})
121
104
 
@@ -128,7 +111,7 @@
128
111
  const symprec_step = $derived(get_step_from_order_of_magnitude(settings.symprec))
129
112
  </script>
130
113
 
131
- <div {...rest} class="symmetry-stats {rest.class ?? ``}">
114
+ <div {...rest} class={[`symmetry-stats`, rest.class]}>
132
115
  {#if sym_data}
133
116
  {@render header?.({ sym_data, settings })}
134
117
  {/if}
@@ -168,10 +151,10 @@
168
151
  <select
169
152
  value={settings.algo}
170
153
  onchange={(evt) =>
171
- settings = {
172
- ...settings,
173
- algo: evt.currentTarget.value as `Moyo` | `Spglib`,
174
- }}
154
+ (settings = {
155
+ ...settings,
156
+ algo: evt.currentTarget.value as `Moyo` | `Spglib`,
157
+ })}
175
158
  >
176
159
  {#each Object.keys(SETTINGS_CONFIG.symmetry.algo.enum ?? {}) as value (value)}
177
160
  <option {value}>{value}</option>
@@ -182,48 +165,50 @@
182
165
 
183
166
  {@render children?.({ sym_data, settings })}
184
167
  {#if sym_data}
168
+ {@const stat_tiles = [
169
+ {
170
+ label: `Space Group`,
171
+ title: `${tooltips?.space_group} at ${settings.symprec} (using ${settings.algo} algo). ${tooltips?.hermann_mauguin}`,
172
+ value: `${sym_data.number} (${display_hm_symbol})`,
173
+ },
174
+ {
175
+ label: `Crystal System`,
176
+ title: tooltips?.crystal_system,
177
+ value: crystal_system_label,
178
+ },
179
+ {
180
+ label: `Hall Number`,
181
+ title: tooltips?.hall_number,
182
+ value: `${sym_data.hall_number}${
183
+ current_setting ? ` (${current_setting.hall_symbol})` : ``
184
+ }`,
185
+ },
186
+ { label: `Pearson`, title: tooltips?.pearson_symbol, value: sym_data.pearson_symbol },
187
+ { label: `Wyckoff Positions`, title: tooltips?.distinct_orbits, value: wyckoff_count },
188
+ wyckoff_seq && {
189
+ label: `Wyckoff Sequence`,
190
+ title: tooltips?.wyckoff_sequence,
191
+ value: wyckoff_seq,
192
+ },
193
+ free_params !== null && {
194
+ label: `Free Parameters`,
195
+ title: tooltips?.free_params,
196
+ value: free_params,
197
+ },
198
+ ].filter((tile) => typeof tile === `object`)}
185
199
  <div class="stats-grid">
186
- <div
187
- title="{tooltips?.space_group} at {settings.symprec} (using {settings.algo} algo). {tooltips?.hermann_mauguin}"
188
- {@attach tooltip()}
189
- >
190
- Space Group <strong>{sym_data.number} ({display_hm_symbol})</strong>
191
- </div>
192
- <div title={tooltips?.crystal_system} {@attach tooltip()}>
193
- Crystal System <strong>{crystal_system_label}</strong>
194
- </div>
195
- <div title={tooltips?.hall_number} {@attach tooltip()}>
196
- Hall Number <strong>
197
- {sym_data.hall_number}{
198
- current_setting ? ` (${current_setting.hall_symbol})` : ``
199
- }
200
- </strong>
201
- </div>
202
- <div title={tooltips?.pearson_symbol} {@attach tooltip()}>
203
- Pearson <strong>{sym_data.pearson_symbol}</strong>
204
- </div>
205
- <div title={tooltips?.distinct_orbits} {@attach tooltip()}>
206
- Wyckoff Positions <strong>{wyckoff_count}</strong>
207
- </div>
208
- {#if wyckoff_seq}
209
- <div title={tooltips?.wyckoff_sequence} {@attach tooltip()}>
210
- Wyckoff Sequence <strong>{wyckoff_seq}</strong>
211
- </div>
212
- {/if}
213
- {#if free_params !== null}
214
- <div title={tooltips?.free_params} {@attach tooltip()}>
215
- Free Parameters <strong>{free_params}</strong>
200
+ {#each stat_tiles as tile (tile.label)}
201
+ <div title={tile.title} {@attach tooltip()}>
202
+ {tile.label} <strong>{tile.value}</strong>
216
203
  </div>
217
- {/if}
204
+ {/each}
218
205
  <div
219
206
  class="sym-ops-summary"
220
207
  title="{sym_ops_counts.translations} translations + {sym_ops_counts.rotations} rotations + {sym_ops_counts.roto_translations} roto-translations"
221
208
  {@attach tooltip()}
222
209
  >
223
210
  Total sym ops: <strong>{sym_data.operations.length}</strong>
224
- ({sym_ops_counts.translations}T + {sym_ops_counts.rotations}R + {
225
- sym_ops_counts.roto_translations
226
- }RT)
211
+ ({sym_ops_counts.translations}T + {sym_ops_counts.rotations}R + {sym_ops_counts.roto_translations}RT)
227
212
  </div>
228
213
  </div>
229
214
  {#if settings_entries.length > 1}
@@ -287,8 +272,7 @@
287
272
  }
288
273
  .stats-grid {
289
274
  display: var(--sym-stats-display, grid);
290
- grid-template-columns:
291
- var(--sym-stats-grid-columns, repeat(auto-fit, minmax(275px, 1fr)));
275
+ grid-template-columns: var(--sym-stats-grid-columns, repeat(auto-fit, minmax(275px, 1fr)));
292
276
  gap: var(--sym-stats-grid-gap, 1ex 1em);
293
277
  margin-block: var(--sym-stats-grid-margin-block, 1ex);
294
278
  align-items: var(--sym-stats-grid-align, start);
@@ -39,9 +39,9 @@
39
39
  const occupied_letters = new SvelteSet(rows.map((row) => wyckoff_letter(row.wyckoff)))
40
40
  return db_positions
41
41
  .filter((pos) => !occupied_letters.has(pos.letter))
42
- .toSorted((pos_1, pos_2) =>
43
- pos_1.multiplicity - pos_2.multiplicity ||
44
- pos_1.letter.localeCompare(pos_2.letter)
42
+ .toSorted(
43
+ (pos_1, pos_2) =>
44
+ pos_1.multiplicity - pos_2.multiplicity || pos_1.letter.localeCompare(pos_2.letter),
45
45
  )
46
46
  })
47
47
  const has_ita_coords = $derived(
@@ -65,29 +65,10 @@
65
65
  </script>
66
66
 
67
67
  {#if rows.length > 0 || unoccupied_rows.length > 0}
68
- <table {...rest} class="wyckoff-table {rest.class ?? ``}">
68
+ <table {...rest} class={[`wyckoff-table`, rest.class]}>
69
69
  <thead>
70
70
  <tr>
71
- {#each [
72
- [`Wyckoff`, `Wyckoff position: Multiplicity + Letter`],
73
- [`Element`, `Chemical element symbol`],
74
- [`Fractional Coords`, `Fractional coordinates within the unit cell`],
75
- ...(has_ita_coords
76
- ? [[
77
- `ITA Coords`,
78
- `Representative coordinates from the International Tables: x/y/z mark free parameters, fractions mark symmetry-fixed coordinates`,
79
- ]]
80
- : []),
81
- ...(has_site_symmetry
82
- ? [[
83
- `Site Symm.`,
84
- `Site symmetry: point group of operations leaving the site invariant`,
85
- ]]
86
- : []),
87
- ] as
88
- [col, title]
89
- (col)
90
- }
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)}
91
72
  <th {title}>{col}</th>
92
73
  {/each}
93
74
  </tr>
@@ -121,13 +102,13 @@
121
102
  <td>
122
103
  <span
123
104
  style:background-color={colors.element[elem]}
124
- style="display: inline-block; padding: 0 6pt; border-radius: 3pt; line-height: 1.4"
105
+ style="display: inline-block; padding: 0 4pt; border-radius: 3pt; line-height: 1.25"
125
106
  {@attach contrast_color()}
126
107
  >
127
108
  {elem}
128
109
  </span>
129
110
  </td>
130
- <td>({abc?.map(format_fractional).join(` , `) ?? `N/A`})</td>
111
+ <td>({abc?.map(format_fractional).join(`, `) ?? `N/A`})</td>
131
112
  {#if has_ita_coords}
132
113
  <td>{wyckoff_pos.coordinates ? `(${wyckoff_pos.coordinates})` : ``}</td>
133
114
  {/if}
@@ -155,10 +136,11 @@
155
136
 
156
137
  <style>
157
138
  .wyckoff-table {
158
- margin-top: 1em;
139
+ margin-top: 0.5em;
140
+ border-collapse: collapse;
159
141
  }
160
142
  .wyckoff-table :is(th, td) {
161
- padding: 2px 6px;
143
+ padding: 1px 3px;
162
144
  text-align: center;
163
145
  vertical-align: middle;
164
146
  }
@@ -1,3 +1,4 @@
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';
@@ -18,10 +19,8 @@ original_structure) {
18
19
  // serialization for both input and output (see to_cell_json: column-major(B) ==
19
20
  // row-major(RB)), so the flat array is row-major with each row a lattice vector.
20
21
  const lattice_matrix = math.vec9_to_mat3x3([...cell.lattice.basis]);
21
- // Calculate lattice parameters from matrix
22
22
  const lattice_params = math.calc_lattice_params(lattice_matrix);
23
23
  const frac_to_cart = math.create_frac_to_cart(lattice_matrix);
24
- // Build sites from positions and atomic numbers
25
24
  const sites = cell.positions.map((abc, idx) => {
26
25
  const atomic_number = cell.numbers[idx];
27
26
  const element = ATOMIC_NUMBER_TO_SYMBOL[atomic_number];
@@ -30,11 +29,10 @@ original_structure) {
30
29
  }
31
30
  // Wrap fractional coordinates to [0, 1) range (moyo-wasm may return outside)
32
31
  const wrapped_abc = wrap_to_unit_cell(abc);
33
- const xyz = frac_to_cart(wrapped_abc);
34
32
  // Oxidation state is set to 0 (unknown) because moyo-wasm only provides atomic numbers.
35
33
  // transformed cell may have different/reordered sites, making it non-trivial to
36
34
  // map oxidation states from original structure.
37
- return make_site(element, wrapped_abc, xyz, element);
35
+ return make_site(element, wrapped_abc, frac_to_cart(wrapped_abc), element);
38
36
  });
39
37
  const lattice = {
40
38
  matrix: lattice_matrix,
@@ -54,14 +52,12 @@ original_structure) {
54
52
  // The conventional cell is the standard crystallographic setting for the space group.
55
53
  export function get_conventional_cell(original_structure, // The original input structure
56
54
  sym_data) {
57
- // The conventional cell as a Crystal
58
55
  return moyo_cell_to_structure(sym_data.std_cell, original_structure);
59
56
  }
60
57
  // Get the primitive cell from symmetry analysis data.
61
58
  // The primitive cell is the smallest unit cell with one lattice point.
62
59
  export function get_primitive_cell(original_structure, // The original input structure
63
60
  sym_data) {
64
- // The primitive cell as a Crystal
65
61
  return moyo_cell_to_structure(sym_data.prim_std_cell, original_structure);
66
62
  }
67
63
  // Transform a structure based on the selected cell type.
@@ -69,16 +65,12 @@ sym_data) {
69
65
  export function transform_cell(structure, // The original structure
70
66
  cell_type, // The desired cell type ('original', 'conventional', or 'primitive')
71
67
  sym_data) {
72
- //transformed structure (or original if no transformation needed)
73
- if (cell_type === `original` || !sym_data) {
68
+ if (!sym_data)
74
69
  return structure;
75
- }
76
- if (cell_type === `conventional`) {
70
+ if (cell_type === `conventional`)
77
71
  return get_conventional_cell(structure, sym_data);
78
- }
79
- if (cell_type === `primitive`) {
72
+ if (cell_type === `primitive`)
80
73
  return get_primitive_cell(structure, sym_data);
81
- }
82
- // Unknown cell_type at runtime (e.g. from stale persisted settings): leave unchanged
74
+ // 'original' or unknown runtime cell_type (e.g. stale persisted settings): unchanged
83
75
  return structure;
84
76
  }
@@ -48,6 +48,7 @@ export declare const map_std_to_orig_site_indices: (std_positions: Vec3[], std_n
48
48
  }, tol?: number) => number[][];
49
49
  export declare function analyze_structure_symmetry(struct_or_mol: AnyStructure, settings: Partial<SymmetrySettings>): Promise<SymmetryDataset>;
50
50
  export declare function simplicity_score(vec: number[]): number;
51
+ export declare const wyckoff_multiplicity: (label: string) => number;
51
52
  export declare function wyckoff_positions_from_moyo(sym_data: SymmetryDataset | null): WyckoffPos[];
52
53
  export declare function apply_symmetry_operations(position: Vec3, operations: MoyoDataset[`operations`]): Vec3[];
53
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[];
@@ -89,10 +89,9 @@ function get_site_atomic_number(site, site_idx) {
89
89
  best_occupancy = occupancy;
90
90
  }
91
91
  });
92
- if (selected_element === undefined) {
93
- throw new Error(`Unknown element at site ${site_idx}: ${selected_element}`);
94
- }
95
- const atomic_number = SYMBOL_TO_ATOMIC_NUMBER[selected_element];
92
+ const atomic_number = selected_element
93
+ ? SYMBOL_TO_ATOMIC_NUMBER[selected_element]
94
+ : undefined;
96
95
  if (atomic_number === undefined) {
97
96
  throw new Error(`Unknown element at site ${site_idx}: ${selected_element}`);
98
97
  }
@@ -233,17 +232,20 @@ function wyckoff_rows_from_input_orbits(sym_data) {
233
232
  };
234
233
  });
235
234
  }
236
- // Generate Wyckoff table rows from symmetry data by grouping moyo's input-cell sites into
237
- // crystallographic orbits. moyo's per-site arrays (wyckoffs, orbits, site_symmetry_symbols)
238
- // always index the input cell and analyze_structure_symmetry always attaches input_cell, so
239
- // the orbit grouping is the single source of truth for any input cell setting.
235
+ // Numeric multiplicity prefix of a Wyckoff label like `4a` (NaN when absent)
236
+ export const wyckoff_multiplicity = (label) => Number(/^\d+/.exec(label)?.[0] ?? NaN);
237
+ // Generate Wyckoff table rows from symmetry data via wyckoff_rows_from_input_orbits
238
+ // (analyze_structure_symmetry always attaches the input_cell that grouping needs).
240
239
  // Rows sort by ascending multiplicity, then Wyckoff label.
241
240
  export function wyckoff_positions_from_moyo(sym_data) {
242
241
  if (!sym_data)
243
242
  return [];
244
243
  const orbit_rows = wyckoff_rows_from_input_orbits(sym_data);
245
244
  return (orbit_rows ?? []).sort((w1, w2) => {
246
- const [w1_mult, w2_mult] = [parseInt(w1.wyckoff, 10), parseInt(w2.wyckoff, 10)];
245
+ const [w1_mult, w2_mult] = [
246
+ wyckoff_multiplicity(w1.wyckoff),
247
+ wyckoff_multiplicity(w2.wyckoff),
248
+ ];
247
249
  if (w1_mult !== w2_mult)
248
250
  return w1_mult - w2_mult;
249
251
  return w1.wyckoff.localeCompare(w2.wyckoff);
@@ -312,7 +314,8 @@ class WrappedPositionIndex {
312
314
  n_cells;
313
315
  constructor(positions, tolerance) {
314
316
  this.tolerance = tolerance;
315
- this.n_cells = Math.min(64, Math.max(1, Math.floor(1 / Math.max(tolerance, 1e-9))));
317
+ const inv_tolerance = Math.floor(1 / Math.max(tolerance, 1e-9));
318
+ this.n_cells = Math.min(64, Math.max(1, inv_tolerance));
316
319
  this.coords = positions;
317
320
  positions.forEach((pos, idx) => {
318
321
  const key = this.cell_key(pos, 0, 0, 0);
@@ -66,8 +66,9 @@ export function normalize_spacegroup(spacegroup) {
66
66
  const from_symbol = SPACEGROUP_SYMBOL_TO_NUM[spacegroup];
67
67
  if (from_symbol !== undefined)
68
68
  return from_symbol;
69
- const parsed = parseInt(spacegroup, 10);
70
- return isNaN(parsed) ? null : normalize_spacegroup(parsed);
69
+ // Accept trailing setting qualifiers like `146:R` by parsing the leading integer
70
+ const int_match = /^\s*(?<num>\d+)/.exec(spacegroup);
71
+ return int_match ? normalize_spacegroup(Number(int_match[1])) : null;
71
72
  }
72
73
  export const SPACEGROUP_SYMBOL_TO_NUM = {
73
74
  // Triclinic