@dxos/react-ui-form 0.8.3-main.672df60 → 0.8.3-staging.0fa589b

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 (63) hide show
  1. package/dist/lib/browser/index.mjs +190 -173
  2. package/dist/lib/browser/index.mjs.map +3 -3
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node/index.cjs +150 -133
  5. package/dist/lib/node/index.cjs.map +3 -3
  6. package/dist/lib/node/meta.json +1 -1
  7. package/dist/lib/node-esm/index.mjs +190 -173
  8. package/dist/lib/node-esm/index.mjs.map +3 -3
  9. package/dist/lib/node-esm/meta.json +1 -1
  10. package/dist/types/src/components/ControlSection/ControlSection.d.ts +1 -1
  11. package/dist/types/src/components/ControlSection/ControlSection.d.ts.map +1 -1
  12. package/dist/types/src/components/ControlSection/ControlSection.stories.d.ts.map +1 -1
  13. package/dist/types/src/components/FieldEditor/FieldEditor.d.ts +3 -2
  14. package/dist/types/src/components/FieldEditor/FieldEditor.d.ts.map +1 -1
  15. package/dist/types/src/components/FieldEditor/FieldEditor.stories.d.ts +5 -0
  16. package/dist/types/src/components/FieldEditor/FieldEditor.stories.d.ts.map +1 -1
  17. package/dist/types/src/components/Form/Defaults.d.ts.map +1 -1
  18. package/dist/types/src/components/Form/Form.d.ts +6 -14
  19. package/dist/types/src/components/Form/Form.d.ts.map +1 -1
  20. package/dist/types/src/components/Form/Form.stories.d.ts +2 -2
  21. package/dist/types/src/components/Form/Form.stories.d.ts.map +1 -1
  22. package/dist/types/src/components/Form/FormActions.d.ts +3 -1
  23. package/dist/types/src/components/Form/FormActions.d.ts.map +1 -1
  24. package/dist/types/src/components/Form/FormContent.d.ts +30 -3
  25. package/dist/types/src/components/Form/FormContent.d.ts.map +1 -1
  26. package/dist/types/src/components/Form/Input.d.ts +6 -4
  27. package/dist/types/src/components/Form/Input.d.ts.map +1 -1
  28. package/dist/types/src/components/Form/RefField.d.ts.map +1 -1
  29. package/dist/types/src/components/Form/custom/GeoPointInput.d.ts.map +1 -1
  30. package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts.map +1 -1
  31. package/dist/types/src/components/Form/custom/SelectOptionsInput.stories.d.ts.map +1 -1
  32. package/dist/types/src/components/Form/custom/TupleInput.d.ts.map +1 -1
  33. package/dist/types/src/components/ViewEditor/ViewEditor.d.ts +3 -2
  34. package/dist/types/src/components/ViewEditor/ViewEditor.d.ts.map +1 -1
  35. package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts +7 -0
  36. package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts.map +1 -1
  37. package/dist/types/src/components/testing.d.ts +3 -1
  38. package/dist/types/src/components/testing.d.ts.map +1 -1
  39. package/dist/types/src/translations.d.ts +3 -0
  40. package/dist/types/src/translations.d.ts.map +1 -1
  41. package/package.json +28 -26
  42. package/src/components/ControlSection/ControlSection.stories.tsx +15 -3
  43. package/src/components/ControlSection/ControlSection.tsx +11 -9
  44. package/src/components/FieldEditor/FieldEditor.stories.tsx +25 -5
  45. package/src/components/FieldEditor/FieldEditor.test.tsx +21 -13
  46. package/src/components/FieldEditor/FieldEditor.tsx +11 -2
  47. package/src/components/Form/ArrayField.tsx +1 -1
  48. package/src/components/Form/Defaults.tsx +5 -25
  49. package/src/components/Form/Form.stories.tsx +5 -5
  50. package/src/components/Form/Form.tsx +44 -49
  51. package/src/components/Form/FormActions.tsx +17 -2
  52. package/src/components/Form/FormContent.tsx +46 -46
  53. package/src/components/Form/Input.tsx +13 -8
  54. package/src/components/Form/RefField.tsx +1 -5
  55. package/src/components/Form/custom/GeoPointInput.tsx +1 -3
  56. package/src/components/Form/custom/SelectOptionsInput.stories.tsx +7 -5
  57. package/src/components/Form/custom/SelectOptionsInput.tsx +1 -3
  58. package/src/components/Form/custom/TupleInput.tsx +1 -3
  59. package/src/components/ViewEditor/ViewEditor.stories.tsx +25 -9
  60. package/src/components/ViewEditor/ViewEditor.test.tsx +80 -42
  61. package/src/components/ViewEditor/ViewEditor.tsx +66 -66
  62. package/src/components/testing.tsx +12 -7
  63. package/src/translations.ts +4 -1
@@ -91,6 +91,7 @@ var import_util = require("@dxos/util");
91
91
  var import_tracking5 = require("@preact-signals/safe-react/tracking");
92
92
  var import_react5 = __toESM(require("react"));
93
93
  var import_react_ui5 = require("@dxos/react-ui");
94
+ var import_react_ui_stack = require("@dxos/react-ui-stack");
94
95
  var import_react_ui_theme3 = require("@dxos/react-ui-theme");
95
96
  var import_tracking6 = require("@preact-signals/safe-react/tracking");
96
97
  var import_react6 = __toESM(require("react"));
@@ -109,10 +110,12 @@ var import_react8 = __toESM(require("react"));
109
110
  var import_react_ui8 = require("@dxos/react-ui");
110
111
  var import_tracking9 = require("@preact-signals/safe-react/tracking");
111
112
  var import_react9 = __toESM(require("react"));
112
- var import_react_ui_theme6 = require("@dxos/react-ui-theme");
113
+ var import_react_ui_stack2 = require("@dxos/react-ui-stack");
113
114
  var import_tracking10 = require("@preact-signals/safe-react/tracking");
114
115
  var import_react10 = __toESM(require("react"));
115
116
  var import_react_ui9 = require("@dxos/react-ui");
