@panneau/fields 5.0.0-alpha.1 → 5.0.0-alpha.11

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 (243) hide show
  1. package/README.md +101 -20
  2. package/dist/boolean/BooleanField.d.ts +1 -1
  3. package/dist/boolean/BooleanField.js +78 -17
  4. package/dist/boolean/BooleanField.js.map +1 -1
  5. package/dist/boolean/index.d.ts +1 -1
  6. package/dist/color/ColorField.css +5 -5
  7. package/dist/color/ColorField.d.ts +2 -2
  8. package/dist/color/ColorField.js.map +1 -1
  9. package/dist/color/ColorField.module.js +3 -3
  10. package/dist/color/index.d.ts +1 -1
  11. package/dist/date/DateField.d.ts +1 -1
  12. package/dist/date/DateField.js.map +1 -1
  13. package/dist/date/index.d.ts +1 -1
  14. package/dist/datetime/DateTimeField.d.ts +1 -1
  15. package/dist/datetime/DateTimeField.js +107 -20
  16. package/dist/datetime/DateTimeField.js.map +1 -1
  17. package/dist/datetime/index.d.ts +1 -1
  18. package/dist/duration/DurationField.css +11 -0
  19. package/dist/duration/DurationField.d.ts +26 -0
  20. package/dist/duration/DurationField.d.ts.map +1 -0
  21. package/dist/duration/DurationField.js +214 -0
  22. package/dist/duration/DurationField.js.map +1 -0
  23. package/dist/duration/DurationField.module.js +12 -0
  24. package/dist/duration/DurationField.module.js.map +1 -0
  25. package/dist/duration/index.d.ts +2 -0
  26. package/dist/duration/index.d.ts.map +1 -0
  27. package/dist/duration/index.js +1 -0
  28. package/dist/email/EmailField.d.ts +2 -2
  29. package/dist/email/EmailField.js.map +1 -1
  30. package/dist/email/index.d.ts +1 -1
  31. package/dist/embed/EmbedField.css +60 -0
  32. package/dist/embed/EmbedField.d.ts +20 -0
  33. package/dist/embed/EmbedField.d.ts.map +1 -0
  34. package/dist/embed/EmbedField.js +246 -0
  35. package/dist/embed/EmbedField.js.map +1 -0
  36. package/dist/embed/EmbedField.module.js +22 -0
  37. package/dist/embed/EmbedField.module.js.map +1 -0
  38. package/dist/embed/index.d.ts +3 -0
  39. package/dist/embed/index.d.ts.map +1 -0
  40. package/dist/embed/index.js +3 -0
  41. package/dist/file/FileField.css +54 -0
  42. package/dist/file/FileField.d.ts +50 -0
  43. package/dist/file/FileField.d.ts.map +1 -0
  44. package/dist/file/FileField.js +288 -0
  45. package/dist/file/FileField.js.map +1 -0
  46. package/dist/file/FileField.module.js +22 -0
  47. package/dist/file/FileField.module.js.map +1 -0
  48. package/dist/file/index.d.ts +3 -0
  49. package/dist/file/index.d.ts.map +1 -0
  50. package/dist/file/index.js +1 -0
  51. package/dist/group/GroupField.css +2 -2
  52. package/dist/group/GroupField.d.ts +1 -1
  53. package/dist/group/GroupField.js.map +1 -1
  54. package/dist/group/GroupField.module.js +1 -1
  55. package/dist/group/index.d.ts +1 -1
  56. package/dist/index.d.ts +18 -7
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +11 -2
  59. package/dist/json/JsonField.css +7 -0
  60. package/dist/json/JsonField.d.ts +22 -0
  61. package/dist/json/JsonField.d.ts.map +1 -0
  62. package/dist/json/JsonField.js +207 -0
  63. package/dist/json/JsonField.js.map +1 -0
  64. package/dist/json/JsonField.module.js +8 -0
  65. package/dist/json/JsonField.module.js.map +1 -0
  66. package/dist/json/index.d.ts +2 -0
  67. package/dist/json/index.d.ts.map +1 -0
  68. package/dist/json/index.js +1 -0
  69. package/dist/locales/index.js.map +1 -1
  70. package/dist/localized/LocalizedField.css +2 -2
  71. package/dist/localized/LocalizedField.d.ts +1 -1
  72. package/dist/localized/LocalizedField.d.ts.map +1 -1
  73. package/dist/localized/LocalizedField.js +1 -0
  74. package/dist/localized/LocalizedField.js.map +1 -1
  75. package/dist/localized/LocalizedField.module.js +2 -2
  76. package/dist/localized/index.d.ts +1 -1
  77. package/dist/location/LocationField.css +54 -0
  78. package/dist/location/LocationField.d.ts +31 -0
  79. package/dist/location/LocationField.d.ts.map +1 -0
  80. package/dist/location/LocationField.js +563 -0
  81. package/dist/location/LocationField.js.map +1 -0
  82. package/dist/location/LocationField.module.js +22 -0
  83. package/dist/location/LocationField.module.js.map +1 -0
  84. package/dist/location/LocationMap.d.ts +25 -0
  85. package/dist/location/LocationMap.d.ts.map +1 -0
  86. package/dist/location/LocationMap.js +205 -0
  87. package/dist/location/LocationMap.js.map +1 -0
  88. package/dist/location/index.d.ts +5 -0
  89. package/dist/location/index.d.ts.map +1 -0
  90. package/dist/location/index.js +4 -0
  91. package/dist/location/leafletCss.d.ts +2 -0
  92. package/dist/location/leafletCss.d.ts.map +1 -0
  93. package/dist/location/leafletCss.js +6 -0
  94. package/dist/location/leafletCss.js.map +1 -0
  95. package/dist/location/nominatim.d.ts +17 -0
  96. package/dist/location/nominatim.d.ts.map +1 -0
  97. package/dist/location/nominatim.js +50 -0
  98. package/dist/location/nominatim.js.map +1 -0
  99. package/dist/location/types.d.ts +40 -0
  100. package/dist/location/types.d.ts.map +1 -0
  101. package/dist/missing/MissingField.css +4 -3
  102. package/dist/missing/MissingField.d.ts +4 -3
  103. package/dist/missing/MissingField.d.ts.map +1 -1
  104. package/dist/missing/MissingField.js +3 -2
  105. package/dist/missing/MissingField.js.map +1 -1
  106. package/dist/missing/MissingField.module.js +3 -3
  107. package/dist/missing/MissingField.module.js.map +1 -1
  108. package/dist/number/NumberField.d.ts +1 -1
  109. package/dist/number/NumberField.js.map +1 -1
  110. package/dist/number/index.d.ts +1 -1
  111. package/dist/range/RangeField.d.ts +22 -0
  112. package/dist/range/RangeField.d.ts.map +1 -0
  113. package/dist/range/RangeField.js +203 -0
  114. package/dist/range/RangeField.js.map +1 -0
  115. package/dist/range/index.d.ts +2 -0
  116. package/dist/range/index.d.ts.map +1 -0
  117. package/dist/range/index.js +1 -0
  118. package/dist/relation/RelationField.css +7 -7
  119. package/dist/relation/RelationField.d.ts +2 -2
  120. package/dist/relation/RelationField.d.ts.map +1 -1
  121. package/dist/relation/RelationField.js +509 -169
  122. package/dist/relation/RelationField.js.map +1 -1
  123. package/dist/relation/RelationField.module.js +6 -6
  124. package/dist/relation/index.d.ts +2 -2
  125. package/dist/repeater/RepeaterField.css +12 -11
  126. package/dist/repeater/RepeaterField.d.ts +1 -1
  127. package/dist/repeater/RepeaterField.js +118 -34
  128. package/dist/repeater/RepeaterField.js.map +1 -1
  129. package/dist/repeater/RepeaterField.module.js +9 -9
  130. package/dist/repeater/RepeaterField.module.js.map +1 -1
  131. package/dist/repeater/index.d.ts +1 -1
  132. package/dist/select/SelectField.css +1 -1
  133. package/dist/select/SelectField.d.ts +1 -1
  134. package/dist/select/SelectField.js.map +1 -1
  135. package/dist/select/SelectField.module.js +1 -1
  136. package/dist/select/index.d.ts +1 -1
  137. package/dist/shared/DefinitionField.d.ts +4 -2
  138. package/dist/shared/DefinitionField.d.ts.map +1 -1
  139. package/dist/shared/DefinitionField.js +80 -72
  140. package/dist/shared/DefinitionField.js.map +1 -1
  141. package/dist/shared/builtIn.d.ts +5 -3
  142. package/dist/shared/builtIn.d.ts.map +1 -1
  143. package/dist/shared/builtIn.js +21 -3
  144. package/dist/shared/builtIn.js.map +1 -1
  145. package/dist/shared/check.d.ts +27 -0
  146. package/dist/shared/check.d.ts.map +1 -0
  147. package/dist/shared/check.js +18 -0
  148. package/dist/shared/check.js.map +1 -0
  149. package/dist/shared/context.d.ts +28 -5
  150. package/dist/shared/context.d.ts.map +1 -1
  151. package/dist/shared/context.js +35 -19
  152. package/dist/shared/context.js.map +1 -1
  153. package/dist/shared/cx.js.map +1 -1
  154. package/dist/shared/dates.js.map +1 -1
  155. package/dist/shared/embed.d.ts +19 -0
  156. package/dist/shared/embed.d.ts.map +1 -0
  157. package/dist/shared/embed.js +14 -0
  158. package/dist/shared/embed.js.map +1 -0
  159. package/dist/shared/entry.d.ts +11 -2
  160. package/dist/shared/entry.d.ts.map +1 -1
  161. package/dist/shared/entry.js +19 -3
  162. package/dist/shared/entry.js.map +1 -1
  163. package/dist/shared/relation.js.map +1 -1
  164. package/dist/shared/types.d.ts +2 -0
  165. package/dist/shared/types.d.ts.map +1 -1
  166. package/dist/slug/SlugField.css +18 -0
  167. package/dist/slug/SlugField.d.ts +33 -5
  168. package/dist/slug/SlugField.d.ts.map +1 -1
  169. package/dist/slug/SlugField.js +346 -126
  170. package/dist/slug/SlugField.js.map +1 -1
  171. package/dist/slug/SlugField.module.js +14 -0
  172. package/dist/slug/SlugField.module.js.map +1 -0
  173. package/dist/slug/index.d.ts +1 -1
  174. package/dist/slug/index.d.ts.map +1 -1
  175. package/dist/slug/index.js +1 -1
  176. package/dist/tags/TagsField.d.ts +17 -0
  177. package/dist/tags/TagsField.d.ts.map +1 -0
  178. package/dist/tags/TagsField.js +120 -0
  179. package/dist/tags/TagsField.js.map +1 -0
  180. package/dist/tags/index.d.ts +2 -0
  181. package/dist/tags/index.d.ts.map +1 -0
  182. package/dist/tags/index.js +1 -0
  183. package/dist/tel/TelField.d.ts +11 -0
  184. package/dist/tel/TelField.d.ts.map +1 -0
  185. package/dist/tel/TelField.js +87 -0
  186. package/dist/tel/TelField.js.map +1 -0
  187. package/dist/tel/index.d.ts +2 -0
  188. package/dist/tel/index.d.ts.map +1 -0
  189. package/dist/tel/index.js +1 -0
  190. package/dist/text/TextField.d.ts +12 -4
  191. package/dist/text/TextField.d.ts.map +1 -1
  192. package/dist/text/TextField.js +104 -60
  193. package/dist/text/TextField.js.map +1 -1
  194. package/dist/text/index.d.ts +1 -1
  195. package/dist/textarea/TextAreaField.d.ts +1 -1
  196. package/dist/textarea/TextAreaField.js.map +1 -1
  197. package/dist/textarea/index.d.ts +1 -1
  198. package/dist/time/TimeField.d.ts +1 -1
  199. package/dist/time/TimeField.js +64 -10
  200. package/dist/time/TimeField.js.map +1 -1
  201. package/dist/time/index.d.ts +1 -1
  202. package/dist/upload/FilePicker.css +24 -0
  203. package/dist/upload/FilePicker.d.ts +14 -0
  204. package/dist/upload/FilePicker.d.ts.map +1 -0
  205. package/dist/upload/FilePicker.js +130 -0
  206. package/dist/upload/FilePicker.js.map +1 -0
  207. package/dist/upload/FilePicker.module.js +12 -0
  208. package/dist/upload/FilePicker.module.js.map +1 -0
  209. package/dist/upload/UploadList.css +93 -0
  210. package/dist/upload/UploadList.d.ts +18 -0
  211. package/dist/upload/UploadList.d.ts.map +1 -0
  212. package/dist/upload/UploadList.js +144 -0
  213. package/dist/upload/UploadList.js.map +1 -0
  214. package/dist/upload/UploadList.module.js +32 -0
  215. package/dist/upload/UploadList.module.js.map +1 -0
  216. package/dist/upload/files.d.ts +5 -0
  217. package/dist/upload/files.d.ts.map +1 -0
  218. package/dist/upload/files.js +26 -0
  219. package/dist/upload/files.js.map +1 -0
  220. package/dist/upload/types.d.ts +58 -0
  221. package/dist/upload/types.d.ts.map +1 -0
  222. package/dist/upload/useRejectionMessage.d.ts +4 -0
  223. package/dist/upload/useRejectionMessage.d.ts.map +1 -0
  224. package/dist/upload/useRejectionMessage.js +25 -0
  225. package/dist/upload/useRejectionMessage.js.map +1 -0
  226. package/dist/upload/useUploads.d.ts +30 -0
  227. package/dist/upload/useUploads.d.ts.map +1 -0
  228. package/dist/upload/useUploads.js +115 -0
  229. package/dist/upload/useUploads.js.map +1 -0
  230. package/dist/uppy/index.d.ts +3 -0
  231. package/dist/uppy/index.d.ts.map +1 -0
  232. package/dist/uppy/index.js +1 -0
  233. package/dist/uppy/uploader.d.ts +44 -0
  234. package/dist/uppy/uploader.d.ts.map +1 -0
  235. package/dist/uppy/uploader.js +139 -0
  236. package/dist/uppy/uploader.js.map +1 -0
  237. package/dist/url/UrlField.css +2 -2
  238. package/dist/url/UrlField.d.ts +2 -2
  239. package/dist/url/UrlField.js +69 -14
  240. package/dist/url/UrlField.js.map +1 -1
  241. package/dist/url/UrlField.module.js +1 -1
  242. package/dist/url/index.d.ts +1 -1
  243. package/package.json +69 -7
