@panneau/fields 5.0.0-alpha.5 → 5.0.0-alpha.7

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 (137) hide show
  1. package/README.md +34 -0
  2. package/dist/boolean/BooleanField.js +78 -17
  3. package/dist/boolean/BooleanField.js.map +1 -1
  4. package/dist/color/ColorField.js.map +1 -1
  5. package/dist/date/DateField.js.map +1 -1
  6. package/dist/datetime/DateTimeField.js +107 -20
  7. package/dist/datetime/DateTimeField.js.map +1 -1
  8. package/dist/duration/DurationField.css +11 -0
  9. package/dist/duration/DurationField.d.ts +26 -0
  10. package/dist/duration/DurationField.d.ts.map +1 -0
  11. package/dist/duration/DurationField.js +214 -0
  12. package/dist/duration/DurationField.js.map +1 -0
  13. package/dist/duration/DurationField.module.js +12 -0
  14. package/dist/duration/DurationField.module.js.map +1 -0
  15. package/dist/duration/index.d.ts +2 -0
  16. package/dist/duration/index.d.ts.map +1 -0
  17. package/dist/duration/index.js +1 -0
  18. package/dist/email/EmailField.js.map +1 -1
  19. package/dist/embed/EmbedField.css +60 -0
  20. package/dist/embed/EmbedField.d.ts +20 -0
  21. package/dist/embed/EmbedField.d.ts.map +1 -0
  22. package/dist/embed/EmbedField.js +246 -0
  23. package/dist/embed/EmbedField.js.map +1 -0
  24. package/dist/embed/EmbedField.module.js +22 -0
  25. package/dist/embed/EmbedField.module.js.map +1 -0
  26. package/dist/embed/index.d.ts +3 -0
  27. package/dist/embed/index.d.ts.map +1 -0
  28. package/dist/embed/index.js +3 -0
  29. package/dist/file/FileField.d.ts.map +1 -1
  30. package/dist/file/FileField.js +167 -77
  31. package/dist/file/FileField.js.map +1 -1
  32. package/dist/group/GroupField.js.map +1 -1
  33. package/dist/index.d.ts +3 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +3 -1
  36. package/dist/json/JsonField.css +7 -0
  37. package/dist/json/JsonField.d.ts +22 -0
  38. package/dist/json/JsonField.d.ts.map +1 -0
  39. package/dist/json/JsonField.js +207 -0
  40. package/dist/json/JsonField.js.map +1 -0
  41. package/dist/json/JsonField.module.js +8 -0
  42. package/dist/json/JsonField.module.js.map +1 -0
  43. package/dist/json/index.d.ts +2 -0
  44. package/dist/json/index.d.ts.map +1 -0
  45. package/dist/json/index.js +1 -0
  46. package/dist/locales/index.js.map +1 -1
  47. package/dist/localized/LocalizedField.js.map +1 -1
  48. package/dist/location/LocationField.css +54 -0
  49. package/dist/location/LocationField.d.ts +31 -0
  50. package/dist/location/LocationField.d.ts.map +1 -0
  51. package/dist/location/LocationField.js +563 -0
  52. package/dist/location/LocationField.js.map +1 -0
  53. package/dist/location/LocationField.module.js +22 -0
  54. package/dist/location/LocationField.module.js.map +1 -0
  55. package/dist/location/LocationMap.d.ts +25 -0
  56. package/dist/location/LocationMap.d.ts.map +1 -0
  57. package/dist/location/LocationMap.js +205 -0
  58. package/dist/location/LocationMap.js.map +1 -0
  59. package/dist/location/index.d.ts +5 -0
  60. package/dist/location/index.d.ts.map +1 -0
  61. package/dist/location/index.js +4 -0
  62. package/dist/location/leafletCss.d.ts +2 -0
  63. package/dist/location/leafletCss.d.ts.map +1 -0
  64. package/dist/location/leafletCss.js +6 -0
  65. package/dist/location/leafletCss.js.map +1 -0
  66. package/dist/location/nominatim.d.ts +17 -0
  67. package/dist/location/nominatim.d.ts.map +1 -0
  68. package/dist/location/nominatim.js +50 -0
  69. package/dist/location/nominatim.js.map +1 -0
  70. package/dist/location/types.d.ts +40 -0
  71. package/dist/location/types.d.ts.map +1 -0
  72. package/dist/missing/MissingField.d.ts +3 -2
  73. package/dist/missing/MissingField.d.ts.map +1 -1
  74. package/dist/missing/MissingField.js +3 -2
  75. package/dist/missing/MissingField.js.map +1 -1
  76. package/dist/number/NumberField.js.map +1 -1
  77. package/dist/range/RangeField.d.ts +22 -0
  78. package/dist/range/RangeField.d.ts.map +1 -0
  79. package/dist/range/RangeField.js +203 -0
  80. package/dist/range/RangeField.js.map +1 -0
  81. package/dist/range/index.d.ts +2 -0
  82. package/dist/range/index.d.ts.map +1 -0
  83. package/dist/range/index.js +1 -0
  84. package/dist/relation/RelationField.js +485 -145
  85. package/dist/relation/RelationField.js.map +1 -1
  86. package/dist/repeater/RepeaterField.js +118 -34
  87. package/dist/repeater/RepeaterField.js.map +1 -1
  88. package/dist/select/SelectField.js.map +1 -1
  89. package/dist/shared/DefinitionField.js.map +1 -1
  90. package/dist/shared/builtIn.d.ts +1 -0
  91. package/dist/shared/builtIn.d.ts.map +1 -1
  92. package/dist/shared/builtIn.js +16 -1
  93. package/dist/shared/builtIn.js.map +1 -1
  94. package/dist/shared/check.js.map +1 -1
  95. package/dist/shared/context.d.ts +13 -3
  96. package/dist/shared/context.d.ts.map +1 -1
  97. package/dist/shared/context.js +27 -19
  98. package/dist/shared/context.js.map +1 -1
  99. package/dist/shared/cx.js.map +1 -1
  100. package/dist/shared/dates.js.map +1 -1
  101. package/dist/shared/embed.d.ts +19 -0
  102. package/dist/shared/embed.d.ts.map +1 -0
  103. package/dist/shared/embed.js +14 -0
  104. package/dist/shared/embed.js.map +1 -0
  105. package/dist/shared/entry.js.map +1 -1
  106. package/dist/shared/relation.js.map +1 -1
  107. package/dist/slug/SlugField.d.ts.map +1 -1
  108. package/dist/slug/SlugField.js +184 -36
  109. package/dist/slug/SlugField.js.map +1 -1
  110. package/dist/tags/TagsField.d.ts +17 -0
  111. package/dist/tags/TagsField.d.ts.map +1 -0
  112. package/dist/tags/TagsField.js +120 -0
  113. package/dist/tags/TagsField.js.map +1 -0
  114. package/dist/tags/index.d.ts +2 -0
  115. package/dist/tags/index.d.ts.map +1 -0
  116. package/dist/tags/index.js +1 -0
  117. package/dist/tel/TelField.d.ts +11 -0
  118. package/dist/tel/TelField.d.ts.map +1 -0
  119. package/dist/tel/TelField.js +87 -0
  120. package/dist/tel/TelField.js.map +1 -0
  121. package/dist/tel/index.d.ts +2 -0
  122. package/dist/tel/index.d.ts.map +1 -0
  123. package/dist/tel/index.js +1 -0
  124. package/dist/text/TextField.js.map +1 -1
  125. package/dist/textarea/TextAreaField.js.map +1 -1
  126. package/dist/time/TimeField.js +64 -10
  127. package/dist/time/TimeField.js.map +1 -1
  128. package/dist/upload/FilePicker.js +107 -24
  129. package/dist/upload/FilePicker.js.map +1 -1
  130. package/dist/upload/UploadList.js.map +1 -1
  131. package/dist/upload/files.js.map +1 -1
  132. package/dist/upload/useRejectionMessage.js.map +1 -1
  133. package/dist/upload/useUploads.js.map +1 -1
  134. package/dist/uppy/uploader.js.map +1 -1
  135. package/dist/url/UrlField.js +69 -14
  136. package/dist/url/UrlField.js.map +1 -1
  137. package/package.json +41 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbedField.module.js","names":[],"sources":["../../src/embed/EmbedField.module.css"],"sourcesContent":["/* The URL, then the preview of what it embeds. */\n.embed {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-space-2);\n}\n\n.status {\n display: flex;\n align-items: center;\n gap: var(--panneau-space-2);\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-text-muted);\n}\n\n.preview {\n display: flex;\n align-items: center;\n gap: var(--panneau-space-3);\n padding: var(--panneau-space-2);\n color: var(--panneau-color-text);\n text-decoration: none;\n background-color: var(--panneau-color-surface-sunken);\n border: var(--panneau-border-width) solid var(--panneau-color-border);\n border-radius: var(--panneau-radius-md);\n}\n\n.preview:hover {\n border-color: var(--panneau-color-border-control);\n}\n\n.preview:focus-visible {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: 1px;\n}\n\n.thumbnail {\n flex: none;\n width: 7rem;\n aspect-ratio: 16 / 9;\n object-fit: cover;\n border-radius: var(--panneau-radius-sm);\n}\n\n.text {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n min-width: 0;\n}\n\n.title {\n font-weight: var(--panneau-font-weight-medium);\n overflow-wrap: anywhere;\n}\n\n.provider {\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-text-muted);\n}\n"],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export { EmbedField, EmbedFieldEntry, type EmbedFieldProps, type EmbedValue, isEmbed, } from './EmbedField';
