matterviz 0.4.1 → 0.4.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 (499) hide show
  1. package/dist/EmptyState.svelte +10 -4
  2. package/dist/FilePicker.svelte +48 -60
  3. package/dist/Icon.svelte +7 -4
  4. package/dist/MillerIndexInput.svelte +2 -2
  5. package/dist/api/optimade.js +10 -7
  6. package/dist/app.css +68 -0
  7. package/dist/brillouin/BrillouinZone.svelte +90 -91
  8. package/dist/brillouin/BrillouinZone.svelte.d.ts +5 -7
  9. package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte +18 -14
  11. package/dist/brillouin/BrillouinZoneInfoPane.svelte +6 -10
  12. package/dist/brillouin/BrillouinZoneScene.svelte +46 -68
  13. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  14. package/dist/brillouin/compute.js +10 -16
  15. package/dist/brillouin/geometry.js +2 -2
  16. package/dist/chempot-diagram/ChemPotDiagram.svelte +48 -50
  17. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +61 -169
  18. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +1 -1
  19. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +559 -755
  20. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +1 -1
  21. package/dist/chempot-diagram/async-compute.svelte.js +13 -14
  22. package/dist/chempot-diagram/color.d.ts +21 -1
  23. package/dist/chempot-diagram/color.js +70 -1
  24. package/dist/chempot-diagram/compute.d.ts +7 -0
  25. package/dist/chempot-diagram/compute.js +85 -26
  26. package/dist/chempot-diagram/controls-state.svelte.js +1 -1
  27. package/dist/chempot-diagram/export.js +1 -6
  28. package/dist/chempot-diagram/temperature.js +9 -10
  29. package/dist/colors/index.d.ts +0 -4
  30. package/dist/colors/index.js +19 -20
  31. package/dist/composition/BarChart.svelte +30 -26
  32. package/dist/composition/BubbleChart.svelte +17 -17
  33. package/dist/composition/Composition.svelte +10 -19
  34. package/dist/composition/Formula.svelte +20 -27
  35. package/dist/composition/FormulaFilter.svelte +115 -184
  36. package/dist/composition/PieChart.svelte +55 -41
  37. package/dist/composition/format.js +7 -9
  38. package/dist/composition/index.d.ts +2 -0
  39. package/dist/composition/index.js +14 -0
  40. package/dist/composition/parse.d.ts +2 -2
  41. package/dist/composition/parse.js +61 -115
  42. package/dist/constants.d.ts +0 -1
  43. package/dist/constants.js +17 -26
  44. package/dist/convex-hull/ConvexHull.svelte +12 -15
  45. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
  46. package/dist/convex-hull/ConvexHull2D.svelte +93 -94
  47. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  48. package/dist/convex-hull/ConvexHull3D.svelte +127 -186
  49. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  50. package/dist/convex-hull/ConvexHull4D.svelte +131 -180
  51. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  52. package/dist/convex-hull/ConvexHullChrome.svelte +36 -40
  53. package/dist/convex-hull/ConvexHullControls.svelte +46 -48
  54. package/dist/convex-hull/ConvexHullStats.svelte +193 -195
  55. package/dist/convex-hull/ConvexHullTooltip.svelte +5 -12
  56. package/dist/convex-hull/GasPressureControls.svelte +5 -12
  57. package/dist/convex-hull/StructurePopup.svelte +18 -22
  58. package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
  59. package/dist/convex-hull/TemperatureSlider.svelte +4 -10
  60. package/dist/convex-hull/canvas-interactions.svelte.js +2 -1
  61. package/dist/convex-hull/gas-thermodynamics.js +21 -53
  62. package/dist/convex-hull/helpers.d.ts +8 -10
  63. package/dist/convex-hull/helpers.js +37 -43
  64. package/dist/convex-hull/hull-state.svelte.d.ts +1 -1
  65. package/dist/convex-hull/thermodynamics.js +37 -44
  66. package/dist/coordination/CoordinationBarPlot.svelte +49 -53
  67. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  68. package/dist/coordination/calc-coordination.d.ts +1 -1
  69. package/dist/coordination/calc-coordination.js +28 -25
  70. package/dist/element/BohrAtom.svelte +5 -9
  71. package/dist/element/ElementHeading.svelte +4 -1
  72. package/dist/element/ElementPhoto.svelte +11 -9
  73. package/dist/element/ElementStats.svelte +12 -10
  74. package/dist/element/ElementTile.svelte +44 -67
  75. package/dist/element/Nucleus.svelte +4 -2
  76. package/dist/element/data.d.ts +3 -2
  77. package/dist/element/data.js +5 -1
  78. package/dist/element/helpers.d.ts +4 -0
  79. package/dist/element/helpers.js +18 -0
  80. package/dist/element/index.d.ts +2 -5
  81. package/dist/element/index.js +4 -19
  82. package/dist/feedback/DragOverlay.svelte +5 -5
  83. package/dist/feedback/DragOverlay.svelte.d.ts +2 -2
  84. package/dist/feedback/StatusMessage.svelte +7 -4
  85. package/dist/fermi-surface/FermiSlice.svelte +21 -18
  86. package/dist/fermi-surface/FermiSurface.svelte +35 -44
  87. package/dist/fermi-surface/FermiSurface.svelte.d.ts +7 -13
  88. package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
  89. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  90. package/dist/fermi-surface/FermiSurfaceScene.svelte +64 -136
  91. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  92. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
  93. package/dist/fermi-surface/compute.js +25 -58
  94. package/dist/fermi-surface/parse.js +54 -88
  95. package/dist/file-viewer/JsonBrowser.svelte +1043 -0
  96. package/dist/file-viewer/JsonBrowser.svelte.d.ts +9 -0
  97. package/dist/file-viewer/PlotPanel.svelte +350 -0
  98. package/dist/file-viewer/PlotPanel.svelte.d.ts +9 -0
  99. package/dist/file-viewer/TrajectoryWithDos.svelte +30 -0
  100. package/dist/file-viewer/TrajectoryWithDos.svelte.d.ts +10 -0
  101. package/dist/file-viewer/detect.d.ts +11 -0
  102. package/dist/file-viewer/detect.js +381 -0
  103. package/dist/file-viewer/eligibility.d.ts +4 -0
  104. package/dist/file-viewer/eligibility.js +53 -0
  105. package/dist/file-viewer/host-protocol.d.ts +50 -0
  106. package/dist/file-viewer/host-transfer.d.ts +25 -0
  107. package/dist/file-viewer/host-transfer.js +42 -0
  108. package/dist/file-viewer/index.d.ts +5 -0
  109. package/dist/file-viewer/index.js +5 -0
  110. package/dist/file-viewer/main.d.ts +44 -0
  111. package/dist/file-viewer/main.js +535 -0
  112. package/dist/file-viewer/parse.d.ts +9 -0
  113. package/dist/file-viewer/parse.js +170 -0
  114. package/dist/file-viewer/plot-utils.d.ts +24 -0
  115. package/dist/file-viewer/plot-utils.js +191 -0
  116. package/dist/file-viewer/types.d.ts +4 -0
  117. package/dist/file-viewer/types.js +5 -0
  118. package/dist/heatmap-matrix/HeatmapMatrix.svelte +153 -219
  119. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +2 -2
  120. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +9 -7
  121. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +1 -1
  122. package/dist/heatmap-matrix/index.d.ts +5 -0
  123. package/dist/icons.d.ts +4 -0
  124. package/dist/icons.js +4 -0
  125. package/dist/index.d.ts +2 -2
  126. package/dist/index.js +1 -1
  127. package/dist/io/ExportPane.svelte +11 -7
  128. package/dist/io/decompress.d.ts +4 -1
  129. package/dist/io/decompress.js +24 -36
  130. package/dist/io/export.d.ts +11 -4
  131. package/dist/io/export.js +75 -19
  132. package/dist/io/fetch.d.ts +0 -3
  133. package/dist/io/fetch.js +0 -11
  134. package/dist/io/file-drop.js +60 -35
  135. package/dist/io/index.d.ts +0 -1
  136. package/dist/io/index.js +2 -9
  137. package/dist/io/is-binary.d.ts +9 -0
  138. package/dist/io/is-binary.js +45 -1
  139. package/dist/io/url-drop.d.ts +2 -0
  140. package/dist/io/url-drop.js +40 -40
  141. package/dist/isosurface/Isosurface.svelte +700 -215
  142. package/dist/isosurface/Isosurface.svelte.d.ts +7 -1
  143. package/dist/isosurface/IsosurfaceControls.svelte +590 -116
  144. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +1 -1
  145. package/dist/isosurface/VolumeSlice.svelte +224 -0
  146. package/dist/isosurface/VolumeSlice.svelte.d.ts +28 -0
  147. package/dist/isosurface/coloring.d.ts +20 -0
  148. package/dist/isosurface/coloring.js +118 -0
  149. package/dist/isosurface/geometry-worker-types.d.ts +38 -0
  150. package/dist/isosurface/geometry.worker.d.ts +1 -0
  151. package/dist/isosurface/geometry.worker.js +59 -0
  152. package/dist/isosurface/grid.d.ts +10 -0
  153. package/dist/isosurface/grid.js +31 -0
  154. package/dist/isosurface/index.d.ts +4 -0
  155. package/dist/isosurface/index.js +4 -0
  156. package/dist/isosurface/parse-vaspwave.d.ts +3 -0
  157. package/dist/isosurface/parse-vaspwave.js +138 -0
  158. package/dist/isosurface/parse.js +6 -6
  159. package/dist/isosurface/profile.d.ts +12 -0
  160. package/dist/isosurface/profile.js +19 -0
  161. package/dist/isosurface/sampling.d.ts +34 -0
  162. package/dist/isosurface/sampling.js +408 -0
  163. package/dist/isosurface/slice-rendering.d.ts +13 -0
  164. package/dist/isosurface/slice-rendering.js +79 -0
  165. package/dist/isosurface/slice.d.ts +22 -2
  166. package/dist/isosurface/slice.js +200 -116
  167. package/dist/isosurface/types.d.ts +24 -1
  168. package/dist/isosurface/types.js +120 -8
  169. package/dist/json-path.d.ts +4 -0
  170. package/dist/json-path.js +89 -0
  171. package/dist/labels.d.ts +6 -2
  172. package/dist/labels.js +44 -14
  173. package/dist/layout/FullscreenButton.svelte +2 -1
  174. package/dist/layout/FullscreenToggle.svelte +10 -4
  175. package/dist/layout/InfoCard.svelte +8 -21
  176. package/dist/layout/InfoTag.svelte +1 -3
  177. package/dist/layout/NumberRangeInput.svelte +46 -0
  178. package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
  179. package/dist/layout/PropertyFilter.svelte +2 -6
  180. package/dist/layout/SettingsSection.svelte +57 -62
  181. package/dist/layout/SettingsSection.svelte.d.ts +6 -7
  182. package/dist/layout/SubpageGrid.svelte +3 -1
  183. package/dist/layout/ViewerChrome.svelte +16 -11
  184. package/dist/layout/ViewerChrome.svelte.d.ts +2 -1
  185. package/dist/layout/fullscreen.js +3 -5
  186. package/dist/layout/fullscreen.svelte.js +1 -2
  187. package/dist/layout/index.d.ts +1 -0
  188. package/dist/layout/index.js +1 -0
  189. package/dist/layout/json-tree/JsonNode.svelte +22 -59
  190. package/dist/layout/json-tree/JsonTree.svelte +101 -172
  191. package/dist/layout/json-tree/JsonValue.svelte +9 -32
  192. package/dist/layout/json-tree/utils.d.ts +0 -3
  193. package/dist/layout/json-tree/utils.js +50 -188
  194. package/dist/marching-cubes.d.ts +8 -1
  195. package/dist/marching-cubes.js +115 -48
  196. package/dist/math.d.ts +5 -2
  197. package/dist/math.js +48 -38
  198. package/dist/overlays/ContextMenu.svelte +19 -34
  199. package/dist/overlays/CopyButton.svelte +11 -5
  200. package/dist/overlays/DragControlTab.svelte +6 -1
  201. package/dist/overlays/DraggablePane.svelte +110 -74
  202. package/dist/overlays/DraggablePane.svelte.d.ts +2 -1
  203. package/dist/overlays/GlassChip.svelte +32 -0
  204. package/dist/overlays/GlassChip.svelte.d.ts +8 -0
  205. package/dist/overlays/InfoPaneCards.svelte +11 -23
  206. package/dist/overlays/index.d.ts +7 -0
  207. package/dist/overlays/index.js +26 -0
  208. package/dist/overlays/portal.d.ts +2 -0
  209. package/dist/overlays/portal.js +14 -0
  210. package/dist/periodic-table/PeriodicTable.svelte +113 -145
  211. package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
  212. package/dist/periodic-table/PeriodicTableControls.svelte +37 -115
  213. package/dist/periodic-table/TableInset.svelte +9 -4
  214. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +68 -105
  215. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
  216. package/dist/phase-diagram/PhaseDiagramControls.svelte +70 -94
  217. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
  218. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +2 -1
  219. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +12 -12
  220. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
  221. package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
  222. package/dist/phase-diagram/build-diagram.js +4 -9
  223. package/dist/phase-diagram/diagram-input.d.ts +1 -2
  224. package/dist/phase-diagram/parse.js +15 -15
  225. package/dist/phase-diagram/svg-to-diagram.js +28 -27
  226. package/dist/phase-diagram/utils.js +2 -3
  227. package/dist/plot/bar/BarPlot.svelte +461 -426
  228. package/dist/plot/bar/BarPlot.svelte.d.ts +2 -0
  229. package/dist/plot/bar/BarPlotControls.svelte +1 -3
  230. package/dist/plot/bar/BarPlotControls.svelte.d.ts +4 -6
  231. package/dist/plot/bar/SpacegroupBarPlot.svelte +46 -77
  232. package/dist/plot/bar/data.d.ts +5 -4
  233. package/dist/plot/bar/data.js +2 -1
  234. package/dist/plot/box/BoxPlot.svelte +322 -226
  235. package/dist/plot/box/BoxPlot.svelte.d.ts +2 -0
  236. package/dist/plot/box/Violin.svelte.d.ts +1 -0
  237. package/dist/plot/box/box-plot.js +1 -1
  238. package/dist/plot/core/auto-place.d.ts +1 -1
  239. package/dist/plot/core/auto-place.js +2 -2
  240. package/dist/plot/core/axis-utils.d.ts +12 -7
  241. package/dist/plot/core/axis-utils.js +48 -48
  242. package/dist/plot/core/components/AxisLabel.svelte +82 -20
  243. package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
  244. package/dist/plot/core/components/ColorBar.svelte +101 -106
  245. package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
  246. package/dist/plot/core/components/FillArea.svelte +10 -17
  247. package/dist/plot/core/components/HierarchyControls.svelte +249 -0
  248. package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
  249. package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
  250. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
  251. package/dist/plot/core/components/Line.svelte +18 -9
  252. package/dist/plot/core/components/Line.svelte.d.ts +2 -0
  253. package/dist/plot/core/components/PlotAxis.svelte +40 -17
  254. package/dist/plot/core/components/PlotControls.svelte +65 -41
  255. package/dist/plot/core/components/PlotLegend.svelte +31 -35
  256. package/dist/plot/core/components/PlotMarginals.svelte +616 -0
  257. package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
  258. package/dist/plot/core/components/PlotTooltip.svelte +1 -1
  259. package/dist/plot/core/components/PortalSelect.svelte +4 -8
  260. package/dist/plot/core/components/ReferenceLine.svelte +27 -24
  261. package/dist/plot/core/components/ReferenceLine3D.svelte +54 -57
  262. package/dist/plot/core/components/ReferencePlane.svelte +7 -8
  263. package/dist/plot/core/components/ZeroLines.svelte +4 -8
  264. package/dist/plot/core/components/ZoomRect.svelte +1 -2
  265. package/dist/plot/core/components/index.d.ts +1 -0
  266. package/dist/plot/core/components/index.js +1 -0
  267. package/dist/plot/core/data-cleaning-signal.d.ts +46 -0
  268. package/dist/plot/core/data-cleaning-signal.js +467 -0
  269. package/dist/plot/core/data-cleaning.d.ts +2 -42
  270. package/dist/plot/core/data-cleaning.js +27 -474
  271. package/dist/plot/core/data-transform.d.ts +1 -2
  272. package/dist/plot/core/data-transform.js +9 -15
  273. package/dist/plot/core/fill-utils.d.ts +3 -1
  274. package/dist/plot/core/fill-utils.js +28 -6
  275. package/dist/plot/core/index.d.ts +1 -0
  276. package/dist/plot/core/index.js +1 -0
  277. package/dist/plot/core/interactions.js +0 -2
  278. package/dist/plot/core/layout.d.ts +15 -6
  279. package/dist/plot/core/layout.js +57 -38
  280. package/dist/plot/core/marginals.d.ts +170 -0
  281. package/dist/plot/core/marginals.js +436 -0
  282. package/dist/plot/core/pan-zoom.svelte.d.ts +2 -4
  283. package/dist/plot/core/pan-zoom.svelte.js +34 -17
  284. package/dist/plot/core/placed-tween.svelte.d.ts +3 -0
  285. package/dist/plot/core/placed-tween.svelte.js +68 -21
  286. package/dist/plot/core/reference-line.js +1 -1
  287. package/dist/plot/core/scales.d.ts +23 -0
  288. package/dist/plot/core/scales.js +39 -13
  289. package/dist/plot/core/svg.js +0 -1
  290. package/dist/plot/core/types/fills.d.ts +101 -0
  291. package/dist/plot/core/types/fills.js +15 -0
  292. package/dist/plot/core/types/plot-3d.d.ts +87 -0
  293. package/dist/plot/core/types/plot-3d.js +4 -0
  294. package/dist/plot/core/types/reference-lines.d.ts +140 -0
  295. package/dist/plot/core/types/reference-lines.js +9 -0
  296. package/dist/plot/core/types.d.ts +29 -324
  297. package/dist/plot/core/types.js +23 -20
  298. package/dist/plot/core/utils/hierarchy-chart.d.ts +52 -0
  299. package/dist/plot/core/utils/hierarchy-chart.js +191 -0
  300. package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
  301. package/dist/plot/core/utils/hierarchy-labels.js +100 -0
  302. package/dist/plot/core/utils/label-placement.js +2 -2
  303. package/dist/plot/histogram/Histogram.svelte +314 -340
  304. package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
  305. package/dist/plot/histogram/HistogramControls.svelte +30 -28
  306. package/dist/plot/histogram/histogram.d.ts +31 -0
  307. package/dist/plot/histogram/histogram.js +70 -0
  308. package/dist/plot/histogram/index.d.ts +1 -0
  309. package/dist/plot/histogram/index.js +1 -0
  310. package/dist/plot/index.d.ts +1 -0
  311. package/dist/plot/index.js +1 -0
  312. package/dist/plot/sankey/Sankey.svelte +78 -69
  313. package/dist/plot/sankey/Sankey.svelte.d.ts +2 -2
  314. package/dist/plot/sankey/SankeyControls.svelte +22 -16
  315. package/dist/plot/sankey/sankey.js +13 -9
  316. package/dist/plot/scatter/BinnedScatterPlot.svelte +311 -141
  317. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +7 -0
  318. package/dist/plot/scatter/ElementScatter.svelte +4 -1
  319. package/dist/plot/scatter/ScatterPlot.svelte +517 -410
  320. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +2 -0
  321. package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
  322. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  323. package/dist/plot/scatter/ScatterPoint.svelte +16 -9
  324. package/dist/plot/scatter/adaptive-density.d.ts +1 -1
  325. package/dist/plot/scatter/adaptive-density.js +36 -20
  326. package/dist/plot/scatter/binned-scatter-types.d.ts +3 -2
  327. package/dist/plot/scatter/binned-scatter-types.js +6 -1
  328. package/dist/plot/scatter/scatter-data.d.ts +1 -1
  329. package/dist/plot/scatter/scatter-data.js +8 -7
  330. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +25 -34
  331. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +2 -2
  332. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +8 -5
  333. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +113 -116
  334. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +2 -2
  335. package/dist/plot/scatter-3d/Surface3D.svelte +4 -13
  336. package/dist/plot/sunburst/Sunburst.svelte +269 -347
  337. package/dist/plot/sunburst/Sunburst.svelte.d.ts +2 -2
  338. package/dist/plot/sunburst/index.d.ts +1 -1
  339. package/dist/plot/sunburst/index.js +2 -1
  340. package/dist/plot/sunburst/render.d.ts +2 -2
  341. package/dist/plot/sunburst/render.js +47 -22
  342. package/dist/plot/sunburst/sunburst.d.ts +5 -1
  343. package/dist/plot/sunburst/sunburst.js +10 -3
  344. package/dist/plot/treemap/Treemap.svelte +1022 -0
  345. package/dist/plot/treemap/Treemap.svelte.d.ts +90 -0
  346. package/dist/plot/treemap/index.d.ts +4 -0
  347. package/dist/plot/treemap/index.js +4 -0
  348. package/dist/plot/treemap/labels.d.ts +38 -0
  349. package/dist/plot/treemap/labels.js +80 -0
  350. package/dist/plot/treemap/treemap.d.ts +28 -0
  351. package/dist/plot/treemap/treemap.js +102 -0
  352. package/dist/rdf/RdfPlot.svelte +37 -59
  353. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  354. package/dist/rdf/calc-rdf.js +63 -52
  355. package/dist/rdf/index.d.ts +0 -1
  356. package/dist/sanitize.js +85 -27
  357. package/dist/scene/SceneCamera.svelte +1 -1
  358. package/dist/scene/SceneCamera.svelte.d.ts +1 -1
  359. package/dist/scene/bind-renderer.svelte.js +14 -6
  360. package/dist/scene/index.d.ts +1 -2
  361. package/dist/scene/index.js +1 -1
  362. package/dist/scene/{props.js → props.svelte.js} +15 -1
  363. package/dist/settings.d.ts +19 -9
  364. package/dist/settings.js +229 -525
  365. package/dist/spectral/Bands.svelte +207 -221
  366. package/dist/spectral/BandsAndDos.svelte +11 -9
  367. package/dist/spectral/BrillouinBandsDos.svelte +19 -42
  368. package/dist/spectral/Dos.svelte +92 -93
  369. package/dist/spectral/helpers.d.ts +3 -3
  370. package/dist/spectral/helpers.js +65 -140
  371. package/dist/state.svelte.js +5 -18
  372. package/dist/structure/Arrow.svelte +5 -18
  373. package/dist/structure/ArrowInstances.svelte +160 -0
  374. package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
  375. package/dist/structure/AtomLegend.svelte +120 -85
  376. package/dist/structure/AtomLegend.svelte.d.ts +2 -3
  377. package/dist/structure/Bond.svelte +31 -23
  378. package/dist/structure/CanvasTooltip.svelte +15 -3
  379. package/dist/structure/CellSelect.svelte +45 -35
  380. package/dist/structure/Cylinder.svelte +24 -40
  381. package/dist/structure/InstancedAtoms.svelte +114 -0
  382. package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
  383. package/dist/structure/Lattice.svelte +85 -149
  384. package/dist/structure/SiteLabels.svelte +122 -0
  385. package/dist/structure/SiteLabels.svelte.d.ts +18 -0
  386. package/dist/structure/Structure.svelte +636 -504
  387. package/dist/structure/Structure.svelte.d.ts +4 -2
  388. package/dist/structure/StructureCarousel.svelte +637 -0
  389. package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
  390. package/dist/structure/StructureControls.svelte +165 -425
  391. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  392. package/dist/structure/StructureExportPane.svelte +17 -21
  393. package/dist/structure/StructureInfoPane.svelte +128 -133
  394. package/dist/structure/StructureInfoPane.svelte.d.ts +1 -1
  395. package/dist/structure/StructureScene.svelte +535 -578
  396. package/dist/structure/StructureScene.svelte.d.ts +6 -2
  397. package/dist/structure/StructureViewport.svelte +451 -0
  398. package/dist/structure/StructureViewport.svelte.d.ts +65 -0
  399. package/dist/structure/atom-label-placement.d.ts +16 -12
  400. package/dist/structure/atom-label-placement.js +70 -37
  401. package/dist/structure/atom-properties.d.ts +2 -0
  402. package/dist/structure/atom-properties.js +105 -38
  403. package/dist/structure/bond-order-perception.js +3 -8
  404. package/dist/structure/bonding.d.ts +9 -3
  405. package/dist/structure/bonding.js +95 -46
  406. package/dist/structure/edit-history.d.ts +6 -0
  407. package/dist/structure/edit-history.js +27 -0
  408. package/dist/structure/export.d.ts +1 -0
  409. package/dist/structure/export.js +89 -105
  410. package/dist/structure/format-detect.d.ts +1 -0
  411. package/dist/structure/format-detect.js +20 -0
  412. package/dist/structure/geometry.d.ts +9 -0
  413. package/dist/structure/geometry.js +27 -0
  414. package/dist/structure/index.d.ts +16 -1
  415. package/dist/structure/index.js +15 -10
  416. package/dist/structure/measure.d.ts +1 -1
  417. package/dist/structure/measure.js +6 -12
  418. package/dist/structure/parse.d.ts +2 -1
  419. package/dist/structure/parse.js +272 -313
  420. package/dist/structure/partial-occupancy.js +10 -5
  421. package/dist/structure/pbc.js +85 -107
  422. package/dist/structure/polyhedra.d.ts +0 -1
  423. package/dist/structure/polyhedra.js +7 -21
  424. package/dist/structure/prop-groups.d.ts +85 -0
  425. package/dist/structure/prop-groups.js +18 -0
  426. package/dist/structure/supercell.d.ts +1 -2
  427. package/dist/structure/supercell.js +7 -13
  428. package/dist/symmetry/SymmetryElements.svelte +11 -15
  429. package/dist/symmetry/SymmetryStats.svelte +55 -71
  430. package/dist/symmetry/WyckoffTable.svelte +10 -28
  431. package/dist/symmetry/cell-transform.js +6 -14
  432. package/dist/symmetry/index.d.ts +1 -0
  433. package/dist/symmetry/index.js +13 -10
  434. package/dist/symmetry/spacegroups.js +3 -2
  435. package/dist/table/HeatmapTable.svelte +1142 -447
  436. package/dist/table/HeatmapTable.svelte.d.ts +12 -2
  437. package/dist/table/ToggleMenu.svelte +168 -53
  438. package/dist/table/ToggleMenu.svelte.d.ts +1 -1
  439. package/dist/table/index.d.ts +21 -6
  440. package/dist/table/index.js +34 -21
  441. package/dist/theme/ThemeControl.svelte +16 -8
  442. package/dist/theme/embedded.d.ts +18 -0
  443. package/dist/theme/embedded.js +206 -0
  444. package/dist/theme/index.d.ts +5 -5
  445. package/dist/theme/index.js +5 -12
  446. package/dist/theme/themes.mjs +44 -66
  447. package/dist/tooltip/KCoords.svelte +4 -1
  448. package/dist/tooltip/TooltipContent.svelte +3 -6
  449. package/dist/tooltip/TooltipContent.svelte.d.ts +1 -1
  450. package/dist/tooltip/index.d.ts +8 -1
  451. package/dist/trajectory/Trajectory.svelte +613 -386
  452. package/dist/trajectory/Trajectory.svelte.d.ts +1 -1
  453. package/dist/trajectory/TrajectoryError.svelte +12 -74
  454. package/dist/trajectory/TrajectoryExportPane.svelte +14 -32
  455. package/dist/trajectory/TrajectoryInfoPane.svelte +127 -164
  456. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +2 -1
  457. package/dist/trajectory/extract.js +61 -49
  458. package/dist/trajectory/format-detect.d.ts +2 -0
  459. package/dist/trajectory/format-detect.js +17 -13
  460. package/dist/trajectory/frame-reader.d.ts +2 -0
  461. package/dist/trajectory/frame-reader.js +35 -32
  462. package/dist/trajectory/helpers.d.ts +2 -0
  463. package/dist/trajectory/helpers.js +34 -56
  464. package/dist/trajectory/index.d.ts +1 -0
  465. package/dist/trajectory/index.js +5 -8
  466. package/dist/trajectory/parse/ase.js +1 -1
  467. package/dist/trajectory/parse/h5-utils.d.ts +13 -0
  468. package/dist/trajectory/parse/h5-utils.js +109 -0
  469. package/dist/trajectory/parse/hdf5.d.ts +1 -1
  470. package/dist/trajectory/parse/hdf5.js +116 -106
  471. package/dist/trajectory/parse/index.d.ts +6 -6
  472. package/dist/trajectory/parse/index.js +25 -33
  473. package/dist/trajectory/parse/lammps.js +8 -12
  474. package/dist/trajectory/parse/vasp.js +10 -7
  475. package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
  476. package/dist/trajectory/parse/vaspout-electronic.js +207 -0
  477. package/dist/trajectory/parse/vaspout-h5.d.ts +4 -0
  478. package/dist/trajectory/parse/vaspout-h5.js +281 -0
  479. package/dist/trajectory/parse/xyz.js +59 -9
  480. package/dist/trajectory/plotting.d.ts +8 -9
  481. package/dist/trajectory/plotting.js +113 -64
  482. package/dist/utils.d.ts +3 -0
  483. package/dist/utils.js +7 -0
  484. package/dist/xrd/XrdPlot.svelte +79 -118
  485. package/dist/xrd/broadening.js +2 -1
  486. package/dist/xrd/calc-xrd.js +24 -62
  487. package/dist/xrd/parse.d.ts +0 -1
  488. package/dist/xrd/parse.js +69 -95
  489. package/package.json +94 -34
  490. package/readme.md +6 -5
  491. package/dist/api/mp.d.ts +0 -6
  492. package/dist/api/mp.js +0 -22
  493. package/dist/plot/sunburst/SunburstControls.svelte +0 -200
  494. package/dist/scene/types.d.ts +0 -26
  495. package/dist/tooltip/types.d.ts +0 -8
  496. package/dist/trajectory/constants.d.ts +0 -6
  497. package/dist/trajectory/constants.js +0 -11
  498. /package/dist/{scene/types.js → file-viewer/host-protocol.js} +0 -0
  499. /package/dist/{tooltip/types.js → isosurface/geometry-worker-types.js} +0 -0