@@ -0,0 +1,288 @@
1
+ import { useFieldsContext } from "../shared/context.js";
2
+ import { getAccept, getFieldProps, getMaxSize } from "../shared/entry.js";
3
+ import { messages } from "../shared/messages.js";
4
+ import { FilePicker } from "../upload/FilePicker.js";
5
+ import { formatSize } from "../upload/files.js";
6
+ import { UploadList } from "../upload/UploadList.js";
7
+ import { useRejectionMessage } from "../upload/useRejectionMessage.js";
8
+ import { useUploads } from "../upload/useUploads.js";
9
+ import FileField_module_default from "./FileField.module.js";
10
+ import { c } from "react/compiler-runtime";
11
+ import { Fieldset, IconButton, usePanneauIntl } from "@panneau/ui";
12
+ import { useEffect, useRef, useState } from "react";
13
+ import { jsx, jsxs } from "react/jsx-runtime";
14
+ import { FileText, X } from "lucide-react";
15
+ //#region src/file/FileField.tsx
16
+ function fileSize(file) {
17
+ return typeof file.size === "number" ? file.size : null;
18
+ }
19
+ function fileUrl(file) {
20
+ return !(file instanceof Blob) && "url" in file && typeof file.url === "string" ? file.url : null;
21
+ }
22
+ /** Whether a value is a file of a `file` value. */
23
+ function isFileValue(value) {
24
+ if (typeof File !== "undefined" && value instanceof File) return true;
25
+ return typeof value === "object" && value !== null && typeof value.name === "string";
26
+ }
27
+ /** The files of a value, single or multiple. */
28
+ function toFiles(value) {
29
+ if (Array.isArray(value)) return value.filter(isFileValue);
30
+ return isFileValue(value) ? [value] : [];
31
+ }
32
+ /**
33
+ * Files that belong to an item, outside the media library: an attachment, a PDF, a CSV (the
34
+ * `file` type). With an upload source, files go directly to storage, and the value references
35
+ * each upload (`{ upload, name, mime, size }`). Without one, the value is the file itself. Items
36
+ * give stored files, which the field shows with a link. A new file replaces the file of a single
37
+ * value, and is added to a multiple one.
38
+ */
39
+ function FileField(props) {
40
+ const $ = c(42);
41
+ const intl = usePanneauIntl();
42
+ const context = useFieldsContext();
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;
54
+ const multiple = props.multiple === true;
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;
62
+ const editable = disabled !== true && readOnly !== true;
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);
69
+ const rejectionMessage = useRejectionMessage(maxSize);
70
+ const latest = useRef(files);
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);
80
+ const set = (next) => {
81
+ latest.current = next;
82
+ if (props.multiple === true) props.onChange?.(next.length > 0 ? next : null);
83
+ else props.onChange?.(next[0] ?? null);
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];
91
+ const upload = useUploads({
92
+ source: uploadSource,
93
+ accept,
94
+ maxSize,
95
+ onUploaded: (file) => set(multiple ? [...latest.current, file] : [file]),
96
+ onRejected: t7
97
+ });
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,
186
+ children: [
187
+ t10,
188
+ t11,
189
+ t12
190
+ ]
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;
226
+ }
227
+ /**
228
+ * The registry entry of the `file` type: the field's `multiple`, `accept` (or its `accept` rule)
229
+ * and `maxSize` rule, with the upload source of the fields context.
230
+ */
231
+ function FileFieldEntry(props) {
232
+ const $ = c(15);
233
+ const { field, value, onChange } = props;
234
+ let t0;
235
+ if ($[0] !== props) {
236
+ t0 = getFieldProps(props);
237
+ $[0] = props;
238
+ $[1] = t0;
239
+ } else t0 = $[1];
240
+ let t1;
241
+ if ($[2] !== field) {
242
+ t1 = getAccept(field);
243
+ $[2] = field;
244
+ $[3] = t1;
245
+ } else t1 = $[3];
246
+ let t2;
247
+ if ($[4] !== field) {
248
+ t2 = getMaxSize(field);
249
+ $[4] = field;
250
+ $[5] = t2;
251
+ } else t2 = $[5];
252
+ let t3;
253
+ if ($[6] !== t0 || $[7] !== t1 || $[8] !== t2) {
254
+ t3 = {
255
+ ...t0,
256
+ accept: t1,
257
+ maxSize: t2
258
+ };
259
+ $[6] = t0;
260
+ $[7] = t1;
261
+ $[8] = t2;
262
+ $[9] = t3;
263
+ } else t3 = $[9];
264
+ const common = t3;
265
+ let t4;
266
+ if ($[10] !== common || $[11] !== field.multiple || $[12] !== onChange || $[13] !== value) {
267
+ t4 = field.multiple === true ? /* @__PURE__ */ jsx(FileField, {
268
+ ...common,
269
+ multiple: true,
270
+ value: toFiles(value),
271
+ onChange
272
+ }) : /* @__PURE__ */ jsx(FileField, {
273
+ ...common,
274
+ value: toFiles(value)[0] ?? null,
275
+ onChange
276
+ });
277
+ $[10] = common;
278
+ $[11] = field.multiple;
279
+ $[12] = onChange;
280
+ $[13] = value;
281
+ $[14] = t4;
282
+ } else t4 = $[14];
283
+ return t4;
284
+ }
285
+ //#endregion
286
+ export { FileField, FileFieldEntry, isFileValue, toFiles };
287
+
288
+ //# sourceMappingURL=FileField.js.map
@@ -0,0 +1 @@
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":"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"}
@@ -0,0 +1,22 @@
1
+ import "./FileField.css";
2
+ //#region src/file/FileField.module.css
3
+ var field = "panneau-file-field-field";
4
+ var files = "panneau-file-field-files";
5
+ var file = "panneau-file-field-file";
6
+ var icon = "panneau-file-field-icon";
7
+ var name = "panneau-file-field-name";
8
+ var size = "panneau-file-field-size";
9
+ var none = "panneau-file-field-none";
10
+ var FileField_module_default = {
11
+ field,
12
+ files,
13
+ file,
14
+ icon,
15
+ name,
16
+ size,
17
+ none
18
+ };
19
+ //#endregion
20
+ export { FileField_module_default as default, field, file, files, icon, name, none, size };
21
+
22
+ //# sourceMappingURL=FileField.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileField.module.js","names":[],"sources":["../../src/file/FileField.module.css"],"sourcesContent":[".field {\n display: grid;\n gap: var(--panneau-space-2);\n}\n\n.files {\n display: grid;\n gap: var(--panneau-space-1);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.file {\n display: flex;\n align-items: center;\n gap: var(--panneau-space-2);\n min-height: var(--panneau-control-height-sm);\n padding-inline: var(--panneau-space-2) var(--panneau-space-1);\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.icon {\n flex: none;\n width: 1rem;\n height: 1rem;\n color: var(--panneau-color-text-muted);\n}\n\n.name {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n font-size: var(--panneau-font-size-sm);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\na.name {\n color: var(--panneau-color-link);\n}\n\n.size {\n flex: none;\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-text-muted);\n}\n\n.none {\n font-size: var(--panneau-font-size-md);\n color: var(--panneau-color-text-muted);\n}\n"],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export { type FileFieldBaseProps, FileField, FileFieldEntry, type FileFieldProps, type FileValue, type MultipleFileFieldProps, type SingleFileFieldProps, isFileValue, toFiles, } from './FileField.js';
2
+ export type { UploadItem, UploadItemStatus, UploadSource, UploadedFile, Uploader, } from '../upload/types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/file/index.ts"],"names":[],"mappings":"AAAA,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,aAAa,CAAC;AACrB,YAAY,EACR,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,QAAQ,GACX,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1 @@
1
+ export { FileField, FileFieldEntry, isFileValue, toFiles } from "./FileField.js";
@@ -1,4 +1,4 @@
1
- .panneau-fields-YVfYCM {
1
+ .panneau-group-field-fields {
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  gap: var(--panneau-space-4);
@@ -8,7 +8,7 @@
8
8
  }
9
9
 
10
10
  @media (max-width: 30rem) {
11
- .panneau-fields-YVfYCM {
11
+ .panneau-group-field-fields {
12
12
  padding: var(--panneau-space-3);
13
13
  }
14
14
  }
@@ -1,5 +1,5 @@
1
1
  import type { Field } from '@panneau/protocol';
2
- import type { FieldEntryProps, FieldProps } from '../shared/types';
2
+ import type { FieldEntryProps, FieldProps } from '../shared/types.js';
3
3
  export type GroupValue = Record<string, unknown>;
4
4
  export interface GroupFieldProps extends FieldProps<GroupValue> {
5
5
  /** The nested fields, rendered with the entries of the fields context. */
@@ -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":";;;;;;;;;;;;;AAwBA,SAAO,WAAA,IAAA;CAAA,MAAA,IAAAU,EAAA,EAAA;CAAoB,MAAA,EAAA,QAAA,MAAA,MAAA,OAAA,UAAA,QAAA,OAAA,aAAA,QAAA,UAAA,UAAA,UAAA,WAAA,gBAAA,sBAAA,iBAAA,oBAAA;CAmBvB,MAAA,OAAa,QAAA,QAAA;CAAmB,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EACjB,KAAA,SAAA,CAAU;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAA1B,MAAA,SAAe;CAAY,IAAA;CAAA,IAAA,EAAA,OAAA,iBAAA;EAYH,KAAA,GAAGC,0BAAM,QAAS,eAAe;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,QAAA,EAAA,OAAA,YAAA,EAAA,OAAA,UAAA,EAAA,OAAA,UAAA,EAAA,OAAA,UAAA,EAAA,OAAA,YAAA,EAAA,QAAA,UAAA;EAAA,IAAA;EAAA,IAAA,EAAA,QAAA,QAAA,EAAA,QAAA,YAAA,EAAA,QAAA,UAAA,EAAA,QAAA,UAAA,EAAA,QAAA,YAAA,EAAA,QAAA,UAAA;GAClC,MAAA,UACR,oBAAC,aAAD;IAEW;IACD,MAAA,SAAS,KAAT,GAAiB,KAAI,GAAI,MAAK,SAAU,MAAK;IAC5C,OAAA,OAAO,MAAK;IACT,WAAA,SAAU,WAAW;KAAA,GAAK;MAAS,MAAK,OAAQ;IAAK,CAAC;IAAC,GAC5D,WAAW,KAAA,IAAX,EAAA,OAAqC,IAArC,CAAqC;IAC7BV,aAAA;IAAM,GACd,aAAa,KAAA,IAAb,EAAA,SAAyC,IAAzC,CAAyC;IAAC,GAC1C,aAAa,KAAA,IAAb,EAAA,SAAyC,IAAzC,CAAyC;GAAC,GAR1C,MAAK,IAQqC;GAEtD,EAAA,MAAA;GAAA,EAAA,MAAA;GAAA,EAAA,MAAA;GAAA,EAAA,MAAA;GAAA,EAAA,MAAA;GAAA,EAAA,MAAA;GAAA,EAAA,MAAA;EAAA,OAAA,KAAA,EAAA;EAZA,KAAA,OAAM,IAAK,EAYX;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,MAAA,EAAA,QAAA,IAAA;EAbN,KAAA,oBAAA,OAAA;GAAgB,WAAA;GACX,UAAA;EAaC,CAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,aAAA,EAAA,QAAA,eAAA,EAAA,QAAA,wBAAA,EAAA,QAAA,UAAA,EAAA,QAAA,mBAAA,EAAA,QAAA,SAAA,EAAA,QAAA,kBAAA,EAAA,QAAA,YAAA,EAAA,QAAA,IAAA;EAxBV,KAAA,oBAAC,UAAD;GACYC,QAAA;GACK;GACL;GACIG,YAAA;GACD;GACME,iBAAA;GACK;GACL;GAEjB,UAAA;EAVK,CAAA;EAyBE,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OAzBX;AAyBW;;AAKnB,SAAO,gBAAA,OAAA;CAAA,MAAA,IAAAG,EAAA,EAAA;CACH,MAAA,EAAA,UAAkB;CAAM,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EAGZ,KAAA,cAAc,KAAK;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA,MAAA,QAAA;EAChB,KAAA,MAAK,MAAM,UAAX,CAAA;EAAwB,EAAA,KAAA,MAAA,MAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAG5B,MAAA,KAAA,UAAU,QAAQ,OAAO,UAAU,YAAnC,CAAgD,MAAK,QAAS,KAAK,IAC5D,QADP;CAEU,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA,YAAA,EAAA,OAAA,MAAA,QAAA,EAAA,OAAA,MAAA,EAAA,OAAA,MAAA,EAAA,OAAA,IAAA;EAPlB,KAAA,oBAAC,YAAD;GAAW,GACH;GACI,QAAA;GACF,MAAA,MAAK;GAEP,OAAA;GAIM,UAAA,MAAK;EAAS,CAAA;EAC1B,EAAA,KAAA,MAAA;EAAA,EAAA,KAAA,MAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OAVF;AAUE"}
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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"}
@@ -1,6 +1,6 @@
1
1
  import "./GroupField.css";
2
2
  //#region src/group/GroupField.module.css
3
- var fields = "panneau-fields-YVfYCM";
3
+ var fields = "panneau-group-field-fields";
4
4
  var GroupField_module_default = { fields };
5
5
  //#endregion
6
6
  export { GroupField_module_default as default, fields };
@@ -1,2 +1,2 @@
1
- export { GroupField, GroupFieldEntry, type GroupFieldProps, type GroupValue } from './GroupField';
1
+ export { GroupField, GroupFieldEntry, type GroupFieldProps, type GroupValue } from './GroupField.js';
2
2
  //# sourceMappingURL=index.d.ts.map
package/dist/index.d.ts CHANGED
@@ -1,8 +1,19 @@
1
- export { DefinitionField, NestedField, type NestedFieldProps } from './shared/DefinitionField';
2
- export { builtInFields, fieldsPlugin } from './shared/builtIn';
3
- export { type BoundFieldProps, type FieldBinding, type FieldBindingProps, FieldsProvider, type FieldsContextValue, type FieldsProviderProps, getParentPath, useFieldsContext, } from './shared/context';
4
- export { findRule, getFieldProps, getRuleNumber, isRequired } from './shared/entry';
5
- export { type RelationListAdapter, type RelationReference, type RelationSource, type RelationSourceOptions, createRelationSource, toReferences, useRelationReferences, } from './shared/relation';
6
- export type { FieldEntry, FieldEntryProps, FieldProps } from './shared/types';
7
- export { MissingFieldEntry } from './missing/MissingField';
1
+ export { DefinitionField, NestedField, type NestedFieldProps } from './shared/DefinitionField.js';
2
+ export { builtInFields, fieldsPlugin } from './shared/builtIn.js';
3
+ export { type BoundFieldProps, type FieldBinding, type FieldBindingProps, FieldsProvider, type FieldsContextValue, type FieldsProviderProps, getParentPath, useFieldsContext, } from './shared/context.js';
4
+ export { findRule, getAccept, getFieldProps, getMaxSize, getRuleNumber, isRequired, } from './shared/entry.js';
5
+ export { type RelationListAdapter, type RelationReference, type RelationSource, type RelationSourceOptions, createRelationSource, toReferences, useRelationReferences, } from './shared/relation.js';
6
+ export { type FieldCheckAdapter, type FieldCheckSource, createFieldCheckSource, } from './shared/check.js';
7
+ export { type EmbedAdapter, type EmbedSource, createEmbedSource } from './shared/embed.js';
8
+ export type { GeocodingResult, GeocodingSource, MapTiles, MapsConfig } from './location/types.js';
9
+ export { type NominatimSourceOptions, createNominatimSource } from './location/nominatim.js';
10
+ export type { FieldEntry, FieldEntryProps, FieldProps } from './shared/types.js';
11
+ export { MissingFieldEntry } from './missing/MissingField.js';
12
+ export { type FileFieldBaseProps, FileField, FileFieldEntry, type FileFieldProps, type FileValue, type MultipleFileFieldProps, type SingleFileFieldProps, isFileValue, toFiles, } from './file/FileField.js';
13
+ export { FilePicker, type FilePickerProps } from './upload/FilePicker.js';
14
+ export { UploadList, type UploadListProps } from './upload/UploadList.js';
15
+ export { formatSize, matchesMime } from './upload/files.js';
16
+ export { type UploadItem, type UploadItemStatus, type UploadRejection, type UploadSource, type UploadedFile, type Uploader, } from './upload/types.js';
17
+ export { useRejectionMessage } from './upload/useRejectionMessage.js';
18
+ export { type UseUploadsOptions, type UseUploadsResult, useUploads } from './upload/useUploads.js';
8
19
  //# sourceMappingURL=index.d.ts.map
@@ -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,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EACH,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,oBAAoB,EACpB,YAAY,EACZ,qBAAqB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,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
@@ -1,7 +1,16 @@
1
1
  import { FieldsProvider, getParentPath, useFieldsContext } from "./shared/context.js";
2
- import { findRule, getFieldProps, getRuleNumber, isRequired } from "./shared/entry.js";
2
+ import { findRule, getAccept, getFieldProps, getMaxSize, getRuleNumber, isRequired } from "./shared/entry.js";
3
3
  import { MissingFieldEntry } from "./missing/MissingField.js";
4
+ import { FilePicker } from "./upload/FilePicker.js";
5
+ import { formatSize, matchesMime } from "./upload/files.js";
6
+ import { UploadList } from "./upload/UploadList.js";
7
+ import { useRejectionMessage } from "./upload/useRejectionMessage.js";
8
+ import { useUploads } from "./upload/useUploads.js";
9
+ import { FileField, FileFieldEntry, isFileValue, toFiles } from "./file/FileField.js";
4
10
  import { createRelationSource, toReferences, useRelationReferences } from "./shared/relation.js";
5
11
  import { builtInFields, fieldsPlugin } from "./shared/builtIn.js";
6
12
  import { DefinitionField, NestedField } from "./shared/DefinitionField.js";
7
- export { DefinitionField, FieldsProvider, MissingFieldEntry, NestedField, builtInFields, createRelationSource, fieldsPlugin, findRule, getFieldProps, getParentPath, getRuleNumber, isRequired, toReferences, useFieldsContext, useRelationReferences };
13
+ import { createFieldCheckSource } from "./shared/check.js";
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.js';
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"}