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,6 +4,12 @@
4
4
  import { untrack } from 'svelte'
5
5
  import type { HTMLAttributes } from 'svelte/elements'
6
6
 
7
+ type SettingsSectionContext = {
8
+ current_values: Record<string, unknown>
9
+ has_changes: boolean
10
+ reference_values: Record<string, unknown>
11
+ }
12
+
7
13
  let {
8
14
  title,
9
15
  current_values,
@@ -13,13 +19,7 @@
13
19
  }: HTMLAttributes<HTMLElementTagNameMap[`section`]> & {
14
20
  title: string
15
21
  current_values: Record<string, unknown>
16
- children: Snippet<
17
- [{
18
- current_values: Record<string, unknown>
19
- has_changes: boolean
20
- reference_values: Record<string, unknown>
21
- }]
22
- >
22
+ children: Snippet<[SettingsSectionContext]>
23
23
  on_reset?: () => void
24
24
  } = $props()
25
25
 
@@ -28,62 +28,62 @@
28
28
  if (obj === null || typeof obj !== `object`) return obj
29
29
  if (obj instanceof Date) return new Date(obj)
30
30
  if (obj instanceof RegExp) return new RegExp(obj)
31
- if (Array.isArray(obj)) {
32
- return obj.map((item) =>
33
- typeof item === `object` && item !== null ? deep_copy(item) : item
34
- )
35
- }
36
-
37
- const copy: Record<string, unknown> = {}
38
- for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {
39
- copy[key] = typeof value === `object` && value !== null
40
- ? deep_copy(value)
41
- : value
42
- }
43
- return copy
31
+ if (Array.isArray(obj)) return obj.map(deep_copy)
32
+ return Object.fromEntries(
33
+ Object.entries(obj).map(([key, value]) => [key, deep_copy(value)]),
34
+ )
44
35
  }
45
36
 
46
37
  // Capture initial values once at mount - must NOT be $derived or it tracks changes
