@powerduck/schema-designer 0.1.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.
Files changed (102) hide show
  1. package/README.md +217 -0
  2. package/dist/InlineSchemaEditor-BssSx3SI.d.ts +6 -0
  3. package/dist/InlineSchemaEditor-Bua-lDhE.d.cts +6 -0
  4. package/dist/chunk-2XUQB6BQ.js +1896 -0
  5. package/dist/chunk-4H3LXOL4.cjs +1900 -0
  6. package/dist/chunk-7LG4MVMD.cjs +2 -0
  7. package/dist/chunk-BXFABOMJ.js +1475 -0
  8. package/dist/chunk-FTALJIVZ.js +1 -0
  9. package/dist/chunk-GTZH37JS.cjs +1120 -0
  10. package/dist/chunk-GWHDTTQK.js +1437 -0
  11. package/dist/chunk-GXXD6ITE.cjs +1477 -0
  12. package/dist/chunk-HI5FBHCO.js +1057 -0
  13. package/dist/chunk-KX3LFFOV.js +88 -0
  14. package/dist/chunk-MADPN2PJ.js +185 -0
  15. package/dist/chunk-NOUORNCI.cjs +1452 -0
  16. package/dist/chunk-O6PTRJQ5.js +1195 -0
  17. package/dist/chunk-OBHJC3I2.cjs +2 -0
  18. package/dist/chunk-OOSNM45O.cjs +264 -0
  19. package/dist/chunk-P5B3HSPY.js +244 -0
  20. package/dist/chunk-PBE36BVA.js +1 -0
  21. package/dist/chunk-PVEYKCM6.js +1 -0
  22. package/dist/chunk-QZADGAP3.cjs +1218 -0
  23. package/dist/chunk-S7GNTGEE.js +1 -0
  24. package/dist/chunk-SMBDRWV2.cjs +2 -0
  25. package/dist/chunk-THYDOHOP.cjs +2 -0
  26. package/dist/chunk-WRHWOMZQ.cjs +190 -0
  27. package/dist/chunk-YNKP5JJA.cjs +32 -0
  28. package/dist/chunk-YWDKCX6N.cjs +91 -0
  29. package/dist/chunk-ZHNYNFGL.js +28 -0
  30. package/dist/compat/inline.cjs +137 -0
  31. package/dist/compat/inline.css +275 -0
  32. package/dist/compat/inline.d.cts +6 -0
  33. package/dist/compat/inline.d.ts +6 -0
  34. package/dist/compat/inline.js +4 -0
  35. package/dist/compat/parameters.cjs +90 -0
  36. package/dist/compat/parameters.css +997 -0
  37. package/dist/compat/parameters.d.cts +70 -0
  38. package/dist/compat/parameters.d.ts +70 -0
  39. package/dist/compat/parameters.js +9 -0
  40. package/dist/compat/tree.cjs +142 -0
  41. package/dist/compat/tree.css +1069 -0
  42. package/dist/compat/tree.d.cts +4 -0
  43. package/dist/compat/tree.d.ts +4 -0
  44. package/dist/compat/tree.js +5 -0
  45. package/dist/compat/variable-editor.cjs +82 -0
  46. package/dist/compat/variable-editor.d.cts +68 -0
  47. package/dist/compat/variable-editor.d.ts +68 -0
  48. package/dist/compat/variable-editor.js +1 -0
  49. package/dist/core/index.cjs +197 -0
  50. package/dist/core/index.d.cts +21 -0
  51. package/dist/core/index.d.ts +21 -0
  52. package/dist/core/index.js +4 -0
  53. package/dist/index.cjs +35 -0
  54. package/dist/index.css +1791 -0
  55. package/dist/index.d.cts +9 -0
  56. package/dist/index.d.ts +9 -0
  57. package/dist/index.js +10 -0
  58. package/dist/parameterValue-2pL9n-3q.d.ts +8 -0
  59. package/dist/parameterValue-Cky9Lnd3.d.cts +8 -0
  60. package/dist/react/index.cjs +35 -0
  61. package/dist/react/index.css +1791 -0
  62. package/dist/react/index.d.cts +9 -0
  63. package/dist/react/index.d.ts +9 -0
  64. package/dist/react/index.js +10 -0
  65. package/dist/react/inlineSchemaEditor/index.cjs +97 -0
  66. package/dist/react/inlineSchemaEditor/index.css +275 -0
  67. package/dist/react/inlineSchemaEditor/index.d.cts +6 -0
  68. package/dist/react/inlineSchemaEditor/index.d.ts +6 -0
  69. package/dist/react/inlineSchemaEditor/index.js +4 -0
  70. package/dist/react/parametersTable/index.cjs +22 -0
  71. package/dist/react/parametersTable/index.css +997 -0
  72. package/dist/react/parametersTable/index.d.cts +7 -0
  73. package/dist/react/parametersTable/index.d.ts +7 -0
  74. package/dist/react/parametersTable/index.js +9 -0
  75. package/dist/react/parametersTable/libs/generateValue.cjs +558 -0
  76. package/dist/react/parametersTable/libs/generateValue.d.cts +17 -0
  77. package/dist/react/parametersTable/libs/generateValue.d.ts +17 -0
  78. package/dist/react/parametersTable/libs/generateValue.js +551 -0
  79. package/dist/react/schemaTreeEditor/index.cjs +18 -0
  80. package/dist/react/schemaTreeEditor/index.css +1069 -0
  81. package/dist/react/schemaTreeEditor/index.d.cts +7 -0
  82. package/dist/react/schemaTreeEditor/index.d.ts +7 -0
  83. package/dist/react/schemaTreeEditor/index.js +5 -0
  84. package/dist/react/variableTextEditor/index.cjs +11 -0
  85. package/dist/react/variableTextEditor/index.css +306 -0
  86. package/dist/react/variableTextEditor/index.d.cts +6 -0
  87. package/dist/react/variableTextEditor/index.d.ts +6 -0
  88. package/dist/react/variableTextEditor/index.js +2 -0
  89. package/dist/schema-CKAPsYeW.d.cts +41 -0
  90. package/dist/schema-o7OJRaJ8.d.ts +41 -0
  91. package/dist/styles.css +1791 -0
  92. package/dist/tree-D06Xa6_N.d.ts +95 -0
  93. package/dist/tree-Dq1Rk-CF.d.cts +95 -0
  94. package/dist/types-B27Dw9do.d.cts +163 -0
  95. package/dist/types-B27Dw9do.d.ts +163 -0
  96. package/dist/types-Bk9rzr6l.d.cts +48 -0
  97. package/dist/types-D2jEaM9Z.d.cts +145 -0
  98. package/dist/types-D2jEaM9Z.d.ts +145 -0
  99. package/dist/types-xAihO_KW.d.ts +48 -0
  100. package/dist/variableTextEditor.types-ClzvARvK.d.cts +49 -0
  101. package/dist/variableTextEditor.types-ClzvARvK.d.ts +49 -0
  102. package/package.json +130 -0
