matterviz 0.3.1 → 0.3.2

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 (257) hide show
  1. package/dist/FilePicker.svelte +37 -20
  2. package/dist/Icon.svelte +2 -2
  3. package/dist/app.css +29 -0
  4. package/dist/brillouin/BrillouinZone.svelte +19 -61
  5. package/dist/brillouin/BrillouinZone.svelte.d.ts +1 -1
  6. package/dist/brillouin/BrillouinZoneExportPane.svelte +12 -20
  7. package/dist/brillouin/BrillouinZoneScene.svelte +2 -2
  8. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  9. package/dist/chempot-diagram/ChemPotDiagram.svelte +192 -0
  10. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +13 -0
  11. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +677 -0
  12. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +16 -0
  13. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +2688 -0
  14. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +16 -0
  15. package/dist/chempot-diagram/ChemPotScene3D.svelte +8 -0
  16. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +7 -0
  17. package/dist/chempot-diagram/color.d.ts +10 -0
  18. package/dist/chempot-diagram/color.js +33 -0
  19. package/dist/chempot-diagram/compute.d.ts +38 -0
  20. package/dist/chempot-diagram/compute.js +650 -0
  21. package/dist/chempot-diagram/index.d.ts +5 -0
  22. package/dist/chempot-diagram/index.js +5 -0
  23. package/dist/chempot-diagram/pointer.d.ts +16 -0
  24. package/dist/chempot-diagram/pointer.js +40 -0
  25. package/dist/chempot-diagram/temperature.d.ts +15 -0
  26. package/dist/chempot-diagram/temperature.js +37 -0
  27. package/dist/chempot-diagram/types.d.ts +83 -0
  28. package/dist/chempot-diagram/types.js +27 -0
  29. package/dist/colors/index.d.ts +3 -1
  30. package/dist/colors/index.js +4 -0
  31. package/dist/composition/BarChart.svelte +13 -22
  32. package/dist/composition/BubbleChart.svelte +5 -3
  33. package/dist/composition/FormulaFilter.svelte +586 -94
  34. package/dist/composition/FormulaFilter.svelte.d.ts +35 -1
  35. package/dist/composition/PieChart.svelte +43 -18
  36. package/dist/composition/PieChart.svelte.d.ts +1 -1
  37. package/dist/convex-hull/ConvexHull.svelte +4 -2
  38. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
  39. package/dist/convex-hull/ConvexHull2D.svelte +13 -44
  40. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  41. package/dist/convex-hull/ConvexHull3D.svelte +16 -7
  42. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  43. package/dist/convex-hull/ConvexHull4D.svelte +17 -7
  44. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  45. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +1 -1
  46. package/dist/convex-hull/ConvexHullStats.svelte +701 -226
  47. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +6 -1
  48. package/dist/convex-hull/ConvexHullTooltip.svelte +1 -0
  49. package/dist/convex-hull/demo-temperature.d.ts +6 -0
  50. package/dist/convex-hull/demo-temperature.js +36 -0
  51. package/dist/convex-hull/helpers.d.ts +1 -1
  52. package/dist/convex-hull/helpers.js +2 -4
  53. package/dist/convex-hull/index.d.ts +1 -0
  54. package/dist/convex-hull/index.js +1 -0
  55. package/dist/convex-hull/thermodynamics.d.ts +8 -21
  56. package/dist/convex-hull/thermodynamics.js +106 -17
  57. package/dist/convex-hull/types.d.ts +5 -0
  58. package/dist/convex-hull/types.js +5 -0
  59. package/dist/coordination/CoordinationBarPlot.svelte +29 -46
  60. package/dist/element/BohrAtom.svelte +1 -1
  61. package/dist/element/data.js +2 -14
  62. package/dist/element/data.json.gz +0 -0
  63. package/dist/element/types.d.ts +1 -0
  64. package/dist/fermi-surface/FermiSurface.svelte +20 -64
  65. package/dist/fermi-surface/FermiSurface.svelte.d.ts +1 -1
  66. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  67. package/dist/fermi-surface/FermiSurfaceScene.svelte +1 -1
  68. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  69. package/dist/fermi-surface/parse.js +16 -22
  70. package/dist/heatmap-matrix/HeatmapMatrix.svelte +1273 -0
  71. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +110 -0
  72. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +171 -0
  73. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +31 -0
  74. package/dist/heatmap-matrix/index.d.ts +53 -0
  75. package/dist/heatmap-matrix/index.js +100 -0
  76. package/dist/heatmap-matrix/shared.d.ts +2 -0
  77. package/dist/heatmap-matrix/shared.js +4 -0
  78. package/dist/icons.d.ts +111 -0
  79. package/dist/icons.js +111 -0
  80. package/dist/index.d.ts +3 -1
  81. package/dist/index.js +3 -1
  82. package/dist/io/export.js +15 -3
  83. package/dist/io/file-drop.d.ts +7 -0
  84. package/dist/io/file-drop.js +43 -0
  85. package/dist/io/index.d.ts +2 -2
  86. package/dist/io/index.js +2 -112
  87. package/dist/io/types.d.ts +1 -0
  88. package/dist/io/url-drop.d.ts +2 -0
  89. package/dist/io/url-drop.js +118 -0
  90. package/dist/isosurface/Isosurface.svelte +101 -45
  91. package/dist/isosurface/IsosurfaceControls.svelte +19 -0
  92. package/dist/isosurface/parse.js +73 -30
  93. package/dist/isosurface/slice.d.ts +2 -1
  94. package/dist/isosurface/slice.js +3 -3
  95. package/dist/isosurface/types.d.ts +13 -1
  96. package/dist/isosurface/types.js +98 -0
  97. package/dist/labels.d.ts +2 -1
  98. package/dist/labels.js +1 -0
  99. package/dist/layout/InfoTag.svelte +62 -62
  100. package/dist/layout/SubpageGrid.svelte +74 -0
  101. package/dist/layout/SubpageGrid.svelte.d.ts +14 -0
  102. package/dist/layout/index.d.ts +1 -0
  103. package/dist/layout/index.js +1 -0
  104. package/dist/layout/json-tree/JsonNode.svelte +83 -85
  105. package/dist/layout/json-tree/JsonTree.svelte +20 -19
  106. package/dist/layout/json-tree/JsonTree.svelte.d.ts +1 -1
  107. package/dist/layout/json-tree/JsonValue.svelte +196 -116
  108. package/dist/layout/json-tree/types.d.ts +10 -2
  109. package/dist/layout/json-tree/utils.d.ts +2 -0
  110. package/dist/layout/json-tree/utils.js +33 -0
  111. package/dist/math.d.ts +7 -0
  112. package/dist/math.js +358 -7
  113. package/dist/overlays/ContextMenu.svelte +3 -2
  114. package/dist/overlays/DraggablePane.svelte +163 -58
  115. package/dist/overlays/DraggablePane.svelte.d.ts +2 -0
  116. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +232 -77
  117. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -2
  118. package/dist/phase-diagram/PhaseDiagramControls.svelte +32 -11
  119. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +3 -2
  120. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +103 -0
  121. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +15 -0
  122. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +102 -95
  123. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +7 -0
  124. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +100 -26
  125. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +6 -3
  126. package/dist/phase-diagram/index.d.ts +2 -0
  127. package/dist/phase-diagram/index.js +2 -0
  128. package/dist/phase-diagram/svg-to-diagram.d.ts +2 -0
  129. package/dist/phase-diagram/svg-to-diagram.js +865 -0
  130. package/dist/phase-diagram/types.d.ts +10 -0
  131. package/dist/phase-diagram/utils.d.ts +7 -4
  132. package/dist/phase-diagram/utils.js +149 -59
  133. package/dist/plot/AxisLabel.svelte +26 -0
  134. package/dist/plot/AxisLabel.svelte.d.ts +16 -0
  135. package/dist/plot/BarPlot.svelte +473 -228
  136. package/dist/plot/BarPlot.svelte.d.ts +3 -3
  137. package/dist/plot/BarPlotControls.svelte +3 -2
  138. package/dist/plot/BarPlotControls.svelte.d.ts +1 -1
  139. package/dist/plot/ColorBar.svelte +54 -54
  140. package/dist/plot/ColorBar.svelte.d.ts +1 -1
  141. package/dist/plot/ColorScaleSelect.svelte +1 -1
  142. package/dist/plot/ElementScatter.svelte +3 -2
  143. package/dist/plot/FillArea.svelte +4 -1
  144. package/dist/plot/Histogram.svelte +320 -230
  145. package/dist/plot/Histogram.svelte.d.ts +2 -2
  146. package/dist/plot/HistogramControls.svelte +29 -10
  147. package/dist/plot/HistogramControls.svelte.d.ts +6 -2
  148. package/dist/plot/InteractiveAxisLabel.svelte.d.ts +2 -2
  149. package/dist/plot/PlotControls.svelte +109 -27
  150. package/dist/plot/PlotControls.svelte.d.ts +1 -1
  151. package/dist/plot/PlotLegend.svelte +1 -1
  152. package/dist/plot/PortalSelect.svelte +2 -1
  153. package/dist/plot/ReferenceLine.svelte +2 -1
  154. package/dist/plot/ReferenceLine.svelte.d.ts +1 -0
  155. package/dist/plot/ReferencePlane.svelte +1 -3
  156. package/dist/plot/ScatterPlot.svelte +343 -209
  157. package/dist/plot/ScatterPlot.svelte.d.ts +3 -3
  158. package/dist/plot/ScatterPlot3D.svelte.d.ts +2 -2
  159. package/dist/plot/ScatterPlot3DControls.svelte +203 -250
  160. package/dist/plot/ScatterPlot3DScene.svelte +4 -7
  161. package/dist/plot/ScatterPlot3DScene.svelte.d.ts +2 -2
  162. package/dist/plot/ScatterPlotControls.svelte +95 -55
  163. package/dist/plot/ScatterPlotControls.svelte.d.ts +1 -1
  164. package/dist/plot/ZeroLines.svelte +44 -0
  165. package/dist/plot/ZeroLines.svelte.d.ts +32 -0
  166. package/dist/plot/ZoomRect.svelte +21 -0
  167. package/dist/plot/ZoomRect.svelte.d.ts +8 -0
  168. package/dist/plot/axis-utils.d.ts +1 -1
  169. package/dist/plot/index.d.ts +6 -2
  170. package/dist/plot/index.js +6 -2
  171. package/dist/plot/interactions.d.ts +8 -10
  172. package/dist/plot/interactions.js +2 -3
  173. package/dist/plot/layout.d.ts +7 -1
  174. package/dist/plot/layout.js +12 -4
  175. package/dist/plot/reference-line.d.ts +4 -21
  176. package/dist/plot/reference-line.js +7 -81
  177. package/dist/plot/types.d.ts +42 -17
  178. package/dist/plot/types.js +10 -0
  179. package/dist/plot/utils/label-placement.js +13 -10
  180. package/dist/plot/utils.d.ts +1 -0
  181. package/dist/plot/utils.js +14 -0
  182. package/dist/rdf/RdfPlot.svelte +55 -66
  183. package/dist/settings.d.ts +3 -0
  184. package/dist/settings.js +17 -3
  185. package/dist/spectral/Bands.svelte +515 -143
  186. package/dist/spectral/Bands.svelte.d.ts +22 -2
  187. package/dist/spectral/helpers.d.ts +23 -1
  188. package/dist/spectral/helpers.js +65 -9
  189. package/dist/spectral/types.d.ts +2 -0
  190. package/dist/structure/AtomLegend.svelte +29 -8
  191. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  192. package/dist/structure/CellSelect.svelte +92 -22
  193. package/dist/structure/Structure.svelte +108 -118
  194. package/dist/structure/Structure.svelte.d.ts +1 -1
  195. package/dist/structure/StructureControls.svelte +25 -22
  196. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  197. package/dist/structure/StructureInfoPane.svelte +7 -1
  198. package/dist/structure/StructureScene.svelte +104 -66
  199. package/dist/structure/StructureScene.svelte.d.ts +2 -1
  200. package/dist/structure/atom-properties.d.ts +6 -2
  201. package/dist/structure/atom-properties.js +38 -25
  202. package/dist/structure/export.js +10 -7
  203. package/dist/structure/ferrox-wasm-types.d.ts +3 -2
  204. package/dist/structure/ferrox-wasm-types.js +0 -3
  205. package/dist/structure/ferrox-wasm.d.ts +3 -2
  206. package/dist/structure/ferrox-wasm.js +1 -2
  207. package/dist/structure/index.d.ts +6 -0
  208. package/dist/structure/index.js +22 -0
  209. package/dist/structure/parse.js +19 -16
  210. package/dist/structure/partial-occupancy.d.ts +25 -0
  211. package/dist/structure/partial-occupancy.js +102 -0
  212. package/dist/structure/validation.js +6 -3
  213. package/dist/symmetry/SymmetryStats.svelte +18 -4
  214. package/dist/symmetry/WyckoffTable.svelte +18 -10
  215. package/dist/symmetry/index.d.ts +7 -4
  216. package/dist/symmetry/index.js +83 -18
  217. package/dist/table/HeatmapTable.svelte +425 -65
  218. package/dist/table/HeatmapTable.svelte.d.ts +12 -1
  219. package/dist/table/ToggleMenu.svelte +2 -0
  220. package/dist/table/index.d.ts +2 -0
  221. package/dist/trajectory/Trajectory.svelte +147 -145
  222. package/dist/trajectory/TrajectoryExportPane.svelte +13 -9
  223. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +1 -1
  224. package/dist/trajectory/constants.d.ts +6 -0
  225. package/dist/trajectory/constants.js +7 -0
  226. package/dist/trajectory/extract.js +3 -5
  227. package/dist/trajectory/format-detect.d.ts +9 -0
  228. package/dist/trajectory/format-detect.js +76 -0
  229. package/dist/trajectory/frame-reader.d.ts +17 -0
  230. package/dist/trajectory/frame-reader.js +339 -0
  231. package/dist/trajectory/helpers.d.ts +15 -0
  232. package/dist/trajectory/helpers.js +187 -0
  233. package/dist/trajectory/index.d.ts +1 -0
  234. package/dist/trajectory/index.js +11 -4
  235. package/dist/trajectory/parse/ase.d.ts +2 -0
  236. package/dist/trajectory/parse/ase.js +76 -0
  237. package/dist/trajectory/parse/hdf5.d.ts +2 -0
  238. package/dist/trajectory/parse/hdf5.js +121 -0
  239. package/dist/trajectory/parse/index.d.ts +12 -0
  240. package/dist/trajectory/parse/index.js +304 -0
  241. package/dist/trajectory/parse/lammps.d.ts +5 -0
  242. package/dist/trajectory/parse/lammps.js +169 -0
  243. package/dist/trajectory/parse/vasp.d.ts +2 -0
  244. package/dist/trajectory/parse/vasp.js +65 -0
  245. package/dist/trajectory/parse/xyz.d.ts +2 -0
  246. package/dist/trajectory/parse/xyz.js +109 -0
  247. package/dist/trajectory/types.d.ts +11 -0
  248. package/dist/trajectory/types.js +1 -0
  249. package/dist/utils.d.ts +2 -0
  250. package/dist/utils.js +4 -0
  251. package/dist/xrd/XrdPlot.svelte +6 -4
  252. package/dist/xrd/calc-xrd.js +0 -1
  253. package/package.json +30 -24
  254. package/readme.md +4 -4
  255. package/dist/trajectory/parse.d.ts +0 -42
  256. package/dist/trajectory/parse.js +0 -1267
  257. /package/dist/element/{data.json.d.ts → data.json.gz.d.ts} +0 -0
