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,59 +1,150 @@
1
- <script lang="ts">import { AXIS_COLORS, NEG_AXIS_COLORS } from '../colors';
2
- import * as math from '../math';
3
- import { DEFAULTS } from '../settings';
4
- import Arrow from '../structure/Arrow.svelte';
5
- import Cylinder from '../structure/Cylinder.svelte';
6
- import { T, useThrelte } from '@threlte/core';
7
- import * as extras from '@threlte/extras';
8
- import { BufferAttribute, BufferGeometry, Vector3 } from 'three';
9
- let { bz_data = $bindable(), camera_position = $bindable(), camera_projection = $bindable(`perspective`), 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),
10
- // Irreducible BZ options
11
- show_ibz = false, ibz_data = null, ibz_color = `#ff8844`, ibz_opacity = 0.5, rotation_damping = DEFAULTS.structure.rotation_damping, max_zoom = DEFAULTS.structure.max_zoom, min_zoom = DEFAULTS.structure.min_zoom, rotate_speed = DEFAULTS.structure.rotate_speed, zoom_speed = DEFAULTS.structure.zoom_speed, pan_speed = DEFAULTS.structure.pan_speed, zoom_to_cursor = DEFAULTS.structure.zoom_to_cursor, fov = DEFAULTS.structure.fov, initial_zoom = DEFAULTS.structure.initial_zoom, ambient_light = DEFAULTS.structure.ambient_light, directional_light = DEFAULTS.structure.directional_light, gizmo = DEFAULTS.structure.show_gizmo, auto_rotate = DEFAULTS.structure.auto_rotate, camera_is_moving = $bindable(false), scene = $bindable(), camera = $bindable(), k_path_points = [], k_path_labels = [], hovered_k_point = null, hovered_qpoint_index = null, hover_data = $bindable(null), } = $props();
12
- const threlte = useThrelte();
13
- $effect(() => {
14
- scene = threlte.scene;
15
- camera = threlte.camera.current;
1
+ <script lang="ts">
2
+ import { AXIS_COLORS, NEG_AXIS_COLORS } from '../colors'
3
+ import type { Vec3 } from '../math'
4
+ import * as math from '../math'
5
+ import { type CameraProjection, DEFAULTS } from '../settings'
6
+ import Arrow from '../structure/Arrow.svelte'
7
+ import Cylinder from '../structure/Cylinder.svelte'
8
+ import { T, useThrelte } from '@threlte/core'
9
+ import * as extras from '@threlte/extras'
10
+ import type { ComponentProps } from 'svelte'
11
+ import type { Camera, Scene } from 'three'
12
+ import { BufferAttribute, BufferGeometry, Vector3 } from 'three'
13
+ import type { BrillouinZoneData, BZHoverData, IrreducibleBZData } from './types'
14
+
15
+ // Threlte pointer event type for mesh interactions
16
+ type ThreltePointerEvent = { point: Vector3; nativeEvent: PointerEvent }
17
+
18
+ let {
19
+ bz_data = $bindable(),
20
+ camera_position = $bindable(),
21
+ camera_projection = $bindable(`perspective`),
22
+ surface_color = $bindable(`#4488ff`),
23
+ surface_opacity = $bindable(0.3),
24
+ edge_color = $bindable(`#000000`),
25
+ edge_width = $bindable(0.05),
26
+ show_vectors = $bindable(true),
27
+ vector_scale = $bindable(1.0),
28
+ // Irreducible BZ options
29
+ show_ibz = false,
30
+ ibz_data = null as IrreducibleBZData | null,
31
+ ibz_color = `#ff8844`,
32
+ ibz_opacity = 0.5,
33
+ rotation_damping = DEFAULTS.structure.rotation_damping,
34
+ max_zoom = DEFAULTS.structure.max_zoom,
35
+ min_zoom = DEFAULTS.structure.min_zoom,
36
+ rotate_speed = DEFAULTS.structure.rotate_speed,
37
+ zoom_speed = DEFAULTS.structure.zoom_speed,
38
+ pan_speed = DEFAULTS.structure.pan_speed,
39
+ zoom_to_cursor = DEFAULTS.structure.zoom_to_cursor,
40
+ fov = DEFAULTS.structure.fov,
41
+ initial_zoom = DEFAULTS.structure.initial_zoom,
42
+ ambient_light = DEFAULTS.structure.ambient_light,
43
+ directional_light = DEFAULTS.structure.directional_light,
44
+ gizmo = DEFAULTS.structure.show_gizmo,
45
+ auto_rotate = DEFAULTS.structure.auto_rotate,
46
+ camera_is_moving = $bindable(false),
47
+ scene = $bindable(),
48
+ camera = $bindable(),
49
+ k_path_points = [],
50
+ k_path_labels = [],
51
+ hovered_k_point = null,
52
+ hovered_qpoint_index = null,
53
+ hover_data = $bindable<BZHoverData | null>(null),
54
+ }: {
55
+ bz_data?: BrillouinZoneData
56
+ camera_position?: Vec3 | undefined
57
+ camera_projection?: CameraProjection
58
+ surface_color?: string
59
+ surface_opacity?: number
60
+ edge_color?: string
61
+ edge_width?: number
62
+ show_vectors?: boolean
63
+ vector_scale?: number
64
+ // Irreducible BZ options
65
+ show_ibz?: boolean
66
+ ibz_data?: IrreducibleBZData | null
67
+ ibz_color?: string
68
+ ibz_opacity?: number
69
+ rotation_damping?: number
70
+ max_zoom?: number
71
+ min_zoom?: number
72
+ rotate_speed?: number
73
+ zoom_speed?: number
74
+ pan_speed?: number
75
+ zoom_to_cursor?: boolean
76
+ fov?: number
77
+ initial_zoom?: number
78
+ ambient_light?: number
79
+ directional_light?: number
80
+ gizmo?: boolean | ComponentProps<typeof extras.Gizmo>
81
+ auto_rotate?: number
82
+ camera_is_moving?: boolean
83
+ scene?: Scene
84
+ camera?: Camera
85
+ k_path_points?: Vec3[]
86
+ k_path_labels?: { position: Vec3; label: string | null }[]
87
+ hovered_k_point?: Vec3 | null
88
+ hovered_qpoint_index?: number | null
89
+ hover_data?: BZHoverData | null
90
+ } = $props()
91
+
92
+ const threlte = useThrelte()
93
+ $effect(() => {
94
+ scene = threlte.scene
95
+ camera = threlte.camera.current
16
96
  if (threlte.renderer) {
17
- Object.assign(threlte.renderer.domElement, { __renderer: threlte.renderer });
97
+ Object.assign(threlte.renderer.domElement, { __renderer: threlte.renderer })
18
98
  }
19
- });
20
- extras.interactivity();
21
- // Compute centroid of BZ vertices for proper rotation center
22
- const rotation_target = $derived.by(() => {
23
- if (!bz_data?.vertices || bz_data.vertices.length === 0)
24
- return [0, 0, 0];
25
- const sum = bz_data.vertices.reduce((acc, v) => math.add(acc, v), [0, 0, 0]);
26
- return math.scale(sum, 1 / bz_data.vertices.length);
27
- });
28
- // BZ size for camera positioning: average magnitude of k-vectors
29
- const bz_size = $derived.by(() => {
30
- if (!bz_data?.k_lattice)
31
- return 10;
32
- const mags = bz_data.k_lattice.map((vec) => Math.hypot(...vec));
33
- return mags.reduce((sum, mag) => sum + mag, 0) / 3;
34
- });
35
- const computed_camera_position = $derived.by(() => camera_position || [10, 3, 8].map((x) => x * Math.max(1, bz_size)));
36
- const gizmo_props = $derived({
99
+ })
100
+
101
+ extras.interactivity()
102
+
103
+ // Compute centroid of BZ vertices for proper rotation center
104
+ const rotation_target = $derived.by((): Vec3 => {
105
+ if (!bz_data?.vertices || bz_data.vertices.length === 0) return [0, 0, 0]
106
+ const sum = bz_data.vertices.reduce(
107
+ (acc, v) => math.add(acc, v),
108
+ [0, 0, 0] as Vec3,
109
+ )
110
+ return math.scale(sum, 1 / bz_data.vertices.length)
111
+ })
112
+
113
+ // BZ size for camera positioning: average magnitude of k-vectors
114
+ const bz_size = $derived.by(() => {
115
+ if (!bz_data?.k_lattice) return 10
116
+ const mags = bz_data.k_lattice.map((vec) => Math.hypot(...vec))
117
+ return mags.reduce((sum, mag) => sum + mag, 0) / 3
118
+ })
119
+
120
+ const computed_camera_position = $derived.by(() =>
121
+ camera_position || ([10, 3, 8].map((x) => x * Math.max(1, bz_size)) as Vec3)
122
+ )
123
+
124
+ const gizmo_props = $derived({
37
125
  background: { enabled: false },
38
126
  className: `responsive-gizmo`,
39
- ...Object.fromEntries([...AXIS_COLORS, ...NEG_AXIS_COLORS].map(([axis, color, hover]) => [
127
+ ...Object.fromEntries(
128
+ [...AXIS_COLORS, ...NEG_AXIS_COLORS].map(([axis, color, hover]) => [
40
129
  axis,
41
130
  {
42
- color,
43
- labelColor: `#111`,
44
- opacity: axis.startsWith(`n`) ? 0.9 : 0.8,
45
- hover: {
46
- color: hover,
47
- labelColor: `#222`,
48
- opacity: axis.startsWith(`n`) ? 1 : 0.9,
49
- },
131
+ color,
132
+ labelColor: `#111`,
133
+ opacity: axis.startsWith(`n`) ? 0.9 : 0.8,
134
+ hover: {
135
+ color: hover,
136
+ labelColor: `#222`,
137
+ opacity: axis.startsWith(`n`) ? 1 : 0.9,
138
+ },
50
139
  },
51
- ])),
140
+ ]),
141
+ ),
52
142
  ...(typeof gizmo === `object` ? gizmo : {}),
53
143
  offset: { left: 5, bottom: 5 },
54
- });
55
- const is_ortho = $derived(camera_projection === `orthographic`);
56
- const orbit_controls_props = $derived({
144
+ })
145
+
146
+ const is_ortho = $derived(camera_projection === `orthographic`)
147
+ const orbit_controls_props = $derived({
57
148
  position: [0, 0, 0],
58
149
  target: rotation_target,
59
150
  enableRotate: rotate_speed > 0,
@@ -71,134 +162,155 @@ const orbit_controls_props = $derived({
71
162
  dampingFactor: rotation_damping,
72
163
  onstart: () => (camera_is_moving = true),
73
164
  onend: () => (camera_is_moving = false),
74
- });
75
- const vector_colors = [`red`, `green`, `blue`];
76
- const vector_labels = [`b₁`, `b₂`, `b₃`];
77
- // Create mesh geometry from faces with fan triangulation
78
- function create_mesh_geometry(vertices, faces) {
79
- if (faces.length === 0)
80
- return null;
81
- const positions = [];
82
- const normals = [];
165
+ })
166
+
167
+ const vector_colors = [`red`, `green`, `blue`]
168
+ const vector_labels = [`b₁`, `b₂`, `b₃`]
169
+
170
+ // Create mesh geometry from faces with fan triangulation
171
+ function create_mesh_geometry(
172
+ vertices: Vec3[],
173
+ faces: number[][],
174
+ ): BufferGeometry | null {
175
+ if (faces.length === 0) return null
176
+
177
+ const positions: number[] = []
178
+ const normals: number[] = []
179
+
83
180
  for (const face of faces) {
84
- if (face.length < 3)
85
- continue;
86
- for (let face_idx = 1; face_idx < face.length - 1; face_idx++) {
87
- const indices = [face[0], face[face_idx], face[face_idx + 1]];
88
- if (indices.some((idx) => idx < 0 || idx >= vertices.length))
89
- continue;
90
- const [v0, v1, v2] = indices.map((idx) => vertices[idx]);
91
- positions.push(...v0, ...v1, ...v2);
92
- const e1 = math.subtract(v1, v0);
93
- const e2 = math.subtract(v2, v0);
94
- const normal_vec = math.cross_3d(e1, e2);
95
- const len = Math.hypot(...normal_vec);
96
- const norm = len > 1e-10 ? normal_vec.map((x) => x / len) : [0, 0, 0];
97
- normals.push(...norm, ...norm, ...norm);
98
- }
181
+ if (face.length < 3) continue
182
+ for (let face_idx = 1; face_idx < face.length - 1; face_idx++) {
183
+ const indices = [face[0], face[face_idx], face[face_idx + 1]]
184
+ if (indices.some((idx) => idx < 0 || idx >= vertices.length)) continue
185
+ const [v0, v1, v2] = indices.map((idx) => vertices[idx])
186
+ positions.push(...v0, ...v1, ...v2)
187
+
188
+ const e1: Vec3 = math.subtract(v1, v0)
189
+ const e2: Vec3 = math.subtract(v2, v0)
190
+ const normal_vec = math.cross_3d(e1, e2)
191
+ const len = Math.hypot(...normal_vec)
192
+ const norm = len > 1e-10 ? normal_vec.map((x) => x / len) : [0, 0, 0]
193
+ normals.push(...norm, ...norm, ...norm)
194
+ }
99
195
  }
100
- const geometry = new BufferGeometry();
101
- geometry.setAttribute(`position`, new BufferAttribute(new Float32Array(positions), 3));
102
- geometry.setAttribute(`normal`, new BufferAttribute(new Float32Array(normals), 3));
103
- geometry.computeBoundingSphere();
104
- return geometry;
105
- }
106
- const bz_geometry = $derived(bz_data ? create_mesh_geometry(bz_data.vertices, bz_data.faces) : null);
107
- const ibz_geometry = $derived(show_ibz && ibz_data
108
- ? create_mesh_geometry(ibz_data.vertices, ibz_data.faces)
109
- : null);
110
- // Separate effects to avoid disposing one geometry when only the other changes
111
- $effect(() => {
112
- const prev = bz_geometry;
113
- return () => prev?.dispose();
114
- });
115
- $effect(() => {
116
- const prev = ibz_geometry;
117
- return () => prev?.dispose();
118
- });
119
- // Compute inverse of k_lattice for Cartesian->fractional conversion
120
- const k_lattice_inv = $derived.by(() => {
121
- if (!bz_data?.k_lattice)
122
- return null;
196
+
197
+ const geometry = new BufferGeometry()
198
+ geometry.setAttribute(
199
+ `position`,
200
+ new BufferAttribute(new Float32Array(positions), 3),
201
+ )
202
+ geometry.setAttribute(`normal`, new BufferAttribute(new Float32Array(normals), 3))
203
+ geometry.computeBoundingSphere()
204
+ return geometry
205
+ }
206
+
207
+ const bz_geometry = $derived(
208
+ bz_data ? create_mesh_geometry(bz_data.vertices, bz_data.faces) : null,
209
+ )
210
+ const ibz_geometry = $derived(
211
+ show_ibz && ibz_data
212
+ ? create_mesh_geometry(ibz_data.vertices, ibz_data.faces)
213
+ : null,
214
+ )
215
+
216
+ // Separate effects to avoid disposing one geometry when only the other changes
217
+ $effect(() => {
218
+ const prev = bz_geometry
219
+ return () => prev?.dispose()
220
+ })
221
+ $effect(() => {
222
+ const prev = ibz_geometry
223
+ return () => prev?.dispose()
224
+ })
225
+
226
+ // Compute inverse of k_lattice for Cartesian->fractional conversion
227
+ const k_lattice_inv = $derived.by(() => {
228
+ if (!bz_data?.k_lattice) return null
123
229
  try {
124
- return math.matrix_inverse_3x3(bz_data.k_lattice);
125
- }
126
- catch {
127
- return null;
230
+ return math.matrix_inverse_3x3(bz_data.k_lattice)
231
+ } catch {
232
+ return null
128
233
  }
129
- });
130
- // Convert Cartesian k-coordinates to fractional (reciprocal lattice units)
131
- function cartesian_to_fractional(cart) {
132
- if (!k_lattice_inv)
133
- return null;
134
- return math.mat3x3_vec3_multiply(k_lattice_inv, cart);
135
- }
136
- // Throttle state for pointer move events
137
- let last_hover_time = 0;
138
- let last_hover_mesh = null;
139
- const HOVER_THROTTLE_MS = 16; // ~60fps
140
- // Reset throttle when bz_data changes to ensure immediate response
141
- $effect(() => {
234
+ })
235
+
236
+ // Convert Cartesian k-coordinates to fractional (reciprocal lattice units)
237
+ function cartesian_to_fractional(cart: Vec3): Vec3 | null {
238
+ if (!k_lattice_inv) return null
239
+ return math.mat3x3_vec3_multiply(k_lattice_inv, cart)
240
+ }
241
+
242
+ // Throttle state for pointer move events
243
+ let last_hover_time = 0
244
+ let last_hover_mesh: `bz` | `ibz` | null = null
245
+ const HOVER_THROTTLE_MS = 16 // ~60fps
246
+
247
+ // Reset throttle when bz_data changes to ensure immediate response
248
+ $effect(() => {
142
249
  if (bz_data) {
143
- last_hover_time = 0;
144
- last_hover_mesh = null;
250
+ last_hover_time = 0
251
+ last_hover_mesh = null
145
252
  }
146
- });
147
- // Track IBZ hover state - IBZ takes priority over BZ
148
- let ibz_hovered = false;
149
- $effect(() => {
253
+ })
254
+
255
+ // Track IBZ hover state - IBZ takes priority over BZ
256
+ let ibz_hovered = false
257
+ $effect(() => {
150
258
  if (!show_ibz) {
151
- ibz_hovered = false;
152
- // Clear hover tooltip if it was showing IBZ data
153
- if (hover_data?.is_ibz)
154
- hover_data = null;
259
+ ibz_hovered = false
260
+ // Clear hover tooltip if it was showing IBZ data
261
+ if (hover_data?.is_ibz) hover_data = null
155
262
  }
156
- });
157
- // Create hover data from pointer event
158
- function create_hover_data(event, is_ibz) {
159
- if (!bz_data)
160
- return null;
161
- const position_cartesian = [event.point.x, event.point.y, event.point.z];
162
- const position_fractional = cartesian_to_fractional(position_cartesian);
163
- const { clientX, clientY } = event.nativeEvent;
164
- const ibz_vol = ibz_data?.volume ?? null;
263
+ })
264
+
265
+ // Create hover data from pointer event
266
+ function create_hover_data(
267
+ event: ThreltePointerEvent,
268
+ is_ibz: boolean,
269
+ ): BZHoverData | null {
270
+ if (!bz_data) return null
271
+
272
+ const position_cartesian: Vec3 = [event.point.x, event.point.y, event.point.z]
273
+ const position_fractional = cartesian_to_fractional(position_cartesian)
274
+
275
+ const { clientX, clientY } = event.nativeEvent
276
+ const ibz_vol = ibz_data?.volume ?? null
165
277
  // Round to nearest integer since symmetry multiplicity is the point group order
166
278
  const symmetry_multiplicity = ibz_vol != null && ibz_vol > 0
167
- ? Math.round(bz_data.volume / ibz_vol)
168
- : null;
279
+ ? Math.round(bz_data.volume / ibz_vol)
280
+ : null
281
+
169
282
  return {
170
- position_cartesian,
171
- position_fractional,
172
- screen_position: { x: clientX, y: clientY },
173
- is_ibz,
174
- bz_order: bz_data.order,
175
- bz_volume: bz_data.volume,
176
- ibz_volume: ibz_vol,
177
- symmetry_multiplicity,
178
- };
179
- }
180
- // Throttled hover handler - IBZ takes priority over BZ
181
- function handle_hover(event, is_ibz) {
182
- if (is_ibz)
183
- ibz_hovered = true;
184
- else if (ibz_hovered)
185
- return; // BZ defers to IBZ
186
- const mesh = is_ibz ? `ibz` : `bz`;
187
- const now = performance.now();
283
+ position_cartesian,
284
+ position_fractional,
285
+ screen_position: { x: clientX, y: clientY },
286
+ is_ibz,
287
+ bz_order: bz_data.order,
288
+ bz_volume: bz_data.volume,
289
+ ibz_volume: ibz_vol,
290
+ symmetry_multiplicity,
291
+ }
292
+ }
293
+
294
+ // Throttled hover handler - IBZ takes priority over BZ
295
+ function handle_hover(event: ThreltePointerEvent, is_ibz: boolean): void {
296
+ if (is_ibz) ibz_hovered = true
297
+ else if (ibz_hovered) return // BZ defers to IBZ
298
+
299
+ const mesh = is_ibz ? `ibz` : `bz`
300
+ const now = performance.now()
188
301
  // Bypass throttle when switching meshes for responsive transitions
189
- if (last_hover_mesh === mesh && now - last_hover_time < HOVER_THROTTLE_MS)
190
- return;
191
- last_hover_time = now;
192
- last_hover_mesh = mesh;
193
- hover_data = create_hover_data(event, is_ibz);
194
- }
195
- // Leave handler - IBZ clears state, BZ only clears if IBZ not hovered
196
- function handle_leave(is_ibz) {
197
- if (is_ibz)
198
- ibz_hovered = false;
199
- if (is_ibz || !ibz_hovered)
200
- hover_data = null;
201
- }
302
+ if (last_hover_mesh === mesh && now - last_hover_time < HOVER_THROTTLE_MS) return
303
+
304
+ last_hover_time = now
305
+ last_hover_mesh = mesh
306
+ hover_data = create_hover_data(event, is_ibz)
307
+ }
308
+
309
+ // Leave handler - IBZ clears state, BZ only clears if IBZ not hovered
310
+ function handle_leave(is_ibz: boolean): void {
311
+ if (is_ibz) ibz_hovered = false
312
+ if (is_ibz || !ibz_hovered) hover_data = null
313
+ }
202
314
  </script>
203
315
 
204
316
  {#if camera_projection === `perspective`}
@@ -243,7 +355,7 @@ function handle_leave(is_ibz) {
243
355
  {/if}
244
356
 
245
357
  <!-- BZ edges -->
246
- {#each bz_data.edges as edge_segment (JSON.stringify(edge_segment))}
358
+ {#each bz_data.edges as edge_segment, edge_idx (`bz-edge-${edge_idx}`)}
247
359
  {@const [from, to] = edge_segment}
248
360
  <Cylinder {from} {to} thickness={edge_width} color={edge_color} />
249
361
  {/each}
@@ -267,7 +379,7 @@ function handle_leave(is_ibz) {
267
379
 
268
380
  <!-- IBZ edges -->
269
381
  {#if show_ibz && ibz_data}
270
- {#each ibz_data.edges as edge_segment (JSON.stringify(edge_segment))}
382
+ {#each ibz_data.edges as edge_segment, edge_idx (`ibz-edge-${edge_idx}`)}
271
383
  {@const [from, to] = edge_segment}
272
384
  <Cylinder {from} {to} thickness={edge_width * 1.5} color={ibz_color} />
273
385
  {/each}
@@ -43,6 +43,6 @@ type $$ComponentProps = {
43
43
  hovered_qpoint_index?: number | null;
44
44
  hover_data?: BZHoverData | null;
45
45
  };
46
- declare const BrillouinZoneScene: import("svelte").Component<$$ComponentProps, {}, "camera_position" | "camera_projection" | "camera_is_moving" | "scene" | "camera" | "surface_color" | "surface_opacity" | "edge_color" | "edge_width" | "show_vectors" | "bz_data" | "vector_scale" | "hover_data">;
46
+ declare const BrillouinZoneScene: import("svelte").Component<$$ComponentProps, {}, "camera_position" | "camera_projection" | "vector_scale" | "camera" | "scene" | "camera_is_moving" | "surface_color" | "surface_opacity" | "edge_color" | "edge_width" | "show_vectors" | "bz_data" | "hover_data">;
47
47
  type BrillouinZoneScene = ReturnType<typeof BrillouinZoneScene>;
48
48
  export default BrillouinZoneScene;
@@ -1,10 +1,20 @@
1
- <script lang="ts">// Tooltip component for Brillouin zone hover information
2
- // Displays k-coordinates, BZ order, volume, and IBZ-specific info
3
- import { format_num, format_vec3 } from '../labels';
4
- import { TooltipContent } from '../tooltip';
5
- let { hover_data, tooltip, } = $props();
6
- // Ordinal for BZ order (only 1-3 in practice)
7
- const ordinal = (num) => `${num}${[`th`, `st`, `nd`, `rd`][num] ?? `th`}`;
1
+ <script lang="ts">
2
+ // Tooltip component for Brillouin zone hover information
3
+ // Displays k-coordinates, BZ order, volume, and IBZ-specific info
4
+ import { format_num, format_vec3 } from '../labels'
5
+ import { TooltipContent } from '../tooltip'
6
+ import type { BZHoverData, BZTooltipProp } from './types'
7
+
8
+ let {
9
+ hover_data,
10
+ tooltip,
11
+ }: {
12
+ hover_data: BZHoverData
13
+ tooltip?: BZTooltipProp
14
+ } = $props()
15
+
16
+ // Ordinal for BZ order (only 1-3 in practice)
17
+ const ordinal = (num: number) => `${num}${[`th`, `st`, `nd`, `rd`][num] ?? `th`}`
8
18
  </script>
9
19
 
10
20
  <TooltipContent data={hover_data} snippet_arg={{ hover_data }} {tooltip}>
@@ -29,11 +29,14 @@ export function extract_point_group_from_operations(operations) {
29
29
  }
30
30
  // Multiply two 3x3 matrices: C = A · B
31
31
  function mat3x3_multiply(A, B) {
32
- const result = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];
32
+ const result = [
33
+ [0, 0, 0],
34
+ [0, 0, 0],
35
+ [0, 0, 0],
36
+ ];
33
37
  for (let row = 0; row < 3; row++) {
34
38
  for (let col = 0; col < 3; col++) {
35
- result[row][col] = A[row][0] * B[0][col] + A[row][1] * B[1][col] +
36
- A[row][2] * B[2][col];
39
+ result[row][col] = A[row][0] * B[0][col] + A[row][1] * B[1][col] + A[row][2] * B[2][col];
37
40
  }
38
41
  }
39
42
  return result;
@@ -164,7 +167,8 @@ max_planes_by_order = { 1: 26, 2: 80, 3: 150 }) {
164
167
  // Count how many planes this vertex is beyond (with early termination)
165
168
  let beyond_count = 0;
166
169
  for (let p_idx = 0; p_idx < normals.length; p_idx++) {
167
- const dot = vertex[0] * normals[p_idx][0] + vertex[1] * normals[p_idx][1] +
170
+ const dot = vertex[0] * normals[p_idx][0] +
171
+ vertex[1] * normals[p_idx][1] +
168
172
  vertex[2] * normals[p_idx][2];
169
173
  if (dot > distances[p_idx] + TOL) {
170
174
  beyond_count++;
@@ -207,9 +211,10 @@ export function compute_convex_hull(vertices, edge_sharp_angle_deg = 5) {
207
211
  const vert_map = new Map();
208
212
  for (let idx_vertex = 0; idx_vertex < pos.count; idx_vertex++) {
209
213
  const vert = [pos.getX(idx_vertex), pos.getY(idx_vertex), pos.getZ(idx_vertex)];
210
- const existing_idx = unique_verts.findIndex((u) => Math.abs(u[0] - vert[0]) < TOL && Math.abs(u[1] - vert[1]) < TOL &&
214
+ const existing_idx = unique_verts.findIndex((u) => Math.abs(u[0] - vert[0]) < TOL &&
215
+ Math.abs(u[1] - vert[1]) < TOL &&
211
216
  Math.abs(u[2] - vert[2]) < TOL);
212
- vert_map.set(idx_vertex, existing_idx === -1 ? (unique_verts.push(vert) - 1) : existing_idx);
217
+ vert_map.set(idx_vertex, existing_idx === -1 ? unique_verts.push(vert) - 1 : existing_idx);
213
218
  }
214
219
  // Build faces with deduplicated vertex indices
215
220
  const faces = [];