matterviz 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (527) hide show
  1. package/dist/EmptyState.svelte +10 -4
  2. package/dist/FilePicker.svelte +12 -14
  3. package/dist/Icon.svelte +7 -4
  4. package/dist/MillerIndexInput.svelte +2 -2
  5. package/dist/app.css +53 -0
  6. package/dist/brillouin/BrillouinZone.svelte +132 -219
  7. package/dist/brillouin/BrillouinZone.svelte.d.ts +9 -20
  8. package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
  9. package/dist/brillouin/BrillouinZoneExportPane.svelte +47 -96
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  11. package/dist/brillouin/BrillouinZoneInfoPane.svelte +15 -42
  12. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +2 -3
  13. package/dist/brillouin/BrillouinZoneScene.svelte +63 -230
  14. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +3 -23
  15. package/dist/brillouin/ReciprocalVectors.svelte +39 -0
  16. package/dist/brillouin/ReciprocalVectors.svelte.d.ts +9 -0
  17. package/dist/brillouin/compute.d.ts +2 -0
  18. package/dist/brillouin/compute.js +80 -77
  19. package/dist/brillouin/geometry.d.ts +8 -0
  20. package/dist/brillouin/geometry.js +57 -0
  21. package/dist/brillouin/index.d.ts +2 -0
  22. package/dist/brillouin/index.js +2 -0
  23. package/dist/brillouin/types.d.ts +2 -2
  24. package/dist/chempot-diagram/ChemPotDiagram.svelte +33 -38
  25. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +1 -1
  26. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +143 -246
  27. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +4 -1
  28. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +652 -976
  29. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +7 -1
  30. package/dist/chempot-diagram/async-compute.svelte.js +1 -1
  31. package/dist/chempot-diagram/color.d.ts +3 -6
  32. package/dist/chempot-diagram/color.js +5 -5
  33. package/dist/chempot-diagram/compute.d.ts +3 -3
  34. package/dist/chempot-diagram/compute.js +3 -1
  35. package/dist/chempot-diagram/controls-state.svelte.d.ts +10 -0
  36. package/dist/chempot-diagram/controls-state.svelte.js +42 -0
  37. package/dist/chempot-diagram/export.d.ts +47 -0
  38. package/dist/chempot-diagram/export.js +133 -0
  39. package/dist/chempot-diagram/index.d.ts +1 -0
  40. package/dist/chempot-diagram/index.js +1 -0
  41. package/dist/chempot-diagram/pointer.d.ts +0 -10
  42. package/dist/chempot-diagram/pointer.js +4 -4
  43. package/dist/chempot-diagram/types.d.ts +3 -3
  44. package/dist/colors/index.d.ts +0 -4
  45. package/dist/colors/index.js +21 -22
  46. package/dist/composition/BarChart.svelte +37 -31
  47. package/dist/composition/BubbleChart.svelte +17 -17
  48. package/dist/composition/Composition.svelte +7 -11
  49. package/dist/composition/Formula.svelte +18 -25
  50. package/dist/composition/FormulaFilter.svelte +96 -98
  51. package/dist/composition/PieChart.svelte +60 -46
  52. package/dist/composition/chem-sys.js +3 -2
  53. package/dist/composition/format.js +4 -3
  54. package/dist/composition/index.d.ts +2 -0
  55. package/dist/composition/index.js +14 -0
  56. package/dist/composition/parse.d.ts +2 -3
  57. package/dist/composition/parse.js +27 -28
  58. package/dist/constants.js +11 -9
  59. package/dist/controls.d.ts +1 -0
  60. package/dist/controls.js +0 -1
  61. package/dist/convex-hull/ConvexHull.svelte +20 -25
  62. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -4
  63. package/dist/convex-hull/ConvexHull2D.svelte +176 -256
  64. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  65. package/dist/convex-hull/ConvexHull3D.svelte +269 -804
  66. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  67. package/dist/convex-hull/ConvexHull4D.svelte +236 -755
  68. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  69. package/dist/convex-hull/ConvexHullChrome.svelte +264 -0
  70. package/dist/convex-hull/ConvexHullChrome.svelte.d.ts +30 -0
  71. package/dist/convex-hull/ConvexHullControls.svelte +128 -49
  72. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +7 -6
  73. package/dist/convex-hull/ConvexHullInfoPane.svelte +18 -5
  74. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +6 -5
  75. package/dist/convex-hull/ConvexHullStats.svelte +210 -351
  76. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +3 -1
  77. package/dist/convex-hull/ConvexHullTooltip.svelte +16 -14
  78. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +2 -1
  79. package/dist/convex-hull/GasPressureControls.svelte +5 -12
  80. package/dist/convex-hull/StructurePopup.svelte +17 -21
  81. package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
  82. package/dist/convex-hull/TemperatureSlider.svelte +4 -10
  83. package/dist/convex-hull/barycentric-coords.d.ts +2 -4
  84. package/dist/convex-hull/barycentric-coords.js +6 -33
  85. package/dist/convex-hull/canvas-interactions.svelte.d.ts +79 -0
  86. package/dist/convex-hull/canvas-interactions.svelte.js +279 -0
  87. package/dist/convex-hull/helpers.d.ts +47 -17
  88. package/dist/convex-hull/helpers.js +186 -101
  89. package/dist/convex-hull/hull-state.svelte.d.ts +44 -0
  90. package/dist/convex-hull/hull-state.svelte.js +124 -0
  91. package/dist/convex-hull/index.d.ts +9 -7
  92. package/dist/convex-hull/index.js +7 -2
  93. package/dist/convex-hull/thermodynamics.js +109 -937
  94. package/dist/convex-hull/types.d.ts +12 -4
  95. package/dist/convex-hull/types.js +12 -0
  96. package/dist/coordination/CoordinationBarPlot.svelte +41 -43
  97. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  98. package/dist/coordination/calc-coordination.d.ts +1 -1
  99. package/dist/coordination/calc-coordination.js +28 -25
  100. package/dist/element/BohrAtom.svelte +6 -8
  101. package/dist/element/ElementHeading.svelte +4 -1
  102. package/dist/element/ElementPhoto.svelte +11 -9
  103. package/dist/element/ElementStats.svelte +12 -10
  104. package/dist/element/ElementTile.svelte +24 -29
  105. package/dist/element/ElementTile.svelte.d.ts +1 -1
  106. package/dist/element/Nucleus.svelte +4 -2
  107. package/dist/element/data.d.ts +1 -2
  108. package/dist/element/helpers.d.ts +4 -0
  109. package/dist/element/helpers.js +18 -0
  110. package/dist/element/index.d.ts +1 -0
  111. package/dist/element/index.js +3 -0
  112. package/dist/feedback/DragOverlay.svelte +5 -3
  113. package/dist/feedback/DragOverlay.svelte.d.ts +2 -1
  114. package/dist/feedback/StatusMessage.svelte +20 -7
  115. package/dist/fermi-surface/FermiSlice.svelte +21 -18
  116. package/dist/fermi-surface/FermiSurface.svelte +78 -165
  117. package/dist/fermi-surface/FermiSurface.svelte.d.ts +9 -20
  118. package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
  119. package/dist/fermi-surface/FermiSurfaceScene.svelte +93 -272
  120. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +3 -23
  121. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
  122. package/dist/fermi-surface/compute.js +14 -13
  123. package/dist/fermi-surface/export.js +4 -15
  124. package/dist/fermi-surface/index.d.ts +0 -1
  125. package/dist/fermi-surface/index.js +0 -1
  126. package/dist/fermi-surface/parse.d.ts +1 -1
  127. package/dist/fermi-surface/parse.js +84 -97
  128. package/dist/fermi-surface/types.d.ts +2 -2
  129. package/dist/heatmap-matrix/HeatmapMatrix.svelte +161 -185
  130. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +6 -5
  131. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +12 -9
  132. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +5 -5
  133. package/dist/heatmap-matrix/index.d.ts +8 -2
  134. package/dist/icons.d.ts +4 -0
  135. package/dist/icons.js +4 -0
  136. package/dist/index.d.ts +1 -0
  137. package/dist/index.js +1 -0
  138. package/dist/io/ExportPane.svelte +170 -0
  139. package/dist/io/ExportPane.svelte.d.ts +17 -0
  140. package/dist/io/decompress.d.ts +2 -1
  141. package/dist/io/decompress.js +22 -36
  142. package/dist/io/export.d.ts +9 -1
  143. package/dist/io/export.js +37 -29
  144. package/dist/io/fetch.d.ts +2 -4
  145. package/dist/io/fetch.js +0 -11
  146. package/dist/io/file-drop.d.ts +7 -0
  147. package/dist/io/file-drop.js +13 -0
  148. package/dist/io/index.d.ts +1 -0
  149. package/dist/io/index.js +3 -0
  150. package/dist/io/is-binary.d.ts +9 -0
  151. package/dist/io/is-binary.js +45 -1
  152. package/dist/io/types.d.ts +13 -0
  153. package/dist/io/url-drop.js +13 -25
  154. package/dist/isosurface/Isosurface.svelte +17 -23
  155. package/dist/isosurface/IsosurfaceControls.svelte +37 -42
  156. package/dist/isosurface/parse-vaspwave.d.ts +3 -0
  157. package/dist/isosurface/parse-vaspwave.js +138 -0
  158. package/dist/isosurface/parse.js +50 -48
  159. package/dist/labels.d.ts +6 -2
  160. package/dist/labels.js +44 -14
  161. package/dist/layout/FullscreenButton.svelte +34 -0
  162. package/dist/layout/FullscreenButton.svelte.d.ts +10 -0
  163. package/dist/layout/FullscreenToggle.svelte +12 -12
  164. package/dist/layout/InfoCard.svelte +7 -18
  165. package/dist/layout/InfoTag.svelte +1 -3
  166. package/dist/layout/NumberRangeInput.svelte +46 -0
  167. package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
  168. package/dist/layout/PropertyFilter.svelte +2 -6
  169. package/dist/layout/SettingsSection.svelte +21 -17
  170. package/dist/layout/SubpageGrid.svelte +3 -1
  171. package/dist/layout/ViewerChrome.svelte +115 -0
  172. package/dist/layout/ViewerChrome.svelte.d.ts +18 -0
  173. package/dist/layout/fullscreen.d.ts +4 -0
  174. package/dist/layout/fullscreen.js +3 -5
  175. package/dist/layout/fullscreen.svelte.d.ts +8 -0
  176. package/dist/layout/fullscreen.svelte.js +36 -0
  177. package/dist/layout/index.d.ts +4 -0
  178. package/dist/layout/index.js +4 -0
  179. package/dist/layout/json-tree/JsonNode.svelte +8 -11
  180. package/dist/layout/json-tree/JsonTree.svelte +53 -77
  181. package/dist/layout/json-tree/JsonValue.svelte +7 -15
  182. package/dist/layout/json-tree/utils.js +14 -23
  183. package/dist/math.d.ts +9 -3
  184. package/dist/math.js +37 -21
  185. package/dist/overlays/ContextMenu.svelte +4 -2
  186. package/dist/overlays/CopyButton.svelte +11 -5
  187. package/dist/overlays/DragControlTab.svelte +6 -1
  188. package/dist/overlays/DraggablePane.svelte +81 -26
  189. package/dist/overlays/DraggablePane.svelte.d.ts +1 -0
  190. package/dist/overlays/GlassChip.svelte +30 -0
  191. package/dist/overlays/GlassChip.svelte.d.ts +8 -0
  192. package/dist/overlays/InfoPaneCards.svelte +11 -23
  193. package/dist/overlays/index.d.ts +11 -0
  194. package/dist/overlays/index.js +26 -0
  195. package/dist/overlays/portal.d.ts +2 -0
  196. package/dist/overlays/portal.js +14 -0
  197. package/dist/periodic-table/PeriodicTable.svelte +115 -146
  198. package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
  199. package/dist/periodic-table/PeriodicTableControls.svelte +11 -63
  200. package/dist/periodic-table/TableInset.svelte +9 -4
  201. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +50 -71
  202. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
  203. package/dist/phase-diagram/PhaseDiagramControls.svelte +73 -96
  204. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +4 -3
  205. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +4 -2
  206. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +2 -3
  207. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +49 -134
  208. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +3 -4
  209. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
  210. package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
  211. package/dist/phase-diagram/build-diagram.js +3 -3
  212. package/dist/phase-diagram/colors.js +1 -1
  213. package/dist/phase-diagram/diagram-input.d.ts +1 -2
  214. package/dist/phase-diagram/parse.d.ts +2 -1
  215. package/dist/phase-diagram/parse.js +15 -15
  216. package/dist/phase-diagram/svg-to-diagram.js +21 -15
  217. package/dist/phase-diagram/utils.js +2 -3
  218. package/dist/plot/bar/BarPlot.svelte +494 -692
  219. package/dist/plot/bar/BarPlot.svelte.d.ts +9 -15
  220. package/dist/plot/bar/BarPlotControls.svelte +1 -3
  221. package/dist/plot/bar/BarPlotControls.svelte.d.ts +5 -7
  222. package/dist/plot/bar/SpacegroupBarPlot.svelte +31 -37
  223. package/dist/plot/bar/data.d.ts +5 -4
  224. package/dist/plot/bar/data.js +2 -1
  225. package/dist/plot/box/BoxPlot.svelte +361 -439
  226. package/dist/plot/box/BoxPlot.svelte.d.ts +6 -3
  227. package/dist/plot/box/BoxPlotControls.svelte.d.ts +1 -1
  228. package/dist/plot/box/Violin.svelte.d.ts +2 -1
  229. package/dist/plot/box/box-plot.d.ts +3 -2
  230. package/dist/plot/box/box-plot.js +6 -3
  231. package/dist/plot/box/kde.d.ts +2 -1
  232. package/dist/plot/box/kde.js +4 -4
  233. package/dist/plot/core/auto-place.d.ts +1 -1
  234. package/dist/plot/core/auto-place.js +5 -2
  235. package/dist/plot/core/axis-utils.d.ts +12 -7
  236. package/dist/plot/core/axis-utils.js +48 -48
  237. package/dist/plot/core/components/AxisLabel.svelte +82 -20
  238. package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
  239. package/dist/plot/core/components/ColorBar.svelte +106 -111
  240. package/dist/plot/core/components/ColorBar.svelte.d.ts +5 -4
  241. package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
  242. package/dist/plot/core/components/FillArea.svelte +10 -17
  243. package/dist/plot/core/components/HierarchyControls.svelte +249 -0
  244. package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
  245. package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
  246. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
  247. package/dist/plot/core/components/Line.svelte +21 -11
  248. package/dist/plot/core/components/Line.svelte.d.ts +5 -2
  249. package/dist/plot/core/components/PlotAxis.svelte +42 -18
  250. package/dist/plot/core/components/PlotAxis.svelte.d.ts +2 -1
  251. package/dist/plot/core/components/PlotControls.svelte +65 -41
  252. package/dist/plot/core/components/PlotControls.svelte.d.ts +1 -1
  253. package/dist/plot/core/components/PlotLegend.svelte +31 -35
  254. package/dist/plot/core/components/PlotMarginals.svelte +616 -0
  255. package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
  256. package/dist/plot/core/components/PlotTooltip.svelte +1 -1
  257. package/dist/plot/core/components/PortalSelect.svelte +4 -8
  258. package/dist/plot/core/components/ReferenceLine.svelte +27 -24
  259. package/dist/plot/core/components/ReferenceLine3D.svelte +56 -59
  260. package/dist/plot/core/components/ReferenceLine3D.svelte.d.ts +4 -4
  261. package/dist/plot/core/components/ReferencePlane.svelte +9 -10
  262. package/dist/plot/core/components/ReferencePlane.svelte.d.ts +4 -4
  263. package/dist/plot/core/components/ZeroLines.svelte +4 -8
  264. package/dist/plot/core/components/ZoomRect.svelte +1 -2
  265. package/dist/plot/core/components/index.d.ts +1 -0
  266. package/dist/plot/core/components/index.js +1 -0
  267. package/dist/plot/core/data-cleaning-signal.d.ts +46 -0
  268. package/dist/plot/core/data-cleaning-signal.js +467 -0
  269. package/dist/plot/core/data-cleaning.d.ts +2 -42
  270. package/dist/plot/core/data-cleaning.js +29 -476
  271. package/dist/plot/core/data-transform.js +9 -5
  272. package/dist/plot/core/fill-utils.d.ts +7 -4
  273. package/dist/plot/core/fill-utils.js +34 -9
  274. package/dist/plot/core/index.d.ts +1 -0
  275. package/dist/plot/core/index.js +1 -0
  276. package/dist/plot/core/interactions.d.ts +5 -1
  277. package/dist/plot/core/interactions.js +14 -2
  278. package/dist/plot/core/layout.d.ts +3 -1
  279. package/dist/plot/core/layout.js +22 -13
  280. package/dist/plot/core/marginals.d.ts +170 -0
  281. package/dist/plot/core/marginals.js +436 -0
  282. package/dist/plot/core/pan-zoom.svelte.d.ts +35 -0
  283. package/dist/plot/core/pan-zoom.svelte.js +221 -0
  284. package/dist/plot/core/placed-tween.svelte.d.ts +21 -0
  285. package/dist/plot/core/placed-tween.svelte.js +68 -0
  286. package/dist/plot/core/reference-line.d.ts +10 -10
  287. package/dist/plot/core/reference-line.js +7 -7
  288. package/dist/plot/core/scales.d.ts +40 -25
  289. package/dist/plot/core/scales.js +49 -21
  290. package/dist/plot/core/svg.d.ts +2 -1
  291. package/dist/plot/core/types/fills.d.ts +101 -0
  292. package/dist/plot/core/types/fills.js +15 -0
  293. package/dist/plot/core/types/plot-3d.d.ts +87 -0
  294. package/dist/plot/core/types/plot-3d.js +4 -0
  295. package/dist/plot/core/types/reference-lines.d.ts +140 -0
  296. package/dist/plot/core/types/reference-lines.js +9 -0
  297. package/dist/plot/core/types.d.ts +47 -331
  298. package/dist/plot/core/types.js +23 -20
  299. package/dist/plot/core/utils/hierarchy-chart.d.ts +51 -0
  300. package/dist/plot/core/utils/hierarchy-chart.js +179 -0
  301. package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
  302. package/dist/plot/core/utils/hierarchy-labels.js +99 -0
  303. package/dist/plot/core/utils/label-placement.d.ts +1 -1
  304. package/dist/plot/core/utils/label-placement.js +5 -5
  305. package/dist/plot/core/utils.d.ts +2 -1
  306. package/dist/plot/histogram/Histogram.svelte +373 -631
  307. package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
  308. package/dist/plot/histogram/HistogramControls.svelte +30 -28
  309. package/dist/plot/histogram/HistogramControls.svelte.d.ts +1 -1
  310. package/dist/plot/histogram/histogram.d.ts +31 -0
  311. package/dist/plot/histogram/histogram.js +70 -0
  312. package/dist/plot/histogram/index.d.ts +1 -0
  313. package/dist/plot/histogram/index.js +1 -0
  314. package/dist/plot/index.d.ts +1 -0
  315. package/dist/plot/index.js +1 -0
  316. package/dist/plot/sankey/Sankey.svelte +79 -73
  317. package/dist/plot/sankey/Sankey.svelte.d.ts +3 -3
  318. package/dist/plot/sankey/SankeyControls.svelte +22 -16
  319. package/dist/plot/sankey/sankey.js +3 -1
  320. package/dist/plot/scatter/BinnedScatterPlot.svelte +264 -112
  321. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +11 -4
  322. package/dist/plot/scatter/ElementScatter.svelte +4 -1
  323. package/dist/plot/scatter/ScatterPlot.svelte +623 -821
  324. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +9 -15
  325. package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
  326. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  327. package/dist/plot/scatter/ScatterPoint.svelte +16 -9
  328. package/dist/plot/scatter/binned-scatter-types.d.ts +6 -12
  329. package/dist/plot/scatter/binned-scatter-types.js +6 -1
  330. package/dist/plot/scatter/index.d.ts +1 -1
  331. package/dist/plot/scatter/scatter-data.d.ts +1 -1
  332. package/dist/plot/scatter/scatter-data.js +8 -7
  333. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +40 -60
  334. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +6 -14
  335. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +17 -15
  336. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte.d.ts +5 -5
  337. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +232 -234
  338. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +5 -14
  339. package/dist/plot/scatter-3d/Surface3D.svelte +9 -17
  340. package/dist/plot/scatter-3d/Surface3D.svelte.d.ts +4 -3
  341. package/dist/plot/sunburst/Sunburst.svelte +256 -338
  342. package/dist/plot/sunburst/Sunburst.svelte.d.ts +4 -3
  343. package/dist/plot/sunburst/index.d.ts +1 -1
  344. package/dist/plot/sunburst/index.js +2 -1
  345. package/dist/plot/sunburst/render.d.ts +2 -2
  346. package/dist/plot/sunburst/render.js +47 -22
  347. package/dist/plot/sunburst/sunburst.d.ts +5 -1
  348. package/dist/plot/sunburst/sunburst.js +14 -4
  349. package/dist/plot/treemap/Treemap.svelte +907 -0
  350. package/dist/plot/treemap/Treemap.svelte.d.ts +84 -0
  351. package/dist/plot/treemap/index.d.ts +3 -0
  352. package/dist/plot/treemap/index.js +4 -0
  353. package/dist/plot/treemap/treemap.d.ts +26 -0
  354. package/dist/plot/treemap/treemap.js +99 -0
  355. package/dist/rdf/RdfPlot.svelte +22 -26
  356. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  357. package/dist/rdf/calc-rdf.js +4 -8
  358. package/dist/sanitize.js +14 -3
  359. package/dist/scene/SceneCamera.svelte +62 -0
  360. package/dist/scene/SceneCamera.svelte.d.ts +19 -0
  361. package/dist/scene/bind-renderer.svelte.d.ts +2 -0
  362. package/dist/scene/bind-renderer.svelte.js +22 -0
  363. package/dist/scene/index.d.ts +4 -0
  364. package/dist/scene/index.js +5 -0
  365. package/dist/scene/props.js +52 -0
  366. package/dist/scene/types.d.ts +26 -0
  367. package/dist/scene/types.js +1 -0
  368. package/dist/settings.d.ts +33 -11
  369. package/dist/settings.js +136 -51
  370. package/dist/spectral/Bands.svelte +231 -237
  371. package/dist/spectral/Bands.svelte.d.ts +3 -2
  372. package/dist/spectral/BandsAndDos.svelte +29 -29
  373. package/dist/spectral/BrillouinBandsDos.svelte +21 -29
  374. package/dist/spectral/Dos.svelte +75 -77
  375. package/dist/spectral/Dos.svelte.d.ts +2 -1
  376. package/dist/spectral/helpers.d.ts +9 -9
  377. package/dist/spectral/helpers.js +66 -70
  378. package/dist/state.svelte.d.ts +0 -7
  379. package/dist/state.svelte.js +5 -24
  380. package/dist/structure/Arrow.svelte +6 -21
  381. package/dist/structure/ArrowInstances.svelte +160 -0
  382. package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
  383. package/dist/structure/AtomLegend.svelte +115 -75
  384. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  385. package/dist/structure/Bond.svelte +31 -23
  386. package/dist/structure/CanvasTooltip.svelte +16 -3
  387. package/dist/structure/CellSelect.svelte +22 -29
  388. package/dist/structure/CellSelect.svelte.d.ts +2 -1
  389. package/dist/structure/Cylinder.svelte +24 -40
  390. package/dist/structure/InstancedAtoms.svelte +114 -0
  391. package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
  392. package/dist/structure/Lattice.svelte +85 -149
  393. package/dist/structure/SiteLabels.svelte +122 -0
  394. package/dist/structure/SiteLabels.svelte.d.ts +18 -0
  395. package/dist/structure/Structure.svelte +725 -735
  396. package/dist/structure/Structure.svelte.d.ts +8 -16
  397. package/dist/structure/StructureCarousel.svelte +630 -0
  398. package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
  399. package/dist/structure/StructureControls.svelte +298 -325
  400. package/dist/structure/StructureControls.svelte.d.ts +5 -3
  401. package/dist/structure/StructureExportPane.svelte +62 -168
  402. package/dist/structure/StructureExportPane.svelte.d.ts +4 -5
  403. package/dist/structure/StructureInfoPane.svelte +77 -69
  404. package/dist/structure/StructureInfoPane.svelte.d.ts +6 -6
  405. package/dist/structure/StructureScene.svelte +758 -600
  406. package/dist/structure/StructureScene.svelte.d.ts +24 -20
  407. package/dist/structure/StructureViewport.svelte +386 -0
  408. package/dist/structure/StructureViewport.svelte.d.ts +63 -0
  409. package/dist/structure/atom-label-placement.d.ts +18 -0
  410. package/dist/structure/atom-label-placement.js +115 -0
  411. package/dist/structure/atom-properties.d.ts +3 -1
  412. package/dist/structure/atom-properties.js +115 -54
  413. package/dist/structure/bond-order-perception.js +2 -4
  414. package/dist/structure/bonding.d.ts +12 -2
  415. package/dist/structure/bonding.js +172 -73
  416. package/dist/structure/edit-history.d.ts +6 -0
  417. package/dist/structure/edit-history.js +27 -0
  418. package/dist/structure/export.d.ts +25 -4
  419. package/dist/structure/export.js +103 -153
  420. package/dist/structure/format-detect.d.ts +1 -0
  421. package/dist/structure/format-detect.js +22 -0
  422. package/dist/structure/geometry.d.ts +9 -0
  423. package/dist/structure/geometry.js +27 -0
  424. package/dist/structure/index.d.ts +18 -1
  425. package/dist/structure/index.js +15 -2
  426. package/dist/structure/measure.d.ts +1 -1
  427. package/dist/structure/measure.js +6 -12
  428. package/dist/structure/parse.d.ts +5 -3
  429. package/dist/structure/parse.js +551 -567
  430. package/dist/structure/partial-occupancy.d.ts +0 -1
  431. package/dist/structure/partial-occupancy.js +5 -3
  432. package/dist/structure/pbc.d.ts +1 -1
  433. package/dist/structure/pbc.js +204 -51
  434. package/dist/structure/polyhedra.d.ts +40 -0
  435. package/dist/structure/polyhedra.js +587 -0
  436. package/dist/structure/site.d.ts +4 -0
  437. package/dist/structure/site.js +1 -0
  438. package/dist/structure/supercell.d.ts +1 -2
  439. package/dist/structure/supercell.js +10 -15
  440. package/dist/structure/validation.js +5 -6
  441. package/dist/symmetry/SymmetryElementControls.svelte +69 -0
  442. package/dist/symmetry/SymmetryElementControls.svelte.d.ts +9 -0
  443. package/dist/symmetry/SymmetryElements.svelte +350 -0
  444. package/dist/symmetry/SymmetryElements.svelte.d.ts +24 -0
  445. package/dist/symmetry/SymmetryStats.svelte +142 -49
  446. package/dist/symmetry/WyckoffTable.svelte +58 -16
  447. package/dist/symmetry/WyckoffTable.svelte.d.ts +3 -0
  448. package/dist/symmetry/cell-transform.js +8 -14
  449. package/dist/symmetry/index.d.ts +15 -4
  450. package/dist/symmetry/index.js +308 -81
  451. package/dist/symmetry/spacegroups.d.ts +5 -1
  452. package/dist/symmetry/spacegroups.js +18 -3
  453. package/dist/symmetry/symmetry-elements.d.ts +33 -0
  454. package/dist/symmetry/symmetry-elements.js +521 -0
  455. package/dist/symmetry/wyckoff-db.d.ts +9 -0
  456. package/dist/symmetry/wyckoff-db.js +87 -0
  457. package/dist/table/HeatmapTable.svelte +1104 -378
  458. package/dist/table/HeatmapTable.svelte.d.ts +12 -2
  459. package/dist/table/ToggleMenu.svelte +5 -12
  460. package/dist/table/index.d.ts +21 -6
  461. package/dist/table/index.js +34 -21
  462. package/dist/theme/ThemeControl.svelte +16 -8
  463. package/dist/theme/index.d.ts +1 -5
  464. package/dist/theme/index.js +4 -10
  465. package/dist/theme/themes.mjs +14 -7
  466. package/dist/tooltip/KCoords.svelte +4 -1
  467. package/dist/tooltip/TooltipContent.svelte +2 -5
  468. package/dist/trajectory/Trajectory.svelte +556 -352
  469. package/dist/trajectory/Trajectory.svelte.d.ts +10 -22
  470. package/dist/trajectory/TrajectoryError.svelte +11 -8
  471. package/dist/trajectory/TrajectoryExportPane.svelte +28 -54
  472. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +4 -5
  473. package/dist/trajectory/TrajectoryInfoPane.svelte +88 -99
  474. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +3 -2
  475. package/dist/trajectory/constants.js +6 -2
  476. package/dist/trajectory/extract.js +73 -71
  477. package/dist/trajectory/format-detect.d.ts +0 -1
  478. package/dist/trajectory/format-detect.js +13 -17
  479. package/dist/trajectory/frame-reader.d.ts +2 -1
  480. package/dist/trajectory/frame-reader.js +74 -136
  481. package/dist/trajectory/helpers.d.ts +12 -2
  482. package/dist/trajectory/helpers.js +68 -37
  483. package/dist/trajectory/index.d.ts +1 -0
  484. package/dist/trajectory/index.js +3 -0
  485. package/dist/trajectory/parse/ase.d.ts +9 -1
  486. package/dist/trajectory/parse/ase.js +47 -32
  487. package/dist/trajectory/parse/diagnostics.d.ts +3 -0
  488. package/dist/trajectory/parse/diagnostics.js +14 -0
  489. package/dist/trajectory/parse/h5-utils.d.ts +13 -0
  490. package/dist/trajectory/parse/h5-utils.js +109 -0
  491. package/dist/trajectory/parse/hdf5.d.ts +1 -1
  492. package/dist/trajectory/parse/hdf5.js +116 -106
  493. package/dist/trajectory/parse/index.d.ts +3 -4
  494. package/dist/trajectory/parse/index.js +68 -119
  495. package/dist/trajectory/parse/lammps.d.ts +0 -2
  496. package/dist/trajectory/parse/lammps.js +14 -16
  497. package/dist/trajectory/parse/pymatgen.d.ts +2 -0
  498. package/dist/trajectory/parse/pymatgen.js +74 -0
  499. package/dist/trajectory/parse/vasp.js +13 -9
  500. package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
  501. package/dist/trajectory/parse/vaspout-electronic.js +207 -0
  502. package/dist/trajectory/parse/vaspout-h5.d.ts +5 -0
  503. package/dist/trajectory/parse/vaspout-h5.js +284 -0
  504. package/dist/trajectory/parse/xyz.d.ts +9 -21
  505. package/dist/trajectory/parse/xyz.js +38 -39
  506. package/dist/trajectory/plotting.d.ts +8 -10
  507. package/dist/trajectory/plotting.js +102 -127
  508. package/dist/utils.d.ts +4 -0
  509. package/dist/utils.js +8 -1
  510. package/dist/xrd/XrdPlot.svelte +56 -85
  511. package/dist/xrd/broadening.d.ts +2 -1
  512. package/dist/xrd/broadening.js +2 -1
  513. package/dist/xrd/calc-xrd.js +8 -15
  514. package/dist/xrd/index.d.ts +2 -2
  515. package/dist/xrd/parse.d.ts +0 -1
  516. package/dist/xrd/parse.js +56 -73
  517. package/package.json +77 -36
  518. package/dist/api/mp.d.ts +0 -6
  519. package/dist/api/mp.js +0 -22
  520. package/dist/element/data.json +0 -11864
  521. package/dist/fermi-surface/marching-cubes.d.ts +0 -2
  522. package/dist/fermi-surface/marching-cubes.js +0 -2
  523. package/dist/plot/core/hover-lock.svelte.d.ts +0 -14
  524. package/dist/plot/core/hover-lock.svelte.js +0 -45
  525. package/dist/plot/sunburst/SunburstControls.svelte +0 -200
  526. package/dist/structure/label-placement.d.ts +0 -14
  527. package/dist/structure/label-placement.js +0 -72
