matterviz 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. package/dist/EmptyState.svelte +10 -2
  2. package/dist/FilePicker.svelte +154 -96
  3. package/dist/Icon.svelte +20 -14
  4. package/dist/MillerIndexInput.svelte +27 -21
  5. package/dist/api/optimade.js +6 -6
  6. package/dist/app.css +216 -178
  7. package/dist/brillouin/BrillouinZone.svelte +299 -198
  8. package/dist/brillouin/BrillouinZone.svelte.d.ts +1 -1
  9. package/dist/brillouin/BrillouinZoneControls.svelte +32 -5
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte +74 -55
  11. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  12. package/dist/brillouin/BrillouinZoneInfoPane.svelte +99 -68
  13. package/dist/brillouin/BrillouinZoneScene.svelte +277 -165
  14. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  15. package/dist/brillouin/BrillouinZoneTooltip.svelte +17 -7
  16. package/dist/brillouin/compute.js +11 -6
  17. package/dist/chempot-diagram/ChemPotDiagram.svelte +327 -0
  18. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +13 -0
  19. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +847 -0
  20. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +16 -0
  21. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +3194 -0
  22. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +16 -0
  23. package/dist/chempot-diagram/ChemPotScene3D.svelte +11 -0
  24. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +7 -0
  25. package/dist/chempot-diagram/async-compute.svelte.d.ts +3 -0
  26. package/dist/chempot-diagram/async-compute.svelte.js +77 -0
  27. package/dist/chempot-diagram/chempot-worker.d.ts +1 -0
  28. package/dist/chempot-diagram/chempot-worker.js +11 -0
  29. package/dist/chempot-diagram/color.d.ts +10 -0
  30. package/dist/chempot-diagram/color.js +32 -0
  31. package/dist/chempot-diagram/compute.d.ts +48 -0
  32. package/dist/chempot-diagram/compute.js +812 -0
  33. package/dist/chempot-diagram/index.d.ts +6 -0
  34. package/dist/chempot-diagram/index.js +6 -0
  35. package/dist/chempot-diagram/pointer.d.ts +16 -0
  36. package/dist/chempot-diagram/pointer.js +40 -0
  37. package/dist/chempot-diagram/temperature.d.ts +15 -0
  38. package/dist/chempot-diagram/temperature.js +36 -0
  39. package/dist/chempot-diagram/types.d.ts +86 -0
  40. package/dist/chempot-diagram/types.js +28 -0
  41. package/dist/colors/index.d.ts +3 -1
  42. package/dist/colors/index.js +9 -3
  43. package/dist/composition/BarChart.svelte +141 -77
  44. package/dist/composition/BubbleChart.svelte +107 -52
  45. package/dist/composition/Composition.svelte +100 -79
  46. package/dist/composition/Formula.svelte +108 -62
  47. package/dist/composition/FormulaFilter.svelte +973 -353
  48. package/dist/composition/FormulaFilter.svelte.d.ts +35 -1
  49. package/dist/composition/PieChart.svelte +199 -99
  50. package/dist/composition/PieChart.svelte.d.ts +1 -1
  51. package/dist/composition/format.d.ts +5 -0
  52. package/dist/composition/format.js +20 -3
  53. package/dist/composition/parse.js +14 -9
  54. package/dist/convex-hull/ConvexHull.svelte +93 -38
  55. package/dist/convex-hull/ConvexHull2D.svelte +551 -393
  56. package/dist/convex-hull/ConvexHull3D.svelte +1303 -825
  57. package/dist/convex-hull/ConvexHull4D.svelte +1012 -686
  58. package/dist/convex-hull/ConvexHullControls.svelte +115 -28
  59. package/dist/convex-hull/ConvexHullInfoPane.svelte +29 -3
  60. package/dist/convex-hull/ConvexHullStats.svelte +821 -249
  61. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +6 -1
  62. package/dist/convex-hull/ConvexHullTooltip.svelte +41 -16
  63. package/dist/convex-hull/GasPressureControls.svelte +104 -61
  64. package/dist/convex-hull/StructurePopup.svelte +25 -4
  65. package/dist/convex-hull/TemperatureSlider.svelte +45 -25
  66. package/dist/convex-hull/barycentric-coords.js +13 -7
  67. package/dist/convex-hull/demo-temperature.d.ts +6 -0
  68. package/dist/convex-hull/demo-temperature.js +40 -0
  69. package/dist/convex-hull/gas-thermodynamics.js +17 -12
  70. package/dist/convex-hull/helpers.d.ts +10 -1
  71. package/dist/convex-hull/helpers.js +79 -38
  72. package/dist/convex-hull/index.d.ts +1 -0
  73. package/dist/convex-hull/index.js +1 -0
  74. package/dist/convex-hull/thermodynamics.d.ts +8 -21
  75. package/dist/convex-hull/thermodynamics.js +163 -69
  76. package/dist/convex-hull/types.d.ts +12 -12
  77. package/dist/convex-hull/types.js +0 -12
  78. package/dist/coordination/CoordinationBarPlot.svelte +232 -176
  79. package/dist/element/BohrAtom.svelte +56 -13
  80. package/dist/element/ElementHeading.svelte +7 -2
  81. package/dist/element/ElementPhoto.svelte +15 -9
  82. package/dist/element/ElementStats.svelte +10 -4
  83. package/dist/element/ElementTile.svelte +137 -73
  84. package/dist/element/Nucleus.svelte +39 -11
  85. package/dist/element/data.js +2 -14
  86. package/dist/element/data.json.gz +0 -0
  87. package/dist/element/types.d.ts +1 -0
  88. package/dist/feedback/ClickFeedback.svelte +16 -5
  89. package/dist/feedback/DragOverlay.svelte +10 -2
  90. package/dist/feedback/Spinner.svelte +4 -2
  91. package/dist/feedback/StatusMessage.svelte +8 -2
  92. package/dist/fermi-surface/FermiSlice.svelte +118 -88
  93. package/dist/fermi-surface/FermiSurface.svelte +336 -239
  94. package/dist/fermi-surface/FermiSurface.svelte.d.ts +1 -1
  95. package/dist/fermi-surface/FermiSurfaceControls.svelte +113 -46
  96. package/dist/fermi-surface/FermiSurfaceScene.svelte +536 -343
  97. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  98. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +14 -5
  99. package/dist/fermi-surface/compute.js +16 -20
  100. package/dist/fermi-surface/parse.js +37 -33
  101. package/dist/fermi-surface/symmetry.js +2 -7
  102. package/dist/fermi-surface/types.d.ts +3 -5
  103. package/dist/heatmap-matrix/HeatmapMatrix.svelte +1527 -0
  104. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +110 -0
  105. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +225 -0
  106. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +30 -0
  107. package/dist/heatmap-matrix/index.d.ts +53 -0
  108. package/dist/heatmap-matrix/index.js +100 -0
  109. package/dist/heatmap-matrix/shared.d.ts +2 -0
  110. package/dist/heatmap-matrix/shared.js +4 -0
  111. package/dist/icons.d.ts +111 -0
  112. package/dist/icons.js +158 -0
  113. package/dist/index.d.ts +5 -2
  114. package/dist/index.js +5 -2
  115. package/dist/io/decompress.js +1 -1
  116. package/dist/io/export.d.ts +3 -0
  117. package/dist/io/export.js +138 -140
  118. package/dist/io/file-drop.d.ts +7 -0
  119. package/dist/io/file-drop.js +43 -0
  120. package/dist/io/index.d.ts +2 -2
  121. package/dist/io/index.js +2 -112
  122. package/dist/io/is-binary.js +2 -3
  123. package/dist/io/types.d.ts +1 -0
  124. package/dist/io/url-drop.d.ts +2 -0
  125. package/dist/io/url-drop.js +117 -0
  126. package/dist/isosurface/Isosurface.svelte +220 -110
  127. package/dist/isosurface/IsosurfaceControls.svelte +65 -28
  128. package/dist/isosurface/parse.js +104 -56
  129. package/dist/isosurface/slice.d.ts +2 -1
  130. package/dist/isosurface/slice.js +8 -13
  131. package/dist/isosurface/types.d.ts +14 -1
  132. package/dist/isosurface/types.js +152 -5
  133. package/dist/labels.d.ts +2 -1
  134. package/dist/labels.js +12 -8
  135. package/dist/layout/FullscreenToggle.svelte +11 -2
  136. package/dist/layout/InfoCard.svelte +38 -6
  137. package/dist/layout/InfoTag.svelte +125 -94
  138. package/dist/layout/PropertyFilter.svelte +82 -37
  139. package/dist/layout/SettingsSection.svelte +85 -55
  140. package/dist/layout/SubpageGrid.svelte +82 -0
  141. package/dist/layout/SubpageGrid.svelte.d.ts +14 -0
  142. package/dist/layout/index.d.ts +1 -0
  143. package/dist/layout/index.js +1 -0
  144. package/dist/layout/json-tree/JsonNode.svelte +266 -223
  145. package/dist/layout/json-tree/JsonTree.svelte +516 -429
  146. package/dist/layout/json-tree/JsonTree.svelte.d.ts +1 -1
  147. package/dist/layout/json-tree/JsonValue.svelte +281 -173
  148. package/dist/layout/json-tree/types.d.ts +10 -2
  149. package/dist/layout/json-tree/utils.d.ts +2 -0
  150. package/dist/layout/json-tree/utils.js +37 -2
  151. package/dist/marching-cubes.js +25 -2
  152. package/dist/math.d.ts +20 -17
  153. package/dist/math.js +474 -57
  154. package/dist/overlays/ContextMenu.svelte +66 -40
  155. package/dist/overlays/DraggablePane.svelte +331 -154
  156. package/dist/overlays/DraggablePane.svelte.d.ts +2 -0
  157. package/dist/periodic-table/PeriodicTable.svelte +278 -145
  158. package/dist/periodic-table/PeriodicTableControls.svelte +178 -128
  159. package/dist/periodic-table/PropertySelect.svelte +25 -7
  160. package/dist/periodic-table/TableInset.svelte +8 -3
  161. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +559 -267
  162. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -2
  163. package/dist/phase-diagram/PhaseDiagramControls.svelte +131 -51
  164. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +3 -2
  165. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +126 -0
  166. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +15 -0
  167. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +160 -110
  168. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +8 -1
  169. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +217 -86
  170. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +6 -3
  171. package/dist/phase-diagram/TdbInfoPanel.svelte +28 -4
  172. package/dist/phase-diagram/build-diagram.js +9 -9
  173. package/dist/phase-diagram/colors.js +1 -3
  174. package/dist/phase-diagram/index.d.ts +2 -0
  175. package/dist/phase-diagram/index.js +2 -0
  176. package/dist/phase-diagram/parse.js +10 -9
  177. package/dist/phase-diagram/svg-to-diagram.d.ts +2 -0
  178. package/dist/phase-diagram/svg-to-diagram.js +869 -0
  179. package/dist/phase-diagram/types.d.ts +10 -0
  180. package/dist/phase-diagram/utils.d.ts +8 -4
  181. package/dist/phase-diagram/utils.js +219 -74
  182. package/dist/plot/AxisLabel.svelte +51 -0
  183. package/dist/plot/AxisLabel.svelte.d.ts +16 -0
  184. package/dist/plot/BarPlot.svelte +1461 -768
  185. package/dist/plot/BarPlot.svelte.d.ts +3 -3
  186. package/dist/plot/BarPlotControls.svelte +33 -6
  187. package/dist/plot/BarPlotControls.svelte.d.ts +1 -1
  188. package/dist/plot/ColorBar.svelte +533 -383
  189. package/dist/plot/ColorBar.svelte.d.ts +1 -1
  190. package/dist/plot/ColorScaleSelect.svelte +28 -7
  191. package/dist/plot/ElementScatter.svelte +38 -16
  192. package/dist/plot/FillArea.svelte +152 -92
  193. package/dist/plot/Histogram.svelte +1162 -709
  194. package/dist/plot/Histogram.svelte.d.ts +1 -1
  195. package/dist/plot/HistogramControls.svelte +81 -18
  196. package/dist/plot/HistogramControls.svelte.d.ts +6 -2
  197. package/dist/plot/InteractiveAxisLabel.svelte +34 -11
  198. package/dist/plot/InteractiveAxisLabel.svelte.d.ts +1 -1
  199. package/dist/plot/Line.svelte +63 -28
  200. package/dist/plot/PlotControls.svelte +221 -96
  201. package/dist/plot/PlotControls.svelte.d.ts +1 -1
  202. package/dist/plot/PlotLegend.svelte +174 -91
  203. package/dist/plot/PlotTooltip.svelte +45 -6
  204. package/dist/plot/PortalSelect.svelte +175 -146
  205. package/dist/plot/ReferenceLine.svelte +77 -22
  206. package/dist/plot/ReferenceLine.svelte.d.ts +1 -0
  207. package/dist/plot/ReferenceLine3D.svelte +132 -107
  208. package/dist/plot/ReferencePlane.svelte +146 -123
  209. package/dist/plot/ScatterPlot.svelte +1880 -1156
  210. package/dist/plot/ScatterPlot.svelte.d.ts +3 -3
  211. package/dist/plot/ScatterPlot3D.svelte +256 -131
  212. package/dist/plot/ScatterPlot3D.svelte.d.ts +2 -2
  213. package/dist/plot/ScatterPlot3DControls.svelte +300 -297
  214. package/dist/plot/ScatterPlot3DControls.svelte.d.ts +2 -1
  215. package/dist/plot/ScatterPlot3DScene.svelte +608 -406
  216. package/dist/plot/ScatterPlot3DScene.svelte.d.ts +2 -2
  217. package/dist/plot/ScatterPlotControls.svelte +150 -70
  218. package/dist/plot/ScatterPlotControls.svelte.d.ts +1 -1
  219. package/dist/plot/ScatterPoint.svelte +98 -26
  220. package/dist/plot/ScatterPoint.svelte.d.ts +1 -0
  221. package/dist/plot/SpacegroupBarPlot.svelte +142 -85
  222. package/dist/plot/Surface3D.svelte +159 -108
  223. package/dist/plot/ZeroLines.svelte +96 -0
  224. package/dist/plot/ZeroLines.svelte.d.ts +32 -0
  225. package/dist/plot/ZoomRect.svelte +23 -0
  226. package/dist/plot/ZoomRect.svelte.d.ts +8 -0
  227. package/dist/plot/axis-utils.d.ts +1 -1
  228. package/dist/plot/axis-utils.js +1 -3
  229. package/dist/plot/data-cleaning.js +12 -28
  230. package/dist/plot/data-transform.js +2 -1
  231. package/dist/plot/fill-utils.js +2 -0
  232. package/dist/plot/index.d.ts +6 -2
  233. package/dist/plot/index.js +6 -2
  234. package/dist/plot/interactions.d.ts +8 -10
  235. package/dist/plot/interactions.js +2 -3
  236. package/dist/plot/layout.d.ts +11 -2
  237. package/dist/plot/layout.js +44 -17
  238. package/dist/plot/reference-line.d.ts +5 -22
  239. package/dist/plot/reference-line.js +12 -84
  240. package/dist/plot/scales.js +24 -36
  241. package/dist/plot/types.d.ts +53 -40
  242. package/dist/plot/types.js +12 -7
  243. package/dist/plot/utils/label-placement.d.ts +32 -15
  244. package/dist/plot/utils/label-placement.js +227 -63
  245. package/dist/plot/utils/series-visibility.js +2 -3
  246. package/dist/plot/utils.d.ts +1 -0
  247. package/dist/plot/utils.js +14 -0
  248. package/dist/rdf/RdfPlot.svelte +173 -132
  249. package/dist/rdf/calc-rdf.js +4 -5
  250. package/dist/sanitize.d.ts +4 -0
  251. package/dist/sanitize.js +107 -0
  252. package/dist/settings.d.ts +21 -6
  253. package/dist/settings.js +63 -19
  254. package/dist/spectral/Bands.svelte +963 -412
  255. package/dist/spectral/Bands.svelte.d.ts +22 -2
  256. package/dist/spectral/BandsAndDos.svelte +90 -49
  257. package/dist/spectral/BrillouinBandsDos.svelte +151 -93
  258. package/dist/spectral/Dos.svelte +389 -258
  259. package/dist/spectral/helpers.d.ts +23 -1
  260. package/dist/spectral/helpers.js +119 -51
  261. package/dist/spectral/types.d.ts +2 -0
  262. package/dist/state.svelte.d.ts +1 -1
  263. package/dist/state.svelte.js +3 -2
  264. package/dist/structure/Arrow.svelte +59 -20
  265. package/dist/structure/AtomLegend.svelte +231 -129
  266. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  267. package/dist/structure/Bond.svelte +73 -47
  268. package/dist/structure/CanvasTooltip.svelte +10 -2
  269. package/dist/structure/CellSelect.svelte +148 -51
  270. package/dist/structure/Cylinder.svelte +33 -17
  271. package/dist/structure/Lattice.svelte +88 -33
  272. package/dist/structure/Structure.svelte +1077 -821
  273. package/dist/structure/Structure.svelte.d.ts +1 -1
  274. package/dist/structure/StructureControls.svelte +373 -139
  275. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  276. package/dist/structure/StructureExportPane.svelte +124 -89
  277. package/dist/structure/StructureExportPane.svelte.d.ts +1 -1
  278. package/dist/structure/StructureInfoPane.svelte +304 -231
  279. package/dist/structure/StructureScene.svelte +919 -445
  280. package/dist/structure/StructureScene.svelte.d.ts +16 -7
  281. package/dist/structure/atom-properties.d.ts +6 -2
  282. package/dist/structure/atom-properties.js +42 -29
  283. package/dist/structure/bonding.js +6 -7
  284. package/dist/structure/export.js +22 -34
  285. package/dist/structure/ferrox-wasm-types.d.ts +3 -2
  286. package/dist/structure/ferrox-wasm-types.js +0 -3
  287. package/dist/structure/ferrox-wasm.d.ts +3 -2
  288. package/dist/structure/ferrox-wasm.js +2 -3
  289. package/dist/structure/index.d.ts +16 -0
  290. package/dist/structure/index.js +88 -6
  291. package/dist/structure/measure.d.ts +2 -2
  292. package/dist/structure/measure.js +4 -44
  293. package/dist/structure/parse.js +130 -155
  294. package/dist/structure/partial-occupancy.d.ts +25 -0
  295. package/dist/structure/partial-occupancy.js +99 -0
  296. package/dist/structure/pbc.d.ts +1 -0
  297. package/dist/structure/pbc.js +16 -6
  298. package/dist/structure/supercell.d.ts +2 -2
  299. package/dist/structure/supercell.js +12 -22
  300. package/dist/structure/validation.js +5 -3
  301. package/dist/symmetry/SymmetryStats.svelte +94 -37
  302. package/dist/symmetry/WyckoffTable.svelte +42 -14
  303. package/dist/symmetry/cell-transform.js +5 -3
  304. package/dist/symmetry/index.d.ts +7 -4
  305. package/dist/symmetry/index.js +87 -21
  306. package/dist/symmetry/spacegroups.js +148 -148
  307. package/dist/table/HeatmapTable.svelte +1112 -516
  308. package/dist/table/HeatmapTable.svelte.d.ts +12 -1
  309. package/dist/table/ToggleMenu.svelte +125 -90
  310. package/dist/table/index.d.ts +2 -0
  311. package/dist/table/index.js +2 -4
  312. package/dist/theme/ThemeControl.svelte +21 -12
  313. package/dist/time.js +4 -1
  314. package/dist/tooltip/TooltipContent.svelte +33 -8
  315. package/dist/trajectory/Trajectory.svelte +889 -687
  316. package/dist/trajectory/TrajectoryError.svelte +14 -3
  317. package/dist/trajectory/TrajectoryExportPane.svelte +148 -90
  318. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +1 -1
  319. package/dist/trajectory/TrajectoryInfoPane.svelte +272 -143
  320. package/dist/trajectory/constants.d.ts +6 -0
  321. package/dist/trajectory/constants.js +7 -0
  322. package/dist/trajectory/extract.js +13 -31
  323. package/dist/trajectory/format-detect.d.ts +9 -0
  324. package/dist/trajectory/format-detect.js +76 -0
  325. package/dist/trajectory/frame-reader.d.ts +17 -0
  326. package/dist/trajectory/frame-reader.js +332 -0
  327. package/dist/trajectory/helpers.d.ts +14 -0
  328. package/dist/trajectory/helpers.js +172 -0
  329. package/dist/trajectory/index.d.ts +1 -0
  330. package/dist/trajectory/index.js +23 -14
  331. package/dist/trajectory/parse/ase.d.ts +2 -0
  332. package/dist/trajectory/parse/ase.js +77 -0
  333. package/dist/trajectory/parse/hdf5.d.ts +2 -0
  334. package/dist/trajectory/parse/hdf5.js +129 -0
  335. package/dist/trajectory/parse/index.d.ts +12 -0
  336. package/dist/trajectory/parse/index.js +299 -0
  337. package/dist/trajectory/parse/lammps.d.ts +5 -0
  338. package/dist/trajectory/parse/lammps.js +179 -0
  339. package/dist/trajectory/parse/vasp.d.ts +2 -0
  340. package/dist/trajectory/parse/vasp.js +68 -0
  341. package/dist/trajectory/parse/xyz.d.ts +2 -0
  342. package/dist/trajectory/parse/xyz.js +110 -0
  343. package/dist/trajectory/plotting.js +13 -8
  344. package/dist/trajectory/types.d.ts +11 -0
  345. package/dist/trajectory/types.js +1 -0
  346. package/dist/utils.d.ts +3 -0
  347. package/dist/utils.js +17 -0
  348. package/dist/xrd/XrdPlot.svelte +337 -245
  349. package/dist/xrd/broadening.js +14 -9
  350. package/dist/xrd/calc-xrd.js +12 -19
  351. package/dist/xrd/parse.d.ts +1 -1
  352. package/dist/xrd/parse.js +17 -17
  353. package/package.json +103 -101
  354. package/readme.md +4 -4
  355. package/dist/trajectory/parse.d.ts +0 -42
  356. package/dist/trajectory/parse.js +0 -1267
  357. /package/dist/element/{data.json.d.ts → data.json.gz.d.ts} +0 -0
  358. /package/dist/theme/{themes.js → themes.mjs} +0 -0