@@ -0,0 +1,1218 @@
1
+ 'use strict';
2
+
3
+ var chunk4H3LXOL4_cjs = require('./chunk-4H3LXOL4.cjs');
4
+ var chunkGTZH37JS_cjs = require('./chunk-GTZH37JS.cjs');
5
+ var vsc = require('react-icons/vsc');
6
+ var React = require('react');
7
+ var react = require('@chakra-ui/react');
8
+ var lu = require('react-icons/lu');
9
+ var bi = require('react-icons/bi');
10
+ var md = require('react-icons/md');
11
+ var fa6 = require('react-icons/fa6');
12
+ var fi = require('react-icons/fi');
13
+ var jsxRuntime = require('react/jsx-runtime');
14
+
15
+ function _interopNamespace(e) {
16
+ if (e && e.__esModule) return e;
17
+ var n = Object.create(null);
18
+ if (e) {
19
+ Object.keys(e).forEach(function (k) {
20
+ if (k !== 'default') {
21
+ var d = Object.getOwnPropertyDescriptor(e, k);
22
+ Object.defineProperty(n, k, d.get ? d : {
23
+ enumerable: true,
24
+ get: function () { return e[k]; }
25
+ });
26
+ }
27
+ });
28
+ }
29
+ n.default = e;
30
+ return Object.freeze(n);
31
+ }
32
+
33
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
34
+
35
+ // src/react/schemaTreeEditor/libs/types.ts
36
+ var SCHEMA_TYPES = [
37
+ "string",
38
+ "number",
39
+ "integer",
40
+ "boolean",
41
+ "object",
42
+ "array",
43
+ "null"
44
+ ];
45
+
46
+ // src/react/schemaTreeEditor/SchemaTreeEditor.module.css
47
+ var SchemaTreeEditor_default = {
48
+ nameInput: "SchemaTreeEditor_nameInput",
49
+ descriptionInput: "SchemaTreeEditor_descriptionInput",
50
+ typeSelect: "SchemaTreeEditor_typeSelect",
51
+ root: "SchemaTreeEditor_root",
52
+ toolbar: "SchemaTreeEditor_toolbar",
53
+ toolbarTitle: "SchemaTreeEditor_toolbarTitle",
54
+ toolbarMeta: "SchemaTreeEditor_toolbarMeta",
55
+ toolbarSpacer: "SchemaTreeEditor_toolbarSpacer",
56
+ ghostButton: "SchemaTreeEditor_ghostButton",
57
+ header: "SchemaTreeEditor_header",
58
+ row: "SchemaTreeEditor_row",
59
+ headerCell: "SchemaTreeEditor_headerCell",
60
+ list: "SchemaTreeEditor_list",
61
+ requiredToggle: "SchemaTreeEditor_requiredToggle",
62
+ dropLine: "SchemaTreeEditor_dropLine",
63
+ grip: "SchemaTreeEditor_grip",
64
+ gripPlaceholder: "SchemaTreeEditor_gripPlaceholder",
65
+ nameCell: "SchemaTreeEditor_nameCell",
66
+ chevron: "SchemaTreeEditor_chevron",
67
+ chevronPlaceholder: "SchemaTreeEditor_chevronPlaceholder",
68
+ inputRejected: "SchemaTreeEditor_inputRejected",
69
+ refBadge: "SchemaTreeEditor_refBadge",
70
+ refBadgeIcon: "SchemaTreeEditor_refBadgeIcon",
71
+ refBadgeText: "SchemaTreeEditor_refBadgeText",
72
+ recursiveBadge: "SchemaTreeEditor_recursiveBadge",
73
+ recursiveBadgeText: "SchemaTreeEditor_recursiveBadgeText",
74
+ typeCell: "SchemaTreeEditor_typeCell",
75
+ typeSelectContent: "SchemaTreeEditor_typeSelectContent",
76
+ typeSelectItem: "SchemaTreeEditor_typeSelectItem",
77
+ typeSelectOption: "SchemaTreeEditor_typeSelectOption",
78
+ typeStatic: "SchemaTreeEditor_typeStatic",
79
+ requiredCell: "SchemaTreeEditor_requiredCell",
80
+ descriptionCell: "SchemaTreeEditor_descriptionCell",
81
+ actions: "SchemaTreeEditor_actions",
82
+ iconButton: "SchemaTreeEditor_iconButton",
83
+ dangerArmed: "SchemaTreeEditor_dangerArmed",
84
+ menu: "SchemaTreeEditor_menu",
85
+ empty: "SchemaTreeEditor_empty",
86
+ emptyTitle: "SchemaTreeEditor_emptyTitle",
87
+ emptyHint: "SchemaTreeEditor_emptyHint",
88
+ notice: "SchemaTreeEditor_notice",
89
+ noticeText: "SchemaTreeEditor_noticeText",
90
+ fallback: "SchemaTreeEditor_fallback",
91
+ fallbackTitle: "SchemaTreeEditor_fallbackTitle",
92
+ fallbackMessage: "SchemaTreeEditor_fallbackMessage",
93
+ referenceGroup: "SchemaTreeEditor_referenceGroup",
94
+ tableViewport: "SchemaTreeEditor_tableViewport"
95
+ };
96
+ var INDENT_STEP = 14;
97
+ var DEFAULT_MAX_ROWS = 5e3;
98
+ var CONFIRM_TIMEOUT = 2600;
99
+ var REJECT_FLASH = 900;
100
+ var SchemaErrorBoundary = class extends React__namespace.Component {
101
+ state = { failed: false, message: "", retryKey: 0 };
102
+ static getDerivedStateFromError(error) {
103
+ return {
104
+ failed: true,
105
+ message: error instanceof Error ? error.message : String(error),
106
+ retryKey: 0
107
+ };
108
+ }
109
+ componentDidCatch(error) {
110
+ try {
111
+ this.props.onError?.({
112
+ scope: "render",
113
+ message: error instanceof Error ? error.message : String(error),
114
+ cause: error
115
+ });
116
+ } catch {
117
+ }
118
+ }
119
+ handleRetry = () => {
120
+ this.setState((state) => ({
121
+ failed: false,
122
+ message: "",
123
+ retryKey: state.retryKey + 1
124
+ }));
125
+ };
126
+ render() {
127
+ if (!this.state.failed) {
128
+ return /* @__PURE__ */ jsxRuntime.jsx(React__namespace.Fragment, { children: this.props.children }, this.state.retryKey);
129
+ }
130
+ return /* @__PURE__ */ jsxRuntime.jsxs(react.Box, { className: SchemaTreeEditor_default.fallback, role: "alert", children: [
131
+ /* @__PURE__ */ jsxRuntime.jsx(react.Text, { className: SchemaTreeEditor_default.fallbackTitle, children: "Schema view stopped responding" }),
132
+ /* @__PURE__ */ jsxRuntime.jsx(react.Text, { className: SchemaTreeEditor_default.fallbackMessage, children: this.state.message }),
133
+ /* @__PURE__ */ jsxRuntime.jsx(
134
+ react.Button,
135
+ {
136
+ className: SchemaTreeEditor_default.ghostButton,
137
+ onClick: this.handleRetry,
138
+ size: "xs",
139
+ children: "Reload view"
140
+ }
141
+ )
142
+ ] });
143
+ }
144
+ };
145
+ var BufferedInput = React__namespace.memo(
146
+ ({
147
+ value,
148
+ placeholder,
149
+ className,
150
+ disabled,
151
+ invalidHint,
152
+ ariaLabel,
153
+ onCommit
154
+ }) => {
155
+ const [sync, setSync] = React__namespace.useState(() => ({
156
+ draft: value,
157
+ external: value
158
+ }));
159
+ const [rejected, setRejected] = React__namespace.useState(false);
160
+ const focused = React__namespace.useRef(false);
161
+ const cancelCommit = React__namespace.useRef(false);
162
+ const rejectTimer = React__namespace.useRef(null);
163
+ const focusExternal = React__namespace.useRef(value);
164
+ React__namespace.useEffect(() => {
165
+ if (focused.current) return;
166
+ setSync(
167
+ (current) => current.draft === value && current.external === value ? current : { draft: value, external: value }
168
+ );
169
+ }, [value]);
170
+ React__namespace.useEffect(
171
+ () => () => {
172
+ if (rejectTimer.current !== null) {
173
+ window.clearTimeout(rejectTimer.current);
174
+ rejectTimer.current = null;
175
+ }
176
+ },
177
+ []
178
+ );
179
+ const flashRejected = React__namespace.useCallback(() => {
180
+ setRejected(true);
181
+ if (rejectTimer.current !== null)
182
+ window.clearTimeout(rejectTimer.current);
183
+ rejectTimer.current = window.setTimeout(() => {
184
+ rejectTimer.current = null;
185
+ setRejected(false);
186
+ }, REJECT_FLASH);
187
+ }, []);
188
+ const handleFocus = React__namespace.useCallback(() => {
189
+ focused.current = true;
190
+ focusExternal.current = value;
191
+ }, [value]);
192
+ const handleBlur = React__namespace.useCallback(() => {
193
+ focused.current = false;
194
+ if (cancelCommit.current || disabled) {
195
+ cancelCommit.current = false;
196
+ setSync({ draft: value, external: value });
197
+ return;
198
+ }
199
+ if (focusExternal.current !== value) {
200
+ setSync({ draft: value, external: value });
201
+ return;
202
+ }
203
+ if (sync.draft === value) {
204
+ setSync({ draft: value, external: value });
205
+ return;
206
+ }
207
+ const accepted = onCommit(sync.draft);
208
+ if (accepted === false) {
209
+ setSync({ draft: value, external: value });
210
+ flashRejected();
211
+ } else {
212
+ setSync({ draft: sync.draft, external: value });
213
+ }
214
+ }, [sync.draft, value, onCommit, flashRejected, disabled]);
215
+ const handleChange = React__namespace.useCallback(
216
+ (event) => {
217
+ const draft = event.target.value;
218
+ setSync((current) => ({ ...current, draft }));
219
+ },
220
+ []
221
+ );
222
+ const handleKeyDown = React__namespace.useCallback(
223
+ (event) => {
224
+ if (event.nativeEvent.isComposing) return;
225
+ if (event.key === "Enter") {
226
+ event.preventDefault();
227
+ event.currentTarget.blur();
228
+ } else if (event.key === "Escape") {
229
+ event.preventDefault();
230
+ cancelCommit.current = true;
231
+ setSync({ draft: value, external: value });
232
+ event.stopPropagation();
233
+ event.currentTarget.blur();
234
+ }
235
+ },
236
+ [value]
237
+ );
238
+ return /* @__PURE__ */ jsxRuntime.jsx(
239
+ react.Input,
240
+ {
241
+ className: [className, rejected ? SchemaTreeEditor_default.inputRejected : null].filter(Boolean).join(" "),
242
+ value: sync.draft,
243
+ placeholder,
244
+ disabled,
245
+ "aria-label": ariaLabel,
246
+ "aria-invalid": rejected || void 0,
247
+ title: rejected ? invalidHint : void 0,
248
+ spellCheck: false,
249
+ autoComplete: "off",
250
+ onFocus: handleFocus,
251
+ onChange: handleChange,
252
+ onBlur: handleBlur,
253
+ onKeyDown: handleKeyDown,
254
+ onMouseDown: (event) => event.stopPropagation()
255
+ }
256
+ );
257
+ }
258
+ );
259
+ BufferedInput.displayName = "BufferedInput";
260
+ var schemaTypeOptions = react.createListCollection({
261
+ items: SCHEMA_TYPES.map((t) => ({ label: t, value: t }))
262
+ });
263
+ var SchemaRow = React__namespace.memo(
264
+ ({ node, index, handlers }) => {
265
+ const [armed, setArmed] = React__namespace.useState(false);
266
+ const [draggable, setDraggable] = React__namespace.useState(false);
267
+ const confirmTimer = React__namespace.useRef(null);
268
+ const clearConfirmTimer = React__namespace.useCallback(() => {
269
+ if (confirmTimer.current !== null) {
270
+ window.clearTimeout(confirmTimer.current);
271
+ confirmTimer.current = null;
272
+ }
273
+ }, []);
274
+ React__namespace.useEffect(() => clearConfirmTimer, [clearConfirmTimer]);
275
+ const disarm = React__namespace.useCallback(() => {
276
+ clearConfirmTimer();
277
+ setArmed(false);
278
+ }, [clearConfirmTimer]);
279
+ React__namespace.useEffect(() => {
280
+ if (!armed) return;
281
+ const cancel = () => setArmed(false);
282
+ window.addEventListener("scroll", cancel, {
283
+ passive: true,
284
+ capture: true
285
+ });
286
+ window.addEventListener("resize", cancel);
287
+ window.addEventListener("blur", cancel);
288
+ document.addEventListener("visibilitychange", cancel);
289
+ return () => {
290
+ window.removeEventListener("scroll", cancel, {
291
+ capture: true
292
+ });
293
+ window.removeEventListener("resize", cancel);
294
+ window.removeEventListener("blur", cancel);
295
+ document.removeEventListener("visibilitychange", cancel);
296
+ };
297
+ }, [armed]);
298
+ const handleDeleteClick = React__namespace.useCallback(() => {
299
+ if (!armed) {
300
+ setArmed(true);
301
+ clearConfirmTimer();
302
+ confirmTimer.current = window.setTimeout(() => {
303
+ confirmTimer.current = null;
304
+ setArmed(false);
305
+ }, CONFIRM_TIMEOUT);
306
+ return;
307
+ }
308
+ disarm();
309
+ handlers.onDelete(node);
310
+ }, [armed, clearConfirmTimer, disarm, handlers, node]);
311
+ const rowEditable = handlers.editable && !node.readOnly;
312
+ const resolvedType = chunkGTZH37JS_cjs.schemaTypeOf(node.resolved);
313
+ const canAddChild = rowEditable && resolvedType === "object" && !node.schema.$ref;
314
+ const handleRowKeyDown = React__namespace.useCallback(
315
+ (event) => {
316
+ if (!node.sortable || !rowEditable) return;
317
+ if (!event.metaKey && !event.ctrlKey) return;
318
+ if (event.key === "ArrowUp") {
319
+ event.preventDefault();
320
+ handlers.onKeyboardMove(node, -1);
321
+ } else if (event.key === "ArrowDown") {
322
+ event.preventDefault();
323
+ handlers.onKeyboardMove(node, 1);
324
+ }
325
+ },
326
+ [handlers, node, rowEditable]
327
+ );
328
+ const description = typeof node.resolved.description === "string" ? node.resolved.description : "";
329
+ return /* @__PURE__ */ jsxRuntime.jsxs(
330
+ react.Box,
331
+ {
332
+ className: SchemaTreeEditor_default.row,
333
+ style: { ["--row-depth"]: node.depth },
334
+ "data-ref-segment": node.refSegment,
335
+ "data-readonly": node.readOnly || void 0,
336
+ "data-required": node.required || void 0,
337
+ draggable: draggable || void 0,
338
+ "data-dragging": draggable || void 0,
339
+ onKeyDown: handleRowKeyDown,
340
+ onDragStart: (event) => handlers.onDragStart(node, index, event),
341
+ onDragOver: (event) => handlers.onDragOver(node, index, event),
342
+ onDrop: (event) => handlers.onDrop(node, index, event),
343
+ onDragEnd: () => setDraggable(false),
344
+ onMouseLeave: disarm,
345
+ role: "row",
346
+ children: [
347
+ /* @__PURE__ */ jsxRuntime.jsxs(
348
+ react.Box,
349
+ {
350
+ className: SchemaTreeEditor_default.nameCell,
351
+ role: "cell",
352
+ style: { paddingLeft: node.depth * INDENT_STEP },
353
+ children: [
354
+ node.sortable && rowEditable ? /* @__PURE__ */ jsxRuntime.jsx(
355
+ react.Box,
356
+ {
357
+ className: SchemaTreeEditor_default.grip,
358
+ "aria-label": `Reorder ${node.key}`,
359
+ title: "Drag to reorder, or Ctrl/Cmd with the arrow keys",
360
+ role: "button",
361
+ tabIndex: -1,
362
+ onMouseDown: () => setDraggable(true),
363
+ onMouseUp: () => setDraggable(false),
364
+ children: /* @__PURE__ */ jsxRuntime.jsx(bi.BiGridVertical, {})
365
+ }
366
+ ) : /* @__PURE__ */ jsxRuntime.jsx(react.Box, { className: SchemaTreeEditor_default.gripPlaceholder }),
367
+ node.expandable ? /* @__PURE__ */ jsxRuntime.jsx(
368
+ react.Button,
369
+ {
370
+ className: SchemaTreeEditor_default.chevron,
371
+ "data-expanded": node.expanded || void 0,
372
+ "aria-expanded": node.expanded,
373
+ "aria-label": node.expanded ? `Collapse ${node.key}` : `Expand ${node.key}`,
374
+ onClick: () => handlers.onToggle(node),
375
+ size: "xs",
376
+ variant: "ghost",
377
+ children: /* @__PURE__ */ jsxRuntime.jsx(fi.FiChevronRight, {})
378
+ }
379
+ ) : /* @__PURE__ */ jsxRuntime.jsx(react.Box, { className: SchemaTreeEditor_default.chevronPlaceholder }),
380
+ /* @__PURE__ */ jsxRuntime.jsx(
381
+ BufferedInput,
382
+ {
383
+ className: SchemaTreeEditor_default.nameInput,
384
+ value: node.key,
385
+ ariaLabel: "Field name",
386
+ placeholder: "fieldName",
387
+ disabled: !rowEditable || node.kind !== "property",
388
+ invalidHint: "Name is invalid or already used",
389
+ onCommit: (next) => handlers.onRename(node, next)
390
+ }
391
+ ),
392
+ node.refName ? /* @__PURE__ */ jsxRuntime.jsxs(
393
+ react.Box,
394
+ {
395
+ className: SchemaTreeEditor_default.refBadge,
396
+ title: `Reference: ${node.refName}`,
397
+ children: [
398
+ /* @__PURE__ */ jsxRuntime.jsx(lu.LuLink2, { className: SchemaTreeEditor_default.refBadgeIcon, strokeWidth: 1.5 }),
399
+ /* @__PURE__ */ jsxRuntime.jsx(react.Text, { className: SchemaTreeEditor_default.refBadgeText, children: node.refName })
400
+ ]
401
+ }
402
+ ) : null,
403
+ node.recursive ? /* @__PURE__ */ jsxRuntime.jsx(
404
+ react.Box,
405
+ {
406
+ className: SchemaTreeEditor_default.recursiveBadge,
407
+ title: "Recursive reference, expansion stopped",
408
+ children: /* @__PURE__ */ jsxRuntime.jsx(react.Text, { className: SchemaTreeEditor_default.recursiveBadgeText, children: "recursive" })
409
+ }
410
+ ) : null
411
+ ]
412
+ }
413
+ ),
414
+ /* @__PURE__ */ jsxRuntime.jsx(react.Box, { role: "cell", className: SchemaTreeEditor_default.typeCell, children: typeof node.resolvedValue === "boolean" ? /* @__PURE__ */ jsxRuntime.jsx(react.Text, { className: SchemaTreeEditor_default.typeStatic, children: node.resolvedValue ? "Any value" : "Never" }) : rowEditable ? /* @__PURE__ */ jsxRuntime.jsxs(
415
+ react.Select.Root,
416
+ {
417
+ collection: schemaTypeOptions,
418
+ size: "xs",
419
+ multiple: false,
420
+ className: SchemaTreeEditor_default.typeSelect,
421
+ value: [resolvedType],
422
+ onValueChange: (details) => {
423
+ const nextType = details.value[0];
424
+ if (!nextType || !SCHEMA_TYPES.includes(nextType)) {
425
+ return;
426
+ }
427
+ handlers.onType(node, nextType);
428
+ },
429
+ children: [
430
+ /* @__PURE__ */ jsxRuntime.jsx(react.Select.HiddenSelect, {}),
431
+ /* @__PURE__ */ jsxRuntime.jsxs(react.Select.Control, { children: [
432
+ /* @__PURE__ */ jsxRuntime.jsx(react.Select.Trigger, { className: `${SchemaTreeEditor_default.typeSelectItem}`, children: /* @__PURE__ */ jsxRuntime.jsx(
433
+ react.Select.ValueText,
434
+ {
435
+ className: `${SchemaTreeEditor_default.typeSelectOption}`,
436
+ placeholder: "Select a schema type"
437
+ }
438
+ ) }),
439
+ /* @__PURE__ */ jsxRuntime.jsx(react.Select.IndicatorGroup, { children: /* @__PURE__ */ jsxRuntime.jsx(react.Select.Indicator, {}) })
440
+ ] }),
441
+ /* @__PURE__ */ jsxRuntime.jsx(react.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(react.Select.Positioner, { children: /* @__PURE__ */ jsxRuntime.jsx(react.Select.Content, { className: SchemaTreeEditor_default.typeSelectContent, children: schemaTypeOptions.items.map((item) => /* @__PURE__ */ jsxRuntime.jsxs(
442
+ react.Select.Item,
443
+ {
444
+ "aria-label": "Field type",
445
+ item,
446
+ children: [
447
+ /* @__PURE__ */ jsxRuntime.jsx(react.Span, { className: `${SchemaTreeEditor_default.typeSelectOption}`, children: item.label }),
448
+ /* @__PURE__ */ jsxRuntime.jsx(react.Select.ItemIndicator, {})
449
+ ]
450
+ },
451
+ item.value
452
+ )) }) }) })
453
+ ]
454
+ }
455
+ ) : /* @__PURE__ */ jsxRuntime.jsx(react.Text, { className: SchemaTreeEditor_default.typeStatic, children: chunkGTZH37JS_cjs.typeLabel(node.resolved) }) }),
456
+ /* @__PURE__ */ jsxRuntime.jsx(react.Box, { role: "cell", className: SchemaTreeEditor_default.requiredCell, children: /* @__PURE__ */ jsxRuntime.jsx(
457
+ react.IconButton,
458
+ {
459
+ className: `${SchemaTreeEditor_default.requiredToggle} ${node.required ? "required" : ""}`,
460
+ "data-on": node.required || void 0,
461
+ "aria-pressed": node.required,
462
+ "aria-label": node.required ? "Required, click to make optional" : "Optional, click to make required",
463
+ title: node.required ? "Required" : "Optional",
464
+ disabled: !rowEditable || node.kind !== "property",
465
+ onClick: () => handlers.onRequired(node, !node.required),
466
+ size: "xs",
467
+ variant: "ghost",
468
+ children: /* @__PURE__ */ jsxRuntime.jsx(react.Icon, { size: "xs", children: node.required ? /* @__PURE__ */ jsxRuntime.jsx(fa6.FaStarOfLife, {}) : /* @__PURE__ */ jsxRuntime.jsx(fa6.FaStarOfLife, {}) })
469
+ }
470
+ ) }),
471
+ /* @__PURE__ */ jsxRuntime.jsx(react.Box, { role: "cell", className: SchemaTreeEditor_default.descriptionCell, children: /* @__PURE__ */ jsxRuntime.jsx(
472
+ BufferedInput,
473
+ {
474
+ className: SchemaTreeEditor_default.descriptionInput,
475
+ value: description,
476
+ ariaLabel: "Field description",
477
+ placeholder: typeof node.value === "boolean" ? "Boolean schema" : "Describe this field",
478
+ disabled: !rowEditable || typeof node.value === "boolean",
479
+ onCommit: (next) => handlers.onDescription(node, next)
480
+ }
481
+ ) }),
482
+ /* @__PURE__ */ jsxRuntime.jsxs(react.Box, { role: "cell", className: SchemaTreeEditor_default.actions, children: [
483
+ handlers.renderAdvanced ? /* @__PURE__ */ jsxRuntime.jsxs(
484
+ react.Popover.Root,
485
+ {
486
+ positioning: {
487
+ placement: "bottom-end",
488
+ strategy: "fixed",
489
+ overflowPadding: 12
490
+ },
491
+ lazyMount: true,
492
+ unmountOnExit: true,
493
+ children: [
494
+ /* @__PURE__ */ jsxRuntime.jsx(react.Popover.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
495
+ react.Button,
496
+ {
497
+ className: SchemaTreeEditor_default.iconButton,
498
+ "aria-label": "Advanced settings",
499
+ title: "Advanced settings",
500
+ size: "xs",
501
+ variant: "ghost",
502
+ children: /* @__PURE__ */ jsxRuntime.jsx(vsc.VscSettingsCompact, { size: 16 })
503
+ }
504
+ ) }),
505
+ /* @__PURE__ */ jsxRuntime.jsx(react.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(react.Popover.Positioner, { children: /* @__PURE__ */ jsxRuntime.jsx(chunk4H3LXOL4_cjs.SettingsPanel, { title: node.key, children: handlers.renderAdvanced({
506
+ required: node.required,
507
+ onRequiredChange: node.kind === "property" ? (value) => handlers.onRequired(node, value) : void 0,
508
+ nested: node.depth > 0,
509
+ schema: node.readOnly ? node.resolvedValue : node.value,
510
+ schemaName: node.key,
511
+ fullSchema: handlers.rootSchema,
512
+ path: node.path,
513
+ readOnly: !rowEditable,
514
+ // Overwritten by the owner's row binding.
515
+ update: () => void 0
516
+ }) }) }) })
517
+ ]
518
+ }
519
+ ) : null,
520
+ rowEditable ? /* @__PURE__ */ jsxRuntime.jsxs(
521
+ react.Menu.Root,
522
+ {
523
+ positioning: {
524
+ placement: "bottom-end",
525
+ strategy: "fixed",
526
+ overflowPadding: 12
527
+ },
528
+ lazyMount: true,
529
+ unmountOnExit: true,
530
+ children: [
531
+ /* @__PURE__ */ jsxRuntime.jsx(react.Menu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
532
+ react.Button,
533
+ {
534
+ className: SchemaTreeEditor_default.iconButton,
535
+ "aria-label": "Add field",
536
+ title: "Add field",
537
+ size: "xs",
538
+ variant: "ghost",
539
+ children: /* @__PURE__ */ jsxRuntime.jsx(md.MdAdd, {})
540
+ }
541
+ ) }),
542
+ /* @__PURE__ */ jsxRuntime.jsx(react.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(react.Menu.Positioner, { children: /* @__PURE__ */ jsxRuntime.jsxs(react.Menu.Content, { className: SchemaTreeEditor_default.menu, children: [
543
+ /* @__PURE__ */ jsxRuntime.jsx(
544
+ react.Menu.Item,
545
+ {
546
+ value: "sibling",
547
+ disabled: node.kind !== "property",
548
+ onSelect: () => handlers.onAdd(node, "sibling"),
549
+ children: "Add field below"
550
+ }
551
+ ),
552
+ canAddChild ? /* @__PURE__ */ jsxRuntime.jsx(
553
+ react.Menu.Item,
554
+ {
555
+ value: "child",
556
+ onSelect: () => handlers.onAdd(node, "child"),
557
+ children: "Add nested field"
558
+ }
559
+ ) : null
560
+ ] }) }) })
561
+ ]
562
+ }
563
+ ) : null,
564
+ rowEditable && node.kind !== "root" ? /* @__PURE__ */ jsxRuntime.jsx(
565
+ react.IconButton,
566
+ {
567
+ className: [SchemaTreeEditor_default.iconButton, armed ? SchemaTreeEditor_default.dangerArmed : null].filter(Boolean).join(" "),
568
+ "aria-label": armed ? `Confirm delete ${node.key}` : `Delete ${node.key}`,
569
+ title: armed ? "Click again to confirm" : "Delete field",
570
+ onClick: handleDeleteClick,
571
+ size: "xs",
572
+ variant: "ghost",
573
+ children: /* @__PURE__ */ jsxRuntime.jsx(vsc.VscTrash, {})
574
+ }
575
+ ) : null
576
+ ] })
577
+ ]
578
+ }
579
+ );
580
+ }
581
+ );
582
+ var MemoRow = React__namespace.memo(SchemaRow, (prev, next) => {
583
+ const a = prev.node;
584
+ const b = next.node;
585
+ return a.id === b.id && a.key === b.key && a.schema === b.schema && a.resolved === b.resolved && a.required === b.required && a.expanded === b.expanded && a.expandable === b.expandable && a.depth === b.depth && a.refSegment === b.refSegment && a.readOnly === b.readOnly && a.sortable === b.sortable && a.recursive === b.recursive && prev.index === next.index && prev.handlers === next.handlers;
586
+ });
587
+ MemoRow.displayName = "SchemaRow";
588
+ var IDLE_DRAG = Object.freeze({
589
+ active: false,
590
+ key: null,
591
+ ownerPath: null,
592
+ overIndex: null,
593
+ usedDataTransfer: false
594
+ });
595
+ var SchemaTreeEditorInner = React__namespace.memo(
596
+ ({
597
+ schema,
598
+ onChange,
599
+ className,
600
+ showType = true,
601
+ showRequired = false,
602
+ showDescription = false,
603
+ readOnly = false,
604
+ defaultExpanded,
605
+ maxRows = DEFAULT_MAX_ROWS,
606
+ renderAdvanced = defaultAdvancedEditor,
607
+ document: referenceDocument,
608
+ onError,
609
+ strictExternalSchema = true
610
+ }) => {
611
+ const reportError = React__namespace.useCallback(
612
+ (error) => {
613
+ try {
614
+ onError?.(error);
615
+ } catch {
616
+ }
617
+ },
618
+ [onError]
619
+ );
620
+ const signatureRef = React__namespace.useRef("");
621
+ const previousSchemaRef = React__namespace.useRef(void 0);
622
+ const safeSchema = React__namespace.useMemo(() => {
623
+ if (!strictExternalSchema) {
624
+ return chunkGTZH37JS_cjs.isPlainObject(schema) ? schema : {};
625
+ }
626
+ const check = chunkGTZH37JS_cjs.verifyExternalSchema(
627
+ schema,
628
+ previousSchemaRef.current,
629
+ signatureRef.current,
630
+ reportError
631
+ );
632
+ signatureRef.current = check.signature;
633
+ previousSchemaRef.current = check.schema;
634
+ if (check.mutated) {
635
+ reportError({
636
+ scope: "commit",
637
+ message: "schema prop was mutated in place, rebuilding the tree"
638
+ });
639
+ return chunkGTZH37JS_cjs.cloneSchema(check.schema);
640
+ }
641
+ return check.schema;
642
+ }, [schema, strictExternalSchema, reportError]);
643
+ const [expanded, setExpanded] = React__namespace.useState(
644
+ () => new Set(defaultExpanded ?? [])
645
+ );
646
+ const dragRef = React__namespace.useRef(IDLE_DRAG);
647
+ const [dropLine, setDropLine] = React__namespace.useState(null);
648
+ const rafRef = React__namespace.useRef(null);
649
+ const cancelRaf = React__namespace.useCallback(() => {
650
+ if (rafRef.current !== null) {
651
+ cancelAnimationFrame(rafRef.current);
652
+ rafRef.current = null;
653
+ }
654
+ }, []);
655
+ const resetDrag = React__namespace.useCallback(() => {
656
+ cancelRaf();
657
+ if (dragRef.current !== IDLE_DRAG) dragRef.current = IDLE_DRAG;
658
+ setDropLine((current) => current === null ? current : null);
659
+ }, [cancelRaf]);
660
+ const scheduleDropLine = React__namespace.useCallback((index) => {
661
+ if (rafRef.current !== null) return;
662
+ rafRef.current = requestAnimationFrame(() => {
663
+ rafRef.current = null;
664
+ setDropLine((current) => current === index ? current : index);
665
+ });
666
+ }, []);
667
+ React__namespace.useEffect(() => {
668
+ const abort = () => resetDrag();
669
+ const onKeyDown = (event) => {
670
+ if (event.key === "Escape") resetDrag();
671
+ };
672
+ const onVisibility = () => {
673
+ if (document.visibilityState === "hidden") resetDrag();
674
+ };
675
+ document.addEventListener("dragend", abort);
676
+ document.addEventListener("keydown", onKeyDown);
677
+ document.addEventListener("visibilitychange", onVisibility);
678
+ window.addEventListener("blur", abort);
679
+ return () => {
680
+ document.removeEventListener("dragend", abort);
681
+ document.removeEventListener("keydown", onKeyDown);
682
+ document.removeEventListener("visibilitychange", onVisibility);
683
+ window.removeEventListener("blur", abort);
684
+ cancelRaf();
685
+ };
686
+ }, [resetDrag, cancelRaf]);
687
+ const commit = React__namespace.useCallback(
688
+ (next) => {
689
+ if (readOnly || next === safeSchema) return;
690
+ chunkGTZH37JS_cjs.safeRun(
691
+ "commit",
692
+ () => {
693
+ previousSchemaRef.current = next;
694
+ onChange(next);
695
+ },
696
+ void 0,
697
+ reportError
698
+ );
699
+ },
700
+ [onChange, safeSchema, reportError, readOnly]
701
+ );
702
+ const { nodes, overflow } = React__namespace.useMemo(
703
+ () => chunkGTZH37JS_cjs.flattenSchema({
704
+ root: safeSchema,
705
+ document: referenceDocument,
706
+ expanded,
707
+ maxRows,
708
+ onError: reportError
709
+ }),
710
+ [safeSchema, referenceDocument, expanded, maxRows, reportError]
711
+ );
712
+ const rowGroups = React__namespace.useMemo(() => {
713
+ const groups = [];
714
+ nodes.forEach((node, index) => {
715
+ const last = groups[groups.length - 1];
716
+ if (last?.reference && node.depth > last.depth && node.refSegment !== "none") {
717
+ last.rows.push({ node, index });
718
+ } else {
719
+ groups.push({
720
+ id: node.id,
721
+ reference: !!node.refName,
722
+ depth: node.depth,
723
+ rows: [{ node, index }]
724
+ });
725
+ }
726
+ });
727
+ return groups;
728
+ }, [nodes]);
729
+ const propertyCount = React__namespace.useMemo(
730
+ () => chunkGTZH37JS_cjs.isPlainObject(safeSchema.properties) ? Object.keys(safeSchema.properties).length : 0,
731
+ [safeSchema]
732
+ );
733
+ const editable = !readOnly;
734
+ const handleToggle = React__namespace.useCallback((node) => {
735
+ setExpanded((current) => {
736
+ const next = new Set(current);
737
+ if (next.has(node.id)) next.delete(node.id);
738
+ else next.add(node.id);
739
+ return next;
740
+ });
741
+ }, []);
742
+ const handleRename = React__namespace.useCallback(
743
+ (node, raw) => {
744
+ const nextKey = raw.trim();
745
+ if (!nextKey || nextKey === node.key) return nextKey === node.key;
746
+ if (!chunkGTZH37JS_cjs.isValidKey(nextKey)) return false;
747
+ const owner = chunkGTZH37JS_cjs.getIn(safeSchema, node.parentPath);
748
+ if (!chunkGTZH37JS_cjs.isPlainObject(owner)) return false;
749
+ if (Object.prototype.hasOwnProperty.call(owner, nextKey)) return false;
750
+ const renamed = chunkGTZH37JS_cjs.renameKey(owner, node.key, nextKey);
751
+ if (renamed === owner) return false;
752
+ let next = chunkGTZH37JS_cjs.setIn(safeSchema, node.parentPath, renamed);
753
+ const ownerPath = chunkGTZH37JS_cjs.requiredOwnerPath(node.parentPath);
754
+ if (ownerPath)
755
+ next = chunkGTZH37JS_cjs.renameRequired(next, ownerPath, node.key, nextKey);
756
+ setExpanded(
757
+ (current) => chunkGTZH37JS_cjs.remapExpanded(current, node.path, [...node.parentPath, nextKey])
758
+ );
759
+ commit(next);
760
+ return true;
761
+ },
762
+ [safeSchema, commit]
763
+ );
764
+ const handleDescription = React__namespace.useCallback(
765
+ (node, raw) => {
766
+ const value = raw.trim();
767
+ commit(
768
+ chunkGTZH37JS_cjs.patchSchema(safeSchema, node.path, {
769
+ description: value || void 0
770
+ })
771
+ );
772
+ },
773
+ [safeSchema, commit]
774
+ );
775
+ const handleType = React__namespace.useCallback(
776
+ (node, nextType) => {
777
+ if (typeof node.value !== "boolean" && chunkGTZH37JS_cjs.schemaTypeOf(node.resolved) === nextType)
778
+ return;
779
+ const current = chunkGTZH37JS_cjs.isPlainObject(node.schema) ? node.schema : {};
780
+ const next = chunkGTZH37JS_cjs.changeSchemaType(current, nextType);
781
+ setExpanded((existing) => chunkGTZH37JS_cjs.pruneExpanded(existing, node.path));
782
+ commit(chunkGTZH37JS_cjs.setIn(safeSchema, node.path, next));
783
+ },
784
+ [safeSchema, commit]
785
+ );
786
+ const handleRequired = React__namespace.useCallback(
787
+ (node, nextRequired) => {
788
+ const ownerPath = chunkGTZH37JS_cjs.requiredOwnerPath(node.parentPath);
789
+ if (!ownerPath) return;
790
+ commit(chunkGTZH37JS_cjs.setRequired(safeSchema, ownerPath, node.key, nextRequired));
791
+ },
792
+ [safeSchema, commit]
793
+ );
794
+ const handleDelete = React__namespace.useCallback(
795
+ (node) => {
796
+ let next = chunkGTZH37JS_cjs.deleteIn(safeSchema, node.path);
797
+ if (readOnly || next === safeSchema) return;
798
+ const ownerPath = chunkGTZH37JS_cjs.requiredOwnerPath(node.parentPath);
799
+ if (ownerPath) next = chunkGTZH37JS_cjs.setRequired(next, ownerPath, node.key, false);
800
+ setExpanded((current) => chunkGTZH37JS_cjs.pruneExpanded(current, node.path));
801
+ commit(next);
802
+ },
803
+ [safeSchema, commit]
804
+ );
805
+ const handleAdd = React__namespace.useCallback(
806
+ (node, mode) => {
807
+ if (mode === "child") {
808
+ const owner2 = chunkGTZH37JS_cjs.getIn(safeSchema, [...node.path, "properties"]);
809
+ const container2 = chunkGTZH37JS_cjs.isPlainObject(owner2) ? owner2 : {};
810
+ const key2 = chunkGTZH37JS_cjs.uniqueKey(container2, "newField");
811
+ const nextProps2 = chunkGTZH37JS_cjs.insertKeyAfter(
812
+ container2,
813
+ null,
814
+ key2,
815
+ chunkGTZH37JS_cjs.defaultSchemaFor("string")
816
+ );
817
+ const next = chunkGTZH37JS_cjs.setIn(safeSchema, node.path, {
818
+ ...chunkGTZH37JS_cjs.isPlainObject(node.schema) ? node.schema : {},
819
+ type: "object",
820
+ properties: nextProps2
821
+ });
822
+ setExpanded((current) => new Set(current).add(node.id));
823
+ commit(next);
824
+ return;
825
+ }
826
+ const owner = chunkGTZH37JS_cjs.getIn(safeSchema, node.parentPath);
827
+ const container = chunkGTZH37JS_cjs.isPlainObject(owner) ? owner : {};
828
+ const key = chunkGTZH37JS_cjs.uniqueKey(container, "newField");
829
+ const nextProps = chunkGTZH37JS_cjs.insertKeyAfter(
830
+ container,
831
+ node.key,
832
+ key,
833
+ chunkGTZH37JS_cjs.defaultSchemaFor("string")
834
+ );
835
+ commit(chunkGTZH37JS_cjs.setIn(safeSchema, node.parentPath, nextProps));
836
+ },
837
+ [safeSchema, commit]
838
+ );
839
+ const moveKey = React__namespace.useCallback(
840
+ (ownerPath, key, targetIndex) => {
841
+ chunkGTZH37JS_cjs.safeRun(
842
+ "reorder",
843
+ () => {
844
+ const owner = chunkGTZH37JS_cjs.getIn(safeSchema, ownerPath);
845
+ if (!chunkGTZH37JS_cjs.isPlainObject(owner)) return;
846
+ const reordered = chunkGTZH37JS_cjs.reorderKeys(owner, key, targetIndex);
847
+ if (reordered === owner) return;
848
+ commit(chunkGTZH37JS_cjs.setIn(safeSchema, ownerPath, reordered));
849
+ },
850
+ void 0,
851
+ reportError,
852
+ ownerPath
853
+ );
854
+ },
855
+ [safeSchema, commit, reportError]
856
+ );
857
+ const handleDragStart = React__namespace.useCallback(
858
+ (node, index, event) => {
859
+ if (!node.sortable || !editable) {
860
+ event.preventDefault();
861
+ return;
862
+ }
863
+ let usedDataTransfer = false;
864
+ try {
865
+ event.dataTransfer.effectAllowed = "move";
866
+ event.dataTransfer.setData("text/plain", node.key);
867
+ usedDataTransfer = true;
868
+ } catch {
869
+ usedDataTransfer = false;
870
+ }
871
+ dragRef.current = {
872
+ active: true,
873
+ key: node.key,
874
+ ownerPath: node.parentPath,
875
+ overIndex: index,
876
+ usedDataTransfer
877
+ };
878
+ },
879
+ [editable]
880
+ );
881
+ const handleDragOver = React__namespace.useCallback(
882
+ (node, index, event) => {
883
+ const drag = dragRef.current;
884
+ if (!drag.active || !drag.ownerPath) return;
885
+ if (!chunkGTZH37JS_cjs.samePath(node.parentPath, drag.ownerPath)) return;
886
+ event.preventDefault();
887
+ event.dataTransfer.dropEffect = "move";
888
+ if (drag.overIndex !== index) drag.overIndex = index;
889
+ scheduleDropLine(index);
890
+ },
891
+ [scheduleDropLine]
892
+ );
893
+ const handleDrop = React__namespace.useCallback(
894
+ (node, _index, event) => {
895
+ const drag = dragRef.current;
896
+ if (!drag.active || !drag.ownerPath || !drag.key) {
897
+ resetDrag();
898
+ return;
899
+ }
900
+ event.preventDefault();
901
+ const ownerPath = drag.ownerPath;
902
+ const movingKey = drag.key;
903
+ resetDrag();
904
+ if (!chunkGTZH37JS_cjs.samePath(node.parentPath, ownerPath)) return;
905
+ const owner = chunkGTZH37JS_cjs.getIn(safeSchema, ownerPath);
906
+ if (!chunkGTZH37JS_cjs.isPlainObject(owner)) return;
907
+ const targetIndex = Object.keys(owner).indexOf(node.key);
908
+ if (targetIndex < 0) return;
909
+ moveKey(ownerPath, movingKey, targetIndex);
910
+ },
911
+ [safeSchema, moveKey, resetDrag]
912
+ );
913
+ const handleKeyboardMove = React__namespace.useCallback(
914
+ (node, delta) => {
915
+ const owner = chunkGTZH37JS_cjs.getIn(safeSchema, node.parentPath);
916
+ if (!chunkGTZH37JS_cjs.isPlainObject(owner)) return;
917
+ const from = Object.keys(owner).indexOf(node.key);
918
+ if (from < 0) return;
919
+ moveKey(node.parentPath, node.key, from + delta);
920
+ },
921
+ [safeSchema, moveKey]
922
+ );
923
+ const handleAdvancedUpdate = React__namespace.useCallback(
924
+ (node, next) => {
925
+ if (typeof next !== "boolean" && !chunkGTZH37JS_cjs.isPlainObject(next)) {
926
+ reportError({
927
+ scope: "commit",
928
+ message: "advanced editor returned a non-object schema",
929
+ path: node.path
930
+ });
931
+ return;
932
+ }
933
+ commit(chunkGTZH37JS_cjs.setIn(safeSchema, node.path, next));
934
+ },
935
+ [safeSchema, commit, reportError]
936
+ );
937
+ const handleAddRoot = React__namespace.useCallback(() => {
938
+ const owner = chunkGTZH37JS_cjs.isPlainObject(safeSchema.properties) ? safeSchema.properties : {};
939
+ const key = chunkGTZH37JS_cjs.uniqueKey(owner, "newField");
940
+ const nextProps = chunkGTZH37JS_cjs.insertKeyAfter(
941
+ owner,
942
+ null,
943
+ key,
944
+ chunkGTZH37JS_cjs.defaultSchemaFor("string")
945
+ );
946
+ commit({ ...safeSchema, type: "object", properties: nextProps });
947
+ }, [safeSchema, commit]);
948
+ const handleToggleAll = React__namespace.useCallback(() => {
949
+ if (expanded.size > 0) {
950
+ setExpanded(/* @__PURE__ */ new Set());
951
+ return;
952
+ }
953
+ const result = chunkGTZH37JS_cjs.flattenSchema({
954
+ root: safeSchema,
955
+ document: referenceDocument,
956
+ expanded: /* @__PURE__ */ new Set(),
957
+ expandAll: true,
958
+ maxRows,
959
+ onError: reportError
960
+ });
961
+ setExpanded(
962
+ new Set(
963
+ result.nodes.filter((node) => node.expandable).map((node) => node.id)
964
+ )
965
+ );
966
+ }, [expanded.size, safeSchema, referenceDocument, maxRows, reportError]);
967
+ const handlers = React__namespace.useMemo(
968
+ () => ({
969
+ onToggle: handleToggle,
970
+ onRename: handleRename,
971
+ onDescription: handleDescription,
972
+ onType: handleType,
973
+ onRequired: handleRequired,
974
+ onDelete: handleDelete,
975
+ onAdd: handleAdd,
976
+ onDragStart: handleDragStart,
977
+ onDragOver: handleDragOver,
978
+ onDrop: handleDrop,
979
+ onKeyboardMove: handleKeyboardMove,
980
+ renderAdvanced,
981
+ rootSchema: referenceDocument ?? safeSchema,
982
+ editable
983
+ }),
984
+ [
985
+ handleToggle,
986
+ handleRename,
987
+ handleDescription,
988
+ handleType,
989
+ handleRequired,
990
+ handleDelete,
991
+ handleAdd,
992
+ handleDragStart,
993
+ handleDragOver,
994
+ handleDrop,
995
+ handleKeyboardMove,
996
+ renderAdvanced,
997
+ referenceDocument,
998
+ safeSchema,
999
+ editable
1000
+ ]
1001
+ );
1002
+ const advancedCacheRef = React__namespace.useRef({
1003
+ owner: null,
1004
+ byId: /* @__PURE__ */ new Map()
1005
+ });
1006
+ const rowHandlersFor = React__namespace.useCallback(
1007
+ (base, node) => {
1008
+ if (!base.renderAdvanced) return base;
1009
+ const cache = advancedCacheRef.current;
1010
+ if (cache.owner !== base) {
1011
+ cache.owner = base;
1012
+ cache.byId = /* @__PURE__ */ new Map();
1013
+ }
1014
+ const hit = cache.byId.get(node.id);
1015
+ if (hit) return hit;
1016
+ const inner = base.renderAdvanced;
1017
+ const bound = {
1018
+ ...base,
1019
+ renderAdvanced: (context) => inner({
1020
+ ...context,
1021
+ update: (next) => {
1022
+ if (base.editable && !node.readOnly)
1023
+ handleAdvancedUpdate(node, next);
1024
+ }
1025
+ })
1026
+ };
1027
+ cache.byId.set(node.id, bound);
1028
+ return bound;
1029
+ },
1030
+ [handleAdvancedUpdate]
1031
+ );
1032
+ React__namespace.useEffect(
1033
+ () => () => {
1034
+ advancedCacheRef.current = { owner: null, byId: /* @__PURE__ */ new Map() };
1035
+ },
1036
+ []
1037
+ );
1038
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1039
+ react.Box,
1040
+ {
1041
+ className: [SchemaTreeEditor_default.root, className].filter(Boolean).join(" "),
1042
+ "data-show-type": showType,
1043
+ "data-show-required": showRequired,
1044
+ "data-show-description": showDescription,
1045
+ style: {
1046
+ "--grid-min-width": `${160 + (showType ? 120 : 0) + (showRequired ? 36 : 0) + (showDescription ? 168 : 0) + 150}px`,
1047
+ "--grid-columns": [
1048
+ "minmax(160px, 1fr)",
1049
+ showType && "112px",
1050
+ showRequired && "28px",
1051
+ showDescription && "minmax(160px, 1fr)",
1052
+ "80px"
1053
+ ].filter(Boolean).join(" ")
1054
+ },
1055
+ children: [
1056
+ /* @__PURE__ */ jsxRuntime.jsxs(react.Box, { className: SchemaTreeEditor_default.toolbar, children: [
1057
+ /* @__PURE__ */ jsxRuntime.jsx(react.Text, { className: SchemaTreeEditor_default.toolbarTitle, children: "Schema" }),
1058
+ /* @__PURE__ */ jsxRuntime.jsxs(react.Text, { className: SchemaTreeEditor_default.toolbarMeta, children: [
1059
+ propertyCount,
1060
+ " field",
1061
+ propertyCount === 1 ? "" : "s"
1062
+ ] }),
1063
+ /* @__PURE__ */ jsxRuntime.jsx(react.Box, { className: SchemaTreeEditor_default.toolbarSpacer }),
1064
+ /* @__PURE__ */ jsxRuntime.jsx(
1065
+ react.Button,
1066
+ {
1067
+ className: SchemaTreeEditor_default.ghostButton,
1068
+ onClick: handleToggleAll,
1069
+ disabled: !nodes.some((node) => node.expandable),
1070
+ size: "xs",
1071
+ variant: "ghost",
1072
+ children: expanded.size > 0 ? "Collapse all" : "Expand all"
1073
+ }
1074
+ ),
1075
+ /* @__PURE__ */ jsxRuntime.jsxs(
1076
+ react.Button,
1077
+ {
1078
+ className: SchemaTreeEditor_default.ghostButton,
1079
+ onClick: handleAddRoot,
1080
+ disabled: !editable,
1081
+ size: "xs",
1082
+ variant: "ghost",
1083
+ children: [
1084
+ /* @__PURE__ */ jsxRuntime.jsx(md.MdAdd, {}),
1085
+ "Add field"
1086
+ ]
1087
+ }
1088
+ )
1089
+ ] }),
1090
+ /* @__PURE__ */ jsxRuntime.jsxs(
1091
+ react.Box,
1092
+ {
1093
+ className: SchemaTreeEditor_default.tableViewport,
1094
+ role: "table",
1095
+ "aria-label": "Schema fields",
1096
+ children: [
1097
+ /* @__PURE__ */ jsxRuntime.jsxs(react.Box, { className: SchemaTreeEditor_default.header, role: "row", children: [
1098
+ /* @__PURE__ */ jsxRuntime.jsx(react.Text, { role: "columnheader", className: SchemaTreeEditor_default.headerCell, children: "Name" }),
1099
+ /* @__PURE__ */ jsxRuntime.jsx(react.Text, { role: "columnheader", className: SchemaTreeEditor_default.headerCell, children: "Type" }),
1100
+ /* @__PURE__ */ jsxRuntime.jsx(
1101
+ react.Text,
1102
+ {
1103
+ role: "columnheader",
1104
+ className: SchemaTreeEditor_default.headerCell,
1105
+ title: "Required or optional",
1106
+ children: "Req"
1107
+ }
1108
+ ),
1109
+ /* @__PURE__ */ jsxRuntime.jsx(react.Text, { role: "columnheader", className: SchemaTreeEditor_default.headerCell, children: "Description" }),
1110
+ /* @__PURE__ */ jsxRuntime.jsx(
1111
+ react.Box,
1112
+ {
1113
+ role: "columnheader",
1114
+ className: SchemaTreeEditor_default.headerCell,
1115
+ "aria-label": "Actions"
1116
+ }
1117
+ )
1118
+ ] }),
1119
+ /* @__PURE__ */ jsxRuntime.jsx(
1120
+ react.Box,
1121
+ {
1122
+ className: SchemaTreeEditor_default.list,
1123
+ role: "rowgroup",
1124
+ "data-dragging": dropLine !== null || void 0,
1125
+ onDragLeave: (event) => {
1126
+ if (event.currentTarget.contains(event.relatedTarget))
1127
+ return;
1128
+ scheduleDropLine(null);
1129
+ },
1130
+ children: nodes.length === 0 ? /* @__PURE__ */ jsxRuntime.jsxs(react.Box, { className: SchemaTreeEditor_default.empty, children: [
1131
+ /* @__PURE__ */ jsxRuntime.jsx(react.Text, { className: SchemaTreeEditor_default.emptyTitle, children: "No fields yet" }),
1132
+ /* @__PURE__ */ jsxRuntime.jsx(react.Text, { className: SchemaTreeEditor_default.emptyHint, children: "Add the first field to start describing this object." }),
1133
+ /* @__PURE__ */ jsxRuntime.jsxs(
1134
+ react.Button,
1135
+ {
1136
+ className: SchemaTreeEditor_default.ghostButton,
1137
+ onClick: handleAddRoot,
1138
+ disabled: !editable,
1139
+ size: "xs",
1140
+ children: [
1141
+ /* @__PURE__ */ jsxRuntime.jsx(md.MdAdd, {}),
1142
+ "Add field"
1143
+ ]
1144
+ }
1145
+ )
1146
+ ] }) : rowGroups.map((group) => /* @__PURE__ */ jsxRuntime.jsx(
1147
+ "div",
1148
+ {
1149
+ className: group.reference ? SchemaTreeEditor_default.referenceGroup : void 0,
1150
+ children: group.rows.map(({ node, index }) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
1151
+ dropLine === index ? /* @__PURE__ */ jsxRuntime.jsx(react.Box, { className: SchemaTreeEditor_default.dropLine, "aria-hidden": "true" }) : null,
1152
+ /* @__PURE__ */ jsxRuntime.jsx(
1153
+ MemoRow,
1154
+ {
1155
+ node,
1156
+ index,
1157
+ handlers: rowHandlersFor(handlers, node)
1158
+ }
1159
+ )
1160
+ ] }, node.id))
1161
+ },
1162
+ group.id
1163
+ ))
1164
+ }
1165
+ )
1166
+ ]
1167
+ }
1168
+ ),
1169
+ overflow ? /* @__PURE__ */ jsxRuntime.jsx(react.Box, { className: SchemaTreeEditor_default.notice, role: "status", children: /* @__PURE__ */ jsxRuntime.jsxs(react.Text, { className: SchemaTreeEditor_default.noticeText, children: [
1170
+ "Showing the first ",
1171
+ maxRows,
1172
+ " rows. Collapse a branch to see the rest."
1173
+ ] }) }) : null
1174
+ ]
1175
+ }
1176
+ );
1177
+ }
1178
+ );
1179
+ var SchemaTreeEditor = React__namespace.memo(
1180
+ (props) => {
1181
+ const value = props.value !== void 0 ? props.value : props.schema ?? {};
1182
+ return /* @__PURE__ */ jsxRuntime.jsx(SchemaErrorBoundary, { onError: props.onError, children: typeof value === "boolean" ? /* @__PURE__ */ jsxRuntime.jsx(
1183
+ chunk4H3LXOL4_cjs.InlineSchemaEditor,
1184
+ {
1185
+ value,
1186
+ onChange: props.onChange,
1187
+ disabled: props.readOnly,
1188
+ nested: true
1189
+ }
1190
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1191
+ SchemaTreeEditorInner,
1192
+ {
1193
+ ...props,
1194
+ schema: value,
1195
+ onChange: props.onChange
1196
+ }
1197
+ ) });
1198
+ }
1199
+ );
1200
+ function defaultAdvancedEditor(context) {
1201
+ return /* @__PURE__ */ jsxRuntime.jsx(
1202
+ chunk4H3LXOL4_cjs.InlineSchemaEditor,
1203
+ {
1204
+ schema: context.schema,
1205
+ fullSchema: context.fullSchema,
1206
+ required: context.required,
1207
+ onRequiredChange: context.onRequiredChange,
1208
+ schemaName: context.schemaName,
1209
+ path: context.path,
1210
+ nested: true,
1211
+ disabled: context.readOnly,
1212
+ onChange: context.update
1213
+ }
1214
+ );
1215
+ }
1216
+
1217
+ exports.SCHEMA_TYPES = SCHEMA_TYPES;
1218
+ exports.SchemaTreeEditor = SchemaTreeEditor;