2
+ export { type EmbedAdapter, type EmbedSource, createEmbedSource } from '../shared/embed';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embed/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,UAAU,EACV,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,OAAO,GACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { EmbedField, EmbedFieldEntry, isEmbed } from "./EmbedField.js";
2
+ import { createEmbedSource } from "../shared/embed.js";
3
+ export { EmbedField, EmbedFieldEntry, createEmbedSource, isEmbed };
@@ -1 +1 @@
1
- {"version":3,"file":"FileField.d.ts","sourceRoot":"","sources":["../../src/file/FileField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAInE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKlE;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,IAAI,CAAC;AAEzD,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACrF,mGAAmG;IACnG,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC5D,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,sBAAuB,SAAQ,kBAAkB;IAC9D,QAAQ,EAAE,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAAC;IACpC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;CAClD;AAED,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG,sBAAsB,CAAC;AAY3E,mDAAmD;AACnD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAS9D;AAED,gDAAgD;AAChD,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,EAAE,CAKnD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,+BAgI9C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,+BAYpD"}
1
+ {"version":3,"file":"FileField.d.ts","sourceRoot":"","sources":["../../src/file/FileField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAInE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKlE;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,IAAI,CAAC;AAEzD,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACrF,mGAAmG;IACnG,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC5D,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,sBAAuB,SAAQ,kBAAkB;IAC9D,QAAQ,EAAE,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAAC;IACpC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;CAClD;AAED,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG,sBAAsB,CAAC;AAY3E,mDAAmD;AACnD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAS9D;AAED,gDAAgD;AAChD,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,EAAE,CAKnD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,+BAiI9C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,+BAYpD"}
@@ -37,102 +37,192 @@ function toFiles(value) {
37
37
  * value, and is added to a multiple one.
38
38
  */
39
39
  function FileField(props) {
40
+ const $ = c(42);
40
41
  const intl = usePanneauIntl();
41
42
  const context = useFieldsContext();
42
- const { accept = null, maxSize = null, uploadSource = context.uploadSource, label, description, errors = [], disabled, readOnly, required, className, labelClassName, descriptionClassName, errorsClassName } = props;
43
+ const { accept: t0, maxSize: t1, label, description, errors: t2, disabled, readOnly, required, className, labelClassName, descriptionClassName, errorsClassName } = props;
44
+ const accept = t0 === void 0 ? null : t0;
45
+ const maxSize = t1 === void 0 ? null : t1;
46
+ let t3;
47
+ if ($[0] !== t2) {
48
+ t3 = t2 === void 0 ? [] : t2;
49
+ $[0] = t2;
50
+ $[1] = t3;
51
+ } else t3 = $[1];
52
+ const errors = t3;
53
+ const uploadSource = props.uploadSource === void 0 ? context.uploadSource : props.uploadSource;
43
54
  const multiple = props.multiple === true;
44
- const files = toFiles(props.value);
55
+ let t4;
56
+ if ($[2] !== props.value) {
57
+ t4 = toFiles(props.value);
58
+ $[2] = props.value;
59
+ $[3] = t4;
60
+ } else t4 = $[3];
61
+ const files = t4;
45
62
  const editable = disabled !== true && readOnly !== true;
46
- const [rejections, setRejections] = useState([]);
63
+ let t5;
64
+ if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
65
+ t5 = [];
66
+ $[4] = t5;
67
+ } else t5 = $[4];
68
+ const [rejections, setRejections] = useState(t5);
47
69
  const rejectionMessage = useRejectionMessage(maxSize);
48
70
  const latest = useRef(files);
49
- useEffect(() => {
50
- latest.current = files;
51
- });
71
+ let t6;
72
+ if ($[5] !== files) {
73
+ t6 = () => {
74
+ latest.current = files;
75
+ };
76
+ $[5] = files;
77
+ $[6] = t6;
78
+ } else t6 = $[6];
79
+ useEffect(t6);
52
80
  const set = (next) => {
53
81
  latest.current = next;
54
82
  if (props.multiple === true) props.onChange?.(next.length > 0 ? next : null);
55
83
  else props.onChange?.(next[0] ?? null);
56
84
  };
85
+ let t7;
86
+ if ($[7] !== rejectionMessage) {
87
+ t7 = (file_0, reason) => setRejections((current) => [...current, rejectionMessage(file_0, reason)]);
88
+ $[7] = rejectionMessage;
89
+ $[8] = t7;
90
+ } else t7 = $[8];
57
91
  const upload = useUploads({
58
92
  source: uploadSource,
59
93
  accept,
60
94
  maxSize,
61
95
  onUploaded: (file) => set(multiple ? [...latest.current, file] : [file]),
62
- onRejected: (file_0, reason) => setRejections((current) => [...current, rejectionMessage(file_0, reason)])
96
+ onRejected: t7
63
97
  });
64
- return /* @__PURE__ */ jsx(Fieldset, {
65
- legend: label,
66
- description,
67
- errors: [...errors, ...rejections],
68
- isRequired: required,
69
- isDisabled: disabled,
70
- className,
71
- legendClassName: labelClassName,
72
- descriptionClassName,
73
- errorsClassName,
74
- children: /* @__PURE__ */ jsxs("div", {
75
- className: FileField_module_default.field,
98
+ const T0 = Fieldset;
99
+ let t8;
100
+ if ($[9] !== errors || $[10] !== rejections) {
101
+ t8 = [...errors, ...rejections];
102
+ $[9] = errors;
103
+ $[10] = rejections;
104
+ $[11] = t8;
105
+ } else t8 = $[11];
106
+ const t9 = FileField_module_default;
107
+ const t10 = files.length > 0 ? /* @__PURE__ */ jsx("ul", {
108
+ className: FileField_module_default.files,
109
+ children: files.map((file_1, index) => {
110
+ const { name } = file_1;
111
+ const url = fileUrl(file_1);
112
+ const size = fileSize(file_1);
113
+ return /* @__PURE__ */ jsxs("li", {
114
+ className: FileField_module_default.file,
115
+ children: [
116
+ /* @__PURE__ */ jsx(FileText, {
117
+ "aria-hidden": true,
118
+ className: FileField_module_default.icon
119
+ }),
120
+ url !== null ? /* @__PURE__ */ jsx("a", {
121
+ href: url,
122
+ className: FileField_module_default.name,
123
+ target: "_blank",
124
+ rel: "noreferrer",
125
+ children: name
126
+ }) : /* @__PURE__ */ jsx("span", {
127
+ className: FileField_module_default.name,
128
+ children: name
129
+ }),
130
+ size !== null ? /* @__PURE__ */ jsx("span", {
131
+ className: FileField_module_default.size,
132
+ children: formatSize(size, intl.locale)
133
+ }) : null,
134
+ editable ? /* @__PURE__ */ jsx(IconButton, {
135
+ icon: X,
136
+ size: "sm",
137
+ label: intl.formatMessage(messages.removeFile, { name }),
138
+ onPress: () => set(latest.current.filter((_, at) => at !== index))
139
+ }) : null
140
+ ]
141
+ }, `${String(index)}-${name}`);
142
+ })
143
+ }) : upload.items.length === 0 ? /* @__PURE__ */ jsx("span", {
144
+ className: FileField_module_default.none,
145
+ children: intl.formatMessage(messages.noFile)
146
+ }) : null;
147
+ let t11;
148
+ if ($[12] !== upload.cancel || $[13] !== upload.items || $[14] !== upload.pause || $[15] !== upload.resume || $[16] !== upload.retry) {
149
+ t11 = /* @__PURE__ */ jsx(UploadList, {
150
+ items: upload.items,
151
+ onPause: upload.pause,
152
+ onResume: upload.resume,
153
+ onCancel: upload.cancel,
154
+ onRetry: upload.retry
155
+ });
156
+ $[12] = upload.cancel;
157
+ $[13] = upload.items;
158
+ $[14] = upload.pause;
159
+ $[15] = upload.resume;
160
+ $[16] = upload.retry;
161
+ $[17] = t11;
162
+ } else t11 = $[17];
163
+ let t12;
164
+ if ($[18] !== accept || $[19] !== editable || $[20] !== files.length || $[21] !== intl || $[22] !== multiple || $[23] !== upload) {
165
+ t12 = editable ? /* @__PURE__ */ jsx(FilePicker, {
166
+ accept,
167
+ multiple,
168
+ ...!multiple && files.length > 0 ? { label: intl.formatMessage(messages.replaceFile) } : {},
169
+ onSelect: (selected) => {
170
+ setRejections([]);
171
+ upload.add(selected);
172
+ }
173
+ }) : null;
174
+ $[18] = accept;
175
+ $[19] = editable;
176
+ $[20] = files.length;
177
+ $[21] = intl;
178
+ $[22] = multiple;
179
+ $[23] = upload;
180
+ $[24] = t12;
181
+ } else t12 = $[24];
182
+ let t13;
183
+ if ($[25] !== t10 || $[26] !== t11 || $[27] !== t12 || $[28] !== t9.field) {
184
+ t13 = /* @__PURE__ */ jsxs("div", {
185
+ className: t9.field,
76
186
  children: [
77
- files.length > 0 ? /* @__PURE__ */ jsx("ul", {
78
- className: FileField_module_default.files,
79
- children: files.map((file_1, index) => {
80
- const { name } = file_1;
81
- const url = fileUrl(file_1);
82
- const size = fileSize(file_1);
83
- return /* @__PURE__ */ jsxs("li", {
84
- className: FileField_module_default.file,
85
- children: [
86
- /* @__PURE__ */ jsx(FileText, {
87
- "aria-hidden": true,
88
- className: FileField_module_default.icon
89
- }),
90
- url !== null ? /* @__PURE__ */ jsx("a", {
91
- href: url,
92
- className: FileField_module_default.name,
93
- target: "_blank",
94
- rel: "noreferrer",
95
- children: name
96
- }) : /* @__PURE__ */ jsx("span", {
97
- className: FileField_module_default.name,
98
- children: name
99
- }),
100
- size !== null ? /* @__PURE__ */ jsx("span", {
101
- className: FileField_module_default.size,
102
- children: formatSize(size, intl.locale)
103
- }) : null,
104
- editable ? /* @__PURE__ */ jsx(IconButton, {
105
- icon: X,
106
- size: "sm",
107
- label: intl.formatMessage(messages.removeFile, { name }),
108
- onPress: () => set(latest.current.filter((_, at) => at !== index))
109
- }) : null
110
- ]
111
- }, `${String(index)}-${name}`);
112
- })
113
- }) : upload.items.length === 0 ? /* @__PURE__ */ jsx("span", {
114
- className: FileField_module_default.none,
115
- children: intl.formatMessage(messages.noFile)
116
- }) : null,
117
- /* @__PURE__ */ jsx(UploadList, {
118
- items: upload.items,
119
- onPause: upload.pause,
120
- onResume: upload.resume,
121
- onCancel: upload.cancel,
122
- onRetry: upload.retry
123
- }),
124
- editable ? /* @__PURE__ */ jsx(FilePicker, {
125
- accept,
126
- multiple,
127
- ...!multiple && files.length > 0 ? { label: intl.formatMessage(messages.replaceFile) } : {},
128
- onSelect: (selected) => {
129
- setRejections([]);
130
- upload.add(selected);
131
- }
132
- }) : null
187
+ t10,
188
+ t11,
189
+ t12
133
190
  ]
134
- })
135
- });
191
+ });
192
+ $[25] = t10;
193
+ $[26] = t11;
194
+ $[27] = t12;
195
+ $[28] = t9.field;
196
+ $[29] = t13;
197
+ } else t13 = $[29];
198
+ let t14;
199
+ if ($[30] !== T0 || $[31] !== className || $[32] !== description || $[33] !== descriptionClassName || $[34] !== disabled || $[35] !== errorsClassName || $[36] !== label || $[37] !== labelClassName || $[38] !== required || $[39] !== t13 || $[40] !== t8) {
200
+ t14 = /* @__PURE__ */ jsx(T0, {
201
+ legend: label,
202
+ description,
203
+ errors: t8,
204
+ isRequired: required,
205
+ isDisabled: disabled,
206
+ className,
207
+ legendClassName: labelClassName,
208
+ descriptionClassName,
209
+ errorsClassName,
210
+ children: t13
211
+ });
212
+ $[30] = T0;
213
+ $[31] = className;
214
+ $[32] = description;
215
+ $[33] = descriptionClassName;
216
+ $[34] = disabled;
217
+ $[35] = errorsClassName;
218
+ $[36] = label;
219
+ $[37] = labelClassName;
220
+ $[38] = required;
221
+ $[39] = t13;
222
+ $[40] = t8;
223
+ $[41] = t14;
224
+ } else t14 = $[41];
225
+ return t14;
136
226
  }
137
227
  /**
138
228
  * The registry entry of the `file` type: the field's `multiple`, `accept` (or its `accept` rule)
@@ -1 +1 @@
1
- {"version":3,"file":"FileField.js","names":["file","onChange","styles","_c"],"sources":["../../src/file/FileField.tsx"],"sourcesContent":["import { FileText, X } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\n\nimport type { StoredFile } from '@panneau/protocol';\nimport { Fieldset, IconButton, usePanneauIntl } from '@panneau/ui';\n\nimport { useFieldsContext } from '../shared/context';\nimport { getAccept, getFieldProps, getMaxSize } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport { FilePicker } from '../upload/FilePicker';\nimport { UploadList } from '../upload/UploadList';\nimport { formatSize } from '../upload/files';\nimport type { UploadSource, UploadedFile } from '../upload/types';\nimport { useRejectionMessage } from '../upload/useRejectionMessage';\nimport { useUploads } from '../upload/useUploads';\nimport styles from './FileField.module.css';\n\n/**\n * A file of a `file` value: a stored file, as items give it; an upload, once the browser sent the\n * file to storage; or the file itself, sent in a multipart request without direct uploads.\n */\nexport type FileValue = StoredFile | UploadedFile | File;\n\nexport interface FileFieldBaseProps extends Omit<FieldProps<never>, 'value' | 'onChange'> {\n /** Accepted MIME types (`application/pdf`, `image/*`). Others are refused before they are sent. */\n accept?: readonly string[] | null;\n /** Largest file, in bytes. Larger ones are refused before they are sent. */\n maxSize?: number | null;\n /**\n * Where files are uploaded directly to storage. Defaults to the one of the fields context.\n * Without one, the value holds the files themselves, which the adapter sends in\n * `multipart/form-data`.\n */\n uploadSource?: UploadSource | null;\n}\n\nexport interface SingleFileFieldProps extends FileFieldBaseProps {\n multiple?: false;\n value?: FileValue | null;\n onChange?: (value: FileValue | null) => void;\n}\n\nexport interface MultipleFileFieldProps extends FileFieldBaseProps {\n multiple: true;\n value?: readonly FileValue[] | null;\n /** Called with the files. An empty list is `null`. */\n onChange?: (value: FileValue[] | null) => void;\n}\n\nexport type FileFieldProps = SingleFileFieldProps | MultipleFileFieldProps;\n\nfunction fileSize(file: FileValue): number | null {\n return typeof file.size === 'number' ? file.size : null;\n}\n\nfunction fileUrl(file: FileValue): string | null {\n return !(file instanceof Blob) && 'url' in file && typeof file.url === 'string'\n ? file.url\n : null;\n}\n\n/** Whether a value is a file of a `file` value. */\nexport function isFileValue(value: unknown): value is FileValue {\n if (typeof File !== 'undefined' && value instanceof File) {\n return true;\n }\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { name?: unknown }).name === 'string'\n );\n}\n\n/** The files of a value, single or multiple. */\nexport function toFiles(value: unknown): FileValue[] {\n if (Array.isArray(value)) {\n return value.filter(isFileValue);\n }\n return isFileValue(value) ? [value] : [];\n}\n\n/**\n * Files that belong to an item, outside the media library: an attachment, a PDF, a CSV (the\n * `file` type). With an upload source, files go directly to storage, and the value references\n * each upload (`{ upload, name, mime, size }`). Without one, the value is the file itself. Items\n * give stored files, which the field shows with a link. A new file replaces the file of a single\n * value, and is added to a multiple one.\n */\nexport function FileField(props: FileFieldProps) {\n const intl = usePanneauIntl();\n const context = useFieldsContext();\n const {\n accept = null,\n maxSize = null,\n uploadSource = context.uploadSource,\n label,\n description,\n errors = [],\n disabled,\n readOnly,\n required,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n } = props;\n const multiple = props.multiple === true;\n const files = toFiles(props.value);\n const editable = disabled !== true && readOnly !== true;\n const [rejections, setRejections] = useState<string[]>([]);\n const rejectionMessage = useRejectionMessage(maxSize);\n\n // The files as last set, so that uploads that end together all add theirs.\n const latest = useRef(files);\n useEffect(() => {\n latest.current = files;\n });\n const set = (next: FileValue[]) => {\n latest.current = next;\n if (props.multiple === true) {\n props.onChange?.(next.length > 0 ? next : null);\n } else {\n props.onChange?.(next[0] ?? null);\n }\n };\n\n const upload = useUploads({\n source: uploadSource,\n accept,\n maxSize,\n onUploaded: (file) => set(multiple ? [...latest.current, file] : [file]),\n onRejected: (file, reason) =>\n setRejections((current) => [...current, rejectionMessage(file, reason)]),\n });\n\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={[...errors, ...rejections]}\n isRequired={required}\n isDisabled={disabled}\n className={className}\n legendClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n >\n <div className={styles.field}>\n {files.length > 0 ? (\n <ul className={styles.files}>\n {files.map((file, index) => {\n const { name } = file;\n const url = fileUrl(file);\n const size = fileSize(file);\n return (\n <li key={`${String(index)}-${name}`} className={styles.file}>\n <FileText aria-hidden className={styles.icon} />\n {url !== null ? (\n <a\n href={url}\n className={styles.name}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {name}\n </a>\n ) : (\n <span className={styles.name}>{name}</span>\n )}\n {size !== null ? (\n <span className={styles.size}>\n {formatSize(size, intl.locale)}\n </span>\n ) : null}\n {editable ? (\n <IconButton\n icon={X}\n size=\"sm\"\n label={intl.formatMessage(messages.removeFile, {\n name,\n })}\n onPress={() =>\n set(latest.current.filter((_, at) => at !== index))\n }\n />\n ) : null}\n </li>\n );\n })}\n </ul>\n ) : upload.items.length === 0 ? (\n <span className={styles.none}>{intl.formatMessage(messages.noFile)}</span>\n ) : null}\n <UploadList\n items={upload.items}\n onPause={upload.pause}\n onResume={upload.resume}\n onCancel={upload.cancel}\n onRetry={upload.retry}\n />\n {editable ? (\n <FilePicker\n accept={accept}\n multiple={multiple}\n {...(!multiple && files.length > 0\n ? { label: intl.formatMessage(messages.replaceFile) }\n : {})}\n onSelect={(selected) => {\n setRejections([]);\n upload.add(selected);\n }}\n />\n ) : null}\n </div>\n </Fieldset>\n );\n}\n\n/**\n * The registry entry of the `file` type: the field's `multiple`, `accept` (or its `accept` rule)\n * and `maxSize` rule, with the upload source of the fields context.\n */\nexport function FileFieldEntry(props: FieldEntryProps) {\n const { field, value, onChange } = props;\n const common = {\n ...getFieldProps(props),\n accept: getAccept(field),\n maxSize: getMaxSize(field),\n };\n return field.multiple === true ? (\n <FileField {...common} multiple value={toFiles(value)} onChange={onChange} />\n ) : (\n <FileField {...common} value={toFiles(value)[0] ?? null} onChange={onChange} />\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAoDA,SAAS,SAAS,MAAgC;CAC9C,OAAO,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AACvD;AAEA,SAAS,QAAQ,MAAgC;CAC7C,OAAO,EAAE,gBAAgB,SAAS,SAAS,QAAQ,OAAO,KAAK,QAAQ,WACjE,KAAK,MACL;AACV;;AAGA,SAAgB,YAAY,OAAoC;CAC5D,IAAI,OAAO,SAAS,eAAe,iBAAiB,MAChD,OAAO;CAEX,OACI,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAA6B,SAAS;AAEtD;;AAGA,SAAgB,QAAQ,OAA6B;CACjD,IAAI,MAAM,QAAQ,KAAK,GACnB,OAAO,MAAM,OAAO,WAAW;CAEnC,OAAO,YAAY,KAAK,IAAI,CAAC,KAAK,IAAI,CAAA;AAC1C;;;;;;;;AASA,SAAgB,UAAU,OAAuB;CAC7C,MAAM,OAAO,eAAe;CAC5B,MAAM,UAAU,iBAAiB;CACjC,MAAM,EACF,SAAS,MACT,UAAU,MACV,eAAe,QAAQ,cACvB,OACA,aACA,SAAS,CAAA,GACT,UACA,UACA,UACA,WACA,gBACA,sBACA,oBACA;CACJ,MAAM,WAAW,MAAM,aAAa;CACpC,MAAM,QAAQ,QAAQ,MAAM,KAAK;CACjC,MAAM,WAAW,aAAa,QAAQ,aAAa;CACnD,MAAM,CAAC,YAAY,iBAAiB,SAAmB,CAAA,CAAE;CACzD,MAAM,mBAAmB,oBAAoB,OAAO;CAGpD,MAAM,SAAS,OAAO,KAAK;CAC3B,gBAAgB;EACZ,OAAO,UAAU;CACrB,CAAC;CACD,MAAM,OAAO,SAAsB;EAC/B,OAAO,UAAU;EACjB,IAAI,MAAM,aAAa,MACnB,MAAM,WAAW,KAAK,SAAS,IAAI,OAAO,IAAI;OAE9C,MAAM,WAAW,KAAK,MAAM,IAAI;CAExC;CAEA,MAAM,SAAS,WAAW;EACtB,QAAQ;EACR;EACA;EACA,aAAa,SAAS,IAAI,WAAW,CAAC,GAAG,OAAO,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC;EACvE,aAAaA,QAAM,WACf,eAAe,YAAY,CAAC,GAAG,SAAS,iBAAiBA,QAAM,MAAM,CAAC,CAAC;CAC/E,CAAC;CAED,OACI,oBAAC,UAAD;EACI,QAAQ;EACK;EACb,QAAQ,CAAC,GAAG,QAAQ,GAAG,UAAU;EACjC,YAAY;EACZ,YAAY;EACD;EACX,iBAAiB;EACK;EACL;EAEjB,UAAA,qBAAC,OAAD;GAAK,WAAWE,yBAAO;GAAvB,UAAA;IACK,MAAM,SAAS,IACZ,oBAAC,MAAD;KAAI,WAAWA,yBAAO;KACjB,UAAA,MAAM,KAAKF,QAAM,UAAU;MACxB,MAAM,EAAE,SAASA;MACjB,MAAM,MAAM,QAAQA,MAAI;MACxB,MAAM,OAAO,SAASA,MAAI;MAC1B,OACI,qBAAC,MAAD;OAAqC,WAAWE,yBAAO;OAAvD,UAAA;QACI,oBAAC,UAAD;SAAU,eAAA;SAAY,WAAWA,yBAAO;QAAK,CAAA;QAC5C,QAAQ,OACL,oBAAC,KAAD;SACI,MAAM;SACN,WAAWA,yBAAO;SAClB,QAAO;SACP,KAAI;SAEH,UAAA;QACF,CAAA,IAEH,oBAAC,QAAD;SAAM,WAAWA,yBAAO;SAAO,UAAA;QAAW,CAAA;QAE7C,SAAS,OACN,oBAAC,QAAD;SAAM,WAAWA,yBAAO;SACnB,UAAA,WAAW,MAAM,KAAK,MAAM;QAC3B,CAAA,IACN;QACH,WACG,oBAAC,YAAD;SACI,MAAM;SACN,MAAK;SACL,OAAO,KAAK,cAAc,SAAS,YAAY,EAC3C,KACJ,CAAC;SACD,eACI,IAAI,OAAO,QAAQ,QAAQ,GAAG,OAAO,OAAO,KAAK,CAAC;QACrD,CAAA,IAEL;OACJ;MA/BK,GAAA,GAAG,OAAO,KAAK,EAAC,GAAI,MA+BzB;KAEZ,CAAC;IACD,CAAA,IACJ,OAAO,MAAM,WAAW,IACxB,oBAAC,QAAD;KAAM,WAAWA,yBAAO;KAAO,UAAA,KAAK,cAAc,SAAS,MAAM;IAAQ,CAAA,IACzE;IACJ,oBAAC,YAAD;KACI,OAAO,OAAO;KACd,SAAS,OAAO;KAChB,UAAU,OAAO;KACjB,UAAU,OAAO;KACjB,SAAS,OAAO;IAAM,CAAA;IAEzB,WACG,oBAAC,YAAD;KACY;KACE;KACV,GAAK,CAAC,YAAY,MAAM,SAAS,IAC3B,EAAE,OAAO,KAAK,cAAc,SAAS,WAAW,EAAE,IAClD,CAAC;KACP,WAAW,aAAa;MACpB,cAAc,CAAA,CAAE;MAChB,OAAO,IAAI,QAAQ;KACvB;IAAE,CAAA,IAEN;GACH;;CACC,CAAA;AAElB;;;;;AAMA,SAAO,eAAA,OAAA;CAAA,MAAA,IAAAC,EAAA,EAAA;CACH,MAAA,EAAA,OAAA,OAAA,aAAmC;CAAM,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EAElC,KAAA,cAAc,KAAK;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EACf,KAAA,UAAU,KAAK;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EACf,KAAA,WAAW,KAAK;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA,EAAA,OAAA,MAAA,EAAA,OAAA,IAAA;EAHf,KAAA;GAAA,GACR;GAAoB,QACf;GAAgB,SACf;EACb;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAJD,MAAA,SAAe;CAIb,IAAA;CAAA,IAAA,EAAA,QAAA,UAAA,EAAA,QAAA,MAAA,YAAA,EAAA,QAAA,YAAA,EAAA,QAAA,OAAA;EACK,KAAA,MAAK,aAAc,OACtB,oBAAC,WAAD;GAAU,GAAK;GAAQ,UAAA;GAAgB,OAAA,QAAQ,KAAK;GAAa;EAAQ,CAAA,IAEzE,oBAAC,WAAD;GAAU,GAAK;GAAe,OAAA,QAAQ,KAAK,CAAC,CAAA,MAAd;GAAqC;EAAQ,CAAA;EAC9E,EAAA,MAAA;EAAA,EAAA,MAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OAJM;AAIN"}
1
+ {"version":3,"file":"FileField.js","names":["FileText","X","useEffect","useRef","useState","StoredFile","Fieldset","IconButton","usePanneauIntl","useFieldsContext","getAccept","getFieldProps","getMaxSize","messages","FieldEntryProps","FieldProps","FilePicker","UploadList","formatSize","UploadSource","UploadedFile","useRejectionMessage","useUploads","styles","FileValue","File","FileFieldBaseProps","Omit","accept","maxSize","uploadSource","SingleFileFieldProps","multiple","value","onChange","MultipleFileFieldProps","FileFieldProps","fileSize","file","size","fileUrl","Blob","url","isFileValue","name","toFiles","Array","isArray","filter","FileField","props","$","_c","intl","context","t0","t1","label","description","errors","t2","disabled","readOnly","required","className","labelClassName","descriptionClassName","errorsClassName","undefined","t3","t4","files","editable","t5","Symbol","for","rejections","setRejections","rejectionMessage","latest","t6","current","set","next","length","t7","file_0","reason","upload","source","onUploaded","onRejected","T0","t8","t10","map","file_1","index","String","icon","locale","formatMessage","removeFile","_","at","items","none","noFile","t11","cancel","pause","resume","retry","t12","replaceFile","selected","add","t13","t9","field","t14","FileFieldEntry","common","_c","styles"],"sources":["../../src/file/FileField.tsx"],"sourcesContent":["import { FileText, X } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\n\nimport type { StoredFile } from '@panneau/protocol';\nimport { Fieldset, IconButton, usePanneauIntl } from '@panneau/ui';\n\nimport { useFieldsContext } from '../shared/context';\nimport { getAccept, getFieldProps, getMaxSize } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport { FilePicker } from '../upload/FilePicker';\nimport { UploadList } from '../upload/UploadList';\nimport { formatSize } from '../upload/files';\nimport type { UploadSource, UploadedFile } from '../upload/types';\nimport { useRejectionMessage } from '../upload/useRejectionMessage';\nimport { useUploads } from '../upload/useUploads';\nimport styles from './FileField.module.css';\n\n/**\n * A file of a `file` value: a stored file, as items give it; an upload, once the browser sent the\n * file to storage; or the file itself, sent in a multipart request without direct uploads.\n */\nexport type FileValue = StoredFile | UploadedFile | File;\n\nexport interface FileFieldBaseProps extends Omit<FieldProps<never>, 'value' | 'onChange'> {\n /** Accepted MIME types (`application/pdf`, `image/*`). Others are refused before they are sent. */\n accept?: readonly string[] | null;\n /** Largest file, in bytes. Larger ones are refused before they are sent. */\n maxSize?: number | null;\n /**\n * Where files are uploaded directly to storage. Defaults to the one of the fields context.\n * Without one, the value holds the files themselves, which the adapter sends in\n * `multipart/form-data`.\n */\n uploadSource?: UploadSource | null;\n}\n\nexport interface SingleFileFieldProps extends FileFieldBaseProps {\n multiple?: false;\n value?: FileValue | null;\n onChange?: (value: FileValue | null) => void;\n}\n\nexport interface MultipleFileFieldProps extends FileFieldBaseProps {\n multiple: true;\n value?: readonly FileValue[] | null;\n /** Called with the files. An empty list is `null`. */\n onChange?: (value: FileValue[] | null) => void;\n}\n\nexport type FileFieldProps = SingleFileFieldProps | MultipleFileFieldProps;\n\nfunction fileSize(file: FileValue): number | null {\n return typeof file.size === 'number' ? file.size : null;\n}\n\nfunction fileUrl(file: FileValue): string | null {\n return !(file instanceof Blob) && 'url' in file && typeof file.url === 'string'\n ? file.url\n : null;\n}\n\n/** Whether a value is a file of a `file` value. */\nexport function isFileValue(value: unknown): value is FileValue {\n if (typeof File !== 'undefined' && value instanceof File) {\n return true;\n }\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { name?: unknown }).name === 'string'\n );\n}\n\n/** The files of a value, single or multiple. */\nexport function toFiles(value: unknown): FileValue[] {\n if (Array.isArray(value)) {\n return value.filter(isFileValue);\n }\n return isFileValue(value) ? [value] : [];\n}\n\n/**\n * Files that belong to an item, outside the media library: an attachment, a PDF, a CSV (the\n * `file` type). With an upload source, files go directly to storage, and the value references\n * each upload (`{ upload, name, mime, size }`). Without one, the value is the file itself. Items\n * give stored files, which the field shows with a link. A new file replaces the file of a single\n * value, and is added to a multiple one.\n */\nexport function FileField(props: FileFieldProps) {\n const intl = usePanneauIntl();\n const context = useFieldsContext();\n const {\n accept = null,\n maxSize = null,\n label,\n description,\n errors = [],\n disabled,\n readOnly,\n required,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n } = props;\n const uploadSource =\n props.uploadSource === undefined ? context.uploadSource : props.uploadSource;\n const multiple = props.multiple === true;\n const files = toFiles(props.value);\n const editable = disabled !== true && readOnly !== true;\n const [rejections, setRejections] = useState<string[]>([]);\n const rejectionMessage = useRejectionMessage(maxSize);\n\n // The files as last set, so that uploads that end together all add theirs.\n const latest = useRef(files);\n useEffect(() => {\n latest.current = files;\n });\n const set = (next: FileValue[]) => {\n latest.current = next;\n if (props.multiple === true) {\n props.onChange?.(next.length > 0 ? next : null);\n } else {\n props.onChange?.(next[0] ?? null);\n }\n };\n\n const upload = useUploads({\n source: uploadSource,\n accept,\n maxSize,\n onUploaded: (file) => set(multiple ? [...latest.current, file] : [file]),\n onRejected: (file, reason) =>\n setRejections((current) => [...current, rejectionMessage(file, reason)]),\n });\n\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={[...errors, ...rejections]}\n isRequired={required}\n isDisabled={disabled}\n className={className}\n legendClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n >\n <div className={styles.field}>\n {files.length > 0 ? (\n <ul className={styles.files}>\n {files.map((file, index) => {\n const { name } = file;\n const url = fileUrl(file);\n const size = fileSize(file);\n return (\n <li key={`${String(index)}-${name}`} className={styles.file}>\n <FileText aria-hidden className={styles.icon} />\n {url !== null ? (\n <a\n href={url}\n className={styles.name}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {name}\n </a>\n ) : (\n <span className={styles.name}>{name}</span>\n )}\n {size !== null ? (\n <span className={styles.size}>\n {formatSize(size, intl.locale)}\n </span>\n ) : null}\n {editable ? (\n <IconButton\n icon={X}\n size=\"sm\"\n label={intl.formatMessage(messages.removeFile, {\n name,\n })}\n onPress={() =>\n set(latest.current.filter((_, at) => at !== index))\n }\n />\n ) : null}\n </li>\n );\n })}\n </ul>\n ) : upload.items.length === 0 ? (\n <span className={styles.none}>{intl.formatMessage(messages.noFile)}</span>\n ) : null}\n <UploadList\n items={upload.items}\n onPause={upload.pause}\n onResume={upload.resume}\n onCancel={upload.cancel}\n onRetry={upload.retry}\n />\n {editable ? (\n <FilePicker\n accept={accept}\n multiple={multiple}\n {...(!multiple && files.length > 0\n ? { label: intl.formatMessage(messages.replaceFile) }\n : {})}\n onSelect={(selected) => {\n setRejections([]);\n upload.add(selected);\n }}\n />\n ) : null}\n </div>\n </Fieldset>\n );\n}\n\n/**\n * The registry entry of the `file` type: the field's `multiple`, `accept` (or its `accept` rule)\n * and `maxSize` rule, with the upload source of the fields context.\n */\nexport function FileFieldEntry(props: FieldEntryProps) {\n const { field, value, onChange } = props;\n const common = {\n ...getFieldProps(props),\n accept: getAccept(field),\n maxSize: getMaxSize(field),\n };\n return field.multiple === true ? (\n <FileField {...common} multiple value={toFiles(value)} onChange={onChange} />\n ) : (\n <FileField {...common} value={toFiles(value)[0] ?? null} onChange={onChange} />\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAoDA,SAASqC,SAASC,MAAgC;CAC9C,OAAO,OAAOA,KAAKC,SAAS,WAAWD,KAAKC,OAAO;AACvD;AAEA,SAASC,QAAQF,MAAgC;CAC7C,OAAO,EAAEA,gBAAgBG,SAAS,SAASH,QAAQ,OAAOA,KAAKI,QAAQ,WACjEJ,KAAKI,MACL;AACV;;AAGA,SAAgBC,YAAYV,OAAoC;CAC5D,IAAI,OAAOR,SAAS,eAAeQ,iBAAiBR,MAChD,OAAO;CAEX,OACI,OAAOQ,UAAU,YACjBA,UAAU,QACV,OAAQA,MAA6BW,SAAS;AAEtD;;AAGA,SAAgBC,QAAQZ,OAA6B;CACjD,IAAIa,MAAMC,QAAQd,KAAK,GACnB,OAAOA,MAAMe,OAAOL,WAAW;CAEnC,OAAOA,YAAYV,KAAK,IAAI,CAACA,KAAK,IAAI,CAAA;AAC1C;;;;;;;;AASA,SAAOgB,UAAAC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CACH,MAAAC,OAAa7C,eAAe;CAC5B,MAAA8C,UAAgB7C,iBAAiB;CACjC,MAAA,EAAAmB,QAAA2B,IAAA1B,SAAA2B,IAAAC,OAAAC,aAAAC,QAAAC,IAAAC,UAAAC,UAAAC,UAAAC,WAAAC,gBAAAC,sBAAAC,oBAaIjB;CAZA,MAAAtB,SAAA2B,OAAAa,KAAAA,IAAA,OAAAb;CACA,MAAA1B,UAAA2B,OAAAY,KAAAA,IAAA,OAAAZ;CAAc,IAAAa;CAAA,IAAAlB,EAAA,OAAAS,IAAA;EAGdS,KAAAT,OAAAQ,KAAAA,IAAA,CAAA,IAAAR;EAAWT,EAAA,KAAAS;EAAAT,EAAA,KAAAkB;CAAA,OAAAA,KAAAlB,EAAA;CAAX,MAAAQ,SAAAU;CASJ,MAAAvC,eACIoB,MAAKpB,iBAAkBsC,KAAAA,IAAYd,QAAOxB,eAAgBoB,MAAKpB;CACnE,MAAAE,WAAiBkB,MAAKlB,aAAc;CAAK,IAAAsC;CAAA,IAAAnB,EAAA,OAAAD,MAAAjB,OAAA;EAC3BqC,KAAAzB,QAAQK,MAAKjB,KAAM;EAACkB,EAAA,KAAAD,MAAAjB;EAAAkB,EAAA,KAAAmB;CAAA,OAAAA,KAAAnB,EAAA;CAAlC,MAAAoB,QAAcD;CACd,MAAAE,WAAiBX,aAAa,QAAQC,aAAa;CAAK,IAAAW;CAAA,IAAAtB,EAAA,OAAAuB,OAAAC,IAAA,2BAAA,GAAA;EACDF,KAAA,CAAA;EAAEtB,EAAA,KAAAsB;CAAA,OAAAA,KAAAtB,EAAA;CAAzD,MAAA,CAAAyB,YAAAC,iBAAoCzE,SAAmBqE,EAAE;CACzD,MAAAK,mBAAyBzD,oBAAoBQ,OAAO;CAGpD,MAAAkD,SAAe5E,OAAOoE,KAAK;CAAE,IAAAS;CAAA,IAAA7B,EAAA,OAAAoB,OAAA;EACnBS,WAAA;GACND,OAAME,UAAWV;EAAH;EACjBpB,EAAA,KAAAoB;EAAApB,EAAA,KAAA6B;CAAA,OAAAA,KAAA7B,EAAA;CAFDjD,UAAU8E,EAET;CACD,MAAAE,OAAYC,SAAA;EACRJ,OAAME,UAAWE;EACjB,IAAIjC,MAAKlB,aAAc,MACnBkB,MAAKhB,WAAYiD,KAAIC,SAAU,IAAdD,OAAA,IAA6B;OAE9CjC,MAAKhB,WAAYiD,KAAI,MAAJ,IAAe;CACnC;CACH,IAAAE;CAAA,IAAAlC,EAAA,OAAA2B,kBAAA;EAOcO,MAAAC,QAAAC,WACRV,eAAcI,YAAa,CAAA,GAAIA,SAASH,iBAAiBxC,QAAMiD,MAAM,CAAC,CAAC;EAACpC,EAAA,KAAA2B;EAAA3B,EAAA,KAAAkC;CAAA,OAAAA,KAAAlC,EAAA;CANhF,MAAAqC,SAAelE,WAAW;EAAAmE,QACd3D;EAAYF;EAAAC;EAAA6D,aAGRpD,SAAU4C,IAAIlD,WAAA,CAAA,GAAe+C,OAAME,SAAU3C,IAAI,IAAnC,CAAwCA,IAAI,CAAC;EAACqD,YAC5DN;CAEhB,CAAC;CAGI,MAAAO,KAAAtF;CAAQ,IAAAuF;CAAA,IAAA1C,EAAA,OAAAQ,UAAAR,EAAA,QAAAyB,YAAA;EAGGiB,KAAA,CAAA,GAAIlC,QAAM,GAAKiB,UAAU;EAACzB,EAAA,KAAAQ;EAAAR,EAAA,MAAAyB;EAAAzB,EAAA,MAAA0C;CAAA,OAAAA,KAAA1C,EAAA;CAQlB5B,MAAAA,KAAAA;CACX,MAAAuE,MAAAvB,MAAKa,SAAU,IACZ,oBAAA,MAAA;EAAe,WAAA7D,yBAAMgD;EAChBA,UAAAA,MAAKwB,KAAKC,QAAAC,UAAA;GACP,MAAA,EAAArD,SAAiBN;GACjB,MAAAI,MAAYF,QAAQF,MAAI;GACxB,MAAAC,OAAaF,SAASC,MAAI;GAAE,OAExB,qBAAA,MAAA;IAAgD,WAAAf,yBAAMe;IAAtD,UAAA;KACI,oBAAC,UAAD;MAAU,eAAA;MAAuB,WAAAf,yBAAM4E;KAAK,CAAA;KAC3CzD,QAAQ,OACL,oBAAA,KAAA;MACUA,MAAAA;MACK,WAAAnB,yBAAMqB;MACV,QAAA;MACH,KAAA;MAEHA,UAAAA;KACD,CAAA,IAEJ,oBAAA,QAAA;MAAiB,WAAArB,yBAAMqB;MAAQA,UAAAA;KAAY,CAAA;KAE9CL,SAAS,OACN,oBAAA,QAAA;MAAiB,WAAAhB,yBAAMgB;MAClBrB,UAAAA,WAAWqB,MAAMc,KAAI+C,MAAO;KAC1B,CAAA,IAHV;KAKA5B,WACG,oBAAC,YAAD;MACUvE,MAAAA;MACD,MAAA;MACE,OAAAoD,KAAIgD,cAAexF,SAAQyF,YAAa,EAAA1D,KAE/C,CAAC;MACQ,eACLsC,IAAIH,OAAME,QAAQjC,QAAQuD,GAAAC,OAAWA,OAAOP,KAAK,CAAC;KAAC,CAAA,IAR9D;IAYA;GA/BI,GAAA,GAAGC,OAAOD,KAAK,EAAC,GAAIrD,MA+BxB;EAAA,CAEZ;CACA,CAAA,IACL4C,OAAMiB,MAAMrB,WAAY,IACxB,oBAAA,QAAA;EAAiB,WAAA7D,yBAAMmF;EAAQrD,UAAAA,KAAIgD,cAAexF,SAAQ8F,MAAO;CAAS,CAAA,IAD1E;CAEI,IAAAC;CAAA,IAAAzD,EAAA,QAAAqC,OAAAqB,UAAA1D,EAAA,QAAAqC,OAAAiB,SAAAtD,EAAA,QAAAqC,OAAAsB,SAAA3D,EAAA,QAAAqC,OAAAuB,UAAA5D,EAAA,QAAAqC,OAAAwB,OAAA;EACRJ,MAAA,oBAAC,YAAD;GACW,OAAApB,OAAMiB;GACJ,SAAAjB,OAAMsB;GACL,UAAAtB,OAAMuB;GACN,UAAAvB,OAAMqB;GACP,SAAArB,OAAMwB;EAAM,CAAA;EACvB7D,EAAA,MAAAqC,OAAAqB;EAAA1D,EAAA,MAAAqC,OAAAiB;EAAAtD,EAAA,MAAAqC,OAAAsB;EAAA3D,EAAA,MAAAqC,OAAAuB;EAAA5D,EAAA,MAAAqC,OAAAwB;EAAA7D,EAAA,MAAAyD;CAAA,OAAAA,MAAAzD,EAAA;CAAA,IAAA8D;CAAA,IAAA9D,EAAA,QAAAvB,UAAAuB,EAAA,QAAAqB,YAAArB,EAAA,QAAAoB,MAAAa,UAAAjC,EAAA,QAAAE,QAAAF,EAAA,QAAAnB,YAAAmB,EAAA,QAAAqC,QAAA;EACDyB,MAAAzC,WACG,oBAAC,YAAD;GACY5C;GACEI;GAAQ,GACb,CAACA,YAAYuC,MAAKa,SAAU,IAA5B,EAAA3B,OACUJ,KAAIgD,cAAexF,SAAQqG,WAAY,EAC/C,IAFF,CAEE;GACG,WAAAC,aAAA;IACNtC,cAAc,CAAA,CAAE;IAChBW,OAAM4B,IAAKD,QAAQ;GAAC;EACvB,CAAA,IAVR;EAYOhE,EAAA,MAAAvB;EAAAuB,EAAA,MAAAqB;EAAArB,EAAA,MAAAoB,MAAAa;EAAAjC,EAAA,MAAAE;EAAAF,EAAA,MAAAnB;EAAAmB,EAAA,MAAAqC;EAAArC,EAAA,MAAA8D;CAAA,OAAAA,MAAA9D,EAAA;CAAA,IAAAkE;CAAA,IAAAlE,EAAA,QAAA2C,OAAA3C,EAAA,QAAAyD,OAAAzD,EAAA,QAAA8D,OAAA9D,EAAA,QAAAmE,GAAAC,OAAA;EAjEZF,MAAA,qBAAA,OAAA;GAAgB,WAAA9F,GAAMgG;GAAtB,UAAA;IACKzB;IA6CDc;IAOCK;GAaC;;EAAA9D,EAAA,MAAA2C;EAAA3C,EAAA,MAAAyD;EAAAzD,EAAA,MAAA8D;EAAA9D,EAAA,MAAAmE,GAAAC;EAAApE,EAAA,MAAAkE;CAAA,OAAAA,MAAAlE,EAAA;CAAA,IAAAqE;CAAA,IAAArE,EAAA,QAAAyC,MAAAzC,EAAA,QAAAa,aAAAb,EAAA,QAAAO,eAAAP,EAAA,QAAAe,wBAAAf,EAAA,QAAAU,YAAAV,EAAA,QAAAgB,mBAAAhB,EAAA,QAAAM,SAAAN,EAAA,QAAAc,kBAAAd,EAAA,QAAAY,YAAAZ,EAAA,QAAAkE,OAAAlE,EAAA,QAAA0C,IAAA;EA7EV2B,MAAA,oBAAC,IAAD;GACY/D,QAAAA;GACKC;GACL,QAAAmC;GACI9B,YAAAA;GACAF,YAAAA;GACDG;GACMC,iBAAAA;GACKC;GACLC;GAEjBkD,UAAAA;EAXK,CAAA;EA8EElE,EAAA,MAAAyC;EAAAzC,EAAA,MAAAa;EAAAb,EAAA,MAAAO;EAAAP,EAAA,MAAAe;EAAAf,EAAA,MAAAU;EAAAV,EAAA,MAAAgB;EAAAhB,EAAA,MAAAM;EAAAN,EAAA,MAAAc;EAAAd,EAAA,MAAAY;EAAAZ,EAAA,MAAAkE;EAAAlE,EAAA,MAAA0C;EAAA1C,EAAA,MAAAqE;CAAA,OAAAA,MAAArE,EAAA;CAAA,OA9EXqE;AA8EW;;;;;AAQnB,SAAOC,eAAAvE,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CACH,MAAA,EAAAmE,OAAAtF,OAAAC,aAAmCgB;CAAM,IAAAK;CAAA,IAAAJ,EAAA,OAAAD,OAAA;EAElCK,KAAA5C,cAAcuC,KAAK;EAACC,EAAA,KAAAD;EAAAC,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAAA,IAAAK;CAAA,IAAAL,EAAA,OAAAoE,OAAA;EACf/D,KAAA9C,UAAU6G,KAAK;EAACpE,EAAA,KAAAoE;EAAApE,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,IAAAS;CAAA,IAAAT,EAAA,OAAAoE,OAAA;EACf3D,KAAAhD,WAAW2G,KAAK;EAACpE,EAAA,KAAAoE;EAAApE,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,IAAAkB;CAAA,IAAAlB,EAAA,OAAAI,MAAAJ,EAAA,OAAAK,MAAAL,EAAA,OAAAS,IAAA;EAHfS,KAAA;GAAA,GACRd;GAAoB3B,QACf4B;GAAgB3B,SACf+B;EACb;EAACT,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;EAAAL,EAAA,KAAAS;EAAAT,EAAA,KAAAkB;CAAA,OAAAA,KAAAlB,EAAA;CAJD,MAAAuE,SAAerD;CAIb,IAAAC;CAAA,IAAAnB,EAAA,QAAAuE,UAAAvE,EAAA,QAAAoE,MAAAvF,YAAAmB,EAAA,QAAAjB,YAAAiB,EAAA,QAAAlB,OAAA;EACKqC,KAAAiD,MAAKvF,aAAc,OACtB,oBAAC,WAAD;GAAU,GAAK0F;GAAQ,UAAA;GAAgB,OAAA7E,QAAQZ,KAAK;GAAaC;EAAQ,CAAA,IAEzE,oBAAC,WAAD;GAAU,GAAKwF;GAAe,OAAA7E,QAAQZ,KAAK,CAAC,CAAA,MAAd;GAAqCC;EAAQ,CAAA;EAC9EiB,EAAA,MAAAuE;EAAAvE,EAAA,MAAAoE,MAAAvF;EAAAmB,EAAA,MAAAjB;EAAAiB,EAAA,MAAAlB;EAAAkB,EAAA,MAAAmB;CAAA,OAAAA,KAAAnB,EAAA;CAAA,OAJMmB;AAIN"}
@@ -1 +1 @@
1
- {"version":3,"file":"GroupField.js","names":["field","object","label","description","errors","required","className","labelClassName","descriptionClassName","errorsClassName","_c","styles"],"sources":["../../src/group/GroupField.tsx"],"sourcesContent":["import type { Field } from '@panneau/protocol';\nimport { Fieldset } from '@panneau/ui';\n\nimport { NestedField } from '../shared/DefinitionField';\nimport { cx } from '../shared/cx';\nimport { getFieldProps } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './GroupField.module.css';\n\nexport type GroupValue = Record<string, unknown>;\n\nexport interface GroupFieldProps extends FieldProps<GroupValue> {\n /** The nested fields, rendered with the entries of the fields context. */\n fields: readonly Field[];\n /** Dot path of the group's value, the prefix of its fields' paths. Defaults to `name`. */\n path?: string;\n fieldsClassName?: string;\n}\n\n/**\n * A nested object: its fields under a legend. Each field renders with the entry of its type, at\n * the path `<group>.<field>`. Without a binding in the fields context, the group sets the whole\n * object through `onChange`.\n */\nexport function GroupField({\n fields,\n path,\n name,\n value,\n onChange,\n onBlur,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n fieldsClassName,\n}: GroupFieldProps) {\n const base = path ?? name ?? '';\n const object = value ?? {};\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={errors}\n isRequired={required}\n className={className}\n legendClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n >\n <div className={cx(styles.fields, fieldsClassName)}>\n {fields.map((field) => (\n <NestedField\n key={field.name}\n field={field}\n path={base !== '' ? `${base}.${field.name}` : field.name}\n value={object[field.name]}\n onChange={(next) => onChange?.({ ...object, [field.name]: next })}\n {...(onBlur !== undefined ? { onBlur } : {})}\n parentValue={object}\n {...(disabled !== undefined ? { disabled } : {})}\n {...(readOnly !== undefined ? { readOnly } : {})}\n />\n ))}\n </div>\n </Fieldset>\n );\n}\n\n/** The `group` type: its `fields`, as a nested object. */\nexport function GroupFieldEntry(props: FieldEntryProps) {\n const { value } = props;\n return (\n <GroupField\n {...getFieldProps(props)}\n fields={props.field.fields ?? []}\n path={props.path}\n value={\n value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as GroupValue)\n : null\n }\n onChange={props.onChange}\n />\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"GroupField.js","names":["Field","Fieldset","NestedField","cx","getFieldProps","FieldEntryProps","FieldProps","styles","GroupValue","Record","GroupFieldProps","fields","path","fieldsClassName","GroupField","t0","$","_c","name","value","onChange","onBlur","label","description","errors","disabled","readOnly","required","className","labelClassName","descriptionClassName","errorsClassName","base","t1","object","t2","t3","t4","field","next","undefined","map","t5","GroupFieldEntry","props","Array","isArray","_c","styles"],"sources":["../../src/group/GroupField.tsx"],"sourcesContent":["import type { Field } from '@panneau/protocol';\nimport { Fieldset } from '@panneau/ui';\n\nimport { NestedField } from '../shared/DefinitionField';\nimport { cx } from '../shared/cx';\nimport { getFieldProps } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './GroupField.module.css';\n\nexport type GroupValue = Record<string, unknown>;\n\nexport interface GroupFieldProps extends FieldProps<GroupValue> {\n /** The nested fields, rendered with the entries of the fields context. */\n fields: readonly Field[];\n /** Dot path of the group's value, the prefix of its fields' paths. Defaults to `name`. */\n path?: string;\n fieldsClassName?: string;\n}\n\n/**\n * A nested object: its fields under a legend. Each field renders with the entry of its type, at\n * the path `<group>.<field>`. Without a binding in the fields context, the group sets the whole\n * object through `onChange`.\n */\nexport function GroupField({\n fields,\n path,\n name,\n value,\n onChange,\n onBlur,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n fieldsClassName,\n}: GroupFieldProps) {\n const base = path ?? name ?? '';\n const object = value ?? {};\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={errors}\n isRequired={required}\n className={className}\n legendClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n >\n <div className={cx(styles.fields, fieldsClassName)}>\n {fields.map((field) => (\n <NestedField\n key={field.name}\n field={field}\n path={base !== '' ? `${base}.${field.name}` : field.name}\n value={object[field.name]}\n onChange={(next) => onChange?.({ ...object, [field.name]: next })}\n {...(onBlur !== undefined ? { onBlur } : {})}\n parentValue={object}\n {...(disabled !== undefined ? { disabled } : {})}\n {...(readOnly !== undefined ? { readOnly } : {})}\n />\n ))}\n </div>\n </Fieldset>\n );\n}\n\n/** The `group` type: its `fields`, as a nested object. */\nexport function GroupFieldEntry(props: FieldEntryProps) {\n const { value } = props;\n return (\n <GroupField\n {...getFieldProps(props)}\n fields={props.field.fields ?? []}\n path={props.path}\n value={\n value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as GroupValue)\n : null\n }\n onChange={props.onChange}\n />\n );\n}\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -4,6 +4,9 @@ export { type BoundFieldProps, type FieldBinding, type FieldBindingProps, Fields
4
4
  export { findRule, getAccept, getFieldProps, getMaxSize, getRuleNumber, isRequired, } from './shared/entry';
5
5
  export { type RelationListAdapter, type RelationReference, type RelationSource, type RelationSourceOptions, createRelationSource, toReferences, useRelationReferences, } from './shared/relation';
6
6
  export { type FieldCheckAdapter, type FieldCheckSource, createFieldCheckSource, } from './shared/check';
7
+ export { type EmbedAdapter, type EmbedSource, createEmbedSource } from './shared/embed';
8
+ export type { GeocodingResult, GeocodingSource, MapTiles, MapsConfig } from './location/types';
9
+ export { type NominatimSourceOptions, createNominatimSource } from './location/nominatim';
7
10
  export type { FieldEntry, FieldEntryProps, FieldProps } from './shared/types';
8
11
  export { MissingFieldEntry } from './missing/MissingField';
9
12
  export { type FileFieldBaseProps, FileField, FileFieldEntry, type FileFieldProps, type FileValue, type MultipleFileFieldProps, type SingleFileFieldProps, isFileValue, toFiles, } from './file/FileField';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EACH,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,cAAc,EACd,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,aAAa,EACb,gBAAgB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACH,QAAQ,EACR,SAAS,EACT,aAAa,EACb,UAAU,EACV,aAAa,EACb,UAAU,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACH,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,oBAAoB,EACpB,YAAY,EACZ,qBAAqB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,sBAAsB,GACzB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACH,KAAK,kBAAkB,EACvB,SAAS,EACT,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,WAAW,EACX,OAAO,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACH,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,QAAQ,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EACH,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,cAAc,EACd,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,aAAa,EACb,gBAAgB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACH,QAAQ,EACR,SAAS,EACT,aAAa,EACb,UAAU,EACV,aAAa,EACb,UAAU,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACH,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,oBAAoB,EACpB,YAAY,EACZ,qBAAqB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,sBAAsB,GACzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxF,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAE,KAAK,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC1F,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACH,KAAK,kBAAkB,EACvB,SAAS,EACT,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,WAAW,EACX,OAAO,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACH,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,QAAQ,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -11,4 +11,6 @@ import { createRelationSource, toReferences, useRelationReferences } from "./sha
11
11
  import { builtInFields, fieldsPlugin } from "./shared/builtIn.js";
12
12
  import { DefinitionField, NestedField } from "./shared/DefinitionField.js";
13
13
  import { createFieldCheckSource } from "./shared/check.js";
14
- export { DefinitionField, FieldsProvider, FileField, FileFieldEntry, FilePicker, MissingFieldEntry, NestedField, UploadList, builtInFields, createFieldCheckSource, createRelationSource, fieldsPlugin, findRule, formatSize, getAccept, getFieldProps, getMaxSize, getParentPath, getRuleNumber, isFileValue, isRequired, matchesMime, toFiles, toReferences, useFieldsContext, useRejectionMessage, useRelationReferences, useUploads };
14
+ import { createEmbedSource } from "./shared/embed.js";
15
+ import { createNominatimSource } from "./location/nominatim.js";
16
+ export { DefinitionField, FieldsProvider, FileField, FileFieldEntry, FilePicker, MissingFieldEntry, NestedField, UploadList, builtInFields, createEmbedSource, createFieldCheckSource, createNominatimSource, createRelationSource, fieldsPlugin, findRule, formatSize, getAccept, getFieldProps, getMaxSize, getParentPath, getRuleNumber, isFileValue, isRequired, matchesMime, toFiles, toReferences, useFieldsContext, useRejectionMessage, useRelationReferences, useUploads };
@@ -0,0 +1,7 @@
1
+ /* JSON reads in a monospace font, without wrapping long lines. */
2
+ .panneau-json-field-code {
3
+ font-family: var(--panneau-font-family-mono);
4
+ font-size: var(--panneau-font-size-sm);
5
+ white-space: pre;
6
+ tab-size: 2;
7
+ }
@@ -0,0 +1,22 @@
1
+ import type { FieldEntryProps, FieldProps } from '../shared/types';
2
+ /** The value of a `json` field: an object or an array, or the text while it doesn't parse. */
3
+ export type JsonValue = Record<string, unknown> | unknown[] | string;
4
+ export interface JsonFieldProps extends FieldProps<JsonValue> {
5
+ placeholder?: string;
6
+ /** Visible lines. Defaults to 8. */
7
+ rows?: number;
8
+ }
9
+ /** The value of a text: what it parses to when it is an object or an array, or the text itself. */
10
+ export declare function parseJson(text: string): {
11
+ value: JsonValue | null;
12
+ error: string | null;
13
+ };
14
+ /**
15
+ * Structured data edited as JSON: an object or an array. While the text doesn't parse, the value
16
+ * is the text itself, which the `json` rule refuses, so the form can't be saved with it. The text
17
+ * is indented again on blur once it parses.
18
+ */
19
+ export declare function JsonField({ value, onChange, onBlur, errors, rows, disabled, readOnly, required, ...props }: JsonFieldProps): import("react").JSX.Element;
20
+ /** The `json` type: an object or an array, with setting `rows`. */
21
+ export declare function JsonFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
22
+ //# sourceMappingURL=JsonField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonField.d.ts","sourceRoot":"","sources":["../../src/json/JsonField.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGnE,8FAA8F;AAC9F,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC;AAErE,MAAM,WAAW,cAAe,SAAQ,UAAU,CAAC,SAAS,CAAC;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAUD,mGAAmG;AACnG,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAazF;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,EACtB,KAAK,EACL,QAAQ,EACR,MAAM,EACN,MAAW,EACX,IAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,GAAG,KAAK,EACX,EAAE,cAAc,+BAwChB;AAED,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,+BAepD"}