@valbuild/core 0.105.1 → 0.109.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 (32) hide show
  1. package/dist/declarations/src/index.d.ts +5 -4
  2. package/dist/declarations/src/initSchema.d.ts +20 -20
  3. package/dist/declarations/src/module.d.ts +10 -0
  4. package/dist/declarations/src/preview.d.ts +40 -2
  5. package/dist/declarations/src/render.d.ts +38 -9
  6. package/dist/declarations/src/schema/array.d.ts +24 -12
  7. package/dist/declarations/src/schema/boolean.d.ts +25 -2
  8. package/dist/declarations/src/schema/color.d.ts +25 -2
  9. package/dist/declarations/src/schema/date.d.ts +25 -2
  10. package/dist/declarations/src/schema/datetime.d.ts +25 -2
  11. package/dist/declarations/src/schema/file.d.ts +25 -2
  12. package/dist/declarations/src/schema/image.d.ts +25 -2
  13. package/dist/declarations/src/schema/index.d.ts +19 -1
  14. package/dist/declarations/src/schema/keyOf.d.ts +25 -2
  15. package/dist/declarations/src/schema/literal.d.ts +25 -2
  16. package/dist/declarations/src/schema/number.d.ts +25 -2
  17. package/dist/declarations/src/schema/object.d.ts +25 -2
  18. package/dist/declarations/src/schema/record.d.ts +25 -13
  19. package/dist/declarations/src/schema/richtext.d.ts +25 -2
  20. package/dist/declarations/src/schema/route.d.ts +25 -2
  21. package/dist/declarations/src/schema/string.d.ts +13 -2
  22. package/dist/declarations/src/schema/union.d.ts +32 -2
  23. package/dist/{index-4013c9f8.cjs.prod.js → index-77914667.cjs.prod.js} +1011 -192
  24. package/dist/{index-baa3109b.cjs.dev.js → index-bce560db.cjs.dev.js} +1011 -192
  25. package/dist/{index-005f51a5.esm.js → index-db33b67c.esm.js} +1011 -192
  26. package/dist/valbuild-core.cjs.dev.js +1 -1
  27. package/dist/valbuild-core.cjs.prod.js +1 -1
  28. package/dist/valbuild-core.esm.js +1 -1
  29. package/package.json +2 -2
  30. package/patch/dist/valbuild-core-patch.cjs.dev.js +1 -1
  31. package/patch/dist/valbuild-core-patch.cjs.prod.js +1 -1
  32. package/patch/dist/valbuild-core-patch.esm.js +2 -2
