@startdownnotez404/ui 1.3.5 → 1.3.6

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 (254) hide show
  1. package/dist/AutocompleteField-653233JU.mjs +203 -0
  2. package/dist/AutocompleteField-653233JU.mjs.map +1 -0
  3. package/dist/AvatarField-KFASMVZU.mjs +378 -0
  4. package/dist/AvatarField-KFASMVZU.mjs.map +1 -0
  5. package/dist/{DateField-ZYMZFHL4.mjs → DateField-CDJ6W6XF.mjs} +19 -7
  6. package/dist/DateField-CDJ6W6XF.mjs.map +1 -0
  7. package/dist/DateRangeField-ZWSFT5KV.mjs +118 -0
  8. package/dist/DateRangeField-ZWSFT5KV.mjs.map +1 -0
  9. package/dist/{DateTimeField-TPTJ7YIZ.mjs → DateTimeField-SFAF4I6A.mjs} +36 -11
  10. package/dist/DateTimeField-SFAF4I6A.mjs.map +1 -0
  11. package/dist/FileUploadField-TSNCSLXX.mjs +101 -0
  12. package/dist/FileUploadField-TSNCSLXX.mjs.map +1 -0
  13. package/dist/{JSONEditorField-TMRWGXVR.mjs → JSONEditorField-3KXC2GOG.mjs} +7 -6
  14. package/dist/{JSONEditorField-TMRWGXVR.mjs.map → JSONEditorField-3KXC2GOG.mjs.map} +1 -1
  15. package/dist/{PopperMenu-LJ36RPBW.mjs → PopperMenu-PSHLKIEZ.mjs} +26 -12
  16. package/dist/{PopperMenu-LJ36RPBW.mjs.map → PopperMenu-PSHLKIEZ.mjs.map} +1 -1
  17. package/dist/{TelField-LOGRVZ4I.mjs → TelField-FRQT2UBJ.mjs} +8 -7
  18. package/dist/{TelField-LOGRVZ4I.mjs.map → TelField-FRQT2UBJ.mjs.map} +1 -1
  19. package/dist/TimeField-XVWXBJID.mjs +94 -0
  20. package/dist/TimeField-XVWXBJID.mjs.map +1 -0
  21. package/dist/alert.d.mts +148 -18
  22. package/dist/alert.d.ts +148 -18
  23. package/dist/alert.js +698 -254
  24. package/dist/alert.js.map +1 -1
  25. package/dist/alert.mjs +46 -10
  26. package/dist/autocomplete.d.mts +438 -4
  27. package/dist/autocomplete.d.ts +438 -4
  28. package/dist/autocomplete.js +632 -21
  29. package/dist/autocomplete.js.map +1 -1
  30. package/dist/autocomplete.mjs +26 -7
  31. package/dist/avatar.js +2 -1
  32. package/dist/avatar.js.map +1 -1
  33. package/dist/avatar.mjs +12 -11
  34. package/dist/box.mjs +2 -1
  35. package/dist/button.mjs +3 -2
  36. package/dist/chart.mjs +3 -2
  37. package/dist/checkbox.mjs +3 -2
  38. package/dist/chunk-2FK24ZPJ.mjs +78 -0
  39. package/dist/chunk-2FK24ZPJ.mjs.map +1 -0
  40. package/dist/{chunk-V26V2S3W.mjs → chunk-3O3N6X6D.mjs} +3 -3
  41. package/dist/{chunk-Y74ALKBL.mjs → chunk-4MSPA7U7.mjs} +11 -9
  42. package/dist/{chunk-Y74ALKBL.mjs.map → chunk-4MSPA7U7.mjs.map} +1 -1
  43. package/dist/{chunk-24XDGNJ6.mjs → chunk-4P45Z5LR.mjs} +63 -41
  44. package/dist/chunk-4P45Z5LR.mjs.map +1 -0
  45. package/dist/chunk-4SSJY32J.mjs +1182 -0
  46. package/dist/chunk-4SSJY32J.mjs.map +1 -0
  47. package/dist/{chunk-XJ2SXC2Q.mjs → chunk-6B6I27TT.mjs} +18 -16
  48. package/dist/{chunk-XJ2SXC2Q.mjs.map → chunk-6B6I27TT.mjs.map} +1 -1
  49. package/dist/chunk-6JKMEH2L.mjs +205 -0
  50. package/dist/chunk-6JKMEH2L.mjs.map +1 -0
  51. package/dist/{chunk-IN3O4R7Q.mjs → chunk-7O526A2D.mjs} +6 -4
  52. package/dist/{chunk-IN3O4R7Q.mjs.map → chunk-7O526A2D.mjs.map} +1 -1
  53. package/dist/chunk-AFLEG5ZC.mjs +28 -0
  54. package/dist/chunk-AFLEG5ZC.mjs.map +1 -0
  55. package/dist/{chunk-UGMRJMFZ.mjs → chunk-BO5CU4ZM.mjs} +4 -4
  56. package/dist/{chunk-JIU5GVM7.mjs → chunk-D4XPNSSI.mjs} +5 -3
  57. package/dist/{chunk-JIU5GVM7.mjs.map → chunk-D4XPNSSI.mjs.map} +1 -1
  58. package/dist/chunk-DPIMA5IO.mjs +72 -0
  59. package/dist/chunk-DPIMA5IO.mjs.map +1 -0
  60. package/dist/chunk-F2CGFVIZ.mjs +83 -0
  61. package/dist/chunk-F2CGFVIZ.mjs.map +1 -0
  62. package/dist/{chunk-R5MKQN6D.mjs → chunk-FBLSJQWK.mjs} +3 -3
  63. package/dist/{chunk-BGB7JHIU.mjs → chunk-FMGZCOJC.mjs} +5 -3
  64. package/dist/{chunk-BGB7JHIU.mjs.map → chunk-FMGZCOJC.mjs.map} +1 -1
  65. package/dist/{chunk-UTVSYS6S.mjs → chunk-FNSIQ2B7.mjs} +18 -6
  66. package/dist/chunk-FNSIQ2B7.mjs.map +1 -0
  67. package/dist/{chunk-JWANK42G.mjs → chunk-FUZ2JNTZ.mjs} +3 -3
  68. package/dist/{chunk-CRYIEYZZ.mjs → chunk-HAJWE62X.mjs} +66 -42
  69. package/dist/chunk-HAJWE62X.mjs.map +1 -0
  70. package/dist/{chunk-CWFWRZWU.mjs → chunk-KSN33A6I.mjs} +3 -2
  71. package/dist/{chunk-CWFWRZWU.mjs.map → chunk-KSN33A6I.mjs.map} +1 -1
  72. package/dist/chunk-KYTHGFFY.mjs +866 -0
  73. package/dist/chunk-KYTHGFFY.mjs.map +1 -0
  74. package/dist/{chunk-QKGCW37O.mjs → chunk-LDFM46LV.mjs} +5 -3
  75. package/dist/{chunk-QKGCW37O.mjs.map → chunk-LDFM46LV.mjs.map} +1 -1
  76. package/dist/chunk-LQNDBPHU.mjs +142 -0
  77. package/dist/chunk-LQNDBPHU.mjs.map +1 -0
  78. package/dist/{chunk-E3I2VDHZ.mjs → chunk-M2PYXSAF.mjs} +6 -4
  79. package/dist/{chunk-E3I2VDHZ.mjs.map → chunk-M2PYXSAF.mjs.map} +1 -1
  80. package/dist/{chunk-DELCADNF.mjs → chunk-ODVKRIVN.mjs} +30 -30
  81. package/dist/{chunk-HR3A4H4E.mjs → chunk-PEJL2T2K.mjs} +13 -11
  82. package/dist/{chunk-HR3A4H4E.mjs.map → chunk-PEJL2T2K.mjs.map} +1 -1
  83. package/dist/{chunk-OGNGPI3M.mjs → chunk-PL55YKT4.mjs} +2 -2
  84. package/dist/{chunk-S6EZVRZC.mjs → chunk-PNSJC6PC.mjs} +5 -28
  85. package/dist/chunk-PNSJC6PC.mjs.map +1 -0
  86. package/dist/{chunk-TDRA5EZI.mjs → chunk-PUREEN2J.mjs} +7 -7
  87. package/dist/chunk-QFS5CENY.mjs +659 -0
  88. package/dist/chunk-QFS5CENY.mjs.map +1 -0
  89. package/dist/chunk-RSN7NH2J.mjs +250 -0
  90. package/dist/chunk-RSN7NH2J.mjs.map +1 -0
  91. package/dist/{chunk-UDREPVEY.mjs → chunk-RVSMEZE3.mjs} +12 -78
  92. package/dist/chunk-RVSMEZE3.mjs.map +1 -0
  93. package/dist/{chunk-SRWPHN2N.mjs → chunk-S64IYJ6Y.mjs} +2 -2
  94. package/dist/{chunk-ZG3NQI77.mjs → chunk-SMD7OEUW.mjs} +6 -4
  95. package/dist/{chunk-ZG3NQI77.mjs.map → chunk-SMD7OEUW.mjs.map} +1 -1
  96. package/dist/{chunk-NJYNJLT7.mjs → chunk-SWFB3A3G.mjs} +2 -2
  97. package/dist/{chunk-RXBQ7KXF.mjs → chunk-USXGNKWJ.mjs} +98 -44
  98. package/dist/chunk-USXGNKWJ.mjs.map +1 -0
  99. package/dist/{chunk-OJV6V7YZ.mjs → chunk-VL7V52YD.mjs} +27 -20
  100. package/dist/chunk-VL7V52YD.mjs.map +1 -0
  101. package/dist/{chunk-2ZZJTBTE.mjs → chunk-WJZ3IYET.mjs} +2 -2
  102. package/dist/chunk-XAJAMVAG.mjs +1720 -0
  103. package/dist/chunk-XAJAMVAG.mjs.map +1 -0
  104. package/dist/chunk-YIJ5QVJ6.mjs +277 -0
  105. package/dist/chunk-YIJ5QVJ6.mjs.map +1 -0
  106. package/dist/{chunk-T6AMRENK.mjs → chunk-YRW5NKD7.mjs} +148 -112
  107. package/dist/chunk-YRW5NKD7.mjs.map +1 -0
  108. package/dist/chunk-ZMJKG2UI.mjs +71 -0
  109. package/dist/chunk-ZMJKG2UI.mjs.map +1 -0
  110. package/dist/confirm.d.mts +48 -0
  111. package/dist/confirm.d.ts +48 -0
  112. package/dist/confirm.js +334 -0
  113. package/dist/confirm.js.map +1 -0
  114. package/dist/confirm.mjs +20 -0
  115. package/dist/datePicker.d.mts +256 -14
  116. package/dist/datePicker.d.ts +256 -14
  117. package/dist/datePicker.js +1624 -145
  118. package/dist/datePicker.js.map +1 -1
  119. package/dist/datePicker.mjs +19 -6
  120. package/dist/dialog.d.mts +166 -0
  121. package/dist/dialog.d.ts +166 -0
  122. package/dist/dialog.js +362 -0
  123. package/dist/dialog.js.map +1 -0
  124. package/dist/dialog.mjs +45 -0
  125. package/dist/emptyState.d.mts +17 -0
  126. package/dist/emptyState.d.ts +17 -0
  127. package/dist/emptyState.js +253 -0
  128. package/dist/emptyState.js.map +1 -0
  129. package/dist/emptyState.mjs +12 -0
  130. package/dist/emptyState.mjs.map +1 -0
  131. package/dist/errorState.d.mts +18 -0
  132. package/dist/errorState.d.ts +18 -0
  133. package/dist/{displayFile.js → errorState.js} +107 -156
  134. package/dist/errorState.js.map +1 -0
  135. package/dist/errorState.mjs +15 -0
  136. package/dist/errorState.mjs.map +1 -0
  137. package/dist/fileUpload.d.mts +197 -0
  138. package/dist/fileUpload.d.ts +197 -0
  139. package/dist/fileUpload.js +1483 -0
  140. package/dist/fileUpload.js.map +1 -0
  141. package/dist/fileUpload.mjs +65 -0
  142. package/dist/fileUpload.mjs.map +1 -0
  143. package/dist/flowMap.mjs +7 -6
  144. package/dist/flowMap.mjs.map +1 -1
  145. package/dist/image.js +1195 -429
  146. package/dist/image.js.map +1 -1
  147. package/dist/image.mjs +8 -6
  148. package/dist/index.d.ts +7 -2
  149. package/dist/index.js +8606 -4087
  150. package/dist/index.js.map +1 -1
  151. package/dist/index.mjs +314 -152
  152. package/dist/inlineError.d.mts +16 -0
  153. package/dist/inlineError.d.ts +16 -0
  154. package/dist/inlineError.js +297 -0
  155. package/dist/inlineError.js.map +1 -0
  156. package/dist/inlineError.mjs +15 -0
  157. package/dist/inlineError.mjs.map +1 -0
  158. package/dist/input.mjs +8 -7
  159. package/dist/jsonEditor.mjs +3 -2
  160. package/dist/list.mjs +7 -6
  161. package/dist/loading.mjs +8 -6
  162. package/dist/markdown.mjs +7 -6
  163. package/dist/markdown.mjs.map +1 -1
  164. package/dist/menu.mjs +9 -8
  165. package/dist/modal.js +2 -1
  166. package/dist/modal.js.map +1 -1
  167. package/dist/modal.mjs +7 -5
  168. package/dist/process.d.mts +33 -75
  169. package/dist/process.d.ts +33 -75
  170. package/dist/process.js +1275 -203
  171. package/dist/process.js.map +1 -1
  172. package/dist/process.mjs +12 -9
  173. package/dist/scrollToLoad.mjs +4 -3
  174. package/dist/select.mjs +10 -9
  175. package/dist/skeleton.d.mts +15 -1
  176. package/dist/skeleton.d.ts +15 -1
  177. package/dist/skeleton.js +114 -2
  178. package/dist/skeleton.js.map +1 -1
  179. package/dist/skeleton.mjs +6 -3
  180. package/dist/stepper.mjs +4 -3
  181. package/dist/tab.mjs +10 -9
  182. package/dist/table.d.mts +269 -85
  183. package/dist/table.d.ts +269 -85
  184. package/dist/table.js +5102 -3153
  185. package/dist/table.js.map +1 -1
  186. package/dist/table.mjs +21 -19
  187. package/dist/theme.js +1766 -432
  188. package/dist/theme.js.map +1 -1
  189. package/dist/theme.mjs +32 -25
  190. package/dist/timeline.mjs +4 -3
  191. package/dist/toast.d.mts +49 -0
  192. package/dist/toast.d.ts +49 -0
  193. package/dist/toast.js +175 -0
  194. package/dist/toast.js.map +1 -0
  195. package/dist/toast.mjs +9 -0
  196. package/dist/toast.mjs.map +1 -0
  197. package/dist/toggleButtonGroup.mjs +3 -2
  198. package/dist/useForm.d.mts +270 -86
  199. package/dist/useForm.d.ts +270 -86
  200. package/dist/useForm.js +4672 -2727
  201. package/dist/useForm.js.map +1 -1
  202. package/dist/useForm.mjs +18 -16
  203. package/dist/useSearch.mjs +13 -12
  204. package/dist/variablesRenderer.mjs +8 -7
  205. package/package.json +3 -3
  206. package/dist/AutocompleteField-ZKNU2IRR.mjs +0 -181
  207. package/dist/AutocompleteField-ZKNU2IRR.mjs.map +0 -1
  208. package/dist/AvatarField-SAODT3CZ.mjs +0 -275
  209. package/dist/AvatarField-SAODT3CZ.mjs.map +0 -1
  210. package/dist/DateField-ZYMZFHL4.mjs.map +0 -1
  211. package/dist/DateTimeField-TPTJ7YIZ.mjs.map +0 -1
  212. package/dist/FileUploadField-NTMWBJER.mjs +0 -78
  213. package/dist/FileUploadField-NTMWBJER.mjs.map +0 -1
  214. package/dist/chunk-24XDGNJ6.mjs.map +0 -1
  215. package/dist/chunk-27KYFU7R.mjs +0 -30
  216. package/dist/chunk-27KYFU7R.mjs.map +0 -1
  217. package/dist/chunk-AAH2O24U.mjs +0 -325
  218. package/dist/chunk-AAH2O24U.mjs.map +0 -1
  219. package/dist/chunk-CRYIEYZZ.mjs.map +0 -1
  220. package/dist/chunk-EEH7HACG.mjs +0 -249
  221. package/dist/chunk-EEH7HACG.mjs.map +0 -1
  222. package/dist/chunk-EKPULYPU.mjs +0 -497
  223. package/dist/chunk-EKPULYPU.mjs.map +0 -1
  224. package/dist/chunk-OJV6V7YZ.mjs.map +0 -1
  225. package/dist/chunk-RXBQ7KXF.mjs.map +0 -1
  226. package/dist/chunk-S6EZVRZC.mjs.map +0 -1
  227. package/dist/chunk-SGCUDWO3.mjs +0 -396
  228. package/dist/chunk-SGCUDWO3.mjs.map +0 -1
  229. package/dist/chunk-T6AMRENK.mjs.map +0 -1
  230. package/dist/chunk-UDREPVEY.mjs.map +0 -1
  231. package/dist/chunk-UTVSYS6S.mjs.map +0 -1
  232. package/dist/chunk-XIMFP6RB.mjs +0 -161
  233. package/dist/chunk-XIMFP6RB.mjs.map +0 -1
  234. package/dist/displayFile.d.mts +0 -95
  235. package/dist/displayFile.d.ts +0 -95
  236. package/dist/displayFile.js.map +0 -1
  237. package/dist/displayFile.mjs +0 -19
  238. package/dist/fileUploader.d.mts +0 -86
  239. package/dist/fileUploader.d.ts +0 -86
  240. package/dist/fileUploader.js +0 -722
  241. package/dist/fileUploader.js.map +0 -1
  242. package/dist/fileUploader.mjs +0 -16
  243. /package/dist/{chunk-V26V2S3W.mjs.map → chunk-3O3N6X6D.mjs.map} +0 -0
  244. /package/dist/{chunk-UGMRJMFZ.mjs.map → chunk-BO5CU4ZM.mjs.map} +0 -0
  245. /package/dist/{chunk-R5MKQN6D.mjs.map → chunk-FBLSJQWK.mjs.map} +0 -0
  246. /package/dist/{chunk-JWANK42G.mjs.map → chunk-FUZ2JNTZ.mjs.map} +0 -0
  247. /package/dist/{chunk-DELCADNF.mjs.map → chunk-ODVKRIVN.mjs.map} +0 -0
  248. /package/dist/{chunk-OGNGPI3M.mjs.map → chunk-PL55YKT4.mjs.map} +0 -0
  249. /package/dist/{chunk-TDRA5EZI.mjs.map → chunk-PUREEN2J.mjs.map} +0 -0
  250. /package/dist/{chunk-SRWPHN2N.mjs.map → chunk-S64IYJ6Y.mjs.map} +0 -0
  251. /package/dist/{chunk-NJYNJLT7.mjs.map → chunk-SWFB3A3G.mjs.map} +0 -0
  252. /package/dist/{chunk-2ZZJTBTE.mjs.map → chunk-WJZ3IYET.mjs.map} +0 -0
  253. /package/dist/{displayFile.mjs.map → confirm.mjs.map} +0 -0
  254. /package/dist/{fileUploader.mjs.map → dialog.mjs.map} +0 -0