@@ -1,17 +1,25 @@
1
1
  <script lang="ts">
2
2
  import type { BrillouinZoneData } from '../brillouin'
3
- import { AXIS_COLORS, NEG_AXIS_COLORS } from '../colors'
4
- import type { Matrix4Tuple, Vec3 } from '../math'
3
+ import {
4
+ cartesian_to_fractional,
5
+ default_camera_position,
6
+ k_lattice_inverse,
7
+ k_space_size,
8
+ polyhedron_centroid,
9
+ polyhedron_geometry,
10
+ ReciprocalVectors,
11
+ } from '../brillouin'
12
+ import type { D3InterpolateName } from '../colors'
13
+ import { get_d3_interpolator } from '../colors'
14
+ import type { Matrix4Tuple, Vec2, Vec3 } from '../math'
5
15
  import * as math from '../math'
6
- import type { CameraProjection } from '../settings'
16
+ import { bind_renderer, build_orbit_props, SceneCamera } from '../scene'
17
+ import type { SceneControlProps, ThreltePointerEvent } from '../scene'
7
18
  import { DEFAULTS } from '../settings'
8
- import { Arrow, Cylinder } from '../structure'
9
- import { T, useThrelte } from '@threlte/core'
19
+ import { Cylinder } from '../structure'
20
+ import { T } from '@threlte/core'
10
21
  import * as extras from '@threlte/extras'
