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,127 +1,152 @@
1
- <script lang="ts">import { T, useThrelte } from '@threlte/core';
2
- import * as THREE from 'three';
3
- import { Line2 } from 'three/examples/jsm/lines/Line2.js';
4
- import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry.js';
5
- import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js';
6
- import { create_to_threejs, span_or } from './reference-line';
7
- let { ref_line, scene_size = [10, 10, 5], ranges } = $props();
8
- const { size } = useThrelte();
9
- let [scene_x, scene_y, scene_z] = $derived(scene_size);
10
- let { x: x_range, y: y_range, z: z_range } = $derived(ranges);
11
- // Transform data coords to Three.js coordinates
12
- let to_coords = $derived.by(() => {
1
+ <script lang="ts">
2
+ // ReferenceLine3D: 3D reference lines for axis-parallel, segments, and extended lines
3
+ // Uses Line2 for proper variable-width lines (WebGL ignores linewidth on basic lines)
4
+ import type { Vec3 } from '../math'
5
+ import { T, useThrelte } from '@threlte/core'
6
+ import * as THREE from 'three'
7
+ import { Line2 } from 'three/examples/jsm/lines/Line2.js'
8
+ import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry.js'
9
+ import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js'
10
+ import { create_to_threejs, span_or } from './reference-line'
11
+ import type { RefLine3D } from './types'
12
+
13
+ let { ref_line, scene_size = [10, 10, 5], ranges }: {
14
+ ref_line: RefLine3D
15
+ scene_size?: Vec3
16
+ ranges: { x: [number, number]; y: [number, number]; z: [number, number] }
17
+ } = $props()
18
+
19
+ const { size } = useThrelte()
20
+ let [scene_x, scene_y, scene_z] = $derived(scene_size)
21
+ let { x: x_range, y: y_range, z: z_range } = $derived(ranges)
22
+
23
+ // Transform data coords to Three.js coordinates
24
+ let to_coords = $derived.by(() => {
13
25
  const transform = create_to_threejs({
14
- scene_x,
15
- scene_y,
16
- scene_z,
17
- x_range,
18
- y_range,
19
- z_range,
20
- });
21
- return (ux, uy, uz) => transform(ux, uy, uz);
22
- });
23
- // Compute line endpoints based on type
24
- let endpoints = $derived.by(() => {
25
- if (ref_line.visible === false)
26
- return null;
27
- const [x_min, x_max] = span_or(ref_line.x_span, x_range);
28
- const [y_min, y_max] = span_or(ref_line.y_span, y_range);
29
- const [z_min, z_max] = span_or(ref_line.z_span, z_range);
30
- switch (ref_line.type) {
26
+ scene_x,
27
+ scene_y,
28
+ scene_z,
29
+ x_range,
30
+ y_range,
31
+ z_range,
32
+ })
33
+ return (ux: number, uy: number, uz: number) => transform(ux, uy, uz)
34
+ })
35
+
36
+ // Compute line endpoints based on type
37
+ let endpoints = $derived.by(
38
+ ():
39
+ | [{ x: number; y: number; z: number }, { x: number; y: number; z: number }]
40
+ | null => {
41
+ if (ref_line.visible === false) return null
42
+ const [x_min, x_max] = span_or(ref_line.x_span, x_range)
43
+ const [y_min, y_max] = span_or(ref_line.y_span, y_range)
44
+ const [z_min, z_max] = span_or(ref_line.z_span, z_range)
45
+
46
+ switch (ref_line.type) {
31
47
  case `x-axis`:
32
- return [
33
- to_coords(x_min, ref_line.y, ref_line.z),
34
- to_coords(x_max, ref_line.y, ref_line.z),
35
- ];
48
+ return [
49
+ to_coords(x_min, ref_line.y, ref_line.z),
50
+ to_coords(x_max, ref_line.y, ref_line.z),
51
+ ]
36
52
  case `y-axis`:
37
- return [
38
- to_coords(ref_line.x, y_min, ref_line.z),
39
- to_coords(ref_line.x, y_max, ref_line.z),
40
- ];
53
+ return [
54
+ to_coords(ref_line.x, y_min, ref_line.z),
55
+ to_coords(ref_line.x, y_max, ref_line.z),
56
+ ]
41
57
  case `z-axis`:
42
- return [
43
- to_coords(ref_line.x, ref_line.y, z_min),
44
- to_coords(ref_line.x, ref_line.y, z_max),
45
- ];
58
+ return [
59
+ to_coords(ref_line.x, ref_line.y, z_min),
60
+ to_coords(ref_line.x, ref_line.y, z_max),
61
+ ]
46
62
  case `segment`:
47
- return [to_coords(...ref_line.p1), to_coords(...ref_line.p2)];
63
+ return [to_coords(...ref_line.p1), to_coords(...ref_line.p2)]
48
64
  case `line`: {
49
- // Extend line through two points to bounding box
50
- const [p1x, p1y, p1z] = ref_line.p1;
51
- const [dx, dy, dz] = [
52
- ref_line.p2[0] - p1x,
53
- ref_line.p2[1] - p1y,
54
- ref_line.p2[2] - p1z,
55
- ];
56
- // Find t values at each boundary plane
57
- const t_values = [
58
- ...(dx !== 0 ? [(x_min - p1x) / dx, (x_max - p1x) / dx] : []),
59
- ...(dy !== 0 ? [(y_min - p1y) / dy, (y_max - p1y) / dy] : []),
60
- ...(dz !== 0 ? [(z_min - p1z) / dz, (z_max - p1z) / dz] : []),
61
- ];
62
- // Keep only t values where the resulting point is inside bounds
63
- const eps = 1e-6;
64
- const valid_t = t_values.filter((t) => {
65
- const [px, py, pz] = [p1x + t * dx, p1y + t * dy, p1z + t * dz];
66
- return px >= x_min - eps && px <= x_max + eps &&
67
- py >= y_min - eps && py <= y_max + eps && pz >= z_min - eps &&
68
- pz <= z_max + eps;
69
- });
70
- if (valid_t.length < 2)
71
- return null;
72
- const t_min = Math.min(...valid_t);
73
- const t_max = Math.max(...valid_t);
74
- return [
75
- to_coords(p1x + t_min * dx, p1y + t_min * dy, p1z + t_min * dz),
76
- to_coords(p1x + t_max * dx, p1y + t_max * dy, p1z + t_max * dz),
77
- ];
65
+ // Extend line through two points to bounding box
66
+ const [p1x, p1y, p1z] = ref_line.p1
67
+ const [dx, dy, dz] = [
68
+ ref_line.p2[0] - p1x,
69
+ ref_line.p2[1] - p1y,
70
+ ref_line.p2[2] - p1z,
71
+ ]
72
+ // Find t values at each boundary plane
73
+ const t_values = [
74
+ ...(dx !== 0 ? [(x_min - p1x) / dx, (x_max - p1x) / dx] : []),
75
+ ...(dy !== 0 ? [(y_min - p1y) / dy, (y_max - p1y) / dy] : []),
76
+ ...(dz !== 0 ? [(z_min - p1z) / dz, (z_max - p1z) / dz] : []),
77
+ ]
78
+ // Keep only t values where the resulting point is inside bounds
79
+ const eps = 1e-6
80
+ const valid_t = t_values.filter((t) => {
81
+ const [px, py, pz] = [p1x + t * dx, p1y + t * dy, p1z + t * dz]
82
+ return px >= x_min - eps && px <= x_max + eps &&
83
+ py >= y_min - eps && py <= y_max + eps && pz >= z_min - eps &&
84
+ pz <= z_max + eps
85
+ })
86
+ if (valid_t.length < 2) return null
87
+ const t_min = Math.min(...valid_t)
88
+ const t_max = Math.max(...valid_t)
89
+ return [
90
+ to_coords(p1x + t_min * dx, p1y + t_min * dy, p1z + t_min * dz),
91
+ to_coords(p1x + t_max * dx, p1y + t_max * dy, p1z + t_max * dz),
92
+ ]
78
93
  }
79
- }
80
- });
81
- // Line style (with defaults)
82
- let style = $derived({
94
+ }
95
+ },
96
+ )
97
+
98
+ // Line style (with defaults)
99
+ let style = $derived({
83
100
  color: ref_line.style?.color ?? `white`,
84
101
  opacity: ref_line.style?.opacity ?? 1,
85
102
  width: ref_line.style?.width ?? 2,
86
103
  dashed: !!ref_line.style?.dash,
87
- });
88
- // Create Line2 with LineGeometry and LineMaterial for proper variable-width lines
89
- let line2 = $state(null);
90
- let material = $state(null);
91
- $effect(() => {
104
+ })
105
+
106
+ // Create Line2 with LineGeometry and LineMaterial for proper variable-width lines
107
+ let line2: Line2 | null = $state(null)
108
+ let material: LineMaterial | null = $state(null)
109
+
110
+ $effect(() => {
92
111
  if (!endpoints) {
93
- line2 = null;
94
- material = null;
95
- return;
112
+ line2 = null
113
+ material = null
114
+ return
96
115
  }
97
- const [p1, p2] = endpoints;
98
- const geo = new LineGeometry();
99
- geo.setPositions([p1.x, p1.y, p1.z, p2.x, p2.y, p2.z]);
116
+ const [p1, p2] = endpoints
117
+
118
+ const geo = new LineGeometry()
119
+ geo.setPositions([p1.x, p1.y, p1.z, p2.x, p2.y, p2.z])
120
+
100
121
  const mat = new LineMaterial({
101
- color: new THREE.Color(style.color).getHex(),
102
- linewidth: style.width,
103
- transparent: style.opacity < 1,
104
- opacity: style.opacity,
105
- dashed: style.dashed,
106
- dashSize: 0.3,
107
- gapSize: 0.1,
108
- resolution: new THREE.Vector2($size.width || 1, $size.height || 1),
109
- });
110
- const line = new Line2(geo, mat);
111
- line.computeLineDistances(); // Required for dashed lines
112
- material = mat;
113
- line2 = line;
122
+ color: new THREE.Color(style.color).getHex(),
123
+ linewidth: style.width,
124
+ transparent: style.opacity < 1,
125
+ opacity: style.opacity,
126
+ dashed: style.dashed,
127
+ dashSize: 0.3,
128
+ gapSize: 0.1,
129
+ resolution: new THREE.Vector2($size.width || 1, $size.height || 1),
130
+ })
131
+
132
+ const line = new Line2(geo, mat)
133
+ line.computeLineDistances() // Required for dashed lines
134
+
135
+ material = mat
136
+ line2 = line
137
+
114
138
  return () => {
115
- geo.dispose();
116
- mat.dispose();
117
- };
118
- });
119
- // Update material resolution when canvas size changes
120
- $effect(() => {
139
+ geo.dispose()
140
+ mat.dispose()
141
+ }
142
+ })
143
+
144
+ // Update material resolution when canvas size changes
145
+ $effect(() => {
121
146
  if (material) {
122
- material.resolution.set($size.width || 1, $size.height || 1);
147
+ material.resolution.set($size.width || 1, $size.height || 1)
123
148
  }
124
- });
149
+ })
125
150
  </script>