@@ -67,63 +67,63 @@ function handle_remove(event) {
67
67
  border: 1px solid;
68
68
  white-space: nowrap;
69
69
  border-color: color-mix(in srgb, var(--tag-color) 25%, transparent);
70
- }
71
- .info-tag em {
72
- font-style: normal;
73
- font-weight: 600;
74
- color: var(--tag-color);
75
- }
76
- .info-tag:hover:not(.disabled) {
77
- background: color-mix(in srgb, var(--tag-color) 18%, transparent);
78
- border-color: color-mix(in srgb, var(--tag-color) 40%, transparent);
79
- }
80
- .info-tag.sm {
81
- font-size: 0.72em;
82
- padding: 0 5pt;
83
- border-radius: 4px;
84
- }
85
- .info-tag.md {
86
- font-size: 0.8em;
87
- padding: 1pt 6pt;
88
- border-radius: 5px;
89
- }
90
- .info-tag.lg {
91
- font-size: 0.9em;
92
- padding: 3pt 8pt;
93
- border-radius: 6px;
94
- }
95
- .info-tag.default {
96
- --tag-color: var(--highlight, #4db6ff);
97
- }
98
- .info-tag.success {
99
- --tag-color: var(--success-color, #10b981);
100
- }
101
- .info-tag.warning {
102
- --tag-color: var(--warning-color, #f59e0b);
103
- }
104
- .info-tag.error {
105
- --tag-color: var(--error-color, #ef4444);
106
- }
107
- .info-tag.info {
108
- --tag-color: var(--info-color, #3b82f6);
109
- }
110
- .info-tag.disabled {
111
- opacity: 0.5;
112
- cursor: not-allowed;
113
- }
114
- .info-tag:active:not(.disabled) {
115
- transform: scale(0.97);
116
- }
117
- .info-tag :global(.copy-checkmark) {
118
- position: absolute;
119
- top: 50%;
120
- right: 3pt;
121
- transform: translateY(-50%);
122
- background: rgba(16, 185, 129, 0.9);
123
- border-radius: 50%;
124
- padding: 2pt;
125
- display: flex;
126
- animation: pop-in 0.15s ease-out;
70
+ em {
71
+ font-style: normal;
72
+ font-weight: 600;
73
+ color: var(--tag-color);
74
+ }
75
+ &:hover:not(.disabled) {
76
+ background: color-mix(in srgb, var(--tag-color) 18%, transparent);
77
+ border-color: color-mix(in srgb, var(--tag-color) 40%, transparent);
78
+ }
79
+ &.sm {
80
+ font-size: 0.72em;
81
+ padding: 0 5pt;
82
+ border-radius: 4px;
83
+ }
84
+ &.md {
85
+ font-size: 0.8em;
86
+ padding: 1pt 6pt;
87
+ border-radius: 5px;
88
+ }
89
+ &.lg {
90
+ font-size: 0.9em;
91
+ padding: 3pt 8pt;
92
+ border-radius: 6px;
93
+ }
94
+ &.default {
95
+ --tag-color: var(--highlight, #4db6ff);
96
+ }
97
+ &.success {
98
+ --tag-color: var(--success-color, #10b981);
99
+ }
100
+ &.warning {
101
+ --tag-color: var(--warning-color, #f59e0b);
102
+ }
103
+ &.error {
104
+ --tag-color: var(--error-color, #ef4444);
105
+ }
106
+ &.info {
107
+ --tag-color: var(--info-color, #3b82f6);
108
+ }
109
+ &.disabled {
110
+ opacity: 0.5;
111
+ cursor: not-allowed;
112
+ }
113
+ &:active:not(.disabled) {
114
+ transform: scale(0.97);
115
+ }
116
+ :global(.copy-checkmark) {
117
+ position: absolute;
118
+ top: 50%;
119
+ right: 3pt;
120
+ transform: translateY(-50%);
121
+ background: rgba(16, 185, 129, 0.9);
122
+ border-radius: 50%;
123
+ padding: 2pt;
124
+ display: flex;
125
+ animation: pop-in 0.15s ease-out;
126
+ }
127
127
  }
128
128
  [aria-label='Remove'] {
129
129
  display: flex;
@@ -137,11 +137,11 @@ function handle_remove(event) {
137
137
  border-radius: 50%;
138
138
  color: inherit;
139
139
  opacity: 0.5;
140
- }
141
- [aria-label='Remove']:hover {
142
- opacity: 1;
143
- background: rgba(239, 68, 68, 0.2);
144
- color: var(--error-color, #ef4444);
140
+ &:hover {
141
+ opacity: 1;
142
+ background: rgba(239, 68, 68, 0.2);
143
+ color: var(--error-color, #ef4444);
144
+ }
145
145
  }
146
146
  @keyframes pop-in {
147
147
  from {
@@ -0,0 +1,74 @@
1
+ <script lang="ts">import Icon from '../Icon.svelte';
2
+ const { title, subtitle, subpages } = $props();
3
+ </script>
4
+
5
+ <h1>{title}</h1>
6
+ <p class="subtitle">{subtitle}</p>
7
+
8
+ <nav class="grid">
9
+ {#each subpages as { href, title: page_title, description, icon } (href)}
10
+ <a {href} class="card">
11
+ <Icon {icon} class="icon" />
12
+ <div>
13
+ <h2>{page_title}</h2>
14
+ <p>{description}</p>
15
+ </div>
16
+ </a>
17
+ {/each}
18
+ </nav>
19
+
20
+ <style>
21
+ h1 {
22
+ text-align: center;
23
+ margin-bottom: 0.3em;
24
+ }
25
+ .subtitle {
26
+ text-align: center;
27
+ color: var(--text-color-muted);
28
+ margin: 0 auto 2em;
29
+ }
30
+ .grid {
31
+ display: grid;
32
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
33
+ gap: 1.2em;
34
+ max-width: 1100px;
35
+ margin: 0 auto;
36
+ padding: 0;
37
+ }
38
+ .card {
39
+ display: flex;
40
+ gap: 1em;
41
+ align-items: flex-start;
42
+ padding: 1.2em 1.4em;
43
+ border-radius: var(--border-radius, 5pt);
44
+ border: 1px solid color-mix(in srgb, currentColor 15%, transparent);
45
+ text-decoration: none;
46
+ color: inherit;
47
+ transition: border-color 0.15s, box-shadow 0.15s;
48
+ &:hover {
49
+ border-color: color-mix(in srgb, currentColor 35%, transparent);
50
+ box-shadow: 0 2px 12px color-mix(in srgb, currentColor 8%, transparent);
51
+ }
52
+ &:hover :global(.icon) {
53
+ opacity: 1;
54
+ }
55
+ h2 {
56
+ margin: 0 0 0.4em;
57
+ font-size: 1.1em;
58
+ }
59
+ p {
60
+ margin: 0;
61
+ font-size: 0.88em;
62
+ color: var(--text-color-muted);
63
+ line-height: 1.5;
64
+ }
65
+ }
66
+ .card :global(.icon) {
67
+ width: 2em;
68
+ height: 2em;
69
+ flex-shrink: 0;
70
+ margin-top: 0.1em;
71
+ opacity: 0.6;
72
+ transition: opacity 0.15s;
73
+ }
74
+ </style>
@@ -0,0 +1,14 @@
1
+ import type { IconName } from '../icons';
2
+ interface Props {
3
+ title: string;
4
+ subtitle: string;
5
+ subpages: {
6
+ href: string;
7
+ title: string;
8
+ description: string;
9
+ icon: IconName;
10
+ }[];
11
+ }
12
+ declare const SubpageGrid: import("svelte").Component<Props, {}, "">;
13
+ type SubpageGrid = ReturnType<typeof SubpageGrid>;
14
+ export default SubpageGrid;
@@ -5,5 +5,6 @@ export { default as InfoTag } from './InfoTag.svelte';
5
5
  export * from './json-tree';
6
6
  export { default as PropertyFilter } from './PropertyFilter.svelte';
7
7
  export { default as SettingsSection } from './SettingsSection.svelte';
8
+ export { default as SubpageGrid } from './SubpageGrid.svelte';
8
9
  export type InfoTagVariant = `default` | `success` | `warning` | `error` | `info`;
9
10
  export type InfoTagSize = `sm` | `md` | `lg`;
@@ -5,3 +5,4 @@ export { default as InfoTag } from './InfoTag.svelte';
5
5
  export * from './json-tree';
6
6
  export { default as PropertyFilter } from './PropertyFilter.svelte';
7
7
  export { default as SettingsSection } from './SettingsSection.svelte';
8
+ export { default as SubpageGrid } from './SubpageGrid.svelte';
@@ -223,9 +223,6 @@ $effect(() => {
223
223
  type="button"
224
224
  class="node-key"
225
225
  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
226
  tabindex="-1"
230
227
  onclick={(event) => {
231
228
  event.stopPropagation()
@@ -348,17 +345,50 @@ $effect(() => {
348
345
  font-size: var(--jt-font-size, 13px);
349
346
  line-height: var(--jt-line-height, 1.5);
350
347
  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;
348
+ &:focus {
349
+ outline: none;
350
+ }
351
+ &.focused > .node-content {
352
+ background: var(--jt-focus-bg, light-dark(#e3f2fd, #0d3a58));
353
+ border-radius: 2px;
354
+ }
355
+ &.current-match > .node-content {
356
+ background: var(--jt-current-match-bg, light-dark(#ffcc80, #8a5600));
357
+ border-radius: 2px;
358
+ }
359
+ &.selected > .node-content {
360
+ background: var(--jt-select-bg, light-dark(#bbdefb, #0a3050));
361
+ }
362
+ &.diff-added > .node-content {
363
+ background: var(
364
+ --jt-diff-added,
365
+ light-dark(rgba(76, 175, 80, 0.15), rgba(76, 175, 80, 0.2))
366
+ );
367
+ }
368
+ &.diff-removed > .node-content {
369
+ background: var(
370
+ --jt-diff-removed,
371
+ light-dark(rgba(244, 67, 54, 0.12), rgba(244, 67, 54, 0.18))
372
+ );
373
+ text-decoration: line-through;
374
+ opacity: 0.7;
375
+ }
376
+ &.diff-changed > .node-content {
377
+ background: var(
378
+ --jt-diff-changed,
379
+ light-dark(rgba(255, 193, 7, 0.15), rgba(255, 193, 7, 0.2))
380
+ );
381
+ }
382
+ &.sticky-header > .node-content {
383
+ position: sticky;
384
+ top: calc(var(--jt-sticky-depth) * 20px);
385
+ z-index: calc(100 - var(--jt-sticky-depth));
386
+ background: var(--jt-sticky-bg, var(--jt-bg, transparent));
387
+ display: flex;
388
+ }
389
+ &:hover > .node-content > .collapse-level-btn {
390
+ opacity: 0.5;
391
+ }
362
392
  }
363
393
  .node-content {
364
394
  display: inline-flex;
@@ -366,14 +396,22 @@ $effect(() => {
366
396
  gap: 2px;
367
397
  padding: 1px 2px;
368
398
  border-radius: 2px;
399
+ /* Higher specificity than DraggablePane's :where(button) so our reset wins when nested */
400
+ button {
401
+ background: none;
402
+ border: none;
403
+ padding: 0;
404
+ cursor: pointer;
405
+ font: inherit;
406
+ color: inherit;
407
+ }
369
408
  }
370
- .node-content :where(button) {
371
- background: none;
372
- border: none;
373
- padding: 0;
374
- cursor: pointer;
375
- font: inherit;
376
- color: inherit;
409
+ .ghost .node-content {
410
+ background: var(
411
+ --jt-diff-removed,
412
+ light-dark(rgba(244, 67, 54, 0.12), rgba(244, 67, 54, 0.18))
413
+ );
414
+ text-decoration: line-through;
377
415
  }
378
416
  .collapse-toggle {
379
417
  display: inline-flex;
@@ -384,17 +422,17 @@ $effect(() => {
384
422
  margin: 0;
385
423
  color: var(--jt-arrow, light-dark(#6e6e6e, #858585));
386
424
  flex-shrink: 0;
387
- }
388
- .collapse-toggle:hover {
389
- color: light-dark(#000, #fff);
425
+ &:hover {
426
+ color: light-dark(#000, #fff);
427
+ }
390
428
  }
391
429
  .arrow {
392
430
  display: inline-block;
393
431
  font-size: 0.7em;
394
432
  transition: transform 0.15s ease;
395
- }
396
- .arrow.collapsed {
397
- transform: rotate(-90deg);
433
+ &.collapsed {
434
+ transform: rotate(-90deg);
435
+ }
398
436
  }
399
437
  .no-toggle {
400
438
  display: inline-block;
@@ -403,30 +441,29 @@ $effect(() => {
403
441
  }
404
442
  .node-key {
405
443
  color: var(--jt-key, light-dark(#001080, #9cdcfe));
444
+ &:hover {
445
+ text-decoration: underline;
446
+ .action-hint {
447
+ opacity: 0.6;
448
+ }
449
+ }
450
+ &.array-index .index {
451
+ color: var(--jt-number, light-dark(#098658, #b5cea8));
452
+ }
406
453
  }
407
- .node-key:hover {
408
- text-decoration: underline;
409
- }
410
- .node-key.array-index .index {
411
- color: var(--jt-number, light-dark(#098658, #b5cea8));
454
+ .colon, .comma, .bracket {
455
+ color: var(--jt-punctuation, light-dark(#000, #d4d4d4));
412
456
  }
413
457
  .colon {
414
- color: var(--jt-punctuation, light-dark(#000, #d4d4d4));
415
458
  margin-right: 4px;
416
459
  }
417
- .bracket {
418
- color: var(--jt-punctuation, light-dark(#000, #d4d4d4));
419
- }
420
460
  .preview {
421
461
  color: var(--jt-preview, light-dark(#808080, #808080));
422
462
  font-style: italic;
423
463
  margin: 0 4px;
424
- }
425
- .preview:hover {
426
- text-decoration: underline;
427
- }
428
- .comma {
429
- color: var(--jt-punctuation, light-dark(#000, #d4d4d4));
464
+ &:hover {
465
+ text-decoration: underline;
466
+ }
430
467
  }
431
468
  .children {
432
469
  padding-left: var(--jt-indent, 1.2em);
@@ -434,39 +471,6 @@ $effect(() => {
434
471
  var(--jt-indent-guide, light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.1)));
435
472
  margin-left: 0.5em;
436
473
  }
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
474
  .action-hint {
471
475
  opacity: 0;
472
476
  font-size: 0.8em;
@@ -474,9 +478,6 @@ $effect(() => {
474
478
  transition: opacity 0.15s;
475
479
  color: var(--jt-arrow, light-dark(#6e6e6e, #858585));
476
480
  }
477
- .node-key:hover .action-hint {
478
- opacity: 0.6;
479
- }
480
481
  .size-hint {
481
482
  font-size: 0.8em;
482
483
  color: var(--jt-preview, light-dark(#808080, #808080));
@@ -490,13 +491,10 @@ $effect(() => {
490
491
  color: var(--jt-arrow, light-dark(#6e6e6e, #858585));
491
492
  transition: opacity 0.15s;
492
493
  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);
494
+ &:hover {
495
+ opacity: 1;
496
+ color: light-dark(#000, #fff);
497
+ }
500
498
  }
501
499
  .ghost {
502
500
  opacity: 0.5;
@@ -10,7 +10,7 @@ import { build_ghost_map, collect_all_paths, compute_diff, find_matching_paths,
10
10
  const ARROW_KEYS = new Set([`ArrowDown`, `ArrowUp`, `ArrowLeft`, `ArrowRight`]);
11
11
  // Shared empty set for when there's no search query (avoid allocation on every derivation)
12
12
  const EMPTY_MATCHES = new SvelteSet();
13
- let { value, root_label, default_fold_level = 2, auto_fold_arrays = 10, auto_fold_objects = 20, collapsed_paths = $bindable(new SvelteSet()), show_header = true, show_data_types = $bindable(false), show_array_indices = $bindable(true), sort_keys = false, max_string_length = 200, highlight_changes = true, onselect, oncopy, download_filename, compare_value, ...rest } = $props();
13
+ let { value, root_label, default_fold_level = 2, auto_fold_arrays = 10, auto_fold_objects = 20, collapsed_paths = $bindable(new SvelteSet()), show_header = true, show_data_types = $bindable(false), show_array_indices = $bindable(true), sort_keys = false, max_string_length = 200, highlight_changes = true, onselect, oncopy, download_filename, compare_value, editable = false, onchange, ...rest } = $props();
14
14
  // Internal state
15
15
  let search_query = $state(``);
16
16
  let search_input_value = $state(``);
@@ -371,6 +371,7 @@ const context = {
371
371
  sort_keys,
372
372
  max_string_length,
373
373
  highlight_changes,
374
+ editable,
374
375
  };
375
376
  },
376
377
  get collapsed() {
@@ -419,6 +420,9 @@ const context = {
419
420
  return ghost_map;
420
421
  },
421
422
  collapse_children_only,
423
+ get onchange() {
424
+ return onchange;
425
+ },
422
426
  };
423
427
  setContext(JSON_TREE_CONTEXT_KEY, context);
424
428
  // Keyboard navigation at tree level
@@ -832,12 +836,14 @@ function handle_search_keydown(event) {
832
836
  border-radius: var(--jt-border-radius, 4px);
833
837
  overflow: hidden;
834
838
  }
839
+ /* --jt-header-bg, --jt-header-border, --jt-btn-bg, --jt-btn-hover-bg, --jt-btn-active-bg
840
+ intentionally removed in favor of transparent/opacity-based button styling.
841
+ Use --jt-hover-bg to customize the button hover background. */
835
842
  .json-tree-header {
836
843
  display: flex;
837
844
  align-items: center;
838
845
  gap: 8px;
839
846
  padding: 6px 8px;
840
- background: var(--jt-header-bg);
841
847
  flex-wrap: wrap;
842
848
  }
843
849
  .search-wrapper {
@@ -898,26 +904,22 @@ function handle_search_keydown(event) {
898
904
  min-width: 24px;
899
905
  height: 24px;
900
906
  padding: 2px 6px;
901
- border: 1px solid var(--jt-header-border);
902
- background: var(--jt-btn-bg, light-dark(white, rgba(255, 255, 255, 0.1)));
907
+ border: none;
908
+ background: transparent;
903
909
  border-radius: 3px;
904
910
  cursor: pointer;
905
911
  font-size: 11px;
906
912
  font-weight: 500;
907
913
  color: inherit;
908
- transition: background 0.15s;
914
+ opacity: 0.6;
915
+ transition: opacity 0.15s, background 0.15s;
909
916
  }
910
917
  .controls button:hover {
911
- background: var(
912
- --jt-btn-hover-bg,
913
- light-dark(rgba(0, 0, 0, 0.05), rgba(255, 255, 255, 0.15))
914
- );
918
+ opacity: 1;
919
+ background: var(--jt-hover-bg);
915
920
  }
916
921
  .controls button.active {
917
- background: var(
918
- --jt-btn-active-bg,
919
- light-dark(rgba(0, 0, 0, 0.12), rgba(255, 255, 255, 0.2))
920
- );
922
+ opacity: 1;
921
923
  }
922
924
  .match-nav {
923
925
  display: flex;
@@ -931,17 +933,16 @@ function handle_search_keydown(event) {
931
933
  width: 20px;
932
934
  height: 20px;
933
935
  padding: 0;
934
- border: 1px solid var(--jt-header-border);
935
- background: var(--jt-btn-bg, light-dark(white, rgba(255, 255, 255, 0.1)));
936
+ border: none;
937
+ background: transparent;
936
938
  border-radius: 3px;
937
939
  cursor: pointer;
938
940
  color: inherit;
941
+ opacity: 0.6;
939
942
  }
940
943
  .nav-btn:hover {
941
- background: var(
942
- --jt-btn-hover-bg,
943
- light-dark(rgba(0, 0, 0, 0.05), rgba(255, 255, 255, 0.15))
944
- );
944
+ opacity: 1;
945
+ background: var(--jt-hover-bg);
945
946
  }
946
947
  .match-count {
947
948
  font-size: 11px;
@@ -1,6 +1,6 @@
1
1
  import type { HTMLAttributes } from 'svelte/elements';
2
2
  import type { JsonTreeProps } from './types';
3
- type $$ComponentProps = JsonTreeProps & Omit<HTMLAttributes<HTMLDivElement>, `onselect`>;
3
+ type $$ComponentProps = JsonTreeProps & Omit<HTMLAttributes<HTMLDivElement>, `onselect` | `onchange`>;
4
4
  declare const JsonTree: import("svelte").Component<$$ComponentProps, {}, "collapsed_paths" | "show_data_types" | "show_array_indices">;
5
5
  type JsonTree = ReturnType<typeof JsonTree>;
6
6
  export default JsonTree;