11
- import * as d3_sc from 'd3-scale-chromatic'
12
- import type { ComponentProps } from 'svelte'
13
22
  import { SvelteMap } from 'svelte/reactivity'
14
- import type { Camera, Scene } from 'three'
15
23
  import {
16
24
  BackSide,
17
25
  BufferAttribute,
@@ -33,9 +41,6 @@
33
41
  RepresentationMode,
34
42
  } from './types'
35
43
 
36
- // Threlte pointer event type for mesh interactions
37
- type ThreltePointerEvent = { point: Vector3; nativeEvent: PointerEvent }
38
-
39
44
  let {
40
45
  fermi_data = $bindable(),
41
46
  bz_data = $bindable(),
@@ -52,7 +57,7 @@
52
57
  bz_color = `#888888`,
53
58
  bz_opacity = 0.1,
54
59
  bz_edge_color = `#333333`,
55
- bz_edge_width = 0.02,
60
+ bz_edge_width = 0.002,
56
61
  show_vectors = true,
57
62
  tile_bz = false,
58
63
  // Clipping plane
@@ -75,15 +80,13 @@
75
80
  directional_light = DEFAULTS.structure.directional_light,
76
81
  gizmo = DEFAULTS.structure.show_gizmo,
77
82
  auto_rotate = DEFAULTS.structure.auto_rotate,
78
- camera_is_moving = $bindable(false),
79
83
  scene = $bindable(),
80
84
  camera = $bindable(),
81
85
  hover_data = $bindable<FermiHoverData | null>(null),
82
- }: {
86
+ }: SceneControlProps & {
83
87
  fermi_data?: FermiSurfaceData
84
88
  bz_data?: BrillouinZoneData
85
89
  camera_position?: Vec3 | undefined
86
- camera_projection?: CameraProjection
87
90
  color_property?: ColorProperty
88
91
  color_scale?: string
89
92
  representation?: RepresentationMode
@@ -101,33 +104,20 @@
101
104
  clip_position?: number
102
105
  clip_flip?: boolean
103
106
  vector_scale?: number
104
- rotation_damping?: number
105
- max_zoom?: number
106
- min_zoom?: number
107
- rotate_speed?: number
108
- zoom_speed?: number
109
- pan_speed?: number
110
- zoom_to_cursor?: boolean
111
- fov?: number
112
- initial_zoom?: number
113
- ambient_light?: number
114
- directional_light?: number
115
- gizmo?: boolean | ComponentProps<typeof extras.Gizmo>
116
- auto_rotate?: number
117
- camera_is_moving?: boolean
118
- scene?: Scene
119
- camera?: Camera
120
107
  hover_data?: FermiHoverData | null
121
108
  } = $props()