@@ -1,189 +1,317 @@
1
- <script lang="ts">import { toggle_fullscreen } from '../layout';
2
- import { normalize_show_controls } from '../controls';
3
- import EmptyState from '../EmptyState.svelte';
4
- import Spinner from '../feedback/Spinner.svelte';
5
- import Icon from '../Icon.svelte';
6
- import { decompress_file, handle_url_drop, load_from_url } from '../io';
7
- import { set_fullscreen_bg } from '../layout';
8
- import { DEFAULTS } from '../settings';
9
- import { parse_any_structure } from '../structure/parse';
10
- import { analyze_structure_symmetry } from '../symmetry';
11
- import { Canvas } from '@threlte/core';
12
- import { untrack } from 'svelte';
13
- import { tooltip } from 'svelte-multiselect/attachments';
14
- import { PlotTooltip } from '../plot';
15
- import BrillouinZoneControls from './BrillouinZoneControls.svelte';
16
- import BrillouinZoneExportPane from './BrillouinZoneExportPane.svelte';
17
- import BrillouinZoneInfoPane from './BrillouinZoneInfoPane.svelte';
18
- import BrillouinZoneScene from './BrillouinZoneScene.svelte';
19
- import BrillouinZoneTooltip from './BrillouinZoneTooltip.svelte';
20
- import { compute_brillouin_zone, compute_irreducible_bz, extract_point_group_from_operations, reciprocal_lattice, } from './compute';
21
- let { structure = $bindable(), bz_order = $bindable(1), bz_data = $bindable(), controls_open = $bindable(false), info_pane_open = $bindable(false), surface_color = $bindable(`#4488ff`), surface_opacity = $bindable(0.3), edge_color = $bindable(`#000000`), edge_width = $bindable(0.05), show_vectors = $bindable(true), vector_scale = $bindable(1.0), camera_projection = $bindable(`perspective`),
22
- // Irreducible BZ options
23
- show_ibz = $bindable(false), ibz_color = $bindable(`#ff8844`), ibz_opacity = $bindable(0.5), ibz_data = $bindable(null), show_controls, fullscreen = $bindable(false), wrapper = $bindable(), width = $bindable(0), height = $bindable(0), hovered = $bindable(false), dragover = $bindable(false), allow_file_drop = true, png_dpi = $bindable(150), fullscreen_toggle = DEFAULTS.structure.fullscreen_toggle, data_url, structure_string, on_file_drop, spinner_props = {}, loading = $bindable(false), error_msg = $bindable(), k_path_points = [], k_path_labels = [], hovered_k_point = null, hovered_qpoint_index = null, children, tooltip_config, on_file_load, on_error, on_fullscreen_change, on_hover, ...rest } = $props();
24
- let scene = $state(undefined);
25
- let camera = $state(undefined);
26
- let export_pane_open = $state(false);
27
- let current_filename = $state(undefined);
28
- let hover_data = $state(null);
29
- // Call on_hover callback when hover_data changes
30
- $effect(() => {
31
- on_hover?.(hover_data);
32
- });
33
- // Normalize show_controls prop into consistent config
34
- let controls_config = $derived(normalize_show_controls(show_controls));
35
- // Parse and load structure from content
36
- function parse_structure(content, filename) {
1
+ <script lang="ts">
2
+ import type { ShowControlsProp } from '../controls'
3
+ import { normalize_show_controls } from '../controls'
4
+ import EmptyState from '../EmptyState.svelte'
5
+ import { StatusMessage } from '../feedback'
6
+ import Spinner from '../feedback/Spinner.svelte'
7
+ import Icon from '../Icon.svelte'
8
+ import { create_file_drop_handler, load_from_url } from '../io'
9
+ import { set_fullscreen_bg, toggle_fullscreen } from '../layout'
10
+ import type { Vec3 } from '../math'
11
+ import { PlotTooltip } from '../plot'
12
+ import { type CameraProjection, DEFAULTS } from '../settings'
13
+ import type { Crystal } from '../structure'
14
+ import { parse_any_structure } from '../structure/parse'
15
+ import { analyze_structure_symmetry } from '../symmetry'
16
+ import { Canvas } from '@threlte/core'
17
+ import type { ComponentProps, Snippet } from 'svelte'
18
+ import { untrack } from 'svelte'
19
+ import { tooltip } from 'svelte-multiselect/attachments'
20
+ import type { HTMLAttributes } from 'svelte/elements'
21
+ import BrillouinZoneControls from './BrillouinZoneControls.svelte'
22
+ import BrillouinZoneExportPane from './BrillouinZoneExportPane.svelte'
23
+ import BrillouinZoneInfoPane from './BrillouinZoneInfoPane.svelte'
24
+ import BrillouinZoneScene from './BrillouinZoneScene.svelte'
25
+ import BrillouinZoneTooltip from './BrillouinZoneTooltip.svelte'
26
+ import {
27
+ compute_brillouin_zone,
28
+ compute_irreducible_bz,
29
+ extract_point_group_from_operations,
30
+ reciprocal_lattice,
31
+ } from './compute'
32
+ import type {
33
+ BrillouinZoneData,
34
+ BZHoverData,
35
+ BZTooltipProp,
36
+ IrreducibleBZData,
37
+ } from './types'
38
+
39
+ type BZHandlerData = {
40
+ structure?: Crystal
41
+ bz_data?: BrillouinZoneData
42
+ bz_order?: number
43
+ filename?: string
44
+ file_size?: number
45
+ error_msg?: string
46
+ fullscreen?: boolean
47
+ }
48
+ let {
49
+ structure = $bindable(),
50
+ bz_order = $bindable(1),
51
+ bz_data = $bindable(),
52
+ controls_open = $bindable(false),
53
+ info_pane_open = $bindable(false),
54
+ surface_color = $bindable(`#4488ff`),
55
+ surface_opacity = $bindable(0.3),
56
+ edge_color = $bindable(`#000000`),
57
+ edge_width = $bindable(0.05),
58
+ show_vectors = $bindable(true),
59
+ vector_scale = $bindable(1.0),
60
+ camera_projection = $bindable(`perspective`),
61
+ // Irreducible BZ options
62
+ show_ibz = $bindable(false),
63
+ ibz_color = $bindable(`#ff8844`),
64
+ ibz_opacity = $bindable(0.5),
65
+ ibz_data = $bindable<IrreducibleBZData | null>(null),
66
+ show_controls,
67
+ fullscreen = $bindable(false),
68
+ wrapper = $bindable(),
69
+ width = $bindable(0),
70
+ height = $bindable(0),
71
+ hovered = $bindable(false),
72
+ dragover = $bindable(false),
73
+ allow_file_drop = true,
74
+ png_dpi = $bindable(150),
75
+ fullscreen_toggle = DEFAULTS.structure.fullscreen_toggle,
76
+ data_url,
77
+ structure_string,
78
+ on_file_drop,
79
+ spinner_props = {},
80
+ loading = $bindable(false),
81
+ error_msg = $bindable(),
82
+ k_path_points = [],
83
+ k_path_labels = [],
84
+ hovered_k_point = null,
85
+ hovered_qpoint_index = null,
86
+ children,
87
+ tooltip_config,
88
+ on_file_load,
89
+ on_error,
90
+ on_fullscreen_change,
91
+ on_hover,
92
+ ...rest
93
+ }:
94
+ & {
95
+ structure?: Crystal
96
+ bz_order?: number
97
+ bz_data?: BrillouinZoneData
98
+ controls_open?: boolean
99
+ info_pane_open?: boolean
100
+ surface_color?: string
101
+ surface_opacity?: number
102
+ edge_color?: string
103
+ edge_width?: number
104
+ show_vectors?: boolean
105
+ vector_scale?: number
106
+ camera_projection?: CameraProjection
107
+ // Irreducible BZ options
108
+ show_ibz?: boolean
109
+ ibz_color?: string
110
+ ibz_opacity?: number
111
+ ibz_data?: IrreducibleBZData | null
112
+ /**
113
+ * Controls visibility configuration.
114
+ * - 'always': controls always visible
115
+ * - 'hover': controls visible on component hover (default)
116
+ * - 'never': controls never visible
117
+ * - object: { mode, hidden, style } for fine-grained control
118
+ *
119
+ * Control names: 'filename', 'fullscreen', 'info-pane', 'export-pane', 'controls'
120
+ */
121
+ show_controls?: ShowControlsProp
122
+ fullscreen?: boolean
123
+ width?: number
124
+ height?: number
125
+ wrapper?: HTMLDivElement
126
+ png_dpi?: number
127
+ hovered?: boolean
128
+ dragover?: boolean
129
+ allow_file_drop?: boolean
130
+ fullscreen_toggle?: Snippet<[{ fullscreen: boolean }]> | boolean
131
+ data_url?: string
132
+ on_file_drop?: (content: string | ArrayBuffer, filename: string) => void
133
+ spinner_props?: ComponentProps<typeof Spinner>
134
+ loading?: boolean
135
+ error_msg?: string
136
+ structure_string?: string
137
+ // K-path points in Cartesian reciprocal space coordinates (not fractional coords)
138
+ // Should be computed using the reciprocal lattice matrix (includes 2π factor)
139
+ k_path_points?: Vec3[]
140
+ // K-path labels with positions in Cartesian reciprocal space coordinates
141
+ // Each position should match a corresponding point in k_path_points
142
+ k_path_labels?: { position: Vec3; label: string | null }[]
143
+ // Currently hovered k-point in Cartesian reciprocal space coordinates
144
+ hovered_k_point?: Vec3 | null
145
+ // Index of the currently hovered q-point in the band structure
146
+ hovered_qpoint_index?: number | null
147
+ children?: Snippet<
148
+ [{ structure?: Crystal; bz_data?: BrillouinZoneData }]
149
+ >
150
+ tooltip_config?: BZTooltipProp
151
+ on_file_load?: (data: BZHandlerData) => void
152
+ on_error?: (data: BZHandlerData) => void
153
+ on_fullscreen_change?: (data: BZHandlerData) => void
154
+ on_hover?: (data: BZHoverData | null) => void
155
+ }
156
+ & HTMLAttributes<HTMLDivElement> = $props()
157
+
158
+ let scene = $state(undefined)
159
+ let camera = $state(undefined)
160
+ let export_pane_open = $state(false)
161
+ let current_filename = $state<string | undefined>(undefined)
162
+ let hover_data = $state<BZHoverData | null>(null)
163
+
164
+ // Call on_hover callback when hover_data changes
165
+ $effect(() => {
166
+ on_hover?.(hover_data)
167
+ })
168
+
169
+ // Normalize show_controls prop into consistent config
170
+ let controls_config = $derived(normalize_show_controls(show_controls))
171
+
172
+ // Parse and load structure from content
173
+ function parse_structure(content: string | ArrayBuffer, filename: string) {
37
174
  const text = content instanceof ArrayBuffer
38
- ? new TextDecoder().decode(content)
39
- : content;
40
- const parsed = parse_any_structure(text, filename);
41
- if (!parsed)
42
- throw new Error(`Failed to parse structure from ${filename}`);
43
- structure = parsed;
44
- current_filename = filename;
45
- const file_size = new Blob([content]).size;
46
- on_file_load?.({ structure, bz_data, bz_order, filename, file_size });
47
- }
48
- // Load with error handling
49
- function safe_parse(content, filename) {
175
+ ? new TextDecoder().decode(content)
176
+ : content
177
+ const parsed = parse_any_structure(text, filename)
178
+ if (!parsed) throw new Error(`Failed to parse structure from ${filename}`)
179
+
180
+ structure = parsed as Crystal
181
+ current_filename = filename
182
+ const file_size = new Blob([content]).size
183
+ on_file_load?.({ structure, bz_data, bz_order, filename, file_size })
184
+ }
185
+
186
+ // Load with error handling
187
+ function safe_parse(content: string | ArrayBuffer, filename: string) {
50
188
  try {
51
- parse_structure(content, filename);
52
- }
53
- catch (err) {
54
- error_msg = `Failed to parse ${filename}: ${err instanceof Error ? err.message : err}`;
55
- on_error?.({ error_msg, filename });
189
+ parse_structure(content, filename)
190
+ } catch (err) {
191
+ error_msg = `Failed to parse ${filename}: ${
192
+ err instanceof Error ? err.message : err
193
+ }`
194
+ on_error?.({ error_msg, filename })
56
195
  }
57
- }
58
- // Compute BZ when structure/order changes
59
- $effect(() => {
196
+ }
197
+
198
+ // Compute BZ when structure/order changes
199
+ $effect(() => {
60
200
  // Skip if bz_data was already provided externally (has valid vertices)
61
- if (bz_data?.vertices?.length)
62
- return;
201
+ if (bz_data?.vertices?.length) return
202
+
63
203
  if (!structure || !(`lattice` in structure) || !structure.lattice) {
64
- bz_data = undefined;
65
- return;
204
+ bz_data = undefined
205
+ return
66
206
  }
207
+
67
208
  try {
68
- const k_lattice = reciprocal_lattice(structure.lattice.matrix);
69
- // Ensure bz_order is 1, 2, or 3
70
- const valid_order = Math.min(Math.max(1, bz_order), 3);
71
- bz_data = compute_brillouin_zone(k_lattice, valid_order);
72
- }
73
- catch (err) {
74
- const msg = err instanceof Error ? err.message : String(err);
75
- error_msg = `BZ computation failed: ${msg}`;
76
- bz_data = undefined;
77
- untrack(() => on_error?.({ error_msg, structure, bz_order }));
209
+ const k_lattice = reciprocal_lattice(structure.lattice.matrix)
210
+ // Ensure bz_order is 1, 2, or 3
211
+ const valid_order = Math.min(Math.max(1, bz_order), 3) as 1 | 2 | 3
212
+ bz_data = compute_brillouin_zone(k_lattice, valid_order)
213
+ } catch (err) {
214
+ const msg = err instanceof Error ? err.message : String(err)
215
+ error_msg = `BZ computation failed: ${msg}`
216
+ bz_data = undefined
217
+ untrack(() => on_error?.({ error_msg, structure, bz_order }))
78
218
  }
79
- });
80
- // Compute IBZ when show_ibz is enabled and structure changes
81
- $effect(() => {
219
+ })
220
+
221
+ // Compute IBZ when show_ibz is enabled and structure changes
222
+ $effect(() => {
82
223
  if (!show_ibz || !bz_data || !structure?.lattice) {
83
- ibz_data = null;
84
- return;
224
+ ibz_data = null
225
+ return
85
226
  }
86
- let stale = false;
87
- const captured_bz = bz_data;
227
+
228
+ let stale = false
229
+ const captured_bz = bz_data
230
+
88
231
  analyze_structure_symmetry(structure, {})
89
- .then((sym_data) => {
90
- if (stale)
91
- return;
92
- const point_group_ops = extract_point_group_from_operations(sym_data.operations);
93
- ibz_data = compute_irreducible_bz(captured_bz, point_group_ops);
94
- })
95
- .catch((err) => {
96
- if (stale)
97
- return;
98
- console.warn(`IBZ computation failed:`, err);
99
- ibz_data = null;
100
- });
232
+ .then((sym_data) => {
233
+ if (stale) return
234
+ const point_group_ops = extract_point_group_from_operations(
235
+ sym_data.operations,
236
+ )
237
+ ibz_data = compute_irreducible_bz(captured_bz, point_group_ops)
238
+ })
239
+ .catch((err) => {
240
+ if (stale) return
241
+ console.warn(`IBZ computation failed:`, err)
242
+ ibz_data = null
243
+ })
244
+
101
245
  return () => {
102
- stale = true;
103
- };
104
- });
105
- // Load structure from URL or string
106
- $effect(() => {
107
- const handle_error = (err, source) => {
108
- error_msg = err instanceof Error ? err.message : String(err);
109
- on_error?.({ error_msg, filename: source });
110
- };
111
- if (data_url && !structure) {
112
- loading = true;
113
- error_msg = undefined;
114
- load_from_url(data_url, (content, filename) => on_file_drop
115
- ? on_file_drop(content, filename)
116
- : safe_parse(content, filename))
117
- .catch((err) => handle_error(err, data_url))
118
- .finally(() => (loading = false));
246
+ stale = true
119
247
  }
120
- else if (structure_string && !data_url) {
121
- loading = true;
122
- error_msg = undefined;
123
- try {
124
- safe_parse(structure_string, `string`);
125
- }
126
- catch (err) {
127
- handle_error(err, `string`);
128
- }
129
- finally {
130
- loading = false;
131
- }
132
- }
133
- });
134
- async function handle_file_drop(event) {
135
- event.preventDefault();
136
- dragover = false;
137
- if (!allow_file_drop)
138
- return;
139
- loading = true;
140
- error_msg = undefined;
141
- try {
142
- const handler = on_file_drop || safe_parse;
143
- const handled = await handle_url_drop(event, handler).catch(() => false);
144
- if (handled)
145
- return;
146
- const file = event.dataTransfer?.files[0];
147
- if (file) {
148
- const { content, filename } = await decompress_file(file);
149
- if (content)
150
- handler(content, filename);
151
- }
152
- }
153
- catch (err) {
154
- error_msg = `File drop failed: ${err}`;
155
- on_error?.({ error_msg });
248
+ })
249
+
250
+ // Load structure from URL or string
251
+ $effect(() => {
252
+ const handle_error = (err: unknown, source: string) => {
253
+ error_msg = err instanceof Error ? err.message : String(err)
254
+ on_error?.({ error_msg, filename: source })
156
255
  }
157
- finally {
158
- loading = false;
256
+
257
+ if (data_url && !structure) {
258
+ loading = true
259
+ error_msg = undefined
260
+ load_from_url(
261
+ data_url,
262
+ (content, filename) =>
263
+ on_file_drop
264
+ ? on_file_drop(content, filename)
265
+ : safe_parse(content, filename),
266
+ )
267
+ .catch((err) => handle_error(err, data_url))
268
+ .finally(() => (loading = false))
269
+ } else if (structure_string && !data_url) {
270
+ loading = true
271
+ error_msg = undefined
272
+ try {
273
+ safe_parse(structure_string, `string`)
274
+ } catch (err) {
275
+ handle_error(err, `string`)
276
+ } finally {
277
+ loading = false
278
+ }
159
279
  }
160
- }
161
- function onkeydown(event) {
162
- const target = event.target;
163
- if (target.tagName === `INPUT` || target.tagName === `TEXTAREA`)
164
- return;
165
- if (event.key === `f` && fullscreen_toggle)
166
- toggle_fullscreen(wrapper);
167
- else if (event.key === `i`)
168
- info_pane_open = !info_pane_open;
280
+ })
281
+
282
+ const handle_file_drop = create_file_drop_handler({
283
+ allow: () => allow_file_drop,
284
+ on_drop: (content, filename) => (on_file_drop || safe_parse)(content, filename),
285
+ on_error: (msg) => {
286
+ error_msg = msg
287
+ on_error?.({ error_msg: msg })
288
+ },
289
+ set_loading: (val) => {
290
+ loading = val
291
+ if (val) [error_msg, dragover] = [undefined, false]
292
+ },
293
+ })
294
+
295
+ function onkeydown(event: KeyboardEvent) {
296
+ const target = event.target as HTMLElement
297
+ if (target.tagName === `INPUT` || target.tagName === `TEXTAREA`) return
298
+
299
+ if (event.key === `f` && fullscreen_toggle) toggle_fullscreen(wrapper)
300
+ else if (event.key === `i`) info_pane_open = !info_pane_open
169
301
  else if (event.key === `Escape`) {
170
- if (info_pane_open)
171
- info_pane_open = false;
172
- else
173
- controls_open = false;
302
+ if (info_pane_open) info_pane_open = false
303
+ else controls_open = false
174
304
  }
175
- }
176
- $effect(() => {
177
- if (typeof window === `undefined`)
178
- return;
179
- const fs_el = document.fullscreenElement;
305
+ }
306
+
307
+ $effect(() => { // fullscreen and background
308
+ if (typeof window === `undefined`) return
309
+ const fs_el = document.fullscreenElement
180
310
  if (fullscreen && fs_el !== wrapper && wrapper) {
181
- wrapper.requestFullscreen().catch(console.error);
182
- }
183
- else if (!fullscreen && fs_el === wrapper)
184
- document.exitFullscreen();
185
- set_fullscreen_bg(wrapper, fullscreen, `--bz-bg-fullscreen`);
186
- });
311
+ wrapper.requestFullscreen().catch(console.error)
312
+ } else if (!fullscreen && fs_el === wrapper) document.exitFullscreen()
313
+ set_fullscreen_bg(wrapper, fullscreen, `--bz-bg-fullscreen`)
314
+ })
187
315
  </script>
188
316
 
189
317
  <svelte:document
@@ -221,10 +349,7 @@ $effect(() => {
221
349
  {#if loading}
222
350
  <Spinner text="Loading structure..." {...spinner_props} />
223
351
  {:else if error_msg}
224
- <div class="error-state">
225
- <p class="error">{error_msg}</p>
226
- <button onclick={() => (error_msg = undefined)}>Dismiss</button>
227
- </div>
352
+ <StatusMessage bind:message={error_msg} type="error" dismissible />
228
353
  {:else if structure && `lattice` in structure}
229
354
  <section
230
355
  class="control-buttons {controls_config.class}"
@@ -384,7 +509,8 @@ $effect(() => {
384
509
  pointer-events: auto;
385
510
  }
386
511
  /* Mode: hover - controls visible on component hover */
387
- .brillouin-zone:hover section.control-buttons.hover-visible {
512
+ .brillouin-zone:hover section.control-buttons.hover-visible,
513
+ .brillouin-zone:focus-within section.control-buttons.hover-visible {
388
514
  opacity: 1;
389
515
  pointer-events: auto;
390
516
  }
@@ -414,29 +540,4 @@ $effect(() => {
414
540
  text-align: center;
415
541
  padding: 2rem;
416
542
  }
417
- .error-state {
418
- display: flex;
419
- flex-direction: column;
420
- align-items: center;
421
- justify-content: center;
422
- height: 100%;
423
- padding: 2rem;
424
- text-align: center;
425
- box-sizing: border-box;
426
- }
427
- .error-state p {
428
- color: var(--error-color, #ff6b6b);
429
- margin: 0 0 1rem;
430
- }
431
- .error-state button {
432
- padding: 0.5rem 1rem;
433
- background: var(--error-color, #ff6b6b);
434
- color: white;
435
- border: none;
436
- border-radius: 4px;
437
- cursor: pointer;
438
- }
439
- .error-state button:hover {
440
- background: var(--error-color-hover, #ff5252);
441
- }
442
543
  </style>
@@ -78,6 +78,6 @@ type $$ComponentProps = {
78
78
  on_fullscreen_change?: (data: BZHandlerData) => void;
79
79
  on_hover?: (data: BZHoverData | null) => void;
80
80
  } & HTMLAttributes<HTMLDivElement>;
81
- declare const BrillouinZone: import("svelte").Component<$$ComponentProps, {}, "height" | "width" | "dragover" | "fullscreen" | "structure" | "hovered" | "controls_open" | "camera_projection" | "info_pane_open" | "loading" | "error_msg" | "wrapper" | "png_dpi" | "bz_order" | "surface_color" | "surface_opacity" | "edge_color" | "edge_width" | "show_vectors" | "show_ibz" | "ibz_color" | "ibz_opacity" | "bz_data" | "vector_scale" | "ibz_data">;
81
+ declare const BrillouinZone: import("svelte").Component<$$ComponentProps, {}, "structure" | "height" | "width" | "dragover" | "fullscreen" | "hovered" | "controls_open" | "loading" | "camera_projection" | "vector_scale" | "info_pane_open" | "wrapper" | "png_dpi" | "error_msg" | "bz_order" | "surface_color" | "surface_opacity" | "edge_color" | "edge_width" | "show_vectors" | "show_ibz" | "ibz_color" | "ibz_opacity" | "bz_data" | "ibz_data">;
82
82
  type BrillouinZone = ReturnType<typeof BrillouinZone>;
83
83
  export default BrillouinZone;
@@ -1,8 +1,35 @@
1
- <script lang="ts">import SettingsSection from '../layout/SettingsSection.svelte';
2
- import DraggablePane from '../overlays/DraggablePane.svelte';
3
- let { controls_open = $bindable(false), bz_order = $bindable(1), surface_color = $bindable(`#4488ff`), surface_opacity = $bindable(0.3), edge_color = $bindable(`#000000`), edge_width = $bindable(0.05), show_vectors = $bindable(true), camera_projection = $bindable(`perspective`),
4
- // Irreducible BZ options
5
- show_ibz = $bindable(false), ibz_color = $bindable(`#ff8844`), ibz_opacity = $bindable(0.5), } = $props();
1
+ <script lang="ts">
2
+ import SettingsSection from '../layout/SettingsSection.svelte'
3
+ import DraggablePane from '../overlays/DraggablePane.svelte'
4
+ import type { CameraProjection } from '../settings'
5
+
6
+ let {
7
+ controls_open = $bindable(false),
8
+ bz_order = $bindable(1),
9
+ surface_color = $bindable(`#4488ff`),
10
+ surface_opacity = $bindable(0.3),
11
+ edge_color = $bindable(`#000000`),
12
+ edge_width = $bindable(0.05),
13
+ show_vectors = $bindable(true),
14
+ camera_projection = $bindable(`perspective`),
15
+ // Irreducible BZ options
16
+ show_ibz = $bindable(false),
17
+ ibz_color = $bindable(`#ff8844`),
18
+ ibz_opacity = $bindable(0.5),
19
+ }: {
20
+ controls_open?: boolean
21
+ bz_order?: number
22
+ surface_color?: string
23
+ surface_opacity?: number
24
+ edge_color?: string
25
+ edge_width?: number
26
+ show_vectors?: boolean
27
+ camera_projection?: CameraProjection
28
+ // Irreducible BZ options
29
+ show_ibz?: boolean
30
+ ibz_color?: string
31
+ ibz_opacity?: number
32
+ } = $props()
6
33
  </script>
7
34
 
8
35
  <DraggablePane