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
@@ -2,31 +2,27 @@ import type { D3InterpolateName } from '../colors';
2
2
  import type { ElementSymbol } from '../element';
3
3
  import type { IsosurfaceSettings, VolumetricData } from '../isosurface/types';
4
4
  import type { Vec3 } from '../math';
5
- import type { CameraProjection, ShowBonds, VectorColorMode, VectorLayerConfig } from '../settings';
5
+ import type { SceneControlProps } from '../scene';
6
+ import type { ShowBonds, VectorColorMode, VectorLayerConfig } from '../settings';
6
7
  import type { AnyStructure, BondEditMode, BondOrder, MeasureMode, Site, StructureBond } from './';
7
8
  import { Lattice } from './';
8
9
  import type { AtomColorConfig } from './atom-properties';
10
+ import type { SymmetryElement } from '../symmetry';
11
+ import SymmetryElements from '../symmetry/SymmetryElements.svelte';
9
12
  import type { MoyoDataset } from '@spglib/moyo-wasm';
10
13
  import * as extras from '@threlte/extras';
11
14
  import { type ComponentProps, type Snippet } from 'svelte';
12
15
  import { SvelteMap } from 'svelte/reactivity';
13
- import { type Camera, type Scene } from 'three';
14
16
  import type { BondingStrategy } from './bonding';
