matterviz 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. package/dist/EmptyState.svelte +10 -2
  2. package/dist/FilePicker.svelte +154 -96
  3. package/dist/Icon.svelte +20 -14
  4. package/dist/MillerIndexInput.svelte +27 -21
  5. package/dist/api/optimade.js +6 -6
  6. package/dist/app.css +216 -178
  7. package/dist/brillouin/BrillouinZone.svelte +299 -198
  8. package/dist/brillouin/BrillouinZone.svelte.d.ts +1 -1
  9. package/dist/brillouin/BrillouinZoneControls.svelte +32 -5
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte +74 -55
  11. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  12. package/dist/brillouin/BrillouinZoneInfoPane.svelte +99 -68
  13. package/dist/brillouin/BrillouinZoneScene.svelte +277 -165
  14. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  15. package/dist/brillouin/BrillouinZoneTooltip.svelte +17 -7
  16. package/dist/brillouin/compute.js +11 -6
  17. package/dist/chempot-diagram/ChemPotDiagram.svelte +327 -0
  18. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +13 -0
  19. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +847 -0
  20. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +16 -0
  21. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +3194 -0
  22. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +16 -0
  23. package/dist/chempot-diagram/ChemPotScene3D.svelte +11 -0
  24. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +7 -0
  25. package/dist/chempot-diagram/async-compute.svelte.d.ts +3 -0
  26. package/dist/chempot-diagram/async-compute.svelte.js +77 -0
  27. package/dist/chempot-diagram/chempot-worker.d.ts +1 -0
  28. package/dist/chempot-diagram/chempot-worker.js +11 -0
  29. package/dist/chempot-diagram/color.d.ts +10 -0
  30. package/dist/chempot-diagram/color.js +32 -0
  31. package/dist/chempot-diagram/compute.d.ts +48 -0
  32. package/dist/chempot-diagram/compute.js +812 -0
  33. package/dist/chempot-diagram/index.d.ts +6 -0
  34. package/dist/chempot-diagram/index.js +6 -0
  35. package/dist/chempot-diagram/pointer.d.ts +16 -0
  36. package/dist/chempot-diagram/pointer.js +40 -0
  37. package/dist/chempot-diagram/temperature.d.ts +15 -0
  38. package/dist/chempot-diagram/temperature.js +36 -0
  39. package/dist/chempot-diagram/types.d.ts +86 -0
  40. package/dist/chempot-diagram/types.js +28 -0
  41. package/dist/colors/index.d.ts +3 -1
  42. package/dist/colors/index.js +9 -3
  43. package/dist/composition/BarChart.svelte +141 -77
  44. package/dist/composition/BubbleChart.svelte +107 -52
  45. package/dist/composition/Composition.svelte +100 -79
  46. package/dist/composition/Formula.svelte +108 -62
  47. package/dist/composition/FormulaFilter.svelte +973 -353
  48. package/dist/composition/FormulaFilter.svelte.d.ts +35 -1
  49. package/dist/composition/PieChart.svelte +199 -99
  50. package/dist/composition/PieChart.svelte.d.ts +1 -1
  51. package/dist/composition/format.d.ts +5 -0
  52. package/dist/composition/format.js +20 -3
  53. package/dist/composition/parse.js +14 -9
  54. package/dist/convex-hull/ConvexHull.svelte +93 -38
  55. package/dist/convex-hull/ConvexHull2D.svelte +551 -393
  56. package/dist/convex-hull/ConvexHull3D.svelte +1303 -825
  57. package/dist/convex-hull/ConvexHull4D.svelte +1012 -686
  58. package/dist/convex-hull/ConvexHullControls.svelte +115 -28
  59. package/dist/convex-hull/ConvexHullInfoPane.svelte +29 -3
  60. package/dist/convex-hull/ConvexHullStats.svelte +821 -249
  61. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +6 -1
  62. package/dist/convex-hull/ConvexHullTooltip.svelte +41 -16
  63. package/dist/convex-hull/GasPressureControls.svelte +104 -61
  64. package/dist/convex-hull/StructurePopup.svelte +25 -4
  65. package/dist/convex-hull/TemperatureSlider.svelte +45 -25
  66. package/dist/convex-hull/barycentric-coords.js +13 -7
  67. package/dist/convex-hull/demo-temperature.d.ts +6 -0
  68. package/dist/convex-hull/demo-temperature.js +40 -0
  69. package/dist/convex-hull/gas-thermodynamics.js +17 -12
  70. package/dist/convex-hull/helpers.d.ts +10 -1
  71. package/dist/convex-hull/helpers.js +79 -38
  72. package/dist/convex-hull/index.d.ts +1 -0
  73. package/dist/convex-hull/index.js +1 -0
  74. package/dist/convex-hull/thermodynamics.d.ts +8 -21
  75. package/dist/convex-hull/thermodynamics.js +163 -69
  76. package/dist/convex-hull/types.d.ts +12 -12
  77. package/dist/convex-hull/types.js +0 -12
  78. package/dist/coordination/CoordinationBarPlot.svelte +232 -176
  79. package/dist/element/BohrAtom.svelte +56 -13
  80. package/dist/element/ElementHeading.svelte +7 -2
  81. package/dist/element/ElementPhoto.svelte +15 -9
  82. package/dist/element/ElementStats.svelte +10 -4
  83. package/dist/element/ElementTile.svelte +137 -73
  84. package/dist/element/Nucleus.svelte +39 -11
  85. package/dist/element/data.js +2 -14
  86. package/dist/element/data.json.gz +0 -0
  87. package/dist/element/types.d.ts +1 -0
  88. package/dist/feedback/ClickFeedback.svelte +16 -5
  89. package/dist/feedback/DragOverlay.svelte +10 -2
  90. package/dist/feedback/Spinner.svelte +4 -2
  91. package/dist/feedback/StatusMessage.svelte +8 -2
  92. package/dist/fermi-surface/FermiSlice.svelte +118 -88
  93. package/dist/fermi-surface/FermiSurface.svelte +336 -239
  94. package/dist/fermi-surface/FermiSurface.svelte.d.ts +1 -1
  95. package/dist/fermi-surface/FermiSurfaceControls.svelte +113 -46
  96. package/dist/fermi-surface/FermiSurfaceScene.svelte +536 -343
  97. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  98. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +14 -5
  99. package/dist/fermi-surface/compute.js +16 -20
  100. package/dist/fermi-surface/parse.js +37 -33
  101. package/dist/fermi-surface/symmetry.js +2 -7
  102. package/dist/fermi-surface/types.d.ts +3 -5
  103. package/dist/heatmap-matrix/HeatmapMatrix.svelte +1527 -0
  104. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +110 -0
  105. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +225 -0
  106. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +30 -0
  107. package/dist/heatmap-matrix/index.d.ts +53 -0
  108. package/dist/heatmap-matrix/index.js +100 -0
  109. package/dist/heatmap-matrix/shared.d.ts +2 -0
  110. package/dist/heatmap-matrix/shared.js +4 -0
  111. package/dist/icons.d.ts +111 -0
  112. package/dist/icons.js +158 -0
  113. package/dist/index.d.ts +5 -2
  114. package/dist/index.js +5 -2
  115. package/dist/io/decompress.js +1 -1
  116. package/dist/io/export.d.ts +3 -0
  117. package/dist/io/export.js +138 -140
  118. package/dist/io/file-drop.d.ts +7 -0
  119. package/dist/io/file-drop.js +43 -0
  120. package/dist/io/index.d.ts +2 -2
  121. package/dist/io/index.js +2 -112
  122. package/dist/io/is-binary.js +2 -3
  123. package/dist/io/types.d.ts +1 -0
  124. package/dist/io/url-drop.d.ts +2 -0
  125. package/dist/io/url-drop.js +117 -0
  126. package/dist/isosurface/Isosurface.svelte +220 -110
  127. package/dist/isosurface/IsosurfaceControls.svelte +65 -28
  128. package/dist/isosurface/parse.js +104 -56
  129. package/dist/isosurface/slice.d.ts +2 -1
  130. package/dist/isosurface/slice.js +8 -13
  131. package/dist/isosurface/types.d.ts +14 -1
  132. package/dist/isosurface/types.js +152 -5
  133. package/dist/labels.d.ts +2 -1
  134. package/dist/labels.js +12 -8
  135. package/dist/layout/FullscreenToggle.svelte +11 -2
  136. package/dist/layout/InfoCard.svelte +38 -6
  137. package/dist/layout/InfoTag.svelte +125 -94
  138. package/dist/layout/PropertyFilter.svelte +82 -37
  139. package/dist/layout/SettingsSection.svelte +85 -55
  140. package/dist/layout/SubpageGrid.svelte +82 -0
  141. package/dist/layout/SubpageGrid.svelte.d.ts +14 -0
  142. package/dist/layout/index.d.ts +1 -0
  143. package/dist/layout/index.js +1 -0
  144. package/dist/layout/json-tree/JsonNode.svelte +266 -223
  145. package/dist/layout/json-tree/JsonTree.svelte +516 -429
  146. package/dist/layout/json-tree/JsonTree.svelte.d.ts +1 -1
  147. package/dist/layout/json-tree/JsonValue.svelte +281 -173
  148. package/dist/layout/json-tree/types.d.ts +10 -2
  149. package/dist/layout/json-tree/utils.d.ts +2 -0
  150. package/dist/layout/json-tree/utils.js +37 -2
  151. package/dist/marching-cubes.js +25 -2
  152. package/dist/math.d.ts +20 -17
  153. package/dist/math.js +474 -57
  154. package/dist/overlays/ContextMenu.svelte +66 -40
  155. package/dist/overlays/DraggablePane.svelte +331 -154
  156. package/dist/overlays/DraggablePane.svelte.d.ts +2 -0
  157. package/dist/periodic-table/PeriodicTable.svelte +278 -145
  158. package/dist/periodic-table/PeriodicTableControls.svelte +178 -128
  159. package/dist/periodic-table/PropertySelect.svelte +25 -7
  160. package/dist/periodic-table/TableInset.svelte +8 -3
  161. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +559 -267
  162. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -2
  163. package/dist/phase-diagram/PhaseDiagramControls.svelte +131 -51
  164. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +3 -2
  165. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +126 -0
  166. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +15 -0
  167. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +160 -110
  168. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +8 -1
  169. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +217 -86
  170. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +6 -3
  171. package/dist/phase-diagram/TdbInfoPanel.svelte +28 -4
  172. package/dist/phase-diagram/build-diagram.js +9 -9
  173. package/dist/phase-diagram/colors.js +1 -3
  174. package/dist/phase-diagram/index.d.ts +2 -0
  175. package/dist/phase-diagram/index.js +2 -0
  176. package/dist/phase-diagram/parse.js +10 -9
  177. package/dist/phase-diagram/svg-to-diagram.d.ts +2 -0
  178. package/dist/phase-diagram/svg-to-diagram.js +869 -0
  179. package/dist/phase-diagram/types.d.ts +10 -0
  180. package/dist/phase-diagram/utils.d.ts +8 -4
  181. package/dist/phase-diagram/utils.js +219 -74
  182. package/dist/plot/AxisLabel.svelte +51 -0
  183. package/dist/plot/AxisLabel.svelte.d.ts +16 -0
  184. package/dist/plot/BarPlot.svelte +1461 -768
  185. package/dist/plot/BarPlot.svelte.d.ts +3 -3
  186. package/dist/plot/BarPlotControls.svelte +33 -6
  187. package/dist/plot/BarPlotControls.svelte.d.ts +1 -1
  188. package/dist/plot/ColorBar.svelte +533 -383
  189. package/dist/plot/ColorBar.svelte.d.ts +1 -1
  190. package/dist/plot/ColorScaleSelect.svelte +28 -7
  191. package/dist/plot/ElementScatter.svelte +38 -16
  192. package/dist/plot/FillArea.svelte +152 -92
  193. package/dist/plot/Histogram.svelte +1162 -709
  194. package/dist/plot/Histogram.svelte.d.ts +1 -1
  195. package/dist/plot/HistogramControls.svelte +81 -18
  196. package/dist/plot/HistogramControls.svelte.d.ts +6 -2
  197. package/dist/plot/InteractiveAxisLabel.svelte +34 -11
  198. package/dist/plot/InteractiveAxisLabel.svelte.d.ts +1 -1
  199. package/dist/plot/Line.svelte +63 -28
  200. package/dist/plot/PlotControls.svelte +221 -96
  201. package/dist/plot/PlotControls.svelte.d.ts +1 -1
  202. package/dist/plot/PlotLegend.svelte +174 -91
  203. package/dist/plot/PlotTooltip.svelte +45 -6
  204. package/dist/plot/PortalSelect.svelte +175 -146
  205. package/dist/plot/ReferenceLine.svelte +77 -22
  206. package/dist/plot/ReferenceLine.svelte.d.ts +1 -0
  207. package/dist/plot/ReferenceLine3D.svelte +132 -107
  208. package/dist/plot/ReferencePlane.svelte +146 -123
  209. package/dist/plot/ScatterPlot.svelte +1880 -1156
  210. package/dist/plot/ScatterPlot.svelte.d.ts +3 -3
  211. package/dist/plot/ScatterPlot3D.svelte +256 -131
  212. package/dist/plot/ScatterPlot3D.svelte.d.ts +2 -2
  213. package/dist/plot/ScatterPlot3DControls.svelte +300 -297
  214. package/dist/plot/ScatterPlot3DControls.svelte.d.ts +2 -1
  215. package/dist/plot/ScatterPlot3DScene.svelte +608 -406
  216. package/dist/plot/ScatterPlot3DScene.svelte.d.ts +2 -2
  217. package/dist/plot/ScatterPlotControls.svelte +150 -70
  218. package/dist/plot/ScatterPlotControls.svelte.d.ts +1 -1
  219. package/dist/plot/ScatterPoint.svelte +98 -26
  220. package/dist/plot/ScatterPoint.svelte.d.ts +1 -0
  221. package/dist/plot/SpacegroupBarPlot.svelte +142 -85
  222. package/dist/plot/Surface3D.svelte +159 -108
  223. package/dist/plot/ZeroLines.svelte +96 -0
  224. package/dist/plot/ZeroLines.svelte.d.ts +32 -0
  225. package/dist/plot/ZoomRect.svelte +23 -0
  226. package/dist/plot/ZoomRect.svelte.d.ts +8 -0
  227. package/dist/plot/axis-utils.d.ts +1 -1
  228. package/dist/plot/axis-utils.js +1 -3
  229. package/dist/plot/data-cleaning.js +12 -28
  230. package/dist/plot/data-transform.js +2 -1
  231. package/dist/plot/fill-utils.js +2 -0
  232. package/dist/plot/index.d.ts +6 -2
  233. package/dist/plot/index.js +6 -2
  234. package/dist/plot/interactions.d.ts +8 -10
  235. package/dist/plot/interactions.js +2 -3
  236. package/dist/plot/layout.d.ts +11 -2
  237. package/dist/plot/layout.js +44 -17
  238. package/dist/plot/reference-line.d.ts +5 -22
  239. package/dist/plot/reference-line.js +12 -84
  240. package/dist/plot/scales.js +24 -36
  241. package/dist/plot/types.d.ts +53 -40
  242. package/dist/plot/types.js +12 -7
  243. package/dist/plot/utils/label-placement.d.ts +32 -15
  244. package/dist/plot/utils/label-placement.js +227 -63
  245. package/dist/plot/utils/series-visibility.js +2 -3
  246. package/dist/plot/utils.d.ts +1 -0
  247. package/dist/plot/utils.js +14 -0
  248. package/dist/rdf/RdfPlot.svelte +173 -132
  249. package/dist/rdf/calc-rdf.js +4 -5
  250. package/dist/sanitize.d.ts +4 -0
  251. package/dist/sanitize.js +107 -0
  252. package/dist/settings.d.ts +21 -6
  253. package/dist/settings.js +63 -19
  254. package/dist/spectral/Bands.svelte +963 -412
  255. package/dist/spectral/Bands.svelte.d.ts +22 -2
  256. package/dist/spectral/BandsAndDos.svelte +90 -49
  257. package/dist/spectral/BrillouinBandsDos.svelte +151 -93
  258. package/dist/spectral/Dos.svelte +389 -258
  259. package/dist/spectral/helpers.d.ts +23 -1
  260. package/dist/spectral/helpers.js +119 -51
  261. package/dist/spectral/types.d.ts +2 -0
  262. package/dist/state.svelte.d.ts +1 -1
  263. package/dist/state.svelte.js +3 -2
  264. package/dist/structure/Arrow.svelte +59 -20
  265. package/dist/structure/AtomLegend.svelte +231 -129
  266. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  267. package/dist/structure/Bond.svelte +73 -47
  268. package/dist/structure/CanvasTooltip.svelte +10 -2
  269. package/dist/structure/CellSelect.svelte +148 -51
  270. package/dist/structure/Cylinder.svelte +33 -17
  271. package/dist/structure/Lattice.svelte +88 -33
  272. package/dist/structure/Structure.svelte +1077 -821
  273. package/dist/structure/Structure.svelte.d.ts +1 -1
  274. package/dist/structure/StructureControls.svelte +373 -139
  275. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  276. package/dist/structure/StructureExportPane.svelte +124 -89
  277. package/dist/structure/StructureExportPane.svelte.d.ts +1 -1
  278. package/dist/structure/StructureInfoPane.svelte +304 -231
  279. package/dist/structure/StructureScene.svelte +919 -445
  280. package/dist/structure/StructureScene.svelte.d.ts +16 -7
  281. package/dist/structure/atom-properties.d.ts +6 -2
  282. package/dist/structure/atom-properties.js +42 -29
  283. package/dist/structure/bonding.js +6 -7
  284. package/dist/structure/export.js +22 -34
  285. package/dist/structure/ferrox-wasm-types.d.ts +3 -2
  286. package/dist/structure/ferrox-wasm-types.js +0 -3
  287. package/dist/structure/ferrox-wasm.d.ts +3 -2
  288. package/dist/structure/ferrox-wasm.js +2 -3
  289. package/dist/structure/index.d.ts +16 -0
  290. package/dist/structure/index.js +88 -6
  291. package/dist/structure/measure.d.ts +2 -2
  292. package/dist/structure/measure.js +4 -44
  293. package/dist/structure/parse.js +130 -155
  294. package/dist/structure/partial-occupancy.d.ts +25 -0
  295. package/dist/structure/partial-occupancy.js +99 -0
  296. package/dist/structure/pbc.d.ts +1 -0
  297. package/dist/structure/pbc.js +16 -6
  298. package/dist/structure/supercell.d.ts +2 -2
  299. package/dist/structure/supercell.js +12 -22
  300. package/dist/structure/validation.js +5 -3
  301. package/dist/symmetry/SymmetryStats.svelte +94 -37
  302. package/dist/symmetry/WyckoffTable.svelte +42 -14
  303. package/dist/symmetry/cell-transform.js +5 -3
  304. package/dist/symmetry/index.d.ts +7 -4
  305. package/dist/symmetry/index.js +87 -21
  306. package/dist/symmetry/spacegroups.js +148 -148
  307. package/dist/table/HeatmapTable.svelte +1112 -516
  308. package/dist/table/HeatmapTable.svelte.d.ts +12 -1
  309. package/dist/table/ToggleMenu.svelte +125 -90
  310. package/dist/table/index.d.ts +2 -0
  311. package/dist/table/index.js +2 -4
  312. package/dist/theme/ThemeControl.svelte +21 -12
  313. package/dist/time.js +4 -1
  314. package/dist/tooltip/TooltipContent.svelte +33 -8
  315. package/dist/trajectory/Trajectory.svelte +889 -687
  316. package/dist/trajectory/TrajectoryError.svelte +14 -3
  317. package/dist/trajectory/TrajectoryExportPane.svelte +148 -90
  318. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +1 -1
  319. package/dist/trajectory/TrajectoryInfoPane.svelte +272 -143
  320. package/dist/trajectory/constants.d.ts +6 -0
  321. package/dist/trajectory/constants.js +7 -0
  322. package/dist/trajectory/extract.js +13 -31
  323. package/dist/trajectory/format-detect.d.ts +9 -0
  324. package/dist/trajectory/format-detect.js +76 -0
  325. package/dist/trajectory/frame-reader.d.ts +17 -0
  326. package/dist/trajectory/frame-reader.js +332 -0
  327. package/dist/trajectory/helpers.d.ts +14 -0
  328. package/dist/trajectory/helpers.js +172 -0
  329. package/dist/trajectory/index.d.ts +1 -0
  330. package/dist/trajectory/index.js +23 -14
  331. package/dist/trajectory/parse/ase.d.ts +2 -0
  332. package/dist/trajectory/parse/ase.js +77 -0
  333. package/dist/trajectory/parse/hdf5.d.ts +2 -0
  334. package/dist/trajectory/parse/hdf5.js +129 -0
  335. package/dist/trajectory/parse/index.d.ts +12 -0
  336. package/dist/trajectory/parse/index.js +299 -0
  337. package/dist/trajectory/parse/lammps.d.ts +5 -0
  338. package/dist/trajectory/parse/lammps.js +179 -0
  339. package/dist/trajectory/parse/vasp.d.ts +2 -0
  340. package/dist/trajectory/parse/vasp.js +68 -0
  341. package/dist/trajectory/parse/xyz.d.ts +2 -0
  342. package/dist/trajectory/parse/xyz.js +110 -0
  343. package/dist/trajectory/plotting.js +13 -8
  344. package/dist/trajectory/types.d.ts +11 -0
  345. package/dist/trajectory/types.js +1 -0
  346. package/dist/utils.d.ts +3 -0
  347. package/dist/utils.js +17 -0
  348. package/dist/xrd/XrdPlot.svelte +337 -245
  349. package/dist/xrd/broadening.js +14 -9
  350. package/dist/xrd/calc-xrd.js +12 -19
  351. package/dist/xrd/parse.d.ts +1 -1
  352. package/dist/xrd/parse.js +17 -17
  353. package/package.json +103 -101
  354. package/readme.md +4 -4
  355. package/dist/trajectory/parse.d.ts +0 -42
  356. package/dist/trajectory/parse.js +0 -1267
  357. /package/dist/element/{data.json.d.ts → data.json.gz.d.ts} +0 -0
  358. /package/dist/theme/{themes.js → themes.mjs} +0 -0