@@ -0,0 +1,203 @@
1
+ import {
2
+ getHelperText
3
+ } from "./chunk-MI64T62E.mjs";
4
+ import {
5
+ Explanation_default,
6
+ getFieldExplanation,
7
+ mergeFieldSx
8
+ } from "./chunk-FNSIQ2B7.mjs";
9
+ import "./chunk-T4X375IG.mjs";
10
+ import {
11
+ Autocomplete_default
12
+ } from "./chunk-KYTHGFFY.mjs";
13
+ import "./chunk-VL7V52YD.mjs";
14
+ import "./chunk-LQNDBPHU.mjs";
15
+ import "./chunk-56TI2ZBT.mjs";
16
+ import "./chunk-VYD3PDBB.mjs";
17
+ import "./chunk-MDAUF7IL.mjs";
18
+ import "./chunk-QFF3HTHL.mjs";
19
+ import "./chunk-ZVFYOXDE.mjs";
20
+ import "./chunk-D4XPNSSI.mjs";
21
+ import "./chunk-4Q54P737.mjs";
22
+ import "./chunk-OP6LKXPA.mjs";
23
+ import "./chunk-4RPFRNXG.mjs";
24
+ import {
25
+ default as default2
26
+ } from "./chunk-PNSJC6PC.mjs";
27
+ import {
28
+ mergeSx
29
+ } from "./chunk-AFLEG5ZC.mjs";
30
+ import "./chunk-FJ6ZGZIA.mjs";
31
+
32
+ // src/components/compound/UseForm/src/Fields/AutocompleteField.tsx
33
+ import React from "react";
34
+ import { Controller, useFormContext } from "react-hook-form";
35
+ import { jsx, jsxs } from "react/jsx-runtime";
36
+ var EMPTY_OPTIONS = [];
37
+ function toAutocompleteOption(option) {
38
+ return {
39
+ id: option.id,
40
+ label: option.label,
41
+ disabled: option.disabled,
42
+ description: option.description,
43
+ group: option.group
44
+ };
45
+ }
46
+ function idsFromValue(value, multiple) {
47
+ if (multiple) {
48
+ if (Array.isArray(value)) return value.map(String).filter(Boolean);
49
+ return value ? [String(value)] : [];
50
+ }
51
+ if (Array.isArray(value)) return value[0] ? [String(value[0])] : [];
52
+ return value ? [String(value)] : [];
53
+ }
54
+ function toFormValue(next, multiple) {
55
+ if (multiple) {
56
+ if (next == null) return [];
57
+ const list = Array.isArray(next) ? next : [next];
58
+ return list.map((item) => typeof item === "string" ? item : item.id);
59
+ }
60
+ if (next == null) return "";
61
+ const single = Array.isArray(next) ? next[0] : next;
62
+ if (single == null) return "";
63
+ return typeof single === "string" ? single : single.id;
64
+ }
65
+ var AutocompleteField = ({ field }) => {
66
+ const acSlot = field.slotProps;
67
+ if (acSlot?.useOptions) {
68
+ return /* @__PURE__ */ jsx(AutocompleteFieldWithOptions, { field, useOptions: acSlot.useOptions });
69
+ }
70
+ return /* @__PURE__ */ jsx(AutocompleteFieldView, { field, options: acSlot?.options ?? EMPTY_OPTIONS });
71
+ };
72
+ var AutocompleteFieldWithOptions = ({
73
+ field,
74
+ useOptions
75
+ }) => {
76
+ const { options = EMPTY_OPTIONS, loading } = useOptions();
77
+ return /* @__PURE__ */ jsx(AutocompleteFieldView, { field, options, loading });
78
+ };
79
+ var AutocompleteFieldView = ({
80
+ field,
81
+ options,
82
+ loading
83
+ }) => {
84
+ const { control, getValues } = useFormContext();
85
+ const {
86
+ name,
87
+ label,
88
+ required,
89
+ disabled,
90
+ sx,
91
+ size,
92
+ slotProps,
93
+ errorMsg,
94
+ defaultValue
95
+ } = field;
96
+ const acSlot = slotProps;
97
+ const multiple = acSlot?.multiple ?? true;
98
+ const softOptions = React.useMemo(
99
+ () => options.map(toAutocompleteOption),
100
+ [options]
101
+ );
102
+ return /* @__PURE__ */ jsx(
103
+ Controller,
104
+ {
105
+ control,
106
+ name,
107
+ defaultValue,
108
+ render: ({ field: { onChange: controllerOnChange, value }, fieldState: { error } }) => /* @__PURE__ */ jsx(
109
+ SoftAutocompleteControl,
110
+ {
111
+ name,
112
+ value,
113
+ controllerOnChange,
114
+ softOptions,
115
+ multiple,
116
+ loading,
117
+ disabled,
118
+ required,
119
+ error,
120
+ errorMsg,
121
+ helperText: field.helperText,
122
+ label,
123
+ placeholder: acSlot?.placeholder,
124
+ size,
125
+ sx,
126
+ explanation: getFieldExplanation(field),
127
+ onFieldChange: (next) => {
128
+ field.onChange?.(next, getValues());
129
+ }
130
+ }
131
+ )
132
+ }
133
+ );
134
+ };
135
+ function SoftAutocompleteControl({
136
+ name,
137
+ value,
138
+ controllerOnChange,
139
+ softOptions,
140
+ multiple,
141
+ loading,
142
+ disabled,
143
+ required,
144
+ error,
145
+ errorMsg,
146
+ helperText,
147
+ label,
148
+ placeholder,
149
+ size,
150
+ sx,
151
+ explanation,
152
+ onFieldChange
153
+ }) {
154
+ const selectedIds = idsFromValue(value, multiple);
155
+ const acValue = multiple ? selectedIds : selectedIds[0] ?? null;
156
+ const resolvedPlaceholder = placeholder ?? (multiple ? "Select options" : "Select an option");
157
+ return /* @__PURE__ */ jsxs(
158
+ default2,
159
+ {
160
+ sx: mergeSx(
161
+ {
162
+ display: "flex",
163
+ alignItems: "flex-start",
164
+ gap: 1,
165
+ // Soft elevated Autocomplete shadow must not be clipped by this row.
166
+ overflow: "visible"
167
+ },
168
+ mergeFieldSx(size, sx)
169
+ ),
170
+ children: [
171
+ /* @__PURE__ */ jsx(
172
+ Autocomplete_default,
173
+ {
174
+ name,
175
+ options: softOptions,
176
+ value: acValue,
177
+ multiple,
178
+ loading,
179
+ onChange: (next) => {
180
+ const formValue = toFormValue(next, multiple);
181
+ controllerOnChange(formValue);
182
+ onFieldChange(formValue);
183
+ },
184
+ label,
185
+ placeholder: resolvedPlaceholder,
186
+ required,
187
+ disabled,
188
+ error: !!error,
189
+ helperText: getHelperText(error, errorMsg, helperText),
190
+ fullWidth: true,
191
+ size: "small",
192
+ sx: { flex: 1 }
193
+ }
194
+ ),
195
+ /* @__PURE__ */ jsx(Explanation_default, { alignToInput: true, explanation })
196
+ ]
197
+ }
198
+ );
199
+ }
200
+ export {
201
+ AutocompleteField
202
+ };
203
+ //# sourceMappingURL=AutocompleteField-653233JU.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/compound/UseForm/src/Fields/AutocompleteField.tsx"],"sourcesContent":["import React from 'react';\nimport { Controller, useFormContext, type FieldError } from 'react-hook-form';\nimport { Box } from '@/ele/Box';\nimport {\n Autocomplete,\n type AutocompleteOption,\n type OptionParams,\n} from '@/ele/Autocomplete';\nimport { FieldConfig, FormTypeMap, InferFormDataType, getHelperText, mergeFieldSx } from '../_utils';\nimport { mergeSx } from '@/_utils/_func';\nimport { getFieldExplanation } from '../_utils/helpers';\nimport Explanation from './Explanation';\nimport { FIELD_TYPEs } from '../_utils/constants';\nimport type { AutocompleteSlotProps } from '../_utils/slotProps';\n\ninterface AutocompleteFieldProps<T extends FormTypeMap = FormTypeMap> {\n field: Extract<FieldConfig<T>, { type: typeof FIELD_TYPEs.autocomplete }>;\n}\n\ntype AutocompleteUseOptions = NonNullable<AutocompleteSlotProps['useOptions']>;\n\nconst EMPTY_OPTIONS: OptionParams[] = [];\n\n/** Map UseForm OptionParams → soft AutocompleteOption (id/label oriented). */\nfunction toAutocompleteOption(option: OptionParams): AutocompleteOption {\n return {\n id: option.id,\n label: option.label,\n disabled: option.disabled,\n description: option.description,\n group: option.group,\n };\n}\n\nfunction idsFromValue(value: unknown, multiple: boolean): string[] {\n if (multiple) {\n if (Array.isArray(value)) return value.map(String).filter(Boolean);\n return value ? [String(value)] : [];\n }\n if (Array.isArray(value)) return value[0] ? [String(value[0])] : [];\n return value ? [String(value)] : [];\n}\n\nfunction toFormValue(\n next: AutocompleteOption | AutocompleteOption[] | string | string[] | null,\n multiple: boolean,\n): string | string[] {\n if (multiple) {\n if (next == null) return [];\n const list = Array.isArray(next) ? next : [next];\n return list.map((item) => (typeof item === 'string' ? item : item.id));\n }\n if (next == null) return '';\n const single = Array.isArray(next) ? next[0] : next;\n if (single == null) return '';\n return typeof single === 'string' ? single : single.id;\n}\n\nexport const AutocompleteField = <T extends FormTypeMap = FormTypeMap>({ field }: AutocompleteFieldProps<T>) => {\n const acSlot = field.slotProps as AutocompleteSlotProps | undefined;\n if (acSlot?.useOptions) {\n return <AutocompleteFieldWithOptions field={field} useOptions={acSlot.useOptions} />;\n }\n return <AutocompleteFieldView field={field} options={acSlot?.options ?? EMPTY_OPTIONS} />;\n};\n\nconst AutocompleteFieldWithOptions = <T extends FormTypeMap>({\n field,\n useOptions,\n}: AutocompleteFieldProps<T> & { useOptions: AutocompleteUseOptions }) => {\n const { options = EMPTY_OPTIONS, loading } = useOptions();\n return <AutocompleteFieldView field={field} options={options} loading={loading} />;\n};\n\nconst AutocompleteFieldView = <T extends FormTypeMap>({\n field,\n options,\n loading,\n}: AutocompleteFieldProps<T> & { options: OptionParams[]; loading?: boolean }) => {\n const { control, getValues } = useFormContext();\n const {\n name,\n label,\n required,\n disabled,\n sx,\n size,\n slotProps,\n errorMsg,\n defaultValue,\n } = field;\n\n const acSlot = slotProps as AutocompleteSlotProps | undefined;\n const multiple = acSlot?.multiple ?? true;\n const softOptions = React.useMemo(\n () => options.map(toAutocompleteOption),\n [options],\n );\n\n return (\n <Controller\n control={control}\n name={name}\n defaultValue={defaultValue}\n render={({ field: { onChange: controllerOnChange, value }, fieldState: { error } }) => (\n <SoftAutocompleteControl\n name={name}\n value={value}\n controllerOnChange={controllerOnChange}\n softOptions={softOptions}\n multiple={multiple}\n loading={loading}\n disabled={disabled}\n required={required}\n error={error}\n errorMsg={errorMsg}\n helperText={field.helperText}\n label={label}\n placeholder={acSlot?.placeholder}\n size={size}\n sx={sx}\n explanation={getFieldExplanation(field)}\n onFieldChange={(next) => {\n field.onChange?.(next, getValues() as InferFormDataType<T>);\n }}\n />\n )}\n />\n );\n};\n\ntype SoftAutocompleteControlProps = {\n name: string;\n value: unknown;\n controllerOnChange: (value: unknown) => void;\n softOptions: AutocompleteOption[];\n multiple: boolean;\n loading?: boolean;\n disabled?: boolean;\n required?: boolean;\n error: FieldError | undefined;\n errorMsg?: string;\n helperText?: string;\n label?: string;\n placeholder?: string;\n size?: { width?: number | string; height?: number | string };\n sx?: Record<string, unknown>;\n explanation?: React.ComponentProps<typeof Explanation>['explanation'];\n onFieldChange: (next: unknown) => void;\n};\n\nfunction SoftAutocompleteControl({\n name,\n value,\n controllerOnChange,\n softOptions,\n multiple,\n loading,\n disabled,\n required,\n error,\n errorMsg,\n helperText,\n label,\n placeholder,\n size,\n sx,\n explanation,\n onFieldChange,\n}: SoftAutocompleteControlProps) {\n const selectedIds = idsFromValue(value, multiple);\n // Soft Autocomplete resolves string ids against options — TextField-like chrome.\n const acValue = multiple ? selectedIds : (selectedIds[0] ?? null);\n const resolvedPlaceholder =\n placeholder\n ?? (multiple ? 'Select options' : 'Select an option');\n\n return (\n <Box\n sx={mergeSx(\n {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 1,\n // Soft elevated Autocomplete shadow must not be clipped by this row.\n overflow: 'visible',\n },\n mergeFieldSx(size, sx),\n )}\n >\n <Autocomplete\n name={name}\n options={softOptions}\n value={acValue}\n multiple={multiple}\n loading={loading}\n onChange={(next) => {\n const formValue = toFormValue(next, multiple);\n controllerOnChange(formValue);\n onFieldChange(formValue);\n }}\n label={label}\n placeholder={resolvedPlaceholder}\n required={required}\n disabled={disabled}\n error={!!error}\n helperText={getHelperText(error, errorMsg, helperText)}\n fullWidth\n size=\"small\"\n sx={{ flex: 1 }}\n />\n <Explanation alignToInput explanation={explanation} />\n </Box>\n );\n}"],"mappings":"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","names":["default"]}
@@ -0,0 +1,378 @@
1
+ import {
2
+ Cropper_default
3
+ } from "./chunk-USXGNKWJ.mjs";
4
+ import "./chunk-4SSJY32J.mjs";
5
+ import {
6
+ AvatarButton
7
+ } from "./chunk-4MSPA7U7.mjs";
8
+ import {
9
+ FieldHelperText
10
+ } from "./chunk-MI64T62E.mjs";
11
+ import {
12
+ Explanation_default,
13
+ getFieldExplanation,
14
+ mergeFieldSx
15
+ } from "./chunk-FNSIQ2B7.mjs";
16
+ import "./chunk-EW4DTFH3.mjs";
17
+ import {
18
+ MuiModal
19
+ } from "./chunk-RVSMEZE3.mjs";
20
+ import "./chunk-2FK24ZPJ.mjs";
21
+ import {
22
+ CLASSNAMEs
23
+ } from "./chunk-KSN33A6I.mjs";
24
+ import "./chunk-PEJL2T2K.mjs";
25
+ import "./chunk-PUREEN2J.mjs";
26
+ import "./chunk-3DQINB57.mjs";
27
+ import "./chunk-I5JWS4Z7.mjs";
28
+ import "./chunk-FMGZCOJC.mjs";
29
+ import "./chunk-3VUAM2GY.mjs";
30
+ import {
31
+ MuiFormLabel,
32
+ default as default5
33
+ } from "./chunk-T4X375IG.mjs";
34
+ import "./chunk-WYYP3Y34.mjs";
35
+ import "./chunk-LQNDBPHU.mjs";
36
+ import "./chunk-56TI2ZBT.mjs";
37
+ import "./chunk-MDAUF7IL.mjs";
38
+ import "./chunk-UMJ5SCIQ.mjs";
39
+ import {
40
+ default79 as default4
41
+ } from "./chunk-ZVFYOXDE.mjs";
42
+ import "./chunk-D4XPNSSI.mjs";
43
+ import "./chunk-4Q54P737.mjs";
44
+ import "./chunk-OP6LKXPA.mjs";
45
+ import "./chunk-4RPFRNXG.mjs";
46
+ import {
47
+ default as default2,
48
+ default2 as default3
49
+ } from "./chunk-PNSJC6PC.mjs";
50
+ import "./chunk-AFLEG5ZC.mjs";
51
+ import "./chunk-FJ6ZGZIA.mjs";
52
+
53
+ // src/components/compound/UseForm/src/Fields/AvatarField.tsx
54
+ import React, { useEffect, useState } from "react";
55
+ import { Controller, useFormContext, useWatch } from "react-hook-form";
56
+ import { jsx, jsxs } from "react/jsx-runtime";
57
+ var AVATAR_CROP_CONFIG = { width: 200, unit: "px" };
58
+ var AvatarCropPreview = React.forwardRef((_, ref) => {
59
+ return /* @__PURE__ */ jsx(
60
+ "canvas",
61
+ {
62
+ ref,
63
+ width: 200,
64
+ height: 200,
65
+ style: {
66
+ width: 200,
67
+ height: 200,
68
+ maxWidth: "100%",
69
+ maxHeight: "100%",
70
+ border: "1px dashed grey",
71
+ borderRadius: "50%",
72
+ objectFit: "contain",
73
+ backgroundColor: "transparent"
74
+ }
75
+ }
76
+ );
77
+ });
78
+ AvatarCropPreview.displayName = "AvatarCropPreview";
79
+ function acceptToInputAccept(accept) {
80
+ if (!accept) return "image/*";
81
+ if (typeof accept === "string") return accept;
82
+ const parts = [];
83
+ Object.entries(accept).forEach(([mime, exts]) => {
84
+ parts.push(mime);
85
+ if (Array.isArray(exts)) parts.push(...exts);
86
+ });
87
+ return parts.length ? parts.join(",") : "image/*";
88
+ }
89
+ function useFileObjectUrl(file) {
90
+ const [url, setUrl] = useState("");
91
+ useEffect(() => {
92
+ if (!file) {
93
+ setUrl("");
94
+ return;
95
+ }
96
+ const objectUrl = URL.createObjectURL(file);
97
+ setUrl(objectUrl);
98
+ return () => {
99
+ URL.revokeObjectURL(objectUrl);
100
+ };
101
+ }, [file]);
102
+ return url;
103
+ }
104
+ async function blobUrlToFile(url, filename = "avatar.png") {
105
+ const res = await fetch(url);
106
+ const blob = await res.blob();
107
+ return new File([blob], filename, { type: blob.type || "image/png" });
108
+ }
109
+ var AvatarField = ({
110
+ field
111
+ }) => {
112
+ const watchKey = field.slotProps?.watchAvatarNameKey;
113
+ if (watchKey) {
114
+ return /* @__PURE__ */ jsx(AvatarFieldWithNameWatch, { field, watchKey });
115
+ }
116
+ return /* @__PURE__ */ jsx(AvatarFieldView, { field, watchedName: void 0 });
117
+ };
118
+ var AvatarFieldWithNameWatch = ({
119
+ field,
120
+ watchKey
121
+ }) => {
122
+ const { control } = useFormContext();
123
+ const watchedName = useWatch({
124
+ control,
125
+ name: watchKey
126
+ });
127
+ return /* @__PURE__ */ jsx(AvatarFieldView, { field, watchedName });
128
+ };
129
+ var AvatarFieldView = ({
130
+ field,
131
+ watchedName
132
+ }) => {
133
+ const { control, getValues, setValue } = useFormContext();
134
+ const {
135
+ name,
136
+ label,
137
+ required,
138
+ disabled,
139
+ sx,
140
+ size,
141
+ slotProps,
142
+ errorMsg,
143
+ defaultValue
144
+ } = field;
145
+ const avatarSlot = slotProps;
146
+ const [editorOpen, setEditorOpen] = React.useState(false);
147
+ const [editorBlobUrl, setEditorBlobUrl] = React.useState("");
148
+ const initialFileRef = React.useRef(null);
149
+ const transientBlobUrlsRef = React.useRef([]);
150
+ const inputAccept = acceptToInputAccept(avatarSlot?.accept);
151
+ const backgroundIcon = (typeof avatarSlot?.useBackgroundIcon === "function" ? avatarSlot?.useBackgroundIcon() : null) || avatarSlot?.backgroundIcon;
152
+ const displayNameRaw = (avatarSlot?.watchAvatarNameKey ? watchedName : void 0) ?? avatarSlot?.avatarName ?? avatarSlot?.name ?? "";
153
+ const displayName = String(displayNameRaw ?? "").trim() || void 0;
154
+ return /* @__PURE__ */ jsx(
155
+ Controller,
156
+ {
157
+ control,
158
+ name,
159
+ defaultValue: defaultValue ?? null,
160
+ render: ({ field: { onChange, value }, fieldState: { error } }) => {
161
+ const fileValue = value ?? null;
162
+ return /* @__PURE__ */ jsx(
163
+ AvatarFieldControl,
164
+ {
165
+ fileValue,
166
+ onChange,
167
+ error,
168
+ disabled,
169
+ required,
170
+ label,
171
+ name: String(name),
172
+ errorMsg,
173
+ helperText: field.helperText,
174
+ size,
175
+ sx,
176
+ displayName,
177
+ backgroundIcon,
178
+ avatarSlot,
179
+ field,
180
+ getValues,
181
+ setValue,
182
+ editorOpen,
183
+ setEditorOpen,
184
+ editorBlobUrl,
185
+ setEditorBlobUrl,
186
+ initialFileRef,
187
+ transientBlobUrlsRef,
188
+ inputAccept
189
+ }
190
+ );
191
+ }
192
+ }
193
+ );
194
+ };
195
+ function AvatarFieldControl({
196
+ fileValue,
197
+ onChange,
198
+ error,
199
+ disabled,
200
+ required,
201
+ label,
202
+ name,
203
+ errorMsg,
204
+ helperText,
205
+ size,
206
+ sx,
207
+ displayName,
208
+ backgroundIcon,
209
+ avatarSlot,
210
+ field,
211
+ getValues,
212
+ setValue,
213
+ editorOpen,
214
+ setEditorOpen,
215
+ editorBlobUrl,
216
+ setEditorBlobUrl,
217
+ initialFileRef,
218
+ transientBlobUrlsRef,
219
+ inputAccept
220
+ }) {
221
+ const src = useFileObjectUrl(fileValue);
222
+ const revokeTransient = () => {
223
+ transientBlobUrlsRef.current.forEach((u) => {
224
+ try {
225
+ URL.revokeObjectURL(u);
226
+ } catch {
227
+ }
228
+ });
229
+ transientBlobUrlsRef.current = [];
230
+ };
231
+ const openEditor = () => {
232
+ initialFileRef.current = fileValue;
233
+ if (fileValue) {
234
+ const u = URL.createObjectURL(fileValue);
235
+ transientBlobUrlsRef.current.push(u);
236
+ setEditorBlobUrl(u);
237
+ } else {
238
+ setEditorBlobUrl("");
239
+ }
240
+ setEditorOpen(true);
241
+ };
242
+ const closeEditor = () => {
243
+ setEditorOpen(false);
244
+ setEditorBlobUrl("");
245
+ revokeTransient();
246
+ };
247
+ const handleSave = async (url) => {
248
+ const next = url ? await blobUrlToFile(url, fileValue?.name || "avatar.png") : null;
249
+ if (url) {
250
+ try {
251
+ URL.revokeObjectURL(url);
252
+ } catch {
253
+ }
254
+ }
255
+ onChange(next);
256
+ try {
257
+ setValue(name, next, { shouldDirty: true, shouldTouch: true });
258
+ } catch {
259
+ }
260
+ field.onChange?.(next, getValues());
261
+ initialFileRef.current = next;
262
+ setEditorBlobUrl("");
263
+ revokeTransient();
264
+ setEditorOpen(false);
265
+ };
266
+ const onFileSelectFromSelector = (file) => {
267
+ if (editorBlobUrl) {
268
+ try {
269
+ URL.revokeObjectURL(editorBlobUrl);
270
+ } catch {
271
+ }
272
+ transientBlobUrlsRef.current = transientBlobUrlsRef.current.filter(
273
+ (u) => u !== editorBlobUrl
274
+ );
275
+ }
276
+ if (!file) {
277
+ setEditorBlobUrl("");
278
+ return;
279
+ }
280
+ const blobUrl = URL.createObjectURL(file);
281
+ transientBlobUrlsRef.current.push(blobUrl);
282
+ setEditorBlobUrl(blobUrl);
283
+ };
284
+ return /* @__PURE__ */ jsxs(
285
+ default5,
286
+ {
287
+ className: CLASSNAMEs.compound.useForm.avatarField,
288
+ disabled,
289
+ required,
290
+ error: !!error,
291
+ fullWidth: true,
292
+ size: "small",
293
+ sx: mergeFieldSx(size, sx),
294
+ children: [
295
+ /* @__PURE__ */ jsxs(
296
+ default3,
297
+ {
298
+ direction: "column",
299
+ alignItems: "center",
300
+ justifyContent: "center",
301
+ gap: 0.5,
302
+ children: [
303
+ /* @__PURE__ */ jsxs(default2, { sx: { display: "flex", alignItems: "center", gap: 1, mb: 1 }, children: [
304
+ /* @__PURE__ */ jsx(MuiFormLabel, { component: "legend", children: label }),
305
+ /* @__PURE__ */ jsx(Explanation_default, { explanation: getFieldExplanation(field) })
306
+ ] }),
307
+ /* @__PURE__ */ jsx(default2, { sx: { display: "flex", alignItems: "center", gap: 1 }, children: /* @__PURE__ */ jsx(default2, { sx: { cursor: disabled ? "not-allowed" : "pointer" }, children: /* @__PURE__ */ jsx(
308
+ AvatarButton,
309
+ {
310
+ onClick: disabled ? void 0 : openEditor,
311
+ size: avatarSlot?.size,
312
+ dim: avatarSlot?.dim,
313
+ name: displayName,
314
+ src,
315
+ backgroundIcon: src ? void 0 : backgroundIcon,
316
+ icon: /* @__PURE__ */ jsx(default4, { fontSize: "small" }),
317
+ "aria-label": typeof label === "string" ? label : "Avatar"
318
+ }
319
+ ) }) }),
320
+ /* @__PURE__ */ jsx(
321
+ FieldHelperText,
322
+ {
323
+ error,
324
+ errorMsg,
325
+ helpers: [typeof helperText === "string" ? helperText : void 0]
326
+ }
327
+ )
328
+ ]
329
+ }
330
+ ),
331
+ editorOpen ? /* @__PURE__ */ jsx(
332
+ MuiModal,
333
+ {
334
+ className: CLASSNAMEs.elemental.modal,
335
+ openProps: [editorOpen, setEditorOpen],
336
+ onClose: closeEditor,
337
+ title: typeof label === "string" ? label : "Avatar",
338
+ size: { w: "70vw", h: "80vh" },
339
+ children: /* @__PURE__ */ jsx(
340
+ default2,
341
+ {
342
+ sx: {
343
+ display: "flex",
344
+ flexDirection: "column",
345
+ height: "100%",
346
+ gap: 2,
347
+ overflow: "hidden"
348
+ },
349
+ children: /* @__PURE__ */ jsx(default2, { sx: { flex: "1 1 auto", minHeight: 0 }, children: /* @__PURE__ */ jsx(
350
+ Cropper_default,
351
+ {
352
+ setImgNull: () => setEditorBlobUrl(""),
353
+ blobUrl: editorBlobUrl,
354
+ onSave: handleSave,
355
+ onClear: () => handleSave(""),
356
+ circularCrop: true,
357
+ defaultRatio: 1,
358
+ resizeCropEnabled: true,
359
+ cropConfig: AVATAR_CROP_CONFIG,
360
+ PreviewRenderer: AvatarCropPreview,
361
+ showFileSelector: true,
362
+ fileSelectorAccept: inputAccept,
363
+ fileSelectorButtonLabel: "Select Image",
364
+ onFileSelect: onFileSelectFromSelector
365
+ }
366
+ ) })
367
+ }
368
+ )
369
+ }
370
+ ) : null
371
+ ]
372
+ }
373
+ );
374
+ }
375
+ export {
376
+ AvatarField
377
+ };
378
+ //# sourceMappingURL=AvatarField-KFASMVZU.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/compound/UseForm/src/Fields/AvatarField.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react'\nimport { Controller, useFormContext, useWatch } from 'react-hook-form'\nimport { Box, Stack } from '@/ele/Box'\nimport { FormControl, FormLabel } from '@/ele/Form'\nimport { EditIcon } from '@/icons/MuiIcon'\n\nimport { FieldHelperText } from '../_utils/helperText'\nimport { AvatarButton } from '@/ele/Avatar'\nimport { MuiModal } from '@/ele/Modal'\nimport { Cropper } from '@/ele/Image'\n\nimport { FieldConfig, FormTypeMap, InferFormDataType } from '../_utils'\nimport { FIELD_TYPEs } from '../_utils/constants'\nimport type { AvatarSlotProps } from '../_utils/slotProps'\nimport Explanation from './Explanation'\nimport { CLASSNAMEs } from '@/_utils/_const/classNames'\nimport { getFieldExplanation, mergeFieldSx } from '../_utils/helpers'\n\ninterface AvatarFieldProps<T extends FormTypeMap = FormTypeMap> {\n field: Extract<FieldConfig<T>, { type: typeof FIELD_TYPEs.avatar }>\n}\n\nconst AVATAR_CROP_CONFIG = { width: 200, unit: 'px' } as const\n\nconst AvatarCropPreview = React.forwardRef<HTMLCanvasElement>((_, ref) => {\n return (\n <canvas\n ref={ref}\n width={200}\n height={200}\n style={{\n width: 200,\n height: 200,\n maxWidth: '100%',\n maxHeight: '100%',\n border: '1px dashed grey',\n borderRadius: '50%',\n objectFit: 'contain',\n backgroundColor: 'transparent',\n }}\n />\n )\n})\n\nAvatarCropPreview.displayName = 'AvatarCropPreview'\n\nfunction acceptToInputAccept(accept: AvatarSlotProps['accept']): string {\n if (!accept) return 'image/*'\n if (typeof accept === 'string') return accept\n\n const parts: string[] = []\n Object.entries(accept).forEach(([mime, exts]) => {\n parts.push(mime)\n if (Array.isArray(exts)) parts.push(...exts)\n })\n return parts.length ? parts.join(',') : 'image/*'\n}\n\n/** Stable object URL for a File; revoked on change/unmount. */\nfunction useFileObjectUrl(file: File | null | undefined): string {\n const [url, setUrl] = useState('')\n useEffect(() => {\n if (!file) {\n setUrl('')\n return\n }\n const objectUrl = URL.createObjectURL(file)\n setUrl(objectUrl)\n return () => {\n URL.revokeObjectURL(objectUrl)\n }\n }, [file])\n return url\n}\n\nasync function blobUrlToFile(url: string, filename = 'avatar.png'): Promise<File> {\n const res = await fetch(url)\n const blob = await res.blob()\n return new File([blob], filename, { type: blob.type || 'image/png' })\n}\n\nexport const AvatarField = <T extends FormTypeMap = FormTypeMap>({\n field,\n}: AvatarFieldProps<T>) => {\n const watchKey = (field.slotProps as AvatarSlotProps | undefined)\n ?.watchAvatarNameKey\n if (watchKey) {\n return <AvatarFieldWithNameWatch field={field} watchKey={watchKey} />\n }\n return <AvatarFieldView field={field} watchedName={undefined} />\n}\n\nconst AvatarFieldWithNameWatch = <T extends FormTypeMap>({\n field,\n watchKey,\n}: AvatarFieldProps<T> & { watchKey: string }) => {\n const { control } = useFormContext()\n const watchedName = useWatch({\n control,\n name: watchKey as never,\n })\n return <AvatarFieldView field={field} watchedName={watchedName} />\n}\n\nconst AvatarFieldView = <T extends FormTypeMap>({\n field,\n watchedName,\n}: AvatarFieldProps<T> & { watchedName: unknown }) => {\n const { control, getValues, setValue } = useFormContext()\n\n const {\n name,\n label,\n required,\n disabled,\n sx,\n size,\n slotProps,\n errorMsg,\n defaultValue,\n } = field\n\n const avatarSlot = slotProps as AvatarSlotProps | undefined\n const [editorOpen, setEditorOpen] = React.useState(false)\n const [editorBlobUrl, setEditorBlobUrl] = React.useState('')\n const initialFileRef = React.useRef<File | null>(null)\n const transientBlobUrlsRef = React.useRef<string[]>([])\n\n const inputAccept = acceptToInputAccept(avatarSlot?.accept)\n const backgroundIcon =\n (typeof avatarSlot?.useBackgroundIcon === 'function'\n ? avatarSlot?.useBackgroundIcon()\n : null) || avatarSlot?.backgroundIcon\n\n const displayNameRaw =\n (avatarSlot?.watchAvatarNameKey ? watchedName : undefined) ??\n avatarSlot?.avatarName ??\n avatarSlot?.name ??\n ''\n const displayName = String(displayNameRaw ?? '').trim() || undefined\n\n return (\n <Controller\n control={control}\n name={name}\n defaultValue={(defaultValue ?? null) as File | null}\n render={({ field: { onChange, value }, fieldState: { error } }) => {\n const fileValue = (value ?? null) as File | null\n return (\n <AvatarFieldControl\n fileValue={fileValue}\n onChange={onChange}\n error={error}\n disabled={disabled}\n required={required}\n label={label}\n name={String(name)}\n errorMsg={errorMsg}\n helperText={field.helperText}\n size={size}\n sx={sx}\n displayName={displayName}\n backgroundIcon={backgroundIcon}\n avatarSlot={avatarSlot}\n field={field}\n getValues={getValues}\n setValue={setValue}\n editorOpen={editorOpen}\n setEditorOpen={setEditorOpen}\n editorBlobUrl={editorBlobUrl}\n setEditorBlobUrl={setEditorBlobUrl}\n initialFileRef={initialFileRef}\n transientBlobUrlsRef={transientBlobUrlsRef}\n inputAccept={inputAccept}\n />\n )\n }}\n />\n )\n}\n\ntype ControlProps<T extends FormTypeMap> = {\n fileValue: File | null\n onChange: (value: File | null) => void\n error: { message?: string } | undefined\n disabled?: boolean\n required?: boolean\n label?: React.ReactNode\n name: string\n errorMsg?: string | null\n helperText?: React.ReactNode\n size?: unknown\n sx?: unknown\n displayName?: string\n backgroundIcon?: React.ReactNode\n avatarSlot?: AvatarSlotProps\n field: AvatarFieldProps<T>['field']\n getValues: () => unknown\n setValue: (name: string, value: unknown, opts?: object) => void\n editorOpen: boolean\n setEditorOpen: (open: boolean) => void\n editorBlobUrl: string\n setEditorBlobUrl: (url: string) => void\n initialFileRef: React.MutableRefObject<File | null>\n transientBlobUrlsRef: React.MutableRefObject<string[]>\n inputAccept: string\n}\n\nfunction AvatarFieldControl<T extends FormTypeMap>({\n fileValue,\n onChange,\n error,\n disabled,\n required,\n label,\n name,\n errorMsg,\n helperText,\n size,\n sx,\n displayName,\n backgroundIcon,\n avatarSlot,\n field,\n getValues,\n setValue,\n editorOpen,\n setEditorOpen,\n editorBlobUrl,\n setEditorBlobUrl,\n initialFileRef,\n transientBlobUrlsRef,\n inputAccept,\n}: ControlProps<T>) {\n const src = useFileObjectUrl(fileValue)\n\n const revokeTransient = () => {\n transientBlobUrlsRef.current.forEach((u) => {\n try {\n URL.revokeObjectURL(u)\n } catch {\n /* ignore */\n }\n })\n transientBlobUrlsRef.current = []\n }\n\n const openEditor = () => {\n initialFileRef.current = fileValue\n if (fileValue) {\n const u = URL.createObjectURL(fileValue)\n transientBlobUrlsRef.current.push(u)\n setEditorBlobUrl(u)\n } else {\n setEditorBlobUrl('')\n }\n setEditorOpen(true)\n }\n\n const closeEditor = () => {\n setEditorOpen(false)\n setEditorBlobUrl('')\n revokeTransient()\n }\n\n const handleSave = async (url: string) => {\n const next = url ? await blobUrlToFile(url, fileValue?.name || 'avatar.png') : null\n if (url) {\n try {\n URL.revokeObjectURL(url)\n } catch {\n /* ignore */\n }\n }\n\n onChange(next)\n try {\n setValue(name, next, { shouldDirty: true, shouldTouch: true })\n } catch {\n /* ignore */\n }\n field.onChange?.(next, getValues() as InferFormDataType<T>)\n\n initialFileRef.current = next\n setEditorBlobUrl('')\n revokeTransient()\n setEditorOpen(false)\n }\n\n const onFileSelectFromSelector = (file: File | null) => {\n if (editorBlobUrl) {\n try {\n URL.revokeObjectURL(editorBlobUrl)\n } catch {\n /* ignore */\n }\n transientBlobUrlsRef.current = transientBlobUrlsRef.current.filter(\n (u) => u !== editorBlobUrl,\n )\n }\n if (!file) {\n setEditorBlobUrl('')\n return\n }\n const blobUrl = URL.createObjectURL(file)\n transientBlobUrlsRef.current.push(blobUrl)\n setEditorBlobUrl(blobUrl)\n }\n\n return (\n <FormControl\n className={CLASSNAMEs.compound.useForm.avatarField}\n disabled={disabled}\n required={required}\n error={!!error}\n fullWidth\n size=\"small\"\n sx={mergeFieldSx(size as never, sx as never)}\n >\n <Stack\n direction=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={0.5}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>\n <FormLabel component=\"legend\">{label}</FormLabel>\n <Explanation explanation={getFieldExplanation(field)} />\n </Box>\n\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box sx={{ cursor: disabled ? 'not-allowed' : 'pointer' }}>\n <AvatarButton\n onClick={disabled ? undefined : openEditor}\n size={avatarSlot?.size}\n dim={avatarSlot?.dim}\n name={displayName}\n src={src}\n backgroundIcon={src ? undefined : backgroundIcon}\n icon={<EditIcon fontSize=\"small\" />}\n aria-label={typeof label === 'string' ? label : 'Avatar'}\n />\n </Box>\n </Box>\n\n <FieldHelperText\n error={error as never}\n errorMsg={errorMsg}\n helpers={[typeof helperText === 'string' ? helperText : undefined]}\n />\n </Stack>\n\n {editorOpen ? (\n <MuiModal\n className={CLASSNAMEs.elemental.modal}\n openProps={[editorOpen, setEditorOpen]}\n onClose={closeEditor}\n title={typeof label === 'string' ? label : 'Avatar'}\n size={{ w: '70vw', h: '80vh' }}\n >\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n gap: 2,\n overflow: 'hidden',\n }}\n >\n <Box sx={{ flex: '1 1 auto', minHeight: 0 }}>\n <Cropper\n setImgNull={() => setEditorBlobUrl('')}\n blobUrl={editorBlobUrl}\n onSave={handleSave}\n onClear={() => handleSave('')}\n circularCrop\n defaultRatio={1}\n resizeCropEnabled\n cropConfig={AVATAR_CROP_CONFIG}\n PreviewRenderer={AvatarCropPreview}\n showFileSelector\n fileSelectorAccept={inputAccept}\n fileSelectorButtonLabel=\"Select Image\"\n onFileSelect={onFileSelectFromSelector}\n />\n </Box>\n </Box>\n </MuiModal>\n ) : null}\n </FormControl>\n )\n}\n"],"mappings":"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","names":["default"]}