15
- type $$ComponentProps = {
17
+ import type { PolyhedraColorMode } from './polyhedra';
18
+ type $$ComponentProps = SceneControlProps & {
16
19
  structure?: AnyStructure;
17
20
  base_structure?: AnyStructure;
18
21
  atom_radius?: number;
19
22
  same_size_atoms?: boolean;
20
23
  camera_position?: [x: number, y: number, z: number];
21
24
  camera_target?: Vec3;
22
- camera_projection?: CameraProjection;
23
- rotation_damping?: number;
24
- max_zoom?: number;
25
- min_zoom?: number;
26
- rotate_speed?: number;
27
- zoom_speed?: number;
28
- pan_speed?: number;
29
- zoom_to_cursor?: boolean;
25
+ camera_direction?: Vec3;
30
26
  show_atoms?: boolean;
31
27
  show_bonds?: ShowBonds;
32
28
  show_site_labels?: boolean;
@@ -42,23 +38,32 @@ type $$ComponentProps = {
42
38
  vector_shaft_radius?: number;
43
39
  vector_arrow_head_radius?: number;
44
40
  vector_arrow_head_length?: number;
45
- gizmo?: boolean | ComponentProps<typeof extras.Gizmo>;
46
41
  hovered_idx?: number | null;
47
42
  hovered_site?: Site | null;
48
43
  float_fmt?: string;
49
- auto_rotate?: number;
50
- initial_zoom?: number;
51
44
  bond_thickness?: number;
52
45
  bond_color?: string;
53
46
  bonding_strategy?: BondingStrategy;
54
47
  auto_bond_order?: boolean;
55
48
  aromatic_display?: `aromatic` | `kekule`;
56
49
  bonding_options?: Record<string, unknown>;
57
- fov?: number;
58
- ambient_light?: number;
59
- directional_light?: number;
50
+ show_polyhedra?: ShowBonds;
51
+ polyhedra_opacity?: number;
52
+ polyhedra_show_edges?: boolean;
53
+ polyhedra_edge_color?: string;
54
+ polyhedra_color_mode?: PolyhedraColorMode;
55
+ polyhedra_color?: string;
56
+ polyhedra_hide_center_atoms?: boolean;
57
+ polyhedra_min_neighbors?: number;
58
+ polyhedra_max_neighbors?: number;
59
+ polyhedra_excluded_elements?: readonly string[];
60
+ polyhedra_included_elements?: readonly string[];
61
+ polyhedra_rendered_elements?: string[];
60
62
  sphere_segments?: number;
61
63
  lattice_props?: ComponentProps<typeof Lattice>;
64
+ symmetry_elements?: SymmetryElement[];
65
+ symmetry_elements_props?: Omit<ComponentProps<typeof SymmetryElements>, `elements` | `lattice`>;
66
+ symmetry_declutter?: boolean;
62
67
  atom_label?: Snippet<[{
63
68
  site: Site;
64
69
  site_idx: number;
@@ -84,8 +89,6 @@ type $$ComponentProps = {
84
89
  active_sites?: number[];
85
90
  active_highlight_color?: string;
86
91
  rotation?: Vec3;
87
- scene?: Scene;
88
- camera?: Camera;
89
92
  orbit_controls?: ComponentProps<typeof extras.OrbitControls>[`ref`];
90
93
  rotation_target_ref?: Vec3;
91
94
  initial_computed_zoom?: number;
@@ -105,7 +108,8 @@ type $$ComponentProps = {
105
108
  dragging_atoms?: boolean;
106
109
  volumetric_data?: VolumetricData;
107
110
  isosurface_settings?: IsosurfaceSettings;
111
+ interactive?: boolean;
108
112
  };
109
- declare const StructureScene: import("svelte").Component<$$ComponentProps, {}, "cursor" | "site_label_offset" | "vector_configs" | "camera" | "scene" | "orbit_controls" | "site_radius_overrides" | "hovered_idx" | "hovered_site" | "camera_is_moving" | "selected_sites" | "measured_sites" | "added_bonds" | "removed_bonds" | "bond_order_overrides" | "bond_edit_mode" | "active_sites" | "rotation_target_ref" | "initial_computed_zoom" | "hidden_elements" | "hidden_prop_vals" | "element_radius_overrides" | "add_atom_mode" | "add_element" | "dragging_atoms">;
113
+ declare const StructureScene: import("svelte").Component<$$ComponentProps, {}, "cursor" | "camera" | "site_label_offset" | "vector_configs" | "orbit_controls" | "hovered_idx" | "hovered_site" | "polyhedra_rendered_elements" | "camera_is_moving" | "selected_sites" | "measured_sites" | "added_bonds" | "removed_bonds" | "bond_order_overrides" | "bond_edit_mode" | "active_sites" | "scene" | "rotation_target_ref" | "initial_computed_zoom" | "hidden_elements" | "hidden_prop_vals" | "element_radius_overrides" | "site_radius_overrides" | "add_atom_mode" | "add_element" | "dragging_atoms">;
110
114
  type StructureScene = ReturnType<typeof StructureScene>;
111
115
  export default StructureScene;
@@ -0,0 +1,386 @@
1
+ <script lang="ts">
2
+ // A single subcanvas (one Threlte <Canvas> + <StructureScene>) used by Structure.svelte
3
+ // for both the regular single view and each pane of the 2x2 multi-side view.
4
+ //
5
+ // Each viewport owns its camera: move tracking, reset (on reset_token), and orbit-target
6
+ // recentering on structure change. The primary pane (index 0) additionally binds out
7
+ // scene/camera for the export pane and receives the on_camera_move/on_camera_reset
8
+ // callbacks so it drives Structure's external camera API. Camera state is per-pane:
9
+ // the primary pane binds it back to Structure's scene_props, while side panes keep it local.
10
+ import type { ElementSymbol } from '../element'
11
+ import type { IsosurfaceSettings, VolumetricData } from '../isosurface/types'
12
+ import type { Vec3 } from '../math'
13
+ import type { CameraProjection } from '../settings'
14
+ import type {
15
+ AnyStructure,
16
+ BondEditMode,
17
+ BondOrder,
18
+ MeasureMode,
19
+ StructureBond,
20
+ StructureHandlerData,
21
+ } from './'
22
+ import type { MoyoDataset } from '@spglib/moyo-wasm'
23
+ import { Canvas } from '@threlte/core'
24
+ import type { ComponentProps } from 'svelte'
25
+ import { untrack } from 'svelte'
26
+ import { SvelteMap, SvelteSet } from 'svelte/reactivity'
27
+ import { WebGLRenderer, type Camera, type OrthographicCamera, type Scene } from 'three'
28
+ import type { AtomColorConfig } from './atom-properties'
29
+ import StructureScene from './StructureScene.svelte'
30
+
31
+ // WebGL contexts survive renderer.dispose() unless explicitly released.
32
+ class StructureRenderer extends WebGLRenderer {
33
+ constructor(parameters: ConstructorParameters<typeof WebGLRenderer>[0]) {
34
+ super(parameters)
35
+ globalThis.addEventListener(`pagehide`, this.release_context, { once: true })
36
+ }
37
+
38
+ private release_context = (): void => {
39
+ if (!this.getContext().isContextLost()) this.forceContextLoss()
40
+ }
41
+
42
+ override dispose() {
43
+ globalThis.removeEventListener(`pagehide`, this.release_context)
44
+ super.dispose()
45
+ this.release_context()
46
+ }
47
+ }
48
+
49
+ const create_renderer = (canvas: HTMLCanvasElement) =>
50
+ new StructureRenderer({
51
+ canvas,
52
+ powerPreference: `high-performance`,
53
+ antialias: true,
54
+ alpha: true,
55
+ })
56
+
57
+ let {
58
+ // Multi-view chrome
59
+ in_grid = false,
60
+ active = false,
61
+ label = undefined,
62
+ reset_token = 0,
63
+ interactive = true,
64
+ onactivate = undefined,
65
+ report_moved = undefined,
66
+ on_camera_move = undefined,
67
+ on_camera_reset = undefined,
68
+
69
+ // Shared scene inputs (one-way)
70
+ structure = undefined,
71
+ base_structure = undefined,
72
+ scene_props = {},
73
+ gizmo = false,
74
+ lattice_props = {},
75
+ volumetric_data = undefined,
76
+ isosurface_settings = undefined,
77
+ bond_edits_enabled = true,
78
+ bond_edit_order = 1,
79
+ measure_mode = `distance`,
80
+ atom_color_config = undefined,
81
+ sym_data = null,
82
+ active_sites = [],
83
+ camera_direction = undefined,
84
+ camera_projection = `orthographic`,
85
+ camera_position = $bindable([0, 0, 0]),
86
+ camera_target = $bindable(undefined),
87
+
88
+ // Edit-mode callbacks
89
+ on_sites_moved = undefined,
90
+ on_operation_start = undefined,
91
+ on_bond_edit_start = undefined,
92
+ on_add_atom = undefined,
93
+
94
+ // scene + camera are bound out for the primary pane (consumed by the export pane)
95
+ scene = $bindable(undefined),
96
+ camera = $bindable(undefined),
97
+
98
+ // Shared two-way scene state
99
+ selected_sites = $bindable([]),
100
+ measured_sites = $bindable([]),
101
+ hovered_site_idx = $bindable(null),
102
+ hidden_elements = $bindable(new SvelteSet<ElementSymbol>()),
103
+ hidden_prop_vals = $bindable(new SvelteSet<number | string>()),
104
+ element_radius_overrides = $bindable({}),
105
+ site_radius_overrides = $bindable(new SvelteMap<number, number>()),
106
+ added_bonds = $bindable([]),
107
+ removed_bonds = $bindable([]),
108
+ bond_order_overrides = $bindable([]),
109
+ bond_edit_mode = $bindable(`add`),
110
+ add_atom_mode = $bindable(false),
111
+ add_element = $bindable(`C`),
112
+ dragging_atoms = $bindable(false),
113
+ polyhedra_rendered_elements = $bindable([]),
114
+ }: {
115
+ in_grid?: boolean
116
+ active?: boolean
117
+ label?: string
118
+ reset_token?: number
119
+ interactive?: boolean
120
+ onactivate?: () => void
121
+ report_moved?: (moved: boolean) => void
122
+ on_camera_move?: (data: StructureHandlerData) => void
123
+ on_camera_reset?: (data: StructureHandlerData) => void
124
+ structure?: AnyStructure
125
+ base_structure?: AnyStructure
126
+ scene_props?: ComponentProps<typeof StructureScene>
127
+ gizmo?: boolean | ComponentProps<typeof StructureScene>[`gizmo`]
128
+ lattice_props?: ComponentProps<typeof StructureScene>[`lattice_props`]
129
+ volumetric_data?: VolumetricData
130
+ isosurface_settings?: IsosurfaceSettings
131
+ bond_edits_enabled?: boolean
132
+ bond_edit_order?: BondOrder
133
+ measure_mode?: MeasureMode
134
+ atom_color_config?: Partial<AtomColorConfig>
135
+ sym_data?: MoyoDataset | null
136
+ active_sites?: number[]
137
+ camera_direction?: Vec3
138
+ camera_projection?: CameraProjection
139
+ camera_position?: Vec3
140
+ camera_target?: Vec3
141
+ on_sites_moved?: (scene_indices: number[], delta: Vec3) => void
142
+ on_operation_start?: () => void
143
+ on_bond_edit_start?: () => void
144
+ on_add_atom?: (xyz: Vec3, element: ElementSymbol) => void
145
+ scene?: Scene
146
+ camera?: Camera
147
+ selected_sites?: number[]
148
+ measured_sites?: number[]
149
+ hovered_site_idx?: number | null
150
+ hidden_elements?: Set<ElementSymbol>
151
+ hidden_prop_vals?: Set<number | string>
152
+ element_radius_overrides?: Partial<Record<ElementSymbol, number>>
153
+ site_radius_overrides?: Map<number, number> | SvelteMap<number, number>
154
+ added_bonds?: StructureBond[]
155
+ removed_bonds?: StructureBond[]
156
+ bond_order_overrides?: StructureBond[]
157
+ bond_edit_mode?: BondEditMode
158
+ add_atom_mode?: boolean
159
+ add_element?: ElementSymbol
160
+ dragging_atoms?: boolean
161
+ polyhedra_rendered_elements?: string[]
162
+ } = $props()
163
+
164
+ // Cell-local dimensions (each pane is responsible for its own zoom sizing) and cursor
165
+ let width = $state(0)
166
+ let height = $state(0)
167
+ let cursor = $state(`default`)
168
+
169
+ // Multi-view panes are ~half the viewer, so shrink the (fixed 86px) viewport gizmo to
170
+ // stay proportional. Single view keeps the default size.
171
+ let gizmo_prop = $derived.by(() => {
172
+ if (!gizmo || !in_grid) return gizmo
173
+ const fifth_of_min_dim = Math.min(width, height) * 0.2
174
+ const size = Math.round(Math.max(34, Math.min(72, fifth_of_min_dim)))
175
+ return { ...(typeof gizmo === `object` ? gizmo : {}), size }
176
+ })
177
+
178
+ // Internal orbit controls are bound from StructureScene; camera_position/target are
179
+ // bindable above so the primary viewport can persist moves into scene_props.
180
+ let orbit_controls =
181
+ $state<ComponentProps<typeof StructureScene>[`orbit_controls`]>(undefined)
182
+ let rotation_target_ref = $state<Vec3 | undefined>(undefined)
183
+ let initial_computed_zoom = $state<number | undefined>(undefined)
184
+ let camera_is_moving = $state(false)
185
+
186
+ const read_orbit_target = (): Vec3 | undefined => {
187
+ if (!orbit_controls?.target) return
188
+ const { x, y, z } = orbit_controls.target
189
+ return [x, y, z]
190
+ }
191
+
192
+ const read_camera_position = (): Vec3 | undefined =>
193
+ camera ? [camera.position.x, camera.position.y, camera.position.z] : camera_position
194
+
195
+ // Reset this pane's camera. The primary pane is given on_camera_reset, so it also emits.
196
+ function reset_camera() {
197
+ camera_position = [0, 0, 0]
198
+ camera_target = rotation_target_ref
199
+ report_moved?.(false)
200
+ if (orbit_controls && camera) {
201
+ if (`reset` in orbit_controls && typeof orbit_controls.reset === `function`) {
202
+ orbit_controls.reset()
203
+ }
204
+ if (orbit_controls.target && rotation_target_ref) {
205
+ orbit_controls.target.set(...rotation_target_ref)
206
+ }
207
+ if (`zoom` in camera && initial_computed_zoom !== undefined) {
208
+ const ortho_camera = camera as OrthographicCamera
209
+ ortho_camera.zoom = initial_computed_zoom
210
+ ortho_camera.updateProjectionMatrix()
211
+ }
212
+ if (typeof orbit_controls.update === `function`) orbit_controls.update()
213
+ camera_position = read_camera_position() ?? camera_position
214
+ camera_target = read_orbit_target()
215
+ }
216
+ on_camera_reset?.({ structure, camera_has_moved: false, camera_position, camera_target })
217
+ }
218
+
219
+ // Track camera movement: keep camera_target in sync with the orbit controls and emit
220
+ // on_camera_move (primary pane only) while the controls are active.
221
+ $effect(() => {
222
+ if (!camera_is_moving) return
223
+ report_moved?.(true)
224
+ const sync = () => {
225
+ const pos = read_camera_position()
226
+ if (!pos) return
227
+ const target = read_orbit_target()
228
+ camera_position = pos
229
+ camera_target = target
230
+ on_camera_move?.({
231
+ structure,
232
+ camera_has_moved: true,
233
+ camera_position: pos,
234
+ camera_target: target,
235
+ })
236
+ }
237
+ sync()
238
+ const interval = setInterval(sync, 200)
239
+ return () => clearInterval(interval)
240
+ })
241
+
242
+ // Reset on parent request (reset-all button bumps reset_token for every pane)
243
+ let last_reset_token: number | undefined
244
+ $effect(() => {
245
+ const token = reset_token
246
+ if (last_reset_token !== undefined && token !== last_reset_token) {
247
+ untrack(reset_camera)
248
+ }
249
+ last_reset_token = token
250
+ })
251
+
252
+ // Clear stale camera state on structure change so each pane re-frames the new cell
253
+ // along its configured direction.
254
+ let viewport_first_run = true
255
+ $effect(() => {
256
+ void structure
257
+ if (viewport_first_run) {
258
+ viewport_first_run = false
259
+ return
260
+ }
261
+ untrack(() => {
262
+ // Preserve explicit camera props supplied alongside a structure change.
263
+ if (camera_target !== undefined || camera_position.some((coord) => coord !== 0)) return
264
+ camera_position = [0, 0, 0]
265
+ camera_target = undefined
266
+ })
267
+ })
268
+
269
+ function handle_dblclick(event: MouseEvent) {
270
+ const target = event.target
271
+ if (
272
+ target instanceof HTMLElement &&
273
+ [`BUTTON`, `INPUT`, `SELECT`].includes(target.tagName)
274
+ )
275
+ return
276
+ reset_camera()
277
+ }
278
+ </script>
279
+
280
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
281
+ <div
282
+ class="viewport-cell"
283
+ class:active
284
+ class:multi={in_grid}
285
+ style:--canvas-cursor={cursor}
286
+ bind:clientWidth={width}
287
+ bind:clientHeight={height}
288
+ onpointerenter={onactivate}
289
+ ondblclick={handle_dblclick}
290
+ >
291
+ {#if label}<span class="viewport-label">{label}</span>{/if}
292
+ <Canvas createRenderer={create_renderer}>
293
+ <StructureScene
294
+ {structure}
295
+ {base_structure}
296
+ {...scene_props}
297
+ {...in_grid ? { auto_rotate: 0 } : {}}
298
+ {camera_position}
299
+ {camera_target}
300
+ {camera_projection}
301
+ {camera_direction}
302
+ {interactive}
303
+ gizmo={gizmo_prop}
304
+ {lattice_props}
305
+ {volumetric_data}
306
+ {isosurface_settings}
307
+ bind:camera_is_moving
308
+ bind:selected_sites
309
+ {active_sites}
310
+ bind:hovered_idx={hovered_site_idx}
311
+ bind:measured_sites
312
+ bind:scene
313
+ bind:camera
314
+ bind:orbit_controls
315
+ bind:rotation_target_ref
316
+ bind:initial_computed_zoom
317
+ bind:hidden_elements
318
+ bind:hidden_prop_vals
319
+ bind:element_radius_overrides
320
+ bind:site_radius_overrides
321
+ bind:added_bonds
322
+ bind:removed_bonds
323
+ bind:bond_order_overrides
324
+ {bond_edits_enabled}
325
+ bind:bond_edit_mode
326
+ {bond_edit_order}
327
+ {measure_mode}
328
+ {width}
329
+ {height}
330
+ {atom_color_config}
331
+ {sym_data}
332
+ {on_sites_moved}
333
+ {on_operation_start}
334
+ {on_bond_edit_start}
335
+ {on_add_atom}
336
+ bind:add_atom_mode
337
+ bind:add_element
338
+ bind:cursor
339
+ bind:dragging_atoms
340
+ bind:polyhedra_rendered_elements
341
+ />
342
+ </Canvas>
343
+ </div>
344
+
345
+ <style>
346
+ .viewport-cell {
347
+ position: relative;
348
+ overflow: hidden;
349
+ box-sizing: border-box;
350
+ height: 100%;
351
+ width: 100%;
352
+ min-width: 0;
353
+ min-height: 0;
354
+ }
355
+ /* In multi-view, give each pane a subtle separator and highlight the active one */
356
+ .viewport-cell.multi {
357
+ border: 1px solid var(--struct-viewport-border, rgba(128, 128, 128, 0.35));
358
+ }
359
+ /* Let the active pane's hover tooltip overflow into neighboring panes instead of
360
+ being clipped, and raise it above sibling panes so it paints on top. The WebGL
361
+ canvas is sized to the cell by JS, so only HTML overlays (the tooltip) overflow. */
362
+ .viewport-cell.multi.active {
363
+ border-color: var(--struct-viewport-active-border, var(--accent-color, #4a9eff));
364
+ overflow: visible;
365
+ z-index: 1;
366
+ }
367
+ .viewport-label {
368
+ position: absolute;
369
+ top: 3px;
370
+ left: 5px;
371
+ z-index: 1;
372
+ pointer-events: none;
373
+ font-size: var(--struct-viewport-label-font-size, 0.8em);
374
+ font-weight: 500;
375
+ padding: 1px 5px;
376
+ border-radius: var(--border-radius, 3pt);
377
+ color: var(--struct-viewport-label-color, var(--text-color, currentColor));
378
+ background: var(
379
+ --struct-viewport-label-bg,
380
+ color-mix(in srgb, var(--page-bg, Canvas) 65%, transparent)
381
+ );
382
+ }
383
+ .viewport-cell :global(canvas) {
384
+ cursor: var(--canvas-cursor, default);
385
+ }
386
+ </style>
@@ -0,0 +1,63 @@
1
+ import type { ElementSymbol } from '../element';
2
+ import type { IsosurfaceSettings, VolumetricData } from '../isosurface/types';
3
+ import type { Vec3 } from '../math';
4
+ import type { CameraProjection } from '../settings';
5
+ import type { AnyStructure, BondEditMode, BondOrder, MeasureMode, StructureBond, StructureHandlerData } from './';
6
+ import type { MoyoDataset } from '@spglib/moyo-wasm';
7
+ import type { ComponentProps } from 'svelte';
8
+ import { SvelteMap } from 'svelte/reactivity';
9
+ import { type Camera, type Scene } from 'three';
10
+ import type { AtomColorConfig } from './atom-properties';
11
+ import StructureScene from './StructureScene.svelte';
12
+ type $$ComponentProps = {
13
+ in_grid?: boolean;
14
+ active?: boolean;
15
+ label?: string;
16
+ reset_token?: number;
17
+ interactive?: boolean;
18
+ onactivate?: () => void;
19
+ report_moved?: (moved: boolean) => void;
20
+ on_camera_move?: (data: StructureHandlerData) => void;
21
+ on_camera_reset?: (data: StructureHandlerData) => void;
22
+ structure?: AnyStructure;
23
+ base_structure?: AnyStructure;
24
+ scene_props?: ComponentProps<typeof StructureScene>;
25
+ gizmo?: boolean | ComponentProps<typeof StructureScene>[`gizmo`];
26
+ lattice_props?: ComponentProps<typeof StructureScene>[`lattice_props`];
27
+ volumetric_data?: VolumetricData;
28
+ isosurface_settings?: IsosurfaceSettings;
29
+ bond_edits_enabled?: boolean;
30
+ bond_edit_order?: BondOrder;
31
+ measure_mode?: MeasureMode;
32
+ atom_color_config?: Partial<AtomColorConfig>;
33
+ sym_data?: MoyoDataset | null;
34
+ active_sites?: number[];
35
+ camera_direction?: Vec3;
36
+ camera_projection?: CameraProjection;
37
+ camera_position?: Vec3;
38
+ camera_target?: Vec3;
39
+ on_sites_moved?: (scene_indices: number[], delta: Vec3) => void;
40
+ on_operation_start?: () => void;
41
+ on_bond_edit_start?: () => void;
42
+ on_add_atom?: (xyz: Vec3, element: ElementSymbol) => void;
43
+ scene?: Scene;
44
+ camera?: Camera;
45
+ selected_sites?: number[];
46
+ measured_sites?: number[];
47
+ hovered_site_idx?: number | null;
48
+ hidden_elements?: Set<ElementSymbol>;
49
+ hidden_prop_vals?: Set<number | string>;
50
+ element_radius_overrides?: Partial<Record<ElementSymbol, number>>;
51
+ site_radius_overrides?: Map<number, number> | SvelteMap<number, number>;
52
+ added_bonds?: StructureBond[];
53
+ removed_bonds?: StructureBond[];
54
+ bond_order_overrides?: StructureBond[];
55
+ bond_edit_mode?: BondEditMode;
56
+ add_atom_mode?: boolean;
57
+ add_element?: ElementSymbol;
58
+ dragging_atoms?: boolean;
59
+ polyhedra_rendered_elements?: string[];
60
+ };
61
+ declare const StructureViewport: import("svelte").Component<$$ComponentProps, {}, "camera" | "camera_position" | "camera_target" | "polyhedra_rendered_elements" | "selected_sites" | "measured_sites" | "added_bonds" | "removed_bonds" | "bond_order_overrides" | "bond_edit_mode" | "scene" | "hidden_elements" | "hidden_prop_vals" | "element_radius_overrides" | "site_radius_overrides" | "add_atom_mode" | "add_element" | "dragging_atoms" | "hovered_site_idx">;
62
+ type StructureViewport = ReturnType<typeof StructureViewport>;
63
+ export default StructureViewport;
@@ -0,0 +1,18 @@
1
+ import type { Vec3 } from '../math';
2
+ import type { Camera } from 'three';
3
+ import { Matrix4 } from 'three';
4
+ export declare const LABEL_OFFSET_EPS = 1e-9;
5
+ export declare const choose_site_label_offset: (bond_directions: Vec3[], base_offset: Vec3) => Vec3;
6
+ export type LabelPlacement = {
7
+ x: number;
8
+ y: number;
9
+ visible: boolean;
10
+ };
11
+ export declare class LabelProjector {
12
+ #private;
13
+ update(camera: Camera, anchor_world_matrix: Matrix4, size: {
14
+ width: number;
15
+ height: number;
16
+ }, margin: number): void;
17
+ place(position: Vec3, offset: Vec3, visual_radius: number, out: LabelPlacement): void;
18
+ }
@@ -0,0 +1,115 @@
1
+ import * as math from '../math';
2
+ import { Matrix4 } from 'three';
3
+ export const LABEL_OFFSET_EPS = 1e-9;
4
+ const LABEL_OFFSET_DIRECTIONS = [
5
+ [0, -1, 0],
6
+ [1, 0, 0],
7
+ [-1, 0, 0],
8
+ [1, 1, 0],
9
+ [-1, 1, 0],
10
+ [1, -1, 0],
11
+ [-1, -1, 0],
12
+ [0, 0, 1],
13
+ [0, 0, -1],
14
+ ];
15
+ const label_direction_score = (direction, bond_directions, preferred_direction) => {
16
+ let max_bond_alignment = 0;
17
+ for (const bond_direction of bond_directions) {
18
+ max_bond_alignment = Math.max(max_bond_alignment, Math.max(0, math.dot(direction, bond_direction)));
19
+ }
20
+ const preferred_bonus = Math.max(0, math.dot(direction, preferred_direction)) * 0.05;
21
+ const screen_plane_bonus = Math.abs(direction[2]) < LABEL_OFFSET_EPS ? 0.02 : 0;
22
+ return -max_bond_alignment + preferred_bonus + screen_plane_bonus;
23
+ };
24
+ export const choose_site_label_offset = (bond_directions, base_offset) => {
25
+ const offset_length = Math.hypot(...base_offset);
26
+ if (offset_length < LABEL_OFFSET_EPS || bond_directions.length === 0) {
27
+ return base_offset;
28
+ }
29
+ const preferred_direction = math.normalize_vec(base_offset, [0, 1, 0]);
30
+ const repulsion_direction = math.normalize_vec(bond_directions.reduce((offset_sum, bond_direction) => math.subtract(offset_sum, bond_direction), [0, 0, 0]), preferred_direction);
31
+ let best_direction = preferred_direction;
32
+ let best_score = -Infinity;
33
+ for (const candidate_direction of [
34
+ preferred_direction,
35
+ repulsion_direction,
36
+ ...LABEL_OFFSET_DIRECTIONS,
37
+ ]) {
38
+ const direction = math.normalize_vec(candidate_direction, preferred_direction);
39
+ const score = label_direction_score(direction, bond_directions, preferred_direction);
40
+ if (score <= best_score + LABEL_OFFSET_EPS)
41
+ continue;
42
+ best_score = score;
43
+ best_direction = direction;
44
+ }
45
+ return math.scale(best_direction, offset_length);
46
+ };
47
+ // Per-frame screen projector for label overlays. `update()` precomputes the
48
+ // combined model-view-projection once per frame; `place()` then resolves each
49
+ // label with a single clip-space transform and zero allocations (labels run
50
+ // per site per frame, so the old 3-projections-per-label path with fresh
51
+ // Vector3s dominated frame time on large supercells).
52
+ //
53
+ // Placement semantics match the previous label_screen_position helper: the
54
+ // label sits `atom_screen_radius + margin` px from the atom center along the
55
+ // screen direction of its offset. The projected radius is measured along the
56
+ // camera's right axis, which for both projections equals
57
+ // visual_radius * projection[5] * (height/2) / clip_w.
58
+ export class LabelProjector {
59
+ #mvp = new Matrix4(); // projection * view * anchor (local -> clip space)
60
+ #view = new Matrix4(); // view * anchor (local -> view space, for behind-camera test)
61
+ #half_width = 0;
62
+ #half_height = 0;
63
+ #radius_scale = 0; // clip-space multiplier for projected atom radius
64
+ #margin = 0;
65
+ update(camera, anchor_world_matrix, size, margin) {
66
+ this.#view.multiplyMatrices(camera.matrixWorldInverse, anchor_world_matrix);
67
+ this.#mvp.multiplyMatrices(camera.projectionMatrix, this.#view);
68
+ this.#half_width = size.width / 2;
69
+ this.#half_height = size.height / 2;
70
+ // projectionMatrix[5] = cot(fov/2) for perspective, 2/(top-bottom) for ortho
71
+ this.#radius_scale = camera.projectionMatrix.elements[5] * this.#half_height;
72
+ this.#margin = margin;
73
+ }
74
+ // position + offset: label anchor and preferred direction in anchor-local
75
+ // space; visual_radius: atom radius in the same units
76
+ place(position, offset, visual_radius, out) {
77
+ const [pos_x, pos_y, pos_z] = position;
78
+ const mvp = this.#mvp.elements;
79
+ const view = this.#view.elements;
80
+ // Behind-camera test in view space (camera looks down -z)
81
+ const view_z = view[2] * pos_x + view[6] * pos_y + view[10] * pos_z + view[14];
82
+ if (view_z > 0) {
83
+ out.visible = false;
84
+ return;
85
+ }
86
+ const clip_x = mvp[0] * pos_x + mvp[4] * pos_y + mvp[8] * pos_z + mvp[12];
87
+ const clip_y = mvp[1] * pos_x + mvp[5] * pos_y + mvp[9] * pos_z + mvp[13];
88
+ const clip_w = mvp[3] * pos_x + mvp[7] * pos_y + mvp[11] * pos_z + mvp[15];
89
+ const screen_x = (clip_x / clip_w) * this.#half_width + this.#half_width;
90
+ const screen_y = (-clip_y / clip_w) * this.#half_height + this.#half_height;
91
+ // Screen direction of the offset: project position + offset and take the
92
+ // screen-space delta. Projecting the second point (instead of just rotating
93
+ // the offset into view space) keeps perspective foreshortening exact for
94
+ // offsets with a depth component, matching the pre-projector behavior.
95
+ const [off_x, off_y, off_z] = offset;
96
+ const end_x = pos_x + off_x;
97
+ const end_y = pos_y + off_y;
98
+ const end_z = pos_z + off_z;
99
+ const end_clip_x = mvp[0] * end_x + mvp[4] * end_y + mvp[8] * end_z + mvp[12];
100
+ const end_clip_y = mvp[1] * end_x + mvp[5] * end_y + mvp[9] * end_z + mvp[13];
101
+ const end_clip_w = mvp[3] * end_x + mvp[7] * end_y + mvp[11] * end_z + mvp[15];
102
+ const delta_x = (end_clip_x / end_clip_w) * this.#half_width + this.#half_width - screen_x;
103
+ const delta_y = (-end_clip_y / end_clip_w) * this.#half_height + this.#half_height - screen_y;
104
+ const dir_len = Math.hypot(delta_x, delta_y);
105
+ // Offsets along the view axis have no screen direction; nudge upward like
106
+ // the previous implementation (screen y grows downward)
107
+ const dir_x = dir_len > LABEL_OFFSET_EPS ? delta_x / dir_len : 0;
108
+ const dir_y = dir_len > LABEL_OFFSET_EPS ? delta_y / dir_len : off_y >= 0 ? -1 : 1;
109
+ const atom_screen_radius = (visual_radius * this.#radius_scale) / clip_w;
110
+ const screen_gap = Math.abs(atom_screen_radius) + this.#margin;
111
+ out.x = screen_x + dir_x * screen_gap;
112
+ out.y = screen_y + dir_y * screen_gap;
113
+ out.visible = true;
114
+ }
115
+ }