47
- const reference_values = untrack(() =>
48
- deep_copy(current_values) as Record<string, unknown>
49
- )
50
-
51
- // Check if any values have changed from reference values
52
- let has_changes = $derived.by(() => {
53
- for (const [key, reference_value] of Object.entries(reference_values)) {
54
- const current_value = current_values[key]
38
+ const reference_values = untrack(() => deep_copy(current_values) as Record<string, unknown>)
55
39
 
56
- // Deep comparison for arrays
57
- if (Array.isArray(reference_value) && Array.isArray(current_value)) {
58
- if (reference_value.length !== current_value.length) return true
59
- if (
60
- reference_value.some((val, idx) => {
61
- const curr_val = current_value[idx]
62
- // Handle nested objects/arrays in arrays
63
- if (
64
- typeof val === `object` && val !== null &&
65
- typeof curr_val === `object` && curr_val !== null
66
- ) return JSON.stringify(val) !== JSON.stringify(curr_val) // Quick deep comparison fallback
67
- return val !== curr_val
68
- })
69
- ) {
70
- return true
71
- }
72
- continue
73
- }
74
-
75
- // Handle undefined/null comparisons properly
76
- if (reference_value === undefined && current_value === undefined) continue
77
- if (reference_value === null && current_value === null) continue
40
+ // unique per-instance id so aria-labelledby stays valid with multiple sections on a page
41
+ const title_id = `settings-section-title-${crypto.randomUUID()}`
78
42
 
79
- // Basic comparison for primitives
80
- if (current_value !== reference_value) {
81
- return true
43
+ // Order-independent deep equality for setting values
44
+ const setting_equal = (left: unknown, right: unknown): boolean => {
45
+ if (Object.is(left, right)) return true
46
+ if (left == null || right == null) return false
47
+ if (typeof left !== `object` || typeof right !== `object`) return false
48
+ if (left instanceof Date || right instanceof Date) {
49
+ return (
50
+ left instanceof Date && right instanceof Date && left.getTime() === right.getTime()
51
+ )
52
+ }
53
+ if (left instanceof RegExp || right instanceof RegExp) {
54
+ return (
55
+ left instanceof RegExp &&
56
+ right instanceof RegExp &&
57
+ left.toString() === right.toString()
58
+ )
59
+ }
60
+ if (Array.isArray(left) || Array.isArray(right)) {
61
+ if (!Array.isArray(left) || !Array.isArray(right) || left.length !== right.length) {
62
+ return false
82
63
  }
64
+ return left.every((item, idx) => setting_equal(item, right[idx]))
83
65
  }
84
- return false
85
- })
66
+ const left_obj = left as Record<string, unknown>
67
+ const right_obj = right as Record<string, unknown>
68
+ const left_keys = Object.keys(left_obj)
69
+ if (left_keys.length !== Object.keys(right_obj).length) return false
70
+ return left_keys.every(
71
+ (key) => Object.hasOwn(right_obj, key) && setting_equal(left_obj[key], right_obj[key]),
72
+ )
73
+ }
86
74
 
75
+ // Key presence is independent of value: additions/removals count even when the
76
+ // value is undefined. Only compare values when both sides own the key.
77
+ let has_changes = $derived(
78
+ [...new Set([...Object.keys(reference_values), ...Object.keys(current_values)])].some(
79
+ (key) => {
80
+ const in_reference = Object.hasOwn(reference_values, key)
81
+ const in_current = Object.hasOwn(current_values, key)
82
+ if (in_reference !== in_current) return true
83
+ return !setting_equal(reference_values[key], current_values[key])
84
+ },
85
+ ),
86
+ )
87
87
  function handle_reset(event: MouseEvent) {
88
88
  event.stopPropagation()
89
89
  event.preventDefault()
@@ -91,7 +91,7 @@
91
91
  }
92
92
  </script>
93
93
 
94
- <h4 id="settings-section-title">
94
+ <h4 id={title_id}>
95
95
  {title}
96
96
 
97
97
  {#if has_changes}
@@ -106,7 +106,7 @@
106
106
  </button>
107
107
  {/if}
108
108
  </h4>
109
- <section {...rest} aria-labelledby="settings-section-title">
109
+ <section {...rest} aria-labelledby={title_id}>
110
110
  {@render children?.({ current_values, has_changes, reference_values })}
111
111
  </section>
112
112
 
@@ -140,9 +140,4 @@
140
140
  opacity: 1;
141
141
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
142
142
  }
143
- .reset-button.standalone {
144
- position: absolute;
145
- top: -8pt;
146
- right: -8pt;
147
- }
148
143
  </style>
@@ -1,15 +1,14 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { HTMLAttributes } from 'svelte/elements';
3
+ type SettingsSectionContext = {
4
+ current_values: Record<string, unknown>;
5
+ has_changes: boolean;
6
+ reference_values: Record<string, unknown>;
7
+ };
3
8
  type $$ComponentProps = HTMLAttributes<HTMLElementTagNameMap[`section`]> & {
4
9
  title: string;
5
10
  current_values: Record<string, unknown>;
6
- children: Snippet<[
7
- {
8
- current_values: Record<string, unknown>;
9
- has_changes: boolean;
10
- reference_values: Record<string, unknown>;
11
- }
12
- ]>;
11
+ children: Snippet<[SettingsSectionContext]>;
13
12
  on_reset?: () => void;
14
13
  };
15
14
  declare const SettingsSection: import("svelte").Component<$$ComponentProps, {}, "">;
@@ -52,7 +52,9 @@
52
52
  border: 1px solid color-mix(in srgb, currentColor 15%, transparent);
53
53
  text-decoration: none;
54
54
  color: inherit;
55
- transition: border-color 0.15s, box-shadow 0.15s;
55
+ transition:
56
+ border-color 0.15s,
57
+ box-shadow 0.15s;
56
58
  &:hover {
57
59
  border-color: color-mix(in srgb, currentColor 35%, transparent);
58
60
  box-shadow: 0 2px 12px color-mix(in srgb, currentColor 8%, transparent);
@@ -2,11 +2,12 @@
2
2
  import type { FullscreenToggleProp } from './fullscreen'
3
3
  import type { ShowControlsState } from '../controls'
4
4
  // Shared control-buttons row (filename chip + fullscreen toggle + snippet buttons/panes) for BrillouinZone/FermiSurface/Structure viewers; themed via neutral --viewer-* CSS vars
5
- // TODO Trajectory.svelte still has its own control-buttons variant migrate it here.
5
+ // NOTE Trajectory.svelte intentionally keeps its own controls: its bar is a full playback strip (nav/step/FPS/info+export panes/view-mode) rather than this floating top-right cluster. It already shares FullscreenButton + sync_fullscreen.
6
6
  import type { Snippet } from 'svelte'
7
7
  import { createAttachmentKey } from 'svelte/attachments'
8
8
  import { tooltip } from 'svelte-multiselect/attachments'
9
9
  import FullscreenButton from './FullscreenButton.svelte'
10
+ import type { HTMLAttributes } from 'svelte/elements'
10
11
 
11
12
  let {
12
13
  controls_config,
@@ -15,10 +16,10 @@
15
16
  fullscreen_toggle = true,
16
17
  fullscreen_btn_style = undefined,
17
18
  wrapper = undefined,
18
- style = undefined,
19
19
  before = undefined,
20
20
  children = undefined,
21
- }: {
21
+ ...rest
22
+ }: HTMLAttributes<HTMLElement> & {
22
23
  controls_config: ShowControlsState
23
24
  filename?: string
24
25
  fullscreen?: boolean
@@ -35,8 +36,9 @@
35
36
  </script>
36
37
 
37
38
  <section
38
- class="control-buttons {controls_config.class}"
39
- style={[style, controls_config.style].filter(Boolean).join(`; `)}
39
+ {...rest}
40
+ class={[`control-buttons`, controls_config.class, rest.class]}
41
+ style={[rest.style, controls_config.style].filter(Boolean).join(`; `)}
40
42
  >
41
43
  {#if controls_config.mode !== `never`}
42
44
  {@render before?.()}
@@ -67,10 +69,9 @@
67
69
  top: var(--viewer-buttons-top, var(--ctrl-btn-top, 1ex));
68
70
  right: var(--viewer-buttons-right, var(--ctrl-btn-right, 1ex));
69
71
  gap: var(--viewer-buttons-gap, clamp(6pt, 1cqmin, 9pt));
70
- z-index: var(
71
- --viewer-buttons-z-index,
72
- var(--z-index-overlay-controls, 100000000)
73
- );
72
+ z-index: var(--viewer-buttons-z-index, var(--z-index-overlay-controls, 100000000));
73
+ /* own compositing layer, or WKWebView paints the canvas over this (see app.css) */
74
+ will-change: transform;
74
75
  opacity: 0;
75
76
  pointer-events: none;
76
77
  transition: opacity 0.2s ease;
@@ -97,10 +98,14 @@
97
98
  display: flex;
98
99
  padding: var(--viewer-buttons-btn-padding, 4px);
99
100
  border-radius: var(--border-radius, 3pt);
100
- font-size: clamp(0.85em, 2cqmin, 1.3em);
101
+ font-size: var(--ctrl-btn-icon-size, clamp(0.7rem, 2cqmin, 0.85rem));
101
102
  }
102
103
  section.control-buttons :global(button:hover) {
103
- background-color: color-mix(in srgb, currentColor 8%, transparent);
104
+ background-color: var(
105
+ --viewer-buttons-hover-bg,
106
+ color-mix(in srgb, currentColor 8%, transparent)
107
+ );
108
+ color: var(--viewer-buttons-hover-color, currentColor);
104
109
  }
105
110
  .filename {
106
111
  font-family: monospace;
@@ -1,7 +1,8 @@
1
1
  import type { FullscreenToggleProp } from './fullscreen';
2
2
  import type { ShowControlsState } from '../controls';
3
3
  import type { Snippet } from 'svelte';
4
- type $$ComponentProps = {
4
+ import type { HTMLAttributes } from 'svelte/elements';
5
+ type $$ComponentProps = HTMLAttributes<HTMLElement> & {
5
6
  controls_config: ShowControlsState;
6
7
  filename?: string;
7
8
  fullscreen?: boolean;
@@ -4,14 +4,12 @@ export async function toggle_fullscreen(wrapper) {
4
4
  if (!wrapper || !wrapper.isConnected)
5
5
  return;
6
6
  try {
7
- if (!document.fullscreenElement) {
8
- await wrapper.requestFullscreen();
9
- }
10
- else if (document.fullscreenElement === wrapper) {
7
+ if (document.fullscreenElement === wrapper) {
11
8
  await document.exitFullscreen();
12
9
  }
13
10
  else {
14
- await document.exitFullscreen();
11
+ if (document.fullscreenElement)
12
+ await document.exitFullscreen();
15
13
  await wrapper.requestFullscreen();
16
14
  }
17
15
  }
@@ -1,6 +1,5 @@
1
1
  import { set_fullscreen_bg } from './fullscreen';
2
- // Two-way sync between a bindable `fullscreen` flag, the browser fullscreen state of a wrapper, and the fullscreen background CSS var. Creates $effects (call during component init). Shared by BrillouinZone/FermiSurface/Structure viewers.
3
- // TODO Trajectory.svelte still has its own fullscreen variant — migrate it here.
2
+ // Two-way sync between a bindable `fullscreen` flag, the browser fullscreen state of a wrapper, and the fullscreen background CSS var. Creates $effects (call during component init). Shared by BrillouinZone/FermiSurface/Structure/Trajectory viewers.
4
3
  export function sync_fullscreen(opts) {
5
4
  // Flag -> browser: enter/exit fullscreen when the bound flag changes
6
5
  $effect(() => {
@@ -4,6 +4,7 @@ export { default as FullscreenButton } from './FullscreenButton.svelte';
4
4
  export { default as FullscreenToggle } from './FullscreenToggle.svelte';
5
5
  export { default as InfoCard } from './InfoCard.svelte';
6
6
  export { default as InfoTag } from './InfoTag.svelte';
7
+ export { default as NumberRangeInput } from './NumberRangeInput.svelte';
7
8
  export * from './json-tree';
8
9
  export { default as PropertyFilter } from './PropertyFilter.svelte';
9
10
  export { default as SettingsSection } from './SettingsSection.svelte';
@@ -4,6 +4,7 @@ export { default as FullscreenButton } from './FullscreenButton.svelte';
4
4
  export { default as FullscreenToggle } from './FullscreenToggle.svelte';
5
5
  export { default as InfoCard } from './InfoCard.svelte';
6
6
  export { default as InfoTag } from './InfoTag.svelte';
7
+ export { default as NumberRangeInput } from './NumberRangeInput.svelte';
7
8
  export * from './json-tree';
8
9
  export { default as PropertyFilter } from './PropertyFilter.svelte';
9
10
  export { default as SettingsSection } from './SettingsSection.svelte';
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
2
  import Icon from '../../Icon.svelte'
3
+ import { build_path } from '../../json-path'
3
4
  import { getContext, onMount } from 'svelte'
4
5
  // oxlint-disable-next-line import/no-self-import -- recursive Svelte component
5
6
  import JsonNode from './JsonNode.svelte'
@@ -7,7 +8,6 @@
7
8
  import type { JsonTreeContext } from './types'
8
9
  import { JSON_TREE_CONTEXT_KEY } from './types'
9
10
  import {
10
- build_path,
11
11
  estimate_byte_size,
12
12
  format_byte_size,
13
13
  format_preview,
@@ -40,13 +40,8 @@
40
40
  }
41
41
  })
42
42
 
43
- // Determine value type
44
43
  let value_type = $derived(get_value_type(value))
45
-
46
- // Check if this node is expandable
47
44
  let expandable = $derived(is_expandable(value))
48
-
49
- // Get child count for preview
50
45
  let child_count = $derived(expandable ? get_child_count(value) : 0)
51
46
 
52
47
  // Determine if this node should be collapsed
@@ -77,14 +72,9 @@
77
72
  })
78
73
 
79
74
  // Note: Search highlighting is handled by CSS Highlight API in JsonTree.svelte
80
-
81
- // Check if this node is focused
82
75
  let is_focused = $derived(ctx?.focused_path === path)
83
-
84
- // Check if this is the current search match being navigated
76
+ // Current search match being navigated
85
77
  let is_current_match = $derived(ctx?.current_match_path === path)
86
-
87
- // Check if this node is selected
88
78
  let is_selected = $derived(ctx?.selected_paths.has(path) ?? false)
89
79
 
90
80
  // Diff status for this node (null if no diff or unchanged)
@@ -103,58 +93,34 @@
103
93
  }
104
94
  }
105
95
 
106
- // Toggle collapse recursively on double-click
96
+ // Toggle collapse recursively on double-click (collapsed expands all, and vice versa)
107
97
  function toggle_collapse_recursive(event: MouseEvent) {
108
98
  event.stopPropagation()
109
- if (ctx && expandable) {
110
- // If collapsed, expand all; if expanded, collapse all
111
- ctx.toggle_collapse_recursive(path, !is_collapsed)
112
- }
113
- }
114
-
115
- // Focus this node
116
- function focus_node() {
117
- ctx?.set_focused(path)
99
+ if (ctx && expandable) ctx.toggle_collapse_recursive(path, !is_collapsed)
118
100
  }
119
101
 
120
- // Get children based on value type
121
- function get_children(): { key: string | number; value: unknown }[] {
122
- if (!expandable) return []
123
-
102
+ // Children as { key, value } pairs based on value type (Map entries are wrapped so
103
+ // key and value render as an expandable pair; Set values get numeric keys)
104
+ let children = $derived.by((): { key: string | number; value: unknown }[] => {
124
105
  if (value_type === `array`) {
125
106
  return (value as unknown[]).map((val, idx) => ({ key: idx, value: val }))
126
107
  }
127
-
128
108
  if (value_type === `object`) {
129
- let keys = Object.keys(value as Record<string, unknown>)
130
- if (ctx?.settings.sort_keys) {
131
- keys = keys.sort()
132
- }
133
- return keys.map((key) => ({
134
- key,
135
- value: (value as Record<string, unknown>)[key],
136
- }))
109
+ const keys = Object.keys(value as Record<string, unknown>)
110
+ if (ctx?.settings.sort_keys) keys.sort()
111
+ return keys.map((key) => ({ key, value: (value as Record<string, unknown>)[key] }))
137
112
  }
138
-
139
113
  if (value_type === `map`) {
140
- const map = value as Map<unknown, unknown>
141
- return Array.from(map.entries()).map(([key, val], idx) => ({
114
+ return Array.from(value as Map<unknown, unknown>, ([key, val], idx) => ({
142
115
  key: idx,
143
116
  value: { key, value: val },
144
117
  }))
145
118
  }
146
-
147
119
  if (value_type === `set`) {
148
- return Array.from(value as Set<unknown>).map((val, idx) => ({
149
- key: idx,
150
- value: val,
151
- }))
120
+ return Array.from(value as Set<unknown>, (val, idx) => ({ key: idx, value: val }))
152
121
  }
153
-
154
122
  return []
155
- }
156
-
157
- let children = $derived(get_children())
123
+ })
158
124
 
159
125
  // Ghost children: removed entries from diff (pre-computed in JsonTree for O(1) lookup)
160
126
  let ghost_children = $derived.by(() => {
@@ -191,9 +157,7 @@
191
157
  if (expandable && !is_collapsed) {
192
158
  toggle_collapse()
193
159
  }
194
- } else if (
195
- (event.key === `c` || event.key === `C`) && (event.ctrlKey || event.metaKey)
196
- ) {
160
+ } else if ((event.key === `c` || event.key === `C`) && (event.ctrlKey || event.metaKey)) {
197
161
  // When nodes are selected, let the tree-level handler do bulk copy
198
162
  if (ctx?.selected_paths.size) return
199
163
  event.preventDefault()
@@ -235,7 +199,7 @@
235
199
  event.stopPropagation()
236
200
  ctx?.toggle_select(path, event.shiftKey)
237
201
  } else {
238
- focus_node()
202
+ ctx?.set_focused(path)
239
203
  }
240
204
  }}
241
205
  onauxclick={(event) => {
@@ -299,10 +263,7 @@
299
263
  {#if expandable && is_collapsed}
300
264
 
301
265
  {:else}
302
- <Icon
303
- icon="Copy"
304
- style="width: 10px; height: 10px; vertical-align: baseline"
305
- />
266
+ <Icon icon="Copy" style="width: 10px; height: 10px; vertical-align: baseline" />
306
267
  {/if}
307
268
  </span>
308
269
  </button>
@@ -371,9 +332,9 @@
371
332
  {/if}
372
333
  </span>
373
334
  <span class="colon">:</span>
374
- <span style="color: var(--jt-preview); font-style: italic">{
375
- format_preview(ghost.value)
376
- }</span>
335
+ <span style="color: var(--jt-preview); font-style: italic"
336
+ >{format_preview(ghost.value)}</span
337
+ >
377
338
  </span>
378
339
  </div>
379
340
  {/each}
@@ -497,7 +458,9 @@
497
458
  color: var(--jt-number, light-dark(#098658, #b5cea8));
498
459
  }
499
460
  }
500
- .colon, .comma, .bracket {
461
+ .colon,
462
+ .comma,
463
+ .bracket {
501
464
  color: var(--jt-punctuation, light-dark(#000, #d4d4d4));
502
465
  }
503
466
  .colon {