@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
@@ -1 +1 @@
1
- {"version":3,"file":"TextAreaField.js","names":["shownDescription","disabled","readOnly","required","_c"],"sources":["../../src/textarea/TextAreaField.tsx"],"sourcesContent":["import { TextArea } from '@panneau/ui';\n\nimport { getFieldProps, getRuleNumber, getSetting, isNumber, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport { useCountedDescription } from '../text/TextField';\n\nexport interface TextAreaFieldProps extends FieldProps<string> {\n placeholder?: string;\n /** Shows a count of characters against this maximum. It doesn't stop typing. */\n maxLength?: number;\n /** Visible lines. Defaults to 4. */\n rows?: number;\n textAreaClassName?: string;\n}\n\n/** A text of several lines. An empty text is `null`. */\nexport function TextAreaField({\n value,\n onChange,\n description,\n maxLength,\n disabled,\n readOnly,\n required,\n ...props\n}: TextAreaFieldProps) {\n const shownDescription = useCountedDescription(description, value, maxLength);\n return (\n <TextArea\n {...props}\n value={value ?? ''}\n onChange={(next) => onChange?.(next === '' ? null : next)}\n description={shownDescription}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `textarea` type: setting `rows`, and a character count from the `max` rule. */\nexport function TextAreaFieldEntry(props: FieldEntryProps) {\n const max = getRuleNumber(props.field, 'max');\n const rows = getSetting(props.field, 'rows', isNumber);\n return (\n <TextAreaField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(max !== undefined ? { maxLength: max } : {})}\n {...(rows !== undefined ? { rows } : {})}\n />\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TextAreaField.js","names":["TextArea","getFieldProps","getRuleNumber","getSetting","isNumber","isString","FieldEntryProps","FieldProps","useCountedDescription","TextAreaFieldProps","placeholder","maxLength","rows","textAreaClassName","TextAreaField","t0","$","_c","description","disabled","onChange","props","readOnly","required","value","shownDescription","t1","t2","next","t3","TextAreaFieldEntry","field","max","t4","undefined","t5","t6","_c"],"sources":["../../src/textarea/TextAreaField.tsx"],"sourcesContent":["import { TextArea } from '@panneau/ui';\n\nimport { getFieldProps, getRuleNumber, getSetting, isNumber, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport { useCountedDescription } from '../text/TextField';\n\nexport interface TextAreaFieldProps extends FieldProps<string> {\n placeholder?: string;\n /** Shows a count of characters against this maximum. It doesn't stop typing. */\n maxLength?: number;\n /** Visible lines. Defaults to 4. */\n rows?: number;\n textAreaClassName?: string;\n}\n\n/** A text of several lines. An empty text is `null`. */\nexport function TextAreaField({\n value,\n onChange,\n description,\n maxLength,\n disabled,\n readOnly,\n required,\n ...props\n}: TextAreaFieldProps) {\n const shownDescription = useCountedDescription(description, value, maxLength);\n return (\n <TextArea\n {...props}\n value={value ?? ''}\n onChange={(next) => onChange?.(next === '' ? null : next)}\n description={shownDescription}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `textarea` type: setting `rows`, and a character count from the `max` rule. */\nexport function TextAreaFieldEntry(props: FieldEntryProps) {\n const max = getRuleNumber(props.field, 'max');\n const rows = getSetting(props.field, 'rows', isNumber);\n return (\n <TextAreaField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(max !== undefined ? { maxLength: max } : {})}\n {...(rows !== undefined ? { rows } : {})}\n />\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export { TextAreaField, TextAreaFieldEntry, type TextAreaFieldProps } from './TextAreaField';
1
+ export { TextAreaField, TextAreaFieldEntry, type TextAreaFieldProps } from './TextAreaField.js';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { FieldEntryProps, FieldProps } from '../shared/types';
1
+ import type { FieldEntryProps, FieldProps } from '../shared/types.js';
2
2
  export interface TimeFieldProps extends FieldProps<string> {
3
3
  /** Shows and writes seconds (`09:30:15`). */
4
4
  withSeconds?: boolean;
@@ -5,16 +5,70 @@ import { TimeInput } from "@panneau/ui";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region src/time/TimeField.tsx
7
7
  /** A time of day as a string, `09:30` (or `09:30:15` with seconds). */
8
- function TimeField({ value, onChange, withSeconds = false, disabled, readOnly, required, ...props }) {
9
- return /* @__PURE__ */ jsx(TimeInput, {
10
- ...props,
11
- granularity: withSeconds ? "second" : "minute",
12
- value: toTime(value),
13
- onChange: (next) => onChange?.(next === null ? null : fromTime(next, withSeconds)),
14
- isDisabled: disabled,
15
- isReadOnly: readOnly,
16
- isRequired: required
17
- });
8
+ function TimeField(t0) {
9
+ const $ = c(21);
10
+ let disabled;
11
+ let onChange;
12
+ let props;
13
+ let readOnly;
14
+ let required;
15
+ let t1;
16
+ let value;
17
+ if ($[0] !== t0) {
18
+ ({value, onChange, withSeconds: t1, disabled, readOnly, required, ...props} = t0);
19
+ $[0] = t0;
20
+ $[1] = disabled;
21
+ $[2] = onChange;
22
+ $[3] = props;
23
+ $[4] = readOnly;
24
+ $[5] = required;
25
+ $[6] = t1;
26
+ $[7] = value;
27
+ } else {
28
+ disabled = $[1];
29
+ onChange = $[2];
30
+ props = $[3];
31
+ readOnly = $[4];
32
+ required = $[5];
33
+ t1 = $[6];
34
+ value = $[7];
35
+ }
36
+ const withSeconds = t1 === void 0 ? false : t1;
37
+ const t2 = withSeconds ? "second" : "minute";
38
+ let t3;
39
+ if ($[8] !== value) {
40
+ t3 = toTime(value);
41
+ $[8] = value;
42
+ $[9] = t3;
43
+ } else t3 = $[9];
44
+ let t4;
45
+ if ($[10] !== onChange || $[11] !== withSeconds) {
46
+ t4 = (next) => onChange?.(next === null ? null : fromTime(next, withSeconds));
47
+ $[10] = onChange;
48
+ $[11] = withSeconds;
49
+ $[12] = t4;
50
+ } else t4 = $[12];
51
+ let t5;
52
+ if ($[13] !== disabled || $[14] !== props || $[15] !== readOnly || $[16] !== required || $[17] !== t2 || $[18] !== t3 || $[19] !== t4) {
53
+ t5 = /* @__PURE__ */ jsx(TimeInput, {
54
+ ...props,
55
+ granularity: t2,
56
+ value: t3,
57
+ onChange: t4,
58
+ isDisabled: disabled,
59
+ isReadOnly: readOnly,
60
+ isRequired: required
61
+ });
62
+ $[13] = disabled;
63
+ $[14] = props;
64
+ $[15] = readOnly;
65
+ $[16] = required;
66
+ $[17] = t2;
67
+ $[18] = t3;
68
+ $[19] = t4;
69
+ $[20] = t5;
70
+ } else t5 = $[20];
71
+ return t5;
18
72
  }
19
73
  /** The `time` type: setting `withSeconds`. */
20
74
  function TimeFieldEntry(props) {
@@ -1 +1 @@
1
- {"version":3,"file":"TimeField.js","names":["_c"],"sources":["../../src/time/TimeField.tsx"],"sourcesContent":["import { TimeInput } from '@panneau/ui';\n\nimport { fromTime, toTime } from '../shared/dates';\nimport { getFieldProps, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\n\nexport interface TimeFieldProps extends FieldProps<string> {\n /** Shows and writes seconds (`09:30:15`). */\n withSeconds?: boolean;\n /** Defaults to the locale's. */\n hourCycle?: 12 | 24;\n controlClassName?: string;\n}\n\n/** A time of day as a string, `09:30` (or `09:30:15` with seconds). */\nexport function TimeField({\n value,\n onChange,\n withSeconds = false,\n disabled,\n readOnly,\n required,\n ...props\n}: TimeFieldProps) {\n return (\n <TimeInput\n {...props}\n granularity={withSeconds ? 'second' : 'minute'}\n value={toTime(value)}\n onChange={(next) => onChange?.(next === null ? null : fromTime(next, withSeconds))}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `time` type: setting `withSeconds`. */\nexport function TimeFieldEntry(props: FieldEntryProps) {\n return (\n <TimeField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n withSeconds={props.field.settings?.withSeconds === true}\n />\n );\n}\n"],"mappings":";;;;;;;AAeA,SAAgB,UAAU,EACtB,OACA,UACA,cAAc,OACd,UACA,UACA,UACA,GAAG,SACY;CACf,OACI,oBAAC,WAAD;EACI,GAAI;EACJ,aAAa,cAAc,WAAW;EACtC,OAAO,OAAO,KAAK;EACnB,WAAW,SAAS,WAAW,SAAS,OAAO,OAAO,SAAS,MAAM,WAAW,CAAC;EACjF,YAAY;EACZ,YAAY;EACZ,YAAY;CAAS,CAAA;AAGjC;;AAGA,SAAO,eAAA,OAAA;CAAA,MAAA,IAAAA,EAAA,CAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EAGS,KAAA,cAAc,KAAK;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CACjB,MAAA,KAAA,SAAS,MAAK,KAA2B,IAAjB,MAAK,QAA7B;CAEM,MAAA,KAAA,MAAK,MAAM,UAAsB,gBAAK;CAAI,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA,YAAA,EAAA,OAAA,MAAA,EAAA,OAAA,MAAA,EAAA,OAAA,IAAA;EAJ3D,KAAA,oBAAC,WAAD;GAAU,GACF;GACG,OAAA;GACG,UAAA,MAAK;GACF,aAAA;EAA0C,CAAA;EACzD,EAAA,KAAA,MAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OALF;AAKE"}
1
+ {"version":3,"file":"TimeField.js","names":["TimeInput","fromTime","toTime","getFieldProps","isString","FieldEntryProps","FieldProps","TimeFieldProps","withSeconds","hourCycle","controlClassName","TimeField","t0","$","_c","disabled","onChange","props","readOnly","required","t1","value","undefined","t2","t3","t4","next","t5","TimeFieldEntry","field","settings","_c"],"sources":["../../src/time/TimeField.tsx"],"sourcesContent":["import { TimeInput } from '@panneau/ui';\n\nimport { fromTime, toTime } from '../shared/dates';\nimport { getFieldProps, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\n\nexport interface TimeFieldProps extends FieldProps<string> {\n /** Shows and writes seconds (`09:30:15`). */\n withSeconds?: boolean;\n /** Defaults to the locale's. */\n hourCycle?: 12 | 24;\n controlClassName?: string;\n}\n\n/** A time of day as a string, `09:30` (or `09:30:15` with seconds). */\nexport function TimeField({\n value,\n onChange,\n withSeconds = false,\n disabled,\n readOnly,\n required,\n ...props\n}: TimeFieldProps) {\n return (\n <TimeInput\n {...props}\n granularity={withSeconds ? 'second' : 'minute'}\n value={toTime(value)}\n onChange={(next) => onChange?.(next === null ? null : fromTime(next, withSeconds))}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `time` type: setting `withSeconds`. */\nexport function TimeFieldEntry(props: FieldEntryProps) {\n return (\n <TimeField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n withSeconds={props.field.settings?.withSeconds === true}\n />\n );\n}\n"],"mappings":";;;;;;;AAeA,SAAOW,UAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAR,EAAA,OAAAD,IAAA;EAAmB,CAAA,CAAAS,OAAAL,UAAAR,aAAAY,IAAAL,UAAAG,UAAAC,UAAA,GAAAF,SAAAL;EAQTC,EAAA,KAAAD;EAAAC,EAAA,KAAAE;EAAAF,EAAA,KAAAG;EAAAH,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;EAAAL,EAAA,KAAAM;EAAAN,EAAA,KAAAO;EAAAP,EAAA,KAAAQ;CAAA,OAAA;EAAAN,WAAAF,EAAA;EAAAG,WAAAH,EAAA;EAAAI,QAAAJ,EAAA;EAAAK,WAAAL,EAAA;EAAAM,WAAAN,EAAA;EAAAO,KAAAP,EAAA;EAAAQ,QAAAR,EAAA;CAAA;CALb,MAAAL,cAAAY,OAAAE,KAAAA,IAAA,QAAAF;CASqB,MAAAG,KAAAf,cAAA,WAAA;CAAiC,IAAAgB;CAAA,IAAAX,EAAA,OAAAQ,OAAA;EACvCG,KAAAtB,OAAOmB,KAAK;EAACR,EAAA,KAAAQ;EAAAR,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,IAAAY;CAAA,IAAAZ,EAAA,QAAAG,YAAAH,EAAA,QAAAL,aAAA;EACViB,MAAAC,SAAUV,WAAWU,SAAS,OAAT,OAAuBzB,SAASyB,MAAMlB,WAAW,CAAC;EAACK,EAAA,MAAAG;EAAAH,EAAA,MAAAL;EAAAK,EAAA,MAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAAA,IAAAc;CAAA,IAAAd,EAAA,QAAAE,YAAAF,EAAA,QAAAI,SAAAJ,EAAA,QAAAK,YAAAL,EAAA,QAAAM,YAAAN,EAAA,QAAAU,MAAAV,EAAA,QAAAW,MAAAX,EAAA,QAAAY,IAAA;EAJtFE,KAAA,oBAAC,WAAD;GAAU,GACFV;GACS,aAAAM;GACN,OAAAC;GACG,UAAAC;GACEV,YAAAA;GACAG,YAAAA;GACAC,YAAAA;EAAQ,CAAA;EACtBN,EAAA,MAAAE;EAAAF,EAAA,MAAAI;EAAAJ,EAAA,MAAAK;EAAAL,EAAA,MAAAM;EAAAN,EAAA,MAAAU;EAAAV,EAAA,MAAAW;EAAAX,EAAA,MAAAY;EAAAZ,EAAA,MAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,OARFc;AAQE;;AAKV,SAAOC,eAAAX,OAAA;CAAA,MAAAJ,IAAAC,EAAA,CAAA;CAAA,IAAAF;CAAA,IAAAC,EAAA,OAAAI,OAAA;EAGSL,KAAAT,cAAcc,KAAK;EAACJ,EAAA,KAAAI;EAAAJ,EAAA,KAAAD;CAAA,OAAAA,KAAAC,EAAA;CACjB,MAAAO,KAAAhB,SAASa,MAAKI,KAA2B,IAAjBJ,MAAKI,QAA7B;CAEM,MAAAE,KAAAN,MAAKY,MAAMC,UAAsBtB,gBAAK;CAAI,IAAAgB;CAAA,IAAAX,EAAA,OAAAI,MAAAD,YAAAH,EAAA,OAAAD,MAAAC,EAAA,OAAAO,MAAAP,EAAA,OAAAU,IAAA;EAJ3DC,KAAA,oBAAC,WAAD;GAAU,GACFZ;GACG,OAAAQ;GACG,UAAAH,MAAKD;GACF,aAAAO;EAA0C,CAAA;EACzDV,EAAA,KAAAI,MAAAD;EAAAH,EAAA,KAAAD;EAAAC,EAAA,KAAAO;EAAAP,EAAA,KAAAU;EAAAV,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,OALFW;AAKE"}
@@ -1,2 +1,2 @@
1
- export { TimeField, TimeFieldEntry, type TimeFieldProps } from './TimeField';
1
+ export { TimeField, TimeFieldEntry, type TimeFieldProps } from './TimeField.js';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,24 @@
1
+ .panneau-file-picker-zone {
2
+ display: flex;
3
+ flex-wrap: wrap;
4
+ align-items: center;
5
+ gap: var(--panneau-space-2);
6
+ padding: var(--panneau-space-3);
7
+ border: var(--panneau-border-width) dashed var(--panneau-color-border-control);
8
+ border-radius: var(--panneau-radius-md);
9
+ }
10
+
11
+ .panneau-file-picker-zone[data-drop-target] {
12
+ background-color: var(--panneau-color-accent-subtle);
13
+ border-color: var(--panneau-color-accent);
14
+ }
15
+
16
+ .panneau-file-picker-zone[data-focus-visible] {
17
+ outline: 2px solid var(--panneau-color-focus);
18
+ outline-offset: 2px;
19
+ }
20
+
21
+ .panneau-file-picker-hint {
22
+ font-size: var(--panneau-font-size-sm);
23
+ color: var(--panneau-color-text-muted);
24
+ }
@@ -0,0 +1,14 @@
1
+ export interface FilePickerProps {
2
+ /** Called with the files chosen or dropped. */
3
+ onSelect: (files: File[]) => void;
4
+ /** Accepted MIME types, which the file dialog offers. */
5
+ accept?: readonly string[] | null;
6
+ multiple?: boolean;
7
+ isDisabled?: boolean;
8
+ /** Text of the button. Defaults to "Choose a file", or "Choose files" with `multiple`. */
9
+ label?: string;
10
+ className?: string;
11
+ }
12
+ /** A button that opens the file dialog, in a zone where files can be dropped. */
13
+ export declare function FilePicker({ onSelect, accept, multiple, isDisabled, label, className, }: FilePickerProps): import("react").JSX.Element;
14
+ //# sourceMappingURL=FilePicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilePicker.d.ts","sourceRoot":"","sources":["../../src/upload/FilePicker.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,eAAe;IAC5B,+CAA+C;IAC/C,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IAClC,yDAAyD;IACzD,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,0FAA0F;IAC1F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AASD,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,EACvB,QAAQ,EACR,MAAM,EACN,QAAgB,EAChB,UAAkB,EAClB,KAAK,EACL,SAAS,GACZ,EAAE,eAAe,+BAmCjB"}
@@ -0,0 +1,130 @@
1
+ import { cx } from "../shared/cx.js";
2
+ import { messages } from "../shared/messages.js";
3
+ import FilePicker_module_default from "./FilePicker.module.js";
4
+ import { c } from "react/compiler-runtime";
5
+ import { Button, usePanneauIntl } from "@panneau/ui";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ import { Upload } from "lucide-react";
8
+ import { DropZone, FileTrigger } from "react-aria-components";
9
+ //#region src/upload/FilePicker.tsx
10
+ async function readDrop(items) {
11
+ return (await Promise.all(items.map((item) => item.kind === "file" ? item.getFile() : Promise.resolve(null)))).filter((file) => file !== null);
12
+ }
13
+ /** A button that opens the file dialog, in a zone where files can be dropped. */
14
+ function FilePicker(t0) {
15
+ const $ = c(34);
16
+ const { onSelect, accept, multiple: t1, isDisabled: t2, label, className } = t0;
17
+ const multiple = t1 === void 0 ? false : t1;
18
+ const isDisabled = t2 === void 0 ? false : t2;
19
+ const intl = usePanneauIntl();
20
+ let t3;
21
+ if ($[0] !== className) {
22
+ t3 = cx(FilePicker_module_default.zone, className);
23
+ $[0] = className;
24
+ $[1] = t3;
25
+ } else t3 = $[1];
26
+ let t4;
27
+ if ($[2] !== intl) {
28
+ t4 = intl.formatMessage(messages.dropZone);
29
+ $[2] = intl;
30
+ $[3] = t4;
31
+ } else t4 = $[3];
32
+ let t5;
33
+ if ($[4] !== multiple || $[5] !== onSelect) {
34
+ t5 = (event) => {
35
+ readDrop(event.items).then((files) => {
36
+ if (files.length > 0) onSelect(multiple ? files : files.slice(0, 1));
37
+ });
38
+ };
39
+ $[4] = multiple;
40
+ $[5] = onSelect;
41
+ $[6] = t5;
42
+ } else t5 = $[6];
43
+ let t6;
44
+ if ($[7] !== accept) {
45
+ t6 = accept !== null && accept !== void 0 && accept.length > 0 ? { acceptedFileTypes: accept } : {};
46
+ $[7] = accept;
47
+ $[8] = t6;
48
+ } else t6 = $[8];
49
+ let t7;
50
+ if ($[9] !== onSelect) {
51
+ t7 = (list) => {
52
+ const files_0 = list === null ? [] : [...list];
53
+ if (files_0.length > 0) onSelect(files_0);
54
+ };
55
+ $[9] = onSelect;
56
+ $[10] = t7;
57
+ } else t7 = $[10];
58
+ let t8;
59
+ if ($[11] !== intl || $[12] !== label || $[13] !== multiple) {
60
+ t8 = label ?? intl.formatMessage(multiple ? messages.chooseFiles : messages.chooseFile);
61
+ $[11] = intl;
62
+ $[12] = label;
63
+ $[13] = multiple;
64
+ $[14] = t8;
65
+ } else t8 = $[14];
66
+ let t9;
67
+ if ($[15] !== isDisabled || $[16] !== t8) {
68
+ t9 = /* @__PURE__ */ jsx(Button, {
69
+ size: "sm",
70
+ appearance: "outline",
71
+ icon: Upload,
72
+ isDisabled,
73
+ children: t8
74
+ });
75
+ $[15] = isDisabled;
76
+ $[16] = t8;
77
+ $[17] = t9;
78
+ } else t9 = $[17];
79
+ let t10;
80
+ if ($[18] !== multiple || $[19] !== t6 || $[20] !== t7 || $[21] !== t9) {
81
+ t10 = /* @__PURE__ */ jsx(FileTrigger, {
82
+ ...t6,
83
+ allowsMultiple: multiple,
84
+ onSelect: t7,
85
+ children: t9
86
+ });
87
+ $[18] = multiple;
88
+ $[19] = t6;
89
+ $[20] = t7;
90
+ $[21] = t9;
91
+ $[22] = t10;
92
+ } else t10 = $[22];
93
+ let t11;
94
+ if ($[23] !== intl) {
95
+ t11 = intl.formatMessage(messages.dropHere);
96
+ $[23] = intl;
97
+ $[24] = t11;
98
+ } else t11 = $[24];
99
+ let t12;
100
+ if ($[25] !== t11) {
101
+ t12 = /* @__PURE__ */ jsx("span", {
102
+ className: FilePicker_module_default.hint,
103
+ children: t11
104
+ });
105
+ $[25] = t11;
106
+ $[26] = t12;
107
+ } else t12 = $[26];
108
+ let t13;
109
+ if ($[27] !== isDisabled || $[28] !== t10 || $[29] !== t12 || $[30] !== t3 || $[31] !== t4 || $[32] !== t5) {
110
+ t13 = /* @__PURE__ */ jsxs(DropZone, {
111
+ className: t3,
112
+ "aria-label": t4,
113
+ isDisabled,
114
+ onDrop: t5,
115
+ children: [t10, t12]
116
+ });
117
+ $[27] = isDisabled;
118
+ $[28] = t10;
119
+ $[29] = t12;
120
+ $[30] = t3;
121
+ $[31] = t4;
122
+ $[32] = t5;
123
+ $[33] = t13;
124
+ } else t13 = $[33];
125
+ return t13;
126
+ }
127
+ //#endregion
128
+ export { FilePicker };
129
+
130
+ //# sourceMappingURL=FilePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilePicker.js","names":["Upload","DropItem","DropZone","FileTrigger","Button","usePanneauIntl","cx","messages","styles","FilePickerProps","onSelect","files","File","accept","multiple","isDisabled","label","className","readDrop","items","Promise","all","map","item","kind","getFile","resolve","filter","file","FilePicker","t0","$","_c","t1","t2","undefined","intl","t3","zone","t4","formatMessage","dropZone","t5","event","then","length","slice","t6","acceptedFileTypes","t7","list","files_0","t8","chooseFiles","chooseFile","t9","t10","t11","dropHere","t12","hint","t13","_c","styles"],"sources":["../../src/upload/FilePicker.tsx"],"sourcesContent":["import { Upload } from 'lucide-react';\nimport { type DropItem, DropZone, FileTrigger } from 'react-aria-components';\n\nimport { Button, usePanneauIntl } from '@panneau/ui';\n\nimport { cx } from '../shared/cx';\nimport { messages } from '../shared/messages';\nimport styles from './FilePicker.module.css';\n\nexport interface FilePickerProps {\n /** Called with the files chosen or dropped. */\n onSelect: (files: File[]) => void;\n /** Accepted MIME types, which the file dialog offers. */\n accept?: readonly string[] | null;\n multiple?: boolean;\n isDisabled?: boolean;\n /** Text of the button. Defaults to \"Choose a file\", or \"Choose files\" with `multiple`. */\n label?: string;\n className?: string;\n}\n\nasync function readDrop(items: DropItem[]): Promise<File[]> {\n const files = await Promise.all(\n items.map((item) => (item.kind === 'file' ? item.getFile() : Promise.resolve(null))),\n );\n return files.filter((file): file is File => file !== null);\n}\n\n/** A button that opens the file dialog, in a zone where files can be dropped. */\nexport function FilePicker({\n onSelect,\n accept,\n multiple = false,\n isDisabled = false,\n label,\n className,\n}: FilePickerProps) {\n const intl = usePanneauIntl();\n return (\n <DropZone\n className={cx(styles.zone, className)}\n aria-label={intl.formatMessage(messages.dropZone)}\n isDisabled={isDisabled}\n onDrop={(event) => {\n void readDrop(event.items).then((files) => {\n if (files.length > 0) {\n onSelect(multiple ? files : files.slice(0, 1));\n }\n });\n }}\n >\n <FileTrigger\n {...(accept !== null && accept !== undefined && accept.length > 0\n ? { acceptedFileTypes: accept }\n : {})}\n allowsMultiple={multiple}\n onSelect={(list) => {\n const files = list === null ? [] : [...list];\n if (files.length > 0) {\n onSelect(files);\n }\n }}\n >\n <Button size=\"sm\" appearance=\"outline\" icon={Upload} isDisabled={isDisabled}>\n {label ??\n intl.formatMessage(multiple ? messages.chooseFiles : messages.chooseFile)}\n </Button>\n </FileTrigger>\n <span className={styles.hint}>{intl.formatMessage(messages.dropHere)}</span>\n </DropZone>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import "./FilePicker.css";
2
+ //#region src/upload/FilePicker.module.css
3
+ var zone = "panneau-file-picker-zone";
4
+ var hint = "panneau-file-picker-hint";
5
+ var FilePicker_module_default = {
6
+ zone,
7
+ hint
8
+ };
9
+ //#endregion
10
+ export { FilePicker_module_default as default, hint, zone };
11
+
12
+ //# sourceMappingURL=FilePicker.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilePicker.module.js","names":[],"sources":["../../src/upload/FilePicker.module.css"],"sourcesContent":[".zone {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--panneau-space-2);\n padding: var(--panneau-space-3);\n border: var(--panneau-border-width) dashed var(--panneau-color-border-control);\n border-radius: var(--panneau-radius-md);\n}\n\n.zone[data-drop-target] {\n background-color: var(--panneau-color-accent-subtle);\n border-color: var(--panneau-color-accent);\n}\n\n.zone[data-focus-visible] {\n outline: 2px solid var(--panneau-color-focus);\n outline-offset: 2px;\n}\n\n.hint {\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-text-muted);\n}\n"],"mappings":""}
@@ -0,0 +1,93 @@
1
+ .panneau-upload-list-list {
2
+ display: grid;
3
+ gap: var(--panneau-space-2);
4
+ margin: 0;
5
+ padding: 0;
6
+ list-style: none;
7
+ }
8
+
9
+ .panneau-upload-list-item {
10
+ display: grid;
11
+ grid-template-columns: minmax(0, 1fr) auto;
12
+ align-items: center;
13
+ gap: var(--panneau-space-1) var(--panneau-space-2);
14
+ padding: var(--panneau-space-2) var(--panneau-space-3);
15
+ background-color: var(--panneau-color-surface-sunken);
16
+ border: var(--panneau-border-width) solid var(--panneau-color-border);
17
+ border-radius: var(--panneau-radius-md);
18
+ }
19
+
20
+ .panneau-upload-list-failed {
21
+ border-color: var(--panneau-color-danger-border);
22
+ }
23
+
24
+ .panneau-upload-list-name {
25
+ overflow: hidden;
26
+ font-size: var(--panneau-font-size-sm);
27
+ font-weight: var(--panneau-font-weight-medium);
28
+ text-overflow: ellipsis;
29
+ white-space: nowrap;
30
+ }
31
+
32
+ .panneau-upload-list-buttons {
33
+ display: flex;
34
+ gap: var(--panneau-space-1);
35
+ }
36
+
37
+ .panneau-upload-list-progress {
38
+ grid-column: 1 / -1;
39
+ display: grid;
40
+ gap: var(--panneau-space-1);
41
+ }
42
+
43
+ .panneau-upload-list-status {
44
+ font-size: var(--panneau-font-size-sm);
45
+ color: var(--panneau-color-text-muted);
46
+ }
47
+
48
+ .panneau-upload-list-error {
49
+ grid-column: 1 / -1;
50
+ font-size: var(--panneau-font-size-sm);
51
+ color: var(--panneau-color-danger);
52
+ }
53
+
54
+ .panneau-upload-list-track {
55
+ height: 0.375rem;
56
+ overflow: hidden;
57
+ background: var(--panneau-color-surface);
58
+ border-radius: var(--panneau-radius-full);
59
+ }
60
+
61
+ .panneau-upload-list-fill {
62
+ display: block;
63
+ height: 100%;
64
+ background: var(--panneau-color-accent);
65
+ border-radius: inherit;
66
+ transition: width var(--panneau-duration) ease-out;
67
+ }
68
+
69
+ .panneau-upload-list-indeterminate .panneau-upload-list-fill {
70
+ width: 30%;
71
+ animation: panneau-upload-list-slide 1.2s ease-in-out infinite;
72
+ }
73
+
74
+ @keyframes panneau-upload-list-slide {
75
+ from {
76
+ transform: translateX(-100%);
77
+ }
78
+ to {
79
+ transform: translateX(340%);
80
+ }
81
+ }
82
+
83
+ @media (prefers-reduced-motion: reduce) {
84
+ .panneau-upload-list-fill {
85
+ transition: none;
86
+ }
87
+
88
+ .panneau-upload-list-indeterminate .panneau-upload-list-fill {
89
+ width: 100%;
90
+ animation: none;
91
+ opacity: 0.5;
92
+ }
93
+ }
@@ -0,0 +1,18 @@
1
+ import type { UploadItem } from './types.js';
2
+ export interface UploadListProps {
3
+ /** The files being uploaded, from `useUploads()`. */
4
+ items: readonly UploadItem[];
5
+ onPause?: (id: string) => void;
6
+ onResume?: (id: string) => void;
7
+ onCancel?: (id: string) => void;
8
+ onRetry?: (id: string) => void;
9
+ /** Accessible name of the list. Defaults to "Uploads". */
10
+ 'aria-label'?: string;
11
+ className?: string;
12
+ }
13
+ /**
14
+ * The files being uploaded: a progress bar for each, and buttons to pause and resume a file sent
15
+ * in parts, to cancel it, and to retry it when it failed. Renders nothing without files.
16
+ */
17
+ export declare function UploadList({ items, onPause, onResume, onCancel, onRetry, 'aria-label': ariaLabel, className, }: UploadListProps): import("react").JSX.Element | null;
18
+ //# sourceMappingURL=UploadList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UploadList.d.ts","sourceRoot":"","sources":["../../src/upload/UploadList.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC5B,qDAAqD;IACrD,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EACvB,KAAK,EACL,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,YAAY,EAAE,SAAS,EACvB,SAAS,GACZ,EAAE,eAAe,sCAsGjB"}
@@ -0,0 +1,144 @@
1
+ import { cx } from "../shared/cx.js";
2
+ import { messages } from "../shared/messages.js";
3
+ import UploadList_module_default from "./UploadList.module.js";
4
+ import { formatSize } from "./files.js";
5
+ import { c } from "react/compiler-runtime";
6
+ import { IconButton, usePanneauIntl } from "@panneau/ui";
7
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
+ import { Pause, Play, RotateCcw, X } from "lucide-react";
9
+ import { ProgressBar } from "react-aria-components";
10
+ //#region src/upload/UploadList.tsx
11
+ /**
12
+ * The files being uploaded: a progress bar for each, and buttons to pause and resume a file sent
13
+ * in parts, to cancel it, and to retry it when it failed. Renders nothing without files.
14
+ */
15
+ function UploadList(t0) {
16
+ const $ = c(22);
17
+ const { items, onPause, onResume, onCancel, onRetry, "aria-label": ariaLabel, className } = t0;
18
+ const intl = usePanneauIntl();
19
+ if (items.length === 0) return null;
20
+ let t1;
21
+ if ($[0] !== className) {
22
+ t1 = cx(UploadList_module_default.list, className);
23
+ $[0] = className;
24
+ $[1] = t1;
25
+ } else t1 = $[1];
26
+ let t2;
27
+ if ($[2] !== ariaLabel || $[3] !== intl) {
28
+ t2 = ariaLabel ?? intl.formatMessage(messages.uploads);
29
+ $[2] = ariaLabel;
30
+ $[3] = intl;
31
+ $[4] = t2;
32
+ } else t2 = $[4];
33
+ let t3;
34
+ if ($[5] !== intl || $[6] !== items || $[7] !== onCancel || $[8] !== onPause || $[9] !== onResume || $[10] !== onRetry) {
35
+ let t4;
36
+ if ($[12] !== intl || $[13] !== onCancel || $[14] !== onPause || $[15] !== onResume || $[16] !== onRetry) {
37
+ t4 = (item) => {
38
+ const { name } = item;
39
+ const failed = item.status === "failed";
40
+ const indeterminate = item.progress === null || item.status === "completing";
41
+ const status = {
42
+ uploading: intl.formatMessage(messages.uploading),
43
+ paused: intl.formatMessage(messages.uploadPaused),
44
+ completing: intl.formatMessage(messages.uploadCompleting),
45
+ failed: intl.formatMessage(messages.uploadFailed, { error: item.error ?? "" })
46
+ }[item.status];
47
+ const percent = item.progress === null ? null : Math.round(item.progress * 100);
48
+ return /* @__PURE__ */ jsxs("li", {
49
+ className: cx(UploadList_module_default.item, failed && UploadList_module_default.failed),
50
+ children: [
51
+ /* @__PURE__ */ jsxs("span", {
52
+ className: UploadList_module_default.name,
53
+ children: [name, item.size !== null ? ` · ${formatSize(item.size, intl.locale)}` : null]
54
+ }),
55
+ /* @__PURE__ */ jsxs("span", {
56
+ className: UploadList_module_default.buttons,
57
+ children: [
58
+ item.canPause && item.status === "uploading" && onPause ? /* @__PURE__ */ jsx(IconButton, {
59
+ icon: Pause,
60
+ size: "sm",
61
+ label: intl.formatMessage(messages.pauseUpload, { name }),
62
+ onPress: () => onPause(item.id)
63
+ }) : null,
64
+ item.status === "paused" && onResume ? /* @__PURE__ */ jsx(IconButton, {
65
+ icon: Play,
66
+ size: "sm",
67
+ label: intl.formatMessage(messages.resumeUpload, { name }),
68
+ onPress: () => onResume(item.id)
69
+ }) : null,
70
+ failed && onRetry ? /* @__PURE__ */ jsx(IconButton, {
71
+ icon: RotateCcw,
72
+ size: "sm",
73
+ label: intl.formatMessage(messages.retryUpload, { name }),
74
+ onPress: () => onRetry(item.id)
75
+ }) : null,
76
+ item.status !== "completing" && onCancel ? /* @__PURE__ */ jsx(IconButton, {
77
+ icon: X,
78
+ size: "sm",
79
+ label: intl.formatMessage(messages.cancelUpload, { name }),
80
+ onPress: () => onCancel(item.id)
81
+ }) : null
82
+ ]
83
+ }),
84
+ failed ? /* @__PURE__ */ jsx("span", {
85
+ className: UploadList_module_default.error,
86
+ role: "alert",
87
+ children: status
88
+ }) : /* @__PURE__ */ jsx(ProgressBar, {
89
+ "aria-label": name,
90
+ className: cx(UploadList_module_default.progress, indeterminate && UploadList_module_default.indeterminate),
91
+ value: percent ?? 0,
92
+ isIndeterminate: indeterminate,
93
+ valueLabel: item.progress !== null && !indeterminate ? `${status} · ${intl.formatNumber(item.progress, { style: "percent" })}` : status,
94
+ children: (t5) => {
95
+ const { valueText } = t5;
96
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
97
+ className: UploadList_module_default.status,
98
+ children: valueText
99
+ }), /* @__PURE__ */ jsx("span", {
100
+ className: UploadList_module_default.track,
101
+ children: /* @__PURE__ */ jsx("span", {
102
+ className: UploadList_module_default.fill,
103
+ style: indeterminate ? void 0 : { width: `${String(percent ?? 0)}%` }
104
+ })
105
+ })] });
106
+ }
107
+ })
108
+ ]
109
+ }, item.id);
110
+ };
111
+ $[12] = intl;
112
+ $[13] = onCancel;
113
+ $[14] = onPause;
114
+ $[15] = onResume;
115
+ $[16] = onRetry;
116
+ $[17] = t4;
117
+ } else t4 = $[17];
118
+ t3 = items.map(t4);
119
+ $[5] = intl;
120
+ $[6] = items;
121
+ $[7] = onCancel;
122
+ $[8] = onPause;
123
+ $[9] = onResume;
124
+ $[10] = onRetry;
125
+ $[11] = t3;
126
+ } else t3 = $[11];
127
+ let t4;
128
+ if ($[18] !== t1 || $[19] !== t2 || $[20] !== t3) {
129
+ t4 = /* @__PURE__ */ jsx("ul", {
130
+ className: t1,
131
+ "aria-label": t2,
132
+ children: t3
133
+ });
134
+ $[18] = t1;
135
+ $[19] = t2;
136
+ $[20] = t3;
137
+ $[21] = t4;
138
+ } else t4 = $[21];
139
+ return t4;
140
+ }
141
+ //#endregion
142
+ export { UploadList };
143
+
144
+ //# sourceMappingURL=UploadList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UploadList.js","names":["Pause","Play","RotateCcw","X","ProgressBar","IconButton","usePanneauIntl","cx","messages","styles","formatSize","UploadItem","UploadListProps","items","onPause","id","onResume","onCancel","onRetry","className","UploadList","t0","$","_c","ariaLabel","intl","length","t1","list","t2","formatMessage","uploads","t3","t4","item","name","failed","status","indeterminate","progress","uploading","paused","uploadPaused","completing","uploadCompleting","uploadFailed","error","percent","Math","round","size","locale","buttons","canPause","pauseUpload","resumeUpload","retryUpload","cancelUpload","formatNumber","style","t5","valueText","track","fill","undefined","width","String","map","_c","styles","_Fragment"],"sources":["../../src/upload/UploadList.tsx"],"sourcesContent":["import { Pause, Play, RotateCcw, X } from 'lucide-react';\nimport { ProgressBar } from 'react-aria-components';\n\nimport { IconButton, usePanneauIntl } from '@panneau/ui';\n\nimport { cx } from '../shared/cx';\nimport { messages } from '../shared/messages';\nimport styles from './UploadList.module.css';\nimport { formatSize } from './files';\nimport type { UploadItem } from './types';\n\nexport interface UploadListProps {\n /** The files being uploaded, from `useUploads()`. */\n items: readonly UploadItem[];\n onPause?: (id: string) => void;\n onResume?: (id: string) => void;\n onCancel?: (id: string) => void;\n onRetry?: (id: string) => void;\n /** Accessible name of the list. Defaults to \"Uploads\". */\n 'aria-label'?: string;\n className?: string;\n}\n\n/**\n * The files being uploaded: a progress bar for each, and buttons to pause and resume a file sent\n * in parts, to cancel it, and to retry it when it failed. Renders nothing without files.\n */\nexport function UploadList({\n items,\n onPause,\n onResume,\n onCancel,\n onRetry,\n 'aria-label': ariaLabel,\n className,\n}: UploadListProps) {\n const intl = usePanneauIntl();\n if (items.length === 0) {\n return null;\n }\n return (\n <ul\n className={cx(styles.list, className)}\n aria-label={ariaLabel ?? intl.formatMessage(messages.uploads)}\n >\n {items.map((item) => {\n const { name } = item;\n const failed = item.status === 'failed';\n const indeterminate = item.progress === null || item.status === 'completing';\n const status = {\n uploading: intl.formatMessage(messages.uploading),\n paused: intl.formatMessage(messages.uploadPaused),\n completing: intl.formatMessage(messages.uploadCompleting),\n failed: intl.formatMessage(messages.uploadFailed, { error: item.error ?? '' }),\n }[item.status];\n const percent = item.progress === null ? null : Math.round(item.progress * 100);\n return (\n <li key={item.id} className={cx(styles.item, failed && styles.failed)}>\n <span className={styles.name}>\n {name}\n {item.size !== null ? ` · ${formatSize(item.size, intl.locale)}` : null}\n </span>\n <span className={styles.buttons}>\n {item.canPause && item.status === 'uploading' && onPause ? (\n <IconButton\n icon={Pause}\n size=\"sm\"\n label={intl.formatMessage(messages.pauseUpload, { name })}\n onPress={() => onPause(item.id)}\n />\n ) : null}\n {item.status === 'paused' && onResume ? (\n <IconButton\n icon={Play}\n size=\"sm\"\n label={intl.formatMessage(messages.resumeUpload, { name })}\n onPress={() => onResume(item.id)}\n />\n ) : null}\n {failed && onRetry ? (\n <IconButton\n icon={RotateCcw}\n size=\"sm\"\n label={intl.formatMessage(messages.retryUpload, { name })}\n onPress={() => onRetry(item.id)}\n />\n ) : null}\n {item.status !== 'completing' && onCancel ? (\n <IconButton\n icon={X}\n size=\"sm\"\n label={intl.formatMessage(messages.cancelUpload, { name })}\n onPress={() => onCancel(item.id)}\n />\n ) : null}\n </span>\n {failed ? (\n <span className={styles.error} role=\"alert\">\n {status}\n </span>\n ) : (\n <ProgressBar\n aria-label={name}\n className={cx(\n styles.progress,\n indeterminate && styles.indeterminate,\n )}\n value={percent ?? 0}\n isIndeterminate={indeterminate}\n valueLabel={\n item.progress !== null && !indeterminate\n ? `${status} · ${intl.formatNumber(item.progress, { style: 'percent' })}`\n : status\n }\n >\n {({ valueText }) => (\n <>\n <span className={styles.status}>{valueText}</span>\n <span className={styles.track}>\n <span\n className={styles.fill}\n style={\n indeterminate\n ? undefined\n : { width: `${String(percent ?? 0)}%` }\n }\n />\n </span>\n </>\n )}\n </ProgressBar>\n )}\n </li>\n );\n })}\n </ul>\n );\n}\n"],"mappings":"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"}