@@ -1,169 +1,214 @@
1
- <script lang="ts">import Icon from '../../Icon.svelte';
2
- import { getContext, onMount } from 'svelte';
3
- import JsonNode from './JsonNode.svelte';
4
- import JsonValue from './JsonValue.svelte';
5
- import { JSON_TREE_CONTEXT_KEY } from './types';
6
- import { build_path, estimate_byte_size, format_byte_size, format_preview, get_child_count, get_value_type, is_expandable, } from './utils';
7
- let { node_key = null, value, path, depth, is_last = true, } = $props();
8
- const ctx = getContext(JSON_TREE_CONTEXT_KEY);
9
- onMount(() => {
1
+ <script lang="ts">
2
+ import Icon from '../../Icon.svelte'
3
+ import { getContext, onMount } from 'svelte'
4
+ import JsonNode from './JsonNode.svelte'
5
+ import JsonValue from './JsonValue.svelte'
6
+ import type { JsonTreeContext } from './types'
7
+ import { JSON_TREE_CONTEXT_KEY } from './types'
8
+ import {
9
+ build_path,
10
+ estimate_byte_size,
11
+ format_byte_size,
12
+ format_preview,
13
+ get_child_count,
14
+ get_value_type,
15
+ is_expandable,
16
+ } from './utils'
17
+
18
+ let {
19
+ node_key = null,
20
+ value,
21
+ path,
22
+ depth,
23
+ is_last = true,
24
+ }: {
25
+ node_key?: string | number | null
26
+ value: unknown
27
+ path: string
28
+ depth: number
29
+ is_last?: boolean
30
+ } = $props()
31
+
32
+ const ctx = getContext<JsonTreeContext>(JSON_TREE_CONTEXT_KEY)
33
+
34
+ onMount(() => {
10
35
  // Register this path with context for keyboard navigation
11
36
  if (ctx && path) {
12
- ctx.register_path(path);
13
- return () => ctx.unregister_path(path);
37
+ ctx.register_path(path)
38
+ return () => ctx.unregister_path(path)
14
39
  }
15
- });
16
- // Determine value type
17
- let value_type = $derived(get_value_type(value));
18
- // Check if this node is expandable
19
- let expandable = $derived(is_expandable(value));
20
- // Get child count for preview
21
- let child_count = $derived(expandable ? get_child_count(value) : 0);
22
- // Determine if this node should be collapsed
23
- let is_collapsed = $derived.by(() => {
24
- if (!expandable)
25
- return false;
40
+ })
41
+
42
+ // Determine value type
43
+ let value_type = $derived(get_value_type(value))
44
+
45
+ // Check if this node is expandable
46
+ let expandable = $derived(is_expandable(value))
47
+
48
+ // Get child count for preview
49
+ let child_count = $derived(expandable ? get_child_count(value) : 0)
50
+
51
+ // Determine if this node should be collapsed
52
+ let is_collapsed = $derived.by(() => {
53
+ if (!expandable) return false
54
+
26
55
  // Check if explicitly collapsed
27
- if (ctx?.collapsed.has(path))
28
- return true;
56
+ if (ctx?.collapsed.has(path)) return true
57
+
29
58
  // Check if explicitly force-expanded (overrides auto-fold)
30
- if (ctx?.force_expanded.has(path))
31
- return false;
59
+ if (ctx?.force_expanded.has(path)) return false
60
+
32
61
  // If depth >= default_fold_level, default to collapsed
33
- const fold_level = ctx?.settings.default_fold_level ?? 2;
34
- if (depth >= fold_level)
35
- return true;
62
+ const fold_level = ctx?.settings.default_fold_level ?? 2
63
+ if (depth >= fold_level) return true
64
+
36
65
  // Check auto-fold thresholds
37
66
  if (value_type === `array`) {
38
- const threshold = ctx?.settings.auto_fold_arrays ?? 10;
39
- if (child_count > threshold)
40
- return true;
67
+ const threshold = ctx?.settings.auto_fold_arrays ?? 10
68
+ if (child_count > threshold) return true
41
69
  }
42
70
  if (value_type === `object`) {
43
- const threshold = ctx?.settings.auto_fold_objects ?? 20;
44
- if (child_count > threshold)
45
- return true;
71
+ const threshold = ctx?.settings.auto_fold_objects ?? 20
72
+ if (child_count > threshold) return true
46
73
  }
47
- return false;
48
- });
49
- // Note: Search highlighting is handled by CSS Highlight API in JsonTree.svelte
50
- // Check if this node is focused
51
- let is_focused = $derived(ctx?.focused_path === path);
52
- // Check if this is the current search match being navigated
53
- let is_current_match = $derived(ctx?.current_match_path === path);
54
- // Check if this node is selected
55
- let is_selected = $derived(ctx?.selected_paths.has(path) ?? false);
56
- // Diff status for this node (null if no diff or unchanged)
57
- let diff_status = $derived(ctx?.diff_map?.get(path)?.status ?? null);
58
- // Estimated byte size for collapsed preview (only compute when collapsed)
59
- let byte_size = $derived(expandable && is_collapsed ? format_byte_size(estimate_byte_size(value)) : ``);
60
- // Toggle collapse state
61
- function toggle_collapse(event) {
62
- event?.stopPropagation();
74
+
75
+ return false
76
+ })
77
+
78
+ // Note: Search highlighting is handled by CSS Highlight API in JsonTree.svelte
79
+
80
+ // Check if this node is focused
81
+ let is_focused = $derived(ctx?.focused_path === path)
82
+
83
+ // Check if this is the current search match being navigated
84
+ let is_current_match = $derived(ctx?.current_match_path === path)
85
+
86
+ // Check if this node is selected
87
+ let is_selected = $derived(ctx?.selected_paths.has(path) ?? false)
88
+
89
+ // Diff status for this node (null if no diff or unchanged)
90
+ let diff_status = $derived(ctx?.diff_map?.get(path)?.status ?? null)
91
+
92
+ // Estimated byte size for collapsed preview (only compute when collapsed)
93
+ let byte_size = $derived(
94
+ expandable && is_collapsed ? format_byte_size(estimate_byte_size(value)) : ``,
95
+ )
96
+
97
+ // Toggle collapse state
98
+ function toggle_collapse(event?: MouseEvent) {
99
+ event?.stopPropagation()
63
100
  if (ctx && expandable) {
64
- ctx.toggle_collapse(path, is_collapsed);
101
+ ctx.toggle_collapse(path, is_collapsed)
65
102
  }
66
- }
67
- // Toggle collapse recursively on double-click
68
- function toggle_collapse_recursive(event) {
69
- event.stopPropagation();
103
+ }
104
+
105
+ // Toggle collapse recursively on double-click
106
+ function toggle_collapse_recursive(event: MouseEvent) {
107
+ event.stopPropagation()
70
108
  if (ctx && expandable) {
71
- // If collapsed, expand all; if expanded, collapse all
72
- ctx.toggle_collapse_recursive(path, !is_collapsed);
109
+ // If collapsed, expand all; if expanded, collapse all
110
+ ctx.toggle_collapse_recursive(path, !is_collapsed)
73
111
  }
74
- }
75
- // Focus this node
76
- function focus_node() {
77
- ctx?.set_focused(path);
78
- }
79
- // Get children based on value type
80
- function get_children() {
81
- if (!expandable)
82
- return [];
112
+ }
113
+
114
+ // Focus this node
115
+ function focus_node() {
116
+ ctx?.set_focused(path)
117
+ }
118
+
119
+ // Get children based on value type
120
+ function get_children(): Array<{ key: string | number; value: unknown }> {
121
+ if (!expandable) return []
122
+
83
123
  if (value_type === `array`) {
84
- return value.map((val, idx) => ({ key: idx, value: val }));
124
+ return (value as unknown[]).map((val, idx) => ({ key: idx, value: val }))
85
125
  }
126
+
86
127
  if (value_type === `object`) {
87
- let keys = Object.keys(value);
88
- if (ctx?.settings.sort_keys) {
89
- keys = keys.sort();
90
- }
91
- return keys.map((key) => ({
92
- key,
93
- value: value[key],
94
- }));
128
+ let keys = Object.keys(value as Record<string, unknown>)
129
+ if (ctx?.settings.sort_keys) {
130
+ keys = keys.sort()
131
+ }
132
+ return keys.map((key) => ({
133
+ key,
134
+ value: (value as Record<string, unknown>)[key],
135
+ }))
95
136
  }
137
+
96
138
  if (value_type === `map`) {
97
- const map = value;
98
- return Array.from(map.entries()).map(([key, val], idx) => ({
99
- key: idx,
100
- value: { key, value: val },
101
- }));
139
+ const map = value as Map<unknown, unknown>
140
+ return Array.from(map.entries()).map(([key, val], idx) => ({
141
+ key: idx,
142
+ value: { key, value: val },
143
+ }))
102
144
  }
145
+
103
146
  if (value_type === `set`) {
104
- return Array.from(value).map((val, idx) => ({
105
- key: idx,
106
- value: val,
107
- }));
147
+ return Array.from(value as Set<unknown>).map((val, idx) => ({
148
+ key: idx,
149
+ value: val,
150
+ }))
108
151
  }
109
- return [];
110
- }
111
- let children = $derived(get_children());
112
- // Ghost children: removed entries from diff (pre-computed in JsonTree for O(1) lookup)
113
- let ghost_children = $derived.by(() => {
114
- if (!expandable || is_collapsed)
115
- return [];
116
- const all_ghosts = ctx?.ghost_map.get(path) ?? [];
117
- if (all_ghosts.length === 0)
118
- return [];
152
+
153
+ return []
154
+ }
155
+
156
+ let children = $derived(get_children())
157
+
158
+ // Ghost children: removed entries from diff (pre-computed in JsonTree for O(1) lookup)
159
+ let ghost_children = $derived.by(() => {
160
+ if (!expandable || is_collapsed) return []
161
+ const all_ghosts = ctx?.ghost_map.get(path) ?? []
162
+ if (all_ghosts.length === 0) return []
119
163
  // Filter out ghosts whose keys already exist in current children
120
- const existing_keys = new Set(children.map((child) => String(child.key)));
121
- return all_ghosts.filter((ghost) => !existing_keys.has(String(ghost.key)));
122
- });
123
- // Get bracket characters based on type
124
- let open_bracket = $derived(value_type === `array` ? `[` : `{`);
125
- let close_bracket = $derived(value_type === `array` ? `]` : `}`);
126
- // Handle keyboard navigation
127
- function handle_keydown(event) {
128
- if (!is_focused)
129
- return;
164
+ const existing_keys = new Set(children.map((child) => String(child.key)))
165
+ return all_ghosts.filter((ghost) => !existing_keys.has(String(ghost.key)))
166
+ })
167
+
168
+ // Get bracket characters based on type
169
+ let open_bracket = $derived(value_type === `array` ? `[` : `{`)
170
+ let close_bracket = $derived(value_type === `array` ? `]` : `}`)
171
+
172
+ // Handle keyboard navigation
173
+ function handle_keydown(event: KeyboardEvent) {
174
+ if (!is_focused) return
175
+
130
176
  if (event.key === `Enter` || event.key === ` `) {
131
- event.preventDefault();
132
- if (expandable) {
133
- toggle_collapse();
134
- }
135
- else {
136
- ctx?.copy_value(path, value);
137
- }
138
- }
139
- else if (event.key === `ArrowRight`) {
140
- event.preventDefault();
141
- if (expandable && is_collapsed) {
142
- toggle_collapse();
143
- }
144
- }
145
- else if (event.key === `ArrowLeft`) {
146
- event.preventDefault();
147
- if (expandable && !is_collapsed) {
148
- toggle_collapse();
149
- }
150
- }
151
- else if ((event.key === `c` || event.key === `C`) && (event.ctrlKey || event.metaKey)) {
152
- // When nodes are selected, let the tree-level handler do bulk copy
153
- if (ctx?.selected_paths.size)
154
- return;
155
- event.preventDefault();
156
- event.stopPropagation();
157
- ctx?.copy_value(path, value);
177
+ event.preventDefault()
178
+ if (expandable) {
179
+ toggle_collapse()
180
+ } else {
181
+ ctx?.copy_value(path, value)
182
+ }
183
+ } else if (event.key === `ArrowRight`) {
184
+ event.preventDefault()
185
+ if (expandable && is_collapsed) {
186
+ toggle_collapse()
187
+ }
188
+ } else if (event.key === `ArrowLeft`) {
189
+ event.preventDefault()
190
+ if (expandable && !is_collapsed) {
191
+ toggle_collapse()
192
+ }
193
+ } else if (
194
+ (event.key === `c` || event.key === `C`) && (event.ctrlKey || event.metaKey)
195
+ ) {
196
+ // When nodes are selected, let the tree-level handler do bulk copy
197
+ if (ctx?.selected_paths.size) return
198
+ event.preventDefault()
199
+ event.stopPropagation()
200
+ ctx?.copy_value(path, value)
158
201
  }
159
- }
160
- // Element reference for focus management
161
- let node_element = $state();
162
- $effect(() => {
202
+ }
203
+
204
+ // Element reference for focus management
205
+ let node_element: HTMLDivElement | undefined = $state()
206
+
207
+ $effect(() => {
163
208
  if (is_focused && node_element) {
164
- node_element.focus();
209
+ node_element.focus()
165
210
  }
166
- });
211
+ })
167
212
  </script>