@@ -4,7 +4,7 @@ import type { AxisConfig } from '../plot';
4
4
  import { type ComponentProps, type Snippet } from 'svelte';
5
5
  import type { HTMLAttributes } from 'svelte/elements';
6
6
  import HeatmapMatrixControls from './HeatmapMatrixControls.svelte';
7
- import type { AxisItem, CellContext, DomainMode, HeatmapExportFormat, HeatmapTooltipProp, LegendPosition, NormalizeMode, SymmetricMode } from './index';
7
+ import type { AxisItem, CellContext, DomainMode, HeatmapExportFormat, HeatmapTooltipProp, LegendPosition, MissingCellStyle, NormalizeMode, SymmetricMode } from './index';
8
8
  type CellValue = number | string | null;
9
9
  type SelectionMode = `single` | `multi` | `range`;
10
10
  type AxisOrderKey = `label` | `key` | `sort_value`;
@@ -20,7 +20,7 @@ type $$ComponentProps = Omit<HTMLAttributes<HTMLDivElement>, `onclick` | `ondblc
20
20
  color_scale?: D3InterpolateName | ((val: number) => string);
21
21
  color_scale_range?: [number | null, number | null];
22
22
  color_overrides?: Record<string, string>;
23
- missing_color?: string;
23
+ missing?: MissingCellStyle;
24
24
  log?: boolean;
25
25
  value_transform?: (value: number, ctx: {
26
26
  x_item: AxisItem;
@@ -2,11 +2,15 @@
2
2
  import type { PaneProps, PaneToggleProps } from '../overlays'
3
3
  import DraggablePane from '../overlays/DraggablePane.svelte'
4
4
  import type { ComponentProps, Snippet } from 'svelte'
5
- import {
6
- ELEMENT_ORDERINGS,
7
- ORDERING_LABELS,
5
+ import { ELEMENT_ORDERINGS, ORDERING_LABELS } from './index'
6
+ import type {
7
+ ElementAxisOrderingKey,
8
+ DomainMode,
9
+ HeatmapExportFormat,
10
+ LegendPosition,
11
+ NormalizeMode,
12
+ SymmetricMode,
8
13
  } from './index'
9
- import type { ElementAxisOrderingKey, DomainMode, HeatmapExportFormat, LegendPosition, NormalizeMode, SymmetricMode } from './index'
10
14
 
11
15
  let {
12
16
  ordering = $bindable(`atomic_number`),
@@ -53,9 +57,7 @@
53
57
  } = $props()
54
58
 
55
59
  function merge_styles(base_style: string, override_style: unknown): string {
56
- const override_style_str = typeof override_style === `string`
57
- ? override_style
58
- : ``
60
+ const override_style_str = typeof override_style === `string` ? override_style : ``
59
61
  return override_style_str ? `${base_style}; ${override_style_str}` : base_style
60
62
  }
61
63
 
@@ -25,6 +25,6 @@ type $$ComponentProps = {
25
25
  controls_open: boolean;
26
26
  }]>;
27
27
  };
28
- declare const HeatmapMatrixControls: import("svelte").Component<$$ComponentProps, {}, "normalize" | "show_values" | "show_legend" | "controls_open" | "ordering" | "theme" | "toggle_visible" | "domain_mode" | "legend_position" | "search_query" | "symmetric" | "show_row_summaries" | "show_col_summaries">;
28
+ declare const HeatmapMatrixControls: import("svelte").Component<$$ComponentProps, {}, "normalize" | "theme" | "show_values" | "show_legend" | "controls_open" | "ordering" | "symmetric" | "search_query" | "toggle_visible" | "domain_mode" | "legend_position" | "show_row_summaries" | "show_col_summaries">;
29
29
  type HeatmapMatrixControls = ReturnType<typeof HeatmapMatrixControls>;
30
30
  export default HeatmapMatrixControls;
@@ -17,6 +17,11 @@ export type CellContext = {
17
17
  value: number | string | null;
18
18
  bg_color: string | null;
19
19
  };
20
+ export interface MissingCellStyle {
21
+ color?: `element-category` | (string & {});
22
+ label?: string;
23
+ style?: string;
24
+ }
20
25
  export declare const ORDERING_LABELS: {
21
26
  readonly atomic_number: "Atomic Number";
22
27
  readonly mendeleev_number: "Pettifor Chemical Similarity";
package/dist/icons.d.ts CHANGED
@@ -540,6 +540,10 @@ export declare const ICON_DATA: {
540
540
  readonly viewBox: "0 0 24 24";
541
541
  readonly path: "<path fill=\"currentColor\" d=\"M20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2M4 4h5v16H4zm7 0h9v8h-9zm0 10h9v6h-9z\"/>";
542
542
  };
543
+ readonly Grid2x2: {
544
+ readonly viewBox: "0 0 24 24";
545
+ readonly path: "<path fill=\"currentColor\" d=\"M20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2M4 4h7v7H4zm0 9h7v7H4zm9-9h7v7h-7zm0 9h7v7h-7z\"/>";
546
+ };
543
547
  readonly FermiSurface: {
544
548
  readonly viewBox: "0 0 24 24";
545
549
  readonly stroke: "currentColor";
package/dist/icons.js CHANGED
@@ -620,6 +620,10 @@ export const ICON_DATA = {
620
620
  viewBox: `0 0 24 24`,
621
621
  path: `<path fill="currentColor" d="M20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2M4 4h5v16H4zm7 0h9v8h-9zm0 10h9v6h-9z"/>`,
622
622
  },
623
+ Grid2x2: {
624
+ viewBox: `0 0 24 24`,
625
+ path: `<path fill="currentColor" d="M20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2M4 4h7v7H4zm0 9h7v7H4zm9-9h7v7h-7zm0 9h7v7h-7z"/>`,
626
+ },
623
627
  FermiSurface: {
624
628
  viewBox: `0 0 24 24`,
625
629
  stroke: `currentColor`,
package/dist/index.d.ts CHANGED
@@ -16,8 +16,8 @@ export { default as Icon } from './Icon.svelte';
16
16
  export * from './icons';
17
17
  export * from './io';
18
18
  export { default as MillerIndexInput } from './MillerIndexInput.svelte';
19
- export { auto_isosurface_settings, DEFAULT_ISOSURFACE_SETTINGS, generate_layers, grid_data_range, Isosurface as VolumetricIsosurface, IsosurfaceControls, LAYER_COLORS, parse_chgcar, parse_cube, parse_volumetric_file, sample_hkl_slice, tile_volumetric_data, trilinear_interpolate, } from './isosurface';
20
- export type { DataRange, IsosurfaceLayer, IsosurfaceSettings, SliceResult, VolumetricData, VolumetricFileData, } from './isosurface';
19
+ export { auto_color_config, auto_isosurface_settings, auto_volume_layer, compare_volume_grids, compute_scalar_range, create_volume_sampler, DEFAULT_ISO_COLORMAP, DEFAULT_ISOSURFACE_SETTINGS, extract_volume_range, generate_layers, grid_data_range, is_signed_range, ISO_COLORMAPS, Isosurface as VolumetricIsosurface, IsosurfaceControls, label_file_volumes, lattices_match, LAYER_COLORS, materialize_layers, merge_imported_volumes, parse_chgcar, parse_cube, parse_volumetric_file, remove_volume, resolve_contour_thresholds, resolve_slice_color_range, resolve_volume_display_range, sample_hkl_slice, sample_plane_slice, sample_volume_at_positions, sanitize_display_range, scalars_to_vertex_colors, slice_to_rgba, tile_volumetric_data, trilinear_interpolate, VolumeSlice, } from './isosurface';
20
+ export type { CartesianPlane, DataRange, DisplayRange, GridCompatibility, IsoColormap, IsosurfaceLayer, IsosurfaceSettings, OutOfBoundsPolicy, PlaneSliceOptions, SliceResult, VolumeSliceMode, VolumeMergeResult, VolumeDisplayRangeOptions, VolumeSamplerOptions, VolumetricData, VolumetricFileData, } from './isosurface';
21
21
  export * from './labels';
22
22
  export * from './layout';
23
23
  export * from './math';
package/dist/index.js CHANGED
@@ -17,7 +17,7 @@ export * from './icons';
17
17
  export * from './io';
18
18
  export { default as MillerIndexInput } from './MillerIndexInput.svelte';
19
19
  // Explicit exports to avoid name clash with fermi-surface's Isosurface type
20
- export { auto_isosurface_settings, DEFAULT_ISOSURFACE_SETTINGS, generate_layers, grid_data_range, Isosurface as VolumetricIsosurface, IsosurfaceControls, LAYER_COLORS, parse_chgcar, parse_cube, parse_volumetric_file, sample_hkl_slice, tile_volumetric_data, trilinear_interpolate, } from './isosurface';
20
+ export { auto_color_config, auto_isosurface_settings, auto_volume_layer, compare_volume_grids, compute_scalar_range, create_volume_sampler, DEFAULT_ISO_COLORMAP, DEFAULT_ISOSURFACE_SETTINGS, extract_volume_range, generate_layers, grid_data_range, is_signed_range, ISO_COLORMAPS, Isosurface as VolumetricIsosurface, IsosurfaceControls, label_file_volumes, lattices_match, LAYER_COLORS, materialize_layers, merge_imported_volumes, parse_chgcar, parse_cube, parse_volumetric_file, remove_volume, resolve_contour_thresholds, resolve_slice_color_range, resolve_volume_display_range, sample_hkl_slice, sample_plane_slice, sample_volume_at_positions, sanitize_display_range, scalars_to_vertex_colors, slice_to_rgba, tile_volumetric_data, trilinear_interpolate, VolumeSlice, } from './isosurface';
21
21
  export * from './labels';
22
22
  export * from './layout';
23
23
  export * from './math';
@@ -3,7 +3,7 @@
3
3
  import type { ExportItem, ExportSection } from './types'
4
4
  import DraggablePane from '../overlays/DraggablePane.svelte'
5
5
  import { sanitize_html } from '../sanitize'
6
- import { type ComponentProps, onDestroy, type Snippet } from 'svelte'
6
+ import { onDestroy, type Snippet } from 'svelte'
7
7
  import { tooltip } from 'svelte-multiselect/attachments'
8
8
  import type { HTMLAttributes } from 'svelte/elements'
9
9
 
@@ -73,7 +73,9 @@
73
73
  {@attach section.tooltip
74
74
  ? tooltip({ allow_html: true, content: sanitize_html(section.tooltip) })
75
75
  : () => {}}
76
- >{section.title}</h4>
76
+ >
77
+ {section.title}
78
+ </h4>
77
79
  {/if}
78
80
  <div class="export-grid">
79
81
  {#each section.items as item, item_idx (item.label)}
@@ -81,9 +83,9 @@
81
83
  <!-- not a <label>: it would forward label-text clicks to the first (download) button -->
82
84
  <span class="export-item">
83
85
  {#if item.hint}
84
- <span
85
- {@attach tooltip({ allow_html: true, content: sanitize_html(item.hint) })}
86
- >{item.label}</span>
86
+ <span {@attach tooltip({ allow_html: true, content: sanitize_html(item.hint) })}
87
+ >{item.label}</span
88
+ >
87
89
  {:else}
88
90
  {item.label}
89
91
  {/if}
@@ -110,14 +112,16 @@
110
112
  </button>
111
113
  {/if}
112
114
  {#if item.show_dpi}
113
- <span class="dpi-input">(DPI: <input
115
+ <span class="dpi-input"
116
+ >(DPI: <input
114
117
  type="number"
115
118
  min={dpi_range[0]}
116
119
  max={dpi_range[1]}
117
120
  bind:value={png_dpi}
118
121
  onchange={clamp_dpi}
119
122
  title="Export resolution in dots per inch"
120
- />)</span>
123
+ />)</span
124
+ >
121
125
  {/if}
122
126
  </span>
123
127
  {/each}
@@ -1,11 +1,14 @@
1
1
  import type { COMPRESSION_EXTENSIONS } from '../constants';
2
2
  import { COMPRESSION_FORMATS } from '../constants';
3
+ export declare function strip_compression_extensions(filename: string): string;
3
4
  export type CompressionFormat = keyof typeof COMPRESSION_FORMATS;
4
5
  export type CompressionExtension = (typeof COMPRESSION_EXTENSIONS)[number];
6
+ export type BrowserCompressionFormat = Exclude<CompressionFormat, `zip` | `xz` | `bz2`>;
7
+ export declare const is_browser_decompressible_format: (format: CompressionFormat | null) => format is BrowserCompressionFormat;
5
8
  export declare function detect_compression_format(filename: string): CompressionFormat | null;
6
9
  export declare function decompress_data(data: ArrayBuffer | ReadableStream<Uint8Array> | null, format: CompressionFormat): Promise<string>;
7
10
  export declare function decompress_data_binary(data: ArrayBuffer | ReadableStream<Uint8Array> | null, format: CompressionFormat): Promise<ArrayBuffer>;
8
11
  export declare function decompress_file(file: File): Promise<{
9
- content: string;
12
+ content: string | ArrayBuffer;
10
13
  filename: string;
11
14
  }>;
@@ -1,5 +1,14 @@
1
1
  import { COMPRESSION_EXTENSIONS_REGEX, COMPRESSION_FORMATS } from '../constants';
2
- import { to_error } from '../utils';
2
+ import { is_binary_payload } from './is-binary';
3
+ // Lowercase a filename and strip all trailing compression extensions (.gz, .zip, ...)
4
+ export function strip_compression_extensions(filename) {
5
+ let base_name = filename.toLowerCase();
6
+ while (COMPRESSION_EXTENSIONS_REGEX.test(base_name)) {
7
+ base_name = base_name.replace(COMPRESSION_EXTENSIONS_REGEX, ``);
8
+ }
9
+ return base_name;
10
+ }
11
+ export const is_browser_decompressible_format = (format) => format !== null && format !== `zip` && format !== `xz` && format !== `bz2`;
3
12
  export function detect_compression_format(filename) {
4
13
  const lower = filename.toLowerCase();
5
14
  for (const [format, extensions] of Object.entries(COMPRESSION_FORMATS)) {
@@ -16,7 +25,7 @@ export async function decompress_data(data, format) {
16
25
  // Decompress data and return as ArrayBuffer (for binary files like .brml.gz)
17
26
  export async function decompress_data_binary(data, format) {
18
27
  try {
19
- if (format === `zip` || format === `xz` || format === `bz2`) {
28
+ if (!is_browser_decompressible_format(format)) {
20
29
  throw new Error(`${format.toUpperCase()} decompression is not supported in the browser. ` +
21
30
  `Please extract the ${format.toUpperCase()} file first.`);
22
31
  }
@@ -37,39 +46,18 @@ export async function decompress_data_binary(data, format) {
37
46
  throw new Error(`Failed to decompress ${format} file: ${error}`, { cause: error });
38
47
  }
39
48
  }
40
- export function decompress_file(file) {
49
+ const to_content = (filename, buffer) => is_binary_payload(filename, buffer) ? buffer : new TextDecoder().decode(buffer);
50
+ // Read a dropped file, decompressing supported formats. Binary payloads (by extension or
51
+ // magic bytes) return as ArrayBuffer so parsers get raw bytes; text decodes to string.
52
+ export async function decompress_file(file) {
41
53
  const format = detect_compression_format(file.name);
42
- const is_supported = format !== null && format !== `zip` && format !== `xz` && format !== `bz2`;
43
- return new Promise((resolve, reject) => {
44
- const reader = new FileReader();
45
- reader.addEventListener(`load`, () => {
46
- try {
47
- const result = reader.result;
48
- // strict null check: empty files legitimately read as '' (falsy)
49
- if (result === null)
50
- throw new Error(`Failed to read file`);
51
- if (is_supported && format) {
52
- if (!(result instanceof ArrayBuffer))
53
- throw new Error(`Expected binary file data`);
54
- decompress_data(result, format).then((content) => {
55
- const filename = file.name.replace(COMPRESSION_EXTENSIONS_REGEX, ``);
56
- resolve({ content, filename });
57
- }, reject);
58
- }
59
- else {
60
- if (typeof result !== `string`)
61
- throw new Error(`Expected text file data`);
62
- resolve({ content: result, filename: file.name });
63
- }
64
- }
65
- catch (error) {
66
- reject(to_error(error));
67
- }
68
- }, { once: true });
69
- reader.addEventListener(`error`, () => reject(new Error(`Failed to read file ${file.name}`)));
70
- if (is_supported)
71
- reader.readAsArrayBuffer(file);
72
- else
73
- reader.readAsText(file);
74
- });
54
+ // zip/xz/bz2 are handled by their own code paths; null = not compressed
55
+ const decompressible = is_browser_decompressible_format(format) ? format : null;
56
+ const buffer = await file.arrayBuffer();
57
+ if (decompressible) {
58
+ const filename = file.name.replace(COMPRESSION_EXTENSIONS_REGEX, ``);
59
+ const decompressed = await decompress_data_binary(buffer, decompressible);
60
+ return { content: to_content(filename, decompressed), filename };
61
+ }
62
+ return { content: to_content(file.name, buffer), filename: file.name };
75
63
  }
@@ -1,13 +1,20 @@
1
1
  import type { AnyStructure } from '../structure';
2
2
  import { type Camera, type Scene, type WebGLRenderer } from 'three';
3
3
  export declare const renderer_registry: WeakMap<HTMLCanvasElement, WebGLRenderer>;
4
+ export declare const scene_registry: WeakMap<HTMLCanvasElement, {
5
+ scene: Scene;
6
+ camera: Camera;
7
+ }>;
4
8
  export declare const dpi_to_scale: (png_dpi: number) => number;
5
9
  export declare function canvas_to_png_blob(canvas: HTMLCanvasElement, png_dpi?: number, scene?: Scene | null, camera?: Camera | null): Promise<Blob>;
6
10
  export declare function export_canvas_as_png(canvas: HTMLCanvasElement | null, structure_or_filename: AnyStructure | string | undefined, png_dpi?: number, scene?: Scene | null, camera?: Camera | null): void;
7
- export declare function svg_to_svg_string(svg_element: SVGElement, inline_styles?: readonly string[]): string;
8
- export declare function export_svg_as_svg(svg_element: SVGElement | null, filename: string, inline_styles?: readonly string[]): void;
9
- export declare function svg_to_png_blob(svg_element: SVGElement, png_dpi?: number, inline_styles?: readonly string[]): Promise<Blob>;
10
- export declare function export_svg_as_png(svg_element: SVGElement | null, filename: string, png_dpi?: number, inline_styles?: readonly string[]): void;
11
+ export interface SvgExportOptions {
12
+ viewbox_padding?: number | `stroke`;
13
+ }
14
+ export declare function svg_to_svg_string(svg_element: SVGElement, inline_styles?: readonly string[], options?: SvgExportOptions): string;
15
+ export declare function export_svg_as_svg(svg_element: SVGElement | null, filename: string, inline_styles?: readonly string[], options?: SvgExportOptions): void;
16
+ export declare function svg_to_png_blob(svg_element: SVGElement, png_dpi?: number, inline_styles?: readonly string[], options?: SvgExportOptions): Promise<Blob>;
17
+ export declare function export_svg_as_png(svg_element: SVGElement | null, filename: string, png_dpi?: number, inline_styles?: readonly string[], options?: SvgExportOptions): void;
11
18
  export declare function observe_canvas_presence(wrapper: HTMLElement | undefined, set: (has_canvas: boolean) => void): (() => void) | undefined;
12
19
  export declare const estimate_video_bitrate: (pixel_count: number, fps: number) => number;
13
20
  export declare function get_ffmpeg_conversion_command(input_filename: string): string;
package/dist/io/export.js CHANGED
@@ -5,6 +5,10 @@ import { Vector2 } from 'three';
5
5
  // Maps a Threlte canvas to its WebGLRenderer so PNG export can look up the renderer for a
6
6
  // given canvas without mutating the DOM element. Populated by bind_renderer (scene/).
7
7
  export const renderer_registry = new WeakMap();
8
+ // Companion scene+camera mapping: WebGL buffers are cleared after present
9
+ // (preserveDrawingBuffer is off), so any capture of a live canvas must
10
+ // re-render synchronously first — which needs the scene and active camera.
11
+ export const scene_registry = new WeakMap();
8
12
  // PNG DPI -> render scale relative to the 72 DPI baseline, capped at 10x. DPI floors
9
13
  // at 1 (non-finite -> 72) so bad inputs can't yield 0x0 canvases or NaN pixel ratios.
10
14
  export const dpi_to_scale = (png_dpi) => Math.min(Math.max(1, Number.isFinite(png_dpi) ? png_dpi : 72) / 72, 10);
@@ -90,6 +94,54 @@ function set_svg_font_family(svg) {
90
94
  // Also set as attribute for extra robustness
91
95
  svg.setAttribute(`font-family`, `sans-serif`);
92
96
  }
97
+ function svg_viewbox(svg, padding = 0) {
98
+ const parts = svg
99
+ .getAttribute(`viewBox`)
100
+ ?.trim()
101
+ .split(/[\s,]+/)
102
+ .map(Number);
103
+ if (parts?.length !== 4 || !parts.every(Number.isFinite))
104
+ return null;
105
+ const [x, y, width, height] = parts;
106
+ if (width <= 0 || height <= 0)
107
+ return null;
108
+ const padded = [
109
+ x - padding,
110
+ y - padding,
111
+ width + 2 * padding,
112
+ height + 2 * padding,
113
+ ];
114
+ return padded.every(Number.isFinite) && padded[2] > 0 && padded[3] > 0 ? padded : null;
115
+ }
116
+ function resolve_viewbox_padding(svg, options) {
117
+ if (options.viewbox_padding !== `stroke`) {
118
+ return Number.isFinite(options.viewbox_padding)
119
+ ? Math.max(0, options.viewbox_padding ?? 0)
120
+ : 0;
121
+ }
122
+ let max_stroke_width = 0;
123
+ for (const element of [svg, ...svg.querySelectorAll(`*`)]) {
124
+ const computed = getComputedStyle(element);
125
+ const inline_style = element.style;
126
+ const stroke = [
127
+ inline_style.stroke,
128
+ computed.getPropertyValue(`stroke`),
129
+ element.getAttribute(`stroke`),
130
+ ].find(Boolean) ?? ``;
131
+ if (!stroke || stroke === `none` || stroke === `transparent`)
132
+ continue;
133
+ // oxlint-disable-next-line unicorn/prefer-number-coercion -- CSS lengths include units
134
+ const stroke_width = Number.parseFloat([
135
+ inline_style.strokeWidth,
136
+ computed.getPropertyValue(`stroke-width`),
137
+ element.getAttribute(`stroke-width`),
138
+ ].find(Boolean) ?? ``);
139
+ if (Number.isFinite(stroke_width)) {
140
+ max_stroke_width = Math.max(max_stroke_width, stroke_width);
141
+ }
142
+ }
143
+ return max_stroke_width / 2;
144
+ }
93
145
  // Copy the given computed-style props from each live SVG element to its clone counterpart;
94
146
  // identical structure lets querySelectorAll(`*`) walk both in lockstep. Writes clone-only.
95
147
  function inline_computed_styles(live, clone, properties) {
@@ -106,10 +158,17 @@ function inline_computed_styles(live, clone, properties) {
106
158
  }
107
159
  // Clone, inline the given computed-style props, ensure font-family + xmlns, then serialize
108
160
  // to a standalone SVG string. Never mutates the live element.
109
- function serialize_svg_for_export(svg_element, inline_styles = []) {
161
+ function serialize_svg_for_export(svg_element, inline_styles = [], viewbox_padding = 0, strip_dimensions = false) {
110
162
  const clone = svg_element.cloneNode(true);
111
163
  if (inline_styles.length)
112
164
  inline_computed_styles(svg_element, clone, inline_styles);
165
+ const padded_viewbox = viewbox_padding > 0 ? svg_viewbox(clone, viewbox_padding) : null;
166
+ if (padded_viewbox)
167
+ clone.setAttribute(`viewBox`, padded_viewbox.join(` `));
168
+ if (strip_dimensions) {
169
+ clone.removeAttribute(`width`);
170
+ clone.removeAttribute(`height`);
171
+ }
113
172
  set_svg_font_family(clone);
114
173
  if (!clone.hasAttribute(`xmlns`)) {
115
174
  clone.setAttribute(`xmlns`, `http://www.w3.org/2000/svg`);