122
109
 
123
- const threlte = useThrelte()
110
+ const threlte = bind_renderer(
111
+ (threlte_scene, threlte_camera) => {
112
+ scene = threlte_scene
113
+ camera = threlte_camera
114
+ },
115
+ // Enable object sorting for proper depth ordering of transparent surfaces
116
+ (renderer) => (renderer.sortObjects = true),
117
+ )
124
118
 
125
- // Compute scene size for clipping (also used for camera positioning later)
126
- function get_scene_size(): number {
127
- if (!fermi_data?.k_lattice) return 10
128
- const mags = fermi_data.k_lattice.map((vec) => Math.hypot(...vec))
129
- return mags.reduce((sum, mag) => sum + mag, 0) / 3
130
- }
119
+ // Characteristic scene size, used for clipping and camera positioning
120
+ const scene_size = $derived(k_space_size(fermi_data?.k_lattice))
131
121
 
132
122
  // Compute clipping plane based on axis and position
133
123
  // Plane equation: dot(normal, point) + constant >= 0 means point is visible
@@ -138,7 +128,7 @@
138
128
  const normal_arr: Vec3 = [0, 0, 0]
139
129
  normal_arr[axis_idx] = clip_flip ? -1 : 1
140
130
 
141
- const scaled_position = clip_position * get_scene_size()
131
+ const scaled_position = clip_position * scene_size
142
132
  // constant = -position for normal case (keep points >= position)