117
+ var import_react_ui_stack3 = require("@dxos/react-ui-stack");
118
+ var import_react_ui_theme6 = require("@dxos/react-ui-theme");
116
119
  var import_tracking11 = require("@preact-signals/safe-react/tracking");
117
120
  var import_react11 = __toESM(require("react"));
118
121
  var import_debug = require("@dxos/debug");
@@ -172,6 +175,7 @@ var import_echo_schema11 = require("@dxos/echo-schema");
172
175
  var import_invariant3 = require("@dxos/invariant");
173
176
  var import_react_ui12 = require("@dxos/react-ui");
174
177
  var import_react_ui_list2 = require("@dxos/react-ui-list");
178
+ var import_react_ui_stack4 = require("@dxos/react-ui-stack");
175
179
  var import_react_ui_theme9 = require("@dxos/react-ui-theme");
176
180
  var import_schema5 = require("@dxos/schema");
177
181
  var translationKey = "react-ui-form";
@@ -203,6 +207,7 @@ var translations_default = [
203
207
  "format date-time": "DateTime",
204
208
  "format did": "DID",
205
209
  "format duration": "Duration",
210
+ "format dxn": "DXN",
206
211
  "format email": "Email",
207
212
  "format formula": "Formula",
208
213
  "format hostname": "Hostname",
@@ -215,12 +220,14 @@ var translations_default = [
215
220
  "format regex": "RegExp",
216
221
  "format string": "String",
217
222
  "format single-select": "Select",
223
+ "format multi-select": "Multi-select",
218
224
  "format text": "Long text",
219
225
  "format time": "Time",
220
226
  "format timestamp": "Timestamp",
221
227
  "format user": "User",
222
228
  "format number": "Number",
223
229
  "format uri": "URI",
230
+ "format url": "URL",
224
231
  "format uuid": "UUID",
225
232
  // Placeholders.
226
233
  "placeholder latitude": "Latitude",
@@ -233,7 +240,7 @@ var translations_default = [
233
240
  "select option add": "Add option",
234
241
  // System schema message.
235
242
  "system schema title": "System Schema",
236
- "system schema description": "This schema is managed by the system and cannot be modified."
243
+ "system schema description": "This is a system schema and cannot be modified."
237
244
  }
238
245
  }
239
246
  }
