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
@@ -22,6 +22,7 @@ type $$ComponentProps = SceneControlProps & {
22
22
  same_size_atoms?: boolean;
23
23
  camera_position?: [x: number, y: number, z: number];
24
24
  camera_target?: Vec3;
25
+ camera_direction?: Vec3;
25
26
  show_atoms?: boolean;
26
27
  show_bonds?: ShowBonds;
27
28
  show_site_labels?: boolean;
@@ -105,9 +106,12 @@ type $$ComponentProps = SceneControlProps & {
105
106
  add_element?: ElementSymbol;
106
107
  cursor?: string;
107
108
  dragging_atoms?: boolean;
108
- volumetric_data?: VolumetricData;
109
+ volumetric_data?: VolumetricData | VolumetricData[];
109
110
  isosurface_settings?: IsosurfaceSettings;
111
+ active_volume_idx?: number;
112
+ volume_scaling?: Vec3;
113
+ interactive?: boolean;
110
114
  };
111
- declare const StructureScene: import("svelte").Component<$$ComponentProps, {}, "cursor" | "hidden_elements" | "hidden_prop_vals" | "element_radius_overrides" | "site_radius_overrides" | "selected_sites" | "site_label_offset" | "vector_configs" | "hovered_idx" | "hovered_site" | "polyhedra_rendered_elements" | "camera_is_moving" | "measured_sites" | "added_bonds" | "removed_bonds" | "bond_order_overrides" | "bond_edit_mode" | "active_sites" | "scene" | "camera" | "orbit_controls" | "rotation_target_ref" | "initial_computed_zoom" | "add_atom_mode" | "add_element" | "dragging_atoms">;
115
+ 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">;
112
116
  type StructureScene = ReturnType<typeof StructureScene>;
113
117
  export default StructureScene;
@@ -0,0 +1,451 @@
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 { StatusMessage } from '../feedback'
12
+ import type { IsosurfaceSettings, VolumetricData } from '../isosurface/types'
13
+ import type { Vec3 } from '../math'
14
+ import type { CameraProjection } from '../settings'
15
+ import type {
16
+ AnyStructure,
17
+ BondEditMode,
18
+ BondOrder,
19
+ MeasureMode,
20
+ StructureBond,
21
+ StructureHandlerData,
22
+ } from './'
23
+ import type { MoyoDataset } from '@spglib/moyo-wasm'
24
+ import { Canvas } from '@threlte/core'
25
+ import type { ComponentProps } from 'svelte'
26
+ import { untrack } from 'svelte'
27
+ import { SvelteMap, SvelteSet } from 'svelte/reactivity'
28
+ import { WebGLRenderer, type Camera, type OrthographicCamera, type Scene } from 'three'
29
+ import type { AtomColorConfig } from './atom-properties'
30
+ import StructureScene from './StructureScene.svelte'
31
+
32
+ // WebGL contexts survive renderer.dispose() unless explicitly released.
33
+ class StructureRenderer extends WebGLRenderer {
34
+ constructor(parameters: ConstructorParameters<typeof WebGLRenderer>[0]) {
35
+ super(parameters)
36
+ globalThis.addEventListener(`pagehide`, this.release_context, { once: true })
37
+ }
38
+
39
+ private release_context = (): void => {
40
+ if (!this.getContext().isContextLost()) this.forceContextLoss()
41
+ }
42
+
43
+ override dispose() {
44
+ globalThis.removeEventListener(`pagehide`, this.release_context)
45
+ super.dispose()
46
+ this.release_context()
47
+ }
48
+ }
49
+
50
+ // Self-heal evicted WebGL contexts: browsers cap live contexts (~8-16 per
51
+ // page) and evict the oldest without notice, leaving its canvas permanently
52
+ // blank. three.js handles `webglcontextrestored` when the browser restores
53
+ // on its own; when it doesn't, remount the <Canvas> for a fresh context.
54
+ // Bounded retries avoid eviction ping-pong when over the context budget.
55
+ let canvas_remount_token = $state(0)
56
+ let remount_timer: ReturnType<typeof setTimeout> | undefined
57
+ let recovery_reset_timer: ReturnType<typeof setTimeout> | undefined
58
+ let recovery_attempts = 0
59
+ let recovery_failed = $state(false)
60
+
61
+ const create_renderer = (canvas: HTMLCanvasElement) => {
62
+ canvas.addEventListener(`webglcontextlost`, () => {
63
+ // canvas.isConnected is false when the loss came from our own dispose()
64
+ // (component unmounted), not from browser eviction
65
+ if (!canvas.isConnected) return
66
+ clearTimeout(recovery_reset_timer)
67
+ if (recovery_attempts >= 3) {
68
+ recovery_failed = true
69
+ return
70
+ }
71
+ recovery_attempts += 1
72
+ remount_timer = setTimeout(() => (canvas_remount_token += 1), 1000)
73
+ })
74
+ canvas.addEventListener(`webglcontextrestored`, () => {
75
+ clearTimeout(remount_timer)
76
+ recovery_attempts = 0
77
+ recovery_failed = false
78
+ })
79
+ const renderer = new StructureRenderer({
80
+ canvas,
81
+ powerPreference: `high-performance`,
82
+ antialias: true,
83
+ alpha: true,
84
+ })
85
+ // Reset only after a stable remount; an immediate reset would allow
86
+ // endless eviction ping-pong while the page exceeds its context budget.
87
+ recovery_reset_timer = setTimeout(() => (recovery_attempts = 0), 5000)
88
+ return renderer
89
+ }
90
+
91
+ let {
92
+ // Multi-view chrome
93
+ in_grid = false,
94
+ active = false,
95
+ label = undefined,
96
+ reset_token = 0,
97
+ interactive = true,
98
+ onactivate = undefined,
99
+ report_moved = undefined,
100
+ on_camera_move = undefined,
101
+ on_camera_reset = undefined,
102
+
103
+ // Shared scene inputs (one-way)
104
+ structure = undefined,
105
+ base_structure = undefined,
106
+ scene_props = {},
107
+ gizmo = false,
108
+ lattice_props = {},
109
+ volumetric_data = undefined,
110
+ isosurface_settings = undefined,
111
+ active_volume_idx = 0,
112
+ volume_scaling = [1, 1, 1],
113
+ bond_edits_enabled = true,
114
+ bond_edit_order = 1,
115
+ measure_mode = `distance`,
116
+ atom_color_config = undefined,
117
+ sym_data = null,
118
+ active_sites = [],
119
+ camera_direction = undefined,
120
+ camera_projection = `orthographic`,
121
+ camera_position = $bindable([0, 0, 0]),
122
+ camera_target = $bindable(undefined),
123
+
124
+ // Edit-mode callbacks
125
+ on_sites_moved = undefined,
126
+ on_operation_start = undefined,
127
+ on_bond_edit_start = undefined,
128
+ on_add_atom = undefined,
129
+
130
+ // scene + camera are bound out for the primary pane (consumed by the export pane)
131
+ scene = $bindable(undefined),
132
+ camera = $bindable(undefined),
133
+
134
+ // Shared two-way scene state
135
+ selected_sites = $bindable([]),
136
+ measured_sites = $bindable([]),
137
+ hovered_site_idx = $bindable(null),
138
+ hidden_elements = $bindable(new SvelteSet<ElementSymbol>()),
139
+ hidden_prop_vals = $bindable(new SvelteSet<number | string>()),
140
+ element_radius_overrides = $bindable({}),
141
+ site_radius_overrides = $bindable(new SvelteMap<number, number>()),
142
+ added_bonds = $bindable([]),
143
+ removed_bonds = $bindable([]),
144
+ bond_order_overrides = $bindable([]),
145
+ bond_edit_mode = $bindable(`add`),
146
+ add_atom_mode = $bindable(false),
147
+ add_element = $bindable(`C`),
148
+ dragging_atoms = $bindable(false),
149
+ polyhedra_rendered_elements = $bindable([]),
150
+ }: {
151
+ in_grid?: boolean
152
+ active?: boolean
153
+ label?: string
154
+ reset_token?: number
155
+ interactive?: boolean
156
+ onactivate?: () => void
157
+ report_moved?: (moved: boolean) => void
158
+ on_camera_move?: (data: StructureHandlerData) => void
159
+ on_camera_reset?: (data: StructureHandlerData) => void
160
+ structure?: AnyStructure
161
+ base_structure?: AnyStructure
162
+ scene_props?: ComponentProps<typeof StructureScene>
163
+ gizmo?: boolean | ComponentProps<typeof StructureScene>[`gizmo`]
164
+ lattice_props?: ComponentProps<typeof StructureScene>[`lattice_props`]
165
+ volumetric_data?: VolumetricData | VolumetricData[]
166
+ isosurface_settings?: IsosurfaceSettings
167
+ active_volume_idx?: number
168
+ volume_scaling?: Vec3
169
+ bond_edits_enabled?: boolean
170
+ bond_edit_order?: BondOrder
171
+ measure_mode?: MeasureMode
172
+ atom_color_config?: Partial<AtomColorConfig>
173
+ sym_data?: MoyoDataset | null
174
+ active_sites?: number[]
175
+ camera_direction?: Vec3
176
+ camera_projection?: CameraProjection
177
+ camera_position?: Vec3
178
+ camera_target?: Vec3
179
+ on_sites_moved?: (scene_indices: number[], delta: Vec3) => void
180
+ on_operation_start?: () => void
181
+ on_bond_edit_start?: () => void
182
+ on_add_atom?: (xyz: Vec3, element: ElementSymbol) => void
183
+ scene?: Scene
184
+ camera?: Camera
185
+ selected_sites?: number[]
186
+ measured_sites?: number[]
187
+ hovered_site_idx?: number | null
188
+ hidden_elements?: Set<ElementSymbol>
189
+ hidden_prop_vals?: Set<number | string>
190
+ element_radius_overrides?: Partial<Record<ElementSymbol, number>>
191
+ site_radius_overrides?: Map<number, number> | SvelteMap<number, number>
192
+ added_bonds?: StructureBond[]
193
+ removed_bonds?: StructureBond[]
194
+ bond_order_overrides?: StructureBond[]
195
+ bond_edit_mode?: BondEditMode
196
+ add_atom_mode?: boolean
197
+ add_element?: ElementSymbol
198
+ dragging_atoms?: boolean
199
+ polyhedra_rendered_elements?: string[]
200
+ } = $props()
201
+
202
+ // Cell-local dimensions (each pane is responsible for its own zoom sizing) and cursor
203
+ let width = $state(0)
204
+ let height = $state(0)
205
+ let cursor = $state(`default`)
206
+
207
+ // Multi-view panes are ~half the viewer, so shrink the (fixed 86px) viewport gizmo to
208
+ // stay proportional. Single view keeps the default size.
209
+ let gizmo_prop = $derived.by(() => {
210
+ if (!gizmo || !in_grid) return gizmo
211
+ const fifth_of_min_dim = Math.min(width, height) * 0.2
212
+ const size = Math.round(Math.max(34, Math.min(72, fifth_of_min_dim)))
213
+ return { ...(typeof gizmo === `object` ? gizmo : {}), size }
214
+ })
215
+
216
+ // Internal orbit controls are bound from StructureScene; camera_position/target are
217
+ // bindable above so the primary viewport can persist moves into scene_props.
218
+ let orbit_controls =
219
+ $state<ComponentProps<typeof StructureScene>[`orbit_controls`]>(undefined)
220
+ let rotation_target_ref = $state<Vec3 | undefined>(undefined)
221
+ let initial_computed_zoom = $state<number | undefined>(undefined)
222
+ let camera_is_moving = $state(false)
223
+
224
+ const read_orbit_target = (): Vec3 | undefined => {
225
+ if (!orbit_controls?.target) return
226
+ const { x, y, z } = orbit_controls.target
227
+ return [x, y, z]
228
+ }
229
+
230
+ const read_camera_position = (): Vec3 | undefined =>
231
+ camera ? [camera.position.x, camera.position.y, camera.position.z] : camera_position
232
+
233
+ // Reset this pane's camera. The primary pane is given on_camera_reset, so it also emits.
234
+ function reset_camera() {
235
+ camera_position = [0, 0, 0]
236
+ camera_target = rotation_target_ref
237
+ report_moved?.(false)
238
+ if (orbit_controls && camera) {
239
+ if (`reset` in orbit_controls && typeof orbit_controls.reset === `function`) {
240
+ orbit_controls.reset()
241
+ }
242
+ if (orbit_controls.target && rotation_target_ref) {
243
+ orbit_controls.target.set(...rotation_target_ref)
244
+ }
245
+ if (`zoom` in camera && initial_computed_zoom !== undefined) {
246
+ const ortho_camera = camera as OrthographicCamera
247
+ ortho_camera.zoom = initial_computed_zoom
248
+ ortho_camera.updateProjectionMatrix()
249
+ }
250
+ if (typeof orbit_controls.update === `function`) orbit_controls.update()
251
+ camera_position = read_camera_position() ?? camera_position
252
+ camera_target = read_orbit_target()
253
+ }
254
+ on_camera_reset?.({ structure, camera_has_moved: false, camera_position, camera_target })
255
+ }
256
+
257
+ // Track camera movement: keep camera_target in sync with the orbit controls and emit
258
+ // on_camera_move (primary pane only) while the controls are active.
259
+ $effect(() => {
260
+ if (!camera_is_moving) return
261
+ report_moved?.(true)
262
+ const sync = () => {
263
+ const pos = read_camera_position()
264
+ if (!pos) return
265
+ const target = read_orbit_target()
266
+ camera_position = pos
267
+ camera_target = target
268
+ on_camera_move?.({
269
+ structure,
270
+ camera_has_moved: true,
271
+ camera_position: pos,
272
+ camera_target: target,
273
+ })
274
+ }
275
+ sync()
276
+ const interval = setInterval(sync, 200)
277
+ return () => clearInterval(interval)
278
+ })
279
+
280
+ // Reset on parent request (reset-all button bumps reset_token for every pane)
281
+ let last_reset_token: number | undefined
282
+ $effect(() => {
283
+ const token = reset_token
284
+ if (last_reset_token !== undefined && token !== last_reset_token) {
285
+ untrack(reset_camera)
286
+ }
287
+ last_reset_token = token
288
+ })
289
+
290
+ // Clear stale camera state on structure change so each pane re-frames the new cell
291
+ // along its configured direction.
292
+ let viewport_first_run = true
293
+ $effect(() => {
294
+ void structure
295
+ if (viewport_first_run) {
296
+ viewport_first_run = false
297
+ return
298
+ }
299
+ untrack(() => {
300
+ // Preserve explicit camera props supplied alongside a structure change.
301
+ if (camera_target !== undefined || camera_position.some((coord) => coord !== 0)) return
302
+ camera_position = [0, 0, 0]
303
+ camera_target = undefined
304
+ })
305
+ })
306
+
307
+ function handle_dblclick(event: MouseEvent) {
308
+ const target = event.target
309
+ if (
310
+ target instanceof HTMLElement &&
311
+ [`BUTTON`, `INPUT`, `SELECT`].includes(target.tagName)
312
+ )
313
+ return
314
+ reset_camera()
315
+ }
316
+
317
+ $effect(() => () => {
318
+ clearTimeout(remount_timer)
319
+ clearTimeout(recovery_reset_timer)
320
+ })
321
+ </script>
322
+
323
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
324
+ <div
325
+ class="viewport-cell"
326
+ class:active
327
+ class:multi={in_grid}
328
+ style:--canvas-cursor={cursor}
329
+ bind:clientWidth={width}
330
+ bind:clientHeight={height}
331
+ onpointerenter={onactivate}
332
+ ondblclick={handle_dblclick}
333
+ >
334
+ {#if label}<span class="viewport-label">{label}</span>{/if}
335
+ {#if recovery_failed}
336
+ <div class="context-recovery-error">
337
+ <StatusMessage
338
+ message="Unable to restore the 3D view after repeated WebGL context loss. Reload the page to retry."
339
+ type="error"
340
+ />
341
+ </div>
342
+ {/if}
343
+ {#key canvas_remount_token}
344
+ <Canvas createRenderer={create_renderer}>
345
+ <StructureScene
346
+ {structure}
347
+ {base_structure}
348
+ {...scene_props}
349
+ {...in_grid ? { auto_rotate: 0 } : {}}
350
+ {camera_position}
351
+ {camera_target}
352
+ {camera_projection}
353
+ {camera_direction}
354
+ {interactive}
355
+ gizmo={gizmo_prop}
356
+ {lattice_props}
357
+ {volumetric_data}
358
+ {isosurface_settings}
359
+ {active_volume_idx}
360
+ {volume_scaling}
361
+ bind:camera_is_moving
362
+ bind:selected_sites
363
+ {active_sites}
364
+ bind:hovered_idx={hovered_site_idx}
365
+ bind:measured_sites
366
+ bind:scene
367
+ bind:camera
368
+ bind:orbit_controls
369
+ bind:rotation_target_ref
370
+ bind:initial_computed_zoom
371
+ bind:hidden_elements
372
+ bind:hidden_prop_vals
373
+ bind:element_radius_overrides
374
+ bind:site_radius_overrides
375
+ bind:added_bonds
376
+ bind:removed_bonds
377
+ bind:bond_order_overrides
378
+ {bond_edits_enabled}
379
+ bind:bond_edit_mode
380
+ {bond_edit_order}
381
+ {measure_mode}
382
+ {width}
383
+ {height}
384
+ {atom_color_config}
385
+ {sym_data}
386
+ {on_sites_moved}
387
+ {on_operation_start}
388
+ {on_bond_edit_start}
389
+ {on_add_atom}
390
+ bind:add_atom_mode
391
+ bind:add_element
392
+ bind:cursor
393
+ bind:dragging_atoms
394
+ bind:polyhedra_rendered_elements
395
+ />
396
+ </Canvas>
397
+ {/key}
398
+ </div>
399
+
400
+ <style>
401
+ .viewport-cell {
402
+ position: relative;
403
+ overflow: hidden;
404
+ box-sizing: border-box;
405
+ height: 100%;
406
+ width: 100%;
407
+ min-width: 0;
408
+ min-height: 0;
409
+ }
410
+ /* In multi-view, give each pane a subtle separator and highlight the active one */
411
+ .viewport-cell.multi {
412
+ border: 1px solid var(--struct-viewport-border, rgba(128, 128, 128, 0.35));
413
+ }
414
+ /* Let the active pane's hover tooltip overflow into neighboring panes instead of
415
+ being clipped, and raise it above sibling panes so it paints on top. The WebGL
416
+ canvas is sized to the cell by JS, so only HTML overlays (the tooltip) overflow. */
417
+ .viewport-cell.multi.active {
418
+ border-color: var(--struct-viewport-active-border, var(--accent-color, #4a9eff));
419
+ overflow: visible;
420
+ z-index: 1;
421
+ }
422
+ .viewport-label {
423
+ position: absolute;
424
+ top: 3px;
425
+ left: 5px;
426
+ z-index: var(--z-index-viewer-label, 1);
427
+ pointer-events: none;
428
+ font-size: var(--struct-viewport-label-font-size, 0.8em);
429
+ font-weight: 500;
430
+ padding: 1px 5px;
431
+ border-radius: var(--border-radius, 3pt);
432
+ color: var(--struct-viewport-label-color, var(--text-color, currentColor));
433
+ background: var(
434
+ --struct-viewport-label-bg,
435
+ color-mix(in srgb, var(--page-bg, Canvas) 65%, transparent)
436
+ );
437
+ }
438
+ .context-recovery-error {
439
+ position: absolute;
440
+ inset: 0;
441
+ z-index: var(--z-index-viewer-tooltip, 1000);
442
+ display: grid;
443
+ place-items: center;
444
+ padding: 1em;
445
+ pointer-events: none;
446
+ will-change: transform;
447
+ }
448
+ .viewport-cell :global(canvas) {
449
+ cursor: var(--canvas-cursor, default);
450
+ }
451
+ </style>
@@ -0,0 +1,65 @@
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 | VolumetricData[];
28
+ isosurface_settings?: IsosurfaceSettings;
29
+ active_volume_idx?: number;
30
+ volume_scaling?: Vec3;
31
+ bond_edits_enabled?: boolean;
32
+ bond_edit_order?: BondOrder;
33
+ measure_mode?: MeasureMode;
34
+ atom_color_config?: Partial<AtomColorConfig>;
35
+ sym_data?: MoyoDataset | null;
36
+ active_sites?: number[];
37
+ camera_direction?: Vec3;
38
+ camera_projection?: CameraProjection;
39
+ camera_position?: Vec3;
40
+ camera_target?: Vec3;
41
+ on_sites_moved?: (scene_indices: number[], delta: Vec3) => void;
42
+ on_operation_start?: () => void;
43
+ on_bond_edit_start?: () => void;
44
+ on_add_atom?: (xyz: Vec3, element: ElementSymbol) => void;
45
+ scene?: Scene;
46
+ camera?: Camera;
47
+ selected_sites?: number[];
48
+ measured_sites?: number[];
49
+ hovered_site_idx?: number | null;
50
+ hidden_elements?: Set<ElementSymbol>;
51
+ hidden_prop_vals?: Set<number | string>;
52
+ element_radius_overrides?: Partial<Record<ElementSymbol, number>>;
53
+ site_radius_overrides?: Map<number, number> | SvelteMap<number, number>;
54
+ added_bonds?: StructureBond[];
55
+ removed_bonds?: StructureBond[];
56
+ bond_order_overrides?: StructureBond[];
57
+ bond_edit_mode?: BondEditMode;
58
+ add_atom_mode?: boolean;
59
+ add_element?: ElementSymbol;
60
+ dragging_atoms?: boolean;
61
+ polyhedra_rendered_elements?: string[];
62
+ };
63
+ 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">;
64
+ type StructureViewport = ReturnType<typeof StructureViewport>;
65
+ export default StructureViewport;
@@ -1,14 +1,18 @@
1
- import type { Vec2, Vec3 } from '../math';
2
- import type { Camera, Object3D } from 'three';
1
+ import type { Vec3 } from '../math';
2
+ import type { Camera } from 'three';
3
+ import { Matrix4 } from 'three';
3
4
  export declare const LABEL_OFFSET_EPS = 1e-9;
4
- type LabelOffsetSource = Vec3 | (() => Vec3);
5
5
  export declare const choose_site_label_offset: (bond_directions: Vec3[], base_offset: Vec3) => Vec3;
6
- export declare const label_screen_position: (atom_position: Vec3, label_offset: Vec3, visual_radius: number, label_screen_margin: number, label_camera: Camera, size: {
7
- width: number;
8
- height: number;
9
- }) => Vec2;
10
- export declare const make_label_position_calculator: (_atom_position: Vec3, label_offset: LabelOffsetSource, visual_radius: number, label_screen_margin: number) => (object: Object3D, label_camera: Camera, size: {
11
- width: number;
12
- height: number;
13
- }) => Vec2;
14
- export {};
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
+ }