168
213
 
169
214
  <div
@@ -223,9 +268,6 @@ $effect(() => {
223
268
  type="button"
224
269
  class="node-key"
225
270
  class:array-index={typeof node_key === `number`}
226
- title={expandable && is_collapsed
227
- ? `Click to expand · Shift+click: copy path · Ctrl+click: select`
228
- : `Click to copy value · Shift+click: copy path · Ctrl+click: select`}
229
271
  tabindex="-1"
230
272
  onclick={(event) => {
231
273
  event.stopPropagation()
@@ -348,17 +390,50 @@ $effect(() => {
348
390
  font-size: var(--jt-font-size, 13px);
349
391
  line-height: var(--jt-line-height, 1.5);
350
392
  outline: none;
351
- }
352
- .json-node:focus {
353
- outline: none;
354
- }
355
- .json-node.focused > .node-content {
356
- background: var(--jt-focus-bg, light-dark(#e3f2fd, #0d3a58));
357
- border-radius: 2px;
358
- }
359
- .json-node.current-match > .node-content {
360
- background: var(--jt-current-match-bg, light-dark(#ffcc80, #8a5600));
361
- border-radius: 2px;
393
+ &:focus {
394
+ outline: none;
395
+ }
396
+ &.focused > .node-content {
397
+ background: var(--jt-focus-bg, light-dark(#e3f2fd, #0d3a58));
398
+ border-radius: 2px;
399
+ }
400
+ &.current-match > .node-content {
401
+ background: var(--jt-current-match-bg, light-dark(#ffcc80, #8a5600));
402
+ border-radius: 2px;
403
+ }
404
+ &.selected > .node-content {
405
+ background: var(--jt-select-bg, light-dark(#bbdefb, #0a3050));
406
+ }
407
+ &.diff-added > .node-content {
408
+ background: var(
409
+ --jt-diff-added,
410
+ light-dark(rgba(76, 175, 80, 0.15), rgba(76, 175, 80, 0.2))
411
+ );
412
+ }
413
+ &.diff-removed > .node-content {
414
+ background: var(
415
+ --jt-diff-removed,
416
+ light-dark(rgba(244, 67, 54, 0.12), rgba(244, 67, 54, 0.18))
417
+ );
418
+ text-decoration: line-through;
419
+ opacity: 0.7;
420
+ }
421
+ &.diff-changed > .node-content {
422
+ background: var(
423
+ --jt-diff-changed,
424
+ light-dark(rgba(255, 193, 7, 0.15), rgba(255, 193, 7, 0.2))
425
+ );
426
+ }
427
+ &.sticky-header > .node-content {
428
+ position: sticky;
429
+ top: calc(var(--jt-sticky-depth) * 20px);
430
+ z-index: calc(100 - var(--jt-sticky-depth));
431
+ background: var(--jt-sticky-bg, var(--jt-bg, transparent));
432
+ display: flex;
433
+ }
434
+ &:hover > .node-content > .collapse-level-btn {
435
+ opacity: 0.5;
436
+ }
362
437
  }
363
438
  .node-content {
364
439
  display: inline-flex;
@@ -366,14 +441,22 @@ $effect(() => {
366
441
  gap: 2px;
367
442
  padding: 1px 2px;
368
443
  border-radius: 2px;
444
+ /* Higher specificity than DraggablePane's :where(button) so our reset wins when nested */
445
+ button {
446
+ background: none;
447
+ border: none;
448
+ padding: 0;
449
+ cursor: pointer;
450
+ font: inherit;
451
+ color: inherit;
452
+ }
369
453
  }
370
- .node-content :where(button) {
371
- background: none;
372
- border: none;
373
- padding: 0;
374
- cursor: pointer;
375
- font: inherit;
376
- color: inherit;
454
+ .ghost .node-content {
455
+ background: var(
456
+ --jt-diff-removed,
457
+ light-dark(rgba(244, 67, 54, 0.12), rgba(244, 67, 54, 0.18))
458
+ );
459
+ text-decoration: line-through;
377
460
  }
378
461
  .collapse-toggle {
379
462
  display: inline-flex;
@@ -384,17 +467,17 @@ $effect(() => {
384
467
  margin: 0;
385
468
  color: var(--jt-arrow, light-dark(#6e6e6e, #858585));
386
469
  flex-shrink: 0;
387
- }
388
- .collapse-toggle:hover {
389
- color: light-dark(#000, #fff);
470
+ &:hover {
471
+ color: light-dark(#000, #fff);
472
+ }
390
473
  }
391
474
  .arrow {
392
475
  display: inline-block;
393
476
  font-size: 0.7em;
394
477
  transition: transform 0.15s ease;
395
- }
396
- .arrow.collapsed {
397
- transform: rotate(-90deg);
478
+ &.collapsed {
479
+ transform: rotate(-90deg);
480
+ }
398
481
  }
399
482
  .no-toggle {
400
483
  display: inline-block;
@@ -403,30 +486,29 @@ $effect(() => {
403
486
  }
404
487
  .node-key {
405
488
  color: var(--jt-key, light-dark(#001080, #9cdcfe));
489
+ &:hover {
490
+ text-decoration: underline;
491
+ .action-hint {
492
+ opacity: 0.6;
493
+ }
494
+ }
495
+ &.array-index .index {
496
+ color: var(--jt-number, light-dark(#098658, #b5cea8));
497
+ }
406
498
  }
407
- .node-key:hover {
408
- text-decoration: underline;
409
- }
410
- .node-key.array-index .index {
411
- color: var(--jt-number, light-dark(#098658, #b5cea8));
499
+ .colon, .comma, .bracket {
500
+ color: var(--jt-punctuation, light-dark(#000, #d4d4d4));
412
501
  }
413
502
  .colon {
414
- color: var(--jt-punctuation, light-dark(#000, #d4d4d4));
415
503
  margin-right: 4px;
416
504
  }
417
- .bracket {
418
- color: var(--jt-punctuation, light-dark(#000, #d4d4d4));
419
- }
420
505
  .preview {
421
506
  color: var(--jt-preview, light-dark(#808080, #808080));
422
507
  font-style: italic;
423
508
  margin: 0 4px;
424
- }
425
- .preview:hover {
426
- text-decoration: underline;
427
- }
428
- .comma {
429
- color: var(--jt-punctuation, light-dark(#000, #d4d4d4));
509
+ &:hover {
510
+ text-decoration: underline;
511
+ }
430
512
  }
431
513
  .children {
432
514
  padding-left: var(--jt-indent, 1.2em);
@@ -434,39 +516,6 @@ $effect(() => {
434
516
  var(--jt-indent-guide, light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.1)));
435
517
  margin-left: 0.5em;
436
518
  }
437
- .json-node.selected > .node-content {
438
- background: var(--jt-select-bg, light-dark(#bbdefb, #0a3050));
439
- }
440
- .json-node.diff-added > .node-content {
441
- background: var(
442
- --jt-diff-added,
443
- light-dark(rgba(76, 175, 80, 0.15), rgba(76, 175, 80, 0.2))
444
- );
445
- }
446
- .json-node.diff-removed > .node-content,
447
- .ghost .node-content {
448
- background: var(
449
- --jt-diff-removed,
450
- light-dark(rgba(244, 67, 54, 0.12), rgba(244, 67, 54, 0.18))
451
- );
452
- text-decoration: line-through;
453
- }
454
- .json-node.diff-removed > .node-content {
455
- opacity: 0.7;
456
- }
457
- .json-node.diff-changed > .node-content {
458
- background: var(
459
- --jt-diff-changed,
460
- light-dark(rgba(255, 193, 7, 0.15), rgba(255, 193, 7, 0.2))
461
- );
462
- }
463
- .json-node.sticky-header > .node-content {
464
- position: sticky;
465
- top: calc(var(--jt-sticky-depth) * 20px);
466
- z-index: calc(100 - var(--jt-sticky-depth));
467
- background: var(--jt-sticky-bg, var(--jt-bg, light-dark(white, #1e1e1e)));
468
- display: flex;
469
- }
470
519
  .action-hint {
471
520
  opacity: 0;
472
521
  font-size: 0.8em;
@@ -474,9 +523,6 @@ $effect(() => {
474
523
  transition: opacity 0.15s;
475
524
  color: var(--jt-arrow, light-dark(#6e6e6e, #858585));
476
525
  }
477
- .node-key:hover .action-hint {
478
- opacity: 0.6;
479
- }
480
526
  .size-hint {
481
527
  font-size: 0.8em;
482
528
  color: var(--jt-preview, light-dark(#808080, #808080));
@@ -490,13 +536,10 @@ $effect(() => {
490
536
  color: var(--jt-arrow, light-dark(#6e6e6e, #858585));
491
537
  transition: opacity 0.15s;
492
538
  margin-left: 4px;
493
- }
494
- .json-node:hover > .node-content > .collapse-level-btn {
495
- opacity: 0.5;
496
- }
497
- .collapse-level-btn:hover {
498
- opacity: 1;
499
- color: light-dark(#000, #fff);
539
+ &:hover {
540
+ opacity: 1;
541
+ color: light-dark(#000, #fff);
542
+ }
500
543
  }
501
544
  .ghost {
502
545
  opacity: 0.5;