@dxos/react-ui-form 0.8.3-main.7f5a14c → 0.8.3

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