@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
@@ -1,20 +1,15 @@
1
+ import {
2
+ FileUpload
3
+ } from "./chunk-4SSJY32J.mjs";
1
4
  import {
2
5
  MuiModal
3
- } from "./chunk-UDREPVEY.mjs";
6
+ } from "./chunk-RVSMEZE3.mjs";
4
7
  import {
5
- CircularProgress,
6
- LinearProgress
8
+ CircularProgress
7
9
  } from "./chunk-WYYP3Y34.mjs";
8
10
  import {
9
11
  useAlert
10
- } from "./chunk-EKPULYPU.mjs";
11
- import {
12
- FileThumbnail
13
- } from "./chunk-AAH2O24U.mjs";
14
- import {
15
- Button,
16
- IconButton_default
17
- } from "./chunk-JIU5GVM7.mjs";
12
+ } from "./chunk-YIJ5QVJ6.mjs";
18
13
  import {
19
14
  default100 as default7,
20
15
  default101 as default8,
@@ -23,49 +18,22 @@ import {
23
18
  default57 as default5,
24
19
  default95 as default6
25
20
  } from "./chunk-ZVFYOXDE.mjs";
21
+ import {
22
+ Button,
23
+ IconButton_default
24
+ } from "./chunk-D4XPNSSI.mjs";
26
25
  import {
27
26
  default as default3
28
27
  } from "./chunk-4RPFRNXG.mjs";
29
28
  import {
30
- default as default2,
29
+ default as default2
30
+ } from "./chunk-PNSJC6PC.mjs";
31
+ import {
31
32
  mergeSx
32
- } from "./chunk-S6EZVRZC.mjs";
33
+ } from "./chunk-AFLEG5ZC.mjs";
33
34
 
34
35
  // src/components/compound/Process/src/ProcessModal.tsx
35
- import { useState as useState3, useEffect as useEffect4, useCallback as useCallback2 } from "react";
36
-
37
- // src/components/compound/Process/src/ProcessItem.tsx
38
- import { jsx, jsxs } from "react/jsx-runtime";
39
- var ProcessItem = ({ file, progress }) => {
40
- const isComplete = progress >= 100;
41
- return /* @__PURE__ */ jsxs(default2, { sx: { display: "flex", gap: 2, alignItems: "center", mb: 2, p: 1, border: "1px solid", borderColor: "var(--process-item-border)", borderRadius: 1 }, children: [
42
- /* @__PURE__ */ jsx(FileThumbnail, { file, size: 48 }),
43
- /* @__PURE__ */ jsxs(default2, { sx: { flex: 1, minWidth: 0 }, children: [
44
- /* @__PURE__ */ jsxs(default2, { sx: { display: "flex", justifyContent: "space-between", mb: 0.5 }, children: [
45
- /* @__PURE__ */ jsx(default3, { variant: "body2", noWrap: true, sx: { fontWeight: 500 }, children: file.filename }),
46
- /* @__PURE__ */ jsx(default3, { variant: "caption", sx: { pl: 0.5, color: "var(--process-item-secondary-color)" }, children: file.displaySize })
47
- ] }),
48
- /* @__PURE__ */ jsxs(default2, { sx: { display: "flex", alignItems: "center", gap: 1 }, children: [
49
- /* @__PURE__ */ jsx(
50
- LinearProgress,
51
- {
52
- variant: "determinate",
53
- value: progress,
54
- sx: {
55
- flex: 1,
56
- height: 6
57
- }
58
- }
59
- ),
60
- /* @__PURE__ */ jsxs(default3, { variant: "caption", sx: { minWidth: 35, textAlign: "right", color: "var(--process-item-secondary-color)" }, children: [
61
- Math.round(progress),
62
- "%"
63
- ] })
64
- ] })
65
- ] }),
66
- /* @__PURE__ */ jsx(default2, { sx: { display: "flex", alignItems: "center", width: 24, justifyContent: "center" }, children: isComplete && /* @__PURE__ */ jsx(default5, { color: "success", fontSize: "small" }) })
67
- ] });
68
- };
36
+ import { useState as useState3, useEffect as useEffect4, useCallback as useCallback2, useMemo as useMemo3 } from "react";
69
37
 
70
38
  // src/components/compound/Process/src/hooks/useProgressTracking.ts
71
39
  import { useState, useEffect, useMemo, useCallback } from "react";