143
133
  // constant = +position for flipped case (keep points <= position)
144
134
  const constant = clip_flip ? scaled_position : -scaled_position
@@ -159,28 +149,12 @@
159
149
  }
160
150
  })
161
151
 
162
- $effect(() => {
163
- scene = threlte.scene
164
- camera = threlte.camera.current
165
- if (threlte.renderer) {
166
- // Enable object sorting for proper depth ordering of transparent surfaces
167
- threlte.renderer.sortObjects = true
168
- Object.assign(threlte.renderer.domElement, { __renderer: threlte.renderer })
169
- }
170
- })
171
-
172
152
  extras.interactivity()
173
153
 
174
- // Get color interpolator from d3
175
- const get_interpolator = (name: string): (t: number) => string => {
176
- const fn = d3_sc[name as keyof typeof d3_sc]
177
- return typeof fn === `function` ? fn : d3_sc.interpolateViridis
178
- }
179
-
180
154
  // Filter surfaces based on selected bands
181
155
  let visible_surfaces = $derived(
182
- fermi_data?.isosurfaces.filter((surface) =>
183
- selected_bands === undefined || selected_bands.includes(surface.band_index)
156
+ fermi_data?.isosurfaces.filter(
157
+ (surface) => selected_bands === undefined || selected_bands.includes(surface.band_index),
184
158
  ) ?? [],
185
159
  )
186
160
 
@@ -216,7 +190,7 @@
216
190
  })
