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
@@ -1,8 +1,9 @@
1
1
  <script lang="ts">
2
- import { luminance } from '../../../colors'
2
+ import { get_d3_interpolator, luminance } from '../../../colors'
3
3
  import Spinner from '../../../feedback/Spinner.svelte'
4
4
  import { format_num } from '../../../labels'
5
5
  import { sanitize_html } from '../../../sanitize'
6
+ import { clamp01 } from '../../../utils'
6
7
  import type { Vec2 } from '../../../math'
7
8
  import * as math from '../../../math'
8
9
  import { format } from 'd3-format'
@@ -20,11 +21,15 @@
20
21
  Orientation,
21
22
  ScaleType,
22
23
  } from '../types'
23
- import { get_arcsinh_threshold, get_scale_type_name } from '../types'
24
+ import {
25
+ get_arcsinh_threshold,
26
+ get_scale_type_name,
27
+ SCALE_DEFAULTS,
28
+ } from '../types'
24
29
 
25
30
  let {
26
31
  title = $bindable(),
27
- color_scale = $bindable(`interpolateViridis`),
32
+ color_scale = $bindable(SCALE_DEFAULTS.scheme),
28
33
  bar_style = undefined,
29
34
  title_style = undefined,
30
35
  wrapper_style = undefined,
@@ -104,10 +109,9 @@
104
109
  if (orientation === `horizontal`) {
105
110
  return tick_side === `primary` ? `top` : `bottom`
106
111
  } // orientation === `vertical`
107
- // If ticks are primary (right), default label to left
108
- // If ticks are secondary (left), default label to right
109
- return tick_side === `primary` ? `left` : `right`
110
-
112
+ // If ticks are primary (right), default label to left
113
+ // If ticks are secondary (left), default label to right
114
+ return tick_side === `primary` ? `left` : `right`
111
115
  })
112
116
 
113
117
  // Number of ticks to generate
@@ -115,29 +119,43 @@
115
119
  Array.isArray(tick_labels)
116
120
  ? tick_labels.length
117
121
  : typeof tick_labels === `number`
118
- ? tick_labels
119
- : 5,
122
+ ? tick_labels
123
+ : 5,
120
124
  )
121
125
 
126
+ // Log scales need positive bounds: a non-positive max falls back to linear
127
+ // (with a warning), a non-positive min is clamped to LOG_EPS.
128
+ const prepare_log_domain = (
129
+ min: number,
130
+ max: number,
131
+ context: string,
132
+ ): { min: number; use_log: boolean } => {
133
+ if (max <= 0) {
134
+ console.warn(
135
+ `Log scale requires a positive max value ${context}. Received max=${max}. Falling back to linear.`,
136
+ )
137
+ return { min, use_log: false }
138
+ }
139
+ if (min <= 0) {
140
+ console.warn(
141
+ `Log scale received non-positive min value (${min}) ${context}. Using epsilon=${math.LOG_EPS} instead.`,
142
+ )
143
+ return { min: math.LOG_EPS, use_log: true }
144
+ }
145
+ return { min, use_log: true }
146
+ }
147
+
122
148
  // Scale for ticks - based *only* on 'range' prop and 'scale_type' for ticks