@@ -73,10 +41,10 @@ function useProgressTracking(files, observerRef) {
73
41
  const [progressMap, setProgressMap] = useState(/* @__PURE__ */ new Map());
74
42
  const handleProgress = useCallback((file, progress) => {
75
43
  setProgressMap((prev) => {
76
- if (prev.get(file.filename) === progress) return prev;
77
- const newMap = new Map(prev);
78
- newMap.set(file.filename, progress);
79
- return newMap;
44
+ if (prev.get(file.id) === progress) return prev;
45
+ const next = new Map(prev);
46
+ next.set(file.id, progress);
47
+ return next;
80
48
  });
81
49
  }, []);
82
50
  useEffect(() => {
@@ -92,7 +60,7 @@ function useProgressTracking(files, observerRef) {
92
60
  }, [progressMap, files, observerRef]);
93
61
  const allComplete = useMemo(() => {
94
62
  if (files.length === 0) return false;
95
- return files.every((f) => (progressMap.get(f.filename) || 0) >= 100);
63
+ return files.every((f) => (progressMap.get(f.id) || 0) >= 100);
96
64
  }, [files, progressMap]);
97
65
  return { progressMap, handleProgress, allComplete };
98
66
  }
@@ -102,7 +70,7 @@ import React, { useRef, useEffect as useEffect3, useMemo as useMemo2 } from "rea
102
70
 
103
71
  // src/components/compound/Process/src/ProcessAlert.tsx
104
72
  import { useEffect as useEffect2, useState as useState2 } from "react";
105
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
73
+ import { jsx, jsxs } from "react/jsx-runtime";
106
74
  var ProcessAlertContent = ({
107
75
  allComplete,
108
76
  fileCount,
@@ -110,11 +78,11 @@ var ProcessAlertContent = ({
110
78
  onMaximize,
111
79
  minimized
112
80
  }) => {
113
- return /* @__PURE__ */ jsxs2(default2, { sx: { display: "flex", alignItems: "center", gap: 2, minWidth: 280 }, children: [
114
- /* @__PURE__ */ jsx2(default2, { sx: { display: "flex", alignItems: "center", justifyContent: "center" }, children: allComplete ? /* @__PURE__ */ jsx2(default5, {}) : /* @__PURE__ */ jsx2(CircularProgress, { variant: "determinate", value: totalProgress, size: 24, thickness: 5 }) }),
115
- /* @__PURE__ */ jsxs2(default2, { sx: { flex: 1, minWidth: 0 }, children: [
116
- /* @__PURE__ */ jsx2(default3, { variant: "subtitle2", sx: { fontWeight: 600, lineHeight: 1.2 }, children: allComplete ? "Uploads complete" : "Uploading files..." }),
117
- !allComplete && /* @__PURE__ */ jsxs2(default3, { variant: "caption", display: "block", sx: { opacity: 0.8 }, children: [
81
+ return /* @__PURE__ */ jsxs(default2, { sx: { display: "flex", alignItems: "center", gap: 2, minWidth: 280 }, children: [
82
+ /* @__PURE__ */ jsx(default2, { sx: { display: "flex", alignItems: "center", justifyContent: "center" }, children: allComplete ? /* @__PURE__ */ jsx(default5, {}) : /* @__PURE__ */ jsx(CircularProgress, { variant: "determinate", value: totalProgress, size: 24, thickness: 5 }) }),
83
+ /* @__PURE__ */ jsxs(default2, { sx: { flex: 1, minWidth: 0 }, children: [
84
+ /* @__PURE__ */ jsx(default3, { variant: "subtitle2", sx: { fontWeight: 600, lineHeight: 1.2 }, children: allComplete ? "Uploads complete" : "Uploading files..." }),
85
+ !allComplete && /* @__PURE__ */ jsxs(default3, { variant: "caption", display: "block", sx: { opacity: 0.8 }, children: [
118
86
  fileCount,
119
87
  " item",
120
88
  fileCount !== 1 ? "s" : "",
@@ -123,7 +91,7 @@ var ProcessAlertContent = ({
123
91
  "%"
124
92
  ] })
125
93
  ] }),
126
- minimized && /* @__PURE__ */ jsx2(IconButton_default, { size: "small", onClick: onMaximize, title: "Maximize", sx: { color: "inherit" }, children: /* @__PURE__ */ jsx2(default6, {}) })
94
+ minimized && /* @__PURE__ */ jsx(IconButton_default, { size: "small", onClick: onMaximize, title: "Maximize", sx: { color: "inherit" }, children: /* @__PURE__ */ jsx(default6, {}) })
127
95
  ] });
128
96
  };
129
97
  var ProcessAlertObserver = ({ observer, onMaximize }) => {
@@ -134,7 +102,7 @@ var ProcessAlertObserver = ({ observer, onMaximize }) => {
134
102
  });
135
103
  }, [observer]);
136
104
  const allComplete = state.fileCount > 0 && state.totalProgress >= 100;
137
- return /* @__PURE__ */ jsx2(
105
+ return /* @__PURE__ */ jsx(
138
106
  ProcessAlertContent,
139
107
  {
140
108
  allComplete,
@@ -232,11 +200,11 @@ function useProcessAlert({
232
200
  var processModalRootSx = {
233
201
  "--process-description-color": "var(--mui-palette-text-secondary)",
234
202
  "--process-item-secondary-color": "var(--mui-palette-text-secondary)",
235
- "--process-item-border": "var(--mui-palette-divider)"
203
+ "--process-item-border": "var(--mui-palette-border-1)"
236
204
  };
237
205
 
238
206
  // src/components/compound/Process/src/ProcessModal.tsx
239
- import { Fragment, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
207
+ import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
240
208
  var useDefaultProgress = () => 0;
241
209
  var ProcessLogicRunner = ({
242
210
  file,
@@ -260,7 +228,8 @@ var ProcessModal = ({
260
228
  onStop,
261
229
  minimizable = false,
262
230
  minimizePlacement = "bottom-right",
263
- autoClose = false
231
+ autoClose = false,
232
+ itemVariant = "row"
264
233
  }) => {
265
234
  const [open, setOpen] = openProps;
266
235
  const [minimized, setMinimized] = useState3(false);
@@ -272,7 +241,22 @@ var ProcessModal = ({
272
241
  minimizePlacement,
273
242
  onMaximize: handleMaximize
274
243
  });
275
- const { progressMap, handleProgress, allComplete } = useProgressTracking(files, observerRef);
244
+ const { progressMap, handleProgress, allComplete } = useProgressTracking(
245
+ files,
246
+ observerRef
247
+ );
248
+ const queueValue = useMemo3(
249
+ () => files.map((file) => {
250
+ const progress = progressMap.get(file.id) ?? 0;
251
+ const clamped = Math.max(0, Math.min(100, progress));
252
+ return {
253
+ ...file,
254
+ progress: clamped,
255
+ status: clamped >= 100 ? "success" : "uploading"
256
+ };
257
+ }),
258
+ [files, progressMap]
259
+ );
276
260
  useEffect4(() => {
277
261
  if (autoClose && allComplete && open) {
278
262
  const timer = setTimeout(() => {
@@ -290,8 +274,8 @@ var ProcessModal = ({
290
274
  setOpen(false);
291
275
  };
292
276
  if (!open) return null;
293
- return /* @__PURE__ */ jsxs3(Fragment, { children: [
294
- files.map((file) => /* @__PURE__ */ jsx3(
277
+ return /* @__PURE__ */ jsxs2(Fragment, { children: [
278
+ files.map((file) => /* @__PURE__ */ jsx2(
295
279
  ProcessLogicRunner,
296
280
  {
297
281
  file,
@@ -299,9 +283,9 @@ var ProcessModal = ({
299
283
  onProgress: handleProgress,
300
284
  paused
301
285
  },
302
- file.filename
286
+ file.id
303
287
  )),
304
- minimized ? null : /* @__PURE__ */ jsx3(
288
+ minimized ? null : /* @__PURE__ */ jsx2(
305
289
  MuiModal,
306
290
  {
307
291
  openProps,
@@ -316,61 +300,113 @@ var ProcessModal = ({
316
300
  title: "Minimize"
317
301
  } : void 0
318
302
  },
319
- children: /* @__PURE__ */ jsxs3(default2, { sx: mergeSx({ py: 2 }, processModalRootSx), children: [
320
- description && /* @__PURE__ */ jsx3(default3, { variant: "body2", sx: { mb: 3, color: "var(--process-description-color)" }, children: description }),
321
- /* @__PURE__ */ jsx3(default2, { sx: { display: "flex", flexDirection: "column", gap: 1, maxHeight: "60vh", overflowY: "auto" }, children: files.map((file) => /* @__PURE__ */ jsx3(
322
- ProcessItem,
303
+ children: /* @__PURE__ */ jsxs2(default2, { sx: mergeSx({ py: 2 }, processModalRootSx), children: [
304
+ description ? /* @__PURE__ */ jsx2(
305
+ default3,
323
306
  {
324
- file,
325
- progress: progressMap.get(file.filename) || 0
326
- },
327
- file.filename
328
- )) }),
329
- /* @__PURE__ */ jsxs3(default2, { sx: { mt: 3, display: "flex", justifyContent: "flex-end", gap: 2 }, children: [
330
- !allComplete && /* @__PURE__ */ jsxs3(Fragment, { children: [
331
- onStop && /* @__PURE__ */ jsx3(
332
- Button,
333
- {
334
- variant: "outlined",
335
- color: "error",
336
- startIcon: /* @__PURE__ */ jsx3(default9, {}),
337
- onClick: handleStop,
338
- children: "Stop"
339
- }
340
- ),
341
- onPause && /* @__PURE__ */ jsx3(
342
- Button,
307
+ variant: "body2",
308
+ sx: { mb: 3, color: "var(--process-description-color)" },
309
+ children: description
310
+ }
311
+ ) : null,
312
+ /* @__PURE__ */ jsx2(
313
+ default2,
314
+ {
315
+ sx: {
316
+ maxHeight: "60vh",
317
+ overflowY: "auto"
318
+ },
319
+ children: /* @__PURE__ */ jsx2(
320
+ FileUpload,
343
321
  {
344
- variant: "outlined",
345
- color: "warning",
346
- startIcon: paused ? /* @__PURE__ */ jsx3(default7, {}) : /* @__PURE__ */ jsx3(default8, {}),
347
- onClick: handlePauseToggle,
348
- children: paused ? "Resume" : "Pause"
322
+ value: queueValue,
323
+ readOnly: true,
324
+ hideDropzone: true,
325
+ disableRemove: true,
326
+ itemVariant,
327
+ "data-testid": "process-file-queue"
349
328
  }
350
329
  )
351
- ] }),
352
- allComplete && /* @__PURE__ */ jsx3(
353
- Button,
354
- {
355
- variant: "contained",
356
- onClick: () => setOpen(false),
357
- disabled: !allComplete && !onStop,
358
- startIcon: /* @__PURE__ */ jsx3(default5, {}),
359
- color: "success",
360
- children: "Done"
361
- }
362
- )
363
- ] })
330
+ }
331
+ ),
332
+ /* @__PURE__ */ jsxs2(
333
+ default2,
334
+ {
335
+ sx: { mt: 3, display: "flex", justifyContent: "flex-end", gap: 2 },
336
+ children: [
337
+ !allComplete ? /* @__PURE__ */ jsxs2(Fragment, { children: [
338
+ onStop ? /* @__PURE__ */ jsx2(
339
+ Button,
340
+ {
341
+ variant: "outlined",
342
+ color: "error",
343
+ startIcon: /* @__PURE__ */ jsx2(default9, {}),
344
+ onClick: handleStop,
345
+ children: "Stop"
346
+ }
347
+ ) : null,
348
+ onPause ? /* @__PURE__ */ jsx2(
349
+ Button,
350
+ {
351
+ variant: "outlined",
352
+ color: "warning",
353
+ startIcon: paused ? /* @__PURE__ */ jsx2(default7, {}) : /* @__PURE__ */ jsx2(default8, {}),
354
+ onClick: handlePauseToggle,
355
+ children: paused ? "Resume" : "Pause"
356
+ }
357
+ ) : null
358
+ ] }) : null,
359
+ allComplete ? /* @__PURE__ */ jsx2(
360
+ Button,
361
+ {
362
+ variant: "contained",
363
+ onClick: () => setOpen(false),
364
+ disabled: !allComplete && !onStop,
365
+ startIcon: /* @__PURE__ */ jsx2(default5, {}),
366
+ color: "success",
367
+ children: "Done"
368
+ }
369
+ ) : null
370
+ ]
371
+ }
372
+ )
364
373
  ] })
365
374
  }
366
375
  )
367
376
  ] });
368
377
  };
369
378
 
379
+ // src/components/compound/Process/src/ProcessItem.tsx
380
+ import { useMemo as useMemo4 } from "react";
381
+ import { jsx as jsx3 } from "react/jsx-runtime";
382
+ var ProcessItem = ({ file, progress }) => {
383
+ const value = useMemo4(() => {
384
+ const clamped = Math.max(0, Math.min(100, progress));
385
+ return [
386
+ {
387
+ ...file,
388
+ progress: clamped,
389
+ status: clamped >= 100 ? "success" : "uploading"
390
+ }
391
+ ];
392
+ }, [file, progress]);
393
+ return /* @__PURE__ */ jsx3(
394
+ FileUpload,
395
+ {
396
+ value,
397
+ readOnly: true,
398
+ hideDropzone: true,
399
+ disableRemove: true,
400
+ itemVariant: "row",
401
+ "data-testid": "process-item"
402
+ }
403
+ );
404
+ };
405
+
370
406
  export {
371
- ProcessItem,
372
407
  ProcessAlertContent,
373
408
  ProcessAlertObserver,
374
- ProcessModal
409
+ ProcessModal,
410
+ ProcessItem
375
411
  };
376
- //# sourceMappingURL=chunk-T6AMRENK.mjs.map
412
+ //# sourceMappingURL=chunk-YRW5NKD7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/compound/Process/src/ProcessModal.tsx","../src/components/compound/Process/src/hooks/useProgressTracking.ts","../src/components/compound/Process/src/hooks/useProcessAlert.ts","../src/components/compound/Process/src/ProcessAlert.tsx","../src/components/compound/Process/src/_utils/ProgressObserver.ts","../src/components/compound/Process/src/theme.ts","../src/components/compound/Process/src/ProcessItem.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback, useMemo } from 'react'\nimport { Box } from '@/ele/Box'\nimport { Typography } from '@/ele/Typography'\nimport { Button } from '@/ele/Button'\nimport {\n PauseIcon,\n PlayIcon,\n StopIcon,\n RemoveIcon as MinimizeIcon,\n CheckCircleIcon,\n} from '@/icons/MuiIcon'\nimport { MuiModal } from '@/ele/Modal'\nimport {\n FileUpload,\n type FileUploadItem,\n} from '@/ele/FileUpload'\nimport { ProcessModalProps, ProgressHook } from './types'\nimport { useProgressTracking, useProcessAlert } from './hooks'\nimport { processModalRootSx } from './theme'\nimport { mergeSx } from '@/_utils/_func'\n\nconst useDefaultProgress: ProgressHook = () => 0\n\nconst ProcessLogicRunner = ({\n file,\n useProgress,\n onProgress,\n paused,\n}: {\n file: FileUploadItem\n useProgress: ProgressHook\n onProgress: (file: FileUploadItem, progress: number) => void\n paused: boolean\n}) => {\n const progress = useProgress(file, paused)\n useEffect(() => {\n onProgress(file, progress)\n }, [file, progress, onProgress])\n return null\n}\n\nexport const ProcessModal: React.FC<ProcessModalProps> = ({\n openProps,\n files,\n title = 'Uploading Documents',\n description = 'Please wait while we upload your files.',\n useProgress = useDefaultProgress,\n onPause,\n onStop,\n minimizable = false,\n minimizePlacement = 'bottom-right',\n autoClose = false,\n itemVariant = 'row',\n}) => {\n const [open, setOpen] = openProps\n const [minimized, setMinimized] = useState(false)\n const [paused, setPaused] = useState(false)\n\n const handleMaximize = useCallback(() => setMinimized(false), [])\n\n const { observerRef } = useProcessAlert({\n open,\n minimized,\n minimizePlacement,\n onMaximize: handleMaximize,\n })\n\n const { progressMap, handleProgress, allComplete } = useProgressTracking(\n files,\n observerRef,\n )\n\n const queueValue = useMemo<FileUploadItem[]>(\n () =>\n files.map((file) => {\n const progress = progressMap.get(file.id) ?? 0\n const clamped = Math.max(0, Math.min(100, progress))\n return {\n ...file,\n progress: clamped,\n status: clamped >= 100 ? 'success' : 'uploading',\n }\n }),\n [files, progressMap],\n )\n\n useEffect(() => {\n if (autoClose && allComplete && open) {\n const timer = setTimeout(() => {\n setOpen(false)\n }, 1000)\n return () => clearTimeout(timer)\n }\n }, [autoClose, allComplete, open, setOpen])\n\n const handlePauseToggle = () => {\n setPaused(!paused)\n if (onPause) onPause()\n }\n\n const handleStop = () => {\n if (onStop) onStop()\n setOpen(false)\n }\n\n if (!open) return null\n\n return (\n <>\n {files.map((file) => (\n <ProcessLogicRunner\n key={file.id}\n file={file}\n useProgress={useProgress}\n onProgress={handleProgress}\n paused={paused}\n />\n ))}\n\n {minimized ? null : (\n <MuiModal\n openProps={openProps}\n title={title}\n size={{ w: 500 }}\n slots={{\n closeIcon: minimizable ? MinimizeIcon : undefined,\n }}\n slotProps={{\n closeButton: minimizable\n ? {\n onClick: () => setMinimized(true),\n title: 'Minimize',\n }\n : undefined,\n }}\n >\n <Box sx={mergeSx({ py: 2 }, processModalRootSx)}>\n {description ? (\n <Typography\n variant=\"body2\"\n sx={{ mb: 3, color: 'var(--process-description-color)' }}\n >\n {description}\n </Typography>\n ) : null}\n\n <Box\n sx={{\n maxHeight: '60vh',\n overflowY: 'auto',\n }}\n >\n <FileUpload\n value={queueValue}\n readOnly\n hideDropzone\n disableRemove\n itemVariant={itemVariant}\n data-testid=\"process-file-queue\"\n />\n </Box>\n\n <Box\n sx={{ mt: 3, display: 'flex', justifyContent: 'flex-end', gap: 2 }}\n >\n {!allComplete ? (\n <>\n {onStop ? (\n <Button\n variant=\"outlined\"\n color=\"error\"\n startIcon={<StopIcon />}\n onClick={handleStop}\n >\n Stop\n </Button>\n ) : null}\n {onPause ? (\n <Button\n variant=\"outlined\"\n color=\"warning\"\n startIcon={paused ? <PlayIcon /> : <PauseIcon />}\n onClick={handlePauseToggle}\n >\n {paused ? 'Resume' : 'Pause'}\n </Button>\n ) : null}\n </>\n ) : null}\n\n {allComplete ? (\n <Button\n variant=\"contained\"\n onClick={() => setOpen(false)}\n disabled={!allComplete && !onStop}\n startIcon={<CheckCircleIcon />}\n color=\"success\"\n >\n Done\n </Button>\n ) : null}\n </Box>\n </Box>\n </MuiModal>\n )}\n </>\n )\n}\n","import { useState, useEffect, useMemo, useCallback } from 'react'\nimport type React from 'react'\nimport type { FileUploadItem } from '@/ele/FileUpload'\nimport { ProgressObserver } from '../_utils/ProgressObserver'\n\nexport function useProgressTracking(\n files: FileUploadItem[],\n observerRef: React.RefObject<ProgressObserver>,\n) {\n const [progressMap, setProgressMap] = useState<Map<string, number>>(new Map())\n\n const handleProgress = useCallback((file: FileUploadItem, progress: number) => {\n setProgressMap((prev) => {\n if (prev.get(file.id) === progress) return prev\n const next = new Map(prev)\n next.set(file.id, progress)\n return next\n })\n }, [])\n\n useEffect(() => {\n if (files.length === 0) return\n let total = 0\n let completed = 0\n progressMap.forEach((v) => {\n total += v\n if (v >= 100) completed++\n })\n const avg = Math.round(total / files.length)\n observerRef.current.update(files.length, completed, avg)\n }, [progressMap, files, observerRef])\n\n const allComplete = useMemo(() => {\n if (files.length === 0) return false\n return files.every((f) => (progressMap.get(f.id) || 0) >= 100)\n }, [files, progressMap])\n\n return { progressMap, handleProgress, allComplete }\n}\n","import React, { useRef, useEffect, useMemo } from 'react';\nimport { SnackbarKey } from 'notistack';\nimport { useAlert, type AlertOptions } from '@/compound/Alert';\nimport { ProcessAlertObserver } from '../ProcessAlert';\nimport { ProgressObserver } from '../_utils/ProgressObserver';\nimport type { ProcessModalProps } from '../types';\n\ninterface UseProcessAlertParams {\n open: boolean;\n minimized: boolean;\n minimizePlacement: NonNullable<ProcessModalProps['minimizePlacement']>;\n onMaximize: () => void;\n}\n\nexport function useProcessAlert({\n open,\n minimized,\n minimizePlacement,\n onMaximize,\n}: UseProcessAlertParams) {\n const { enqueueInfo, closeSnackbar } = useAlert();\n const observerRef = useRef(new ProgressObserver());\n const snackbarIdRef = useRef<SnackbarKey | null>(null);\n\n const alertAnchorOrigin = useMemo<NonNullable<AlertOptions['anchorOrigin']>>(() => (\n {\n 'bottom-right': { vertical: 'bottom', horizontal: 'right' },\n 'bottom-left': { vertical: 'bottom', horizontal: 'left' },\n 'top-right': { vertical: 'top', horizontal: 'right' },\n 'top-left': { vertical: 'top', horizontal: 'left' },\n } as const\n )[minimizePlacement], [minimizePlacement]);\n\n // Sync minimized state to observer\n useEffect(() => {\n observerRef.current.setMinimized(minimized);\n }, [minimized]);\n\n // Alert open/close lifecycle\n useEffect(() => {\n if (open) {\n if (!snackbarIdRef.current) {\n const message = React.createElement(ProcessAlertObserver, {\n observer: observerRef.current,\n onMaximize,\n });\n const result = enqueueInfo(message, {\n autoHideDuration: null,\n icon: null,\n anchorOrigin: alertAnchorOrigin,\n });\n if (result.success) {\n snackbarIdRef.current = result.data;\n }\n }\n } else {\n if (snackbarIdRef.current) {\n closeSnackbar(snackbarIdRef.current);\n snackbarIdRef.current = null;\n }\n }\n }, [alertAnchorOrigin, closeSnackbar, enqueueInfo, open, onMaximize]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (snackbarIdRef.current) {\n closeSnackbar(snackbarIdRef.current);\n snackbarIdRef.current = null;\n }\n };\n }, [closeSnackbar]);\n\n return { observerRef };\n}\n","import { useEffect, useState } from 'react';\nimport { Box } from '@/ele/Box';\nimport { Typography } from '@/ele/Typography';\nimport { IconButton } from '@/ele/Button';\nimport { FullscreenIcon, CheckCircleIcon } from '@/icons/MuiIcon';\nimport { CircularProgress } from '@/ele/Progress';\nimport { ProgressObserver } from './_utils/ProgressObserver';\n\n// The display component (stateless mostly)\nexport const ProcessAlertContent = ({ \n allComplete, \n fileCount, \n totalProgress, \n onMaximize,\n minimized\n}: { \n allComplete: boolean; \n fileCount: number; \n totalProgress: number; \n onMaximize: () => void;\n minimized: boolean;\n}) => {\n return (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2, minWidth: 280 }}>\n {/* We don't render Icon here because MuiAlertVariant/Info handles the main icon usually. \n However, user might want the progress circle AS the icon. \n But MuiAlertVariant renders 'icon' prop.\n We are inside 'message'.\n */}\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {/* Explicitly show progress here, assuming we replace or hide the default Alert icon via props if needed, or just show standard info icon + this progress */}\n {allComplete ? <CheckCircleIcon /> : <CircularProgress variant=\"determinate\" value={totalProgress} size={24} thickness={5} />}\n </Box>\n \n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Typography variant=\"subtitle2\" sx={{ fontWeight: 600, lineHeight: 1.2 }}>\n {allComplete ? \"Uploads complete\" : \"Uploading files...\"}\n </Typography>\n {!allComplete && (\n <Typography variant=\"caption\" display=\"block\" sx={{ opacity: 0.8 }}>\n {fileCount} item{fileCount !== 1 ? 's' : ''} • {totalProgress}%\n </Typography>\n )}\n </Box>\n\n {minimized && (\n <IconButton size=\"small\" onClick={onMaximize} title=\"Maximize\" sx={{ color: 'inherit' }}>\n <FullscreenIcon />\n </IconButton>\n )}\n </Box>\n );\n};\n\n// The observer wrapper\nexport const ProcessAlertObserver = ({ observer, onMaximize }: { observer: ProgressObserver, onMaximize: () => void }) => {\n const [state, setState] = useState({ fileCount: 0, completedCount: 0, totalProgress: 0, minimized: false });\n\n useEffect(() => {\n return observer.subscribe((newState) => {\n setState(newState);\n });\n }, [observer]);\n\n // Derived\n const allComplete = state.fileCount > 0 && state.totalProgress >= 100;\n\n return (\n <ProcessAlertContent \n allComplete={allComplete}\n fileCount={state.fileCount}\n totalProgress={state.totalProgress}\n onMaximize={onMaximize}\n minimized={state.minimized}\n />\n );\n};\n","export interface ProgressState {\n fileCount: number;\n completedCount: number;\n totalProgress: number;\n minimized: boolean;\n}\n\nexport type ProgressListener = (state: ProgressState) => void;\n\nexport class ProgressObserver {\n private listeners: ProgressListener[] = [];\n private state: ProgressState = {\n fileCount: 0,\n completedCount: 0,\n totalProgress: 0,\n minimized: false\n };\n\n subscribe(listener: ProgressListener) {\n this.listeners.push(listener);\n // Immediate callback with current state\n listener(this.state);\n return () => {\n this.listeners = this.listeners.filter(l => l !== listener);\n };\n }\n\n update(fileCount: number, completedCount: number, totalProgress: number) {\n this.state = { ...this.state, fileCount, completedCount, totalProgress };\n this.notify();\n }\n\n setMinimized(minimized: boolean) {\n this.state = { ...this.state, minimized };\n this.notify();\n }\n\n private notify() {\n this.listeners.forEach(l => l(this.state));\n }\n}\n","import type { SxProps, Theme } from '@mui/material/styles'\n\n/**\n * Root-level CSS variable aliases for the ProcessModal compound component.\n * File queue styling comes from elemental FileUpload (soft quiet rows/tiles).\n */\nexport const processModalRootSx: SxProps<Theme> = {\n '--process-description-color': 'var(--mui-palette-text-secondary)',\n '--process-item-secondary-color': 'var(--mui-palette-text-secondary)',\n '--process-item-border': 'var(--mui-palette-border-1)',\n}\n","'use client'\nimport React, { useMemo } from 'react'\nimport {\n FileUpload,\n type FileUploadItem,\n} from '@/ele/FileUpload'\n\nexport type ProcessItemProps = {\n file: FileUploadItem\n progress: number\n}\n\n/**\n * Single-file progress row — soft FileUpload readOnly queue item.\n * Prefer ProcessModal's batched FileUpload list for multi-file UIs.\n */\nexport const ProcessItem: React.FC<ProcessItemProps> = ({ file, progress }) => {\n const value = useMemo<FileUploadItem[]>(() => {\n const clamped = Math.max(0, Math.min(100, progress))\n return [\n {\n ...file,\n progress: clamped,\n status: clamped >= 100 ? 'success' : 'uploading',\n },\n ]\n }, [file, progress])\n\n return (\n <FileUpload\n value={value}\n readOnly\n hideDropzone\n disableRemove\n itemVariant=\"row\"\n data-testid=\"process-item\"\n />\n )\n}\n"],"mappings":"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","names":["useState","useEffect","useCallback","useMemo","useEffect","useMemo","useEffect","useState","default","useState","useEffect","useMemo","useEffect","jsx","jsxs","useEffect","useState","useCallback","useMemo","default","useMemo","jsx","useMemo"]}
@@ -0,0 +1,71 @@
1
+ import {
2
+ default115 as default4
3
+ } from "./chunk-ZVFYOXDE.mjs";
4
+ import {
5
+ default as default3
6
+ } from "./chunk-4RPFRNXG.mjs";
7
+ import {
8
+ default as default2
9
+ } from "./chunk-PNSJC6PC.mjs";
10
+
11
+ // src/components/elemental/EmptyState/src/theme.ts
12
+ var emptyStateRootSx = {
13
+ "--empty-icon-color": "var(--mui-palette-text-secondary)",
14
+ "--empty-border": "var(--mui-palette-border-1)",
15
+ display: "flex",
16
+ flexDirection: "column",
17
+ alignItems: "center",
18
+ justifyContent: "center",
19
+ textAlign: "center",
20
+ gap: 1,
21
+ px: 3,
22
+ py: 4,
23
+ borderRadius: "16px",
24
+ border: "1px dashed var(--empty-border)",
25
+ backgroundColor: "color-mix(in srgb, var(--mui-palette-background-paper) 70%, transparent)",
26
+ boxSizing: "border-box",
27
+ minHeight: 160
28
+ };
29
+
30
+ // src/components/elemental/EmptyState/src/EmptyState.tsx
31
+ import { jsx, jsxs } from "react/jsx-runtime";
32
+ function EmptyState({
33
+ icon,
34
+ title,
35
+ description,
36
+ action,
37
+ sx
38
+ }) {
39
+ return /* @__PURE__ */ jsxs(
40
+ default2,
41
+ {
42
+ role: "status",
43
+ "data-testid": "empty-state",
44
+ sx: [emptyStateRootSx, ...Array.isArray(sx) ? sx : sx ? [sx] : []],
45
+ children: [
46
+ /* @__PURE__ */ jsx(
47
+ default2,
48
+ {
49
+ "aria-hidden": true,
50
+ sx: {
51
+ color: "var(--empty-icon-color)",
52
+ display: "flex",
53
+ fontSize: 40,
54
+ lineHeight: 1,
55
+ opacity: 0.85
56
+ },
57
+ children: icon ?? /* @__PURE__ */ jsx(default4, { sx: { fontSize: 40 } })
58
+ }
59
+ ),
60
+ typeof title === "string" ? /* @__PURE__ */ jsx(default3, { variant: "subtitle1", sx: { m: 0, fontWeight: 600 }, children: title }) : title,
61
+ description ? typeof description === "string" ? /* @__PURE__ */ jsx(default3, { variant: "body2", color: "text.secondary", sx: { m: 0, maxWidth: 360 }, children: description }) : description : null,
62
+ action ? /* @__PURE__ */ jsx(default2, { sx: { mt: 0.5 }, children: action }) : null
63
+ ]
64
+ }
65
+ );
66
+ }
67
+
68
+ export {
69
+ EmptyState
70
+ };
71
+ //# sourceMappingURL=chunk-ZMJKG2UI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/elemental/EmptyState/src/theme.ts","../src/components/elemental/EmptyState/src/EmptyState.tsx"],"sourcesContent":["import type { SxProps, Theme } from '@mui/material/styles'\n\nexport const emptyStateRootSx: SxProps<Theme> = {\n '--empty-icon-color': 'var(--mui-palette-text-secondary)',\n '--empty-border': 'var(--mui-palette-border-1)',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n gap: 1,\n px: 3,\n py: 4,\n borderRadius: '16px',\n border: '1px dashed var(--empty-border)',\n backgroundColor: 'color-mix(in srgb, var(--mui-palette-background-paper) 70%, transparent)',\n boxSizing: 'border-box',\n minHeight: 160,\n}\n","'use client'\nimport type React from 'react'\nimport { Box } from '@/ele/Box'\nimport { Typography } from '@/ele/Typography'\nimport { InboxOutlinedIcon } from '@/icons/MuiIcon'\nimport { emptyStateRootSx } from './theme'\n\nexport type EmptyStateProps = {\n icon?: React.ReactNode\n title: React.ReactNode\n description?: React.ReactNode\n action?: React.ReactNode\n sx?: React.ComponentProps<typeof Box>['sx']\n}\n\n/**\n * Soft empty placeholder with optional icon, description, and action.\n */\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n sx,\n}: EmptyStateProps) {\n return (\n <Box\n role=\"status\"\n data-testid=\"empty-state\"\n sx={[emptyStateRootSx, ...(Array.isArray(sx) ? sx : sx ? [sx] : [])] as never}\n >\n <Box\n aria-hidden\n sx={{\n color: 'var(--empty-icon-color)',\n display: 'flex',\n fontSize: 40,\n lineHeight: 1,\n opacity: 0.85,\n }}\n >\n {icon ?? <InboxOutlinedIcon sx={{ fontSize: 40 }} />}\n </Box>\n {typeof title === 'string' ? (\n <Typography variant=\"subtitle1\" sx={{ m: 0, fontWeight: 600 }}>\n {title}\n </Typography>\n ) : (\n title\n )}\n {description ? (\n typeof description === 'string' ? (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ m: 0, maxWidth: 360 }}>\n {description}\n </Typography>\n ) : (\n description\n )\n ) : null}\n {action ? <Box sx={{ mt: 0.5 }}>{action}</Box> : null}\n </Box>\n )\n}\n"],"mappings":";;;;;;;;;;;AAEO,IAAM,mBAAmC;AAAA,EAC9C,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,SAAS;AAAA,EACT,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,WAAW;AACb;;;ACQI,SAea,KAfb;AARG,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,SACE;AAAA,IAACA;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,eAAY;AAAA,MACZ,IAAI,CAAC,kBAAkB,GAAI,MAAM,QAAQ,EAAE,IAAI,KAAK,KAAK,CAAC,EAAE,IAAI,CAAC,CAAE;AAAA,MAEnE;AAAA;AAAA,UAACA;AAAA,UAAA;AAAA,YACC,eAAW;AAAA,YACX,IAAI;AAAA,cACF,OAAO;AAAA,cACP,SAAS;AAAA,cACT,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,SAAS;AAAA,YACX;AAAA,YAEC,kBAAQ,oBAACA,UAAA,EAAkB,IAAI,EAAE,UAAU,GAAG,GAAG;AAAA;AAAA,QACpD;AAAA,QACC,OAAO,UAAU,WAChB,oBAACA,UAAA,EAAW,SAAQ,aAAY,IAAI,EAAE,GAAG,GAAG,YAAY,IAAI,GACzD,iBACH,IAEA;AAAA,QAED,cACC,OAAO,gBAAgB,WACrB,oBAACA,UAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,GAAG,GAAG,UAAU,IAAI,GAC1E,uBACH,IAEA,cAEA;AAAA,QACH,SAAS,oBAACA,UAAA,EAAI,IAAI,EAAE,IAAI,IAAI,GAAI,kBAAO,IAAS;AAAA;AAAA;AAAA,EACnD;AAEJ;","names":["default"]}
@@ -0,0 +1,48 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import React, { ReactNode } from 'react';
3
+
4
+ type ConfirmOptions = {
5
+ title: ReactNode;
6
+ body?: ReactNode;
7
+ confirmLabel?: string;
8
+ cancelLabel?: string;
9
+ /** Styles primary as destructive (error). */
10
+ danger?: boolean;
11
+ };
12
+ type ConfirmDialogProps = ConfirmOptions & {
13
+ open: boolean;
14
+ onConfirm: () => void;
15
+ onCancel: () => void;
16
+ /** Disable buttons while an async confirm is in flight. */
17
+ loading?: boolean;
18
+ };
19
+ type ConfirmRequest = ConfirmOptions & {
20
+ resolve: (value: boolean) => void;
21
+ };
22
+
23
+ /**
24
+ * Soft confirm modal. Esc and Cancel resolve as cancel.
25
+ * Use controlled props, or the promise-style `confirm()` helper.
26
+ */
27
+ declare function ConfirmDialog({ open, title, body, confirmLabel, cancelLabel, danger, loading, onConfirm, onCancel, }: ConfirmDialogProps): react_jsx_runtime.JSX.Element | null;
28
+
29
+ type ConfirmProviderProps = {
30
+ children?: React.ReactNode;
31
+ };
32
+ /**
33
+ * Host for the imperative confirm() helper.
34
+ */
35
+ declare function ConfirmProvider({ children }: ConfirmProviderProps): react_jsx_runtime.JSX.Element;
36
+
37
+ /**
38
+ * Promise-style confirm. Resolves true on primary, false on Cancel/Esc/backdrop.
39
+ * Requires ConfirmProvider (mounted by ThemeProvider by default).
40
+ *
41
+ * @example
42
+ * const ok = await confirm({ title: 'Delete?', body: 'Cannot undo.', danger: true })
43
+ */
44
+ declare function confirm(options: ConfirmOptions): Promise<boolean>;
45
+
46
+ declare function useConfirm(): (options: ConfirmOptions) => Promise<boolean>;
47
+
48
+ export { ConfirmDialog, type ConfirmDialogProps, type ConfirmOptions, ConfirmProvider, type ConfirmRequest, confirm, useConfirm };
@@ -0,0 +1,48 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import React, { ReactNode } from 'react';
3
+
4
+ type ConfirmOptions = {
5
+ title: ReactNode;
6
+ body?: ReactNode;
7
+ confirmLabel?: string;
8
+ cancelLabel?: string;
9
+ /** Styles primary as destructive (error). */
10
+ danger?: boolean;
11
+ };
12
+ type ConfirmDialogProps = ConfirmOptions & {
13
+ open: boolean;
14
+ onConfirm: () => void;
15
+ onCancel: () => void;
16
+ /** Disable buttons while an async confirm is in flight. */
17
+ loading?: boolean;
18
+ };
19
+ type ConfirmRequest = ConfirmOptions & {
20
+ resolve: (value: boolean) => void;
21
+ };
22
+
23
+ /**
24
+ * Soft confirm modal. Esc and Cancel resolve as cancel.
25
+ * Use controlled props, or the promise-style `confirm()` helper.
26
+ */
27
+ declare function ConfirmDialog({ open, title, body, confirmLabel, cancelLabel, danger, loading, onConfirm, onCancel, }: ConfirmDialogProps): react_jsx_runtime.JSX.Element | null;
28
+
29
+ type ConfirmProviderProps = {
30
+ children?: React.ReactNode;
31
+ };
32
+ /**
33
+ * Host for the imperative confirm() helper.
34
+ */
35
+ declare function ConfirmProvider({ children }: ConfirmProviderProps): react_jsx_runtime.JSX.Element;
36
+
37
+ /**
38
+ * Promise-style confirm. Resolves true on primary, false on Cancel/Esc/backdrop.
39
+ * Requires ConfirmProvider (mounted by ThemeProvider by default).
40
+ *
41
+ * @example
42
+ * const ok = await confirm({ title: 'Delete?', body: 'Cannot undo.', danger: true })
43
+ */
44
+ declare function confirm(options: ConfirmOptions): Promise<boolean>;
45
+
46
+ declare function useConfirm(): (options: ConfirmOptions) => Promise<boolean>;
47
+
48
+ export { ConfirmDialog, type ConfirmDialogProps, type ConfirmOptions, ConfirmProvider, type ConfirmRequest, confirm, useConfirm };