@tanstack/devtools-ui 0.3.4 → 0.4.0

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.
@@ -1,4 +1,7 @@
1
- export declare function JsonTree(props: {
2
- value: any;
1
+ import { CollapsiblePaths } from '../utils/deep-keys.js';
2
+ export declare function JsonTree<TData, TName extends CollapsiblePaths<TData>>(props: {
3
+ value: TData;
3
4
  copyable?: boolean;
5
+ defaultExpansionDepth?: number;
6
+ collapsePaths?: Array<TName>;
4
7
  }): import("solid-js").JSX.Element;
@@ -3,7 +3,7 @@ import { createSignal, Show, For, Switch, Match } from "solid-js";
3
3
  import clsx from "clsx";
4
4
  import { useStyles, css } from "../styles/use-styles.js";
5
5
  import { Copier, CopiedCopier, ErrorCopier } from "./icons.js";
6
- var _tmpl$ = /* @__PURE__ */ template(`<button title="Copy object to clipboard">`), _tmpl$2 = /* @__PURE__ */ template(`<span><svg width=16 height=16 viewBox="0 0 16 16"fill=none xmlns=http://www.w3.org/2000/svg><path d="M6 12L10 8L6 4"stroke-width=2 stroke-linecap=round stroke-linejoin=round>`), _tmpl$3 = /* @__PURE__ */ template(`<span>`), _tmpl$4 = /* @__PURE__ */ template(`<span>&quot;<!>&quot;: `), _tmpl$5 = /* @__PURE__ */ template(`<span>&quot;<!>&quot;`), _tmpl$6 = /* @__PURE__ */ template(`<span>null`), _tmpl$7 = /* @__PURE__ */ template(`<span>undefined`), _tmpl$8 = /* @__PURE__ */ template(`<div>`), _tmpl$9 = /* @__PURE__ */ template(`<span>,`), _tmpl$0 = /* @__PURE__ */ template(`<span>...`), _tmpl$1 = /* @__PURE__ */ template(`<span><span>[</span><span>]`), _tmpl$10 = /* @__PURE__ */ template(`<span>&quot;<!>&quot;: <span> items`), _tmpl$11 = /* @__PURE__ */ template(`<span><span>{</span><span>}`);
6
+ var _tmpl$ = /* @__PURE__ */ template(`<span>`), _tmpl$2 = /* @__PURE__ */ template(`<span>&quot;<!>&quot;: `), _tmpl$3 = /* @__PURE__ */ template(`<span>&quot;<!>&quot;`), _tmpl$4 = /* @__PURE__ */ template(`<span>null`), _tmpl$5 = /* @__PURE__ */ template(`<span>undefined`), _tmpl$6 = /* @__PURE__ */ template(`<div>`), _tmpl$7 = /* @__PURE__ */ template(`<span>,`), _tmpl$8 = /* @__PURE__ */ template(`<span><span>[]`), _tmpl$9 = /* @__PURE__ */ template(`<span>...`), _tmpl$0 = /* @__PURE__ */ template(`<span><span>[</span><span>]`), _tmpl$1 = /* @__PURE__ */ template(`<span>&quot;<!>&quot;: <span> items`), _tmpl$10 = /* @__PURE__ */ template(`<span><span>{}`), _tmpl$11 = /* @__PURE__ */ template(`<span><span>{</span><span>}`), _tmpl$12 = /* @__PURE__ */ template(`<button title="Copy object to clipboard">`), _tmpl$13 = /* @__PURE__ */ template(`<span><svg width=16 height=16 viewBox="0 0 16 16"fill=none xmlns=http://www.w3.org/2000/svg><path d="M6 12L10 8L6 4"stroke-width=2 stroke-linecap=round stroke-linejoin=round>`);
7
7
  function JsonTree(props) {
8
8
  return createComponent(JsonValue, {
9
9
  isRoot: true,
@@ -12,307 +12,314 @@ function JsonTree(props) {
12
12
  },
13
13
  get copyable() {
14
14
  return props.copyable;
15
+ },
16
+ depth: 0,
17
+ get defaultExpansionDepth() {
18
+ return props.defaultExpansionDepth ?? 1;
19
+ },
20
+ path: "",
21
+ get collapsePaths() {
22
+ return props.collapsePaths;
15
23
  }
16
24
  });
17
25
  }
18
- const CopyButton = (props) => {
19
- const styles = useStyles();
20
- const [copyState, setCopyState] = createSignal("NoCopy");
21
- return (() => {
22
- var _el$ = _tmpl$();
23
- addEventListener(_el$, "click", copyState() === "NoCopy" ? () => {
24
- navigator.clipboard.writeText(JSON.stringify(props.value, null, 2)).then(() => {
25
- setCopyState("SuccessCopy");
26
- setTimeout(() => {
27
- setCopyState("NoCopy");
28
- }, 1500);
29
- }, (err) => {
30
- console.error("Failed to copy: ", err);
31
- setCopyState("ErrorCopy");
32
- setTimeout(() => {
33
- setCopyState("NoCopy");
34
- }, 1500);
35
- });
36
- } : void 0, true);
37
- insert(_el$, createComponent(Switch, {
38
- get children() {
39
- return [createComponent(Match, {
40
- get when() {
41
- return copyState() === "NoCopy";
42
- },
43
- get children() {
44
- return createComponent(Copier, {});
45
- }
46
- }), createComponent(Match, {
47
- get when() {
48
- return copyState() === "SuccessCopy";
49
- },
50
- get children() {
51
- return createComponent(CopiedCopier, {
52
- theme: "dark"
53
- });
54
- }
55
- }), createComponent(Match, {
56
- get when() {
57
- return copyState() === "ErrorCopy";
58
- },
59
- get children() {
60
- return createComponent(ErrorCopier, {});
61
- }
62
- })];
63
- }
64
- }));
65
- effect((_p$) => {
66
- var _v$ = styles().tree.actionButton, _v$2 = `${copyState() === "NoCopy" ? "Copy object to clipboard" : copyState() === "SuccessCopy" ? "Object copied to clipboard" : "Error copying object to clipboard"}`;
67
- _v$ !== _p$.e && className(_el$, _p$.e = _v$);
68
- _v$2 !== _p$.t && setAttribute(_el$, "aria-label", _p$.t = _v$2);
69
- return _p$;
70
- }, {
71
- e: void 0,
72
- t: void 0
73
- });
74
- return _el$;
75
- })();
76
- };
77
- const Expander = (props) => {
78
- const styles = useStyles();
79
- return (() => {
80
- var _el$2 = _tmpl$2();
81
- effect(() => className(_el$2, clsx(styles().tree.expander, css`
82
- transform: rotate(${props.expanded ? 90 : 0}deg);
83
- `, props.expanded && css`
84
- & svg {
85
- top: -1px;
86
- }
87
- `)));
88
- return _el$2;
89
- })();
90
- };
91
26
  function JsonValue(props) {
92
27
  const {
93
28
  value,
94
29
  keyName,
95
30
  isRoot = false,
96
31
  isLastKey,
97
- copyable
32
+ copyable,
33
+ defaultExpansionDepth,
34
+ depth,
35
+ collapsePaths,
36
+ path
98
37
  } = props;
99
38
  const styles = useStyles();
100
39
  return (() => {
101
- var _el$3 = _tmpl$3();
102
- insert(_el$3, (() => {
40
+ var _el$ = _tmpl$();
41
+ insert(_el$, (() => {
103
42
  var _c$ = memo(() => !!(keyName && typeof value !== "object" && !Array.isArray(value)));
104
43
  return () => _c$() && (() => {
105
- var _el$4 = _tmpl$4(), _el$5 = _el$4.firstChild, _el$7 = _el$5.nextSibling;
106
- _el$7.nextSibling;
107
- insert(_el$4, keyName, _el$7);
108
- effect(() => className(_el$4, styles().tree.valueKey));
109
- return _el$4;
44
+ var _el$2 = _tmpl$2(), _el$3 = _el$2.firstChild, _el$5 = _el$3.nextSibling;
45
+ _el$5.nextSibling;
46
+ insert(_el$2, keyName, _el$5);
47
+ effect(() => className(_el$2, styles().tree.valueKey));
48
+ return _el$2;
110
49
  })();
111
50
  })(), null);
112
- insert(_el$3, () => {
51
+ insert(_el$, () => {
113
52
  if (typeof value === "string") {
114
53
  return (() => {
115
- var _el$8 = _tmpl$5(), _el$9 = _el$8.firstChild, _el$1 = _el$9.nextSibling;
116
- _el$1.nextSibling;
117
- insert(_el$8, value, _el$1);
118
- effect(() => className(_el$8, styles().tree.valueString));
119
- return _el$8;
54
+ var _el$6 = _tmpl$3(), _el$7 = _el$6.firstChild, _el$9 = _el$7.nextSibling;
55
+ _el$9.nextSibling;
56
+ insert(_el$6, value, _el$9);
57
+ effect(() => className(_el$6, styles().tree.valueString));
58
+ return _el$6;
120
59
  })();
121
60
  }
122
61
  if (typeof value === "number") {
123
62
  return (() => {
124
- var _el$10 = _tmpl$3();
125
- insert(_el$10, value);
126
- effect(() => className(_el$10, styles().tree.valueNumber));
127
- return _el$10;
63
+ var _el$0 = _tmpl$();
64
+ insert(_el$0, value);
65
+ effect(() => className(_el$0, styles().tree.valueNumber));
66
+ return _el$0;
128
67
  })();
129
68
  }
130
69
  if (typeof value === "boolean") {
131
70
  return (() => {
132
- var _el$11 = _tmpl$3();
133
- insert(_el$11, () => String(value));
134
- effect(() => className(_el$11, styles().tree.valueBoolean));
135
- return _el$11;
71
+ var _el$1 = _tmpl$();
72
+ insert(_el$1, () => String(value));
73
+ effect(() => className(_el$1, styles().tree.valueBoolean));
74
+ return _el$1;
136
75
  })();
137
76
  }
138
77
  if (value === null) {
139
78
  return (() => {
140
- var _el$12 = _tmpl$6();
141
- effect(() => className(_el$12, styles().tree.valueNull));
142
- return _el$12;
79
+ var _el$10 = _tmpl$4();
80
+ effect(() => className(_el$10, styles().tree.valueNull));
81
+ return _el$10;
143
82
  })();
144
83
  }
145
84
  if (value === void 0) {
146
85
  return (() => {
147
- var _el$13 = _tmpl$7();
148
- effect(() => className(_el$13, styles().tree.valueNull));
149
- return _el$13;
86
+ var _el$11 = _tmpl$5();
87
+ effect(() => className(_el$11, styles().tree.valueNull));
88
+ return _el$11;
150
89
  })();
151
90
  }
152
91
  if (typeof value === "function") {
153
92
  return (() => {
154
- var _el$14 = _tmpl$3();
155
- insert(_el$14, () => String(value));
156
- effect(() => className(_el$14, styles().tree.valueFunction));
157
- return _el$14;
93
+ var _el$12 = _tmpl$();
94
+ insert(_el$12, () => String(value));
95
+ effect(() => className(_el$12, styles().tree.valueFunction));
96
+ return _el$12;
158
97
  })();
159
98
  }
160
99
  if (Array.isArray(value)) {
161
100
  return createComponent(ArrayValue, {
101
+ defaultExpansionDepth,
102
+ depth,
162
103
  copyable,
163
104
  keyName,
164
- value
105
+ value,
106
+ collapsePaths,
107
+ path
165
108
  });
166
109
  }
167
110
  if (typeof value === "object") {
168
111
  return createComponent(ObjectValue, {
112
+ defaultExpansionDepth,
113
+ depth,
169
114
  copyable,
170
115
  keyName,
171
- value
116
+ value,
117
+ collapsePaths,
118
+ path
172
119
  });
173
120
  }
174
- return _tmpl$3();
121
+ return _tmpl$();
175
122
  }, null);
176
- insert(_el$3, copyable && (() => {
177
- var _el$16 = _tmpl$8();
178
- insert(_el$16, createComponent(CopyButton, {
123
+ insert(_el$, copyable && (() => {
124
+ var _el$14 = _tmpl$6();
125
+ insert(_el$14, createComponent(CopyButton, {
179
126
  value
180
127
  }));
181
- effect(() => className(_el$16, clsx(styles().tree.actions, "actions")));
182
- return _el$16;
128
+ effect(() => className(_el$14, clsx(styles().tree.actions, "actions")));
129
+ return _el$14;
183
130
  })(), null);
184
- insert(_el$3, isLastKey || isRoot ? "" : _tmpl$9(), null);
185
- effect(() => className(_el$3, styles().tree.valueContainer(isRoot)));
186
- return _el$3;
131
+ insert(_el$, isLastKey || isRoot ? "" : _tmpl$7(), null);
132
+ effect(() => className(_el$, styles().tree.valueContainer(isRoot)));
133
+ return _el$;
187
134
  })();
188
135
  }
189
136
  const ArrayValue = ({
190
137
  value,
191
138
  keyName,
192
- copyable
139
+ copyable,
140
+ defaultExpansionDepth,
141
+ depth,
142
+ collapsePaths,
143
+ path
193
144
  }) => {
194
145
  const styles = useStyles();
195
- const [expanded, setExpanded] = createSignal(true);
146
+ const [expanded, setExpanded] = createSignal(depth <= defaultExpansionDepth && !collapsePaths?.includes(path));
147
+ if (value.length === 0) {
148
+ return (() => {
149
+ var _el$16 = _tmpl$8(), _el$17 = _el$16.firstChild;
150
+ insert(_el$16, keyName && (() => {
151
+ var _el$18 = _tmpl$2(), _el$19 = _el$18.firstChild, _el$21 = _el$19.nextSibling;
152
+ _el$21.nextSibling;
153
+ insert(_el$18, keyName, _el$21);
154
+ effect(() => className(_el$18, clsx(styles().tree.valueKey, styles().tree.collapsible)));
155
+ return _el$18;
156
+ })(), _el$17);
157
+ effect((_p$) => {
158
+ var _v$ = styles().tree.expanderContainer, _v$2 = styles().tree.valueBraces;
159
+ _v$ !== _p$.e && className(_el$16, _p$.e = _v$);
160
+ _v$2 !== _p$.t && className(_el$17, _p$.t = _v$2);
161
+ return _p$;
162
+ }, {
163
+ e: void 0,
164
+ t: void 0
165
+ });
166
+ return _el$16;
167
+ })();
168
+ }
196
169
  return (() => {
197
- var _el$18 = _tmpl$1(), _el$19 = _el$18.firstChild, _el$22 = _el$19.nextSibling;
198
- insert(_el$18, createComponent(Expander, {
170
+ var _el$22 = _tmpl$0(), _el$23 = _el$22.firstChild, _el$26 = _el$23.nextSibling;
171
+ insert(_el$22, createComponent(Expander, {
172
+ onClick: () => setExpanded(!expanded()),
199
173
  get expanded() {
200
174
  return expanded();
201
175
  }
202
- }), _el$19);
203
- insert(_el$18, keyName && (() => {
204
- var _el$23 = _tmpl$10(), _el$24 = _el$23.firstChild, _el$29 = _el$24.nextSibling, _el$25 = _el$29.nextSibling, _el$27 = _el$25.nextSibling, _el$28 = _el$27.firstChild;
205
- _el$23.$$click = (e) => {
176
+ }), _el$23);
177
+ insert(_el$22, keyName && (() => {
178
+ var _el$27 = _tmpl$1(), _el$28 = _el$27.firstChild, _el$33 = _el$28.nextSibling, _el$29 = _el$33.nextSibling, _el$31 = _el$29.nextSibling, _el$32 = _el$31.firstChild;
179
+ _el$27.$$click = (e) => {
206
180
  e.stopPropagation();
207
181
  e.stopImmediatePropagation();
208
182
  setExpanded(!expanded());
209
183
  };
210
- insert(_el$23, keyName, _el$29);
211
- insert(_el$27, () => value.length, _el$28);
184
+ insert(_el$27, keyName, _el$33);
185
+ insert(_el$31, () => value.length, _el$32);
212
186
  effect((_p$) => {
213
187
  var _v$6 = clsx(styles().tree.valueKey, styles().tree.collapsible), _v$7 = styles().tree.info;
214
- _v$6 !== _p$.e && className(_el$23, _p$.e = _v$6);
215
- _v$7 !== _p$.t && className(_el$27, _p$.t = _v$7);
188
+ _v$6 !== _p$.e && className(_el$27, _p$.e = _v$6);
189
+ _v$7 !== _p$.t && className(_el$31, _p$.t = _v$7);
216
190
  return _p$;
217
191
  }, {
218
192
  e: void 0,
219
193
  t: void 0
220
194
  });
221
- return _el$23;
222
- })(), _el$19);
223
- insert(_el$18, createComponent(Show, {
195
+ return _el$27;
196
+ })(), _el$23);
197
+ insert(_el$22, createComponent(Show, {
224
198
  get when() {
225
199
  return expanded();
226
200
  },
227
201
  get children() {
228
- var _el$20 = _tmpl$3();
229
- insert(_el$20, createComponent(For, {
202
+ var _el$24 = _tmpl$();
203
+ insert(_el$24, createComponent(For, {
230
204
  each: value,
231
205
  children: (item, i) => {
232
206
  const isLastKey = i() === value.length - 1;
233
207
  return createComponent(JsonValue, {
234
208
  copyable,
235
209
  value: item,
236
- isLastKey
210
+ isLastKey,
211
+ defaultExpansionDepth,
212
+ depth: depth + 1,
213
+ collapsePaths,
214
+ get path() {
215
+ return path ? `${path}[${i()}]` : `[${i()}]`;
216
+ }
237
217
  });
238
218
  }
239
219
  }));
240
- effect(() => className(_el$20, styles().tree.expandedLine(Boolean(keyName))));
241
- return _el$20;
220
+ effect(() => className(_el$24, styles().tree.expandedLine(Boolean(keyName))));
221
+ return _el$24;
242
222
  }
243
- }), _el$22);
244
- insert(_el$18, createComponent(Show, {
223
+ }), _el$26);
224
+ insert(_el$22, createComponent(Show, {
245
225
  get when() {
246
226
  return !expanded();
247
227
  },
248
228
  get children() {
249
- var _el$21 = _tmpl$0();
250
- _el$21.$$click = (e) => {
229
+ var _el$25 = _tmpl$9();
230
+ _el$25.$$click = (e) => {
251
231
  e.stopPropagation();
252
232
  e.stopImmediatePropagation();
253
233
  setExpanded(!expanded());
254
234
  };
255
- effect(() => className(_el$21, clsx(styles().tree.valueKey, styles().tree.collapsible)));
256
- return _el$21;
235
+ effect(() => className(_el$25, clsx(styles().tree.valueKey, styles().tree.collapsible)));
236
+ return _el$25;
257
237
  }
258
- }), _el$22);
238
+ }), _el$26);
259
239
  effect((_p$) => {
260
240
  var _v$3 = styles().tree.expanderContainer, _v$4 = styles().tree.valueBraces, _v$5 = styles().tree.valueBraces;
261
- _v$3 !== _p$.e && className(_el$18, _p$.e = _v$3);
262
- _v$4 !== _p$.t && className(_el$19, _p$.t = _v$4);
263
- _v$5 !== _p$.a && className(_el$22, _p$.a = _v$5);
241
+ _v$3 !== _p$.e && className(_el$22, _p$.e = _v$3);
242
+ _v$4 !== _p$.t && className(_el$23, _p$.t = _v$4);
243
+ _v$5 !== _p$.a && className(_el$26, _p$.a = _v$5);
264
244
  return _p$;
265
245
  }, {
266
246
  e: void 0,
267
247
  t: void 0,
268
248
  a: void 0
269
249
  });
270
- return _el$18;
250
+ return _el$22;
271
251
  })();
272
252
  };
273
253
  const ObjectValue = ({
274
254
  value,
275
255
  keyName,
276
- copyable
256
+ copyable,
257
+ defaultExpansionDepth,
258
+ depth,
259
+ collapsePaths,
260
+ path
277
261
  }) => {
278
262
  const styles = useStyles();
279
- const [expanded, setExpanded] = createSignal(true);
263
+ const [expanded, setExpanded] = createSignal(depth <= defaultExpansionDepth && !collapsePaths?.includes(path));
280
264
  const keys = Object.keys(value);
281
265
  const lastKeyName = keys[keys.length - 1];
266
+ if (keys.length === 0) {
267
+ return (() => {
268
+ var _el$34 = _tmpl$10(), _el$35 = _el$34.firstChild;
269
+ insert(_el$34, keyName && (() => {
270
+ var _el$36 = _tmpl$2(), _el$37 = _el$36.firstChild, _el$39 = _el$37.nextSibling;
271
+ _el$39.nextSibling;
272
+ insert(_el$36, keyName, _el$39);
273
+ effect(() => className(_el$36, clsx(styles().tree.valueKey, styles().tree.collapsible)));
274
+ return _el$36;
275
+ })(), _el$35);
276
+ effect((_p$) => {
277
+ var _v$8 = styles().tree.expanderContainer, _v$9 = styles().tree.valueBraces;
278
+ _v$8 !== _p$.e && className(_el$34, _p$.e = _v$8);
279
+ _v$9 !== _p$.t && className(_el$35, _p$.t = _v$9);
280
+ return _p$;
281
+ }, {
282
+ e: void 0,
283
+ t: void 0
284
+ });
285
+ return _el$34;
286
+ })();
287
+ }
282
288
  return (() => {
283
- var _el$30 = _tmpl$11(), _el$31 = _el$30.firstChild, _el$34 = _el$31.nextSibling;
284
- insert(_el$30, keyName && createComponent(Expander, {
289
+ var _el$40 = _tmpl$11(), _el$41 = _el$40.firstChild, _el$44 = _el$41.nextSibling;
290
+ insert(_el$40, keyName && createComponent(Expander, {
291
+ onClick: () => setExpanded(!expanded()),
285
292
  get expanded() {
286
293
  return expanded();
287
294
  }
288
- }), _el$31);
289
- insert(_el$30, keyName && (() => {
290
- var _el$35 = _tmpl$10(), _el$36 = _el$35.firstChild, _el$41 = _el$36.nextSibling, _el$37 = _el$41.nextSibling, _el$39 = _el$37.nextSibling, _el$40 = _el$39.firstChild;
291
- _el$35.$$click = (e) => {
295
+ }), _el$41);
296
+ insert(_el$40, keyName && (() => {
297
+ var _el$45 = _tmpl$1(), _el$46 = _el$45.firstChild, _el$51 = _el$46.nextSibling, _el$47 = _el$51.nextSibling, _el$49 = _el$47.nextSibling, _el$50 = _el$49.firstChild;
298
+ _el$45.$$click = (e) => {
292
299
  e.stopPropagation();
293
300
  e.stopImmediatePropagation();
294
301
  setExpanded(!expanded());
295
302
  };
296
- insert(_el$35, keyName, _el$41);
297
- insert(_el$39, () => keys.length, _el$40);
303
+ insert(_el$45, keyName, _el$51);
304
+ insert(_el$49, () => keys.length, _el$50);
298
305
  effect((_p$) => {
299
- var _v$1 = clsx(styles().tree.valueKey, styles().tree.collapsible), _v$10 = styles().tree.info;
300
- _v$1 !== _p$.e && className(_el$35, _p$.e = _v$1);
301
- _v$10 !== _p$.t && className(_el$39, _p$.t = _v$10);
306
+ var _v$11 = clsx(styles().tree.valueKey, styles().tree.collapsible), _v$12 = styles().tree.info;
307
+ _v$11 !== _p$.e && className(_el$45, _p$.e = _v$11);
308
+ _v$12 !== _p$.t && className(_el$49, _p$.t = _v$12);
302
309
  return _p$;
303
310
  }, {
304
311
  e: void 0,
305
312
  t: void 0
306
313
  });
307
- return _el$35;
308
- })(), _el$31);
309
- insert(_el$30, createComponent(Show, {
314
+ return _el$45;
315
+ })(), _el$41);
316
+ insert(_el$40, createComponent(Show, {
310
317
  get when() {
311
318
  return expanded();
312
319
  },
313
320
  get children() {
314
- var _el$32 = _tmpl$3();
315
- insert(_el$32, createComponent(For, {
321
+ var _el$42 = _tmpl$();
322
+ insert(_el$42, createComponent(For, {
316
323
  each: keys,
317
324
  children: (k) => createComponent(JsonValue, {
318
325
  get value() {
@@ -320,40 +327,118 @@ const ObjectValue = ({
320
327
  },
321
328
  keyName: k,
322
329
  isLastKey: lastKeyName === k,
323
- copyable
330
+ copyable,
331
+ defaultExpansionDepth,
332
+ depth: depth + 1,
333
+ collapsePaths,
334
+ path: `${path}${path ? "." : ""}${k}`
324
335
  })
325
336
  }));
326
- effect(() => className(_el$32, styles().tree.expandedLine(Boolean(keyName))));
327
- return _el$32;
337
+ effect(() => className(_el$42, styles().tree.expandedLine(Boolean(keyName))));
338
+ return _el$42;
328
339
  }
329
- }), _el$34);
330
- insert(_el$30, createComponent(Show, {
340
+ }), _el$44);
341
+ insert(_el$40, createComponent(Show, {
331
342
  get when() {
332
343
  return !expanded();
333
344
  },
334
345
  get children() {
335
- var _el$33 = _tmpl$0();
336
- _el$33.$$click = (e) => {
346
+ var _el$43 = _tmpl$9();
347
+ _el$43.$$click = (e) => {
337
348
  e.stopPropagation();
338
349
  e.stopImmediatePropagation();
339
350
  setExpanded(!expanded());
340
351
  };
341
- effect(() => className(_el$33, clsx(styles().tree.valueKey, styles().tree.collapsible)));
342
- return _el$33;
352
+ effect(() => className(_el$43, clsx(styles().tree.valueKey, styles().tree.collapsible)));
353
+ return _el$43;
343
354
  }
344
- }), _el$34);
355
+ }), _el$44);
345
356
  effect((_p$) => {
346
- var _v$8 = styles().tree.expanderContainer, _v$9 = styles().tree.valueBraces, _v$0 = styles().tree.valueBraces;
347
- _v$8 !== _p$.e && className(_el$30, _p$.e = _v$8);
348
- _v$9 !== _p$.t && className(_el$31, _p$.t = _v$9);
349
- _v$0 !== _p$.a && className(_el$34, _p$.a = _v$0);
357
+ var _v$0 = styles().tree.expanderContainer, _v$1 = styles().tree.valueBraces, _v$10 = styles().tree.valueBraces;
358
+ _v$0 !== _p$.e && className(_el$40, _p$.e = _v$0);
359
+ _v$1 !== _p$.t && className(_el$41, _p$.t = _v$1);
360
+ _v$10 !== _p$.a && className(_el$44, _p$.a = _v$10);
350
361
  return _p$;
351
362
  }, {
352
363
  e: void 0,
353
364
  t: void 0,
354
365
  a: void 0
355
366
  });
356
- return _el$30;
367
+ return _el$40;
368
+ })();
369
+ };
370
+ const CopyButton = (props) => {
371
+ const styles = useStyles();
372
+ const [copyState, setCopyState] = createSignal("NoCopy");
373
+ return (() => {
374
+ var _el$52 = _tmpl$12();
375
+ addEventListener(_el$52, "click", copyState() === "NoCopy" ? () => {
376
+ navigator.clipboard.writeText(JSON.stringify(props.value, null, 2)).then(() => {
377
+ setCopyState("SuccessCopy");
378
+ setTimeout(() => {
379
+ setCopyState("NoCopy");
380
+ }, 1500);
381
+ }, (err) => {
382
+ console.error("Failed to copy: ", err);
383
+ setCopyState("ErrorCopy");
384
+ setTimeout(() => {
385
+ setCopyState("NoCopy");
386
+ }, 1500);
387
+ });
388
+ } : void 0, true);
389
+ insert(_el$52, createComponent(Switch, {
390
+ get children() {
391
+ return [createComponent(Match, {
392
+ get when() {
393
+ return copyState() === "NoCopy";
394
+ },
395
+ get children() {
396
+ return createComponent(Copier, {});
397
+ }
398
+ }), createComponent(Match, {
399
+ get when() {
400
+ return copyState() === "SuccessCopy";
401
+ },
402
+ get children() {
403
+ return createComponent(CopiedCopier, {
404
+ theme: "dark"
405
+ });
406
+ }
407
+ }), createComponent(Match, {
408
+ get when() {
409
+ return copyState() === "ErrorCopy";
410
+ },
411
+ get children() {
412
+ return createComponent(ErrorCopier, {});
413
+ }
414
+ })];
415
+ }
416
+ }));
417
+ effect((_p$) => {
418
+ var _v$13 = styles().tree.actionButton, _v$14 = `${copyState() === "NoCopy" ? "Copy object to clipboard" : copyState() === "SuccessCopy" ? "Object copied to clipboard" : "Error copying object to clipboard"}`;
419
+ _v$13 !== _p$.e && className(_el$52, _p$.e = _v$13);
420
+ _v$14 !== _p$.t && setAttribute(_el$52, "aria-label", _p$.t = _v$14);
421
+ return _p$;
422
+ }, {
423
+ e: void 0,
424
+ t: void 0
425
+ });
426
+ return _el$52;
427
+ })();
428
+ };
429
+ const Expander = (props) => {
430
+ const styles = useStyles();
431
+ return (() => {
432
+ var _el$53 = _tmpl$13();
433
+ addEventListener(_el$53, "click", props.onClick, true);
434
+ effect(() => className(_el$53, clsx(styles().tree.expander, css`
435
+ transform: rotate(${props.expanded ? 90 : 0}deg);
436
+ `, props.expanded && css`
437
+ & svg {
438
+ top: -1px;
439
+ }
440
+ `)));
441
+ return _el$53;
357
442
  })();
358
443
  };
359
444
  delegateEvents(["click"]);