126
151
 
127
152
  {#if line2}
@@ -1,139 +1,162 @@
1
- <script lang="ts">import { cross_3d, normalize_vec3 } from '../math';
2
- import { T } from '@threlte/core';
3
- import * as THREE from 'three';
4
- import { create_to_threejs, span_or } from './reference-line';
5
- let { ref_plane, scene_size = [10, 10, 5], ranges } = $props();
6
- let [scene_x, scene_y, scene_z] = $derived(scene_size);
7
- let { x: x_range, y: y_range, z: z_range } = $derived(ranges);
8
- // Transform data coords to Three.js Vector3
9
- let to_vec3 = $derived.by(() => {
1
+ <script lang="ts">
2
+ // ReferencePlane: 3D reference planes (axis-aligned, normal-defined, or point-defined)
3
+ import type { Vec3 } from '../math'
4
+ import { cross_3d, normalize_vec3 } from '../math'
5
+ import { T } from '@threlte/core'
6
+ import * as THREE from 'three'
7
+ import { create_to_threejs, span_or } from './reference-line'
8
+ import type { RefPlane } from './types'
9
+
10
+ let { ref_plane, scene_size = [10, 10, 5], ranges }: {
11
+ ref_plane: RefPlane
12
+ scene_size?: Vec3
13
+ ranges: { x: [number, number]; y: [number, number]; z: [number, number] }
14
+ } = $props()
15
+
16
+ let [scene_x, scene_y, scene_z] = $derived(scene_size)
17
+ let { x: x_range, y: y_range, z: z_range } = $derived(ranges)
18
+
19
+ // Transform data coords to Three.js Vector3
20
+ let to_vec3 = $derived.by(() => {
10
21
  const transform = create_to_threejs({
11
- scene_x,
12
- scene_y,
13
- scene_z,
14
- x_range,
15
- y_range,
16
- z_range,
17
- });
18
- return (ux, uy, uz) => {
19
- const { x, y, z } = transform(ux, uy, uz);
20
- return new THREE.Vector3(x, y, z);
21
- };
22
- });
23
- // Apply span constraints or use full range
24
- let [x_min, x_max] = $derived(span_or(ref_plane.x_span, x_range));
25
- let [y_min, y_max] = $derived(span_or(ref_plane.y_span, y_range));
26
- let [z_min, z_max] = $derived(span_or(ref_plane.z_span, z_range));
27
- // Helper to create quad from 4 corner coords
28
- function quad(coords) {
29
- return create_quad_geometry(coords.map(([ux, uy, uz]) => to_vec3(ux, uy, uz)));
30
- }
31
- // Compute plane geometry based on type - returns result to use in $effect
32
- function compute_geometry() {
33
- if (ref_plane.visible === false)
34
- return null;
22
+ scene_x,
23
+ scene_y,
24
+ scene_z,
25
+ x_range,
26
+ y_range,
27
+ z_range,
28
+ })
29
+ return (ux: number, uy: number, uz: number) => {
30
+ const { x, y, z } = transform(ux, uy, uz)
31
+ return new THREE.Vector3(x, y, z)
32
+ }
33
+ })
34
+
35
+ // Apply span constraints or use full range
36
+ let [x_min, x_max] = $derived(span_or(ref_plane.x_span, x_range))
37
+ let [y_min, y_max] = $derived(span_or(ref_plane.y_span, y_range))
38
+ let [z_min, z_max] = $derived(span_or(ref_plane.z_span, z_range))
39
+
40
+ // Helper to create quad from 4 corner coords
41
+ const quad = (coords: Vec3[]) =>
42
+ create_quad_geometry(coords.map(([ux, uy, uz]) => to_vec3(ux, uy, uz)))
43
+
44
+ // Compute plane geometry based on type - returns result to use in $effect
45
+ function compute_geometry(): THREE.BufferGeometry | null {
46
+ if (ref_plane.visible === false) return null
47
+
35
48
  switch (ref_plane.type) {
36
- case `xy`: {
37
- const zval = ref_plane.z;
38
- return quad([
39
- [x_min, y_min, zval],
40
- [x_max, y_min, zval],
41
- [x_max, y_max, zval],
42
- [x_min, y_max, zval],
43
- ]);
44
- }
45
- case `xz`: {
46
- const yval = ref_plane.y;
47
- return quad([
48
- [x_min, yval, z_min],
49
- [x_max, yval, z_min],
50
- [x_max, yval, z_max],
51
- [x_min, yval, z_max],
52
- ]);
53
- }
54
- case `yz`: {
55
- const xval = ref_plane.x;
56
- return quad([
57
- [xval, y_min, z_min],
58
- [xval, y_max, z_min],
59
- [xval, y_max, z_max],
60
- [xval, y_min, z_max],
61
- ]);
62
- }
63
- case `normal`: {
64
- if (Math.hypot(...ref_plane.normal) < 1e-9)
65
- return null; // degenerate normal
66
- return create_plane_from_normal(ref_plane.normal, ref_plane.point);
67
- }
68
- case `points`: {
69
- const { p1, p2, p3 } = ref_plane;
70
- const v1 = [p2[0] - p1[0], p2[1] - p1[1], p2[2] - p1[2]];
71
- const v2 = [p3[0] - p1[0], p3[1] - p1[1], p3[2] - p1[2]];
72
- const cross = cross_3d(v1, v2);
73
- if (Math.hypot(...cross) < 1e-9)
74
- return null; // collinear points
75
- return create_plane_from_normal(normalize_vec3(cross), p1);
76
- }
77
- default:
78
- return null;
49
+ case `xy`: {
50
+ const zval = ref_plane.z
51
+ return quad([
52
+ [x_min, y_min, zval],
53
+ [x_max, y_min, zval],
54
+ [x_max, y_max, zval],
55
+ [x_min, y_max, zval],
56
+ ])
57
+ }
58
+ case `xz`: {
59
+ const yval = ref_plane.y
60
+ return quad([
61
+ [x_min, yval, z_min],
62
+ [x_max, yval, z_min],
63
+ [x_max, yval, z_max],
64
+ [x_min, yval, z_max],
65
+ ])
66
+ }
67
+ case `yz`: {
68
+ const xval = ref_plane.x
69
+ return quad([
70
+ [xval, y_min, z_min],
71
+ [xval, y_max, z_min],
72
+ [xval, y_max, z_max],
73
+ [xval, y_min, z_max],
74
+ ])
75
+ }
76
+ case `normal`: {
77
+ if (Math.hypot(...ref_plane.normal) < 1e-9) return null // degenerate normal
78
+ return create_plane_from_normal(ref_plane.normal, ref_plane.point)
79
+ }
80
+ case `points`: {
81
+ const { p1, p2, p3 } = ref_plane
82
+ const v1: Vec3 = [p2[0] - p1[0], p2[1] - p1[1], p2[2] - p1[2]]
83
+ const v2: Vec3 = [p3[0] - p1[0], p3[1] - p1[1], p3[2] - p1[2]]
84
+ const cross = cross_3d(v1, v2)
85
+ if (Math.hypot(...cross) < 1e-9) return null // collinear points
86
+ return create_plane_from_normal(normalize_vec3(cross), p1)
87
+ }
88
+ default:
89
+ return null
79
90
  }
80
- }
81
- // Create geometry with proper disposal on dependency change
82
- let geometry = $state(null);
83
- $effect(() => {
84
- const geo = compute_geometry();
85
- geometry = geo;
86
- return () => geo?.dispose();
87
- });
88
- // Create a quad geometry from 4 corners (two triangles: 0-1-2 and 0-2-3)
89
- function create_quad_geometry(corners) {
90
- const geo = new THREE.BufferGeometry();
91
- const [c0, c1, c2, c3] = corners;
92
- const verts = [c0, c1, c2, c0, c2, c3].flatMap((c) => [c.x, c.y, c.z]);
93
- geo.setAttribute(`position`, new THREE.BufferAttribute(new Float32Array(verts), 3));
94
- geo.computeVertexNormals();
95
- return geo;
96
- }
97
- // Create plane from normal and point, scaled to cover bounding box
98
- function create_plane_from_normal(normal, point) {
99
- const normalized = normalize_vec3(normal);
91
+ }
92
+
93
+ // Create geometry with proper disposal on dependency change
94
+ let geometry: THREE.BufferGeometry | null = $state(null)
95
+
96
+ $effect(() => {
97
+ const geo = compute_geometry()
98
+ geometry = geo
99
+ return () => geo?.dispose()
100
+ })
101
+
102
+ // Create a quad geometry from 4 corners (two triangles: 0-1-2 and 0-2-3)
103
+ function create_quad_geometry(corners: THREE.Vector3[]): THREE.BufferGeometry {
104
+ const geo = new THREE.BufferGeometry()
105
+ const [c0, c1, c2, c3] = corners
106
+ const verts = [c0, c1, c2, c0, c2, c3].flatMap((corner) => [corner.x, corner.y, corner.z])
107
+ geo.setAttribute(
108
+ `position`,
109
+ new THREE.BufferAttribute(new Float32Array(verts), 3),
110
+ )
111
+ geo.computeVertexNormals()
112
+ return geo
113
+ }
114
+
115
+ // Create plane from normal and point, scaled to cover bounding box
116
+ function create_plane_from_normal(normal: Vec3, point: Vec3): THREE.BufferGeometry {
117
+ const normalized = normalize_vec3(normal)
100
118
  // Pick u perpendicular to normal (use axis least aligned with normal)
101
- const u_dir = normalize_vec3(cross_3d(normalized, Math.abs(normalized[0]) < 0.9 ? [1, 0, 0] : [0, 1, 0]));
102
- const v_dir = cross_3d(normalized, u_dir);
119
+ const u_dir = normalize_vec3(
120
+ cross_3d(normalized, Math.abs(normalized[0]) < 0.9 ? [1, 0, 0] : [0, 1, 0]),
121
+ )
122
+ const v_dir = cross_3d(normalized, u_dir)
103
123
  // Scale to cover bounding box
104
- const scale = Math.max(x_max - x_min, y_max - y_min, z_max - z_min) * 2;
105
- const [px, py, pz] = point;
124
+ const scale = Math.max(x_max - x_min, y_max - y_min, z_max - z_min) * 2
125
+ const [px, py, pz] = point
106
126
  // Helper to offset point by u*su + v*sv
107
- const corner = (su, sv) => [
108
- px + u_dir[0] * su + v_dir[0] * sv,
109
- py + u_dir[1] * su + v_dir[1] * sv,
110
- pz + u_dir[2] * su + v_dir[2] * sv,
111
- ];
127
+ const corner = (su: number, sv: number): Vec3 => [
128
+ px + u_dir[0] * su + v_dir[0] * sv,
129
+ py + u_dir[1] * su + v_dir[1] * sv,
130
+ pz + u_dir[2] * su + v_dir[2] * sv,
131
+ ]
112
132
  const corners = [
113
- corner(-scale, -scale),
114
- corner(scale, -scale),
115
- corner(scale, scale),
116
- corner(-scale, scale),
117
- ];
118
- return create_quad_geometry(corners.map(([ux, uy, uz]) => to_vec3(ux, uy, uz)));
119
- }
120
- // Material properties (with defaults)
121
- let style = $derived({
133
+ corner(-scale, -scale),
134
+ corner(scale, -scale),
135
+ corner(scale, scale),
136
+ corner(-scale, scale),
137
+ ]
138
+ return create_quad_geometry(corners.map(([ux, uy, uz]) => to_vec3(ux, uy, uz)))
139
+ }
140
+
141
+ // Material properties (with defaults)
142
+ let style = $derived({
122
143
  color: ref_plane.style?.color ?? `#4488ff`,
123
144
  opacity: ref_plane.style?.opacity ?? 0.3,
124
145
  wireframe: ref_plane.style?.wireframe ?? false,
125
146
  wireframe_color: ref_plane.style?.wireframe_color ?? `white`,
126
147
  double_sided: ref_plane.style?.double_sided ?? true,
127
- });
128
- // Create wireframe geometry with automatic disposal when dependencies change
129
- let wireframe_geometry = $state(null);
130
- $effect(() => {
148
+ })
149
+
150
+ // Create wireframe geometry with automatic disposal when dependencies change
151
+ let wireframe_geometry: THREE.WireframeGeometry | null = $state(null)
152
+
153
+ $effect(() => {
131
154
  const wf_geo = geometry && style.wireframe
132
- ? new THREE.WireframeGeometry(geometry)
133
- : null;
134
- wireframe_geometry = wf_geo;
135
- return () => wf_geo?.dispose();
136
- });
155
+ ? new THREE.WireframeGeometry(geometry)
156
+ : null
157
+ wireframe_geometry = wf_geo
158
+ return () => wf_geo?.dispose()
159
+ })
137
160
  </script>
138
161
 
139
162
  {#if geometry}