@@ -289,7 +296,7 @@ var ControlPage = ({ children, classNames, ...props }) => {
289
296
  try {
290
297
  return /* @__PURE__ */ import_react2.default.createElement("div", {
291
298
  role: "none",
292
- className: (0, import_react_ui_theme2.mx)("pli-2", classNames),
299
+ className: (0, import_react_ui_theme2.mx)("pli-cardSpacingInline", classNames),
293
300
  ...props
294
301
  }, children);
295
302
  } finally {
@@ -312,9 +319,9 @@ var ControlSectionHeading = ({ title, description }) => {
312
319
  try {
313
320
  const { t } = (0, import_react_ui2.useTranslation)(translationKey);
314
321
  return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement("h2", {
315
- className: "pli-4 container-max-width text-xl mbs-6 mbe-4"
322
+ className: "pli-trimMd container-max-width text-xl mbs-trimLg mbe-trimMd"
316
323
  }, (0, import_react_ui2.toLocalizedString)(title, t)), description && /* @__PURE__ */ import_react2.default.createElement("p", {
317
- className: "pli-4 mlb-4 container-max-width text-description"
324
+ className: "pli-trimMd mlb-trimMd container-max-width text-description"
318
325
  }, (0, import_react_ui2.toLocalizedString)(description, t)));
319
326
  } finally {
320
327
  _effect.f();
@@ -339,7 +346,7 @@ var ControlGroup = ({ children, classNames }) => {
339
346
  try {
340
347
  return /* @__PURE__ */ import_react2.default.createElement("div", {
341
348
  role: "none",
342
- className: (0, import_react_ui_theme2.mx)("group container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content] gap-4", classNames)
349
+ className: (0, import_react_ui_theme2.mx)("group container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content] gap-trimMd", classNames)
343
350
  }, children);
344
351
  } finally {
345
352
  _effect.f();
@@ -350,15 +357,15 @@ var ControlFrame = ({ children }) => {
350
357
  try {
351
358
  return /* @__PURE__ */ import_react2.default.createElement("div", {
352
359
  role: "none",
353
- className: "p-4 border border-separator rounded-lg container-max-width grid grid-cols-1 md:grid-cols-[1fr_1fr] gap-2 md:gap-8"
360
+ className: "p-trimMd container-max-width grid grid-cols-1 md:grid-cols-[1fr_1fr] gap-trimSm md:gap-trimMd border border-separator rounded-md"
354
361
  }, children);
355
362
  } finally {
356
363
  _effect.f();
357
364
  }
358
365
  };
359
- var controlItemClasses = "p-4 border border-separator rounded-lg container-max-width grid md:col-span-2 grid-cols-subgrid items-center gap-2";
366
+ var controlItemClasses = "pli-trimMd plb-trimMd container-max-width grid md:col-span-2 grid-cols-subgrid items-center gap-trimSm border border-separator rounded-md *:first:!mbs-0 *:last:!mbe-0";
360
367
  var controlItemTitleClasses = "text-lg font-normal";
361
- var controlItemDescriptionClasses = "text-base mlb-2 md:mbe-0 text-description";
368
+ var controlItemDescriptionClasses = "text-base mlb-trimSm md:mbe-0 text-description";
362
369
  var ControlItem = ({ title, description, children }) => {
363
370
  var _effect = (0, import_tracking2.useSignals)();
364
371
  try {
@@ -403,19 +410,23 @@ var ControlFrameItem = ({ title, description, children }) => {
403
410
  }, /* @__PURE__ */ import_react2.default.createElement("h3", {
404
411
  className: "text-lg mbe-2"
405
412
  }, (0, import_react_ui2.toLocalizedString)(title, t)), description && /* @__PURE__ */ import_react2.default.createElement("p", {
406
- className: "mlb-2 md:mbe-0 text-description"
413
+ className: "mlb-trimSm md:mbe-0 text-description"
407
414
  }, (0, import_react_ui2.toLocalizedString)(description, t)), children);
408
415
  } finally {
409
416
  _effect.f();
410
417
  }
411
418
  };
412
- var InputHeader = ({ children, error }) => {
419
+ var InputHeader = ({ error, label, readonly }) => {
413
420
  var _effect = (0, import_tracking5.useSignals)();
414
421
  try {
422
+ const Label = readonly ? "span" : import_react_ui5.Input.Label;
423
+ const labelProps = readonly ? {} : {
424
+ classNames: "!mlb-0"
425
+ };
415
426
  return /* @__PURE__ */ import_react5.default.createElement("div", {
416
427
  role: "none",
417
- className: "flex justify-between items-center mbs-2 mbe-1 first:mbs-0"
418
- }, children, error && /* @__PURE__ */ import_react5.default.createElement(import_react_ui5.Tooltip.Trigger, {
428
+ className: (0, import_react_ui_theme3.mx)("flex justify-between items-center", import_react_ui_stack.labelSpacing)
429
+ }, /* @__PURE__ */ import_react5.default.createElement(Label, labelProps, label), error && /* @__PURE__ */ import_react5.default.createElement(import_react_ui5.Tooltip.Trigger, {
419
430
  asChild: true,
420
431
  content: error,
421
432
  side: "bottom"
@@ -477,8 +488,9 @@ var GeoPointInput = ({ type, label, disabled, getStatus, getValue: getValue3, on
477
488
  return /* @__PURE__ */ import_react4.default.createElement(import_react_ui4.Input.Root, {
478
489
  validationValence: status
479
490
  }, /* @__PURE__ */ import_react4.default.createElement(InputHeader, {
480
- error
481
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui4.Input.Label, null, label)), /* @__PURE__ */ import_react4.default.createElement("div", {
491
+ error,
492
+ label
493
+ }), /* @__PURE__ */ import_react4.default.createElement("div", {
482
494
  role: "none",
483
495
  className: "grid grid-cols-2 gap-2"
484
496
  }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui4.Input.TextInput, {
@@ -614,8 +626,9 @@ var SelectOptionInput = ({ type, label, disabled, getStatus, getValue: getValue3
614
626
  return /* @__PURE__ */ import_react6.default.createElement(import_react_ui6.Input.Root, {
615
627
  validationValence: status
616
628
  }, /* @__PURE__ */ import_react6.default.createElement(InputHeader, {
617
- error
618
- }, /* @__PURE__ */ import_react6.default.createElement(import_react_ui6.Input.Label, null, label)), /* @__PURE__ */ import_react6.default.createElement("div", {
629
+ error,
630
+ label
631
+ }), /* @__PURE__ */ import_react6.default.createElement("div", {
619
632
  role: "none"
620
633
  }, options && /* @__PURE__ */ import_react6.default.createElement(import_react_ui_list.List.Root, {
621
634
  items: options,
@@ -697,8 +710,9 @@ var TupleInput = ({ binding, type, label, disabled, getStatus, getValue: getValu
697
710
  return /* @__PURE__ */ import_react7.default.createElement(import_react_ui7.Input.Root, {
698
711
  validationValence: status
699
712
  }, /* @__PURE__ */ import_react7.default.createElement(InputHeader, {
700
- error
701
- }, /* @__PURE__ */ import_react7.default.createElement(import_react_ui7.Input.Label, null, label)), /* @__PURE__ */ import_react7.default.createElement("div", {
713
+ error,
714
+ label
715
+ }), /* @__PURE__ */ import_react7.default.createElement("div", {
702
716
  className: (0, import_react_ui_theme5.mx)("grid gap-2", gridCols[binding.length - 1])
703
717
  }, binding.map((prop) => /* @__PURE__ */ import_react7.default.createElement(import_react_ui7.Input.TextInput, {
704
718
  key: prop,
@@ -722,8 +736,9 @@ var TextInput = ({ type, label, inputOnly, disabled, placeholder, getStatus, get
722
736
  return disabled && !getValue3() ? null : disabled && inputOnly ? /* @__PURE__ */ import_react8.default.createElement("p", null, getValue3() ?? "") : /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Input.Root, {
723
737
  validationValence: status
724
738
  }, !inputOnly && /* @__PURE__ */ import_react8.default.createElement(InputHeader, {
725
- error
726
- }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Input.Label, null, label)), disabled ? /* @__PURE__ */ import_react8.default.createElement("p", null, getValue3() ?? "") : /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Input.TextInput, {
739
+ error,
740
+ label
741
+ }), disabled ? /* @__PURE__ */ import_react8.default.createElement("p", null, getValue3() ?? "") : /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Input.TextInput, {
727
742
  disabled,
728
743
  placeholder,
729
744
  value: getValue3() ?? "",
@@ -741,8 +756,9 @@ var NumberInput = ({ type, label, inputOnly, disabled, placeholder, getStatus, g
741
756
  return disabled && !getValue3() ? null : disabled && inputOnly ? /* @__PURE__ */ import_react8.default.createElement("p", null, getValue3() ?? "") : /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Input.Root, {
742
757
  validationValence: status
743
758
  }, !inputOnly && /* @__PURE__ */ import_react8.default.createElement(InputHeader, {
744
- error
745
- }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Input.Label, null, label)), disabled ? /* @__PURE__ */ import_react8.default.createElement("p", null, getValue3() ?? "") : /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Input.TextInput, {
759
+ error,
760
+ label
761
+ }), disabled ? /* @__PURE__ */ import_react8.default.createElement("p", null, getValue3() ?? "") : /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Input.TextInput, {
746
762
  type: "number",
747
763
  disabled,
748
764
  placeholder,
@@ -763,8 +779,9 @@ var BooleanInput = ({ type, label, inputOnly, getStatus, getValue: getValue3, on
763
779
  return /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Input.Root, {
764
780
  validationValence: status
765
781
  }, !inputOnly && /* @__PURE__ */ import_react8.default.createElement(InputHeader, {
766
- error
767
- }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Input.Label, null, label)), disabled ? /* @__PURE__ */ import_react8.default.createElement("p", null, t(checked ? "boolean input true value" : "boolean input false value")) : /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Input.Switch, {
782
+ error,
783
+ label
784
+ }), disabled ? /* @__PURE__ */ import_react8.default.createElement("p", null, t(checked ? "boolean input true value" : "boolean input false value")) : /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Input.Switch, {
768
785
  checked,
769
786
  onCheckedChange: (value) => onValueChange(type, value)
770
787
  }), inputOnly && /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Input.DescriptionAndValidation, null, error));
@@ -784,8 +801,9 @@ var SelectInput = ({ type, label, inputOnly, disabled, placeholder, options, get
784
801
  return disabled && !value ? null : /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Input.Root, {
785
802
  validationValence: status
786
803
  }, !inputOnly && /* @__PURE__ */ import_react8.default.createElement(InputHeader, {
787
- error
788
- }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Input.Label, null, label)), disabled ? /* @__PURE__ */ import_react8.default.createElement("p", null, options?.find(({ value: optionValue }) => optionValue === value)?.label ?? String(value)) : /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Select.Root, {
804
+ error,
805
+ label
806
+ }), disabled ? /* @__PURE__ */ import_react8.default.createElement("p", null, options?.find(({ value: optionValue }) => optionValue === value)?.label ?? String(value)) : /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Select.Root, {
789
807
  value,
790
808
  onValueChange: handleValueChange
791
809
  }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Select.TriggerButton, {
@@ -829,8 +847,9 @@ var MarkdownInput = ({ type, label, inputOnly, disabled, placeholder, getStatus,
829
847
  return /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Input.Root, {
830
848
  validationValence: status
831
849
  }, !inputOnly && /* @__PURE__ */ import_react8.default.createElement(InputHeader, {
832
- error
833
- }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Input.Label, null, label)), disabled ? /* @__PURE__ */ import_react8.default.createElement("p", null, getValue3() ?? "") : /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Input.TextArea, {
850
+ error,
851
+ label
852
+ }), disabled ? /* @__PURE__ */ import_react8.default.createElement("p", null, getValue3() ?? "") : /* @__PURE__ */ import_react8.default.createElement(import_react_ui8.Input.TextArea, {
834
853
  ref: textareaRef,
835
854
  disabled,
836
855
  placeholder,
@@ -1182,14 +1201,14 @@ var FormProvider = ({ children, formRef, autoSave, ...formOptions }) => {
1182
1201
  _effect.f();
1183
1202
  }
1184
1203
  };
1185
- var FormActions = ({ readonly, onCancel }) => {
1204
+ var FormActions = ({ readonly, onCancel, outerSpacing = true }) => {
1186
1205
  var _effect = (0, import_tracking10.useSignals)();
1187
1206
  try {
1188
1207
  const { t } = (0, import_react_ui9.useTranslation)(translationKey);
1189
1208
  const { canSave, handleSave } = useFormContext();
1190
1209
  return /* @__PURE__ */ import_react10.default.createElement("div", {
1191
1210
  role: "none",
1192
- className: "flex [&_button]:grow gap-1 pli-2 pbe-2"
1211
+ className: (0, import_react_ui_theme6.mx)(outerSpacing === "scroll-fields" ? "pli-cardSpacingInline mbe-cardSpacingBlock" : outerSpacing ? import_react_ui_stack3.cardSpacing : "mbs-cardSpacingBlock", "flex [&_button]:grow gap-1 first:mbs-0")
1193
1212
  }, onCancel && !readonly && /* @__PURE__ */ import_react10.default.createElement(import_react_ui9.IconButton, {
1194
1213
  "data-testid": "cancel-button",
1195
1214
  icon: "ph--x--regular",
@@ -1549,7 +1568,10 @@ var ArrayField = ({ property, readonly, path, inputProps, Custom, lookupComponen
1549
1568
  if (!elementType) {
1550
1569
  return null;
1551
1570
  }
1552
- return readonly && values.length < 1 ? null : /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(InputHeader, null, label), /* @__PURE__ */ import_react16.default.createElement("div", {
1571
+ return readonly && values.length < 1 ? null : /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(InputHeader, {
1572
+ readonly: true,
1573
+ label
1574
+ }), /* @__PURE__ */ import_react16.default.createElement("div", {
1553
1575
  role: "none",
1554
1576
  className: readonly ? "flex flex-wrap gap-1 mlb-1" : values.length > 0 ? "grid gap-1 grid-cols-[1fr_min-content] mlb-1" : "hidden"
1555
1577
  }, values.map((_value, index) => {
@@ -1681,8 +1703,9 @@ var RefField = ({ type, label, disabled, placeholder, inputOnly, array, ast, get
1681
1703
  return disabled && items.length < 1 ? null : /* @__PURE__ */ import_react17.default.createElement(import_react_ui11.Input.Root, {
1682
1704
  validationValence: status
1683
1705
  }, !inputOnly && /* @__PURE__ */ import_react17.default.createElement(InputHeader, {
1684
- error
1685
- }, /* @__PURE__ */ import_react17.default.createElement(import_react_ui11.Input.Label, null, label)), /* @__PURE__ */ import_react17.default.createElement("div", {
1706
+ error,
1707
+ label
1708
+ }), /* @__PURE__ */ import_react17.default.createElement("div", {
1686
1709
  "data-no-submit": true
1687
1710
  }, disabled ? items.length < 1 ? /* @__PURE__ */ import_react17.default.createElement("p", {
1688
1711
  className: (0, import_react_ui_theme8.mx)(import_react_ui_theme8.descriptionText, "mbe-2")
@@ -1762,8 +1785,8 @@ var getInputComponent = (type, format) => {
1762
1785
  var FormField = ({ property, path, readonly, inline, onQueryRefOptions, lookupComponent, Custom }) => {
1763
1786
  var _effect = (0, import_tracking12.useSignals)();
1764
1787
  try {
1765
- const inputProps = useInputProps(path);
1766
1788
  const { ast, name, type, format, title, description, options, examples, array } = property;
1789
+ const inputProps = useInputProps(path);
1767
1790
  const label = (0, import_react15.useMemo)(() => title ?? (0, import_effect4.pipe)(name, import_String.capitalize), [
1768
1791
  title,
1769
1792
  name
@@ -1856,7 +1879,7 @@ var FormField = ({ property, path, readonly, inline, onQueryRefOptions, lookupCo
1856
1879
  const typeLiteral = baseNode ? (0, import_effect5.getDiscriminatedType)(baseNode, inputProps.getValue()) : (0, import_effect5.findNode)(ast, import_effect4.SchemaAST.isTypeLiteral);
1857
1880
  if (typeLiteral) {
1858
1881
  return /* @__PURE__ */ import_react15.default.createElement(import_react15.default.Fragment, null, !inline && /* @__PURE__ */ import_react15.default.createElement("h3", {
1859
- className: "text-lg mbs-2 mbe-1 first:mbs-0"
1882
+ className: (0, import_react_ui_theme7.mx)("text-lg mlb-inputSpacingBlock first:mbs-0")
1860
1883
  }, label), /* @__PURE__ */ import_react15.default.createElement(FormFields, {
1861
1884
  schema: import_effect4.Schema.make(typeLiteral),
1862
1885
  path,
@@ -1872,7 +1895,7 @@ var FormField = ({ property, path, readonly, inline, onQueryRefOptions, lookupCo
1872
1895
  _effect.f();
1873
1896
  }
1874
1897
  };
1875
- var FormFields = ({ classNames, Custom, schema, path, filter, sort, readonly, lookupComponent, onQueryRefOptions }) => {
1898
+ var FormFields = /* @__PURE__ */ (0, import_react15.forwardRef)(({ classNames, testId, schema, path, filter, sort, readonly, lookupComponent, Custom, onQueryRefOptions }, forwardRef2) => {
1876
1899
  var _effect = (0, import_tracking12.useSignals)();
1877
1900
  try {
1878
1901
  const values = useFormValues(path);
@@ -1886,35 +1909,33 @@ var FormFields = ({ classNames, Custom, schema, path, filter, sort, readonly, lo
1886
1909
  filter,
1887
1910
  sort
1888
1911
  ]);
1889
- return (
1890
- // TODO(burdon): Consistent padding (with composite forms).
1891
- /* @__PURE__ */ import_react15.default.createElement("div", {
1892
- role: "form",
1893
- className: (0, import_react_ui_theme7.mx)("p-2 is-full", classNames)
1894
- }, properties.map((property) => {
1895
- return /* @__PURE__ */ import_react15.default.createElement(FormField, {
1896
- key: property.name,
1897
- property,
1898
- path: [
1899
- ...path ?? [],
1900
- property.name
1901
- ],
1902
- readonly,
1903
- onQueryRefOptions,
1904
- lookupComponent,
1905
- Custom
1906
- });
1907
- }).filter(import_util4.isNotFalsy))
1908
- );
1912
+ return /* @__PURE__ */ import_react15.default.createElement("div", {
1913
+ role: "form",
1914
+ className: (0, import_react_ui_theme7.mx)("is-full", classNames),
1915
+ ref: forwardRef2
1916
+ }, properties.map((property) => {
1917
+ return /* @__PURE__ */ import_react15.default.createElement(FormField, {
1918
+ key: property.name,
1919
+ property,
1920
+ path: [
1921
+ ...path ?? [],
1922
+ property.name
1923
+ ],
1924
+ readonly,
1925
+ onQueryRefOptions,
1926
+ lookupComponent,
1927
+ Custom
1928
+ });
1929
+ }).filter(import_util4.isNotFalsy));
1909
1930
  } finally {
1910
1931
  _effect.f();
1911
1932
  }
1912
- };
1913
- var Form = ({ classNames, schema, values: initialValues, path = [], autoFocus, readonly, filter, sort, autoSave, testId, onValuesChanged, onValidate, onSave, onCancel, onQueryRefOptions, lookupComponent, Custom }) => {
1933
+ });
1934
+ var Form = ({ classNames, testId, values: initialValues, autoFocus, readonly, autoSave, outerSpacing = true, onCancel, schema, onValuesChanged, onValidate, onSave, ...props }) => {
1914
1935
  var _effect = (0, import_tracking9.useSignals)();
1915
1936
  try {
1916
1937
  const formRef = (0, import_react9.useRef)(null);
1917
- const onValid = (0, import_react9.useMemo)(() => autoSave ? onSave : void 0, [
1938
+ const handleValid = (0, import_react9.useMemo)(() => autoSave ? onSave : void 0, [
1918
1939
  autoSave,
1919
1940
  onSave
1920
1941
  ]);
@@ -1935,32 +1956,33 @@ var Form = ({ classNames, schema, values: initialValues, path = [], autoFocus, r
1935
1956
  initialValues,
1936
1957
  onValuesChanged,
1937
1958
  onValidate,
1938
- onValid,
1959
+ onValid: handleValid,
1939
1960
  onSave
1940
1961
  }, /* @__PURE__ */ import_react9.default.createElement("div", {
1941
- ref: formRef,
1942
1962
  role: "none",
1943
- className: (0, import_react_ui_theme6.mx)("flex flex-col gap-4", classNames),
1963
+ className: "contents",
1944
1964
  "data-testid": testId
1945
1965
  }, /* @__PURE__ */ import_react9.default.createElement(FormFields, {
1946
- schema,
1947
- path,
1966
+ ...props,
1967
+ ref: formRef,
1968
+ classNames: [
1969
+ outerSpacing === "blockStart-0" ? "pli-cardSpacingInline mbe-cardSpacingBlock [&>.mbs-inputSpacingBlock:first-child]:!mbs-0" : outerSpacing === "scroll-fields" ? "pli-cardSpacingInline pbe-cardSpacingBlock" : outerSpacing ? import_react_ui_stack2.cardSpacing : false,
1970
+ outerSpacing === "scroll-fields" && import_react_ui_stack2.cardDialogOverflow,
1971
+ classNames
1972
+ ],
1948
1973
  readonly,
1949
- filter,
1950
- sort,
1951
- onQueryRefOptions,
1952
- lookupComponent,
1953
- Custom
1974
+ schema
1954
1975
  }), (onCancel || onSave) && !autoSave && /* @__PURE__ */ import_react9.default.createElement(FormActions, {
1976
+ readonly,
1955
1977
  onCancel,
1956
- readonly
1978
+ outerSpacing
1957
1979
  })));
1958
1980
  } finally {
1959
1981
  _effect.f();
1960
1982
  }
1961
1983
  };
1962
1984
  var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-form/src/components/FieldEditor/FieldEditor.tsx";
1963
- var FieldEditor = ({ view, projection, field, registry, onSave, onCancel }) => {
1985
+ var FieldEditor = ({ view, projection, field, registry, onSave, onCancel, outerSpacing }) => {
1964
1986
  var _effect = (0, import_tracking3.useSignals)();
1965
1987
  try {
1966
1988
  const { t } = (0, import_react_ui3.useTranslation)(translationKey);
@@ -2095,7 +2117,7 @@ var FieldEditor = ({ view, projection, field, registry, onSave, onCancel }) => {
2095
2117
  props
2096
2118
  }, {
2097
2119
  F: __dxlog_file4,
2098
- L: 175,
2120
+ L: 183,
2099
2121
  S: void 0,
2100
2122
  C: (f, a) => f(...a)
2101
2123
  });
@@ -2115,14 +2137,15 @@ var FieldEditor = ({ view, projection, field, registry, onSave, onCancel }) => {
2115
2137
  onValidate: handleValidate,
2116
2138
  onSave: handleSave,
2117
2139
  onCancel: handleCancel,
2118
- Custom: custom
2140
+ Custom: custom,
2141
+ outerSpacing
2119
2142
  });
2120
2143
  } finally {
2121
2144
  _effect.f();
2122
2145
  }
2123
2146
  };
2124
2147
  var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-form/src/components/ViewEditor/ViewEditor.tsx";
2125
- var grid = "grid grid-cols-[32px_1fr_32px] min-bs-[2.5rem]";
2148
+ var grid = "grid grid-cols-[32px_1fr_32px_32px] min-bs-[2.5rem]";
2126
2149
  var ViewMetaSchema = import_effect12.Schema.Struct({
2127
2150
  name: import_effect12.Schema.String.annotations({
2128
2151
  title: "View"
@@ -2131,7 +2154,7 @@ var ViewMetaSchema = import_effect12.Schema.Struct({
2131
2154
  title: "Typename"
2132
2155
  })
2133
2156
  }).pipe(import_effect12.Schema.mutable);
2134
- var ViewEditor = ({ classNames, schema, view, registry, readonly, showHeading = false, onTypenameChanged, onDelete }) => {
2157
+ var ViewEditor = ({ classNames, schema, view, registry, readonly: _readonly, showHeading = false, onTypenameChanged, onDelete, outerSpacing = true }) => {
2135
2158
  var _effect = (0, import_tracking15.useSignals)();
2136
2159
  try {
2137
2160
  const { t } = (0, import_react_ui12.useTranslation)(translationKey);
@@ -2143,7 +2166,7 @@ var ViewEditor = ({ classNames, schema, view, registry, readonly, showHeading =
2143
2166
  view
2144
2167
  ]);
2145
2168
  const [field, setField] = (0, import_react19.useState)();
2146
- const immutable = readonly || !(0, import_echo_schema11.isMutable)(schema);
2169
+ const readonly = _readonly || !(0, import_echo_schema11.isMutable)(schema);
2147
2170
  const viewValues = (0, import_react19.useMemo)(() => {
2148
2171
  return {
2149
2172
  name: view.name,
@@ -2155,20 +2178,20 @@ var ViewEditor = ({ classNames, schema, view, registry, readonly, showHeading =
2155
2178
  view
2156
2179
  ]);
2157
2180
  const handleSelect = (0, import_react19.useCallback)((field2) => {
2158
- if (immutable) {
2181
+ if (readonly) {
2159
2182
  return;
2160
2183
  }
2161
2184
  setField((f) => f === field2 ? void 0 : field2);
2162
2185
  }, [
2163
- immutable
2186
+ readonly
2164
2187
  ]);
2165
2188
  const handleAdd = (0, import_react19.useCallback)(() => {
2166
- (0, import_invariant3.invariant)(!immutable, void 0, {
2189
+ (0, import_invariant3.invariant)(!readonly, void 0, {
2167
2190
  F: __dxlog_file5,
2168
- L: 88,
2191
+ L: 92,
2169
2192
  S: void 0,
2170
2193
  A: [
2171
- "!immutable",
2194
+ "!readonly",
2172
2195
  ""
2173
2196
  ]
2174
2197
  });
@@ -2176,15 +2199,16 @@ var ViewEditor = ({ classNames, schema, view, registry, readonly, showHeading =
2176
2199
  setField(field2);
2177
2200
  }, [
2178
2201
  schema,
2179
- view
2202
+ view,
2203
+ readonly
2180
2204
  ]);
2181
2205
  const handleUpdate = (0, import_react19.useCallback)(({ name, typename }) => {
2182
- (0, import_invariant3.invariant)(!immutable, void 0, {
2206
+ (0, import_invariant3.invariant)(!readonly, void 0, {
2183
2207
  F: __dxlog_file5,
2184
- L: 95,
2208
+ L: 99,
2185
2209
  S: void 0,
2186
2210
  A: [
2187
- "!immutable",
2211
+ "!readonly",
2188
2212
  ""
2189
2213
  ]
2190
2214
  });
@@ -2192,7 +2216,7 @@ var ViewEditor = ({ classNames, schema, view, registry, readonly, showHeading =
2192
2216
  if (view.name !== name) {
2193
2217
  view.name = name;
2194
2218
  }
2195
- if (view.query.typename !== typename && !immutable) {
2219
+ if (view.query.typename !== typename && !readonly) {
2196
2220
  onTypenameChanged?.(typename);
2197
2221
  }
2198
2222
  });
@@ -2200,15 +2224,15 @@ var ViewEditor = ({ classNames, schema, view, registry, readonly, showHeading =
2200
2224
  schema,
2201
2225
  view,
2202
2226
  onTypenameChanged,
2203
- immutable
2227
+ readonly
2204
2228
  ]);
2205
2229
  const handleDelete = (0, import_react19.useCallback)((fieldId) => {
2206
- (0, import_invariant3.invariant)(!immutable, void 0, {
2230
+ (0, import_invariant3.invariant)(!readonly, void 0, {
2207
2231
  F: __dxlog_file5,
2208
- L: 111,
2232
+ L: 115,
2209
2233
  S: void 0,
2210
2234
  A: [
2211
- "!immutable",
2235
+ "!readonly",
2212
2236
  ""
2213
2237
  ]
2214
2238
  });
@@ -2219,15 +2243,16 @@ var ViewEditor = ({ classNames, schema, view, registry, readonly, showHeading =
2219
2243
  }, [
2220
2244
  schema,
2221
2245
  field,
2222
- onDelete
2246
+ onDelete,
2247
+ readonly
2223
2248
  ]);
2224
2249
  const handleMove = (0, import_react19.useCallback)((fromIndex, toIndex) => {
2225
- (0, import_invariant3.invariant)(!immutable, void 0, {
2250
+ (0, import_invariant3.invariant)(!readonly, void 0, {
2226
2251
  F: __dxlog_file5,
2227
- L: 123,
2252
+ L: 127,
2228
2253
  S: void 0,
2229
2254
  A: [
2230
- "!immutable",
2255
+ "!readonly",
2231
2256
  ""
2232
2257
  ]
2233
2258
  });
@@ -2239,7 +2264,8 @@ var ViewEditor = ({ classNames, schema, view, registry, readonly, showHeading =
2239
2264
  view.fields = fields;
2240
2265
  }, [
2241
2266
  schema,
2242
- view.fields
2267
+ view.fields,
2268
+ readonly
2243
2269
  ]);
2244
2270
  const handleClose = (0, import_react19.useCallback)(() => setField(void 0), []);
2245
2271
  const hiddenProperties = projection.getHiddenProperties();
@@ -2257,36 +2283,30 @@ var ViewEditor = ({ classNames, schema, view, registry, readonly, showHeading =
2257
2283
  ]);
2258
2284
  return /* @__PURE__ */ import_react19.default.createElement("div", {
2259
2285
  role: "none",
2260
- className: (0, import_react_ui_theme9.mx)("overflow-y-auto", classNames)
2261
- }, immutable && /* @__PURE__ */ import_react19.default.createElement("div", {
2286
+ className: (0, import_react_ui_theme9.mx)(classNames)
2287
+ }, readonly && /* @__PURE__ */ import_react19.default.createElement("div", {
2262
2288
  role: "none",
2263
- className: "mbe-2"
2264
- }, /* @__PURE__ */ import_react19.default.createElement(import_react_ui12.Message.Root, {
2265
- valence: "neutral",
2266
- className: "rounded"
2267
- }, /* @__PURE__ */ import_react19.default.createElement(import_react_ui12.Message.Title, null, /* @__PURE__ */ import_react19.default.createElement(import_react_ui12.Icon, {
2268
- icon: "ph--info--regular",
2269
- size: 5,
2270
- classNames: "inline"
2271
- }), " ", t("system schema title")), /* @__PURE__ */ import_react19.default.createElement(import_react_ui12.Message.Body, null, t("system schema description")))), /* @__PURE__ */ import_react19.default.createElement(Form, {
2289
+ className: (0, import_react_ui_theme9.mx)("is-full", outerSpacing && "plb-cardSpacingBlock pli-cardSpacingInline")
2290
+ }, /* @__PURE__ */ import_react19.default.createElement(import_react_ui12.Callout.Root, {
2291
+ valence: "info"
2292
+ }, /* @__PURE__ */ import_react19.default.createElement(import_react_ui12.Callout.Title, null, t("system schema description")))), /* @__PURE__ */ import_react19.default.createElement(Form, {
2272
2293
  autoSave: true,
2273
2294
  schema: ViewMetaSchema,
2274
2295
  values: viewValues,
2296
+ readonly,
2275
2297
  onSave: handleUpdate,
2276
- classNames: "min-bs-0 overflow-y-auto"
2298
+ outerSpacing
2277
2299
  }), /* @__PURE__ */ import_react19.default.createElement("div", {
2278
2300
  role: "none",
2279
- className: "min-bs-0 overflow-y-auto"
2280
- }, /* @__PURE__ */ import_react19.default.createElement("div", {
2281
- role: "none",
2282
- className: "p-2"
2301
+ className: outerSpacing ? import_react_ui_stack4.cardSpacing : "mlb-cardSpacingBlock"
2283
2302
  }, /* @__PURE__ */ import_react19.default.createElement("label", {
2284
2303
  className: (0, import_react_ui_theme9.mx)(import_react_ui_theme9.inputTextLabel)
2285
- }, t("fields label"))), /* @__PURE__ */ import_react19.default.createElement(import_react_ui_list2.List.Root, {
2304
+ }, t("fields label")), /* @__PURE__ */ import_react19.default.createElement(import_react_ui_list2.List.Root, {
2286
2305
  items: view.fields,
2287
2306
  isItem: import_effect12.Schema.is(import_schema5.FieldSchema),
2288
2307
  getId: (field2) => field2.id,
2289
- onMove: immutable ? void 0 : handleMove
2308
+ readonly,
2309
+ onMove: readonly ? void 0 : handleMove
2290
2310
  }, ({ items: fields }) => /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, showHeading && /* @__PURE__ */ import_react19.default.createElement("div", {
2291
2311
  role: "heading",
2292
2312
  className: grid
@@ -2294,41 +2314,38 @@ var ViewEditor = ({ classNames, schema, view, registry, readonly, showHeading =
2294
2314
  className: "flex items-center text-sm"
2295
2315
  }, t("field path label"))), /* @__PURE__ */ import_react19.default.createElement("div", {
2296
2316
  role: "list",
2297
- className: "flex flex-col w-full"
2317
+ className: "flex flex-col is-full"
2298
2318
  }, fields?.map((field2) => /* @__PURE__ */ import_react19.default.createElement(import_react_ui_list2.List.Item, {
2299
2319
  key: field2.id,
2300
2320
  item: field2,
2301
- classNames: (0, import_react_ui_theme9.mx)(grid, import_react_ui_theme9.ghostHover, !immutable && "cursor-pointer")
2321
+ classNames: (0, import_react_ui_theme9.mx)(grid, import_react_ui_theme9.ghostHover, "overflow-hidden", !readonly && "cursor-pointer")
2302
2322
  }, /* @__PURE__ */ import_react19.default.createElement(import_react_ui_list2.List.ItemDragHandle, null), /* @__PURE__ */ import_react19.default.createElement(import_react_ui_list2.List.ItemTitle, {
2303
2323
  onClick: () => handleSelect(field2)
2304
- }, field2.path), /* @__PURE__ */ import_react19.default.createElement("div", {
2305
- className: "flex items-center gap-2 -ml-4"
2306
- }, /* @__PURE__ */ import_react19.default.createElement(import_react_ui_list2.List.ItemButton, {
2324
+ }, field2.path), /* @__PURE__ */ import_react19.default.createElement(import_react_ui_list2.List.ItemButton, {
2325
+ "data-testid": "hide-field-button",
2307
2326
  icon: "ph--eye-slash--regular",
2327
+ // TDOO(burdon): Is this the correct test?
2308
2328
  disabled: view.fields.length <= 1,
2309
- onClick: () => handleHide(field2.id),
2310
- "data-testid": "hide-field-button"
2311
- }), !immutable && /* @__PURE__ */ import_react19.default.createElement(import_react_ui_list2.List.ItemDeleteButton, {
2312
- icon: "ph--trash--regular",
2329
+ onClick: () => handleHide(field2.id)
2330
+ }), !readonly && /* @__PURE__ */ import_react19.default.createElement(import_react_ui_list2.List.ItemDeleteButton, {
2313
2331
  disabled: view.fields.length <= 1,
2314
2332
  onClick: () => handleDelete(field2.id)
2315
- }))))))), hiddenProperties.length > 0 && /* @__PURE__ */ import_react19.default.createElement("div", null, /* @__PURE__ */ import_react19.default.createElement("div", {
2316
- role: "none",
2317
- className: "p-2"
2318
- }, /* @__PURE__ */ import_react19.default.createElement("label", {
2333
+ })))))), hiddenProperties.length > 0 && /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("label", {
2319
2334
  className: (0, import_react_ui_theme9.mx)(import_react_ui_theme9.inputTextLabel)
2320
- }, t("hidden fields label"))), /* @__PURE__ */ import_react19.default.createElement(import_react_ui_list2.List.Root, {
2335
+ }, t("hidden fields label")), /* @__PURE__ */ import_react19.default.createElement(import_react_ui_list2.List.Root, {
2321
2336
  items: hiddenProperties,
2322
2337
  isItem: (item) => typeof item === "string",
2323
2338
  getId: (property) => property
2324
2339
  }, ({ items: properties }) => /* @__PURE__ */ import_react19.default.createElement("div", {
2325
2340
  role: "list",
2326
- className: "flex flex-col w-full"
2341
+ className: "flex flex-col is-full"
2327
2342
  }, properties?.map((property) => /* @__PURE__ */ import_react19.default.createElement(import_react_ui_list2.List.Item, {
2328
2343
  key: property,
2329
2344
  item: property,
2330
- classNames: (0, import_react_ui_theme9.mx)(grid, import_react_ui_theme9.ghostHover, !immutable && "cursor-pointer")
2331
- }, /* @__PURE__ */ import_react19.default.createElement("div", null), /* @__PURE__ */ import_react19.default.createElement(import_react_ui_list2.List.ItemTitle, null, property), /* @__PURE__ */ import_react19.default.createElement(import_react_ui_list2.List.ItemButton, {
2345
+ classNames: (0, import_react_ui_theme9.mx)(grid, import_react_ui_theme9.ghostHover, !readonly && "cursor-pointer")
2346
+ }, /* @__PURE__ */ import_react19.default.createElement(import_react_ui_list2.List.ItemDragHandle, {
2347
+ disabled: true
2348
+ }), /* @__PURE__ */ import_react19.default.createElement(import_react_ui_list2.List.ItemTitle, null, property), /* @__PURE__ */ import_react19.default.createElement(import_react_ui_list2.List.ItemButton, {
2332
2349
  icon: "ph--eye--regular",
2333
2350
  onClick: () => handleShow(property),
2334
2351
  "data-testid": "show-field-button"
@@ -2341,11 +2358,11 @@ var ViewEditor = ({ classNames, schema, view, registry, readonly, showHeading =
2341
2358
  onSave: handleClose
2342
2359
  }), !readonly && !field && /* @__PURE__ */ import_react19.default.createElement("div", {
2343
2360
  role: "none",
2344
- className: "p-2"
2361
+ className: outerSpacing ? import_react_ui_stack4.cardSpacing : "mlb-cardSpacingBlock"
2345
2362
  }, /* @__PURE__ */ import_react19.default.createElement(import_react_ui12.IconButton, {
2346
2363
  icon: "ph--plus--regular",
2347
2364
  label: t("button add property"),
2348
- onClick: immutable ? void 0 : handleAdd,
2365
+ onClick: readonly ? void 0 : handleAdd,
2349
2366
  // TODO(burdon): Show field limit in ux (not tooltip).
2350
2367
  disabled: view.fields.length >= import_schema5.VIEW_FIELD_LIMIT,
2351
2368
  classNames: "flex is-full"