matterviz 0.3.4 → 0.3.6

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 (852) hide show
  1. package/.vscode/launch.json +13 -0
  2. package/.vscodeignore +7 -0
  3. package/dist/assets/STLExporter-BpTH3YHE.js +8 -0
  4. package/dist/assets/browser-DdDecX_W.js +1 -0
  5. package/dist/assets/export-qgn-H9y6.js +2 -0
  6. package/dist/assets/main-DiKYzti2.css +1 -0
  7. package/dist/assets/moyo_wasm_bg-0ocwg7xY.wasm +0 -0
  8. package/dist/extension.js +31293 -0
  9. package/dist/src/lib/FilePicker.svelte +360 -0
  10. package/dist/src/lib/MillerIndexInput.svelte +66 -0
  11. package/dist/src/lib/api/mp.ts +26 -0
  12. package/dist/src/lib/api/optimade.ts +204 -0
  13. package/dist/src/lib/app.css +247 -0
  14. package/dist/src/lib/brillouin/BrillouinZone.svelte +549 -0
  15. package/dist/src/lib/brillouin/BrillouinZoneControls.svelte +144 -0
  16. package/dist/src/lib/brillouin/BrillouinZoneExportPane.svelte +146 -0
  17. package/dist/src/lib/brillouin/BrillouinZoneInfoPane.svelte +146 -0
  18. package/dist/src/lib/brillouin/BrillouinZoneScene.svelte +476 -0
  19. package/dist/src/lib/brillouin/BrillouinZoneTooltip.svelte +92 -0
  20. package/dist/src/lib/brillouin/compute.ts +529 -0
  21. package/dist/src/lib/brillouin/index.ts +8 -0
  22. package/dist/src/lib/brillouin/types.ts +51 -0
  23. package/dist/src/lib/chempot-diagram/ChemPotDiagram.svelte +327 -0
  24. package/dist/src/lib/chempot-diagram/ChemPotDiagram2D.svelte +846 -0
  25. package/dist/src/lib/chempot-diagram/ChemPotDiagram3D.svelte +3193 -0
  26. package/dist/src/lib/chempot-diagram/async-compute.svelte.ts +94 -0
  27. package/dist/src/lib/chempot-diagram/chempot-worker.ts +11 -0
  28. package/dist/src/lib/chempot-diagram/color.ts +42 -0
  29. package/dist/src/lib/chempot-diagram/compute.ts +1014 -0
  30. package/dist/src/lib/chempot-diagram/index.ts +6 -0
  31. package/dist/src/lib/chempot-diagram/pointer.ts +56 -0
  32. package/dist/src/lib/chempot-diagram/temperature.ts +77 -0
  33. package/dist/src/lib/chempot-diagram/types.ts +130 -0
  34. package/dist/src/lib/colors/index.ts +249 -0
  35. package/dist/src/lib/composition/BarChart.svelte +297 -0
  36. package/dist/src/lib/composition/BubbleChart.svelte +218 -0
  37. package/dist/src/lib/composition/Composition.svelte +165 -0
  38. package/dist/src/lib/composition/Formula.svelte +268 -0
  39. package/dist/src/lib/composition/FormulaFilter.svelte +1257 -0
  40. package/dist/src/lib/composition/PieChart.svelte +323 -0
  41. package/dist/src/lib/composition/format.ts +155 -0
  42. package/dist/src/lib/composition/index.ts +37 -0
  43. package/dist/src/lib/composition/parse.ts +605 -0
  44. package/dist/src/lib/constants.ts +134 -0
  45. package/dist/src/lib/controls.ts +42 -0
  46. package/dist/src/lib/convex-hull/ConvexHull.svelte +157 -0
  47. package/dist/src/lib/convex-hull/ConvexHull2D.svelte +825 -0
  48. package/dist/src/lib/convex-hull/ConvexHull3D.svelte +1801 -0
  49. package/dist/src/lib/convex-hull/ConvexHull4D.svelte +1398 -0
  50. package/dist/src/lib/convex-hull/ConvexHullControls.svelte +535 -0
  51. package/dist/src/lib/convex-hull/ConvexHullInfoPane.svelte +125 -0
  52. package/dist/src/lib/convex-hull/ConvexHullStats.svelte +929 -0
  53. package/dist/src/lib/convex-hull/ConvexHullTooltip.svelte +131 -0
  54. package/dist/src/lib/convex-hull/GasPressureControls.svelte +247 -0
  55. package/dist/src/lib/convex-hull/StructurePopup.svelte +151 -0
  56. package/dist/src/lib/convex-hull/TemperatureSlider.svelte +140 -0
  57. package/dist/src/lib/convex-hull/barycentric-coords.ts +246 -0
  58. package/dist/src/lib/convex-hull/demo-temperature.ts +63 -0
  59. package/dist/src/lib/convex-hull/gas-thermodynamics.ts +405 -0
  60. package/dist/src/lib/convex-hull/helpers.ts +932 -0
  61. package/dist/src/lib/convex-hull/index.ts +202 -0
  62. package/dist/src/lib/convex-hull/thermodynamics.ts +2192 -0
  63. package/dist/src/lib/convex-hull/types.ts +267 -0
  64. package/dist/src/lib/coordination/CoordinationBarPlot.svelte +311 -0
  65. package/dist/src/lib/coordination/calc-coordination.ts +93 -0
  66. package/dist/src/lib/coordination/index.ts +9 -0
  67. package/dist/src/lib/effects.svelte.ts +48 -0
  68. package/dist/src/lib/element/BohrAtom.svelte +147 -0
  69. package/dist/src/lib/element/ElementHeading.svelte +26 -0
  70. package/dist/src/lib/element/ElementPhoto.svelte +57 -0
  71. package/dist/src/lib/element/ElementStats.svelte +80 -0
  72. package/dist/src/lib/element/ElementTile.svelte +484 -0
  73. package/dist/src/lib/element/data.json.gz.d.ts +4 -0
  74. package/dist/src/lib/element/data.ts +14 -0
  75. package/dist/src/lib/element/index.ts +8 -0
  76. package/dist/src/lib/element/types.ts +62 -0
  77. package/dist/src/lib/feedback/ClickFeedback.svelte +58 -0
  78. package/dist/src/lib/feedback/DragOverlay.svelte +42 -0
  79. package/dist/src/lib/feedback/index.ts +4 -0
  80. package/dist/src/lib/fermi-surface/FermiSlice.svelte +189 -0
  81. package/dist/src/lib/fermi-surface/FermiSurface.svelte +600 -0
  82. package/dist/src/lib/fermi-surface/FermiSurfaceControls.svelte +448 -0
  83. package/dist/src/lib/fermi-surface/FermiSurfaceScene.svelte +794 -0
  84. package/dist/src/lib/fermi-surface/FermiSurfaceTooltip.svelte +111 -0
  85. package/dist/src/lib/fermi-surface/compute.ts +728 -0
  86. package/dist/src/lib/fermi-surface/constants.ts +32 -0
  87. package/dist/src/lib/fermi-surface/export.ts +64 -0
  88. package/dist/src/lib/fermi-surface/index.ts +14 -0
  89. package/dist/src/lib/fermi-surface/marching-cubes.ts +3 -0
  90. package/dist/src/lib/fermi-surface/parse.ts +574 -0
  91. package/dist/src/lib/fermi-surface/symmetry.ts +56 -0
  92. package/dist/src/lib/fermi-surface/types.ts +159 -0
  93. package/dist/src/lib/heatmap-matrix/HeatmapMatrix.svelte +1545 -0
  94. package/dist/src/lib/heatmap-matrix/HeatmapMatrixControls.svelte +225 -0
  95. package/dist/src/lib/heatmap-matrix/index.ts +167 -0
  96. package/dist/src/lib/heatmap-matrix/shared.ts +7 -0
  97. package/dist/src/lib/icons.ts +650 -0
  98. package/dist/src/lib/index.ts +61 -0
  99. package/dist/src/lib/io/decompress.ts +92 -0
  100. package/dist/src/lib/io/export.ts +385 -0
  101. package/dist/src/lib/io/fetch.ts +46 -0
  102. package/dist/src/lib/io/file-drop.ts +51 -0
  103. package/dist/src/lib/io/index.ts +7 -0
  104. package/dist/src/lib/io/is-binary.ts +24 -0
  105. package/dist/src/lib/io/types.ts +8 -0
  106. package/dist/src/lib/io/url-drop.ts +141 -0
  107. package/dist/src/lib/isosurface/Isosurface.svelte +285 -0
  108. package/dist/src/lib/isosurface/IsosurfaceControls.svelte +277 -0
  109. package/dist/src/lib/isosurface/index.ts +7 -0
  110. package/dist/src/lib/isosurface/parse.ts +656 -0
  111. package/dist/src/lib/isosurface/slice.ts +175 -0
  112. package/dist/src/lib/isosurface/types.ts +309 -0
  113. package/dist/src/lib/labels.ts +320 -0
  114. package/dist/src/lib/layout/FullscreenToggle.svelte +50 -0
  115. package/dist/src/lib/layout/InfoCard.svelte +120 -0
  116. package/dist/src/lib/layout/InfoTag.svelte +185 -0
  117. package/dist/src/lib/layout/PropertyFilter.svelte +246 -0
  118. package/dist/src/lib/layout/SettingsSection.svelte +148 -0
  119. package/dist/src/lib/layout/SubpageGrid.svelte +82 -0
  120. package/dist/src/lib/layout/fullscreen.ts +65 -0
  121. package/dist/src/lib/layout/index.ts +11 -0
  122. package/dist/src/lib/layout/json-tree/JsonNode.svelte +548 -0
  123. package/dist/src/lib/layout/json-tree/JsonTree.svelte +1230 -0
  124. package/dist/src/lib/layout/json-tree/JsonValue.svelte +334 -0
  125. package/dist/src/lib/layout/json-tree/index.ts +3 -0
  126. package/dist/src/lib/layout/json-tree/types.ts +126 -0
  127. package/dist/src/lib/layout/json-tree/utils.ts +682 -0
  128. package/dist/src/lib/marching-cubes.ts +614 -0
  129. package/dist/src/lib/math.ts +1081 -0
  130. package/dist/src/lib/overlays/ContextMenu.svelte +162 -0
  131. package/dist/src/lib/overlays/CopyButton.svelte +45 -0
  132. package/dist/src/lib/overlays/DragControlTab.svelte +98 -0
  133. package/dist/src/lib/overlays/DraggablePane.svelte +487 -0
  134. package/dist/src/lib/overlays/InfoPaneCards.svelte +149 -0
  135. package/dist/src/lib/overlays/index.ts +3 -0
  136. package/dist/src/lib/periodic-table/PeriodicTable.svelte +469 -0
  137. package/dist/src/lib/periodic-table/PeriodicTableControls.svelte +557 -0
  138. package/dist/src/lib/periodic-table/PropertySelect.svelte +37 -0
  139. package/dist/src/lib/periodic-table/index.ts +12 -0
  140. package/dist/src/lib/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +1086 -0
  141. package/dist/src/lib/phase-diagram/PhaseDiagramControls.svelte +444 -0
  142. package/dist/src/lib/phase-diagram/PhaseDiagramEditorPane.svelte +126 -0
  143. package/dist/src/lib/phase-diagram/PhaseDiagramExportPane.svelte +184 -0
  144. package/dist/src/lib/phase-diagram/PhaseDiagramTooltip.svelte +391 -0
  145. package/dist/src/lib/phase-diagram/TdbInfoPanel.svelte +203 -0
  146. package/dist/src/lib/phase-diagram/build-diagram.ts +186 -0
  147. package/dist/src/lib/phase-diagram/colors.ts +58 -0
  148. package/dist/src/lib/phase-diagram/diagram-input.ts +40 -0
  149. package/dist/src/lib/phase-diagram/index.ts +13 -0
  150. package/dist/src/lib/phase-diagram/parse.ts +348 -0
  151. package/dist/src/lib/phase-diagram/svg-to-diagram.ts +1023 -0
  152. package/dist/src/lib/phase-diagram/types.ts +144 -0
  153. package/dist/src/lib/phase-diagram/utils.ts +775 -0
  154. package/dist/src/lib/plot/AxisLabel.svelte +51 -0
  155. package/dist/src/lib/plot/BarPlot.svelte +2113 -0
  156. package/dist/src/lib/plot/BarPlotControls.svelte +66 -0
  157. package/dist/src/lib/plot/BinnedScatterPlot.svelte +1114 -0
  158. package/dist/src/lib/plot/ColorBar.svelte +721 -0
  159. package/dist/src/lib/plot/ColorScaleSelect.svelte +54 -0
  160. package/dist/src/lib/plot/ElementScatter.svelte +63 -0
  161. package/dist/src/lib/plot/FillArea.svelte +223 -0
  162. package/dist/src/lib/plot/Histogram.svelte +1558 -0
  163. package/dist/src/lib/plot/HistogramControls.svelte +212 -0
  164. package/dist/src/lib/plot/InteractiveAxisLabel.svelte +96 -0
  165. package/dist/src/lib/plot/Line.svelte +84 -0
  166. package/dist/src/lib/plot/PlotAxis.svelte +169 -0
  167. package/dist/src/lib/plot/PlotControls.svelte +537 -0
  168. package/dist/src/lib/plot/PlotLegend.svelte +569 -0
  169. package/dist/src/lib/plot/PlotTooltip.svelte +67 -0
  170. package/dist/src/lib/plot/PortalSelect.svelte +253 -0
  171. package/dist/src/lib/plot/ReferenceLine3D.svelte +156 -0
  172. package/dist/src/lib/plot/ReferencePlane.svelte +175 -0
  173. package/dist/src/lib/plot/ScatterPlot.svelte +2778 -0
  174. package/dist/src/lib/plot/ScatterPlot3D.svelte +529 -0
  175. package/dist/src/lib/plot/ScatterPlot3DControls.svelte +437 -0
  176. package/dist/src/lib/plot/ScatterPlot3DScene.svelte +912 -0
  177. package/dist/src/lib/plot/ScatterPlotControls.svelte +306 -0
  178. package/dist/src/lib/plot/ScatterPoint.svelte +182 -0
  179. package/dist/src/lib/plot/SpacegroupBarPlot.svelte +293 -0
  180. package/dist/src/lib/plot/Surface3D.svelte +197 -0
  181. package/dist/src/lib/plot/ZeroLines.svelte +97 -0
  182. package/dist/src/lib/plot/ZoomRect.svelte +23 -0
  183. package/dist/src/lib/plot/adaptive-density.ts +316 -0
  184. package/dist/src/lib/plot/auto-place.ts +184 -0
  185. package/dist/src/lib/plot/axis-utils.ts +122 -0
  186. package/dist/src/lib/plot/binned-scatter-types.ts +83 -0
  187. package/dist/src/lib/plot/data-cleaning.ts +1069 -0
  188. package/dist/src/lib/plot/data-transform.ts +69 -0
  189. package/dist/src/lib/plot/defaults.ts +9 -0
  190. package/dist/src/lib/plot/fill-utils.ts +494 -0
  191. package/dist/src/lib/plot/hover-lock.svelte.ts +60 -0
  192. package/dist/src/lib/plot/index.ts +53 -0
  193. package/dist/src/lib/plot/interactions.ts +119 -0
  194. package/dist/src/lib/plot/layout.ts +425 -0
  195. package/dist/src/lib/plot/reference-line.ts +426 -0
  196. package/dist/src/lib/plot/scales.ts +654 -0
  197. package/dist/src/lib/plot/svg.ts +23 -0
  198. package/dist/src/lib/plot/types.ts +1144 -0
  199. package/dist/src/lib/plot/utils/label-placement.ts +541 -0
  200. package/dist/src/lib/plot/utils/series-visibility.ts +140 -0
  201. package/dist/src/lib/plot/utils.ts +11 -0
  202. package/dist/src/lib/rdf/RdfPlot.svelte +247 -0
  203. package/dist/src/lib/rdf/calc-rdf.ts +167 -0
  204. package/dist/src/lib/rdf/index.ts +27 -0
  205. package/dist/src/lib/sanitize.ts +126 -0
  206. package/dist/src/lib/settings.ts +1479 -0
  207. package/dist/src/lib/spectral/Bands.svelte +1040 -0
  208. package/dist/src/lib/spectral/BandsAndDos.svelte +134 -0
  209. package/dist/src/lib/spectral/BrillouinBandsDos.svelte +252 -0
  210. package/dist/src/lib/spectral/Dos.svelte +697 -0
  211. package/dist/src/lib/spectral/helpers.ts +1381 -0
  212. package/dist/src/lib/spectral/index.ts +8 -0
  213. package/dist/src/lib/spectral/types.ts +112 -0
  214. package/dist/src/lib/state.svelte.ts +64 -0
  215. package/dist/src/lib/structure/Arrow.svelte +72 -0
  216. package/dist/src/lib/structure/AtomLegend.svelte +815 -0
  217. package/dist/src/lib/structure/Bond.svelte +140 -0
  218. package/dist/src/lib/structure/CanvasTooltip.svelte +33 -0
  219. package/dist/src/lib/structure/CellSelect.svelte +349 -0
  220. package/dist/src/lib/structure/Cylinder.svelte +45 -0
  221. package/dist/src/lib/structure/Lattice.svelte +196 -0
  222. package/dist/src/lib/structure/Structure.svelte +2248 -0
  223. package/dist/src/lib/structure/StructureControls.svelte +1273 -0
  224. package/dist/src/lib/structure/StructureExportPane.svelte +252 -0
  225. package/dist/src/lib/structure/StructureInfoPane.svelte +737 -0
  226. package/dist/src/lib/structure/StructureScene.svelte +2255 -0
  227. package/dist/src/lib/structure/atom-properties.ts +316 -0
  228. package/dist/src/lib/structure/bond-order-perception.ts +447 -0
  229. package/dist/src/lib/structure/bonding.ts +944 -0
  230. package/dist/src/lib/structure/export.ts +861 -0
  231. package/dist/src/lib/structure/index.ts +291 -0
  232. package/dist/src/lib/structure/label-placement.ts +130 -0
  233. package/dist/src/lib/structure/measure.ts +45 -0
  234. package/dist/src/lib/structure/parse.ts +1705 -0
  235. package/dist/src/lib/structure/partial-occupancy.ts +183 -0
  236. package/dist/src/lib/structure/pbc.ts +164 -0
  237. package/dist/src/lib/structure/supercell.ts +226 -0
  238. package/dist/src/lib/structure/validation.ts +11 -0
  239. package/dist/src/lib/symmetry/SymmetryStats.svelte +226 -0
  240. package/dist/src/lib/symmetry/WyckoffTable.svelte +120 -0
  241. package/dist/src/lib/symmetry/cell-transform.ts +118 -0
  242. package/dist/src/lib/symmetry/index.ts +348 -0
  243. package/dist/src/lib/symmetry/spacegroups.ts +404 -0
  244. package/dist/src/lib/table/HeatmapTable.svelte +1833 -0
  245. package/dist/src/lib/table/ToggleMenu.svelte +385 -0
  246. package/dist/src/lib/table/index.ts +139 -0
  247. package/dist/src/lib/theme/ThemeControl.svelte +53 -0
  248. package/dist/src/lib/theme/index.ts +107 -0
  249. package/dist/src/lib/theme/themes.mjs +297 -0
  250. package/dist/src/lib/time.ts +71 -0
  251. package/dist/src/lib/tooltip/TooltipContent.svelte +58 -0
  252. package/dist/src/lib/tooltip/index.ts +2 -0
  253. package/dist/src/lib/tooltip/types.ts +13 -0
  254. package/dist/src/lib/trajectory/Trajectory.svelte +1545 -0
  255. package/dist/src/lib/trajectory/TrajectoryError.svelte +128 -0
  256. package/dist/src/lib/trajectory/TrajectoryExportPane.svelte +357 -0
  257. package/dist/src/lib/trajectory/TrajectoryInfoPane.svelte +313 -0
  258. package/dist/src/lib/trajectory/constants.ts +7 -0
  259. package/dist/src/lib/trajectory/extract.ts +196 -0
  260. package/dist/src/lib/trajectory/format-detect.ts +96 -0
  261. package/dist/src/lib/trajectory/frame-reader.ts +456 -0
  262. package/dist/src/lib/trajectory/helpers.ts +217 -0
  263. package/dist/src/lib/trajectory/index.ts +218 -0
  264. package/dist/src/lib/trajectory/parse/ase.ts +109 -0
  265. package/dist/src/lib/trajectory/parse/hdf5.ts +173 -0
  266. package/dist/src/lib/trajectory/parse/index.ts +411 -0
  267. package/dist/src/lib/trajectory/parse/lammps.ts +215 -0
  268. package/dist/src/lib/trajectory/parse/vasp.ts +102 -0
  269. package/dist/src/lib/trajectory/parse/xyz.ts +143 -0
  270. package/dist/src/lib/trajectory/plotting.ts +599 -0
  271. package/dist/src/lib/trajectory/types.ts +13 -0
  272. package/dist/src/lib/utils.ts +56 -0
  273. package/dist/src/lib/xrd/XrdPlot.svelte +615 -0
  274. package/dist/src/lib/xrd/broadening.ts +130 -0
  275. package/dist/src/lib/xrd/calc-xrd.ts +397 -0
  276. package/dist/src/lib/xrd/index.ts +38 -0
  277. package/dist/src/lib/xrd/parse.ts +858 -0
  278. package/dist/webview.js +29421 -0
  279. package/icon.png +0 -0
  280. package/license +1 -1
  281. package/matterviz-0.3.2.vsix +0 -0
  282. package/matterviz-0.3.4.vsix +0 -0
  283. package/matterviz-0.3.5.vsix +0 -0
  284. package/package.json +1461 -231
  285. package/readme.md +171 -98
  286. package/scripts/sync-config.ts +101 -0
  287. package/src/declarations.d.ts +2 -0
  288. package/src/extension.ts +972 -0
  289. package/src/node-io.ts +65 -0
  290. package/src/types.ts +17 -0
  291. package/src/webview/JsonBrowser.svelte +1079 -0
  292. package/src/webview/PlotPanel.svelte +346 -0
  293. package/src/webview/detect.ts +444 -0
  294. package/src/webview/main.ts +764 -0
  295. package/src/webview/plot-utils.ts +250 -0
  296. package/test-fixtures/all-viz-types.json.gz +0 -0
  297. package/test-fixtures/plot-demo-data.json.gz +0 -0
  298. package/tests/detect.test.ts +604 -0
  299. package/tests/extension.test.ts +2041 -0
  300. package/tests/node-io.test.ts +39 -0
  301. package/tests/plot-utils.test.ts +302 -0
  302. package/tests/vite-plugin-json-gz.test.ts +114 -0
  303. package/tests/vscode-mock.ts +18 -0
  304. package/tests/webview.test.ts +231 -0
  305. package/tsconfig.json +20 -0
  306. package/vite-plugin-json-gz.ts +29 -0
  307. package/vite.config.ts +34 -0
  308. package/vite.extension.config.ts +34 -0
  309. package/dist/EmptyState.svelte.d.ts +0 -9
  310. package/dist/FilePicker.svelte +0 -360
  311. package/dist/FilePicker.svelte.d.ts +0 -17
  312. package/dist/Icon.svelte.d.ts +0 -13
  313. package/dist/MillerIndexInput.svelte +0 -66
  314. package/dist/MillerIndexInput.svelte.d.ts +0 -7
  315. package/dist/api/mp.d.ts +0 -6
  316. package/dist/api/mp.js +0 -22
  317. package/dist/api/optimade.d.ts +0 -45
  318. package/dist/api/optimade.js +0 -135
  319. package/dist/app.css +0 -240
  320. package/dist/brillouin/BrillouinZone.svelte +0 -543
  321. package/dist/brillouin/BrillouinZone.svelte.d.ts +0 -83
  322. package/dist/brillouin/BrillouinZoneControls.svelte +0 -144
  323. package/dist/brillouin/BrillouinZoneControls.svelte.d.ts +0 -17
  324. package/dist/brillouin/BrillouinZoneExportPane.svelte +0 -148
  325. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +0 -15
  326. package/dist/brillouin/BrillouinZoneInfoPane.svelte +0 -146
  327. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +0 -13
  328. package/dist/brillouin/BrillouinZoneScene.svelte +0 -476
  329. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +0 -48
  330. package/dist/brillouin/BrillouinZoneTooltip.svelte +0 -92
  331. package/dist/brillouin/BrillouinZoneTooltip.svelte.d.ts +0 -8
  332. package/dist/brillouin/compute.d.ts +0 -17
  333. package/dist/brillouin/compute.js +0 -422
  334. package/dist/brillouin/index.d.ts +0 -8
  335. package/dist/brillouin/index.js +0 -8
  336. package/dist/brillouin/types.d.ts +0 -48
  337. package/dist/brillouin/types.js +0 -1
  338. package/dist/chempot-diagram/ChemPotDiagram.svelte +0 -327
  339. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +0 -13
  340. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +0 -847
  341. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +0 -16
  342. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +0 -3194
  343. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +0 -16
  344. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +0 -7
  345. package/dist/chempot-diagram/async-compute.svelte.d.ts +0 -3
  346. package/dist/chempot-diagram/async-compute.svelte.js +0 -77
  347. package/dist/chempot-diagram/chempot-worker.d.ts +0 -1
  348. package/dist/chempot-diagram/chempot-worker.js +0 -11
  349. package/dist/chempot-diagram/color.d.ts +0 -10
  350. package/dist/chempot-diagram/color.js +0 -32
  351. package/dist/chempot-diagram/compute.d.ts +0 -48
  352. package/dist/chempot-diagram/compute.js +0 -812
  353. package/dist/chempot-diagram/index.d.ts +0 -6
  354. package/dist/chempot-diagram/index.js +0 -6
  355. package/dist/chempot-diagram/pointer.d.ts +0 -16
  356. package/dist/chempot-diagram/pointer.js +0 -40
  357. package/dist/chempot-diagram/temperature.d.ts +0 -15
  358. package/dist/chempot-diagram/temperature.js +0 -36
  359. package/dist/chempot-diagram/types.d.ts +0 -86
  360. package/dist/chempot-diagram/types.js +0 -28
  361. package/dist/colors/index.d.ts +0 -47
  362. package/dist/colors/index.js +0 -203
  363. package/dist/composition/BarChart.svelte +0 -297
  364. package/dist/composition/BarChart.svelte.d.ts +0 -39
  365. package/dist/composition/BubbleChart.svelte +0 -218
  366. package/dist/composition/BubbleChart.svelte.d.ts +0 -28
  367. package/dist/composition/Composition.svelte +0 -164
  368. package/dist/composition/Composition.svelte.d.ts +0 -15
  369. package/dist/composition/Formula.svelte +0 -265
  370. package/dist/composition/Formula.svelte.d.ts +0 -19
  371. package/dist/composition/FormulaFilter.svelte +0 -1259
  372. package/dist/composition/FormulaFilter.svelte.d.ts +0 -51
  373. package/dist/composition/PieChart.svelte +0 -323
  374. package/dist/composition/PieChart.svelte.d.ts +0 -37
  375. package/dist/composition/format.d.ts +0 -15
  376. package/dist/composition/format.js +0 -109
  377. package/dist/composition/index.d.ts +0 -20
  378. package/dist/composition/index.js +0 -14
  379. package/dist/composition/parse.d.ts +0 -55
  380. package/dist/composition/parse.js +0 -459
  381. package/dist/constants.d.ts +0 -29
  382. package/dist/constants.js +0 -105
  383. package/dist/controls.d.ts +0 -14
  384. package/dist/controls.js +0 -30
  385. package/dist/convex-hull/ConvexHull.svelte +0 -157
  386. package/dist/convex-hull/ConvexHull.svelte.d.ts +0 -13
  387. package/dist/convex-hull/ConvexHull2D.svelte +0 -813
  388. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +0 -11
  389. package/dist/convex-hull/ConvexHull3D.svelte +0 -1788
  390. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +0 -8
  391. package/dist/convex-hull/ConvexHull4D.svelte +0 -1374
  392. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +0 -8
  393. package/dist/convex-hull/ConvexHullControls.svelte +0 -546
  394. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +0 -48
  395. package/dist/convex-hull/ConvexHullInfoPane.svelte +0 -115
  396. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +0 -18
  397. package/dist/convex-hull/ConvexHullStats.svelte +0 -905
  398. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +0 -15
  399. package/dist/convex-hull/ConvexHullTooltip.svelte +0 -131
  400. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +0 -33
  401. package/dist/convex-hull/GasPressureControls.svelte +0 -247
  402. package/dist/convex-hull/GasPressureControls.svelte.d.ts +0 -11
  403. package/dist/convex-hull/StructurePopup.svelte +0 -116
  404. package/dist/convex-hull/StructurePopup.svelte.d.ts +0 -18
  405. package/dist/convex-hull/TemperatureSlider.svelte +0 -137
  406. package/dist/convex-hull/TemperatureSlider.svelte.d.ts +0 -8
  407. package/dist/convex-hull/barycentric-coords.d.ts +0 -18
  408. package/dist/convex-hull/barycentric-coords.js +0 -182
  409. package/dist/convex-hull/demo-temperature.d.ts +0 -6
  410. package/dist/convex-hull/demo-temperature.js +0 -40
  411. package/dist/convex-hull/gas-thermodynamics.d.ts +0 -16
  412. package/dist/convex-hull/gas-thermodynamics.js +0 -316
  413. package/dist/convex-hull/helpers.d.ts +0 -103
  414. package/dist/convex-hull/helpers.js +0 -671
  415. package/dist/convex-hull/index.d.ts +0 -118
  416. package/dist/convex-hull/index.js +0 -57
  417. package/dist/convex-hull/thermodynamics.d.ts +0 -66
  418. package/dist/convex-hull/thermodynamics.js +0 -1752
  419. package/dist/convex-hull/types.d.ts +0 -162
  420. package/dist/convex-hull/types.js +0 -36
  421. package/dist/coordination/CoordinationBarPlot.svelte +0 -311
  422. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +0 -30
  423. package/dist/coordination/calc-coordination.d.ts +0 -15
  424. package/dist/coordination/calc-coordination.js +0 -63
  425. package/dist/coordination/index.d.ts +0 -8
  426. package/dist/coordination/index.js +0 -7
  427. package/dist/element/BohrAtom.svelte +0 -149
  428. package/dist/element/BohrAtom.svelte.d.ts +0 -20
  429. package/dist/element/ElementHeading.svelte +0 -26
  430. package/dist/element/ElementHeading.svelte.d.ts +0 -8
  431. package/dist/element/ElementPhoto.svelte +0 -57
  432. package/dist/element/ElementPhoto.svelte.d.ts +0 -9
  433. package/dist/element/ElementStats.svelte +0 -80
  434. package/dist/element/ElementStats.svelte.d.ts +0 -8
  435. package/dist/element/ElementTile.svelte +0 -484
  436. package/dist/element/ElementTile.svelte.d.ts +0 -29
  437. package/dist/element/Nucleus.svelte.d.ts +0 -17
  438. package/dist/element/data.d.ts +0 -3
  439. package/dist/element/data.js +0 -2
  440. package/dist/element/data.json.gz.d.ts +0 -2
  441. package/dist/element/index.d.ts +0 -8
  442. package/dist/element/index.js +0 -8
  443. package/dist/element/types.d.ts +0 -57
  444. package/dist/element/types.js +0 -1
  445. package/dist/feedback/ClickFeedback.svelte +0 -58
  446. package/dist/feedback/ClickFeedback.svelte.d.ts +0 -12
  447. package/dist/feedback/DragOverlay.svelte +0 -42
  448. package/dist/feedback/DragOverlay.svelte.d.ts +0 -7
  449. package/dist/feedback/Spinner.svelte.d.ts +0 -7
  450. package/dist/feedback/StatusMessage.svelte.d.ts +0 -9
  451. package/dist/feedback/index.d.ts +0 -4
  452. package/dist/feedback/index.js +0 -4
  453. package/dist/fermi-surface/FermiSlice.svelte +0 -189
  454. package/dist/fermi-surface/FermiSlice.svelte.d.ts +0 -24
  455. package/dist/fermi-surface/FermiSurface.svelte +0 -597
  456. package/dist/fermi-surface/FermiSurface.svelte.d.ts +0 -83
  457. package/dist/fermi-surface/FermiSurfaceControls.svelte +0 -452
  458. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +0 -35
  459. package/dist/fermi-surface/FermiSurfaceScene.svelte +0 -792
  460. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +0 -50
  461. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +0 -111
  462. package/dist/fermi-surface/FermiSurfaceTooltip.svelte.d.ts +0 -8
  463. package/dist/fermi-surface/compute.d.ts +0 -5
  464. package/dist/fermi-surface/compute.js +0 -538
  465. package/dist/fermi-surface/constants.d.ts +0 -9
  466. package/dist/fermi-surface/constants.js +0 -27
  467. package/dist/fermi-surface/export.d.ts +0 -5
  468. package/dist/fermi-surface/export.js +0 -63
  469. package/dist/fermi-surface/index.d.ts +0 -12
  470. package/dist/fermi-surface/index.js +0 -13
  471. package/dist/fermi-surface/marching-cubes.d.ts +0 -2
  472. package/dist/fermi-surface/marching-cubes.js +0 -2
  473. package/dist/fermi-surface/parse.d.ts +0 -2
  474. package/dist/fermi-surface/parse.js +0 -495
  475. package/dist/fermi-surface/symmetry.d.ts +0 -3
  476. package/dist/fermi-surface/symmetry.js +0 -46
  477. package/dist/fermi-surface/types.d.ts +0 -113
  478. package/dist/fermi-surface/types.js +0 -4
  479. package/dist/heatmap-matrix/HeatmapMatrix.svelte +0 -1527
  480. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +0 -110
  481. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +0 -225
  482. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +0 -30
  483. package/dist/heatmap-matrix/index.d.ts +0 -53
  484. package/dist/heatmap-matrix/index.js +0 -100
  485. package/dist/heatmap-matrix/shared.d.ts +0 -2
  486. package/dist/heatmap-matrix/shared.js +0 -4
  487. package/dist/icons.d.ts +0 -569
  488. package/dist/icons.js +0 -648
  489. package/dist/index.d.ts +0 -39
  490. package/dist/index.js +0 -39
  491. package/dist/io/decompress.d.ts +0 -10
  492. package/dist/io/decompress.js +0 -69
  493. package/dist/io/export.d.ts +0 -16
  494. package/dist/io/export.js +0 -312
  495. package/dist/io/fetch.d.ts +0 -5
  496. package/dist/io/fetch.js +0 -39
  497. package/dist/io/file-drop.d.ts +0 -7
  498. package/dist/io/file-drop.js +0 -43
  499. package/dist/io/index.d.ts +0 -7
  500. package/dist/io/index.js +0 -7
  501. package/dist/io/is-binary.d.ts +0 -1
  502. package/dist/io/is-binary.js +0 -5
  503. package/dist/io/types.d.ts +0 -8
  504. package/dist/io/types.js +0 -1
  505. package/dist/io/url-drop.d.ts +0 -2
  506. package/dist/io/url-drop.js +0 -117
  507. package/dist/isosurface/Isosurface.svelte +0 -285
  508. package/dist/isosurface/Isosurface.svelte.d.ts +0 -8
  509. package/dist/isosurface/IsosurfaceControls.svelte +0 -291
  510. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +0 -9
  511. package/dist/isosurface/index.d.ts +0 -5
  512. package/dist/isosurface/index.js +0 -6
  513. package/dist/isosurface/parse.d.ts +0 -6
  514. package/dist/isosurface/parse.js +0 -553
  515. package/dist/isosurface/slice.d.ts +0 -11
  516. package/dist/isosurface/slice.js +0 -140
  517. package/dist/isosurface/types.d.ts +0 -56
  518. package/dist/isosurface/types.js +0 -227
  519. package/dist/labels.d.ts +0 -53
  520. package/dist/labels.js +0 -274
  521. package/dist/layout/FullscreenToggle.svelte +0 -50
  522. package/dist/layout/FullscreenToggle.svelte.d.ts +0 -7
  523. package/dist/layout/InfoCard.svelte +0 -120
  524. package/dist/layout/InfoCard.svelte.d.ts +0 -21
  525. package/dist/layout/InfoTag.svelte +0 -183
  526. package/dist/layout/InfoTag.svelte.d.ts +0 -19
  527. package/dist/layout/PropertyFilter.svelte +0 -244
  528. package/dist/layout/PropertyFilter.svelte.d.ts +0 -24
  529. package/dist/layout/SettingsSection.svelte +0 -148
  530. package/dist/layout/SettingsSection.svelte.d.ts +0 -17
  531. package/dist/layout/SubpageGrid.svelte +0 -82
  532. package/dist/layout/SubpageGrid.svelte.d.ts +0 -14
  533. package/dist/layout/fullscreen.d.ts +0 -9
  534. package/dist/layout/fullscreen.js +0 -53
  535. package/dist/layout/index.d.ts +0 -10
  536. package/dist/layout/index.js +0 -8
  537. package/dist/layout/json-tree/JsonNode.svelte +0 -547
  538. package/dist/layout/json-tree/JsonNode.svelte.d.ts +0 -11
  539. package/dist/layout/json-tree/JsonTree.svelte +0 -1222
  540. package/dist/layout/json-tree/JsonTree.svelte.d.ts +0 -6
  541. package/dist/layout/json-tree/JsonValue.svelte +0 -334
  542. package/dist/layout/json-tree/JsonValue.svelte.d.ts +0 -9
  543. package/dist/layout/json-tree/index.d.ts +0 -3
  544. package/dist/layout/json-tree/index.js +0 -3
  545. package/dist/layout/json-tree/types.d.ts +0 -73
  546. package/dist/layout/json-tree/types.js +0 -3
  547. package/dist/layout/json-tree/utils.d.ts +0 -29
  548. package/dist/layout/json-tree/utils.js +0 -648
  549. package/dist/marching-cubes.d.ts +0 -14
  550. package/dist/marching-cubes.js +0 -542
  551. package/dist/math.d.ts +0 -91
  552. package/dist/math.js +0 -896
  553. package/dist/overlays/ContextMenu.svelte +0 -162
  554. package/dist/overlays/ContextMenu.svelte.d.ts +0 -25
  555. package/dist/overlays/DraggablePane.svelte +0 -564
  556. package/dist/overlays/DraggablePane.svelte.d.ts +0 -36
  557. package/dist/overlays/index.d.ts +0 -2
  558. package/dist/overlays/index.js +0 -2
  559. package/dist/periodic-table/PeriodicTable.svelte +0 -469
  560. package/dist/periodic-table/PeriodicTable.svelte.d.ts +0 -55
  561. package/dist/periodic-table/PeriodicTableControls.svelte +0 -557
  562. package/dist/periodic-table/PeriodicTableControls.svelte.d.ts +0 -24
  563. package/dist/periodic-table/PropertySelect.svelte +0 -37
  564. package/dist/periodic-table/PropertySelect.svelte.d.ts +0 -13
  565. package/dist/periodic-table/TableInset.svelte.d.ts +0 -9
  566. package/dist/periodic-table/index.d.ts +0 -10
  567. package/dist/periodic-table/index.js +0 -4
  568. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +0 -1086
  569. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +0 -44
  570. package/dist/phase-diagram/PhaseDiagramControls.svelte +0 -451
  571. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +0 -30
  572. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +0 -126
  573. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +0 -15
  574. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +0 -192
  575. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +0 -19
  576. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +0 -392
  577. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +0 -16
  578. package/dist/phase-diagram/TdbInfoPanel.svelte +0 -203
  579. package/dist/phase-diagram/TdbInfoPanel.svelte.d.ts +0 -12
  580. package/dist/phase-diagram/build-diagram.d.ts +0 -11
  581. package/dist/phase-diagram/build-diagram.js +0 -167
  582. package/dist/phase-diagram/colors.d.ts +0 -35
  583. package/dist/phase-diagram/colors.js +0 -51
  584. package/dist/phase-diagram/diagram-input.d.ts +0 -33
  585. package/dist/phase-diagram/diagram-input.js +0 -3
  586. package/dist/phase-diagram/index.d.ts +0 -13
  587. package/dist/phase-diagram/index.js +0 -13
  588. package/dist/phase-diagram/parse.d.ts +0 -55
  589. package/dist/phase-diagram/parse.js +0 -276
  590. package/dist/phase-diagram/svg-to-diagram.d.ts +0 -2
  591. package/dist/phase-diagram/svg-to-diagram.js +0 -869
  592. package/dist/phase-diagram/types.d.ts +0 -99
  593. package/dist/phase-diagram/types.js +0 -1
  594. package/dist/phase-diagram/utils.d.ts +0 -118
  595. package/dist/phase-diagram/utils.js +0 -606
  596. package/dist/plot/AxisLabel.svelte +0 -51
  597. package/dist/plot/AxisLabel.svelte.d.ts +0 -16
  598. package/dist/plot/BarPlot.svelte +0 -2256
  599. package/dist/plot/BarPlot.svelte.d.ts +0 -82
  600. package/dist/plot/BarPlotControls.svelte +0 -66
  601. package/dist/plot/BarPlotControls.svelte.d.ts +0 -18
  602. package/dist/plot/ColorBar.svelte +0 -719
  603. package/dist/plot/ColorBar.svelte.d.ts +0 -31
  604. package/dist/plot/ColorScaleSelect.svelte +0 -54
  605. package/dist/plot/ColorScaleSelect.svelte.d.ts +0 -15
  606. package/dist/plot/ElementScatter.svelte +0 -63
  607. package/dist/plot/ElementScatter.svelte.d.ts +0 -14
  608. package/dist/plot/FillArea.svelte +0 -226
  609. package/dist/plot/FillArea.svelte.d.ts +0 -20
  610. package/dist/plot/Histogram.svelte +0 -1654
  611. package/dist/plot/Histogram.svelte.d.ts +0 -50
  612. package/dist/plot/HistogramControls.svelte +0 -212
  613. package/dist/plot/HistogramControls.svelte.d.ts +0 -22
  614. package/dist/plot/InteractiveAxisLabel.svelte +0 -94
  615. package/dist/plot/InteractiveAxisLabel.svelte.d.ts +0 -14
  616. package/dist/plot/Line.svelte +0 -85
  617. package/dist/plot/Line.svelte.d.ts +0 -15
  618. package/dist/plot/PlotControls.svelte +0 -537
  619. package/dist/plot/PlotControls.svelte.d.ts +0 -4
  620. package/dist/plot/PlotLegend.svelte +0 -498
  621. package/dist/plot/PlotLegend.svelte.d.ts +0 -25
  622. package/dist/plot/PlotTooltip.svelte +0 -67
  623. package/dist/plot/PlotTooltip.svelte.d.ts +0 -17
  624. package/dist/plot/PortalSelect.svelte +0 -253
  625. package/dist/plot/PortalSelect.svelte.d.ts +0 -16
  626. package/dist/plot/ReferenceLine.svelte.d.ts +0 -20
  627. package/dist/plot/ReferenceLine3D.svelte +0 -154
  628. package/dist/plot/ReferenceLine3D.svelte.d.ts +0 -14
  629. package/dist/plot/ReferencePlane.svelte +0 -178
  630. package/dist/plot/ReferencePlane.svelte.d.ts +0 -14
  631. package/dist/plot/ScatterPlot.svelte +0 -2831
  632. package/dist/plot/ScatterPlot.svelte.d.ts +0 -92
  633. package/dist/plot/ScatterPlot3D.svelte +0 -499
  634. package/dist/plot/ScatterPlot3D.svelte.d.ts +0 -94
  635. package/dist/plot/ScatterPlot3DControls.svelte +0 -437
  636. package/dist/plot/ScatterPlot3DControls.svelte.d.ts +0 -20
  637. package/dist/plot/ScatterPlot3DScene.svelte +0 -912
  638. package/dist/plot/ScatterPlot3DScene.svelte.d.ts +0 -74
  639. package/dist/plot/ScatterPlotControls.svelte +0 -307
  640. package/dist/plot/ScatterPlotControls.svelte.d.ts +0 -17
  641. package/dist/plot/ScatterPoint.svelte +0 -185
  642. package/dist/plot/ScatterPoint.svelte.d.ts +0 -19
  643. package/dist/plot/SpacegroupBarPlot.svelte +0 -292
  644. package/dist/plot/SpacegroupBarPlot.svelte.d.ts +0 -9
  645. package/dist/plot/Surface3D.svelte +0 -200
  646. package/dist/plot/Surface3D.svelte.d.ts +0 -13
  647. package/dist/plot/ZeroLines.svelte +0 -96
  648. package/dist/plot/ZeroLines.svelte.d.ts +0 -32
  649. package/dist/plot/ZoomRect.svelte +0 -23
  650. package/dist/plot/ZoomRect.svelte.d.ts +0 -8
  651. package/dist/plot/axis-utils.d.ts +0 -19
  652. package/dist/plot/axis-utils.js +0 -80
  653. package/dist/plot/data-cleaning.d.ts +0 -37
  654. package/dist/plot/data-cleaning.js +0 -855
  655. package/dist/plot/data-transform.d.ts +0 -16
  656. package/dist/plot/data-transform.js +0 -45
  657. package/dist/plot/defaults.d.ts +0 -19
  658. package/dist/plot/defaults.js +0 -9
  659. package/dist/plot/fill-utils.d.ts +0 -51
  660. package/dist/plot/fill-utils.js +0 -337
  661. package/dist/plot/hover-lock.svelte.d.ts +0 -14
  662. package/dist/plot/hover-lock.svelte.js +0 -46
  663. package/dist/plot/index.d.ts +0 -43
  664. package/dist/plot/index.js +0 -37
  665. package/dist/plot/interactions.d.ts +0 -12
  666. package/dist/plot/interactions.js +0 -100
  667. package/dist/plot/layout.d.ts +0 -60
  668. package/dist/plot/layout.js +0 -230
  669. package/dist/plot/reference-line.d.ts +0 -60
  670. package/dist/plot/reference-line.js +0 -316
  671. package/dist/plot/scales.d.ts +0 -48
  672. package/dist/plot/scales.js +0 -484
  673. package/dist/plot/svg.d.ts +0 -1
  674. package/dist/plot/svg.js +0 -11
  675. package/dist/plot/types.d.ts +0 -863
  676. package/dist/plot/types.js +0 -103
  677. package/dist/plot/utils/label-placement.d.ts +0 -47
  678. package/dist/plot/utils/label-placement.js +0 -256
  679. package/dist/plot/utils/series-visibility.d.ts +0 -9
  680. package/dist/plot/utils/series-visibility.js +0 -67
  681. package/dist/plot/utils.d.ts +0 -1
  682. package/dist/plot/utils.js +0 -14
  683. package/dist/rdf/RdfPlot.svelte +0 -247
  684. package/dist/rdf/RdfPlot.svelte.d.ts +0 -27
  685. package/dist/rdf/calc-rdf.d.ts +0 -4
  686. package/dist/rdf/calc-rdf.js +0 -111
  687. package/dist/rdf/index.d.ts +0 -23
  688. package/dist/rdf/index.js +0 -2
  689. package/dist/sanitize.d.ts +0 -4
  690. package/dist/sanitize.js +0 -107
  691. package/dist/settings.d.ts +0 -253
  692. package/dist/settings.js +0 -1123
  693. package/dist/spectral/Bands.svelte +0 -1040
  694. package/dist/spectral/Bands.svelte.d.ts +0 -40
  695. package/dist/spectral/BandsAndDos.svelte +0 -128
  696. package/dist/spectral/BandsAndDos.svelte.d.ts +0 -18
  697. package/dist/spectral/BrillouinBandsDos.svelte +0 -248
  698. package/dist/spectral/BrillouinBandsDos.svelte.d.ts +0 -20
  699. package/dist/spectral/Dos.svelte +0 -697
  700. package/dist/spectral/Dos.svelte.d.ts +0 -29
  701. package/dist/spectral/helpers.d.ts +0 -117
  702. package/dist/spectral/helpers.js +0 -1023
  703. package/dist/spectral/index.d.ts +0 -6
  704. package/dist/spectral/index.js +0 -7
  705. package/dist/spectral/types.d.ts +0 -84
  706. package/dist/spectral/types.js +0 -2
  707. package/dist/state.svelte.d.ts +0 -25
  708. package/dist/state.svelte.js +0 -45
  709. package/dist/structure/Arrow.svelte +0 -72
  710. package/dist/structure/Arrow.svelte.d.ts +0 -15
  711. package/dist/structure/AtomLegend.svelte +0 -798
  712. package/dist/structure/AtomLegend.svelte.d.ts +0 -34
  713. package/dist/structure/Bond.svelte +0 -140
  714. package/dist/structure/Bond.svelte.d.ts +0 -9
  715. package/dist/structure/CanvasTooltip.svelte +0 -33
  716. package/dist/structure/CanvasTooltip.svelte.d.ts +0 -12
  717. package/dist/structure/CellSelect.svelte +0 -351
  718. package/dist/structure/CellSelect.svelte.d.ts +0 -13
  719. package/dist/structure/Cylinder.svelte +0 -45
  720. package/dist/structure/Cylinder.svelte.d.ts +0 -10
  721. package/dist/structure/Lattice.svelte +0 -196
  722. package/dist/structure/Lattice.svelte.d.ts +0 -17
  723. package/dist/structure/Structure.svelte +0 -1857
  724. package/dist/structure/Structure.svelte.d.ts +0 -83
  725. package/dist/structure/StructureControls.svelte +0 -1184
  726. package/dist/structure/StructureControls.svelte.d.ts +0 -31
  727. package/dist/structure/StructureExportPane.svelte +0 -251
  728. package/dist/structure/StructureExportPane.svelte.d.ts +0 -17
  729. package/dist/structure/StructureInfoPane.svelte +0 -434
  730. package/dist/structure/StructureInfoPane.svelte.d.ts +0 -18
  731. package/dist/structure/StructureScene.svelte +0 -1574
  732. package/dist/structure/StructureScene.svelte.d.ts +0 -104
  733. package/dist/structure/atom-properties.d.ts +0 -37
  734. package/dist/structure/atom-properties.js +0 -198
  735. package/dist/structure/bonding.d.ts +0 -33
  736. package/dist/structure/bonding.js +0 -304
  737. package/dist/structure/export.d.ts +0 -20
  738. package/dist/structure/export.js +0 -725
  739. package/dist/structure/ferrox-wasm-types.d.ts +0 -46
  740. package/dist/structure/ferrox-wasm-types.js +0 -18
  741. package/dist/structure/ferrox-wasm.d.ts +0 -94
  742. package/dist/structure/ferrox-wasm.js +0 -249
  743. package/dist/structure/index.d.ts +0 -110
  744. package/dist/structure/index.js +0 -168
  745. package/dist/structure/measure.d.ts +0 -6
  746. package/dist/structure/measure.js +0 -29
  747. package/dist/structure/parse.d.ts +0 -65
  748. package/dist/structure/parse.js +0 -1374
  749. package/dist/structure/partial-occupancy.d.ts +0 -25
  750. package/dist/structure/partial-occupancy.js +0 -99
  751. package/dist/structure/pbc.d.ts +0 -9
  752. package/dist/structure/pbc.js +0 -123
  753. package/dist/structure/supercell.d.ts +0 -8
  754. package/dist/structure/supercell.js +0 -137
  755. package/dist/structure/validation.d.ts +0 -2
  756. package/dist/structure/validation.js +0 -10
  757. package/dist/symmetry/SymmetryStats.svelte +0 -226
  758. package/dist/symmetry/SymmetryStats.svelte.d.ts +0 -21
  759. package/dist/symmetry/WyckoffTable.svelte +0 -113
  760. package/dist/symmetry/WyckoffTable.svelte.d.ts +0 -11
  761. package/dist/symmetry/cell-transform.d.ts +0 -12
  762. package/dist/symmetry/cell-transform.js +0 -77
  763. package/dist/symmetry/index.d.ts +0 -43
  764. package/dist/symmetry/index.js +0 -229
  765. package/dist/symmetry/spacegroups.d.ts +0 -9
  766. package/dist/symmetry/spacegroups.js +0 -394
  767. package/dist/table/HeatmapTable.svelte +0 -1854
  768. package/dist/table/HeatmapTable.svelte.d.ts +0 -49
  769. package/dist/table/ToggleMenu.svelte +0 -376
  770. package/dist/table/ToggleMenu.svelte.d.ts +0 -11
  771. package/dist/table/index.d.ts +0 -74
  772. package/dist/table/index.js +0 -38
  773. package/dist/theme/ThemeControl.svelte +0 -53
  774. package/dist/theme/ThemeControl.svelte.d.ts +0 -9
  775. package/dist/theme/index.d.ts +0 -29
  776. package/dist/theme/index.js +0 -79
  777. package/dist/theme/themes.mjs +0 -285
  778. package/dist/time.d.ts +0 -4
  779. package/dist/time.js +0 -70
  780. package/dist/tooltip/TooltipContent.svelte +0 -58
  781. package/dist/tooltip/TooltipContent.svelte.d.ts +0 -31
  782. package/dist/tooltip/index.d.ts +0 -2
  783. package/dist/tooltip/index.js +0 -2
  784. package/dist/tooltip/types.d.ts +0 -8
  785. package/dist/tooltip/types.js +0 -1
  786. package/dist/trajectory/Trajectory.svelte +0 -1517
  787. package/dist/trajectory/Trajectory.svelte.d.ts +0 -77
  788. package/dist/trajectory/TrajectoryError.svelte +0 -128
  789. package/dist/trajectory/TrajectoryError.svelte.d.ts +0 -13
  790. package/dist/trajectory/TrajectoryExportPane.svelte +0 -357
  791. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +0 -17
  792. package/dist/trajectory/TrajectoryInfoPane.svelte +0 -387
  793. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +0 -17
  794. package/dist/trajectory/constants.d.ts +0 -6
  795. package/dist/trajectory/constants.js +0 -7
  796. package/dist/trajectory/extract.d.ts +0 -5
  797. package/dist/trajectory/extract.js +0 -162
  798. package/dist/trajectory/format-detect.d.ts +0 -9
  799. package/dist/trajectory/format-detect.js +0 -76
  800. package/dist/trajectory/frame-reader.d.ts +0 -17
  801. package/dist/trajectory/frame-reader.js +0 -332
  802. package/dist/trajectory/helpers.d.ts +0 -14
  803. package/dist/trajectory/helpers.js +0 -172
  804. package/dist/trajectory/index.d.ts +0 -63
  805. package/dist/trajectory/index.js +0 -126
  806. package/dist/trajectory/parse/ase.d.ts +0 -2
  807. package/dist/trajectory/parse/ase.js +0 -77
  808. package/dist/trajectory/parse/hdf5.d.ts +0 -2
  809. package/dist/trajectory/parse/hdf5.js +0 -129
  810. package/dist/trajectory/parse/index.d.ts +0 -12
  811. package/dist/trajectory/parse/index.js +0 -299
  812. package/dist/trajectory/parse/lammps.d.ts +0 -5
  813. package/dist/trajectory/parse/lammps.js +0 -179
  814. package/dist/trajectory/parse/vasp.d.ts +0 -2
  815. package/dist/trajectory/parse/vasp.js +0 -68
  816. package/dist/trajectory/parse/xyz.d.ts +0 -2
  817. package/dist/trajectory/parse/xyz.js +0 -110
  818. package/dist/trajectory/plotting.d.ts +0 -28
  819. package/dist/trajectory/plotting.js +0 -423
  820. package/dist/trajectory/types.d.ts +0 -11
  821. package/dist/trajectory/types.js +0 -1
  822. package/dist/utils.d.ts +0 -5
  823. package/dist/utils.js +0 -36
  824. package/dist/xrd/XrdPlot.svelte +0 -615
  825. package/dist/xrd/XrdPlot.svelte.d.ts +0 -28
  826. package/dist/xrd/broadening.d.ts +0 -20
  827. package/dist/xrd/broadening.js +0 -97
  828. package/dist/xrd/calc-xrd.d.ts +0 -37
  829. package/dist/xrd/calc-xrd.js +0 -337
  830. package/dist/xrd/index.d.ts +0 -37
  831. package/dist/xrd/index.js +0 -4
  832. package/dist/xrd/parse.d.ts +0 -13
  833. package/dist/xrd/parse.js +0 -749
  834. /package/dist/{EmptyState.svelte → src/lib/EmptyState.svelte} +0 -0
  835. /package/dist/{Icon.svelte → src/lib/Icon.svelte} +0 -0
  836. /package/dist/{chempot-diagram → src/lib/chempot-diagram}/ChemPotScene3D.svelte +0 -0
  837. /package/dist/{colors → src/lib/colors}/alloy-colors.json +0 -0
  838. /package/dist/{colors → src/lib/colors}/dark-mode-colors.json +0 -0
  839. /package/dist/{colors → src/lib/colors}/jmol-colors.json +0 -0
  840. /package/dist/{colors → src/lib/colors}/muted-colors.json +0 -0
  841. /package/dist/{colors → src/lib/colors}/pastel-colors.json +0 -0
  842. /package/dist/{colors → src/lib/colors}/vesta-colors.json +0 -0
  843. /package/dist/{element → src/lib/element}/Nucleus.svelte +0 -0
  844. /package/dist/{element → src/lib/element}/data.json +0 -0
  845. /package/dist/{element → src/lib/element}/data.json.gz +0 -0
  846. /package/dist/{element → src/lib/element}/data.schema.json +0 -0
  847. /package/dist/{element-image-urls.json → src/lib/element-image-urls.json} +0 -0
  848. /package/dist/{feedback → src/lib/feedback}/Spinner.svelte +0 -0
  849. /package/dist/{feedback → src/lib/feedback}/StatusMessage.svelte +0 -0
  850. /package/dist/{periodic-table → src/lib/periodic-table}/TableInset.svelte +0 -0
  851. /package/dist/{plot → src/lib/plot}/ReferenceLine.svelte +0 -0
  852. /package/dist/{xrd → src/lib/xrd}/atomic_scattering_params.json +0 -0