@@ -121,18 +180,19 @@ function serialize_svg_for_export(svg_element, inline_styles = []) {
121
180
  export function svg_to_svg_string(svg_element,
122
181
  // CSS props to inline from computed styles as presentation attributes; a standalone SVG
123
182
  // drops page stylesheets (e.g. Svelte component styles), so class-based styling is lost.
124
- inline_styles = []) {
125
- const svg_string = serialize_svg_for_export(svg_element, inline_styles);
183
+ inline_styles = [], options = {}) {
184
+ const viewbox_padding = resolve_viewbox_padding(svg_element, options);
185
+ const svg_string = serialize_svg_for_export(svg_element, inline_styles, viewbox_padding);
126
186
  return `<?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n${svg_string}`;
127
187
  }
128
188
  // Export SVG element as SVG file (triggers browser download)
129
- export function export_svg_as_svg(svg_element, filename, inline_styles = []) {
189
+ export function export_svg_as_svg(svg_element, filename, inline_styles = [], options = {}) {
130
190
  if (!svg_element) {
131
191
  console.warn(`SVG element not found for export`);
132
192
  return;
133
193
  }
134
194
  try {
135
- const svg_content = svg_to_svg_string(svg_element, inline_styles);
195
+ const svg_content = svg_to_svg_string(svg_element, inline_styles, options);
136
196
  download(svg_content, filename, `image/svg+xml;charset=utf-8`);
137
197
  }
138
198
  catch (error) {
@@ -144,18 +204,14 @@ export function export_svg_as_svg(svg_element, filename, inline_styles = []) {
144
204
  // Image element, and returns the resulting PNG Blob. Rejects if viewBox is
145
205
  // missing or dimensions are invalid (zero width/height).
146
206
  // DPI is converted to a resolution multiplier relative to 72 DPI baseline, capped at 10x.
147
- export function svg_to_png_blob(svg_element, png_dpi = 150, inline_styles = []) {
148
- const viewBox = svg_element.getAttribute(`viewBox`)?.trim();
149
- if (!viewBox)
207
+ export function svg_to_png_blob(svg_element, png_dpi = 150, inline_styles = [], options = {}) {
208
+ if (!svg_element.getAttribute(`viewBox`)?.trim())
150
209
  return Promise.reject(new Error(`SVG viewBox not found for PNG export`));
151
- const parts = viewBox.split(/[\s,]+/).map(Number);
152
- if (parts.length < 4 || !parts.every(Number.isFinite)) {
153
- return Promise.reject(new Error(`Invalid SVG dimensions for PNG export`));
154
- }
155
- const [, , width, height] = parts;
156
- if (!(width > 0) || !(height > 0)) {
210
+ const padding = resolve_viewbox_padding(svg_element, options);
211
+ const padded_viewbox = svg_viewbox(svg_element, padding);
212
+ if (!padded_viewbox)
157
213
  return Promise.reject(new Error(`Invalid SVG dimensions for PNG export`));
158
- }
214
+ const [, , width, height] = padded_viewbox;
159
215
  if (!Number.isFinite(png_dpi) || png_dpi <= 0) {
160
216
  return Promise.reject(new Error(`Invalid PNG DPI for export`));
161
217
  }
@@ -169,7 +225,7 @@ export function svg_to_png_blob(svg_element, png_dpi = 150, inline_styles = [])
169
225
  return Promise.reject(new Error(`Canvas 2D context not available`));
170
226
  canvas.width = pixel_width;
171
227
  canvas.height = pixel_height;
172
- const serialized = serialize_svg_for_export(svg_element, inline_styles);
228
+ const serialized = serialize_svg_for_export(svg_element, inline_styles, padding, padding > 0);
173
229
  const svg_blob = new Blob([serialized], { type: `image/svg+xml;charset=utf-8` });
174
230
  const svg_data_url = URL.createObjectURL(svg_blob);
175
231
  return new Promise((resolve, reject) => {
@@ -200,12 +256,12 @@ export function svg_to_png_blob(svg_element, png_dpi = 150, inline_styles = [])
200
256
  });
201
257
  }
202
258
  // Export SVG element as PNG (triggers browser download)
203
- export function export_svg_as_png(svg_element, filename, png_dpi = 150, inline_styles = []) {
259
+ export function export_svg_as_png(svg_element, filename, png_dpi = 150, inline_styles = [], options = {}) {
204
260
  if (!svg_element) {
205
261
  console.warn(`SVG element not found for PNG export`);
206
262
  return;
207
263
  }
208
- svg_to_png_blob(svg_element, png_dpi, inline_styles)
264
+ svg_to_png_blob(svg_element, png_dpi, inline_styles, options)
209
265
  .then((blob) => download(blob, filename, `image/png`))
210
266
  .catch((error) => console.error(`Error exporting PNG:`, error));
211
267
  }
@@ -303,7 +359,7 @@ export async function export_trajectory_video(canvas, filename, options = {}) {
303
359
  is_resolved = true;
304
360
  try {
305
361
  const blob = new Blob(chunks, { type: `video/webm` });
306
- const webm_filename = filename.replace(/\.(mp4|webm)$/i, `.webm`);
362
+ const webm_filename = filename.replace(/\.(?:mp4|webm)$/i, `.webm`);
307
363
  download(blob, webm_filename, `video/webm`);
308
364
  on_progress?.(100);
309
365
  resolve();
@@ -1,6 +1,3 @@
1
1
  export declare const to_query: (params: Record<string, string | number | undefined>) => string;
2
- export declare function fetch_zipped<T>(url: string, { unzip }?: {
3
- unzip?: boolean | undefined;
4
- }): Promise<T | null>;
5
2
  export type DownloadData = string | Blob | ArrayBuffer | ArrayBufferView<ArrayBuffer>;
6
3
  export declare function download(data: DownloadData, filename: string, type: string): void;
package/dist/io/fetch.js CHANGED
@@ -1,19 +1,8 @@
1
- import { decompress_data } from './decompress';
2
1
  // Convert params object to URL query string, omitting empty/undefined values.
3
2
  // Example: {foo: "bar", baz: 42, empty: ""} → "foo=bar&baz=42"
4
3
  export const to_query = (params) => new URLSearchParams(Object.entries(params)
5
4
  .filter(([, val]) => val !== `` && val !== undefined)
6
5
  .map(([key, val]) => [key, String(val)])).toString();
7
- export async function fetch_zipped(url, { unzip = true } = {}) {
8
- const response = await fetch(url);
9
- if (!response.ok) {
10
- console.error(`${response.status} ${response.statusText} for ${response.url}`);
11
- return null;
12
- }
13
- if (!unzip)
14
- return (await response.blob());
15
- return JSON.parse(await decompress_data(response.body, `gzip`));
16
- }
17
6
  // Original download implementation
18
7
  function default_download(data, filename, type) {
19
8
  const file = new Blob([data], { type });
@@ -1,6 +1,6 @@
1
1
  // Shared file-drop handler composable for drag-and-drop file loading.
2
2
  import { decompress_file } from './decompress';
3
- import { handle_url_drop } from './url-drop';
3
+ import { dropped_file_url, load_from_url } from './url-drop';
4
4
  import { to_error } from '../utils';
5
5
  // Drag-over visual-state handlers for file-drop zones; spread onto the drop target
6
6
  // alongside `ondrop` from create_file_drop_handler
@@ -16,40 +16,65 @@ export const drag_over_handlers = (opts) => ({
16
16
  ondragleave: () => opts.set_dragover(false),
17
17
  });
18
18
  // Handles URL drops (from FilePicker), direct file drops with decompression,
19
- // loading state, and error reporting.
20
- export const create_file_drop_handler = (opts) => async (event) => {
21
- event.preventDefault();
22
- if (!opts.allow())
23
- return;
24
- opts.set_loading?.(true);
25
- let drop_filename = ``;
26
- try {
27
- let url_error;
28
- const handled = await handle_url_drop(event, opts.on_drop).catch((exc) => {
29
- url_error = to_error(exc).message;
30
- return false;
31
- });
32
- if (handled)
33
- return;
34
- const file = event.dataTransfer?.files[0];
35
- if (!file) {
36
- if (url_error)
37
- opts.on_error?.(`Failed to load from URL: ${url_error}`);
38
- return;
19
+ // loading state, and error reporting. Multiple dropped files are processed
20
+ // sequentially in drop order so e.g. several cube files can be imported at once.
21
+ // Overlapping drops are queued: a batch starting while a previous one is still
22
+ // processing would interleave on_drop state mutations (e.g. torn volume lists).
23
+ export const create_file_drop_handler = (opts) => {
24
+ async function process_batch(url, files) {
25
+ opts.set_loading?.(true);
26
+ try {
27
+ // One failing item must not abort the rest of the batch
28
+ const failures = [];
29
+ if (url) {
30
+ try {
31
+ await load_from_url(url, opts.on_drop);
32
+ }
33
+ catch (exc) {
34
+ // URL failed; if plain files were also dropped, still process them
35
+ // and fold the URL failure into the aggregate report
36
+ if (files.length === 0) {
37
+ opts.on_error?.(`Failed to load from URL: ${to_error(exc).message}`);
38
+ return;
39
+ }
40
+ failures.push(`URL ${url}: ${to_error(exc).message}`);
41
+ }
42
+ }
43
+ if (files.length === 0)
44
+ return;
45
+ for (const file of files) {
46
+ try {
47
+ const { content, filename } = await decompress_file(file);
48
+ if (content)
49
+ await opts.on_drop(content, filename);
50
+ else
51
+ failures.push(`${file.name}: file is empty`);
52
+ }
53
+ catch (exc) {
54
+ failures.push(`${file.name}: ${to_error(exc).message}`);
55
+ }
56
+ }
57
+ if (failures.length > 0) {
58
+ opts.on_error?.(`Failed to load ${failures.length} file${failures.length > 1 ? `s` : ``} — ${failures.join(`; `)}`);
59
+ }
60
+ }
61
+ catch (exc) {
62
+ opts.on_error?.(`Failed to load file: ${to_error(exc).message}`);
63
+ }
64
+ finally {
65
+ opts.set_loading?.(false);
39
66
  }
40
- drop_filename = file.name;
41
- const { content, filename } = await decompress_file(file);
42
- if (content)
43
- await opts.on_drop(content, filename);
44
- }
45
- catch (exc) {
46
- const detail = to_error(exc).message;
47
- const msg = drop_filename
48
- ? `Failed to load file ${drop_filename}: ${detail}`
49
- : `Failed to load file: ${detail}`;
50
- opts.on_error?.(msg);
51
- }
52
- finally {
53
- opts.set_loading?.(false);
54
67
  }
68
+ let queue = Promise.resolve();
69
+ return (event) => {
70
+ event.preventDefault();
71
+ if (!opts.allow())
72
+ return Promise.resolve();
73
+ // DataTransfer contents are only readable during drop-event dispatch, so
74
+ // capture them before deferring to the queue
75
+ const url = dropped_file_url(event);
76
+ const files = Array.from(event.dataTransfer?.files ?? []);
77
+ queue = queue.then(() => process_batch(url, files)).catch(() => undefined);
78
+ return queue;
79
+ };
55
80
  };
@@ -6,4 +6,3 @@ export * from './file-drop';
6
6
  export * from './is-binary';
7
7
  export type * from './types';
8
8
  export * from './url-drop';
9
- export declare function strip_compression_extensions(filename: string): string;
package/dist/io/index.js CHANGED
@@ -1,16 +1,9 @@
1
- import { COMPRESSION_EXTENSIONS_REGEX } from '../constants';
2
1
  export { default as ExportPane } from './ExportPane.svelte';
2
+ // strip_compression_extensions lives in ./decompress (Svelte-free) so parser
3
+ // modules can import it inside Web Workers; re-exported here.
3
4
  export * from './decompress';
4
5
  export * from './export';
5
6
  export * from './fetch';
6
7
  export * from './file-drop';
7
8
  export * from './is-binary';
8
9
  export * from './url-drop';
9
- // Lowercase a filename and strip all trailing compression extensions (.gz, .zip, ...)
10
- export function strip_compression_extensions(filename) {
11
- let base_name = filename.toLowerCase();
12
- while (COMPRESSION_EXTENSIONS_REGEX.test(base_name)) {
13
- base_name = base_name.replace(COMPRESSION_EXTENSIONS_REGEX, ``);
14
- }
15
- return base_name;
16
- }
@@ -1 +1,10 @@
1
1
  export declare const is_binary: (content: string) => boolean;
2
+ export declare const has_gzip_magic: (bytes: Uint8Array) => boolean;
3
+ export declare const has_hdf5_magic: (bytes: Uint8Array) => boolean;
4
+ export declare const has_binary_magic: (bytes: Uint8Array) => boolean;
5
+ export declare const ext_of: (name: string) => string;
6
+ export declare const BINARY_EXTENSIONS: Set<string>;
7
+ export declare const is_known_text_file: (basename: string) => boolean;
8
+ export declare const strip_gz_ext: (filename: string) => string;
9
+ export declare const has_binary_inner_ext: (filename: string) => boolean;
10
+ export declare const is_binary_payload: (filename: string, buffer: ArrayBuffer) => boolean;