123
149
  let scale_for_ticks = $derived.by(() => {
124
150
  const type_name = get_scale_type_name(scale_type)
125
- let use_log_for_ticks = type_name === `log`
126
151
  let [scale_min, scale_max] = range
127
-
128
- // Validate range for log scale ticks and apply epsilon if needed
152
+ let use_log_for_ticks = type_name === `log`
129
153
  if (use_log_for_ticks) {
130
- if (scale_max <= 0) {
131
- console.warn(
132
- `Log scale requires a positive max value for ticks. Received max=${scale_max}. Using linear scale for ticks instead.`,
133
- )
134
- use_log_for_ticks = false
135
- } else if (scale_min <= 0) {
136
- console.warn(
137
- `Log scale received non-positive min value (${scale_min}) for ticks. Using epsilon=${math.LOG_EPS} instead.`,
138
- )
139
- scale_min = math.LOG_EPS // Substitute with epsilon
140
- }
154
+ ;({ min: scale_min, use_log: use_log_for_ticks } = prepare_log_domain(
155
+ scale_min,
156
+ scale_max,
157
+ `for ticks`,
158
+ ))
141
159
  }
142
160
 
143
161
  // For arcsinh, use our custom scale
@@ -208,11 +226,13 @@
208
226
  if (
209
227
  Math.abs(Math.log10(nice_min) % 1) < FRACTIONAL_TOL &&
210
228
  !power_of_10_ticks.includes(nice_min)
211
- ) power_of_10_ticks.unshift(nice_min)
229
+ )
230
+ power_of_10_ticks.unshift(nice_min)
212
231
  if (
213
232
  Math.abs(Math.log10(nice_max) % 1) < FRACTIONAL_TOL &&
214
233
  !power_of_10_ticks.includes(nice_max)
215
- ) power_of_10_ticks.push(nice_max)
234
+ )
235
+ power_of_10_ticks.push(nice_max)
216
236
 
217
237
  // If no powers of 10 are within range (e.g. [0.1, 0.9]), fall back to D3 ticks?
218
238
  // Or just return filtered list which might be empty?
@@ -242,7 +262,6 @@
242
262
  const fraction = idx / (n_ticks - 1)
243
263
  return scale_min + fraction * (scale_max - scale_min)
244
264
  })
245
-
246
265
  })
247
266
 
248
267
  // Update nice_range binding when snapping ticks
@@ -261,7 +280,7 @@
261
280
  if (color_scale_fn) return color_scale_fn // Prioritize passed function
262
281
 
263
282
  // Fallback: create function from scheme name/function in 'color_scale' prop
264
- let interpolator = d3_sc.interpolateViridis // Default interpolator
283
+ let interpolator = get_d3_interpolator(SCALE_DEFAULTS.scheme) // Default interpolator
265
284
  if (typeof color_scale === `string`) {
266
285
  const func_name = color_scale.startsWith(`interpolate`)
267
286
  ? color_scale
@@ -269,9 +288,7 @@
269
288
  if (func_name in d3_sc) {
270
289
  interpolator = d3_sc[func_name as D3InterpolateName]
271
290
  } else {
272
- console.error(
273
- `Color scale '${color_scale}' not found. Falling back on 'Viridis'.`,
274
- )
291
+ console.error(`Color scale '${color_scale}' not found. Falling back on 'Viridis'.`)
275
292
  }
276
293
  } else if (typeof color_scale === `function`) {
277
294
  // User passed a function (assumed interpolator [0,1] -> color)
@@ -285,17 +302,11 @@
285
302
  // Use scale_type for fallback scale creation too. Validate domain for log.
286
303
  let use_log_fallback = type_name === `log`
287
304
  if (use_log_fallback) {
288
- if (max_val <= 0) {
289
- console.warn(
290
- `Log scale requires a positive max value for fallback scale. Received max=${max_val}. Using linear scale for colors.`,
291
- )
292
- use_log_fallback = false
293
- } else if (min_val <= 0) {
294
- console.warn(
295
- `Log scale received non-positive min value (${min_val}) for fallback scale. Using epsilon=${math.LOG_EPS} instead.`,
296
- )
297
- min_val = math.LOG_EPS // Substitute with epsilon
298
- }
305
+ ;({ min: min_val, use_log: use_log_fallback } = prepare_log_domain(
306
+ min_val,
307
+ max_val,
308
+ `for fallback scale`,
309
+ ))
299
310
  }
300
311
 
301
312
  // Use potentially adjusted min/max for domain (ascending)
@@ -312,7 +323,7 @@
312
323
  return (value: number): string => {
313
324
  const t_val = Math.asinh(value / threshold)
314
325
  const normalized = t_max === t_min ? 0.5 : (t_val - t_min) / (t_max - t_min)
315
- return interpolator(Math.max(0, Math.min(1, normalized)))
326
+ return interpolator(clamp01(normalized))
316
327
  }
317
328
  }