217
191
 
218
192
  // Compute property range for color scaling
219
- let property_range = $derived.by((): [number, number] => {
193
+ let property_range = $derived.by((): Vec2 => {
220
194
  if (color_property !== `velocity` && color_property !== `custom`) {
221
195
  return [0, 1]
222
196
  }
@@ -234,9 +208,6 @@
234
208
 
235
209
  // Get color for a surface/vertex
236
210
  function get_surface_color(surface: Isosurface, vertex_idx?: number): string {
237
- if (color_property === `band`) {
238
- return constants.BAND_COLORS[surface.band_index % constants.BAND_COLORS.length]
239
- }
240
211
  if (
241
212
  (color_property === `velocity` || color_property === `custom`) &&
242
213
  surface.properties &&
@@ -244,10 +215,8 @@
244
215
  ) {
245
216
  const prop = surface.properties[vertex_idx]
246
217
  const [min_val, max_val] = property_range
247
- const normalized = max_val > min_val
248
- ? (prop - min_val) / (max_val - min_val)
249
- : 0.5
250
- return get_interpolator(color_scale)(normalized)
218
+ const normalized = max_val > min_val ? (prop - min_val) / (max_val - min_val) : 0.5
219
+ return get_d3_interpolator(color_scale as D3InterpolateName)(normalized)
251
220
  }
252
221
  // Spin coloring
253
222
  if (color_property === `spin` && surface.spin) {
@@ -266,8 +235,7 @@
266
235
  const normals: number[] = []
267
236
  const colors: number[] = []
268
237
 
269
- const use_vertex_colors = color_property === `velocity` ||
270
- color_property === `custom`
238
+ const use_vertex_colors = color_property === `velocity` || color_property === `custom`
271
239
 
272
240
  const n_vertices = surface.vertices.length
273
241
 
@@ -283,9 +251,12 @@
283
251
 
284
252
  // Validate face indices are within bounds (protects against malformed JSON files)
285
253
  if (
286
- idx0 < 0 || idx0 >= n_vertices ||
287
- idx1 < 0 || idx1 >= n_vertices ||
288
- idx2 < 0 || idx2 >= n_vertices
254
+ idx0 < 0 ||
255
+ idx0 >= n_vertices ||
256
+ idx1 < 0 ||
257
+ idx1 >= n_vertices ||
258
+ idx2 < 0 ||
259
+ idx2 >= n_vertices
289
260
  ) {
290
261
  continue
291
262
  }
@@ -323,10 +294,7 @@
323
294
  }
324
295
 
325
296
  const geometry = new BufferGeometry()
326
- geometry.setAttribute(
327
- `position`,
328
- new BufferAttribute(new Float32Array(positions), 3),
329
- )
297
+ geometry.setAttribute(`position`, new BufferAttribute(new Float32Array(positions), 3))
330
298
  geometry.setAttribute(`normal`, new BufferAttribute(new Float32Array(normals), 3))
331
299
 
332
300
  if (use_vertex_colors) {
@@ -377,108 +345,32 @@
377
345
  }
378
346
  })
379
347
 
380
- // Compute rotation target from surfaces or BZ
381
- const rotation_target = $derived.by((): Vec3 => {
382
- if (bz_data?.vertices && bz_data.vertices.length > 0) {
383
- const sum = bz_data.vertices.reduce(
384
- (acc, vert) => math.add(acc, vert),
385
- [0, 0, 0] as Vec3,
386
- )
387
- return math.scale(sum, 1 / bz_data.vertices.length)
388
- }
389
- return [0, 0, 0]
390
- })
391
-
392
- // Scene size for camera positioning (uses helper function defined earlier)
393
- const scene_size = $derived(get_scene_size())
348
+ // BZ centroid as rotation center
349
+ const rotation_target = $derived(polyhedron_centroid(bz_data?.vertices))
394
350
 
395
- const computed_camera_position = $derived.by(
396
- () =>
397
- camera_position || ([10, 3, 8].map((coord) =>
398
- coord * Math.max(1, scene_size)
399
- ) as Vec3),
351
+ const computed_camera_position = $derived(
352
+ camera_position || default_camera_position(scene_size),
400
353
  )
401
354
 
402
- const gizmo_props = $derived({
403
- background: { enabled: false },
404
- className: `responsive-gizmo`,
405
- ...Object.fromEntries(
406
- [...AXIS_COLORS, ...NEG_AXIS_COLORS].map(([axis, color, hover]) => [
407
- axis,
408
- {
409
- color,
410
- labelColor: `#111`,
411
- opacity: axis.startsWith(`n`) ? 0.9 : 0.8,
412
- hover: {
413
- color: hover,
414
- labelColor: `#222`,
415
- opacity: axis.startsWith(`n`) ? 1 : 0.9,
416
- },
417
- },
418
- ]),
419
- ),
420
- ...(typeof gizmo === `object` ? gizmo : {}),
421
- offset: { left: 5, bottom: 5 },
422
- })
423
-
424
- const is_ortho = $derived(camera_projection === `orthographic`)
425
- const orbit_controls_props = $derived({
426
- position: [0, 0, 0],
427
- target: rotation_target,
428
- enableRotate: rotate_speed > 0,
429
- rotateSpeed: rotate_speed,
430
- enableZoom: zoom_speed > 0,
431
- zoomSpeed: is_ortho ? zoom_speed * 2 : zoom_speed,
432
- zoomToCursor: zoom_to_cursor,
433
- enablePan: pan_speed > 0,
434
- panSpeed: pan_speed,
435
- maxZoom: max_zoom,
436
- minZoom: min_zoom,
437
- autoRotate: Boolean(auto_rotate),
438
- autoRotateSpeed: auto_rotate,
439
- enableDamping: Boolean(rotation_damping),
440
- dampingFactor: rotation_damping,
441
- onstart: () => (camera_is_moving = true),
442
- onend: () => (camera_is_moving = false),
443
- })
444
-
445
- const vector_colors = [`red`, `green`, `blue`]
446
- const vector_labels = [`b₁`, `b₂`, `b₃`]
355
+ const orbit_controls_props = $derived(
356
+ build_orbit_props({
357
+ camera_projection,
358
+ target: rotation_target,
359
+ rotate_speed,
360
+ zoom_speed,
361
+ zoom_to_cursor,
362
+ pan_speed,
363
+ max_zoom,
364
+ min_zoom,
365
+ auto_rotate,
366
+ rotation_damping,
367
+ }),
368
+ )
447
369
 
448
370
  // Create BZ geometry
449
- const bz_geometry = $derived.by(() => {
450
- if (!bz_data || bz_data.faces.length === 0) return null
451
-
452
- const positions: number[] = []
453
- const normals: number[] = []
454
-
455
- for (const face of bz_data.faces) {
456
- if (face.length < 3) continue
457
-
458
- for (let face_idx = 1; face_idx < face.length - 1; face_idx++) {
459
- const indices = [face[0], face[face_idx], face[face_idx + 1]]
460
- if (indices.some((idx) => idx < 0 || idx >= bz_data.vertices.length)) continue
461
- const [v0, v1, v2] = indices.map((idx) => bz_data.vertices[idx])
462
- positions.push(...v0, ...v1, ...v2)
463
-
464
- const e1: Vec3 = math.subtract(v1, v0)
465
- const e2: Vec3 = math.subtract(v2, v0)
466
- const normal_vec = math.cross_3d(e1, e2)
467
- const len = Math.hypot(...normal_vec)
468
- const norm = len > 1e-10 ? normal_vec.map((coord) => coord / len) : [0, 0, 0]
469
- normals.push(...norm, ...norm, ...norm)
470
- }
471
- }
472
-
473
- const geometry = new BufferGeometry()
474
- geometry.setAttribute(
475
- `position`,
476
- new BufferAttribute(new Float32Array(positions), 3),
477
- )
478
- geometry.setAttribute(`normal`, new BufferAttribute(new Float32Array(normals), 3))
479
- geometry.computeBoundingSphere()
480
- return geometry
481
- })
371
+ const bz_geometry = $derived(
372
+ bz_data ? polyhedron_geometry(bz_data.vertices, bz_data.faces) : null,
373
+ )
482
374
 
483
375
  $effect(() => {
484
376
  const prev_geometry = bz_geometry
@@ -516,36 +408,18 @@
516
408
  return { ...base, color: surface_color }
517
409
  }
518
410
 
519
- // Compute inverse of k_lattice for Cartesian->fractional conversion (cached)
520
- const k_lattice_inv = $derived.by(() => {
521
- if (!fermi_data?.k_lattice) return null
522
- try {
523
- return math.matrix_inverse_3x3(fermi_data.k_lattice)
524
- } catch {
525
- return null
526
- }
527
- })
411
+ // Inverse of k_lattice for Cartesian->fractional conversion (cached)
412
+ const k_lattice_inv = $derived(k_lattice_inverse(fermi_data?.k_lattice))
528
413
 
529
414
  // Throttle state for pointer move events to avoid O(n) vertex lookups causing jank
530
415
  let last_hover_time = 0
531
416
 
532
- // Convert Cartesian k-coordinates to fractional (reciprocal lattice units)
533
- // Returns null if k_lattice is unavailable or inversion failed
534
- function cartesian_to_fractional(cart: Vec3): Vec3 | null {
535
- if (!k_lattice_inv) return null
536
- return math.mat3x3_vec3_multiply(k_lattice_inv, cart)
537
- }
538
-
539
417
  // Find index of nearest vertex to a point in a surface
540
418
  function find_nearest_vertex(surface: Isosurface, point: Vec3): number {
541
419
  let [min_dist, nearest_idx] = [Infinity, 0]
542
420
  for (let idx = 0; idx < surface.vertices.length; idx++) {
543
421
  const vertex = surface.vertices[idx]
544
- const dist = Math.hypot(
545
- point[0] - vertex[0],
546
- point[1] - vertex[1],
547
- point[2] - vertex[2],
548
- )
422
+ const dist = Math.hypot(point[0] - vertex[0], point[1] - vertex[1], point[2] - vertex[2])
549
423
  if (dist < min_dist) {
550
424
  min_dist = dist
551
425
  nearest_idx = idx
@@ -564,7 +438,7 @@
564
438
  ): FermiHoverData {
565
439
  // event.point is in world space (after sym_matrix transformation)
566
440
  const position_cartesian: Vec3 = [event.point.x, event.point.y, event.point.z]
567
- const position_fractional = cartesian_to_fractional(position_cartesian)
441
+ const position_fractional = cartesian_to_fractional(k_lattice_inv, position_cartesian)
568
442
 
569
443
  // Transform world-space point to local space for nearest-vertex lookup
570
444
  // surface.vertices are in local space (raw geometry before sym_matrix)
@@ -577,9 +451,8 @@
577
451
  const nearest_idx = find_nearest_vertex(surface, local_position)
578
452
  const property_value = surface.properties?.[nearest_idx]
579
453
  const has_velocities = fermi_data?.metadata?.has_velocities
580
- const property_name = property_value != null
581
- ? (has_velocities ? `velocity` : `custom`)
582
- : undefined
454
+ const property_name =
455
+ property_value != null ? (has_velocities ? `velocity` : `custom`) : undefined
583
456
 
584
457
  const { clientX, clientY } = event.nativeEvent
585
458
  return {
@@ -610,26 +483,20 @@
610
483
  last_hover_time = now
611
484
  hover_data = create_hover_data(event, surface, surface_color, sym_idx, sym_matrix)
612
485
  }
486
+
487
+ const clear_hover = () => {
488
+ hover_data = null
489
+ }
613
490
  </script>
614
491
 
615
- {#if camera_projection === `perspective`}
616
- <T.PerspectiveCamera makeDefault position={computed_camera_position} {fov}>
617
- <extras.OrbitControls {...orbit_controls_props}>
618
- {#if gizmo}<extras.Gizmo {...gizmo_props} />{/if}
619
- </extras.OrbitControls>
620
- </T.PerspectiveCamera>
621
- {:else}
622
- <T.OrthographicCamera
623
- makeDefault
624
- position={computed_camera_position}
625
- zoom={initial_zoom}
626
- near={-100}
627
- >
628
- <extras.OrbitControls {...orbit_controls_props}>
629
- {#if gizmo}<extras.Gizmo {...gizmo_props} />{/if}
630
- </extras.OrbitControls>
631
- </T.OrthographicCamera>
632
- {/if}
492
+ <SceneCamera
493
+ {camera_projection}
494
+ position={computed_camera_position}
495
+ {fov}
496
+ zoom={initial_zoom}
497
+ orbit_props={orbit_controls_props}
498
+ {gizmo}
499
+ />
633
500
 
634
501
  <T.DirectionalLight position={[3, 10, 10]} intensity={directional_light} />
635
502
  <T.DirectionalLight position={[-3, -5, -10]} intensity={directional_light * 0.5} />
@@ -657,32 +524,11 @@
657
524
 
658
525
  <!-- Reciprocal lattice vectors -->
659
526
  {#if show_vectors && fermi_data?.k_lattice}
660
- {#each fermi_data.k_lattice as vec, idx (idx)}
661
- {@const scaled_vec = vec.map((coord) => coord * vector_scale) as Vec3}
662
- {@const label_position = scaled_vec.map((coord) => coord * 1.15) as Vec3}
663
- <Arrow
664
- position={[0, 0, 0]}
665
- vector={scaled_vec}
666
- color={vector_colors[idx]}
667
- scale={1}
668
- shaft_radius={scene_size * 0.008}
669
- arrow_head_radius={scene_size * 0.028}
670
- arrow_head_length={-0.1}
671
- />
672
- <extras.HTML center position={label_position}>
673
- <span style:color={vector_colors[idx]} style:font-size="1.2em">
674
- {vector_labels[idx]}
675
- </span>
676
- </extras.HTML>
677
- {/each}
527
+ <ReciprocalVectors k_lattice={fermi_data.k_lattice} {vector_scale} size={scene_size} />
678
528
  {/if}
679
529
 
680
530
  <!-- Fermi surfaces (with optional symmetry tiling) -->
681
- {#each visible_surfaces as
682
- surface,
683
- surface_idx
684
- (`surface-${surface.band_index}-${surface.spin}-${surface_idx}`)
685
- }
531
+ {#each visible_surfaces as surface, surface_idx (`surface-${surface.band_index}-${surface.spin}-${surface_idx}`)}
686
532
  {@const geo_key = `${surface.band_index}-${surface.spin}-${surface_idx}`}
687
533
  {@const geo_data = geometry_cache.get(geo_key)}
688
534
  {@const surface_color = get_surface_color(surface)}
@@ -699,10 +545,8 @@
699
545
  matrixAutoUpdate={false}
700
546
  {renderOrder}
701
547
  onpointermove={(event: ThreltePointerEvent) =>
702
- handle_pointer_move(event, surface, surface_color, sym_idx, sym_matrix)}
703
- onpointerleave={() => {
704
- hover_data = null
705
- }}
548
+ handle_pointer_move(event, surface, surface_color, sym_idx, sym_matrix)}
549
+ onpointerleave={clear_hover}
706
550
  >
707
551
  <T.MeshBasicMaterial
708
552
  color={surface_color}
@@ -722,10 +566,8 @@
722
566
  matrixAutoUpdate={false}
723
567
  renderOrder={renderOrder * 2}
724
568
  onpointermove={(event: ThreltePointerEvent) =>
725
- handle_pointer_move(event, surface, surface_color, sym_idx, sym_matrix)}
726
- onpointerleave={() => {
727
- hover_data = null
728
- }}
569
+ handle_pointer_move(event, surface, surface_color, sym_idx, sym_matrix)}
570
+ onpointerleave={clear_hover}
729
571
  >
730
572
  <T.MeshStandardMaterial
731
573
  {...get_material_props(surface_color, use_vertex_colors, surface_idx, `back`)}
@@ -741,18 +583,11 @@
741
583
  matrixAutoUpdate={false}
742
584
  renderOrder={renderOrder * 2 + 1}
743
585
  onpointermove={(event: ThreltePointerEvent) =>
744
- handle_pointer_move(event, surface, surface_color, sym_idx, sym_matrix)}
745
- onpointerleave={() => {
746
- hover_data = null
747
- }}
586
+ handle_pointer_move(event, surface, surface_color, sym_idx, sym_matrix)}
587
+ onpointerleave={clear_hover}
748
588
  >
749
589
  <T.MeshStandardMaterial
750
- {...get_material_props(
751
- surface_color,
752
- use_vertex_colors,
753
- surface_idx,
754
- `front`,
755
- )}
590
+ {...get_material_props(surface_color, use_vertex_colors, surface_idx, `front`)}
756
591
  metalness={0.1}
757
592
  roughness={0.6}
758
593
  flatShading={false}
@@ -766,18 +601,11 @@
766
601
  matrixAutoUpdate={false}
767
602
  {renderOrder}
768
603
  onpointermove={(event: ThreltePointerEvent) =>
769
- handle_pointer_move(event, surface, surface_color, sym_idx, sym_matrix)}
770
- onpointerleave={() => {
771
- hover_data = null
772
- }}
604
+ handle_pointer_move(event, surface, surface_color, sym_idx, sym_matrix)}
605
+ onpointerleave={clear_hover}
773
606
  >
774
607
  <T.MeshStandardMaterial
775
- {...get_material_props(
776
- surface_color,
777
- use_vertex_colors,
778
- surface_idx,
779
- `front`,
780
- )}
608
+ {...get_material_props(surface_color, use_vertex_colors, surface_idx, `front`)}
781
609
  metalness={0.1}
782
610
  roughness={0.6}
783
611
  flatShading={false}
@@ -788,10 +616,3 @@
788
616
  {/if}
789
617
  {/each}
790
618
  </T.Group>
791
-
792
- <style>
793
- :global(.fermi-surface .responsive-gizmo) {
794
- width: clamp(70px, 18cqmin, 100px) !important;
795
- height: clamp(70px, 18cqmin, 100px) !important;
796
- }
797
- </style>
@@ -1,15 +1,11 @@
1
1
  import type { BrillouinZoneData } from '../brillouin';
2
2
  import type { Vec3 } from '../math';
3
- import type { CameraProjection } from '../settings';
4
- import * as extras from '@threlte/extras';
5
- import type { ComponentProps } from 'svelte';
6
- import type { Camera, Scene } from 'three';
3
+ import type { SceneControlProps } from '../scene';
7
4
  import type { ColorProperty, FermiHoverData, FermiSurfaceData, RepresentationMode } from './types';
8
- type $$ComponentProps = {
5
+ type $$ComponentProps = SceneControlProps & {
9
6
  fermi_data?: FermiSurfaceData;
10
7
  bz_data?: BrillouinZoneData;
11
8
  camera_position?: Vec3 | undefined;
12
- camera_projection?: CameraProjection;
13
9
  color_property?: ColorProperty;
14
10
  color_scale?: string;
15
11
  representation?: RepresentationMode;
@@ -27,24 +23,8 @@ type $$ComponentProps = {
27
23
  clip_position?: number;
28
24
  clip_flip?: boolean;
29
25
  vector_scale?: number;
30
- rotation_damping?: number;
31
- max_zoom?: number;
32
- min_zoom?: number;
33
- rotate_speed?: number;
34
- zoom_speed?: number;
35
- pan_speed?: number;
36
- zoom_to_cursor?: boolean;
37
- fov?: number;
38
- initial_zoom?: number;
39
- ambient_light?: number;
40
- directional_light?: number;
41
- gizmo?: boolean | ComponentProps<typeof extras.Gizmo>;
42
- auto_rotate?: number;
43
- camera_is_moving?: boolean;
44
- scene?: Scene;
45
- camera?: Camera;
46
26
  hover_data?: FermiHoverData | null;
47
27
  };
48
- declare const FermiSurfaceScene: import("svelte").Component<$$ComponentProps, {}, "camera_position" | "camera_projection" | "camera" | "scene" | "camera_is_moving" | "surface_opacity" | "bz_data" | "hover_data" | "fermi_data">;
28
+ declare const FermiSurfaceScene: import("svelte").Component<$$ComponentProps, {}, "camera" | "camera_projection" | "camera_position" | "scene" | "surface_opacity" | "bz_data" | "hover_data" | "fermi_data">;
49
29
  type FermiSurfaceScene = ReturnType<typeof FermiSurfaceScene>;
50
30
  export default FermiSurfaceScene;
@@ -5,7 +5,10 @@
5
5
  import { KCoords, TooltipContent } from '../tooltip'
6
6
  import type { FermiHoverData, FermiTooltipProp } from './types'
7
7
 
8
- let { hover_data, tooltip }: {
8
+ let {
9
+ hover_data,
10
+ tooltip,
11
+ }: {
9
12
  hover_data: FermiHoverData
10
13
  tooltip?: FermiTooltipProp
11
14
  } = $props()
@@ -27,15 +30,15 @@
27
30
 
28
31
  {#if hover_data.property_value != null}
29
32
  <div class="property-row">
30
- {hover_data.property_name || `Property`}: {
31
- format_num(hover_data.property_value, `.4~`)
32
- }
33
+ {hover_data.property_name || `Property`}: {format_num(
34
+ hover_data.property_value,
35
+ `.4~`,
36
+ )}
33
37
  <span class="nearest-note">(nearest)</span>
34
38
  </div>
35
39
  {/if}
36
40
 
37
- {#if hover_data.is_tiled && hover_data.symmetry_index != null &&
38
- hover_data.symmetry_index > 0}
41
+ {#if hover_data.is_tiled && hover_data.symmetry_index != null && hover_data.symmetry_index > 0}
39
42
  <div class="tiling-info">
40
43
  Symmetry copy #{hover_data.symmetry_index + 1}/48
41
44
  </div>