@@ -213,8 +213,32 @@ var Schema = /*#__PURE__*/function () {
213
213
  * For example, if you have an object schema, you must assert each key / value pair manually.
214
214
  */
215
215
  }, {
216
- key: "appendValidationError",
216
+ key: "executePreviewItem",
217
217
  value:
218
+ /**
219
+ * This value AS A PREVIEW — what a container's row, a reference dropdown or
220
+ * a search hit shows for it. Runs the schema's own `preview` closure;
221
+ * `null` when none is declared (the consumer falls back to a generic
222
+ * preview). A union dispatches to the matching member's closure.
223
+ *
224
+ * Containers call this on their ITEM schema per item — that is how
225
+ * `executePreview` reifies an {@link ArrayPreview} / {@link RecordPreview}
226
+ * from item-level declarations.
227
+ */
228
+ function executePreviewItem(src) {
229
+ return null;
230
+ }
231
+ /**
232
+ * Could {@link executePreviewItem} ever answer? A container reifies a rows
233
+ * preview only when its item schema says yes — asked here rather than by
234
+ * running the closure, so an EMPTY list still previews as an empty list
235
+ * instead of not at all.
236
+ */
237
+ }, {
238
+ key: "declaresItemPreview",
239
+ value: function declaresItemPreview() {
240
+ return false;
241
+ }
218
242
  // remote(): Src extends RemoteCompatibleSource
219
243
  // ? Schema<RemoteSource<Src>>
220
244
  // : never {
@@ -223,7 +247,9 @@ var Schema = /*#__PURE__*/function () {
223
247
  // }
224
248
 
225
249
  /** MUTATES! since internal and perf sensitive */
226
- function appendValidationError(current, path, message, value, schemaError) {
250
+ }, {
251
+ key: "appendValidationError",
252
+ value: function appendValidationError(current, path, message, value, schemaError) {
227
253
  if (current) {
228
254
  if (current[path]) {
229
255
  current[path].push({
@@ -420,6 +446,7 @@ var StringSchema = /*#__PURE__*/function (_Schema) {
420
446
  var isReadonly = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
421
447
  var isHidden = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : false;
422
448
  var description = arguments.length > 7 ? arguments[7] : undefined;
449
+ var previewInput = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : null;
423
450
  _classCallCheck(this, StringSchema);
424
451
  _this = _callSuper(this, StringSchema);
425
452
  _this.options = options;
@@ -430,13 +457,14 @@ var StringSchema = /*#__PURE__*/function (_Schema) {
430
457
  _this.isReadonly = isReadonly;
431
458
  _this.isHidden = isHidden;
432
459
  _this.description = description;
460
+ _this.previewInput = previewInput;
433
461
  return _this;
434
462
  }
435
463
  _inherits(StringSchema, _Schema);
436
464
  return _createClass(StringSchema, [{
437
465
  key: "describe",
438
466
  value: function describe(description) {
439
- return new StringSchema(this.options, this.opt, this.isRaw, this.customValidateFunctions, this.renderInput, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined);
467
+ return new StringSchema(this.options, this.opt, this.isRaw, this.customValidateFunctions, this.renderInput, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined, this.previewInput);
440
468
  }
441
469
 
442
470
  /**
@@ -452,7 +480,7 @@ var StringSchema = /*#__PURE__*/function (_Schema) {
452
480
  value: function minLength(_minLength) {
453
481
  return new StringSchema(_objectSpread2(_objectSpread2({}, this.options), {}, {
454
482
  minLength: _minLength
455
- }), this.opt, this.isRaw, this.customValidateFunctions, this.renderInput, this.isReadonly, this.isHidden, this.description);
483
+ }), this.opt, this.isRaw, this.customValidateFunctions, this.renderInput, this.isReadonly, this.isHidden, this.description, this.previewInput);
456
484
  }
457
485
 
458
486
  /**
@@ -468,7 +496,7 @@ var StringSchema = /*#__PURE__*/function (_Schema) {
468
496
  value: function maxLength(_maxLength) {
469
497
  return new StringSchema(_objectSpread2(_objectSpread2({}, this.options), {}, {
470
498
  maxLength: _maxLength
471
- }), this.opt, this.isRaw, this.customValidateFunctions, this.renderInput, this.isReadonly, this.isHidden, this.description);
499
+ }), this.opt, this.isRaw, this.customValidateFunctions, this.renderInput, this.isReadonly, this.isHidden, this.description, this.previewInput);
472
500
  }
473
501
  }, {
474
502
  key: "regexp",
@@ -476,12 +504,12 @@ var StringSchema = /*#__PURE__*/function (_Schema) {
476
504
  return new StringSchema(_objectSpread2(_objectSpread2({}, this.options), {}, {
477
505
  regexp: _regexp,
478
506
  regExpMessage: message
479
- }), this.opt, this.isRaw, this.customValidateFunctions, this.renderInput, this.isReadonly, this.isHidden, this.description);
507
+ }), this.opt, this.isRaw, this.customValidateFunctions, this.renderInput, this.isReadonly, this.isHidden, this.description, this.previewInput);
480
508
  }
481
509
  }, {
482
510
  key: "validate",
483
511
  value: function validate(validationFunction) {
484
- return new StringSchema(this.options, this.opt, this.isRaw, this.customValidateFunctions.concat(validationFunction), this.renderInput, this.isReadonly, this.isHidden, this.description);
512
+ return new StringSchema(this.options, this.opt, this.isRaw, this.customValidateFunctions.concat(validationFunction), this.renderInput, this.isReadonly, this.isHidden, this.description, this.previewInput);
485
513
  }
486
514
  }, {
487
515
  key: "executeValidate",
@@ -554,22 +582,22 @@ var StringSchema = /*#__PURE__*/function (_Schema) {
554
582
  }, {
555
583
  key: "nullable",
556
584
  value: function nullable() {
557
- return new StringSchema(this.options, true, this.isRaw, this.customValidateFunctions, this.renderInput, this.isReadonly, this.isHidden, this.description);
585
+ return new StringSchema(this.options, true, this.isRaw, this.customValidateFunctions, this.renderInput, this.isReadonly, this.isHidden, this.description, this.previewInput);
558
586
  }
559
587
  }, {
560
588
  key: "readonly",
561
589
  value: function readonly() {
562
- return new StringSchema(this.options, this.opt, this.isRaw, this.customValidateFunctions, this.renderInput, true, this.isHidden, this.description);
590
+ return new StringSchema(this.options, this.opt, this.isRaw, this.customValidateFunctions, this.renderInput, true, this.isHidden, this.description, this.previewInput);
563
591
  }
564
592
  }, {
565
593
  key: "hidden",
566
594
  value: function hidden() {
567
- return new StringSchema(this.options, this.opt, this.isRaw, this.customValidateFunctions, this.renderInput, this.isReadonly, true, this.description);
595
+ return new StringSchema(this.options, this.opt, this.isRaw, this.customValidateFunctions, this.renderInput, this.isReadonly, true, this.description, this.previewInput);
568
596
  }
569
597
  }, {
570
598
  key: "raw",
571
599
  value: function raw() {
572
- return new StringSchema(this.options, this.opt, true, this.customValidateFunctions, this.renderInput, this.isReadonly, this.isHidden, this.description);
600
+ return new StringSchema(this.options, this.opt, true, this.customValidateFunctions, this.renderInput, this.isReadonly, this.isHidden, this.description, this.previewInput);
573
601
  }
574
602
  }, {
575
603
  key: "executeCustomValidateAt",
@@ -585,6 +613,7 @@ var StringSchema = /*#__PURE__*/function (_Schema) {
585
613
  return {
586
614
  type: "string",
587
615
  render: (_this$renderInput = this.renderInput) !== null && _this$renderInput !== void 0 ? _this$renderInput : undefined,
616
+ preview: this.previewInput ? true : undefined,
588
617
  options: {
589
618
  maxLength: (_this$options4 = this.options) === null || _this$options4 === void 0 ? void 0 : _this$options4.maxLength,
590
619
  minLength: (_this$options5 = this.options) === null || _this$options5 === void 0 ? void 0 : _this$options5.minLength,
@@ -614,7 +643,33 @@ var StringSchema = /*#__PURE__*/function (_Schema) {
614
643
  }, {
615
644
  key: "render",
616
645
  value: function render(input) {
617
- return new StringSchema(this.options, this.opt, this.isRaw, this.customValidateFunctions, input, this.isReadonly, this.isHidden, this.description);
646
+ return new StringSchema(this.options, this.opt, this.isRaw, this.customValidateFunctions, input, this.isReadonly, this.isHidden, this.description, this.previewInput);
647
+ }
648
+
649
+ /**
650
+ * How this VALUE is shown where a preview of it is needed — a row in a
651
+ * sortable list, a reference dropdown, a search hit. Never how the field
652
+ * itself is edited (that is `render`). See `preview.ts`.
653
+ */
654
+ }, {
655
+ key: "preview",
656
+ value: function preview(select) {
657
+ return new StringSchema(this.options, this.opt, this.isRaw, this.customValidateFunctions, this.renderInput, this.isReadonly, this.isHidden, this.description, select);
658
+ }
659
+ }, {
660
+ key: "executePreviewItem",
661
+ value: function executePreviewItem(src) {
662
+ if (this.previewInput === null) {
663
+ return null;
664
+ }
665
+ return this.previewInput({
666
+ val: src
667
+ });
668
+ }
669
+ }, {
670
+ key: "declaresItemPreview",
671
+ value: function declaresItemPreview() {
672
+ return this.previewInput !== null;
618
673
  }
619
674
 
620
675
  /**
@@ -641,6 +696,8 @@ var ObjectSchema = /*#__PURE__*/function (_Schema) {
641
696
  var isReadonly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
642
697
  var isHidden = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
643
698
  var description = arguments.length > 5 ? arguments[5] : undefined;
699
+ var renderInput = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;
700
+ var previewInput = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
644
701
  _classCallCheck(this, ObjectSchema);
645
702
  _this = _callSuper(this, ObjectSchema);
646
703
  _this.items = items;
@@ -649,18 +706,20 @@ var ObjectSchema = /*#__PURE__*/function (_Schema) {
649
706
  _this.isReadonly = isReadonly;
650
707
  _this.isHidden = isHidden;
651
708
  _this.description = description;
709
+ _this.renderInput = renderInput;
710
+ _this.previewInput = previewInput;
652
711
  return _this;
653
712
  }
654
713
  _inherits(ObjectSchema, _Schema);
655
714
  return _createClass(ObjectSchema, [{
656
715
  key: "describe",
657
716
  value: function describe(description) {
658
- return new ObjectSchema(this.items, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined);
717
+ return new ObjectSchema(this.items, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined, this.renderInput, this.previewInput);
659
718
  }
660
719
  }, {
661
720
  key: "validate",
662
721
  value: function validate(validationFunction) {
663
- return new ObjectSchema(this.items, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description);
722
+ return new ObjectSchema(this.items, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
664
723
  }
665
724
  }, {
666
725
  key: "executeValidate",
@@ -780,17 +839,18 @@ var ObjectSchema = /*#__PURE__*/function (_Schema) {
780
839
  }, {
781
840
  key: "nullable",
782
841
  value: function nullable() {
783
- return new ObjectSchema(this.items, true, [], this.isReadonly, this.isHidden, this.description);
842
+ // Explicit type args: `previewInput` would otherwise pin inference to `Src`.
843
+ return new ObjectSchema(this.items, true, [], this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
784
844
  }
785
845
  }, {
786
846
  key: "readonly",
787
847
  value: function readonly() {
788
- return new ObjectSchema(this.items, this.opt, this.customValidateFunctions, true, this.isHidden, this.description);
848
+ return new ObjectSchema(this.items, this.opt, this.customValidateFunctions, true, this.isHidden, this.description, this.renderInput, this.previewInput);
789
849
  }
790
850
  }, {
791
851
  key: "hidden",
792
852
  value: function hidden() {
793
- return new ObjectSchema(this.items, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description);
853
+ return new ObjectSchema(this.items, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description, this.renderInput, this.previewInput);
794
854
  }
795
855
  }, {
796
856
  key: "executeCustomValidateAt",
@@ -799,12 +859,53 @@ var ObjectSchema = /*#__PURE__*/function (_Schema) {
799
859
  path: path
800
860
  });
801
861
  }
862
+
863
+ /**
864
+ * How this field is laid out in the editor when it is the item of an array
865
+ * or record: `{ as: "inline" }` renders the field itself inside each row,
866
+ * instead of a preview row that navigates to it.
867
+ *
868
+ * Static configuration, not a callback — see `render.ts`.
869
+ */
870
+ }, {
871
+ key: "render",
872
+ value: function render(input) {
873
+ return new ObjectSchema(this.items, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, input, this.previewInput);
874
+ }
875
+
876
+ /**
877
+ * How this VALUE is shown where a preview of it is needed — a row in a
878
+ * sortable list, a reference dropdown, a search hit. Never how the field
879
+ * itself is edited (that is `render`). See `preview.ts`.
880
+ */
881
+ }, {
882
+ key: "preview",
883
+ value: function preview(select) {
884
+ return new ObjectSchema(this.items, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, select);
885
+ }
886
+ }, {
887
+ key: "executePreviewItem",
888
+ value: function executePreviewItem(src) {
889
+ if (this.previewInput === null) {
890
+ return null;
891
+ }
892
+ return this.previewInput({
893
+ val: src
894
+ });
895
+ }
896
+ }, {
897
+ key: "declaresItemPreview",
898
+ value: function declaresItemPreview() {
899
+ return this.previewInput !== null;
900
+ }
802
901
  }, {
803
902
  key: "executeSerialize",
804
903
  value: function executeSerialize() {
805
- var _this$customValidateF;
904
+ var _this$renderInput, _this$customValidateF;
806
905
  return {
807
906
  type: "object",
907
+ render: (_this$renderInput = this.renderInput) !== null && _this$renderInput !== void 0 ? _this$renderInput : undefined,
908
+ preview: this.previewInput ? true : undefined,
808
909
  items: Object.fromEntries(Object.entries(this.items).map(function (_ref5) {
809
910
  var _ref6 = _slicedToArray(_ref5, 2),
810
911
  key = _ref6[0],
@@ -865,6 +966,7 @@ var ArraySchema = /*#__PURE__*/function (_Schema) {
865
966
  var isHidden = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
866
967
  var description = arguments.length > 5 ? arguments[5] : undefined;
867
968
  var previewInput = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;
969
+ var renderInput = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
868
970
  _classCallCheck(this, ArraySchema);
869
971
  _this = _callSuper(this, ArraySchema);
870
972
  _this.item = item;
@@ -874,18 +976,19 @@ var ArraySchema = /*#__PURE__*/function (_Schema) {
874
976
  _this.isHidden = isHidden;
875
977
  _this.description = description;
876
978
  _this.previewInput = previewInput;
979
+ _this.renderInput = renderInput;
877
980
  return _this;
878
981
  }
879
982
  _inherits(ArraySchema, _Schema);
880
983
  return _createClass(ArraySchema, [{
881
984
  key: "describe",
882
985
  value: function describe(description) {
883
- return new ArraySchema(this.item, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined, this.previewInput);
986
+ return new ArraySchema(this.item, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined, this.previewInput, this.renderInput);
884
987
  }
885
988
  }, {
886
989
  key: "validate",
887
990
  value: function validate(validationFunction) {
888
- return new ArraySchema(this.item, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description, this.previewInput);
991
+ return new ArraySchema(this.item, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description, this.previewInput, this.renderInput);
889
992
  }
890
993
  }, {
891
994
  key: "executeValidate",
@@ -952,17 +1055,18 @@ var ArraySchema = /*#__PURE__*/function (_Schema) {
952
1055
  }, {
953
1056
  key: "nullable",
954
1057
  value: function nullable() {
955
- return new ArraySchema(this.item, true, [], this.isReadonly, this.isHidden, this.description, this.previewInput);
1058
+ // Explicit type args: `previewInput` would otherwise pin inference to `Src`.
1059
+ return new ArraySchema(this.item, true, [], this.isReadonly, this.isHidden, this.description, this.previewInput, this.renderInput);
956
1060
  }
957
1061
  }, {
958
1062
  key: "readonly",
959
1063
  value: function readonly() {
960
- return new ArraySchema(this.item, this.opt, this.customValidateFunctions, true, this.isHidden, this.description, this.previewInput);
1064
+ return new ArraySchema(this.item, this.opt, this.customValidateFunctions, true, this.isHidden, this.description, this.previewInput, this.renderInput);
961
1065
  }
962
1066
  }, {
963
1067
  key: "hidden",
964
1068
  value: function hidden() {
965
- return new ArraySchema(this.item, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description, this.previewInput);
1069
+ return new ArraySchema(this.item, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description, this.previewInput, this.renderInput);
966
1070
  }
967
1071
  }, {
968
1072
  key: "executeCustomValidateAt",
@@ -974,9 +1078,10 @@ var ArraySchema = /*#__PURE__*/function (_Schema) {
974
1078
  }, {
975
1079
  key: "executeSerialize",
976
1080
  value: function executeSerialize() {
977
- var _this$customValidateF;
1081
+ var _this$renderInput, _this$customValidateF;
978
1082
  return {
979
1083
  type: "array",
1084
+ render: (_this$renderInput = this.renderInput) !== null && _this$renderInput !== void 0 ? _this$renderInput : undefined,
980
1085
  item: this.item["executeSerialize"](),
981
1086
  opt: this.opt,
982
1087
  preview: this.previewInput ? true : undefined,
@@ -1009,8 +1114,10 @@ var ArraySchema = /*#__PURE__*/function (_Schema) {
1009
1114
  res[_key] = itemResult[_key];
1010
1115
  }
1011
1116
  }
1012
- if (this.previewInput) {
1013
- var select = this.previewInput;
1117
+ // The rows preview comes from the ITEM schema's own `preview` — the
1118
+ // container just runs it per row. Asked as a fact rather than by running
1119
+ // the closure, so an empty list still previews as an empty list.
1120
+ if (this.item["declaresItemPreview"]()) {
1014
1121
  // The whole list when the LIST is what is being shown; only the wanted
1015
1122
  // rows when it is not. The user's closure is the real expense — a list
1016
1123
  // view asks for the container and gets every row, a single field asks for
@@ -1021,26 +1128,30 @@ var ArraySchema = /*#__PURE__*/function (_Schema) {
1021
1128
  var window = scope !== undefined && !scope.wants(sourcePath) ? scope : null;
1022
1129
  var items = [];
1023
1130
  for (var index = 0; index < src.length; index++) {
1131
+ var _itemSrc = src[index];
1132
+ if (_itemSrc === null || _itemSrc === undefined) {
1133
+ continue;
1134
+ }
1024
1135
  if (window !== null && !window.wantsUnder(unsafeCreateSourcePath(sourcePath, index))) {
1025
1136
  continue;
1026
1137
  }
1027
- // Per ITEM, not per list, matching what `record` already does: the
1028
- // closure is user code, and one row whose data trips it up must not take
1029
- // out the whole list. Before scoping, one throwing row produced an error
1030
- // at the container and no items at all.
1138
+ // Per ITEM, not per list: the closure is user code, and one row whose
1139
+ // data trips it up must not take out the whole list. Before scoping,
1140
+ // one throwing row produced an error at the container and no items at
1141
+ // all.
1031
1142
  try {
1032
1143
  // NB NB: display is actually defined by the user
1033
- var _select = select({
1034
- val: src[index]
1035
- }),
1036
- title = _select.title,
1037
- subtitle = _select.subtitle,
1038
- image = _select.image;
1039
- items.push([index, {
1040
- title: title,
1041
- subtitle: subtitle,
1042
- image: image
1043
- }]);
1144
+ var _item = this.item["executePreviewItem"](_itemSrc);
1145
+ if (_item !== null) {
1146
+ var title = _item.title,
1147
+ subtitle = _item.subtitle,
1148
+ image = _item.image;
1149
+ items.push([index, {
1150
+ title: title,
1151
+ subtitle: subtitle,
1152
+ image: image
1153
+ }]);
1154
+ }
1044
1155
  } catch (e) {
1045
1156
  res[unsafeCreateSourcePath(sourcePath, index)] = {
1046
1157
  status: "error",
@@ -1058,18 +1169,45 @@ var ArraySchema = /*#__PURE__*/function (_Schema) {
1058
1169
  }
1059
1170
  return res;
1060
1171
  }
1172
+ }, {
1173
+ key: "executePreviewItem",
1174
+ value: function executePreviewItem(src) {
1175
+ if (this.previewInput === null) {
1176
+ return null;
1177
+ }
1178
+ return this.previewInput({
1179
+ val: src
1180
+ });
1181
+ }
1182
+ }, {
1183
+ key: "declaresItemPreview",
1184
+ value: function declaresItemPreview() {
1185
+ return this.previewInput !== null;
1186
+ }
1061
1187
 
1062
1188
  /**
1063
- * What the editor shows for each ITEM of this array: a title, and optionally a
1064
- * subtitle and an image.
1065
- *
1066
- * `select` is your own code over the item's source, so it is run on demand for
1067
- * the rows that are actually being looked at — see `PreviewScope`.
1189
+ * How this ARRAY ITSELF is shown where a preview of it is needed — when it
1190
+ * is the item of another container, in search, in references. What its rows
1191
+ * show is the ITEM schema's `preview`, not this. Never how the field is
1192
+ * edited (that is `render`). See `preview.ts`.
1068
1193
  */
1069
1194
  }, {
1070
1195
  key: "preview",
1071
1196
  value: function preview(select) {
1072
- return new ArraySchema(this.item, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, select);
1197
+ return new ArraySchema(this.item, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, select, this.renderInput);
1198
+ }
1199
+
1200
+ /**
1201
+ * How this field is laid out in the editor when it is the item of an array
1202
+ * or record: `{ as: "inline" }` renders the field itself inside each row,
1203
+ * instead of a preview row that navigates to it.
1204
+ *
1205
+ * Static configuration, not a callback — see `render.ts`.
1206
+ */
1207
+ }, {
1208
+ key: "render",
1209
+ value: function render(input) {
1210
+ return new ArraySchema(this.item, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.previewInput, input);
1073
1211
  }
1074
1212
  }]);
1075
1213
  }(Schema);
@@ -1085,6 +1223,8 @@ var LiteralSchema = /*#__PURE__*/function (_Schema) {
1085
1223
  var isReadonly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
1086
1224
  var isHidden = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
1087
1225
  var description = arguments.length > 5 ? arguments[5] : undefined;
1226
+ var renderInput = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;
1227
+ var previewInput = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
1088
1228
  _classCallCheck(this, LiteralSchema);
1089
1229
  _this = _callSuper(this, LiteralSchema);
1090
1230
  _this.value = value;
@@ -1093,18 +1233,20 @@ var LiteralSchema = /*#__PURE__*/function (_Schema) {
1093
1233
  _this.isReadonly = isReadonly;
1094
1234
  _this.isHidden = isHidden;
1095
1235
  _this.description = description;
1236
+ _this.renderInput = renderInput;
1237
+ _this.previewInput = previewInput;
1096
1238
  return _this;
1097
1239
  }
1098
1240
  _inherits(LiteralSchema, _Schema);
1099
1241
  return _createClass(LiteralSchema, [{
1100
1242
  key: "describe",
1101
1243
  value: function describe(description) {
1102
- return new LiteralSchema(this.value, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined);
1244
+ return new LiteralSchema(this.value, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined, this.renderInput, this.previewInput);
1103
1245
  }
1104
1246
  }, {
1105
1247
  key: "validate",
1106
1248
  value: function validate(validationFunction) {
1107
- return new LiteralSchema(this.value, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description);
1249
+ return new LiteralSchema(this.value, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
1108
1250
  }
1109
1251
  }, {
1110
1252
  key: "executeValidate",
@@ -1167,17 +1309,17 @@ var LiteralSchema = /*#__PURE__*/function (_Schema) {
1167
1309
  }, {
1168
1310
  key: "nullable",
1169
1311
  value: function nullable() {
1170
- return new LiteralSchema(this.value, true, [], this.isReadonly, this.isHidden, this.description);
1312
+ return new LiteralSchema(this.value, true, [], this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
1171
1313
  }
1172
1314
  }, {
1173
1315
  key: "readonly",
1174
1316
  value: function readonly() {
1175
- return new LiteralSchema(this.value, this.opt, this.customValidateFunctions, true, this.isHidden, this.description);
1317
+ return new LiteralSchema(this.value, this.opt, this.customValidateFunctions, true, this.isHidden, this.description, this.renderInput, this.previewInput);
1176
1318
  }
1177
1319
  }, {
1178
1320
  key: "hidden",
1179
1321
  value: function hidden() {
1180
- return new LiteralSchema(this.value, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description);
1322
+ return new LiteralSchema(this.value, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description, this.renderInput, this.previewInput);
1181
1323
  }
1182
1324
  }, {
1183
1325
  key: "executeCustomValidateAt",
@@ -1186,12 +1328,53 @@ var LiteralSchema = /*#__PURE__*/function (_Schema) {
1186
1328
  path: path
1187
1329
  });
1188
1330
  }
1331
+
1332
+ /**
1333
+ * How this field is laid out in the editor when it is the item of an array
1334
+ * or record: `{ as: "inline" }` renders the field itself inside each row,
1335
+ * instead of a preview row that navigates to it.
1336
+ *
1337
+ * Static configuration, not a callback — see `render.ts`.
1338
+ */
1339
+ }, {
1340
+ key: "render",
1341
+ value: function render(input) {
1342
+ return new LiteralSchema(this.value, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, input, this.previewInput);
1343
+ }
1344
+
1345
+ /**
1346
+ * How this VALUE is shown where a preview of it is needed — a row in a
1347
+ * sortable list, a reference dropdown, a search hit. Never how the field
1348
+ * itself is edited (that is `render`). See `preview.ts`.
1349
+ */
1350
+ }, {
1351
+ key: "preview",
1352
+ value: function preview(select) {
1353
+ return new LiteralSchema(this.value, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, select);
1354
+ }
1355
+ }, {
1356
+ key: "executePreviewItem",
1357
+ value: function executePreviewItem(src) {
1358
+ if (this.previewInput === null) {
1359
+ return null;
1360
+ }
1361
+ return this.previewInput({
1362
+ val: src
1363
+ });
1364
+ }
1365
+ }, {
1366
+ key: "declaresItemPreview",
1367
+ value: function declaresItemPreview() {
1368
+ return this.previewInput !== null;
1369
+ }
1189
1370
  }, {
1190
1371
  key: "executeSerialize",
1191
1372
  value: function executeSerialize() {
1192
- var _this$customValidateF;
1373
+ var _this$renderInput, _this$customValidateF;
1193
1374
  return {
1194
1375
  type: "literal",
1376
+ render: (_this$renderInput = this.renderInput) !== null && _this$renderInput !== void 0 ? _this$renderInput : undefined,
1377
+ preview: this.previewInput ? true : undefined,
1195
1378
  value: this.value,
1196
1379
  opt: this.opt,
1197
1380
  customValidate: this.customValidateFunctions && ((_this$customValidateF = this.customValidateFunctions) === null || _this$customValidateF === void 0 ? void 0 : _this$customValidateF.length) > 0,
@@ -1219,6 +1402,8 @@ var UnionSchema = /*#__PURE__*/function (_Schema) {
1219
1402
  var isReadonly = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
1220
1403
  var isHidden = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
1221
1404
  var description = arguments.length > 6 ? arguments[6] : undefined;
1405
+ var renderInput = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
1406
+ var previewInput = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : null;
1222
1407
  _classCallCheck(this, UnionSchema);
1223
1408
  _this = _callSuper(this, UnionSchema);
1224
1409
  _this.key = key;
@@ -1228,18 +1413,20 @@ var UnionSchema = /*#__PURE__*/function (_Schema) {
1228
1413
  _this.isReadonly = isReadonly;
1229
1414
  _this.isHidden = isHidden;
1230
1415
  _this.description = description;
1416
+ _this.renderInput = renderInput;
1417
+ _this.previewInput = previewInput;
1231
1418
  return _this;
1232
1419
  }
1233
1420
  _inherits(UnionSchema, _Schema);
1234
1421
  return _createClass(UnionSchema, [{
1235
1422
  key: "describe",
1236
1423
  value: function describe(description) {
1237
- return new UnionSchema(this.key, this.items, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined);
1424
+ return new UnionSchema(this.key, this.items, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined, this.renderInput, this.previewInput);
1238
1425
  }
1239
1426
  }, {
1240
1427
  key: "validate",
1241
1428
  value: function validate(validationFunction) {
1242
- return new UnionSchema(this.key, this.items, this.opt, this.customValidateFunctions.concat(validationFunction), this.isReadonly, this.isHidden, this.description);
1429
+ return new UnionSchema(this.key, this.items, this.opt, this.customValidateFunctions.concat(validationFunction), this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
1243
1430
  }
1244
1431
  }, {
1245
1432
  key: "executeValidate",
@@ -1532,17 +1719,18 @@ var UnionSchema = /*#__PURE__*/function (_Schema) {
1532
1719
  }, {
1533
1720
  key: "nullable",
1534
1721
  value: function nullable() {
1535
- return new UnionSchema(this.key, this.items, true, [], this.isReadonly, this.isHidden, this.description);
1722
+ // Explicit type args: `previewInput` would otherwise pin inference to `Src`.
1723
+ return new UnionSchema(this.key, this.items, true, [], this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
1536
1724
  }
1537
1725
  }, {
1538
1726
  key: "readonly",
1539
1727
  value: function readonly() {
1540
- return new UnionSchema(this.key, this.items, this.opt, this.customValidateFunctions, true, this.isHidden, this.description);
1728
+ return new UnionSchema(this.key, this.items, this.opt, this.customValidateFunctions, true, this.isHidden, this.description, this.renderInput, this.previewInput);
1541
1729
  }
1542
1730
  }, {
1543
1731
  key: "hidden",
1544
1732
  value: function hidden() {
1545
- return new UnionSchema(this.key, this.items, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description);
1733
+ return new UnionSchema(this.key, this.items, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description, this.renderInput, this.previewInput);
1546
1734
  }
1547
1735
  }, {
1548
1736
  key: "executeCustomValidateAt",
@@ -1602,14 +1790,69 @@ var UnionSchema = /*#__PURE__*/function (_Schema) {
1602
1790
  }
1603
1791
  return null;
1604
1792
  }
1793
+
1794
+ /**
1795
+ * How this field is laid out in the editor when it is the item of an array
1796
+ * or record: `{ as: "inline" }` renders the field itself inside each row,
1797
+ * instead of a preview row that navigates to it.
1798
+ *
1799
+ * Static configuration, not a callback — see `render.ts`.
1800
+ */
1801
+ }, {
1802
+ key: "render",
1803
+ value: function render(input) {
1804
+ return new UnionSchema(this.key, this.items, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, input, this.previewInput);
1805
+ }
1806
+
1807
+ /**
1808
+ * How this VALUE is shown where a preview of it is needed — a row in a
1809
+ * sortable list, a reference dropdown, a search hit. Never how the field
1810
+ * itself is edited (that is `render`). See `preview.ts`.
1811
+ *
1812
+ * Without one of its own, a tagged union previews as the VARIANT the value
1813
+ * takes — declare `preview` on the member objects and the union dispatches.
1814
+ */
1815
+ }, {
1816
+ key: "preview",
1817
+ value: function preview(select) {
1818
+ return new UnionSchema(this.key, this.items, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, select);
1819
+ }
1820
+ }, {
1821
+ key: "executePreviewItem",
1822
+ value: function executePreviewItem(src) {
1823
+ if (this.previewInput !== null) {
1824
+ return this.previewInput({
1825
+ val: src
1826
+ });
1827
+ }
1828
+ // Only the union knows which variant the value takes; the variant's own
1829
+ // `preview` is what it previews as.
1830
+ var matched = this.matchedVariant(src);
1831
+ if (matched) {
1832
+ return matched["executePreviewItem"](src);
1833
+ }
1834
+ return null;
1835
+ }
1836
+ }, {
1837
+ key: "declaresItemPreview",
1838
+ value: function declaresItemPreview() {
1839
+ if (this.previewInput !== null) {
1840
+ return true;
1841
+ }
1842
+ return Array.isArray(this.items) && this.items.some(function (item) {
1843
+ return item["declaresItemPreview"]();
1844
+ });
1845
+ }
1605
1846
  }, {
1606
1847
  key: "executeSerialize",
1607
1848
  value: function executeSerialize() {
1608
- var _this$customValidateF2;
1849
+ var _this$renderInput2, _this$customValidateF2;
1609
1850
  if (typeof this.key === "string") {
1610
- var _this$customValidateF;
1851
+ var _this$renderInput, _this$customValidateF;
1611
1852
  return {
1612
1853
  type: "union",
1854
+ render: (_this$renderInput = this.renderInput) !== null && _this$renderInput !== void 0 ? _this$renderInput : undefined,
1855
+ preview: this.previewInput ? true : undefined,
1613
1856
  key: this.key,
1614
1857
  items: this.items.map(function (o) {
1615
1858
  return o["executeSerialize"]();
@@ -1623,6 +1866,8 @@ var UnionSchema = /*#__PURE__*/function (_Schema) {
1623
1866
  }
1624
1867
  return {
1625
1868
  type: "union",
1869
+ render: (_this$renderInput2 = this.renderInput) !== null && _this$renderInput2 !== void 0 ? _this$renderInput2 : undefined,
1870
+ preview: this.previewInput ? true : undefined,
1626
1871
  key: this.key["executeSerialize"](),
1627
1872
  items: this.items.map(function (o) {
1628
1873
  return o["executeSerialize"]();
@@ -1859,6 +2104,8 @@ var ImageSchema = /*#__PURE__*/function (_Schema) {
1859
2104
  var isReadonly = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
1860
2105
  var isHidden = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : false;
1861
2106
  var description = arguments.length > 7 ? arguments[7] : undefined;
2107
+ var renderInput = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : null;
2108
+ var previewInput = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : null;
1862
2109
  _classCallCheck(this, ImageSchema);
1863
2110
  _this = _callSuper(this, ImageSchema);
1864
2111
  _this.options = options;
@@ -1869,23 +2116,25 @@ var ImageSchema = /*#__PURE__*/function (_Schema) {
1869
2116
  _this.isReadonly = isReadonly;
1870
2117
  _this.isHidden = isHidden;
1871
2118
  _this.description = description;
2119
+ _this.renderInput = renderInput;
2120
+ _this.previewInput = previewInput;
1872
2121
  return _this;
1873
2122
  }
1874
2123
  _inherits(ImageSchema, _Schema);
1875
2124
  return _createClass(ImageSchema, [{
1876
2125
  key: "describe",
1877
2126
  value: function describe(description) {
1878
- return new ImageSchema(this.options, this.opt, this.isRemote, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined);
2127
+ return new ImageSchema(this.options, this.opt, this.isRemote, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined, this.renderInput, this.previewInput);
1879
2128
  }
1880
2129
  }, {
1881
2130
  key: "remote",
1882
2131
  value: function remote() {
1883
- return new ImageSchema(this.options, this.opt, true, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, this.isHidden, this.description);
2132
+ return new ImageSchema(this.options, this.opt, true, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
1884
2133
  }
1885
2134
  }, {
1886
2135
  key: "validate",
1887
2136
  value: function validate(validationFunction) {
1888
- return new ImageSchema(this.options, this.opt, this.isRemote, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.moduleMetadata, this.isReadonly, this.isHidden, this.description);
2137
+ return new ImageSchema(this.options, this.opt, this.isRemote, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.moduleMetadata, this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
1889
2138
  }
1890
2139
  }, {
1891
2140
  key: "executeValidate",
@@ -2084,17 +2333,17 @@ var ImageSchema = /*#__PURE__*/function (_Schema) {
2084
2333
  }, {
2085
2334
  key: "nullable",
2086
2335
  value: function nullable() {
2087
- return new ImageSchema(this.options, true, this.isRemote, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, this.isHidden, this.description);
2336
+ return new ImageSchema(this.options, true, this.isRemote, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
2088
2337
  }
2089
2338
  }, {
2090
2339
  key: "readonly",
2091
2340
  value: function readonly() {
2092
- return new ImageSchema(this.options, this.opt, this.isRemote, this.customValidateFunctions, this.moduleMetadata, true, this.isHidden, this.description);
2341
+ return new ImageSchema(this.options, this.opt, this.isRemote, this.customValidateFunctions, this.moduleMetadata, true, this.isHidden, this.description, this.renderInput, this.previewInput);
2093
2342
  }
2094
2343
  }, {
2095
2344
  key: "hidden",
2096
2345
  value: function hidden() {
2097
- return new ImageSchema(this.options, this.opt, this.isRemote, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, true, this.description);
2346
+ return new ImageSchema(this.options, this.opt, this.isRemote, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, true, this.description, this.renderInput, this.previewInput);
2098
2347
  }
2099
2348
  }, {
2100
2349
  key: "executeCustomValidateAt",
@@ -2103,13 +2352,54 @@ var ImageSchema = /*#__PURE__*/function (_Schema) {
2103
2352
  path: path
2104
2353
  });
2105
2354
  }
2355
+
2356
+ /**
2357
+ * How this field is laid out in the editor when it is the item of an array
2358
+ * or record: `{ as: "inline" }` renders the field itself inside each row,
2359
+ * instead of a preview row that navigates to it.
2360
+ *
2361
+ * Static configuration, not a callback — see `render.ts`.
2362
+ */
2363
+ }, {
2364
+ key: "render",
2365
+ value: function render(input) {
2366
+ return new ImageSchema(this.options, this.opt, this.isRemote, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, this.isHidden, this.description, input, this.previewInput);
2367
+ }
2368
+
2369
+ /**
2370
+ * How this VALUE is shown where a preview of it is needed — a row in a
2371
+ * sortable list, a reference dropdown, a search hit. Never how the field
2372
+ * itself is edited (that is `render`). See `preview.ts`.
2373
+ */
2374
+ }, {
2375
+ key: "preview",
2376
+ value: function preview(select) {
2377
+ return new ImageSchema(this.options, this.opt, this.isRemote, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, this.isHidden, this.description, this.renderInput, select);
2378
+ }
2379
+ }, {
2380
+ key: "executePreviewItem",
2381
+ value: function executePreviewItem(src) {
2382
+ if (this.previewInput === null) {
2383
+ return null;
2384
+ }
2385
+ return this.previewInput({
2386
+ val: src
2387
+ });
2388
+ }
2389
+ }, {
2390
+ key: "declaresItemPreview",
2391
+ value: function declaresItemPreview() {
2392
+ return this.previewInput !== null;
2393
+ }
2106
2394
  }, {
2107
2395
  key: "executeSerialize",
2108
2396
  value: function executeSerialize() {
2109
- var _this$customValidateF;
2397
+ var _this$renderInput, _this$customValidateF;
2110
2398
  var modulePaths = this.moduleMetadata ? Object.keys(this.moduleMetadata) : [];
2111
2399
  return {
2112
2400
  type: "image",
2401
+ render: (_this$renderInput = this.renderInput) !== null && _this$renderInput !== void 0 ? _this$renderInput : undefined,
2402
+ preview: this.previewInput ? true : undefined,
2113
2403
  options: this.options,
2114
2404
  opt: this.opt,
2115
2405
  remote: this.isRemote,
@@ -2160,6 +2450,8 @@ var RouteSchema = /*#__PURE__*/function (_Schema) {
2160
2450
  var isReadonly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
2161
2451
  var isHidden = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
2162
2452
  var description = arguments.length > 5 ? arguments[5] : undefined;
2453
+ var renderInput = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;
2454
+ var previewInput = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
2163
2455
  _classCallCheck(this, RouteSchema);
2164
2456
  _this = _callSuper(this, RouteSchema);
2165
2457
  _this.options = options;
@@ -2168,13 +2460,15 @@ var RouteSchema = /*#__PURE__*/function (_Schema) {
2168
2460
  _this.isReadonly = isReadonly;
2169
2461
  _this.isHidden = isHidden;
2170
2462
  _this.description = description;
2463
+ _this.renderInput = renderInput;
2464
+ _this.previewInput = previewInput;
2171
2465
  return _this;
2172
2466
  }
2173
2467
  _inherits(RouteSchema, _Schema);
2174
2468
  return _createClass(RouteSchema, [{
2175
2469
  key: "describe",
2176
2470
  value: function describe(description) {
2177
- return new RouteSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined);
2471
+ return new RouteSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined, this.renderInput, this.previewInput);
2178
2472
  }
2179
2473
 
2180
2474
  /**
@@ -2194,7 +2488,7 @@ var RouteSchema = /*#__PURE__*/function (_Schema) {
2194
2488
  value: function include(pattern) {
2195
2489
  return new RouteSchema(_objectSpread2(_objectSpread2({}, this.options), {}, {
2196
2490
  include: pattern
2197
- }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description);
2491
+ }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
2198
2492
  }
2199
2493
 
2200
2494
  /**
@@ -2214,12 +2508,12 @@ var RouteSchema = /*#__PURE__*/function (_Schema) {
2214
2508
  value: function exclude(pattern) {
2215
2509
  return new RouteSchema(_objectSpread2(_objectSpread2({}, this.options), {}, {
2216
2510
  exclude: pattern
2217
- }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description);
2511
+ }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
2218
2512
  }
2219
2513
  }, {
2220
2514
  key: "validate",
2221
2515
  value: function validate(validationFunction) {
2222
- return new RouteSchema(this.options, this.opt, this.customValidateFunctions.concat(validationFunction), this.isReadonly, this.isHidden, this.description);
2516
+ return new RouteSchema(this.options, this.opt, this.customValidateFunctions.concat(validationFunction), this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
2223
2517
  }
2224
2518
  }, {
2225
2519
  key: "executeValidate",
@@ -2274,17 +2568,17 @@ var RouteSchema = /*#__PURE__*/function (_Schema) {
2274
2568
  }, {
2275
2569
  key: "nullable",
2276
2570
  value: function nullable() {
2277
- return new RouteSchema(this.options, true, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description);
2571
+ return new RouteSchema(this.options, true, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
2278
2572
  }
2279
2573
  }, {
2280
2574
  key: "readonly",
2281
2575
  value: function readonly() {
2282
- return new RouteSchema(this.options, this.opt, this.customValidateFunctions, true, this.isHidden, this.description);
2576
+ return new RouteSchema(this.options, this.opt, this.customValidateFunctions, true, this.isHidden, this.description, this.renderInput, this.previewInput);
2283
2577
  }
2284
2578
  }, {
2285
2579
  key: "hidden",
2286
2580
  value: function hidden() {
2287
- return new RouteSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description);
2581
+ return new RouteSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description, this.renderInput, this.previewInput);
2288
2582
  }
2289
2583
  }, {
2290
2584
  key: "executeCustomValidateAt",
@@ -2293,12 +2587,53 @@ var RouteSchema = /*#__PURE__*/function (_Schema) {
2293
2587
  path: path
2294
2588
  });
2295
2589
  }
2590
+
2591
+ /**
2592
+ * How this field is laid out in the editor when it is the item of an array
2593
+ * or record: `{ as: "inline" }` renders the field itself inside each row,
2594
+ * instead of a preview row that navigates to it.
2595
+ *
2596
+ * Static configuration, not a callback — see `render.ts`.
2597
+ */
2598
+ }, {
2599
+ key: "render",
2600
+ value: function render(input) {
2601
+ return new RouteSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, input, this.previewInput);
2602
+ }
2603
+
2604
+ /**
2605
+ * How this VALUE is shown where a preview of it is needed — a row in a
2606
+ * sortable list, a reference dropdown, a search hit. Never how the field
2607
+ * itself is edited (that is `render`). See `preview.ts`.
2608
+ */
2609
+ }, {
2610
+ key: "preview",
2611
+ value: function preview(select) {
2612
+ return new RouteSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, select);
2613
+ }
2614
+ }, {
2615
+ key: "executePreviewItem",
2616
+ value: function executePreviewItem(src) {
2617
+ if (this.previewInput === null) {
2618
+ return null;
2619
+ }
2620
+ return this.previewInput({
2621
+ val: src
2622
+ });
2623
+ }
2624
+ }, {
2625
+ key: "declaresItemPreview",
2626
+ value: function declaresItemPreview() {
2627
+ return this.previewInput !== null;
2628
+ }
2296
2629
  }, {
2297
2630
  key: "executeSerialize",
2298
2631
  value: function executeSerialize() {
2299
- var _this$options3, _this$options4, _this$customValidateF, _this$customValidateF2;
2632
+ var _this$renderInput, _this$options3, _this$options4, _this$customValidateF, _this$customValidateF2;
2300
2633
  return {
2301
2634
  type: "route",
2635
+ render: (_this$renderInput = this.renderInput) !== null && _this$renderInput !== void 0 ? _this$renderInput : undefined,
2636
+ preview: this.previewInput ? true : undefined,
2302
2637
  options: {
2303
2638
  include: ((_this$options3 = this.options) === null || _this$options3 === void 0 ? void 0 : _this$options3.include) && {
2304
2639
  source: this.options.include.source,
@@ -2336,6 +2671,8 @@ var RichTextSchema = /*#__PURE__*/function (_Schema) {
2336
2671
  var isReadonly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
2337
2672
  var isHidden = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
2338
2673
  var description = arguments.length > 5 ? arguments[5] : undefined;
2674
+ var renderInput = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;
2675
+ var previewInput = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
2339
2676
  _classCallCheck(this, RichTextSchema);
2340
2677
  _this = _callSuper(this, RichTextSchema);
2341
2678
  _this.options = options;
@@ -2344,32 +2681,34 @@ var RichTextSchema = /*#__PURE__*/function (_Schema) {
2344
2681
  _this.isReadonly = isReadonly;
2345
2682
  _this.isHidden = isHidden;
2346
2683
  _this.description = description;
2684
+ _this.renderInput = renderInput;
2685
+ _this.previewInput = previewInput;
2347
2686
  return _this;
2348
2687
  }
2349
2688
  _inherits(RichTextSchema, _Schema);
2350
2689
  return _createClass(RichTextSchema, [{
2351
2690
  key: "describe",
2352
2691
  value: function describe(description) {
2353
- return new RichTextSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined);
2692
+ return new RichTextSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined, this.renderInput, this.previewInput);
2354
2693
  }
2355
2694
  }, {
2356
2695
  key: "maxLength",
2357
2696
  value: function maxLength(max) {
2358
2697
  return new RichTextSchema(_objectSpread2(_objectSpread2({}, this.options), {}, {
2359
2698
  maxLength: max
2360
- }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description);
2699
+ }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
2361
2700
  }
2362
2701
  }, {
2363
2702
  key: "minLength",
2364
2703
  value: function minLength(min) {
2365
2704
  return new RichTextSchema(_objectSpread2(_objectSpread2({}, this.options), {}, {
2366
2705
  minLength: min
2367
- }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description);
2706
+ }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
2368
2707
  }
2369
2708
  }, {
2370
2709
  key: "validate",
2371
2710
  value: function validate(validationFunction) {
2372
- return new RichTextSchema(this.options, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description);
2711
+ return new RichTextSchema(this.options, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
2373
2712
  }
2374
2713
  }, {
2375
2714
  key: "executeValidate",
@@ -2819,17 +3158,17 @@ var RichTextSchema = /*#__PURE__*/function (_Schema) {
2819
3158
  }, {
2820
3159
  key: "nullable",
2821
3160
  value: function nullable() {
2822
- return new RichTextSchema(this.options, true, [], this.isReadonly, this.isHidden, this.description);
3161
+ return new RichTextSchema(this.options, true, [], this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
2823
3162
  }
2824
3163
  }, {
2825
3164
  key: "readonly",
2826
3165
  value: function readonly() {
2827
- return new RichTextSchema(this.options, this.opt, this.customValidateFunctions, true, this.isHidden, this.description);
3166
+ return new RichTextSchema(this.options, this.opt, this.customValidateFunctions, true, this.isHidden, this.description, this.renderInput, this.previewInput);
2828
3167
  }
2829
3168
  }, {
2830
3169
  key: "hidden",
2831
3170
  value: function hidden() {
2832
- return new RichTextSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description);
3171
+ return new RichTextSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description, this.renderInput, this.previewInput);
2833
3172
  }
2834
3173
  }, {
2835
3174
  key: "executeCustomValidateAt",
@@ -2838,10 +3177,50 @@ var RichTextSchema = /*#__PURE__*/function (_Schema) {
2838
3177
  path: path
2839
3178
  });
2840
3179
  }
3180
+
3181
+ /**
3182
+ * How this field is laid out in the editor when it is the item of an array
3183
+ * or record: `{ as: "inline" }` renders the field itself inside each row,
3184
+ * instead of a preview row that navigates to it.
3185
+ *
3186
+ * Static configuration, not a callback — see `render.ts`.
3187
+ */
3188
+ }, {
3189
+ key: "render",
3190
+ value: function render(input) {
3191
+ return new RichTextSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, input, this.previewInput);
3192
+ }
3193
+
3194
+ /**
3195
+ * How this VALUE is shown where a preview of it is needed — a row in a
3196
+ * sortable list, a reference dropdown, a search hit. Never how the field
3197
+ * itself is edited (that is `render`). See `preview.ts`.
3198
+ */
3199
+ }, {
3200
+ key: "preview",
3201
+ value: function preview(select) {
3202
+ return new RichTextSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, select);
3203
+ }
3204
+ }, {
3205
+ key: "executePreviewItem",
3206
+ value: function executePreviewItem(src) {
3207
+ if (this.previewInput === null) {
3208
+ return null;
3209
+ }
3210
+ return this.previewInput({
3211
+ val: src
3212
+ });
3213
+ }
3214
+ }, {
3215
+ key: "declaresItemPreview",
3216
+ value: function declaresItemPreview() {
3217
+ return this.previewInput !== null;
3218
+ }
2841
3219
  }, {
2842
3220
  key: "executeSerialize",
2843
3221
  value: function executeSerialize() {
2844
3222
  var _this3 = this,
3223
+ _this$renderInput,
2845
3224
  _this$customValidateF;
2846
3225
  var serializeAnchorSchema = function serializeAnchorSchema() {
2847
3226
  var _this3$options$inline, _this3$options$inline3;
@@ -2868,6 +3247,8 @@ var RichTextSchema = /*#__PURE__*/function (_Schema) {
2868
3247
  };
2869
3248
  return {
2870
3249
  type: "richtext",
3250
+ render: (_this$renderInput = this.renderInput) !== null && _this$renderInput !== void 0 ? _this$renderInput : undefined,
3251
+ preview: this.previewInput ? true : undefined,
2871
3252
  opt: this.opt,
2872
3253
  options: serializedOptions,
2873
3254
  customValidate: this.customValidateFunctions && ((_this$customValidateF = this.customValidateFunctions) === null || _this$customValidateF === void 0 ? void 0 : _this$customValidateF.length) > 0,
@@ -3212,6 +3593,7 @@ var RecordSchema = /*#__PURE__*/function (_Schema) {
3212
3593
  var description = arguments.length > 8 ? arguments[8] : undefined;
3213
3594
  var isJsonValues = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : false;
3214
3595
  var previewInput = arguments.length > 10 && arguments[10] !== undefined ? arguments[10] : null;
3596
+ var renderInput = arguments.length > 11 && arguments[11] !== undefined ? arguments[11] : null;
3215
3597
  _classCallCheck(this, RecordSchema);
3216
3598
  _this = _callSuper(this, RecordSchema);
3217
3599
  _this.item = item;
@@ -3225,18 +3607,19 @@ var RecordSchema = /*#__PURE__*/function (_Schema) {
3225
3607
  _this.description = description;
3226
3608
  _this.isJsonValues = isJsonValues;
3227
3609
  _this.previewInput = previewInput;
3610
+ _this.renderInput = renderInput;
3228
3611
  return _this;
3229
3612
  }
3230
3613
  _inherits(RecordSchema, _Schema);
3231
3614
  return _createClass(RecordSchema, [{
3232
3615
  key: "describe",
3233
3616
  value: function describe(description) {
3234
- return new RecordSchema(this.item, this.opt, this.customValidateFunctions, this.currentRouter, this.keySchema, this.mediaOptions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined, this.isJsonValues, this.previewInput);
3617
+ return new RecordSchema(this.item, this.opt, this.customValidateFunctions, this.currentRouter, this.keySchema, this.mediaOptions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined, this.isJsonValues, this.previewInput, this.renderInput);
3235
3618
  }
3236
3619
  }, {
3237
3620
  key: "validate",
3238
3621
  value: function validate(validationFunction) {
3239
- return new RecordSchema(this.item, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.currentRouter, this.keySchema, this.mediaOptions, this.isReadonly, this.isHidden, this.description, this.isJsonValues, this.previewInput);
3622
+ return new RecordSchema(this.item, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.currentRouter, this.keySchema, this.mediaOptions, this.isReadonly, this.isHidden, this.description, this.isJsonValues, this.previewInput, this.renderInput);
3240
3623
  }
3241
3624
  }, {
3242
3625
  key: "executeValidate",
@@ -3319,8 +3702,8 @@ var RecordSchema = /*#__PURE__*/function (_Schema) {
3319
3702
  if (_this2.keySchema) {
3320
3703
  var keyPath = createValPathOfItem(path, key);
3321
3704
  if (!keyPath) {
3322
- throw new Error("Internal error: could not create path at ".concat(!path && typeof path === "string" ? "<empty string>" : path, " for key validation")) // Should! never happen
3323
- ;
3705
+ throw new Error("Internal error: could not create path at ".concat(!path && typeof path === "string" ? "<empty string>" : path, " for key validation") // Should! never happen
3706
+ );
3324
3707
  }
3325
3708
  var keyError = _this2.keySchema["executeValidate"](keyPath, key);
3326
3709
  if (keyError) {
@@ -3595,29 +3978,29 @@ var RecordSchema = /*#__PURE__*/function (_Schema) {
3595
3978
  }, {
3596
3979
  key: "nullable",
3597
3980
  value: function nullable() {
3598
- return new RecordSchema(this.item, true, this.customValidateFunctions, this.currentRouter, this.keySchema, this.mediaOptions, this.isReadonly, this.isHidden, this.description, this.isJsonValues, this.previewInput);
3981
+ return new RecordSchema(this.item, true, this.customValidateFunctions, this.currentRouter, this.keySchema, this.mediaOptions, this.isReadonly, this.isHidden, this.description, this.isJsonValues, this.previewInput, this.renderInput);
3599
3982
  }
3600
3983
  }, {
3601
3984
  key: "readonly",
3602
3985
  value: function readonly() {
3603
- return new RecordSchema(this.item, this.opt, this.customValidateFunctions, this.currentRouter, this.keySchema, this.mediaOptions, true, this.isHidden, this.description, this.isJsonValues, this.previewInput);
3986
+ return new RecordSchema(this.item, this.opt, this.customValidateFunctions, this.currentRouter, this.keySchema, this.mediaOptions, true, this.isHidden, this.description, this.isJsonValues, this.previewInput, this.renderInput);
3604
3987
  }
3605
3988
  }, {
3606
3989
  key: "hidden",
3607
3990
  value: function hidden() {
3608
- return new RecordSchema(this.item, this.opt, this.customValidateFunctions, this.currentRouter, this.keySchema, this.mediaOptions, this.isReadonly, true, this.description, this.isJsonValues, this.previewInput);
3991
+ return new RecordSchema(this.item, this.opt, this.customValidateFunctions, this.currentRouter, this.keySchema, this.mediaOptions, this.isReadonly, true, this.description, this.isJsonValues, this.previewInput, this.renderInput);
3609
3992
  }
3610
3993
  }, {
3611
3994
  key: "router",
3612
3995
  value: function router(_router) {
3613
- return new RecordSchema(this.item, this.opt, this.customValidateFunctions, _router, this.keySchema, this.mediaOptions, this.isReadonly, this.isHidden, this.description, this.isJsonValues, this.previewInput);
3996
+ return new RecordSchema(this.item, this.opt, this.customValidateFunctions, _router, this.keySchema, this.mediaOptions, this.isReadonly, this.isHidden, this.description, this.isJsonValues, this.previewInput, this.renderInput);
3614
3997
  }
3615
3998
  }, {
3616
3999
  key: "remote",
3617
4000
  value: function remote() {
3618
4001
  return new RecordSchema(this.item, this.opt, this.customValidateFunctions, this.currentRouter, this.keySchema, this.mediaOptions ? _objectSpread2(_objectSpread2({}, this.mediaOptions), {}, {
3619
4002
  remote: true
3620
- }) : undefined, this.isReadonly, this.isHidden, this.description, this.isJsonValues, this.previewInput);
4003
+ }) : undefined, this.isReadonly, this.isHidden, this.description, this.isJsonValues, this.previewInput, this.renderInput);
3621
4004
  }
3622
4005
 
3623
4006
  /**
@@ -3647,9 +4030,19 @@ var RecordSchema = /*#__PURE__*/function (_Schema) {
3647
4030
  // `.validate(...)` in their source file that never ran anywhere.
3648
4031
  throw new Error(".jsonValues() must come BEFORE .validate(): a validator added first is typed against the un-lazy source shape and cannot be carried over. Write s.record(...).jsonValues().validate(...) instead.");
3649
4032
  }
4033
+ if (this.previewInput !== null) {
4034
+ // Same reasoning as the validator guard above: the record's own preview
4035
+ // closure is typed against the un-lazy source shape.
4036
+ throw new Error(".jsonValues() must come BEFORE .preview(): a preview added first is typed against the un-lazy source shape and cannot be carried over. Write s.record(...).jsonValues().preview(...) instead.");
4037
+ }
4038
+ // Explicit type args instead of a cast on the result: `previewInput` would
4039
+ // otherwise pin inference to `Src`, and the two record source shapes no
4040
+ // longer overlap enough for the old assertion.
3650
4041
  return new RecordSchema(this.item, this.opt,
3651
4042
  // Empty by construction: the guard above rejects any that were registered.
3652
- [], this.currentRouter, this.keySchema, this.mediaOptions, this.isReadonly, this.isHidden, this.description, true, this.previewInput);
4043
+ [], this.currentRouter, this.keySchema, this.mediaOptions, this.isReadonly, this.isHidden, this.description, true,
4044
+ // Null by construction: the guard above rejects any that was declared.
4045
+ null, this.renderInput);
3653
4046
  }
3654
4047
  }, {
3655
4048
  key: "getRouterValidations",
@@ -3681,8 +4074,8 @@ var RecordSchema = /*#__PURE__*/function (_Schema) {
3681
4074
  }
3682
4075
  var subPath = createValPathOfItem(path, validation.error.urlPath);
3683
4076
  if (!subPath) {
3684
- throw new Error("Internal error: could not create path at ".concat(!path && typeof path === "string" ? "<empty string>" : path, " for router validation")) // Should! never happen
3685
- ;
4077
+ throw new Error("Internal error: could not create path at ".concat(!path && typeof path === "string" ? "<empty string>" : path, " for router validation") // Should! never happen
4078
+ );
3686
4079
  }
3687
4080
  return [subPath, [{
3688
4081
  message: validation.error.message,
@@ -3703,9 +4096,10 @@ var RecordSchema = /*#__PURE__*/function (_Schema) {
3703
4096
  }, {
3704
4097
  key: "executeSerialize",
3705
4098
  value: function executeSerialize() {
3706
- var _this$keySchema, _this$currentRouter, _this$customValidateF;
4099
+ var _this$renderInput, _this$keySchema, _this$currentRouter, _this$customValidateF;
3707
4100
  var result = {
3708
4101
  type: "record",
4102
+ render: (_this$renderInput = this.renderInput) !== null && _this$renderInput !== void 0 ? _this$renderInput : undefined,
3709
4103
  item: this.item["executeSerialize"](),
3710
4104
  key: (_this$keySchema = this.keySchema) === null || _this$keySchema === void 0 ? void 0 : _this$keySchema["executeSerialize"](),
3711
4105
  opt: this.opt,
@@ -3769,8 +4163,10 @@ var RecordSchema = /*#__PURE__*/function (_Schema) {
3769
4163
  res[_key2] = itemResult[_key2];
3770
4164
  }
3771
4165
  }
3772
- if (this.previewInput) {
3773
- var prepare = this.previewInput;
4166
+ // The entries preview comes from the ITEM schema's own `preview` — the
4167
+ // container just runs it per entry. Asked as a fact rather than by running
4168
+ // the closure, so an empty record still previews as an empty record.
4169
+ if (this.item["declaresItemPreview"]()) {
3774
4170
  // See the same block in `array`: the whole record when the record is what
3775
4171
  // is being shown, only the wanted entries when it is not.
3776
4172
  var window = scope !== undefined && !scope.wants(sourcePath) ? scope : null;
@@ -3782,6 +4178,9 @@ var RecordSchema = /*#__PURE__*/function (_Schema) {
3782
4178
  if (isJson(val)) {
3783
4179
  continue; // as above: nothing to select from an un-loaded entry
3784
4180
  }
4181
+ if (val === null || val === undefined) {
4182
+ continue;
4183
+ }
3785
4184
  if (window !== null && !window.wantsUnder(unsafeCreateSourcePath(sourcePath, _key3))) {
3786
4185
  continue;
3787
4186
  }
@@ -3789,18 +4188,17 @@ var RecordSchema = /*#__PURE__*/function (_Schema) {
3789
4188
  // data trips it up must not take out the whole list.
3790
4189
  try {
3791
4190
  // NB NB: display is actually defined by the user
3792
- var _prepare = prepare({
3793
- key: _key3,
3794
- val: val
3795
- }),
3796
- title = _prepare.title,
3797
- subtitle = _prepare.subtitle,
3798
- image = _prepare.image;
3799
- items.push([_key3, {
3800
- title: title,
3801
- subtitle: subtitle,
3802
- image: image
3803
- }]);
4191
+ var _item = this.item["executePreviewItem"](val);
4192
+ if (_item !== null) {
4193
+ var title = _item.title,
4194
+ subtitle = _item.subtitle,
4195
+ image = _item.image;
4196
+ items.push([_key3, {
4197
+ title: title,
4198
+ subtitle: subtitle,
4199
+ image: image
4200
+ }]);
4201
+ }
3804
4202
  } catch (e) {
3805
4203
  res[unsafeCreateSourcePath(sourcePath, _key3)] = {
3806
4204
  status: "error",
@@ -3818,19 +4216,45 @@ var RecordSchema = /*#__PURE__*/function (_Schema) {
3818
4216
  }
3819
4217
  return res;
3820
4218
  }
4219
+ }, {
4220
+ key: "executePreviewItem",
4221
+ value: function executePreviewItem(src) {
4222
+ if (this.previewInput === null) {
4223
+ return null;
4224
+ }
4225
+ return this.previewInput({
4226
+ val: src
4227
+ });
4228
+ }
4229
+ }, {
4230
+ key: "declaresItemPreview",
4231
+ value: function declaresItemPreview() {
4232
+ return this.previewInput !== null;
4233
+ }
3821
4234
 
3822
4235
  /**
3823
- * What the editor shows for each ENTRY of this record: a title, and optionally
3824
- * a subtitle and an image.
3825
- *
3826
- * `select` is your own code over the entry's key and source, so it is run on
3827
- * demand for the entries that are actually being looked at — see
3828
- * `PreviewScope`.
4236
+ * How this RECORD ITSELF is shown where a preview of it is needed — when it
4237
+ * is the item of another container, in search, in references. What its
4238
+ * entries show is the ITEM schema's `preview`, not this. Never how the field
4239
+ * is edited (that is `render`). See `preview.ts`.
3829
4240
  */
3830
4241
  }, {
3831
4242
  key: "preview",
3832
4243
  value: function preview(select) {
3833
- return new RecordSchema(this.item, this.opt, this.customValidateFunctions, this.currentRouter, this.keySchema, this.mediaOptions, this.isReadonly, this.isHidden, this.description, this.isJsonValues, select);
4244
+ return new RecordSchema(this.item, this.opt, this.customValidateFunctions, this.currentRouter, this.keySchema, this.mediaOptions, this.isReadonly, this.isHidden, this.description, this.isJsonValues, select, this.renderInput);
4245
+ }
4246
+
4247
+ /**
4248
+ * How this field is laid out in the editor when it is the item of an array
4249
+ * or record: `{ as: "inline" }` renders the field itself inside each row,
4250
+ * instead of a preview row that navigates to it.
4251
+ *
4252
+ * Static configuration, not a callback — see `render.ts`.
4253
+ */
4254
+ }, {
4255
+ key: "render",
4256
+ value: function render(input) {
4257
+ return new RecordSchema(this.item, this.opt, this.customValidateFunctions, this.currentRouter, this.keySchema, this.mediaOptions, this.isReadonly, this.isHidden, this.description, this.isJsonValues, this.previewInput, input);
3834
4258
  }
3835
4259
  }]);
3836
4260
  }(Schema);
@@ -3858,6 +4282,19 @@ schema, source) {
3858
4282
  function getSource(valModule) {
3859
4283
  return valModule[GetSource];
3860
4284
  }
4285
+
4286
+ /**
4287
+ * Whether `value` is a Val module, i.e. something {@link define} produced.
4288
+ *
4289
+ * Checks for the three symbols `define` writes, rather than a class identity:
4290
+ * a module may have been created by a different copy of `@valbuild/core` (the
4291
+ * editor SPA and the host bundle each ship their own, and the CLI evaluates
4292
+ * user modules inside a `node:vm` context). The symbols are created with
4293
+ * `Symbol.for`, so they are shared across all of those; a constructor is not.
4294
+ */
4295
+ function isValModule(value) {
4296
+ return _typeof(value) === "object" && value !== null && GetSource in value && GetSchema in value && Path in value;
4297
+ }
3861
4298
  function splitModuleFilePathAndModulePath(path) {
3862
4299
  var pathOfSep = path.indexOf(ModuleFilePathSep);
3863
4300
  if (pathOfSep === -1) {
@@ -4386,6 +4823,8 @@ var NumberSchema = /*#__PURE__*/function (_Schema) {
4386
4823
  var isReadonly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
4387
4824
  var isHidden = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
4388
4825
  var description = arguments.length > 5 ? arguments[5] : undefined;
4826
+ var renderInput = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;
4827
+ var previewInput = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
4389
4828
  _classCallCheck(this, NumberSchema);
4390
4829
  _this = _callSuper(this, NumberSchema);
4391
4830
  _this.options = options;
@@ -4394,18 +4833,20 @@ var NumberSchema = /*#__PURE__*/function (_Schema) {
4394
4833
  _this.isReadonly = isReadonly;
4395
4834
  _this.isHidden = isHidden;
4396
4835
  _this.description = description;
4836
+ _this.renderInput = renderInput;
4837
+ _this.previewInput = previewInput;
4397
4838
  return _this;
4398
4839
  }
4399
4840
  _inherits(NumberSchema, _Schema);
4400
4841
  return _createClass(NumberSchema, [{
4401
4842
  key: "describe",
4402
4843
  value: function describe(description) {
4403
- return new NumberSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined);
4844
+ return new NumberSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined, this.renderInput, this.previewInput);
4404
4845
  }
4405
4846
  }, {
4406
4847
  key: "validate",
4407
4848
  value: function validate(validationFunction) {
4408
- return new NumberSchema(this.options, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description);
4849
+ return new NumberSchema(this.options, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
4409
4850
  }
4410
4851
  }, {
4411
4852
  key: "executeValidate",
@@ -4475,31 +4916,31 @@ var NumberSchema = /*#__PURE__*/function (_Schema) {
4475
4916
  }, {
4476
4917
  key: "nullable",
4477
4918
  value: function nullable() {
4478
- return new NumberSchema(this.options, true, [], this.isReadonly, this.isHidden, this.description);
4919
+ return new NumberSchema(this.options, true, [], this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
4479
4920
  }
4480
4921
  }, {
4481
4922
  key: "readonly",
4482
4923
  value: function readonly() {
4483
- return new NumberSchema(this.options, this.opt, this.customValidateFunctions, true, this.isHidden, this.description);
4924
+ return new NumberSchema(this.options, this.opt, this.customValidateFunctions, true, this.isHidden, this.description, this.renderInput, this.previewInput);
4484
4925
  }
4485
4926
  }, {
4486
4927
  key: "hidden",
4487
4928
  value: function hidden() {
4488
- return new NumberSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description);
4929
+ return new NumberSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description, this.renderInput, this.previewInput);
4489
4930
  }
4490
4931
  }, {
4491
4932
  key: "max",
4492
4933
  value: function max(_max) {
4493
4934
  return new NumberSchema(_objectSpread2(_objectSpread2({}, this.options), {}, {
4494
4935
  max: _max
4495
- }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description);
4936
+ }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
4496
4937
  }
4497
4938
  }, {
4498
4939
  key: "min",
4499
4940
  value: function min(_min) {
4500
4941
  return new NumberSchema(_objectSpread2(_objectSpread2({}, this.options), {}, {
4501
4942
  min: _min
4502
- }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description);
4943
+ }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
4503
4944
  }
4504
4945
  }, {
4505
4946
  key: "executeCustomValidateAt",
@@ -4508,12 +4949,53 @@ var NumberSchema = /*#__PURE__*/function (_Schema) {
4508
4949
  path: path
4509
4950
  });
4510
4951
  }
4952
+
4953
+ /**
4954
+ * How this field is laid out in the editor when it is the item of an array
4955
+ * or record: `{ as: "inline" }` renders the field itself inside each row,
4956
+ * instead of a preview row that navigates to it.
4957
+ *
4958
+ * Static configuration, not a callback — see `render.ts`.
4959
+ */
4960
+ }, {
4961
+ key: "render",
4962
+ value: function render(input) {
4963
+ return new NumberSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, input, this.previewInput);
4964
+ }
4965
+
4966
+ /**
4967
+ * How this VALUE is shown where a preview of it is needed — a row in a
4968
+ * sortable list, a reference dropdown, a search hit. Never how the field
4969
+ * itself is edited (that is `render`). See `preview.ts`.
4970
+ */
4971
+ }, {
4972
+ key: "preview",
4973
+ value: function preview(select) {
4974
+ return new NumberSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, select);
4975
+ }
4976
+ }, {
4977
+ key: "executePreviewItem",
4978
+ value: function executePreviewItem(src) {
4979
+ if (this.previewInput === null) {
4980
+ return null;
4981
+ }
4982
+ return this.previewInput({
4983
+ val: src
4984
+ });
4985
+ }
4986
+ }, {
4987
+ key: "declaresItemPreview",
4988
+ value: function declaresItemPreview() {
4989
+ return this.previewInput !== null;
4990
+ }
4511
4991
  }, {
4512
4992
  key: "executeSerialize",
4513
4993
  value: function executeSerialize() {
4514
- var _this$customValidateF;
4994
+ var _this$renderInput, _this$customValidateF;
4515
4995
  return {
4516
4996
  type: "number",
4997
+ render: (_this$renderInput = this.renderInput) !== null && _this$renderInput !== void 0 ? _this$renderInput : undefined,
4998
+ preview: this.previewInput ? true : undefined,
4517
4999
  options: this.options,
4518
5000
  opt: this.opt,
4519
5001
  customValidate: this.customValidateFunctions && ((_this$customValidateF = this.customValidateFunctions) === null || _this$customValidateF === void 0 ? void 0 : _this$customValidateF.length) > 0,
@@ -4541,6 +5023,8 @@ var BooleanSchema = /*#__PURE__*/function (_Schema) {
4541
5023
  var isReadonly = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
4542
5024
  var isHidden = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
4543
5025
  var description = arguments.length > 4 ? arguments[4] : undefined;
5026
+ var renderInput = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : null;
5027
+ var previewInput = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;
4544
5028
  _classCallCheck(this, BooleanSchema);
4545
5029
  _this = _callSuper(this, BooleanSchema);
4546
5030
  _this.opt = opt;
@@ -4548,18 +5032,20 @@ var BooleanSchema = /*#__PURE__*/function (_Schema) {
4548
5032
  _this.isReadonly = isReadonly;
4549
5033
  _this.isHidden = isHidden;
4550
5034
  _this.description = description;
5035
+ _this.renderInput = renderInput;
5036
+ _this.previewInput = previewInput;
4551
5037
  return _this;
4552
5038
  }
4553
5039
  _inherits(BooleanSchema, _Schema);
4554
5040
  return _createClass(BooleanSchema, [{
4555
5041
  key: "describe",
4556
5042
  value: function describe(description) {
4557
- return new BooleanSchema(this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined);
5043
+ return new BooleanSchema(this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined, this.renderInput, this.previewInput);
4558
5044
  }
4559
5045
  }, {
4560
5046
  key: "validate",
4561
5047
  value: function validate(validationFunction) {
4562
- return new BooleanSchema(this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description);
5048
+ return new BooleanSchema(this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
4563
5049
  }
4564
5050
  }, {
4565
5051
  key: "executeValidate",
@@ -4610,17 +5096,17 @@ var BooleanSchema = /*#__PURE__*/function (_Schema) {
4610
5096
  }, {
4611
5097
  key: "nullable",
4612
5098
  value: function nullable() {
4613
- return new BooleanSchema(true, [], this.isReadonly, this.isHidden, this.description);
5099
+ return new BooleanSchema(true, [], this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
4614
5100
  }
4615
5101
  }, {
4616
5102
  key: "readonly",
4617
5103
  value: function readonly() {
4618
- return new BooleanSchema(this.opt, this.customValidateFunctions, true, this.isHidden, this.description);
5104
+ return new BooleanSchema(this.opt, this.customValidateFunctions, true, this.isHidden, this.description, this.renderInput, this.previewInput);
4619
5105
  }
4620
5106
  }, {
4621
5107
  key: "hidden",
4622
5108
  value: function hidden() {
4623
- return new BooleanSchema(this.opt, this.customValidateFunctions, this.isReadonly, true, this.description);
5109
+ return new BooleanSchema(this.opt, this.customValidateFunctions, this.isReadonly, true, this.description, this.renderInput, this.previewInput);
4624
5110
  }
4625
5111
  }, {
4626
5112
  key: "executeCustomValidateAt",
@@ -4629,12 +5115,53 @@ var BooleanSchema = /*#__PURE__*/function (_Schema) {
4629
5115
  path: path
4630
5116
  });
4631
5117
  }
5118
+
5119
+ /**
5120
+ * How this field is laid out in the editor when it is the item of an array
5121
+ * or record: `{ as: "inline" }` renders the field itself inside each row,
5122
+ * instead of a preview row that navigates to it.
5123
+ *
5124
+ * Static configuration, not a callback — see `render.ts`.
5125
+ */
5126
+ }, {
5127
+ key: "render",
5128
+ value: function render(input) {
5129
+ return new BooleanSchema(this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, input, this.previewInput);
5130
+ }
5131
+
5132
+ /**
5133
+ * How this VALUE is shown where a preview of it is needed — a row in a
5134
+ * sortable list, a reference dropdown, a search hit. Never how the field
5135
+ * itself is edited (that is `render`). See `preview.ts`.
5136
+ */
5137
+ }, {
5138
+ key: "preview",
5139
+ value: function preview(select) {
5140
+ return new BooleanSchema(this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, select);
5141
+ }
5142
+ }, {
5143
+ key: "executePreviewItem",
5144
+ value: function executePreviewItem(src) {
5145
+ if (this.previewInput === null) {
5146
+ return null;
5147
+ }
5148
+ return this.previewInput({
5149
+ val: src
5150
+ });
5151
+ }
5152
+ }, {
5153
+ key: "declaresItemPreview",
5154
+ value: function declaresItemPreview() {
5155
+ return this.previewInput !== null;
5156
+ }
4632
5157
  }, {
4633
5158
  key: "executeSerialize",
4634
5159
  value: function executeSerialize() {
4635
- var _this$customValidateF;
5160
+ var _this$renderInput, _this$customValidateF;
4636
5161
  return {
4637
5162
  type: "boolean",
5163
+ render: (_this$renderInput = this.renderInput) !== null && _this$renderInput !== void 0 ? _this$renderInput : undefined,
5164
+ preview: this.previewInput ? true : undefined,
4638
5165
  opt: this.opt,
4639
5166
  customValidate: this.customValidateFunctions && ((_this$customValidateF = this.customValidateFunctions) === null || _this$customValidateF === void 0 ? void 0 : _this$customValidateF.length) > 0,
4640
5167
  readonly: this.isReadonly,
@@ -4661,6 +5188,8 @@ var KeyOfSchema = /*#__PURE__*/function (_Schema) {
4661
5188
  var isReadonly = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
4662
5189
  var isHidden = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
4663
5190
  var description = arguments.length > 6 ? arguments[6] : undefined;
5191
+ var renderInput = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
5192
+ var previewInput = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : null;
4664
5193
  _classCallCheck(this, KeyOfSchema);
4665
5194
  _this = _callSuper(this, KeyOfSchema);
4666
5195
  _this.schema = schema;
@@ -4670,18 +5199,20 @@ var KeyOfSchema = /*#__PURE__*/function (_Schema) {
4670
5199
  _this.isReadonly = isReadonly;
4671
5200
  _this.isHidden = isHidden;
4672
5201
  _this.description = description;
5202
+ _this.renderInput = renderInput;
5203
+ _this.previewInput = previewInput;
4673
5204
  return _this;
4674
5205
  }
4675
5206
  _inherits(KeyOfSchema, _Schema);
4676
5207
  return _createClass(KeyOfSchema, [{
4677
5208
  key: "describe",
4678
5209
  value: function describe(description) {
4679
- return new KeyOfSchema(this.schema, this.sourcePath, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined);
5210
+ return new KeyOfSchema(this.schema, this.sourcePath, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined, this.renderInput, this.previewInput);
4680
5211
  }
4681
5212
  }, {
4682
5213
  key: "validate",
4683
5214
  value: function validate(validationFunction) {
4684
- return new KeyOfSchema(this.schema, this.sourcePath, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description);
5215
+ return new KeyOfSchema(this.schema, this.sourcePath, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
4685
5216
  }
4686
5217
  }, {
4687
5218
  key: "executeValidate",
@@ -4811,17 +5342,17 @@ var KeyOfSchema = /*#__PURE__*/function (_Schema) {
4811
5342
  }, {
4812
5343
  key: "nullable",
4813
5344
  value: function nullable() {
4814
- return new KeyOfSchema(this.schema, this.sourcePath, true, [], this.isReadonly, this.isHidden, this.description);
5345
+ return new KeyOfSchema(this.schema, this.sourcePath, true, [], this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
4815
5346
  }
4816
5347
  }, {
4817
5348
  key: "readonly",
4818
5349
  value: function readonly() {
4819
- return new KeyOfSchema(this.schema, this.sourcePath, this.opt, this.customValidateFunctions, true, this.isHidden, this.description);
5350
+ return new KeyOfSchema(this.schema, this.sourcePath, this.opt, this.customValidateFunctions, true, this.isHidden, this.description, this.renderInput, this.previewInput);
4820
5351
  }
4821
5352
  }, {
4822
5353
  key: "hidden",
4823
5354
  value: function hidden() {
4824
- return new KeyOfSchema(this.schema, this.sourcePath, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description);
5355
+ return new KeyOfSchema(this.schema, this.sourcePath, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description, this.renderInput, this.previewInput);
4825
5356
  }
4826
5357
  }, {
4827
5358
  key: "executeCustomValidateAt",
@@ -4830,10 +5361,49 @@ var KeyOfSchema = /*#__PURE__*/function (_Schema) {
4830
5361
  path: path
4831
5362
  });
4832
5363
  }
5364
+
5365
+ /**
5366
+ * How this field is laid out in the editor when it is the item of an array
5367
+ * or record: `{ as: "inline" }` renders the field itself inside each row,
5368
+ * instead of a preview row that navigates to it.
5369
+ *
5370
+ * Static configuration, not a callback — see `render.ts`.
5371
+ */
5372
+ }, {
5373
+ key: "render",
5374
+ value: function render(input) {
5375
+ return new KeyOfSchema(this.schema, this.sourcePath, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, input, this.previewInput);
5376
+ }
5377
+
5378
+ /**
5379
+ * How this VALUE is shown where a preview of it is needed — a row in a
5380
+ * sortable list, a reference dropdown, a search hit. Never how the field
5381
+ * itself is edited (that is `render`). See `preview.ts`.
5382
+ */
5383
+ }, {
5384
+ key: "preview",
5385
+ value: function preview(select) {
5386
+ return new KeyOfSchema(this.schema, this.sourcePath, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, select);
5387
+ }
5388
+ }, {
5389
+ key: "executePreviewItem",
5390
+ value: function executePreviewItem(src) {
5391
+ if (this.previewInput === null) {
5392
+ return null;
5393
+ }
5394
+ return this.previewInput({
5395
+ val: src
5396
+ });
5397
+ }
5398
+ }, {
5399
+ key: "declaresItemPreview",
5400
+ value: function declaresItemPreview() {
5401
+ return this.previewInput !== null;
5402
+ }
4833
5403
  }, {
4834
5404
  key: "executeSerialize",
4835
5405
  value: function executeSerialize() {
4836
- var _this$customValidateF;
5406
+ var _this$renderInput, _this$customValidateF;
4837
5407
  var path = this.sourcePath;
4838
5408
  if (!path) {
4839
5409
  throw new Error("Cannot serialize keyOf schema with empty selector. TIP: keyOf must be used with a Val Module of record schema.");
@@ -4856,6 +5426,8 @@ var KeyOfSchema = /*#__PURE__*/function (_Schema) {
4856
5426
  }
4857
5427
  return {
4858
5428
  type: "keyOf",
5429
+ render: (_this$renderInput = this.renderInput) !== null && _this$renderInput !== void 0 ? _this$renderInput : undefined,
5430
+ preview: this.previewInput ? true : undefined,
4859
5431
  path: path,
4860
5432
  schema: serializedSchema,
4861
5433
  opt: this.opt,
@@ -4907,6 +5479,8 @@ var FileSchema = /*#__PURE__*/function (_Schema) {
4907
5479
  var isReadonly = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
4908
5480
  var isHidden = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : false;
4909
5481
  var description = arguments.length > 7 ? arguments[7] : undefined;
5482
+ var renderInput = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : null;
5483
+ var previewInput = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : null;
4910
5484
  _classCallCheck(this, FileSchema);
4911
5485
  _this = _callSuper(this, FileSchema);
4912
5486
  _this.options = options;
@@ -4917,23 +5491,25 @@ var FileSchema = /*#__PURE__*/function (_Schema) {
4917
5491
  _this.isReadonly = isReadonly;
4918
5492
  _this.isHidden = isHidden;
4919
5493
  _this.description = description;
5494
+ _this.renderInput = renderInput;
5495
+ _this.previewInput = previewInput;
4920
5496
  return _this;
4921
5497
  }
4922
5498
  _inherits(FileSchema, _Schema);
4923
5499
  return _createClass(FileSchema, [{
4924
5500
  key: "describe",
4925
5501
  value: function describe(description) {
4926
- return new FileSchema(this.options, this.opt, this.isRemote, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined);
5502
+ return new FileSchema(this.options, this.opt, this.isRemote, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined, this.renderInput, this.previewInput);
4927
5503
  }
4928
5504
  }, {
4929
5505
  key: "remote",
4930
5506
  value: function remote() {
4931
- return new FileSchema(this.options, this.opt, true, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, this.isHidden, this.description);
5507
+ return new FileSchema(this.options, this.opt, true, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
4932
5508
  }
4933
5509
  }, {
4934
5510
  key: "validate",
4935
5511
  value: function validate(validationFunction) {
4936
- return new FileSchema(this.options, this.opt, this.isRemote, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.moduleMetadata, this.isReadonly, this.isHidden, this.description);
5512
+ return new FileSchema(this.options, this.opt, this.isRemote, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.moduleMetadata, this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
4937
5513
  }
4938
5514
  }, {
4939
5515
  key: "executeValidate",
@@ -5114,17 +5690,17 @@ var FileSchema = /*#__PURE__*/function (_Schema) {
5114
5690
  }, {
5115
5691
  key: "nullable",
5116
5692
  value: function nullable() {
5117
- return new FileSchema(this.options, true, this.isRemote, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, this.isHidden, this.description);
5693
+ return new FileSchema(this.options, true, this.isRemote, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
5118
5694
  }
5119
5695
  }, {
5120
5696
  key: "readonly",
5121
5697
  value: function readonly() {
5122
- return new FileSchema(this.options, this.opt, this.isRemote, this.customValidateFunctions, this.moduleMetadata, true, this.isHidden, this.description);
5698
+ return new FileSchema(this.options, this.opt, this.isRemote, this.customValidateFunctions, this.moduleMetadata, true, this.isHidden, this.description, this.renderInput, this.previewInput);
5123
5699
  }
5124
5700
  }, {
5125
5701
  key: "hidden",
5126
5702
  value: function hidden() {
5127
- return new FileSchema(this.options, this.opt, this.isRemote, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, true, this.description);
5703
+ return new FileSchema(this.options, this.opt, this.isRemote, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, true, this.description, this.renderInput, this.previewInput);
5128
5704
  }
5129
5705
  }, {
5130
5706
  key: "executeCustomValidateAt",
@@ -5133,13 +5709,54 @@ var FileSchema = /*#__PURE__*/function (_Schema) {
5133
5709
  path: path
5134
5710
  });
5135
5711
  }
5712
+
5713
+ /**
5714
+ * How this field is laid out in the editor when it is the item of an array
5715
+ * or record: `{ as: "inline" }` renders the field itself inside each row,
5716
+ * instead of a preview row that navigates to it.
5717
+ *
5718
+ * Static configuration, not a callback — see `render.ts`.
5719
+ */
5720
+ }, {
5721
+ key: "render",
5722
+ value: function render(input) {
5723
+ return new FileSchema(this.options, this.opt, this.isRemote, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, this.isHidden, this.description, input, this.previewInput);
5724
+ }
5725
+
5726
+ /**
5727
+ * How this VALUE is shown where a preview of it is needed — a row in a
5728
+ * sortable list, a reference dropdown, a search hit. Never how the field
5729
+ * itself is edited (that is `render`). See `preview.ts`.
5730
+ */
5731
+ }, {
5732
+ key: "preview",
5733
+ value: function preview(select) {
5734
+ return new FileSchema(this.options, this.opt, this.isRemote, this.customValidateFunctions, this.moduleMetadata, this.isReadonly, this.isHidden, this.description, this.renderInput, select);
5735
+ }
5736
+ }, {
5737
+ key: "executePreviewItem",
5738
+ value: function executePreviewItem(src) {
5739
+ if (this.previewInput === null) {
5740
+ return null;
5741
+ }
5742
+ return this.previewInput({
5743
+ val: src
5744
+ });
5745
+ }
5746
+ }, {
5747
+ key: "declaresItemPreview",
5748
+ value: function declaresItemPreview() {
5749
+ return this.previewInput !== null;
5750
+ }
5136
5751
  }, {
5137
5752
  key: "executeSerialize",
5138
5753
  value: function executeSerialize() {
5139
- var _this$customValidateF;
5754
+ var _this$renderInput, _this$customValidateF;
5140
5755
  var modulePaths = this.moduleMetadata ? Object.keys(this.moduleMetadata) : [];
5141
5756
  return {
5142
5757
  type: "file",
5758
+ render: (_this$renderInput = this.renderInput) !== null && _this$renderInput !== void 0 ? _this$renderInput : undefined,
5759
+ preview: this.previewInput ? true : undefined,
5143
5760
  options: this.options,
5144
5761
  opt: this.opt,
5145
5762
  remote: this.isRemote,
@@ -5228,6 +5845,8 @@ var DateSchema = /*#__PURE__*/function (_Schema) {
5228
5845
  var isReadonly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
5229
5846
  var isHidden = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
5230
5847
  var description = arguments.length > 5 ? arguments[5] : undefined;
5848
+ var renderInput = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;
5849
+ var previewInput = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
5231
5850
  _classCallCheck(this, DateSchema);
5232
5851
  _this = _callSuper(this, DateSchema);
5233
5852
  _this.options = options;
@@ -5236,18 +5855,20 @@ var DateSchema = /*#__PURE__*/function (_Schema) {
5236
5855
  _this.isReadonly = isReadonly;
5237
5856
  _this.isHidden = isHidden;
5238
5857
  _this.description = description;
5858
+ _this.renderInput = renderInput;
5859
+ _this.previewInput = previewInput;
5239
5860
  return _this;
5240
5861
  }
5241
5862
  _inherits(DateSchema, _Schema);
5242
5863
  return _createClass(DateSchema, [{
5243
5864
  key: "describe",
5244
5865
  value: function describe(description) {
5245
- return new DateSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined);
5866
+ return new DateSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined, this.renderInput, this.previewInput);
5246
5867
  }
5247
5868
  }, {
5248
5869
  key: "validate",
5249
5870
  value: function validate(validationFunction) {
5250
- return new DateSchema(this.options, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description);
5871
+ return new DateSchema(this.options, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
5251
5872
  }
5252
5873
  }, {
5253
5874
  key: "executeValidate",
@@ -5336,29 +5957,29 @@ var DateSchema = /*#__PURE__*/function (_Schema) {
5336
5957
  value: function from(_from) {
5337
5958
  return new DateSchema(_objectSpread2(_objectSpread2({}, this.options), {}, {
5338
5959
  from: _from
5339
- }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description);
5960
+ }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
5340
5961
  }
5341
5962
  }, {
5342
5963
  key: "to",
5343
5964
  value: function to(_to) {
5344
5965
  return new DateSchema(_objectSpread2(_objectSpread2({}, this.options), {}, {
5345
5966
  to: _to
5346
- }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description);
5967
+ }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
5347
5968
  }
5348
5969
  }, {
5349
5970
  key: "nullable",
5350
5971
  value: function nullable() {
5351
- return new DateSchema(this.options, true, [], this.isReadonly, this.isHidden, this.description);
5972
+ return new DateSchema(this.options, true, [], this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
5352
5973
  }
5353
5974
  }, {
5354
5975
  key: "readonly",
5355
5976
  value: function readonly() {
5356
- return new DateSchema(this.options, this.opt, this.customValidateFunctions, true, this.isHidden, this.description);
5977
+ return new DateSchema(this.options, this.opt, this.customValidateFunctions, true, this.isHidden, this.description, this.renderInput, this.previewInput);
5357
5978
  }
5358
5979
  }, {
5359
5980
  key: "hidden",
5360
5981
  value: function hidden() {
5361
- return new DateSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description);
5982
+ return new DateSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description, this.renderInput, this.previewInput);
5362
5983
  }
5363
5984
  }, {
5364
5985
  key: "executeCustomValidateAt",
@@ -5367,12 +5988,53 @@ var DateSchema = /*#__PURE__*/function (_Schema) {
5367
5988
  path: path
5368
5989
  });
5369
5990
  }
5991
+
5992
+ /**
5993
+ * How this field is laid out in the editor when it is the item of an array
5994
+ * or record: `{ as: "inline" }` renders the field itself inside each row,
5995
+ * instead of a preview row that navigates to it.
5996
+ *
5997
+ * Static configuration, not a callback — see `render.ts`.
5998
+ */
5999
+ }, {
6000
+ key: "render",
6001
+ value: function render(input) {
6002
+ return new DateSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, input, this.previewInput);
6003
+ }
6004
+
6005
+ /**
6006
+ * How this VALUE is shown where a preview of it is needed — a row in a
6007
+ * sortable list, a reference dropdown, a search hit. Never how the field
6008
+ * itself is edited (that is `render`). See `preview.ts`.
6009
+ */
6010
+ }, {
6011
+ key: "preview",
6012
+ value: function preview(select) {
6013
+ return new DateSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, select);
6014
+ }
6015
+ }, {
6016
+ key: "executePreviewItem",
6017
+ value: function executePreviewItem(src) {
6018
+ if (this.previewInput === null) {
6019
+ return null;
6020
+ }
6021
+ return this.previewInput({
6022
+ val: src
6023
+ });
6024
+ }
6025
+ }, {
6026
+ key: "declaresItemPreview",
6027
+ value: function declaresItemPreview() {
6028
+ return this.previewInput !== null;
6029
+ }
5370
6030
  }, {
5371
6031
  key: "executeSerialize",
5372
6032
  value: function executeSerialize() {
5373
- var _this$customValidateF;
6033
+ var _this$renderInput, _this$customValidateF;
5374
6034
  return {
5375
6035
  type: "date",
6036
+ render: (_this$renderInput = this.renderInput) !== null && _this$renderInput !== void 0 ? _this$renderInput : undefined,
6037
+ preview: this.previewInput ? true : undefined,
5376
6038
  opt: this.opt,
5377
6039
  options: this.options,
5378
6040
  customValidate: this.customValidateFunctions && ((_this$customValidateF = this.customValidateFunctions) === null || _this$customValidateF === void 0 ? void 0 : _this$customValidateF.length) > 0,
@@ -5400,6 +6062,8 @@ var DateTimeSchema = /*#__PURE__*/function (_Schema) {
5400
6062
  var isReadonly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
5401
6063
  var isHidden = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
5402
6064
  var description = arguments.length > 5 ? arguments[5] : undefined;
6065
+ var renderInput = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;
6066
+ var previewInput = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
5403
6067
  _classCallCheck(this, DateTimeSchema);
5404
6068
  _this = _callSuper(this, DateTimeSchema);
5405
6069
  _this.options = options;
@@ -5408,18 +6072,20 @@ var DateTimeSchema = /*#__PURE__*/function (_Schema) {
5408
6072
  _this.isReadonly = isReadonly;
5409
6073
  _this.isHidden = isHidden;
5410
6074
  _this.description = description;
6075
+ _this.renderInput = renderInput;
6076
+ _this.previewInput = previewInput;
5411
6077
  return _this;
5412
6078
  }
5413
6079
  _inherits(DateTimeSchema, _Schema);
5414
6080
  return _createClass(DateTimeSchema, [{
5415
6081
  key: "describe",
5416
6082
  value: function describe(description) {
5417
- return new DateTimeSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined);
6083
+ return new DateTimeSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined, this.renderInput, this.previewInput);
5418
6084
  }
5419
6085
  }, {
5420
6086
  key: "validate",
5421
6087
  value: function validate(validationFunction) {
5422
- return new DateTimeSchema(this.options, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description);
6088
+ return new DateTimeSchema(this.options, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
5423
6089
  }
5424
6090
  }, {
5425
6091
  key: "executeValidate",
@@ -5540,29 +6206,29 @@ var DateTimeSchema = /*#__PURE__*/function (_Schema) {
5540
6206
  value: function from(_from) {
5541
6207
  return new DateTimeSchema(_objectSpread2(_objectSpread2({}, this.options), {}, {
5542
6208
  from: _from
5543
- }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description);
6209
+ }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
5544
6210
  }
5545
6211
  }, {
5546
6212
  key: "to",
5547
6213
  value: function to(_to) {
5548
6214
  return new DateTimeSchema(_objectSpread2(_objectSpread2({}, this.options), {}, {
5549
6215
  to: _to
5550
- }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description);
6216
+ }), this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
5551
6217
  }
5552
6218
  }, {
5553
6219
  key: "nullable",
5554
6220
  value: function nullable() {
5555
- return new DateTimeSchema(this.options, true, [], this.isReadonly, this.isHidden, this.description);
6221
+ return new DateTimeSchema(this.options, true, [], this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
5556
6222
  }
5557
6223
  }, {
5558
6224
  key: "readonly",
5559
6225
  value: function readonly() {
5560
- return new DateTimeSchema(this.options, this.opt, this.customValidateFunctions, true, this.isHidden, this.description);
6226
+ return new DateTimeSchema(this.options, this.opt, this.customValidateFunctions, true, this.isHidden, this.description, this.renderInput, this.previewInput);
5561
6227
  }
5562
6228
  }, {
5563
6229
  key: "hidden",
5564
6230
  value: function hidden() {
5565
- return new DateTimeSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description);
6231
+ return new DateTimeSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description, this.renderInput, this.previewInput);
5566
6232
  }
5567
6233
  }, {
5568
6234
  key: "executeCustomValidateAt",
@@ -5571,12 +6237,53 @@ var DateTimeSchema = /*#__PURE__*/function (_Schema) {
5571
6237
  path: path
5572
6238
  });
5573
6239
  }
6240
+
6241
+ /**
6242
+ * How this field is laid out in the editor when it is the item of an array
6243
+ * or record: `{ as: "inline" }` renders the field itself inside each row,
6244
+ * instead of a preview row that navigates to it.
6245
+ *
6246
+ * Static configuration, not a callback — see `render.ts`.
6247
+ */
6248
+ }, {
6249
+ key: "render",
6250
+ value: function render(input) {
6251
+ return new DateTimeSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, input, this.previewInput);
6252
+ }
6253
+
6254
+ /**
6255
+ * How this VALUE is shown where a preview of it is needed — a row in a
6256
+ * sortable list, a reference dropdown, a search hit. Never how the field
6257
+ * itself is edited (that is `render`). See `preview.ts`.
6258
+ */
6259
+ }, {
6260
+ key: "preview",
6261
+ value: function preview(select) {
6262
+ return new DateTimeSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, select);
6263
+ }
6264
+ }, {
6265
+ key: "executePreviewItem",
6266
+ value: function executePreviewItem(src) {
6267
+ if (this.previewInput === null) {
6268
+ return null;
6269
+ }
6270
+ return this.previewInput({
6271
+ val: src
6272
+ });
6273
+ }
6274
+ }, {
6275
+ key: "declaresItemPreview",
6276
+ value: function declaresItemPreview() {
6277
+ return this.previewInput !== null;
6278
+ }
5574
6279
  }, {
5575
6280
  key: "executeSerialize",
5576
6281
  value: function executeSerialize() {
5577
- var _this$customValidateF;
6282
+ var _this$renderInput, _this$customValidateF;
5578
6283
  return {
5579
6284
  type: "dateTime",
6285
+ render: (_this$renderInput = this.renderInput) !== null && _this$renderInput !== void 0 ? _this$renderInput : undefined,
6286
+ preview: this.previewInput ? true : undefined,
5580
6287
  opt: this.opt,
5581
6288
  options: this.options,
5582
6289
  customValidate: this.customValidateFunctions && ((_this$customValidateF = this.customValidateFunctions) === null || _this$customValidateF === void 0 ? void 0 : _this$customValidateF.length) > 0,
@@ -6084,6 +6791,8 @@ var ColorSchema = /*#__PURE__*/function (_Schema) {
6084
6791
  var isReadonly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
6085
6792
  var isHidden = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
6086
6793
  var description = arguments.length > 5 ? arguments[5] : undefined;
6794
+ var renderInput = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;
6795
+ var previewInput = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
6087
6796
  _classCallCheck(this, ColorSchema);
6088
6797
  _this = _callSuper(this, ColorSchema);
6089
6798
  _this.options = options;
@@ -6092,18 +6801,20 @@ var ColorSchema = /*#__PURE__*/function (_Schema) {
6092
6801
  _this.isReadonly = isReadonly;
6093
6802
  _this.isHidden = isHidden;
6094
6803
  _this.description = description;
6804
+ _this.renderInput = renderInput;
6805
+ _this.previewInput = previewInput;
6095
6806
  return _this;
6096
6807
  }
6097
6808
  _inherits(ColorSchema, _Schema);
6098
6809
  return _createClass(ColorSchema, [{
6099
6810
  key: "describe",
6100
6811
  value: function describe(description) {
6101
- return new ColorSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined);
6812
+ return new ColorSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, description !== null && description !== void 0 ? description : undefined, this.renderInput, this.previewInput);
6102
6813
  }
6103
6814
  }, {
6104
6815
  key: "validate",
6105
6816
  value: function validate(validationFunction) {
6106
- return new ColorSchema(this.options, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description);
6817
+ return new ColorSchema(this.options, this.opt, [].concat(_toConsumableArray(this.customValidateFunctions), [validationFunction]), this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
6107
6818
  }
6108
6819
  }, {
6109
6820
  key: "executeCustomValidateAt",
@@ -6200,24 +6911,65 @@ var ColorSchema = /*#__PURE__*/function (_Schema) {
6200
6911
  }, {
6201
6912
  key: "nullable",
6202
6913
  value: function nullable() {
6203
- return new ColorSchema(this.options, true, [], this.isReadonly, this.isHidden, this.description);
6914
+ return new ColorSchema(this.options, true, [], this.isReadonly, this.isHidden, this.description, this.renderInput, this.previewInput);
6204
6915
  }
6205
6916
  }, {
6206
6917
  key: "readonly",
6207
6918
  value: function readonly() {
6208
- return new ColorSchema(this.options, this.opt, this.customValidateFunctions, true, this.isHidden, this.description);
6919
+ return new ColorSchema(this.options, this.opt, this.customValidateFunctions, true, this.isHidden, this.description, this.renderInput, this.previewInput);
6209
6920
  }
6210
6921
  }, {
6211
6922
  key: "hidden",
6212
6923
  value: function hidden() {
6213
- return new ColorSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description);
6924
+ return new ColorSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, true, this.description, this.renderInput, this.previewInput);
6925
+ }
6926
+
6927
+ /**
6928
+ * How this field is laid out in the editor when it is the item of an array
6929
+ * or record: `{ as: "inline" }` renders the field itself inside each row,
6930
+ * instead of a preview row that navigates to it.
6931
+ *
6932
+ * Static configuration, not a callback — see `render.ts`.
6933
+ */
6934
+ }, {
6935
+ key: "render",
6936
+ value: function render(input) {
6937
+ return new ColorSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, input, this.previewInput);
6938
+ }
6939
+
6940
+ /**
6941
+ * How this VALUE is shown where a preview of it is needed — a row in a
6942
+ * sortable list, a reference dropdown, a search hit. Never how the field
6943
+ * itself is edited (that is `render`). See `preview.ts`.
6944
+ */
6945
+ }, {
6946
+ key: "preview",
6947
+ value: function preview(select) {
6948
+ return new ColorSchema(this.options, this.opt, this.customValidateFunctions, this.isReadonly, this.isHidden, this.description, this.renderInput, select);
6949
+ }
6950
+ }, {
6951
+ key: "executePreviewItem",
6952
+ value: function executePreviewItem(src) {
6953
+ if (this.previewInput === null) {
6954
+ return null;
6955
+ }
6956
+ return this.previewInput({
6957
+ val: src
6958
+ });
6959
+ }
6960
+ }, {
6961
+ key: "declaresItemPreview",
6962
+ value: function declaresItemPreview() {
6963
+ return this.previewInput !== null;
6214
6964
  }
6215
6965
  }, {
6216
6966
  key: "executeSerialize",
6217
6967
  value: function executeSerialize() {
6218
- var _this$customValidateF;
6968
+ var _this$renderInput, _this$customValidateF;
6219
6969
  return {
6220
6970
  type: "color",
6971
+ render: (_this$renderInput = this.renderInput) !== null && _this$renderInput !== void 0 ? _this$renderInput : undefined,
6972
+ preview: this.previewInput ? true : undefined,
6221
6973
  opt: this.opt,
6222
6974
  options: this.options,
6223
6975
  customValidate: this.customValidateFunctions && ((_this$customValidateF = this.customValidateFunctions) === null || _this$customValidateF === void 0 ? void 0 : _this$customValidateF.length) > 0,
@@ -8070,7 +8822,7 @@ function deserializeSchema(serialized) {
8070
8822
  return schema;
8071
8823
  }
8072
8824
  function deserializeSchemaImpl(serialized) {
8073
- var _serialized$options, _serialized$options2, _serialized$render, _serialized$accept, _serialized$directory, _serialized$remote, _serialized$jsonValue;
8825
+ var _serialized$options, _serialized$options2, _serialized$render, _serialized$render2, _serialized$render3, _serialized$render4, _serialized$render5, _serialized$render6, _serialized$render7, _serialized$accept, _serialized$directory, _serialized$remote, _serialized$jsonValue, _serialized$render9, _serialized$render0, _serialized$render10, _serialized$render11, _serialized$render12, _serialized$render13, _serialized$render14;
8074
8826
  switch (serialized.type) {
8075
8827
  case "string":
8076
8828
  return new StringSchema(_objectSpread2(_objectSpread2({}, serialized.options), {}, {
@@ -8081,20 +8833,22 @@ function deserializeSchemaImpl(serialized) {
8081
8833
  // recomputed from an instance.
8082
8834
  (_serialized$render = serialized.render) !== null && _serialized$render !== void 0 ? _serialized$render : null, false, false, serialized.description);
8083
8835
  case "literal":
8084
- return new LiteralSchema(serialized.value, serialized.opt, [], false, false, serialized.description);
8836
+ return new LiteralSchema(serialized.value, serialized.opt, [], false, false, serialized.description, (_serialized$render2 = serialized.render) !== null && _serialized$render2 !== void 0 ? _serialized$render2 : null);
8085
8837
  case "boolean":
8086
- return new BooleanSchema(serialized.opt, [], false, false, serialized.description);
8838
+ return new BooleanSchema(serialized.opt, [], false, false, serialized.description, (_serialized$render3 = serialized.render) !== null && _serialized$render3 !== void 0 ? _serialized$render3 : null);
8087
8839
  case "number":
8088
- return new NumberSchema(serialized.options, serialized.opt, [], false, false, serialized.description);
8840
+ return new NumberSchema(serialized.options, serialized.opt, [], false, false, serialized.description, (_serialized$render4 = serialized.render) !== null && _serialized$render4 !== void 0 ? _serialized$render4 : null);
8089
8841
  case "object":
8090
8842
  return new ObjectSchema(Object.fromEntries(Object.entries(serialized.items).map(function (_ref) {
8091
8843
  var _ref2 = _slicedToArray(_ref, 2),
8092
8844
  key = _ref2[0],
8093
8845
  item = _ref2[1];
8094
8846
  return [key, deserializeSchema(item)];
8095
- })), serialized.opt, [], false, false, serialized.description);
8847
+ })), serialized.opt, [], false, false, serialized.description, (_serialized$render5 = serialized.render) !== null && _serialized$render5 !== void 0 ? _serialized$render5 : null);
8096
8848
  case "array":
8097
- return new ArraySchema(deserializeSchema(serialized.item), serialized.opt, [], false, false, serialized.description);
8849
+ return new ArraySchema(deserializeSchema(serialized.item), serialized.opt, [], false, false, serialized.description,
8850
+ // The preview closure cannot survive serialization; the render can.
8851
+ null, (_serialized$render6 = serialized.render) !== null && _serialized$render6 !== void 0 ? _serialized$render6 : null);
8098
8852
  case "union":
8099
8853
  return new UnionSchema(typeof serialized.key === "string" ? serialized.key :
8100
8854
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -8103,17 +8857,17 @@ function deserializeSchemaImpl(serialized) {
8103
8857
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
8104
8858
  serialized.items.map(deserializeSchema),
8105
8859
  // TODO: we do not really need any here - right?
8106
- serialized.opt, [], false, false, serialized.description);
8860
+ serialized.opt, [], false, false, serialized.description, (_serialized$render7 = serialized.render) !== null && _serialized$render7 !== void 0 ? _serialized$render7 : null);
8107
8861
  case "richtext":
8108
8862
  {
8109
- var _serialized$options3, _serialized$options4, _serialized$options5, _serialized$options6, _serialized$options7, _serialized$options8, _serialized$options9;
8863
+ var _serialized$options3, _serialized$options4, _serialized$options5, _serialized$options6, _serialized$options7, _serialized$options8, _serialized$options9, _serialized$render8;
8110
8864
  var deserializedOptions = _objectSpread2(_objectSpread2({}, serialized.options || {}), {}, {
8111
8865
  inline: _typeof((_serialized$options3 = serialized.options) === null || _serialized$options3 === void 0 || (_serialized$options3 = _serialized$options3.inline) === null || _serialized$options3 === void 0 ? void 0 : _serialized$options3.img) === "object" || _typeof((_serialized$options4 = serialized.options) === null || _serialized$options4 === void 0 || (_serialized$options4 = _serialized$options4.inline) === null || _serialized$options4 === void 0 ? void 0 : _serialized$options4.a) === "object" ? {
8112
8866
  a: _typeof((_serialized$options5 = serialized.options) === null || _serialized$options5 === void 0 || (_serialized$options5 = _serialized$options5.inline) === null || _serialized$options5 === void 0 ? void 0 : _serialized$options5.a) === "object" ? deserializeSchema(serialized.options.inline.a) : (_serialized$options6 = serialized.options) === null || _serialized$options6 === void 0 || (_serialized$options6 = _serialized$options6.inline) === null || _serialized$options6 === void 0 ? void 0 : _serialized$options6.a,
8113
8867
  img: _typeof((_serialized$options7 = serialized.options) === null || _serialized$options7 === void 0 || (_serialized$options7 = _serialized$options7.inline) === null || _serialized$options7 === void 0 ? void 0 : _serialized$options7.img) === "object" ? deserializeSchema(serialized.options.inline.img) : (_serialized$options8 = serialized.options) === null || _serialized$options8 === void 0 || (_serialized$options8 = _serialized$options8.inline) === null || _serialized$options8 === void 0 ? void 0 : _serialized$options8.img
8114
8868
  } : (_serialized$options9 = serialized.options) === null || _serialized$options9 === void 0 ? void 0 : _serialized$options9.inline
8115
8869
  });
8116
- return new RichTextSchema(deserializedOptions, serialized.opt, [], false, false, serialized.description);
8870
+ return new RichTextSchema(deserializedOptions, serialized.opt, [], false, false, serialized.description, (_serialized$render8 = serialized.render) !== null && _serialized$render8 !== void 0 ? _serialized$render8 : null);
8117
8871
  }
8118
8872
  case "record":
8119
8873
  return new RecordSchema(deserializeSchema(serialized.item), serialized.opt, [], null, serialized.key ? deserializeSchema(serialized.key) : null, serialized.mediaType ? {
@@ -8122,27 +8876,30 @@ function deserializeSchemaImpl(serialized) {
8122
8876
  directory: (_serialized$directory = serialized.directory) !== null && _serialized$directory !== void 0 ? _serialized$directory : "/public/val",
8123
8877
  remote: (_serialized$remote = serialized.remote) !== null && _serialized$remote !== void 0 ? _serialized$remote : false,
8124
8878
  altSchema: serialized.alt ? deserializeSchema(serialized.alt) : undefined
8125
- } : undefined, false, false, serialized.description, (_serialized$jsonValue = serialized.jsonValues) !== null && _serialized$jsonValue !== void 0 ? _serialized$jsonValue : false);
8879
+ } : undefined, false, false, serialized.description, (_serialized$jsonValue = serialized.jsonValues) !== null && _serialized$jsonValue !== void 0 ? _serialized$jsonValue : false,
8880
+ // The preview closure cannot survive serialization; the render can.
8881
+ null, (_serialized$render9 = serialized.render) !== null && _serialized$render9 !== void 0 ? _serialized$render9 : null);
8126
8882
  case "keyOf":
8127
- return new KeyOfSchema(serialized.schema, serialized.path, serialized.opt, [], false, false, serialized.description);
8883
+ return new KeyOfSchema(serialized.schema, serialized.path, serialized.opt, [], false, false, serialized.description, (_serialized$render0 = serialized.render) !== null && _serialized$render0 !== void 0 ? _serialized$render0 : null);
8128
8884
  case "route":
8129
8885
  {
8886
+ var _serialized$render1;
8130
8887
  var routeOptions = serialized.options ? {
8131
8888
  include: serialized.options.include ? new RegExp(serialized.options.include.source, serialized.options.include.flags) : undefined,
8132
8889
  exclude: serialized.options.exclude ? new RegExp(serialized.options.exclude.source, serialized.options.exclude.flags) : undefined
8133
8890
  } : undefined;
8134
- return new RouteSchema(routeOptions, serialized.opt, [], false, false, serialized.description);
8891
+ return new RouteSchema(routeOptions, serialized.opt, [], false, false, serialized.description, (_serialized$render1 = serialized.render) !== null && _serialized$render1 !== void 0 ? _serialized$render1 : null);
8135
8892
  }
8136
8893
  case "file":
8137
- return new FileSchema(serialized.options, serialized.opt, serialized.remote, [], {}, false, false, serialized.description);
8894
+ return new FileSchema(serialized.options, serialized.opt, serialized.remote, [], {}, false, false, serialized.description, (_serialized$render10 = serialized.render) !== null && _serialized$render10 !== void 0 ? _serialized$render10 : null);
8138
8895
  case "image":
8139
- return new ImageSchema(serialized.options, serialized.opt, serialized.remote, [], {}, false, false, serialized.description);
8896
+ return new ImageSchema(serialized.options, serialized.opt, serialized.remote, [], {}, false, false, serialized.description, (_serialized$render11 = serialized.render) !== null && _serialized$render11 !== void 0 ? _serialized$render11 : null);
8140
8897
  case "date":
8141
- return new DateSchema(serialized.options, serialized.opt, [], false, false, serialized.description);
8898
+ return new DateSchema(serialized.options, serialized.opt, [], false, false, serialized.description, (_serialized$render12 = serialized.render) !== null && _serialized$render12 !== void 0 ? _serialized$render12 : null);
8142
8899
  case "dateTime":
8143
- return new DateTimeSchema(serialized.options, serialized.opt, [], false, false, serialized.description);
8900
+ return new DateTimeSchema(serialized.options, serialized.opt, [], false, false, serialized.description, (_serialized$render13 = serialized.render) !== null && _serialized$render13 !== void 0 ? _serialized$render13 : null);
8144
8901
  case "color":
8145
- return new ColorSchema(serialized.options, serialized.opt, [], false, false, serialized.description);
8902
+ return new ColorSchema(serialized.options, serialized.opt, [], false, false, serialized.description, (_serialized$render14 = serialized.render) !== null && _serialized$render14 !== void 0 ? _serialized$render14 : null);
8146
8903
  default:
8147
8904
  {
8148
8905
  var exhaustiveCheck = serialized;
@@ -8157,8 +8914,29 @@ function deserializeSchemaImpl(serialized) {
8157
8914
  }
8158
8915
 
8159
8916
  /**
8160
- * What a container shows for ONE of its items: the user's `preview` callback
8161
- * returns this, and the Studio draws a row from it.
8917
+ * A PREVIEW is how a VALUE is shown wherever a preview of it is needed — a row
8918
+ * in a sortable list, a key in a reference dropdown, a search hit, a
8919
+ * reference — which is everywhere the value is NAVIGABLE to rather than open.
8920
+ * It is never how the field itself is edited: that is a RENDER (`render.ts`),
8921
+ * which applies only when you are looking at the field. The two do not
8922
+ * intersect — a schema can carry both, and each is read in its own places.
8923
+ *
8924
+ * A preview is declared on the schema of the VALUE being previewed:
8925
+ *
8926
+ * ```ts
8927
+ * const author = s.object({ name: s.string() })
8928
+ * .preview(({ val }) => ({ title: val.name }));
8929
+ * const authors = s.array(author);
8930
+ * ```
8931
+ *
8932
+ * The container reifies its rows by running each ITEM's preview closure — see
8933
+ * {@link ArrayPreview} / {@link RecordPreview}. (Previews used to be declared
8934
+ * on the container instead; a `.preview` on an array/record now previews the
8935
+ * array/record itself as a value, for when IT is the item of something.)
8936
+ */
8937
+ /**
8938
+ * What a preview shows for one value: the user's `preview` callback returns
8939
+ * this, and the Studio draws a row from it.
8162
8940
  *
8163
8941
  * NB: {@link ArrayPreview} / {@link RecordPreview} name the DATA a container
8164
8942
  * previews with. The Studio also has React components called `ArrayPreview` /
@@ -8168,6 +8946,19 @@ function deserializeSchemaImpl(serialized) {
8168
8946
  * at the import rather than renaming that convention.
8169
8947
  */
8170
8948
 
8949
+ /**
8950
+ * What `.preview(...)` takes, on every schema: the value's own source in, a
8951
+ * {@link PreviewItem} out. `NonNullable` because a container skips null items
8952
+ * rather than previewing them.
8953
+ *
8954
+ * Declared through method syntax deliberately (the same bivariance shape
8955
+ * React's event handler types use): `nullable()` copies a schema's closure
8956
+ * into the `Src | null` variant of the same class, and with a plain function
8957
+ * type the checker cannot see that `NonNullable<Src | null>` IS
8958
+ * `NonNullable<Src>` while `Src` is still a type parameter — every schema's
8959
+ * `nullable()` would need a cast instead.
8960
+ */
8961
+
8171
8962
  /**
8172
8963
  * Main preview type.
8173
8964
  *
@@ -8260,11 +9051,21 @@ function previewScope(paths) {
8260
9051
  // TODO: improve this so that we do not get RawString and string, only string. Are there other things?
8261
9052
 
8262
9053
  /**
8263
- * A RENDER is how one field is laid out in the editor: `s.string().render({ as:
8264
- * "textarea" })`, `.render({ as: "code", language })`.
9054
+ * A RENDER is how the FIELD ITSELF is laid out in the editor, and it applies
9055
+ * only when you are looking at the field: `s.string().render({ as: "textarea"
9056
+ * })`, `.render({ as: "code", language })`, `.render({ as: "inline" })` on an
9057
+ * array/record item.
9058
+ *
9059
+ * A PREVIEW (`preview.ts`) is the other thing: how the VALUE is shown wherever
9060
+ * a preview of it is needed — a list row, a reference dropdown, a search hit —
9061
+ * that is, wherever the value is navigable to rather than open. The two never
9062
+ * intersect: a schema can carry both, a `render` is read where the field is
9063
+ * edited and a `preview` where the value is previewed. A second `.render(...)`
9064
+ * on the same schema REPLACES the first (last one wins), exactly like a second
9065
+ * `.preview(...)` replaces the first — they do not merge.
8265
9066
  *
8266
- * It is static configuration - plain data, with no closure behind it and no
8267
- * dependency on source - which is why it lives in the SERIALIZED schema
9067
+ * A render is static configuration - plain data, with no closure behind it and
9068
+ * no dependency on source - which is why it lives in the SERIALIZED schema
8268
9069
  * (`SerializedStringSchema.render`) and is read straight off it where the field
8269
9070
  * is drawn. There is no render pipeline, no store and no host round-trip.
8270
9071
  *
@@ -8274,9 +9075,6 @@ function previewScope(paths) {
8274
9075
  * the shape it needs back is `executePreview`'s, and the honest move is to give
8275
9076
  * `render` its own execute/store pair again. It is NOT to re-merge the two:
8276
9077
  * conflating them is what this file was split up to undo.
8277
- *
8278
- * The dynamic, source-dependent, demand-scoped thing - what a container shows
8279
- * for its items - is a PREVIEW. See `preview.ts`.
8280
9078
  */
8281
9079
  /**
8282
9080
  * The list is the declaration and {@link CodeLanguage} is derived from it, so
@@ -8285,9 +9083,29 @@ function previewScope(paths) {
8285
9083
  */
8286
9084
  var CODE_LANGUAGES = ["typescript", "javascript", "javascriptreact", "typescriptreact", "json", "java", "html", "css", "xml", "markdown", "sql", "python", "rust", "php", "go", "cpp", "sass", "vue", "angular"];
8287
9085
 
9086
+ /**
9087
+ * `{ as: "inline" }` on a field that is the ITEM of an array or record: the
9088
+ * container renders the field itself inside each (sortable) row, instead of a
9089
+ * clickable preview row that navigates to it. This is what a page-builder list
9090
+ * is made of: `s.array(s.object({...}).render({ as: "inline" }))`.
9091
+ *
9092
+ * On a field that is not directly under an array or record it is inert — an
9093
+ * object's fields are already laid out in place.
9094
+ *
9095
+ * Like every render it is static configuration (see the top of this file): it
9096
+ * travels whole in the serialized schema and the editor reads it straight off
9097
+ * the item schema it already has.
9098
+ */
9099
+
9100
+ /**
9101
+ * What `.render(...)` takes on every field except `s.string()`, and what the
9102
+ * serialized schema carries verbatim.
9103
+ */
9104
+
8288
9105
  /**
8289
9106
  * What `s.string().render(...)` takes, and what the serialized schema carries
8290
- * verbatim.
9107
+ * verbatim. A string has editor layouts of its own (textarea, code) in
9108
+ * addition to the container-facing `inline`.
8291
9109
  */
8292
9110
 
8293
9111
  var externalPageRouter = {
@@ -8561,6 +9379,7 @@ var Internal = {
8561
9379
  getSchema: getSchema,
8562
9380
  getValPath: getValPath,
8563
9381
  getSource: getSource,
9382
+ isValModule: isValModule,
8564
9383
  resolvePath: resolvePath,
8565
9384
  safeResolvePath: safeResolvePath,
8566
9385
  splitModuleFilePathAndModulePath: splitModuleFilePathAndModulePath,