318
329
 
@@ -335,27 +346,25 @@
335
346
  // Validate domain for log interpolation and apply epsilon if needed
336
347
  let use_log_interp = type_name === `log`
337
348
  let adjusted_min_ramp = min_ramp_domain
338
- let adjusted_max_ramp = max_ramp_domain
339
-
349
+ const adjusted_max_ramp = max_ramp_domain
340
350
  if (use_log_interp) {
341
- if (max_ramp_domain <= 0) {
342
- console.warn(
343
- `Log scale specified for gradient, but max domain value (${max_ramp_domain}) is not positive. Using linear interpolation.`,
344
- )
345
- use_log_interp = false
346
- } else if (min_ramp_domain <= 0) {
347
- console.warn(
348
- `Log scale specified for gradient, but min domain value (${min_ramp_domain}) is not positive. Using epsilon=${math.LOG_EPS} instead.`,
349
- )
350
- adjusted_min_ramp = math.LOG_EPS // Substitute with epsilon
351
- }
351
+ ;({ min: adjusted_min_ramp, use_log: use_log_interp } = prepare_log_domain(
352
+ min_ramp_domain,
353
+ max_ramp_domain,
354
+ `for gradient`,
355
+ ))
352
356
  }
353
357
 
354
358
  const n_steps = Math.max(2, Math.floor(steps)) // guard against steps <= 1 to avoid NaN/degenerate gradients
355
359
 
356
360
  // Pre-compute loop-invariant values for each scale type
357
- let log_min = 0, log_max = 0, log_span = 0
358
- let asinh_threshold = 1, asinh_min = 0, asinh_max = 0, asinh_span = 0
361
+ let log_min = 0,
362
+ log_max = 0,
363
+ log_span = 0
364
+ let asinh_threshold = 1,
365
+ asinh_min = 0,
366
+ asinh_max = 0,
367
+ asinh_span = 0
359
368
  const linear_span = max_ramp_domain - min_ramp_domain
360
369
 
361
370
  if (use_log_interp) {
@@ -375,13 +384,12 @@
375
384
  let data_value: number
376
385
 
377
386
  if (use_log_interp) {
378
- data_value = log_span === 0
379
- ? adjusted_min_ramp
380
- : 10 ** (log_min + fraction * log_span)
387
+ data_value = log_span === 0 ? adjusted_min_ramp : 10 ** (log_min + fraction * log_span)
381
388
  } else if (type_name === `arcsinh`) {
382
- data_value = asinh_span === 0
383
- ? min_ramp_domain
384
- : Math.sinh(asinh_min + fraction * asinh_span) * asinh_threshold
389
+ data_value =
390
+ asinh_span === 0
391
+ ? min_ramp_domain
392
+ : Math.sinh(asinh_min + fraction * asinh_span) * asinh_threshold
385
393
  } else {
386
394
  data_value = min_ramp_domain + fraction * linear_span
387
395
  }
@@ -398,15 +406,9 @@
398
406
 
399
407
  // CSS variables for bar width/height based on orientation
400
408
  let final_bar_style = $derived(
401
- `--cbar-width: ${
402
- orientation === `horizontal` ? `100%` : `var(--cbar-thickness, 10px)`
403
- };
404
- --cbar-height: ${
405
- orientation === `vertical` ? `100%` : `var(--cbar-thickness, 10px)`
406
- };
407
- background: linear-gradient(${grad_dir}, ${ramped.join(`, `)}); ${
408
- bar_style ?? ``
409
- }`,
409
+ `--cbar-width: ${orientation === `horizontal` ? `100%` : `var(--cbar-thickness, 10px)`};
410
+ --cbar-height: ${orientation === `vertical` ? `100%` : `var(--cbar-thickness, 10px)`};
411
+ background: linear-gradient(${grad_dir}, ${ramped.join(`, `)}); ${bar_style ?? ``}`,
410
412
  )
411
413
 
412
414
  // Calculate additional margin for main label if it overlaps with ticks
@@ -415,11 +417,14 @@
415
417
  if (tick_side === `inside`) return ``
416
418
 
417
419
  // Determine concrete side outside ticks are on
418
- const concrete_outside_tick_side = orientation === `horizontal`
419
- ? tick_side === `primary` ? `bottom` : `top`
420
- : tick_side === `primary`
421
- ? `right`
422
- : `left`
420
+ const concrete_outside_tick_side =
421
+ orientation === `horizontal`
422
+ ? tick_side === `primary`
423
+ ? `bottom`
424
+ : `top`
425
+ : tick_side === `primary`
426
+ ? `right`
427
+ : `left`
423
428
 
424
429
  if (actual_title_side !== concrete_outside_tick_side) return ``
425
430
 
@@ -443,8 +448,7 @@
443
448
  ? `max-width: var(--cbar-label-max-width, 2em);`
444
449
  : ``
445
450
 
446
- return `${size_constraint} ${label_overlap_margin_style} ${title_style ?? ``}`
447
- .trim()
451
+ return `${size_constraint} ${label_overlap_margin_style} ${title_style ?? ``}`.trim()
448
452
  })