@@ -1,1574 +0,0 @@
1
- <script lang="ts">
2
- import type { D3InterpolateName } from '../colors'
3
- import { AXIS_COLORS, get_d3_interpolator, NEG_AXIS_COLORS } from '../colors'
4
- import type { ElementSymbol } from '../element'
5
- import { element_data } from '../element'
6
- import Isosurface from '../isosurface/Isosurface.svelte'
7
- import type { IsosurfaceSettings, VolumetricData } from '../isosurface/types'
8
- import { DEFAULT_ISOSURFACE_SETTINGS } from '../isosurface/types'
9
- import { format_num } from '../labels'
10
- import type { Vec3 } from '../math'
11
- import * as math from '../math'
12
- import type {
13
- CameraProjection,
14
- ShowBonds,
15
- VectorColorMode,
16
- VectorLayerConfig,
17
- } from '../settings'
18
- import { DEFAULTS } from '../settings'
19
- import { sanitize_html } from '../sanitize'
20
- import { colors } from '../state.svelte'
21
- import type { AnyStructure, BondPair, MeasureMode, Site } from './'
22
- import {
23
- Arrow,
24
- atomic_radii,
25
- Cylinder,
26
- get_all_site_vectors,
27
- get_center_of_mass,
28
- get_structure_vector_keys,
29
- Lattice,
30
- VECTOR_PALETTE,
31
- } from './'
32
- import type { AtomColorConfig } from './atom-properties'
33
- import {
34
- get_orig_site_idx,
35
- get_property_colors,
36
- } from './atom-properties'
37
- import * as measure from './measure'
38
- import {
39
- compute_slice_geometry,
40
- merge_split_partial_sites,
41
- PARTIAL_OCCUPANCY_CAP_ARC,
42
- } from './partial-occupancy'
43
- import type { MoyoDataset } from '@spglib/moyo-wasm'
44
- import { T, useThrelte } from '@threlte/core'
45
- import * as extras from '@threlte/extras'
46
- import { type ComponentProps, type Snippet, untrack } from 'svelte'
47
- import { SvelteMap, SvelteSet } from 'svelte/reactivity'
48
- import { type Camera, Color, type Mesh, type Scene } from 'three'
49
- import Bond from './Bond.svelte'
50
- import type { BondingStrategy } from './bonding'
51
- import { BONDING_STRATEGIES, compute_bond_transform } from './bonding'
52
- import { CanvasTooltip } from './index'
53
-
54
- type InstancedAtomGroup = {
55
- element: string
56
- radius: number
57
- color: string
58
- is_image_atom: boolean
59
- atoms: (typeof atom_data)[number][]
60
- }
61
-
62
- let pulse_time = $state(0)
63
- let pulse_opacity = $derived(0.15 + 0.25 * Math.sin(pulse_time * 5))
64
- $effect(() => {
65
- if (!selected_sites?.length && !active_sites?.length) return
66
- if (typeof globalThis === `undefined`) return
67
- const reduce = globalThis.matchMedia?.(`(prefers-reduced-motion: reduce)`).matches
68
- if (reduce) return
69
- let frame_id = 0
70
- const animate = () => {
71
- pulse_time += 0.015
72
- frame_id = requestAnimationFrame(animate)
73
- }
74
- frame_id = requestAnimationFrame(animate)
75
- return () => cancelAnimationFrame(frame_id)
76
- })
77
-
78
- let {
79
- structure = undefined,
80
- base_structure = undefined,
81
- atom_radius = DEFAULTS.structure.atom_radius,
82
- same_size_atoms = false,
83
- camera_position = DEFAULTS.structure.camera_position,
84
- camera_target = undefined,
85
- camera_projection = DEFAULTS.structure.camera_projection,
86
- rotation_damping = DEFAULTS.structure.rotation_damping,
87
- max_zoom = DEFAULTS.structure.max_zoom,
88
- min_zoom = DEFAULTS.structure.min_zoom,
89
- rotate_speed = DEFAULTS.structure.rotate_speed,
90
- zoom_speed = DEFAULTS.structure.zoom_speed,
91
- pan_speed = DEFAULTS.structure.pan_speed,
92
- zoom_to_cursor = DEFAULTS.structure.zoom_to_cursor,
93
- show_atoms = DEFAULTS.structure.show_atoms,
94
- show_bonds = DEFAULTS.structure.show_bonds,
95
- show_site_labels = DEFAULTS.structure.show_site_labels,
96
- show_site_indices = DEFAULTS.structure.show_site_indices,
97
- site_label_size = DEFAULTS.structure.site_label_size,
98
- site_label_offset = $bindable(DEFAULTS.structure.site_label_offset),
99
- site_label_bg_color = `color-mix(in srgb, #000000 0%, transparent)`,
100
- site_label_color = `#ffffff`,
101
- site_label_padding = 3,
102
- vector_configs = $bindable<Record<string, VectorLayerConfig>>({}),
103
- vector_scale = DEFAULTS.structure.vector_scale,
104
- vector_color = DEFAULTS.structure.vector_color,
105
- vector_color_mode = DEFAULTS.structure.vector_color_mode as VectorColorMode,
106
- vector_color_scale = DEFAULTS.structure.vector_color_scale,
107
- vector_normalize = DEFAULTS.structure.vector_normalize,
108
- vector_uniform_thickness = DEFAULTS.structure.vector_uniform_thickness,
109
- vector_origin_gap = DEFAULTS.structure.vector_origin_gap,
110
- vector_shaft_radius = DEFAULTS.structure.vector_shaft_radius,
111
- vector_arrow_head_radius = DEFAULTS.structure.vector_arrow_head_radius,
112
- vector_arrow_head_length = DEFAULTS.structure.vector_arrow_head_length,
113
- gizmo = DEFAULTS.structure.show_gizmo,
114
- hovered_idx = $bindable(null),
115
- hovered_site = $bindable(null),
116
- float_fmt = `.3~f`,
117
- auto_rotate = DEFAULTS.structure.auto_rotate,
118
- bond_thickness = DEFAULTS.structure.bond_thickness,
119
- bond_color = DEFAULTS.structure.bond_color,
120
- bonding_strategy = DEFAULTS.structure.bonding_strategy,
121
- bonding_options = {},
122
- fov = DEFAULTS.structure.fov,
123
- initial_zoom = DEFAULTS.structure.initial_zoom,
124
- ambient_light = DEFAULTS.structure.ambient_light,
125
- directional_light = DEFAULTS.structure.directional_light,
126
- sphere_segments = DEFAULTS.structure.sphere_segments,
127
- lattice_props = {},
128
- atom_label,
129
- camera_is_moving = $bindable(false),
130
- width = 0,
131
- height = 0,
132
- measure_mode = `distance`,
133
- selected_sites = $bindable([]),
134
- measured_sites = $bindable([]),
135
- added_bonds = $bindable([]),
136
- removed_bonds = $bindable([]),
137
- selection_highlight_color = `#6cf0ff`,
138
- // Active highlight group with different color
139
- active_sites = $bindable([]),
140
- active_highlight_color = `var(--struct-active-highlight-color, #2563eb)`,
141
- rotation = DEFAULTS.structure.rotation,
142
- scene = $bindable(),
143
- camera = $bindable(),
144
- orbit_controls = $bindable(),
145
- rotation_target_ref = $bindable(),
146
- initial_computed_zoom = $bindable(),
147
- hidden_elements = $bindable(new SvelteSet()),
148
- hidden_prop_vals = $bindable(new SvelteSet<number | string>()),
149
- element_radius_overrides = $bindable<Partial<Record<ElementSymbol, number>>>({}),
150
- site_radius_overrides = $bindable<SvelteMap<number, number>>(new SvelteMap()),
151
- atom_color_config = {
152
- mode: DEFAULTS.structure.atom_color_mode,
153
- scale: DEFAULTS.structure.atom_color_scale as D3InterpolateName,
154
- scale_type: DEFAULTS.structure.atom_color_scale_type,
155
- },
156
- sym_data = null,
157
- // Edit-atoms mode callbacks
158
- on_sites_moved,
159
- on_operation_start,
160
- on_add_atom,
161
- add_atom_mode = $bindable(false),
162
- add_element = $bindable(`C`),
163
- cursor = $bindable(`default`),
164
- dragging_atoms = $bindable(false),
165
- volumetric_data = undefined,
166
- isosurface_settings = DEFAULT_ISOSURFACE_SETTINGS,
167
- }: {
168
- structure?: AnyStructure
169
- base_structure?: AnyStructure // The original structure without image atoms, used for property color calculation
170
- atom_radius?: number // scale factor for atomic radii
171
- same_size_atoms?: boolean // whether to use the same radius for all atoms. if not, the radius will be
172
- // determined by the atomic radius of the element
173
- camera_position?: [x: number, y: number, z: number] // initial camera position from which to render the scene
174
- camera_target?: Vec3 // external orbit-controls target for pan synchronization
175
- camera_projection?: CameraProjection // camera projection type
176
- rotation_damping?: number // rotation damping factor (how quickly the rotation comes to rest after mouse release)
177
- // zoom level of the camera
178
- max_zoom?: number
179
- min_zoom?: number
180
- rotate_speed?: number // rotation speed. set to 0 to disable rotation.
181
- zoom_speed?: number // zoom speed. set to 0 to disable zooming.
182
- pan_speed?: number // pan speed. set to 0 to disable panning.
183
- zoom_to_cursor?: boolean // zoom toward cursor position instead of scene center
184
- show_atoms?: boolean
185
- show_bonds?: ShowBonds
186
- show_site_labels?: boolean
187
- show_site_indices?: boolean
188
- vector_configs?: Record<string, VectorLayerConfig>
189
- vector_scale?: number
190
- vector_color?: string
191
- vector_color_mode?: VectorColorMode
192
- vector_color_scale?: D3InterpolateName
193
- vector_normalize?: boolean
194
- vector_uniform_thickness?: boolean
195
- vector_origin_gap?: number
196
- vector_shaft_radius?: number
197
- vector_arrow_head_radius?: number
198
- vector_arrow_head_length?: number
199
- gizmo?: boolean | ComponentProps<typeof extras.Gizmo>
200
- hovered_idx?: number | null
201
- hovered_site?: Site | null
202
- float_fmt?: string
203
- auto_rotate?: number
204
- initial_zoom?: number
205
- bond_thickness?: number
206
- bond_color?: string
207
- bonding_strategy?: BondingStrategy
208
- bonding_options?: Record<string, unknown>
209
- fov?: number
210
- ambient_light?: number
211
- directional_light?: number
212
- sphere_segments?: number
213
- lattice_props?: ComponentProps<typeof Lattice>
214
- atom_label?: Snippet<[{ site: Site; site_idx: number }]>
215
- site_label_size?: number
216
- site_label_offset?: Vec3
217
- site_label_bg_color?: string
218
- site_label_color?: string
219
- site_label_padding?: number
220
- camera_is_moving?: boolean // used to prevent tooltip from showing while camera is moving
221
- width?: number // Viewer dimensions for responsive zoom
222
- height?: number
223
- // measurement props
224
- measure_mode?: MeasureMode
225
- selected_sites?: number[]
226
- measured_sites?: number[]
227
- added_bonds?: [number, number][]
228
- removed_bonds?: [number, number][]
229
- selection_highlight_color?: string
230
- // Support for active highlight group with different color
231
- active_sites?: number[]
232
- active_highlight_color?: string
233
- rotation?: Vec3 // rotation control prop
234
- // Expose scene and camera for external use (e.g. export pane)
235
- scene?: Scene
236
- camera?: Camera
237
- orbit_controls?: ComponentProps<typeof extras.OrbitControls>[`ref`] // OrbitControls instance
238
- rotation_target_ref?: Vec3 // Expose rotation target for reset
239
- initial_computed_zoom?: number // Expose initial zoom for reset
240
- hidden_elements?: Set<ElementSymbol>
241
- hidden_prop_vals?: Set<number | string> // Track hidden property values (e.g. Wyckoff positions, coordination numbers)
242
- element_radius_overrides?: Partial<Record<ElementSymbol, number>> // Per-element absolute radius in Angstroms
243
- site_radius_overrides?: Map<number, number> | SvelteMap<number, number> // Per-site absolute radius in Angstroms
244
- atom_color_config?: Partial<AtomColorConfig> // Atom coloring configuration
245
- sym_data?: MoyoDataset | null // Symmetry data for Wyckoff coloring
246
- // Edit-atoms mode callbacks and state
247
- on_sites_moved?: (scene_indices: number[], delta: Vec3) => void
248
- on_operation_start?: () => void
249
- on_add_atom?: (xyz: Vec3, element: ElementSymbol) => void
250
- add_atom_mode?: boolean // whether user is in click-to-place add-atom sub-mode
251
- add_element?: ElementSymbol // element to add when clicking in add-atom mode
252
- cursor?: string // cursor style for the 3D canvas
253
- dragging_atoms?: boolean // true while TransformControls drag is active (skips expensive recalculations)
254
- volumetric_data?: VolumetricData // Active volumetric data for isosurface rendering
255
- isosurface_settings?: IsosurfaceSettings // Isosurface rendering settings
256
- } = $props()
257
-
258
- const threlte = useThrelte()
259
- $effect(() => {
260
- scene = threlte.scene
261
- camera = threlte.camera.current
262
- if (threlte.renderer) {
263
- Object.assign(threlte.renderer.domElement, { __renderer: threlte.renderer })
264
- }
265
- })
266
-
267
- // Expose rotation target for external reset
268
- $effect(() => {
269
- rotation_target_ref = rotation_target
270
- })
271
-
272
- // Track initial computed zoom for reset
273
- let stored_initial_zoom = $state<number | undefined>(undefined)
274
- $effect(() => {
275
- if (stored_initial_zoom === undefined && computed_zoom > 0) {
276
- stored_initial_zoom = computed_zoom
277
- }
278
- initial_computed_zoom = stored_initial_zoom
279
- })
280
-
281
- let bond_pairs: BondPair[] = $state([])
282
- let active_tooltip = $state<`atom` | `bond` | null>(null)
283
- let hovered_bond_key = $state<string | null>(null)
284
-
285
- // Cursor style for the canvas, derived from mode and hover state
286
- let canvas_cursor = $derived.by(() => {
287
- if (measure_mode === `edit-atoms` && add_atom_mode) return `crosshair`
288
- if (hovered_idx != null) {
289
- if (measure_mode === `edit-atoms`) {
290
- const site = structure?.sites?.[hovered_idx]
291
- if (site?.properties?.orig_site_idx != null) return `not-allowed`
292
- return `pointer`
293
- }
294
- return `pointer`
295
- }
296
- return `default`
297
- })
298
-
299
- // Desaturate a color by blending it toward gray (for ghosting image atoms in edit mode)
300
- const gray = new Color(0x999999)
301
- function desaturate(hex: string | undefined, amount = 0.4): string {
302
- return `#${new Color(hex ?? 0x999999).lerp(gray, amount).getHexString()}`
303
- }
304
-
305
- // === Edit-atoms mode state ===
306
- let transform_object = $state<Mesh | undefined>(undefined)
307
- // Plain variable — only used imperatively in TransformControls drag handlers
308
- let drag_start_centroid: Vec3 | null = null
309
- // Frozen centroid set on drag start. While non-null, the TransformControls mesh
310
- // position stays at this fixed value so Svelte's reactive centroid updates (from
311
- // PBC wrapping) don't fight TransformControls. Cleared on mouseUp so the mesh
312
- // snaps to the new wrapped centroid.
313
- let frozen_centroid = $state<Vec3 | null>(null)
314
-
315
- const get_bond_key = (idx1: number, idx2: number): string =>
316
- idx1 < idx2 ? `${idx1}-${idx2}` : `${idx2}-${idx1}`
317
-
318
- // Toggle a bond between two atoms: cycles through add → remove → restore states
319
- function toggle_bond(site_1: number, site_2: number) {
320
- const idx_i = Math.min(site_1, site_2)
321
- const idx_j = Math.max(site_1, site_2)
322
- // added/removed pairs are stored sorted, so direct comparison works
323
- const match = ([a, b]: [number, number]) => a === idx_i && b === idx_j
324
-
325
- const added_idx = added_bonds.findIndex(match)
326
- if (added_idx >= 0) {
327
- added_bonds = added_bonds.toSpliced(added_idx, 1)
328
- return
329
- }
330
-
331
- const removed_idx = removed_bonds.findIndex(match)
332
- if (removed_idx >= 0) {
333
- removed_bonds = removed_bonds.toSpliced(removed_idx, 1)
334
- return
335
- }
336
-
337
- // bond_pairs may not be sorted, so use get_bond_key for comparison
338
- const key = `${idx_i}-${idx_j}`
339
- if (
340
- bond_pairs.some((bond) =>
341
- get_bond_key(bond.site_idx_1, bond.site_idx_2) === key
342
- )
343
- ) removed_bonds = [...removed_bonds, [idx_i, idx_j]]
344
- else added_bonds = [...added_bonds, [idx_i, idx_j]]
345
- }
346
-
347
- // Deduplicate clicks: when a highlight sphere and the underlying atom both
348
- // intercept the same native click, only the first intersection should fire.
349
- // All threlte intersection events from one click share the same nativeEvent ref.
350
- let last_native_event: Event | null = null
351
-
352
- function toggle_selection(site_index: number, evt?: Event) {
353
- evt?.stopPropagation?.()
354
- const native_event = (evt as Event & { nativeEvent?: unknown } | undefined)
355
- ?.nativeEvent
356
- if (native_event instanceof Event) {
357
- if (native_event === last_native_event) return
358
- last_native_event = native_event
359
- }
360
-
361
- if (measure_mode === `edit-bonds`) {
362
- // In edit-bonds mode, select atoms to add/remove bonds between them
363
- const new_sites = measured_sites.includes(site_index)
364
- ? measured_sites.filter((idx) => idx !== site_index)
365
- : [...measured_sites, site_index]
366
-
367
- measured_sites = new_sites
368
- selected_sites = new_sites
369
-
370
- // When two atoms are selected, toggle the bond between them
371
- if (measured_sites.length === 2) {
372
- toggle_bond(measured_sites[0], measured_sites[1])
373
- measured_sites = []
374
- selected_sites = []
375
- }
376
- return
377
- }
378
-
379
- if (measure_mode === `edit-atoms`) {
380
- // Block image atoms (detected by orig_site_idx property from PBC)
381
- const site = structure?.sites?.[site_index]
382
- if (site?.properties?.orig_site_idx != null) return
383
-
384
- const is_selected = selected_sites.includes(site_index)
385
- const is_shift = evt instanceof MouseEvent && evt.shiftKey
386
-
387
- // In edit-atoms mode, selected_sites and measured_sites always stay in sync
388
- let new_sites: number[]
389
- if (is_shift) {
390
- // Multi-select: toggle this site in/out of selection
391
- new_sites = is_selected
392
- ? selected_sites.filter((idx) => idx !== site_index)
393
- : [...selected_sites, site_index]
394
- } else {
395
- // Single-select: replace selection (or deselect if already selected)
396
- new_sites = is_selected ? [] : [site_index]
397
- }
398
- selected_sites = new_sites
399
- measured_sites = new_sites
400
- return
401
- }
402
-
403
- if (
404
- !measured_sites.includes(site_index) &&
405
- measured_sites.length >= measure.MAX_SELECTED_SITES
406
- ) {
407
- console.warn(
408
- `Selection size limit reached (${measure.MAX_SELECTED_SITES}). Deselect some sites first.`,
409
- )
410
- return
411
- }
412
-
413
- measured_sites = measured_sites.includes(site_index)
414
- ? measured_sites.filter((idx) => idx !== site_index)
415
- : [...measured_sites, site_index]
416
- selected_sites = selected_sites.includes(site_index)
417
- ? selected_sites.filter((idx) => idx !== site_index)
418
- : [...selected_sites, site_index]
419
- }
420
- $effect(() => {
421
- const count = structure?.sites?.length ?? 0
422
- if (count <= 0) {
423
- measured_sites = []
424
- return
425
- }
426
- untrack(() => {
427
- measured_sites = measured_sites.filter((idx) => idx >= 0 && idx < count)
428
- })
429
- })
430
-
431
- $effect(() => {
432
- cursor = canvas_cursor
433
- })
434
-
435
- extras.interactivity()
436
- $effect.pre(() => {
437
- hovered_site = structure?.sites?.[hovered_idx ?? -1] ?? null
438
- })
439
- let lattice = $derived(
440
- structure && `lattice` in structure ? structure.lattice : null,
441
- )
442
-
443
- let visual_lattice = $derived(
444
- base_structure && `lattice` in base_structure ? base_structure.lattice : lattice,
445
- )
446
-
447
- let rotation_target = $derived(
448
- lattice
449
- ? (math.scale(math.add(...lattice.matrix), 0.5) as Vec3)
450
- : structure
451
- ? get_center_of_mass(structure)
452
- : [0, 0, 0] as Vec3,
453
- )
454
-
455
- let structure_size = $derived(
456
- lattice ? (lattice.a + lattice.b + lattice.c) / 2 : 10,
457
- )
458
-
459
- // Characteristic inter-atomic spacing: cube root of volume per atom.
460
- // Excludes PBC image atoms (orig_site_idx) so toggling image atoms doesn't affect arrow sizing.
461
- let char_atom_spacing = $derived.by(() => {
462
- if (!lattice || !structure?.sites?.length) return structure_size
463
- const n_real = structure.sites.filter((site) =>
464
- site.properties?.orig_site_idx == null
465
- ).length
466
- return n_real > 0 ? Math.cbrt(lattice.volume / n_real) : structure_size
467
- })
468
-
469
- // When uniform thickness is on, convert negative (length-relative) radii to
470
- // positive (absolute) values scaled by inter-atomic spacing.
471
- // Already-positive (absolute) values are preserved as-is.
472
- let eff_shaft_radius = $derived(
473
- vector_uniform_thickness && vector_shaft_radius < 0
474
- ? char_atom_spacing * -vector_shaft_radius
475
- : vector_shaft_radius,
476
- )
477
- let eff_head_radius = $derived(
478
- vector_uniform_thickness && vector_arrow_head_radius < 0
479
- ? char_atom_spacing * -vector_arrow_head_radius
480
- : vector_arrow_head_radius,
481
- )
482
- let eff_head_length = $derived(
483
- vector_uniform_thickness && vector_arrow_head_length < 0
484
- ? char_atom_spacing * -vector_arrow_head_length
485
- : vector_arrow_head_length,
486
- )
487
-
488
- // Compute dynamic camera clipping planes based on structure size
489
- // This prevents z-fighting and disappearing objects when zooming in close on large supercells
490
- let camera_near = $derived(Math.max(0.01, structure_size * 0.01))
491
- let camera_far = $derived(Math.max(1000, structure_size * 100))
492
-
493
- // Using $state because this is mutated in an effect based on viewport/structure size
494
- let computed_zoom = $state(untrack(() => initial_zoom))
495
- $effect(() => {
496
- if (!(width > 0) || !(height > 0)) return
497
- const structure_max_dim = Math.max(1, untrack(() => structure_size))
498
- const viewer_min_dim = Math.min(width, height)
499
- const scale_factor = viewer_min_dim / (structure_max_dim * 50) // 50px per unit
500
- let new_zoom = initial_zoom * scale_factor
501
- if (min_zoom && min_zoom > 0) new_zoom = Math.max(min_zoom, new_zoom)
502
- if (max_zoom && max_zoom > 0) new_zoom = Math.min(max_zoom, new_zoom)
503
- computed_zoom = new_zoom
504
- })
505
-
506
- $effect.pre(() => { // Simple initial camera auto-position: proportional to structure size and fov
507
- if (camera_position.every((val) => val === 0) && structure) {
508
- stored_initial_zoom = undefined
509
- const distance = Math.max(1, structure_size) * (60 / fov)
510
- camera_position = [distance, distance * 0.3, distance * 0.8]
511
- }
512
- })
513
- $effect(() => {
514
- if (structure && show_bonds !== `never`) {
515
- // Determine if we should show bonds based on the setting and structure type
516
- const should_show_bonds = show_bonds === `always` ||
517
- (show_bonds === `crystals` && lattice) ||
518
- (show_bonds === `molecules` && !lattice)
519
-
520
- if (should_show_bonds) {
521
- bond_pairs = BONDING_STRATEGIES[bonding_strategy](structure, bonding_options)
522
- } else bond_pairs = []
523
- } else bond_pairs = []
524
- })
525
-
526
- // Compute property-based colors when not using element coloring
527
- // Use base_structure (original unit cell) for color calculation
528
- let property_colors = $derived(
529
- get_property_colors(
530
- base_structure || structure,
531
- atom_color_config,
532
- bonding_strategy,
533
- sym_data,
534
- ),
535
- )
536
- // Compute weighted average radius for a site based on species occupancies
537
- // Normalizes by total occupancy so vacancy-containing sites render at full size
538
- const calc_weighted_radius = (site: Site): number => {
539
- const total_occu = site.species.reduce((sum, { occu }) => sum + occu, 0)
540
- const weighted_sum = site.species.reduce((sum, { element, occu }) => {
541
- const override = element_radius_overrides?.[element as ElementSymbol]
542
- return sum + occu * (override ?? atomic_radii[element] ?? 1)
543
- }, 0)
544
- return total_occu > 0 ? weighted_sum / total_occu : 1
545
- }
546
-
547
- let atom_data = $derived.by(() => {
548
- if (!show_atoms || !structure?.sites) return []
549
- const render_sites = merge_split_partial_sites(structure.sites, hidden_elements)
550
- return render_sites.flatMap(({ site_idx, site, is_image_atom }) => {
551
- const orig_idx = get_orig_site_idx(site, site_idx)
552
-
553
- // Skip sites with hidden property values
554
- const prop_val = property_colors?.values[orig_idx]
555
- if (prop_val !== undefined && hidden_prop_vals.has(prop_val)) return []
556
-
557
- // Calculate radius: same_size > site override > element override > default
558
- // All radii scale uniformly with atom_radius for consistent slider behavior
559
- const base_radius = same_size_atoms
560
- ? 1
561
- : site_radius_overrides?.get(site_idx) ?? calc_weighted_radius(site)
562
- const radius = base_radius * atom_radius
563
-
564
- // Use property color if available (e.g. coordination number, Wyckoff position)
565
- // Otherwise, each species gets its own element color (important for disordered sites)
566
- const site_property_color = property_colors?.colors[orig_idx]
567
-
568
- const visible_species = site.species.filter(({ element }) =>
569
- !hidden_elements.has(element)
570
- )
571
- const slice_geometry = compute_slice_geometry(visible_species)
572
- return slice_geometry.map((slice_data) => {
573
- return {
574
- site_idx,
575
- element: slice_data.element,
576
- occupancy: slice_data.occupancy,
577
- position: site.xyz,
578
- radius,
579
- color: site_property_color ?? colors.element?.[slice_data.element],
580
- has_partial_occupancy: slice_data.occupancy < 1,
581
- start_phi: slice_data.start_phi,
582
- end_phi: slice_data.end_phi,
583
- phi_length: slice_data.phi_length,
584
- render_start_cap: slice_data.render_start_cap,
585
- render_end_cap: slice_data.render_end_cap,
586
- is_image_atom,
587
- }
588
- })
589
- })
590
- })
591
-
592
- // Shared visibility check: site has at least one non-hidden element and
593
- // its property value (if any) isn't hidden. Used by both bond and vector filtering.
594
- const is_site_visible = (site_idx: number): boolean => {
595
- if (!structure?.sites) return false
596
- const site = structure.sites[site_idx]
597
- const has_visible_element = site?.species.some(({ element }) =>
598
- !hidden_elements.has(element)
599
- )
600
- const orig_idx = get_orig_site_idx(site, site_idx)
601
- const prop_val = property_colors?.values[orig_idx]
602
- const prop_visible = prop_val === undefined ||
603
- !hidden_prop_vals.has(prop_val)
604
- return has_visible_element && prop_visible
605
- }
606
-
607
- let filtered_bond_pairs = $derived.by(() => {
608
- if (!structure?.sites) return bond_pairs
609
-
610
- // Build set of removed bond keys for efficient lookup
611
- const removed_keys = new Set(
612
- removed_bonds.map(([idx_i, idx_j]) => get_bond_key(idx_i, idx_j)),
613
- )
614
-
615
- // Filter calculated bonds: exclude removed and hidden
616
- const calculated = bond_pairs.filter(({ site_idx_1, site_idx_2 }) => {
617
- if (removed_keys.has(get_bond_key(site_idx_1, site_idx_2))) return false
618
- return is_site_visible(site_idx_1) && is_site_visible(site_idx_2)
619
- })
620
-
621
- // Create BondPair objects for manually added bonds
622
- const added: BondPair[] = added_bonds
623
- .map(([idx_i, idx_j]) => {
624
- if (!is_site_visible(idx_i) || !is_site_visible(idx_j)) return null
625
- const site1 = structure.sites[idx_i]
626
- const site2 = structure.sites[idx_j]
627
- if (!site1 || !site2) return null
628
-
629
- const pos_1 = site1.xyz
630
- const pos_2 = site2.xyz
631
- const dist = math.euclidean_dist(pos_1, pos_2)
632
-
633
- return {
634
- pos_1,
635
- pos_2,
636
- site_idx_1: idx_i,
637
- site_idx_2: idx_j,
638
- bond_length: dist,
639
- strength: 1.0,
640
- transform_matrix: compute_bond_transform(pos_1, pos_2),
641
- }
642
- })
643
- .filter((bond): bond is BondPair => bond !== null)
644
-
645
- return [...calculated, ...added]
646
- })
647
-
648
- let instanced_bond_groups = $derived.by(() => {
649
- if (!structure?.sites || filtered_bond_pairs.length === 0) return []
650
-
651
- const group = {
652
- thickness: bond_thickness,
653
- ambient_light,
654
- directional_light,
655
- instances: [] as {
656
- matrix: Float32Array
657
- color_start: string
658
- color_end: string
659
- }[],
660
- }
661
-
662
- for (const bond_data of filtered_bond_pairs) {
663
- const site_a = structure.sites[bond_data.site_idx_1]
664
- const site_b = structure.sites[bond_data.site_idx_2]
665
-
666
- const get_majority_color = (site: typeof site_a) => {
667
- if (!site?.species || site.species.length === 0) return bond_color
668
- const majority_species = site.species.reduce((max, spec) =>
669
- spec.occu > max.occu ? spec : max
670
- )
671
- return colors.element?.[majority_species.element] || bond_color
672
- }
673
-
674
- const color_start = get_majority_color(site_a)
675
- const color_end = get_majority_color(site_b)
676
- const instance = { matrix: bond_data.transform_matrix, color_start, color_end }
677
- group.instances.push(instance)
678
- }
679
-
680
- return group.instances.length > 0 ? [group] : []
681
- })
682
-
683
- let radius_by_site_idx = $derived.by(() => {
684
- const map = new SvelteMap<number, number>()
685
- for (const atom of atom_data) {
686
- if (!map.has(atom.site_idx)) map.set(atom.site_idx, atom.radius)
687
- }
688
- return map
689
- })
690
-
691
- // Get radius for a site (for highlight fallback when site is hidden/filtered)
692
- // Checks site_radius_overrides first for consistency with visible atoms
693
- const get_site_radius = (site: Site, site_idx: number | null): number => {
694
- const override = site_idx !== null
695
- ? site_radius_overrides?.get(site_idx)
696
- : undefined
697
- const base_radius = same_size_atoms ? 1 : override ?? calc_weighted_radius(site)
698
- return base_radius * atom_radius
699
- }
700
-
701
- // Interpolate between spin-down (#3498db blue) and spin-up (#e74c3c red)
702
- // based on the z-component direction of a magnetic vector
703
- function spin_direction_color(vec: Vec3): string {
704
- const mag = Math.hypot(...vec)
705
- const z_frac = mag > 1e-10 ? (vec[2] / mag + 1) / 2 : 0.5 // 0=down, 1=up
706
- const red = Math.round(52 + (231 - 52) * z_frac)
707
- const grn = Math.round(152 + (76 - 152) * z_frac)
708
- const blu = Math.round(219 + (60 - 219) * z_frac)
709
- return `#${red.toString(16).padStart(2, `0`)}${
710
- grn.toString(16).padStart(2, `0`)
711
- }${blu.toString(16).padStart(2, `0`)}`
712
- }
713
-
714
- // Build one arrow layer per visible vector key. Auto-scales the longest
715
- // vector to 1.8× char_atom_spacing (cube root of volume per atom).
716
- // When vector_normalize is on, effective_max is 1 so all arrows get equal length.
717
- // Single active key preserves legacy coloring (element for force,
718
- // spin-direction for magmom/spin). Multiple keys use flat palette colors.
719
- let vector_layers = $derived.by(() => {
720
- if (!structure?.sites) return []
721
- const keys = get_structure_vector_keys(structure)
722
- const active_keys = keys.filter((key) => vector_configs[key]?.visible !== false)
723
- if (active_keys.length === 0) return []
724
-
725
- // Build per-site lookup; skip hidden sites so they don't contribute
726
- // arrows or affect autoscaling. null entries = hidden site.
727
- const active_set = new Set(active_keys)
728
- let max_mag = 0
729
- const site_vec_maps = structure.sites.map((site, site_idx) => {
730
- if (!is_site_visible(site_idx)) return null
731
- const map = new SvelteMap<string, Vec3>()
732
- for (const { key, vec } of get_all_site_vectors(site)) {
733
- map.set(key, vec)
734
- if (active_set.has(key)) {
735
- max_mag = Math.max(max_mag, Math.hypot(...vec))
736
- }
737
- }
738
- return map
739
- })
740
-
741
- // When normalize is on, treat all magnitudes as 1 so arrows have equal length
742
- const effective_max = vector_normalize ? 1 : max_mag
743
- const auto_scale = effective_max > 1e-10
744
- ? (char_atom_spacing * 1.8) / effective_max
745
- : 1
746
- const is_single = active_keys.length === 1
747
- const effective_global_scale = auto_scale * vector_scale
748
-
749
- // When vector_origin_gap > 0 and multiple vectors exist at a site,
750
- // arrange arrow origins on a regular polygon centered on the atom, in a
751
- // plane perpendicular to the mean vector direction. The gap is a fraction
752
- // of the visual atom radius (0 = center, 0.5 = halfway to surface).
753
- // get_site_radius() returns the uniform scale applied to SphereGeometry(0.5),
754
- // so visual_radius = get_site_radius() * 0.5.
755
- const site_offsets = (vector_origin_gap > 0 && !is_single)
756
- ? structure.sites.map((site, site_idx) => {
757
- const vec_map = site_vec_maps[site_idx]
758
- if (!vec_map) return null
759
- const site_keys = active_keys.filter((key) => vec_map.has(key))
760
- const n_keys = site_keys.length
761
- if (n_keys <= 1) return null
762
- const visual_radius = get_site_radius(site, site_idx) * 0.5
763
- const gap_abs = vector_origin_gap * visual_radius
764
- let mean: Vec3 = [0, 0, 0]
765
- for (const key of site_keys) {
766
- const vec = vec_map.get(key)
767
- if (vec) mean = math.add(mean, math.normalize_vec3(vec)) as Vec3
768
- }
769
- const mean_dir = math.normalize_vec3(mean, [0, 1, 0] as Vec3)
770
- const [u_vec, v_vec] = math.compute_in_plane_basis(mean_dir)
771
- const offsets = new SvelteMap<string, Vec3>()
772
- for (const [idx, key] of site_keys.entries()) {
773
- const angle = (2 * Math.PI * idx) / n_keys
774
- const dx = math.scale(u_vec, gap_abs * Math.cos(angle)) as Vec3
775
- const dy = math.scale(v_vec, gap_abs * Math.sin(angle)) as Vec3
776
- offsets.set(key, math.add(dx, dy) as Vec3)
777
- }
778
- return offsets
779
- })
780
- : null
781
-
782
- const mag_interpolator = get_d3_interpolator(vector_color_scale)
783
-
784
- return active_keys.map((key, layer_idx) => {
785
- const layer_cfg = vector_configs[key]
786
- const layer_scale = effective_global_scale * (layer_cfg?.scale ?? 1.0)
787
- const layer_color = layer_cfg?.color ??
788
- VECTOR_PALETTE[layer_idx % VECTOR_PALETTE.length]
789
-
790
- const arrows = structure.sites
791
- .map((site, site_idx) => {
792
- const vec_map = site_vec_maps[site_idx]
793
- if (!vec_map) return null
794
- const vec = vec_map.get(key)
795
- if (!vec) return null
796
-
797
- // Resolve color mode: explicit per-key color always wins,
798
- // then multi-key uses palette, then mode-based coloring
799
- let arrow_color: string
800
- if (layer_cfg?.color) {
801
- arrow_color = layer_cfg.color
802
- } else if (!is_single) arrow_color = layer_color
803
- else {
804
- const effective_mode = vector_color_mode === `auto`
805
- ? (key.startsWith(`magmom`) || key.startsWith(`spin`)
806
- ? `spin_direction`
807
- : `element`)
808
- : vector_color_mode
809
- if (effective_mode === `magnitude`) {
810
- const mag = Math.hypot(...vec)
811
- const norm = max_mag > 1e-10 ? mag / max_mag : 0
812
- arrow_color = mag_interpolator(norm)
813
- } else if (effective_mode === `spin_direction`) {
814
- arrow_color = spin_direction_color(vec)
815
- } else if (effective_mode === `uniform`) {
816
- arrow_color = vector_color
817
- } else {
818
- const majority_element = site.species.length > 0
819
- ? site.species.reduce((max, spec) =>
820
- spec.occu > max.occu ? spec : max
821
- ).element
822
- : undefined
823
- arrow_color =
824
- (majority_element && colors.element?.[majority_element]) ||
825
- vector_color
826
- }
827
- }
828
-
829
- const offset = site_offsets?.[site_idx]?.get(key)
830
- const position = offset ? math.add(site.xyz, offset) as Vec3 : site.xyz
831
- const arrow_vec = vector_normalize ? math.normalize_vec3(vec) : vec
832
-
833
- return {
834
- site_idx,
835
- position,
836
- vector: arrow_vec,
837
- scale: layer_scale,
838
- color: arrow_color,
839
- }
840
- })
841
- .filter((item): item is NonNullable<typeof item> => item !== null)
842
-
843
- return { key, arrows }
844
- })
845
- })
846
-
847
- let instanced_atom_groups = $derived(
848
- Object.values(
849
- atom_data
850
- .filter((atom) => !atom.has_partial_occupancy)
851
- .reduce(
852
- (groups, atom) => {
853
- const { element, radius, color, is_image_atom } = atom
854
- // Separate image atoms into their own groups for distinct styling in edit-atoms mode
855
- const key = `${element}-${format_num(radius, `.3~`)}-${color}-${
856
- is_image_atom ? `img` : `base`
857
- }`
858
- const bucket = groups[key] ||
859
- (groups[key] = { element, radius, color, is_image_atom, atoms: [] })
860
- bucket.atoms.push(atom)
861
- return groups
862
- },
863
- {} as Record<string, InstancedAtomGroup>,
864
- ),
865
- ),
866
- )
867
-
868
- let unique_instanced_atoms = $derived(
869
- Object.values(
870
- instanced_atom_groups
871
- .flatMap((group) => group.atoms)
872
- .reduce((acc, atom) => {
873
- acc[atom.site_idx] = atom
874
- return acc
875
- }, {} as Record<number, (typeof atom_data)[number]>),
876
- ),
877
- )
878
-
879
- let gizmo_props = $derived.by(() => {
880
- const axis_options = Object.fromEntries(
881
- [...AXIS_COLORS, ...NEG_AXIS_COLORS].map(([axis, color, hover_color]) => [
882
- axis,
883
- {
884
- color,
885
- labelColor: `#111`,
886
- opacity: axis.startsWith(`n`) ? 0.9 : 0.8,
887
- hover: {
888
- color: hover_color,
889
- labelColor: `#222222`,
890
- opacity: axis.startsWith(`n`) ? 1 : 0.9,
891
- },
892
- },
893
- ]),
894
- )
895
- return {
896
- background: { enabled: false },
897
- className: `responsive-gizmo`,
898
- ...axis_options,
899
- ...(typeof gizmo === `boolean` ? {} : gizmo),
900
- offset: { left: 5, bottom: 5 },
901
- }
902
- })
903
-
904
- let orbit_controls_props = $derived({
905
- position: [0, 0, 0],
906
- enableRotate: rotate_speed > 0,
907
- rotateSpeed: rotate_speed,
908
- enableZoom: zoom_speed > 0,
909
- zoomSpeed: camera_projection === `orthographic` ? zoom_speed * 2 : zoom_speed,
910
- zoomToCursor: zoom_to_cursor,
911
- enablePan: pan_speed > 0,
912
- panSpeed: pan_speed,
913
- target: camera_target ?? rotation_target,
914
- maxZoom: max_zoom,
915
- minZoom: min_zoom,
916
- autoRotate: Boolean(auto_rotate),
917
- autoRotateSpeed: auto_rotate,
918
- enableDamping: Boolean(rotation_damping),
919
- dampingFactor: rotation_damping,
920
- onstart: () => {
921
- camera_is_moving = true
922
- hovered_idx = null
923
- },
924
- onend: () => {
925
- camera_is_moving = false
926
- },
927
- })
928
-
929
- let measure_line_color = $derived.by(() => {
930
- if (typeof window === `undefined`) return
931
- const root_styles = getComputedStyle(document.documentElement)
932
- const text_color = root_styles.getPropertyValue(`--text-color`).trim()
933
- return text_color || `#808080`
934
- })
935
- </script>
936
-
937
- {#snippet bond_instanced_mesh_snippet(
938
- group: ComponentProps<typeof Bond>[`group`],
939
- )}
940
- {#key group.instances.length}
941
- <Bond {group} />
942
- {/key}
943
- {/snippet}
944
-
945
- {#snippet site_label_snippet(position: Vec3, site_idx: number)}
946
- {@const site = structure!.sites[site_idx]}
947
- {@const pos = math.add(position, site_label_offset)}
948
- <extras.HTML center position={pos}>
949
- {#if atom_label}
950
- {@render atom_label({ site, site_idx })}
951
- {:else}
952
- <span
953
- class="atom-label"
954
- style:font-size="{site_label_size * 0.85}em"
955
- style:background={site_label_bg_color}
956
- style:padding="{site_label_padding}px"
957
- style:color={site_label_color}
958
- >
959
- {#if show_site_labels}
960
- {#if site.species.length === 1}
961
- {site.species[0].element}{#if show_site_indices}-{site_idx + 1}{/if}
962
- {:else}
963
- {@html sanitize_html(site.species.map((spec) =>
964
- `${spec.element}<sub>${
965
- format_num(spec.occu, `.3~`).replace(`0.`, `.`)
966
- }</sub>`
967
- ).join(``))}{#if show_site_indices}-{
968
- site_idx + 1
969
- }{/if}
970
- {/if}
971
- {:else if show_site_indices}
972
- {site_idx + 1}
973
- {/if}
974
- </span>
975
- {/if}
976
- </extras.HTML>
977
- {/snippet}
978
-
979
- {#if camera_projection === `perspective`}
980
- <T.PerspectiveCamera
981
- makeDefault
982
- position={camera_position}
983
- {fov}
984
- near={camera_near}
985
- far={camera_far}
986
- >
987
- <extras.OrbitControls bind:ref={orbit_controls} {...orbit_controls_props}>
988
- {#if gizmo}<extras.Gizmo {...gizmo_props} />{/if}
989
- </extras.OrbitControls>
990
- </T.PerspectiveCamera>
991
- {:else}
992
- <T.OrthographicCamera
993
- makeDefault
994
- position={camera_position}
995
- zoom={computed_zoom}
996
- near={-100}
997
- far={camera_far}
998
- >
999
- <extras.OrbitControls bind:ref={orbit_controls} {...orbit_controls_props}>
1000
- {#if gizmo}<extras.Gizmo {...gizmo_props} />{/if}
1001
- </extras.OrbitControls>
1002
- </T.OrthographicCamera>
1003
- {/if}
1004
-
1005
- <T.DirectionalLight position={[3, 10, 10]} intensity={directional_light} />
1006
- <T.AmbientLight intensity={ambient_light} />
1007
-
1008
- <!-- Apply manual rotation around center: translate to origin, rotate, translate back -->
1009
- <T.Group position={rotation_target}>
1010
- <T.Group {rotation}>
1011
- <T.Group position={math.scale(rotation_target, -1)}>
1012
- {#if show_atoms}
1013
- <!-- Instanced rendering for full occupancy atoms -->
1014
- {#each instanced_atom_groups as
1015
- { element, radius, color, is_image_atom, atoms }
1016
- (`${element}-${radius}-${color}-${is_image_atom ? `img` : `base`}`)
1017
- }
1018
- {@const edit_mode_image = measure_mode === `edit-atoms` && is_image_atom}
1019
- <extras.InstancedMesh
1020
- key="{element}-{format_num(radius, `.3~`)}-{color}-{is_image_atom ? `img` : `base`}-{edit_mode_image}"
1021
- limit={atoms.length}
1022
- range={atoms.length}
1023
- frustumCulled={false}
1024
- >
1025
- <T.SphereGeometry args={[0.5, sphere_segments, sphere_segments]} />
1026
- <T.MeshStandardMaterial
1027
- color={edit_mode_image ? desaturate(color) : color}
1028
- opacity={edit_mode_image ? 0.5 : 1}
1029
- transparent={edit_mode_image}
1030
- />
1031
- {#each atoms as atom (atom.site_idx)}
1032
- <extras.Instance
1033
- position={atom.position}
1034
- scale={atom.radius}
1035
- onpointerenter={() => {
1036
- if (edit_mode_image) return
1037
- hovered_idx = atom.site_idx
1038
- active_tooltip = `atom`
1039
- }}
1040
- onpointerleave={() => {
1041
- if (edit_mode_image) return
1042
- hovered_idx = null
1043
- active_tooltip = null
1044
- }}
1045
- onclick={(event: MouseEvent) => {
1046
- if (edit_mode_image) return
1047
- toggle_selection(atom.site_idx, event)
1048
- }}
1049
- />
1050
- {/each}
1051
- </extras.InstancedMesh>
1052
- {/each}
1053
-
1054
- <!-- Regular rendering for partial occupancy atoms -->
1055
- {#each atom_data.filter((atom) => atom.has_partial_occupancy) as
1056
- atom
1057
- (atom.site_idx + atom.element + atom.occupancy)
1058
- }
1059
- {@const partial_edit_image = measure_mode === `edit-atoms` && atom.is_image_atom}
1060
- {@const ghost_opacity = partial_edit_image ? 0.5 : 1}
1061
- <T.Group
1062
- position={atom.position}
1063
- scale={atom.radius}
1064
- onpointerenter={() => {
1065
- if (partial_edit_image) return
1066
- hovered_idx = atom.site_idx
1067
- active_tooltip = `atom`
1068
- }}
1069
- onpointerleave={() => {
1070
- if (partial_edit_image) return
1071
- hovered_idx = null
1072
- active_tooltip = null
1073
- }}
1074
- onclick={(event: MouseEvent) => {
1075
- if (partial_edit_image) return
1076
- toggle_selection(atom.site_idx, event)
1077
- }}
1078
- >
1079
- {@const partial_color = partial_edit_image
1080
- ? desaturate(atom.color)
1081
- : atom.color}
1082
- <T.Mesh>
1083
- <T.SphereGeometry
1084
- args={[
1085
- 0.5,
1086
- sphere_segments,
1087
- sphere_segments,
1088
- atom.start_phi,
1089
- atom.phi_length,
1090
- ]}
1091
- />
1092
- <T.MeshStandardMaterial
1093
- color={partial_color}
1094
- opacity={ghost_opacity}
1095
- transparent={partial_edit_image}
1096
- />
1097
- </T.Mesh>
1098
-
1099
- {#if atom.has_partial_occupancy && atom.render_start_cap}
1100
- <T.Mesh rotation={[0, atom.start_phi, 0]}>
1101
- <T.CircleGeometry
1102
- args={[
1103
- 0.5,
1104
- sphere_segments,
1105
- PARTIAL_OCCUPANCY_CAP_ARC.start_cap_arc_start,
1106
- PARTIAL_OCCUPANCY_CAP_ARC.arc_length,
1107
- ]}
1108
- />
1109
- <T.MeshStandardMaterial
1110
- color={partial_color}
1111
- side={2}
1112
- opacity={ghost_opacity}
1113
- transparent={partial_edit_image}
1114
- />
1115
- </T.Mesh>
1116
- {/if}
1117
- {#if atom.has_partial_occupancy && atom.render_end_cap}
1118
- <T.Mesh rotation={[0, atom.end_phi, 0]}>
1119
- <T.CircleGeometry
1120
- args={[
1121
- 0.5,
1122
- sphere_segments,
1123
- PARTIAL_OCCUPANCY_CAP_ARC.end_cap_arc_start,
1124
- PARTIAL_OCCUPANCY_CAP_ARC.arc_length,
1125
- ]}
1126
- />
1127
- <T.MeshStandardMaterial
1128
- color={partial_color}
1129
- side={2}
1130
- opacity={ghost_opacity}
1131
- transparent={partial_edit_image}
1132
- />
1133
- </T.Mesh>
1134
- {/if}
1135
- </T.Group>
1136
-
1137
- <!-- Render label only for the first species of this site to avoid duplicates -->
1138
- {#if (show_site_labels || show_site_indices) &&
1139
- atom.element === structure!.sites[atom.site_idx].species[0].element}
1140
- {@render site_label_snippet(atom.position, atom.site_idx)}
1141
- {/if}
1142
- {/each}
1143
-
1144
- <!-- Site labels/indices for instanced atoms -->
1145
- {#if show_site_labels || show_site_indices}
1146
- {#each unique_instanced_atoms as atom (atom.site_idx)}
1147
- {@render site_label_snippet(atom.position, atom.site_idx)}
1148
- {/each}
1149
- {/if}
1150
- {/if}
1151
-
1152
- {#each vector_layers as layer (layer.key)}
1153
- {#each layer.arrows as arrow (`${layer.key}-${arrow.site_idx}`)}
1154
- <Arrow
1155
- {...arrow}
1156
- shaft_radius={eff_shaft_radius}
1157
- arrow_head_radius={eff_head_radius}
1158
- arrow_head_length={eff_head_length}
1159
- />
1160
- {/each}
1161
- {/each}
1162
-
1163
- <!-- Instanced bond rendering with gradient colors -->
1164
- {#if instanced_bond_groups.length > 0}
1165
- {#each instanced_bond_groups as group (group.thickness + group.instances.length)}
1166
- {@render bond_instanced_mesh_snippet(group)}
1167
- {/each}
1168
- {/if}
1169
-
1170
- <!-- Clickable bond hit-test cylinders in edit-bonds mode -->
1171
- {#if measure_mode === `edit-bonds` && filtered_bond_pairs.length > 0}
1172
- {#each filtered_bond_pairs as
1173
- bond
1174
- (`bond-hit-${bond.site_idx_1}-${bond.site_idx_2}`)
1175
- }
1176
- {@const bond_key = get_bond_key(bond.site_idx_1, bond.site_idx_2)}
1177
- {@const is_hovered = hovered_bond_key === bond_key}
1178
- <T.Mesh
1179
- matrixAutoUpdate={false}
1180
- oncreate={(ref) => {
1181
- ref.matrix.fromArray(bond.transform_matrix)
1182
- ref.matrixWorldNeedsUpdate = true
1183
- }}
1184
- onclick={(event: MouseEvent) => {
1185
- event.stopPropagation()
1186
- toggle_bond(bond.site_idx_1, bond.site_idx_2)
1187
- measured_sites = []
1188
- selected_sites = []
1189
- hovered_bond_key = null
1190
- }}
1191
- onpointerenter={() => (hovered_bond_key = bond_key)}
1192
- onpointerleave={() => (hovered_bond_key = null)}
1193
- >
1194
- <T.CylinderGeometry args={[bond_thickness * 3, bond_thickness * 3, 1, 6]} />
1195
- <T.MeshBasicMaterial
1196
- transparent
1197
- opacity={is_hovered ? 0.25 : 0}
1198
- color={is_hovered ? `#ff4444` : `white`}
1199
- depthWrite={false}
1200
- />
1201
- </T.Mesh>
1202
- {/each}
1203
- {/if}
1204
-
1205
- <!-- highlight hovered, active and selected sites -->
1206
- {#each [
1207
- {
1208
- kind: `hover`,
1209
- site: hovered_site,
1210
- opacity: 0.28,
1211
- color: `white`,
1212
- site_idx: hovered_idx,
1213
- },
1214
- ...((selected_sites ?? []).map((idx) => ({
1215
- kind: `selected`,
1216
- site: structure?.sites?.[idx] ?? null,
1217
- site_idx: idx,
1218
- opacity: pulse_opacity,
1219
- color: selection_highlight_color,
1220
- }))),
1221
- ...((active_sites ?? []).map((idx) => ({
1222
- kind: `active`,
1223
- site: structure?.sites?.[idx] ?? null,
1224
- site_idx: idx,
1225
- opacity: pulse_opacity, // Let it pulse freely
1226
- color: active_highlight_color,
1227
- }))),
1228
- ] as
1229
- entry
1230
- (`${entry.kind}-${entry.site_idx}`)
1231
- }
1232
- {@const { site, opacity, color, kind, site_idx } = entry}
1233
- {#if site}
1234
- {@const xyz = site.xyz}
1235
- {@const highlight_radius = site_idx !== null
1236
- ? radius_by_site_idx.get(site_idx) ?? get_site_radius(site, site_idx)
1237
- : get_site_radius(site, site_idx)}
1238
- <T.Mesh
1239
- position={xyz}
1240
- scale={1.2 * highlight_radius}
1241
- onclick={(event: MouseEvent) => {
1242
- if (site_idx !== null && Number.isInteger(site_idx)) {
1243
- toggle_selection(site_idx, event)
1244
- }
1245
- }}
1246
- >
1247
- <T.SphereGeometry args={[0.5, 22, 22]} />
1248
- <T.MeshStandardMaterial
1249
- {color}
1250
- transparent
1251
- {opacity}
1252
- emissive={color}
1253
- emissiveIntensity={kind === `selected` || kind === `active` ? 0.7 : 0.2}
1254
- depthTest={false}
1255
- depthWrite={false}
1256
- />
1257
- </T.Mesh>
1258
- {/if}
1259
- {/each}
1260
-
1261
- <!-- selection order labels (1, 2, 3, ...) for measured sites (hidden in edit-atoms mode) -->
1262
- {#if structure?.sites && (measured_sites?.length ?? 0) > 0 &&
1263
- measure_mode !== `edit-atoms`}
1264
- {#each measured_sites as site_index, loop_idx (site_index)}
1265
- {@const site = structure.sites[site_index]}
1266
- {#if site}
1267
- <!-- shift selected site labels down to avoid overlapping regular site labels-->
1268
- {@const selection_offset = math.add(site_label_offset, [0, -0.5, 0])}
1269
- {@const pos = math.add(site.xyz, selection_offset) as Vec3}
1270
- <extras.HTML center position={pos}>
1271
- <span class="selection-label">{loop_idx + 1}</span>
1272
- </extras.HTML>
1273
- {/if}
1274
- {/each}
1275
- {/if}
1276
-
1277
- <!-- hovered site tooltip -->
1278
- {#if hovered_site && !camera_is_moving && active_tooltip === `atom`}
1279
- {@const abc = hovered_site.abc.map((val) => format_num(val, float_fmt)).join(
1280
- `, `,
1281
- )}
1282
- {@const xyz = hovered_site.xyz.map((val) => format_num(val, float_fmt)).join(
1283
- `, `,
1284
- )}
1285
- {@const bond_neighbors = (() => {
1286
- if (hovered_idx == null || !structure?.sites) return []
1287
- return filtered_bond_pairs
1288
- .filter((b) =>
1289
- b.site_idx_1 === hovered_idx || b.site_idx_2 === hovered_idx
1290
- )
1291
- .map((b) => {
1292
- const neighbor_idx = b.site_idx_1 === hovered_idx
1293
- ? b.site_idx_2
1294
- : b.site_idx_1
1295
- return structure.sites[neighbor_idx]?.species[0]?.element ?? `?`
1296
- })
1297
- })()}
1298
- {@const bond_summary = (() => {
1299
- if (bond_neighbors.length === 0) return ``
1300
- const counts: Record<string, number> = {}
1301
- for (const elem of bond_neighbors) {
1302
- counts[elem] = (counts[elem] ?? 0) + 1
1303
- }
1304
- const parts = Object.entries(counts)
1305
- .sort(([a], [b]) => a.localeCompare(b))
1306
- .map(([elem, count]) => `${elem}: ${count}`)
1307
- return ` (${parts.join(`, `)})`
1308
- })()}
1309
- <CanvasTooltip position={hovered_site.xyz}>
1310
- <!-- Element symbols with occupancies for disordered sites -->
1311
- <div class="elements">
1312
- {#each hovered_site.species ?? [] as
1313
- { element, occu, oxidation_state: oxi_state },
1314
- idx
1315
- (`${element ?? ``}-${occu ?? ``}-${oxi_state ?? ``}-${idx}`)
1316
- }
1317
- {@const oxi_str = (oxi_state != null && oxi_state !== 0)
1318
- ? `<sup>${Math.abs(oxi_state)}${
1319
- oxi_state > 0 ? `+` : `−`
1320
- }</sup>`
1321
- : ``}
1322
- {@const element_name = element_data.find((elem) =>
1323
- elem.symbol === element
1324
- )?.name ??
1325
- ``}
1326
- {#if idx > 0}&thinsp;{/if}
1327
- {#if occu !== 1}<span class="occupancy">{
1328
- format_num(occu, `.3~f`)
1329
- }</span>{/if}
1330
- <strong>{element}{@html sanitize_html(oxi_str)}</strong>
1331
- {#if element_name}<span class="elem-name">{element_name}</span>{/if}
1332
- {/each}
1333
- </div>
1334
- <div class="coordinates fractional">abc: ({abc})</div>
1335
- <div class="coordinates cartesian">xyz: ({xyz}) Å</div>
1336
- {#if bond_neighbors.length > 0}
1337
- <div class="coordinates">Bonds: {bond_neighbors.length}{bond_summary}</div>
1338
- {/if}
1339
- </CanvasTooltip>
1340
- {/if}
1341
-
1342
- {#if visual_lattice}
1343
- <Lattice matrix={visual_lattice.matrix} {...lattice_props} />
1344
- {/if}
1345
-
1346
- <!-- TransformControls for editing atoms in edit-atoms mode -->
1347
- {#if measure_mode === `edit-atoms` && selected_sites.length > 0 &&
1348
- structure?.sites}
1349
- {@const selected_atoms = selected_sites
1350
- .map((idx) => structure?.sites?.[idx])
1351
- .filter((site): site is Site => site != null)}
1352
- {#if selected_atoms.length > 0}
1353
- {@const avg = (dim: number) =>
1354
- selected_atoms.reduce((sum, atom) => sum + atom.xyz[dim], 0) /
1355
- selected_atoms.length}
1356
- {@const centroid = [avg(0), avg(1), avg(2)] as Vec3}
1357
- <!-- Invisible mesh at centroid for TransformControls to manipulate.
1358
- During drag, use frozen_centroid so Svelte doesn't override TransformControls
1359
- with the wrapped centroid (which jumps on PBC boundary crossings). -->
1360
- <T.Mesh
1361
- position={frozen_centroid ?? centroid}
1362
- bind:ref={transform_object}
1363
- >
1364
- <T.SphereGeometry args={[0.01, 4, 4]} />
1365
- <T.MeshBasicMaterial transparent opacity={0} />
1366
- </T.Mesh>
1367
- <extras.TransformControls
1368
- object={transform_object}
1369
- translationSnap={0.1}
1370
- size={1.2}
1371
- space="world"
1372
- onobjectChange={() => {
1373
- if (!transform_object?.position || !drag_start_centroid) return
1374
- const { x: tx, y: ty, z: tz } = transform_object.position
1375
- const delta: Vec3 = [
1376
- tx - drag_start_centroid[0],
1377
- ty - drag_start_centroid[1],
1378
- tz - drag_start_centroid[2],
1379
- ]
1380
- // Update reference point so deltas are incremental, not cumulative.
1381
- // Without this, each frame compounds: sites already moved by previous
1382
- // delta get the full cumulative delta re-applied.
1383
- drag_start_centroid = [tx, ty, tz]
1384
- on_sites_moved?.(selected_sites, delta)
1385
- }}
1386
- onmouseDown={() => {
1387
- dragging_atoms = true
1388
- drag_start_centroid = frozen_centroid = [...centroid] as Vec3
1389
- on_operation_start?.()
1390
- }}
1391
- onmouseUp={() => {
1392
- dragging_atoms = false
1393
- frozen_centroid = null
1394
- drag_start_centroid = null
1395
- }}
1396
- />
1397
- {/if}
1398
- {/if}
1399
-
1400
- <!-- Invisible plane for click-to-place atom in add-atom mode -->
1401
- <!-- Uses onBeforeRender to orient normal toward camera so raycasts always hit -->
1402
- {#if measure_mode === `edit-atoms` && add_atom_mode}
1403
- {@const center = rotation_target ?? [0, 0, 0]}
1404
- <T.Mesh
1405
- position={center}
1406
- onBeforeRender={(mesh: Mesh) => {
1407
- if (camera) {
1408
- mesh.lookAt(camera.position)
1409
- }
1410
- }}
1411
- onclick={(event: { point: { x: number; y: number; z: number } }) => {
1412
- const { x, y, z } = event.point
1413
- on_add_atom?.([x, y, z] as Vec3, add_element as ElementSymbol)
1414
- }}
1415
- >
1416
- <T.PlaneGeometry
1417
- args={[
1418
- Math.max(200, structure_size * 4),
1419
- Math.max(200, structure_size * 4),
1420
- ]}
1421
- />
1422
- <T.MeshBasicMaterial transparent opacity={0} side={2} depthWrite={false} />
1423
- </T.Mesh>
1424
- {/if}
1425
-
1426
- <!-- Isosurface rendering from volumetric data (CHGCAR, .cube files) -->
1427
- {#if volumetric_data && isosurface_settings}
1428
- <Isosurface volume={volumetric_data} settings={isosurface_settings} />
1429
- {/if}
1430
-
1431
- <!-- Measurement overlays for measured sites -->
1432
- {#if structure?.sites && (measured_sites?.length ?? 0) > 0}
1433
- {#if measure_mode === `distance`}
1434
- {#each measured_sites as idx_i, loop_idx (idx_i)}
1435
- {#each measured_sites.slice(loop_idx + 1) as idx_j (idx_i + `-` + idx_j)}
1436
- {@const site_i = structure.sites[idx_i]}
1437
- {@const site_j = structure.sites[idx_j]}
1438
- {@const pos_i = site_i.xyz}
1439
- {@const pos_j = site_j.xyz}
1440
- <Cylinder
1441
- from={pos_i}
1442
- to={pos_j}
1443
- thickness={0.12}
1444
- color={measure_line_color}
1445
- />
1446
- {@const midpoint = [
1447
- (pos_i[0] + pos_j[0]) / 2,
1448
- (pos_i[1] + pos_j[1]) / 2,
1449
- (pos_i[2] + pos_j[2]) / 2,
1450
- ] as Vec3}
1451
- {@const direct = math.euclidean_dist(pos_i, pos_j)}
1452
- {@const pbc = lattice
1453
- ? measure.distance_pbc(pos_i, pos_j, lattice.matrix)
1454
- : direct}
1455
- {@const differ = lattice ? Math.abs(pbc - direct) > 1e-6 : false}
1456
- <extras.HTML center position={midpoint}>
1457
- <span class="measure-label">
1458
- {#if differ}
1459
- PBC: {format_num(pbc, float_fmt)} Å<br /><small>
1460
- Direct: {format_num(direct, float_fmt)} Å</small>
1461
- {:else}
1462
- {format_num(pbc, float_fmt)} Å
1463
- {/if}
1464
- </span>
1465
- </extras.HTML>
1466
- {/each}
1467
- {/each}
1468
- {:else if measure_mode === `angle` && measured_sites.length >= 3}
1469
- {#each measured_sites as idx_center (idx_center)}
1470
- {@const center = structure.sites[idx_center]}
1471
- {#each measured_sites.filter((idx) => idx !== idx_center) as
1472
- idx_a,
1473
- loop_idx
1474
- (idx_center + `-` + idx_a)
1475
- }
1476
- {#each measured_sites.filter((idx) => idx !== idx_center).slice(loop_idx + 1) as
1477
- idx_b
1478
- (idx_center + `-` + idx_a + `-` + idx_b)
1479
- }
1480
- {@const site_a = structure.sites[idx_a]}
1481
- {@const site_b = structure.sites[idx_b]}
1482
- {@const v1 = measure.displacement_pbc(center.xyz, site_a.xyz, lattice?.matrix)}
1483
- {@const v2 = measure.displacement_pbc(center.xyz, site_b.xyz, lattice?.matrix)}
1484
- {@const n1 = Math.hypot(v1[0], v1[1], v1[2])}
1485
- {@const n2 = Math.hypot(v2[0], v2[1], v2[2])}
1486
- {@const angle_deg = measure.angle_between_vectors(v1, v2, `degrees`)}
1487
- {#if n1 > math.EPS && n2 > math.EPS}
1488
- <!-- draw rays from center to the two sites -->
1489
- <Cylinder
1490
- from={center.xyz}
1491
- to={site_a.xyz}
1492
- thickness={0.05}
1493
- color={measure_line_color}
1494
- />
1495
- <Cylinder
1496
- from={center.xyz}
1497
- to={site_b.xyz}
1498
- thickness={0.05}
1499
- color={measure_line_color}
1500
- />
1501
- {@const bisector = math.add(math.scale(v1, 1 / n1), math.scale(v2, 1 / n2))}
1502
- {@const bis_norm = Math.hypot(...bisector) || 1}
1503
- {@const offset_dir = math.scale(bisector, 1 / bis_norm)}
1504
- {@const label_pos = math.add(center.xyz, math.scale(offset_dir, 0.6))}
1505
- <extras.HTML center position={label_pos}>
1506
- <span class="measure-label">{format_num(angle_deg, float_fmt)}°</span>
1507
- </extras.HTML>
1508
- {/if}
1509
- {/each}
1510
- {/each}
1511
- {/each}
1512
- {/if}
1513
- {/if}
1514
- </T.Group>
1515
- </T.Group>
1516
- </T.Group>
1517
-
1518
- <style>
1519
- :global(.structure .responsive-gizmo) {
1520
- width: clamp(70px, 18cqmin, 100px) !important;
1521
- height: clamp(70px, 18cqmin, 100px) !important;
1522
- }
1523
- .atom-label {
1524
- background: var(--struct-atom-label-bg, rgba(0, 0, 0, 0.1));
1525
- border-radius: var(--struct-atom-label-border-radius, var(--border-radius, 3pt));
1526
- padding: var(--struct-atom-label-padding, 0 3px);
1527
- white-space: nowrap;
1528
- }
1529
- .elements {
1530
- margin-bottom: var(--canvas-tooltip-elements-margin);
1531
- }
1532
- .occupancy {
1533
- font-size: var(--canvas-tooltip-occu-font-size);
1534
- opacity: var(--canvas-tooltip-occu-opacity);
1535
- margin-right: var(--canvas-tooltip-occu-margin);
1536
- }
1537
- .elem-name {
1538
- font-size: var(--canvas-tooltip-elem-name-font-size, 0.85em);
1539
- opacity: var(--canvas-tooltip-elem-name-opacity, 0.7);
1540
- margin: var(--canvas-tooltip-elem-name-margin, 0 0 0 0.3em);
1541
- font-weight: var(--canvas-tooltip-elem-name-font-weight, normal);
1542
- }
1543
- .coordinates {
1544
- font-size: var(--canvas-tooltip-coords-font-size);
1545
- margin: var(--canvas-tooltip-coords-margin);
1546
- }
1547
- .measure-label {
1548
- background: var(--measure-label-bg, var(--surface-bg));
1549
- color: var(--measure-label-color, var(--text-color));
1550
- border-radius: var(--border-radius, 3pt);
1551
- padding: 0 5px;
1552
- user-select: none;
1553
- white-space: pre;
1554
- display: grid;
1555
- place-items: center;
1556
- line-height: 1.2;
1557
- font-size: var(--canvas-tooltip-font-size, clamp(8pt, 2cqmin, 18pt));
1558
- box-shadow: var(--measure-label-shadow, 0 1px 6px rgba(0, 0, 0, 0.2));
1559
- }
1560
- .selection-label {
1561
- display: inline-flex;
1562
- align-items: center;
1563
- justify-content: center;
1564
- min-width: 1.2em;
1565
- height: 1.2em;
1566
- padding: 0 0.25em;
1567
- border-radius: 999px;
1568
- background: var(--pane-btn-bg-hover);
1569
- color: var(--struct-text-color);
1570
- font-size: 0.85em;
1571
- line-height: 1;
1572
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
1573
- }
1574
- </style>