449
453
 
450
454
  function get_tick_text_color(tick_value: number): string | null {
@@ -462,9 +466,7 @@
462
466
  }
463
467
 
464
468
  let has_property_select = $derived(property_options && property_options.length > 0)
465
- let has_color_scale_select = $derived(
466
- color_scale_options && color_scale_options.length > 0,
467
- )
469
+ let has_color_scale_select = $derived(color_scale_options && color_scale_options.length > 0)
468
470
  let has_any_select = $derived(has_property_select || has_color_scale_select)
469
471
 
470
472
  // Keep bindable selected keys valid so state matches the select's first-option fallback.
@@ -522,35 +524,31 @@
522
524
  // Align items based on orientation and title position
523
525
  let div_style = $derived(`
524
526
  --cbar-wrapper-align-items: ${
525
- orientation === `vertical` &&
526
- (actual_title_side === `left` || actual_title_side === `right`)
527
- ? `stretch`
528
- : `center`
529
- };
527
+ orientation === `vertical` &&
528
+ (actual_title_side === `left` || actual_title_side === `right`)
529
+ ? `stretch`
530
+ : `center`
531
+ };
530
532
  --cbar-label-display: ${
531
- orientation === `vertical` &&
532
- (actual_title_side === `left` || actual_title_side === `right`)
533
- ? `flex`
534
- : `inline-block`
535
- };
533
+ orientation === `vertical` &&
534
+ (actual_title_side === `left` || actual_title_side === `right`)
535
+ ? `flex`
536
+ : `inline-block`
537
+ };
536
538
  height: ${
537
- orientation === `vertical`
538
- ? `var(--cbar-height, 100%)`
539
- : `var(--cbar-height, auto)`
540
- };
541
- min-height: ${
542
- orientation === `vertical` ? `var(--cbar-min-height, 150px)` : `auto`
543
- };
539
+ orientation === `vertical` ? `var(--cbar-height, 100%)` : `var(--cbar-height, auto)`
540
+ };
541
+ min-height: ${orientation === `vertical` ? `var(--cbar-min-height, 150px)` : `auto`};
544
542
  max-height: ${
545
- orientation === `vertical` ? `var(--cbar-max-height, 1000px)` : `none`
546
- }; ${wrapper_style ?? ``}`)
543
+ orientation === `vertical` ? `var(--cbar-max-height, 1000px)` : `none`
544
+ }; ${wrapper_style ?? ``}`)
547
545
  </script>
548
546
 
549
547
  <div
550
548
  style:flex-direction={wrapper_flex_dir}
551
549
  {...rest}
552
550
  style={div_style + (rest.style ?? ``)}
553
- class="colorbar {rest.class ?? ``}"
551
+ class={[`colorbar`, rest.class]}
554
552
  >
555
553
  {#if title || has_any_select}
556
554
  <div class="title-row {actual_title_side} {orientation}" style={actual_title_style}>
@@ -583,10 +581,7 @@
583
581
  </div>
584
582
  {/if}
585
583
  <div style={final_bar_style} class="bar">
586
- {#each tick_side === `inside` ? ticks_array.slice(1, -1) : ticks_array as
587
- tick_label
588
- (tick_label)
589
- }
584
+ {#each tick_side === `inside` ? ticks_array.slice(1, -1) : ticks_array as tick_label (tick_label)}
590
585
  {@const position_percent =
591
586
  // Use derived scale's mapping function to get position percent
592
587
  scale_for_ticks(tick_label)}
@@ -7,7 +7,7 @@
7
7
 
8
8
  let {
9
9
  options = Object.keys(d3_sc).filter((key) =>
10
- key.startsWith(`interpolate`)
10
+ key.startsWith(`interpolate`),
11
11
  ) as D3InterpolateName[],
12
12
  value = $bindable(options[0]),
13
13
  selected = $bindable([]),
@@ -4,11 +4,7 @@
4
4
  import { interpolatePath } from 'd3-interpolate-path'
5
5
  import { untrack } from 'svelte'
6
6
  import { Tween, type TweenOptions } from 'svelte/motion'
7
- import type {
8
- FillGradient,
9
- FillHandlerEvent,
10
- FillRegion,
11
- } from '../types'
7
+ import type { FillGradient, FillHandlerEvent, FillRegion } from '../types'
12
8
  import { unique_id } from '../utils'
13
9
 
14
10
  let {
@@ -37,22 +33,20 @@
37
33
 
38
34
  // Stable instance ID for gradient uniqueness (generated once per component instance)
39
35
  const instance_id = unique_id()
40
- let gradient_id = $derived(
41
- `fill-gradient-${region.id ?? region_idx}-${instance_id}`,
42
- )
36
+ let gradient_id = $derived(`fill-gradient-${region.id ?? region_idx}-${instance_id}`)
43
37
 
44
38
  // On hover (without an explicit hover_style), noticeably raise opacity. A faint fill (e.g. a
45
39
  // low-alpha rgba color at the default 0.3 fill-opacity) is otherwise nearly invisible, so a mere
46
40
  // brightness filter reads as "no change". An explicit hover_style.fill_opacity always wins.
47
41
  let effective_opacity = $derived(
48
42
  is_hovered
49
- ? region.hover_style?.fill_opacity ?? Math.min(1, (region.fill_opacity ?? 0.3) + 0.4)
50
- : region.fill_opacity ?? 0.3,
43
+ ? (region.hover_style?.fill_opacity ?? Math.min(1, (region.fill_opacity ?? 0.3) + 0.4))
44
+ : (region.fill_opacity ?? 0.3),
51
45
  )
52
46
  let effective_fill = $derived(
53
47
  is_hovered && region.hover_style?.fill
54
48
  ? region.hover_style.fill
55
- : region.fill ?? `steelblue`,
49
+ : (region.fill ?? `steelblue`),
56
50
  )
57
51
  let path_fill = $derived(
58
52
  typeof effective_fill === `object` ? `url(#${gradient_id})` : effective_fill,
@@ -137,8 +131,9 @@
137
131
  // Construct FillHandlerEvent from MouseEvent
138
132
  function construct_event(event: MouseEvent): FillHandlerEvent {
139
133
  const current = event.currentTarget
140
- const rect = (current instanceof SVGElement ? current.ownerSVGElement : null)
141
- ?.getBoundingClientRect()
134
+ const rect = (
135
+ current instanceof SVGElement ? current.ownerSVGElement : null
136
+ )?.getBoundingClientRect()
142
137
  const px = event.clientX - (rect?.left ?? 0)
143
138
  const py = event.clientY - (rect?.top ?? 0)
144
139
  const raw_x = x_scale_fn.invert?.(px) ?? 0
@@ -159,9 +154,7 @@
159
154
  }
160
155
 
161
156
  // Type guard for gradient fill
162
- const is_gradient = (
163
- fill: string | FillGradient | undefined,
164
- ): fill is FillGradient =>
157
+ const is_gradient = (fill: string | FillGradient | undefined): fill is FillGradient =>
165
158
  typeof fill === `object` && fill !== null && `type` in fill
166
159
  </script>
167
160
 
@@ -220,7 +213,7 @@
220
213
  fill={path_fill}
221
214
  fill-opacity={effective_opacity}
222
215
  stroke={hover_stroke ?? `none`}
223
- stroke-width={hover_stroke ? region.hover_style?.stroke_width ?? 1.5 : 0}
216
+ stroke-width={hover_stroke ? (region.hover_style?.stroke_width ?? 1.5) : 0}
224
217
  />
225
218
  </g>
226
219
 
@@ -0,0 +1,249 @@
1
+ <script lang="ts">
2
+ // Shared controls pane for the hierarchical part-of-whole charts. Exported as
3
+ // SunburstControls/TreemapControls from the chart barrels; `chart` picks the
4
+ // chart-specific controls (shape/rotation/radius vs cell paddings) and labels.
5
+ import { NumberRangeInput, SettingsSection } from '../../../layout'
6
+ import type {
7
+ SunburstLabelRotation,
8
+ SunburstLabelText,
9
+ SunburstShape,
10
+ SunburstValueMode,
11
+ } from '../..'
12
+ import { DEFAULTS, SETTINGS_CONFIG } from '../../../settings'
13
+ import type { Snippet } from 'svelte'
14
+ import type { HTMLAttributes } from 'svelte/elements'
15
+ import ControlPane from './ControlPane.svelte'
16
+
17
+ let {
18
+ chart,
19
+ show_controls = $bindable(true),
20
+ controls_open = $bindable(false),
21
+ // shared-option defaults come from the bound chart's own settings (chart is
22
+ // destructured first so later prop defaults can reference it)
23
+ value_mode = $bindable(DEFAULTS[chart].value_mode),
24
+ max_depth = $bindable(DEFAULTS[chart].max_depth),
25
+ min_fraction = $bindable(DEFAULTS[chart].min_fraction),
26
+ show_labels = $bindable(DEFAULTS[chart].show_labels),
27
+ label_text = $bindable(DEFAULTS[chart].label_text),
28
+ zoom_on_click = $bindable(DEFAULTS[chart].zoom_on_click),
29
+ show_breadcrumbs = $bindable(DEFAULTS[chart].show_breadcrumbs),
30
+ shape = $bindable(DEFAULTS.sunburst.shape),
31
+ inner_radius = $bindable(DEFAULTS.sunburst.inner_radius),
32
+ pad_angle = $bindable(DEFAULTS.sunburst.pad_angle),
33
+ label_rotation = $bindable(DEFAULTS.sunburst.label_rotation),
34
+ padding_inner = $bindable(DEFAULTS.treemap.padding_inner),
35
+ padding_top = $bindable(DEFAULTS.treemap.padding_top),
36
+ padding_outer = $bindable(DEFAULTS.treemap.padding_outer),
37
+ export_buttons = true,
38
+ on_export,
39
+ toggle_props = {},
40
+ pane_props = {},
41
+ children,
42
+ }: {
43
+ chart: `sunburst` | `treemap`
44
+ show_controls?: boolean
45
+ controls_open?: boolean
46
+ value_mode?: SunburstValueMode
47
+ max_depth?: number
48
+ min_fraction?: number
49
+ show_labels?: boolean
50
+ label_text?: SunburstLabelText
51
+ zoom_on_click?: boolean
52
+ show_breadcrumbs?: boolean
53
+ // sunburst-only (ignored for treemap)
54
+ shape?: SunburstShape
55
+ inner_radius?: number
56
+ pad_angle?: number
57
+ label_rotation?: SunburstLabelRotation
58
+ // treemap-only (ignored for sunburst)
59
+ padding_inner?: number
60
+ padding_top?: number
61
+ padding_outer?: number
62
+ export_buttons?: boolean // show SVG/PNG download buttons in the pane
63
+ on_export?: (format: `svg` | `png`) => void
64
+ toggle_props?: HTMLAttributes<HTMLButtonElement>
65
+ pane_props?: HTMLAttributes<HTMLDivElement>
66
+ children?: Snippet
67
+ } = $props()
68
+
69
+ let current_values = $derived({
70
+ value_mode,
71
+ max_depth,
72
+ min_fraction,
73
+ show_labels,
74
+ label_text,
75
+ zoom_on_click,
76
+ show_breadcrumbs,
77
+ ...(chart === `sunburst`
78
+ ? { shape, inner_radius, pad_angle, label_rotation }
79
+ : { padding_inner, padding_top, padding_outer }),
80
+ })
81
+
82
+ function reset_to_defaults() {
83
+ ;({
84
+ value_mode,
85
+ max_depth,
86
+ min_fraction,
87
+ show_labels,
88
+ label_text,
89
+ zoom_on_click,
90
+ show_breadcrumbs,
91
+ } = DEFAULTS[chart])
92
+ if (chart === `sunburst`) {
93
+ ;({ shape, inner_radius, pad_angle, label_rotation } = DEFAULTS.sunburst)
94
+ } else ({ padding_inner, padding_top, padding_outer } = DEFAULTS.treemap)
95
+ }
96
+ </script>
97
+
98
+ {#if show_controls}
99
+ <!-- snippets live at the template top level (not inside the components below) so
100
+ they're locally renderable rather than treated as ControlPane/SettingsSection props -->
101
+ {#snippet options(enum_map: Record<string, string>)}
102
+ {#each Object.entries(enum_map) as [value, label] (value)}
103
+ <option {value}>{label}</option>
104
+ {/each}
105
+ {/snippet}
106
+ <ControlPane bind:controls_open controls_class={chart} {toggle_props} {pane_props}>
107
+ {@render children?.()}
108
+ <SettingsSection
109
+ title={chart === `sunburst` ? `Sunburst` : `Treemap`}
110
+ {current_values}
111
+ on_reset={reset_to_defaults}
112
+ style="display: flex; flex-wrap: wrap; gap: 2ex"
113
+ >
114
+ <!-- select options come from the settings schema so labels/values have a
115
+ single source of truth -->
116
+ {#if chart === `sunburst`}
117
+ <label style="flex: 1">
118
+ Shape:
119
+ <select bind:value={shape}>
120
+ {@render options(SETTINGS_CONFIG.sunburst.shape.enum ?? {})}
121
+ </select>
122
+ </label>
123
+ {/if}
124
+ <label style="flex: 1">
125
+ Value mode:
126
+ <select bind:value={value_mode}>
127
+ {@render options(SETTINGS_CONFIG[chart].value_mode.enum ?? {})}
128
+ </select>
129
+ </label>
130
+ {#if chart === `sunburst` && shape === `sunburst`}
131
+ <!-- icicle labels are always horizontal; inner radius/pad angle are polar-only -->
132
+ <label style="flex: 1">
133
+ Labels:
134
+ <select bind:value={label_rotation}>
135
+ {@render options(SETTINGS_CONFIG.sunburst.label_rotation.enum ?? {})}
136
+ </select>
137
+ </label>
138
+ {/if}
139
+ <label style="flex: 1">
140
+ Label text:
141
+ <select bind:value={label_text}>
142
+ {@render options(SETTINGS_CONFIG[chart].label_text.enum ?? {})}
143
+ </select>
144
+ </label>
145
+ <NumberRangeInput min={0} max={10} step={1} bind:value={max_depth} style="flex: 1 1 100%"
146
+ >Max depth (0 = all):</NumberRangeInput
147
+ >
148
+ {#if chart === `sunburst`}
149
+ {#if shape === `sunburst`}
150
+ <NumberRangeInput
151
+ min={0}
152
+ max={0.8}
153
+ step={0.05}
154
+ bind:value={inner_radius}
155
+ style="flex: 1 1 100%">Inner radius:</NumberRangeInput
156
+ >
157
+ <NumberRangeInput
158
+ min={0}
159
+ max={4}
160
+ step={0.1}
161
+ bind:value={pad_angle}
162
+ style="flex: 1 1 100%">Pad angle (°):</NumberRangeInput
163
+ >
164
+ {/if}
165
+ {:else}
166
+ <NumberRangeInput
167
+ min={0}
168
+ max={10}
169
+ step={0.5}
170
+ bind:value={padding_inner}
171
+ style="flex: 1 1 100%">Cell gap (px):</NumberRangeInput
172
+ >
173
+ <NumberRangeInput
174
+ min={0}
175
+ max={40}
176
+ step={1}
177
+ bind:value={padding_top}
178
+ style="flex: 1 1 100%">Header height (px, 0 = none):</NumberRangeInput
179
+ >
180
+ <NumberRangeInput
181
+ min={0}
182
+ max={10}
183
+ step={0.5}
184
+ bind:value={padding_outer}
185
+ style="flex: 1 1 100%">Child inset (px):</NumberRangeInput
186
+ >
187
+ {/if}
188
+ <NumberRangeInput
189
+ min={0}
190
+ max={0.2}
191
+ step={0.005}
192
+ bind:value={min_fraction}
193
+ style="flex: 1 1 100%"
194
+ >Group {chart === `sunburst` ? `slices` : `cells`} below (fraction of total):</NumberRangeInput
195
+ >
196
+ <label style="flex: 1 1 100%">
197
+ <input type="checkbox" bind:checked={show_labels} />
198
+ Show {chart === `sunburst` ? `arc` : `cell`} labels
199
+ </label>
200
+ <label style="flex: 1 1 100%">
201
+ <input type="checkbox" bind:checked={zoom_on_click} />
202
+ Zoom on click
203
+ </label>
204
+ <label style="flex: 1 1 100%">
205
+ <input type="checkbox" bind:checked={show_breadcrumbs} />
206
+ Show breadcrumbs when zoomed
207
+ </label>
208
+ </SettingsSection>
209
+ {#if export_buttons && on_export}
210
+ <!-- --hier-btn-*: forward the chart's own theming vars (--sunburst-btn-bg /
211
+ --treemap-btn-bg); when unset, the outer var() falls back to the gray default -->
212
+ <div
213
+ class="export-row"
214
+ style="--hier-btn-bg: var(--{chart}-btn-bg); --hier-btn-hover-bg: var(--{chart}-btn-hover-bg)"
215
+ >
216
+ Export:
217
+ {#each [`svg`, `png`] as const as fmt (fmt)}
218
+ <button
219
+ type="button"
220
+ class="export-btn"
221
+ aria-label="Download {fmt.toUpperCase()}"
222
+ onclick={() => on_export?.(fmt)}>{fmt.toUpperCase()}</button
223
+ >
224
+ {/each}
225
+ </div>
226
+ {/if}
227
+ </ControlPane>
228
+ {/if}
229
+
230
+ <style>
231
+ .export-row {
232
+ display: flex;
233
+ align-items: center;
234
+ gap: 6px;
235
+ margin-top: 6px;
236
+ font-size: 0.85em;
237
+ }
238
+ .export-btn {
239
+ background: var(--hier-btn-bg, rgba(128, 128, 128, 0.15));
240
+ color: inherit;
241
+ border: none;
242
+ border-radius: 3pt;
243
+ padding: 1px 6px;
244
+ cursor: pointer;
245
+ }
246
+ .export-btn:hover {
247
+ background: var(--hier-btn-hover-bg, rgba(128, 128, 128, 0.35));
248
+ }
249
+ </style>