@miaixz/ui 0.5.0

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 (690) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +7 -0
  3. package/README.md +190 -0
  4. package/dist/accessibility/focus-scope.d.ts +57 -0
  5. package/dist/accessibility/focus-scope.d.ts.map +1 -0
  6. package/dist/accessibility/focus-scope.js +272 -0
  7. package/dist/accessibility/focus-scope.js.map +1 -0
  8. package/dist/accessibility/index.d.ts +2 -0
  9. package/dist/accessibility/index.d.ts.map +1 -0
  10. package/dist/accessibility/index.js +2 -0
  11. package/dist/accessibility/index.js.map +1 -0
  12. package/dist/components/alert/alert.d.ts +8 -0
  13. package/dist/components/alert/alert.d.ts.map +1 -0
  14. package/dist/components/alert/alert.js +24 -0
  15. package/dist/components/alert/alert.js.map +1 -0
  16. package/dist/components/alert/alert.types.d.ts +43 -0
  17. package/dist/components/alert/alert.types.d.ts.map +1 -0
  18. package/dist/components/alert/alert.types.js +2 -0
  19. package/dist/components/alert/alert.types.js.map +1 -0
  20. package/dist/components/alert/index.d.ts +4 -0
  21. package/dist/components/alert/index.d.ts.map +1 -0
  22. package/dist/components/alert/index.js +2 -0
  23. package/dist/components/alert/index.js.map +1 -0
  24. package/dist/components/avatar/avatar.d.ts +8 -0
  25. package/dist/components/avatar/avatar.d.ts.map +1 -0
  26. package/dist/components/avatar/avatar.js +29 -0
  27. package/dist/components/avatar/avatar.js.map +1 -0
  28. package/dist/components/avatar/avatar.types.d.ts +35 -0
  29. package/dist/components/avatar/avatar.types.d.ts.map +1 -0
  30. package/dist/components/avatar/avatar.types.js +2 -0
  31. package/dist/components/avatar/avatar.types.js.map +1 -0
  32. package/dist/components/avatar/index.d.ts +4 -0
  33. package/dist/components/avatar/index.d.ts.map +1 -0
  34. package/dist/components/avatar/index.js +2 -0
  35. package/dist/components/avatar/index.js.map +1 -0
  36. package/dist/components/badge/badge.d.ts +8 -0
  37. package/dist/components/badge/badge.d.ts.map +1 -0
  38. package/dist/components/badge/badge.js +12 -0
  39. package/dist/components/badge/badge.js.map +1 -0
  40. package/dist/components/badge/badge.types.d.ts +37 -0
  41. package/dist/components/badge/badge.types.d.ts.map +1 -0
  42. package/dist/components/badge/badge.types.js +2 -0
  43. package/dist/components/badge/badge.types.js.map +1 -0
  44. package/dist/components/badge/index.d.ts +3 -0
  45. package/dist/components/badge/index.d.ts.map +1 -0
  46. package/dist/components/badge/index.js +2 -0
  47. package/dist/components/badge/index.js.map +1 -0
  48. package/dist/components/breadcrumb/breadcrumb.d.ts +14 -0
  49. package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -0
  50. package/dist/components/breadcrumb/breadcrumb.js +22 -0
  51. package/dist/components/breadcrumb/breadcrumb.js.map +1 -0
  52. package/dist/components/breadcrumb/breadcrumb.types.d.ts +30 -0
  53. package/dist/components/breadcrumb/breadcrumb.types.d.ts.map +1 -0
  54. package/dist/components/breadcrumb/breadcrumb.types.js +2 -0
  55. package/dist/components/breadcrumb/breadcrumb.types.js.map +1 -0
  56. package/dist/components/breadcrumb/index.d.ts +3 -0
  57. package/dist/components/breadcrumb/index.d.ts.map +1 -0
  58. package/dist/components/breadcrumb/index.js +2 -0
  59. package/dist/components/breadcrumb/index.js.map +1 -0
  60. package/dist/components/button/button.d.ts +8 -0
  61. package/dist/components/button/button.d.ts.map +1 -0
  62. package/dist/components/button/button.js +16 -0
  63. package/dist/components/button/button.js.map +1 -0
  64. package/dist/components/button/button.types.d.ts +99 -0
  65. package/dist/components/button/button.types.d.ts.map +1 -0
  66. package/dist/components/button/button.types.js +2 -0
  67. package/dist/components/button/button.types.js.map +1 -0
  68. package/dist/components/button/index.d.ts +3 -0
  69. package/dist/components/button/index.d.ts.map +1 -0
  70. package/dist/components/button/index.js +2 -0
  71. package/dist/components/button/index.js.map +1 -0
  72. package/dist/components/checkbox/checkbox.d.ts +8 -0
  73. package/dist/components/checkbox/checkbox.d.ts.map +1 -0
  74. package/dist/components/checkbox/checkbox.js +18 -0
  75. package/dist/components/checkbox/checkbox.js.map +1 -0
  76. package/dist/components/checkbox/checkbox.types.d.ts +23 -0
  77. package/dist/components/checkbox/checkbox.types.d.ts.map +1 -0
  78. package/dist/components/checkbox/checkbox.types.js +2 -0
  79. package/dist/components/checkbox/checkbox.types.js.map +1 -0
  80. package/dist/components/checkbox/index.d.ts +3 -0
  81. package/dist/components/checkbox/index.d.ts.map +1 -0
  82. package/dist/components/checkbox/index.js +2 -0
  83. package/dist/components/checkbox/index.js.map +1 -0
  84. package/dist/components/combobox/combobox.d.ts +123 -0
  85. package/dist/components/combobox/combobox.d.ts.map +1 -0
  86. package/dist/components/combobox/combobox.js +378 -0
  87. package/dist/components/combobox/combobox.js.map +1 -0
  88. package/dist/components/combobox/combobox.types.d.ts +108 -0
  89. package/dist/components/combobox/combobox.types.d.ts.map +1 -0
  90. package/dist/components/combobox/combobox.types.js +2 -0
  91. package/dist/components/combobox/combobox.types.js.map +1 -0
  92. package/dist/components/combobox/index.d.ts +3 -0
  93. package/dist/components/combobox/index.d.ts.map +1 -0
  94. package/dist/components/combobox/index.js +2 -0
  95. package/dist/components/combobox/index.js.map +1 -0
  96. package/dist/components/confirm-dialog/confirm-dialog.d.ts +10 -0
  97. package/dist/components/confirm-dialog/confirm-dialog.d.ts.map +1 -0
  98. package/dist/components/confirm-dialog/confirm-dialog.js +70 -0
  99. package/dist/components/confirm-dialog/confirm-dialog.js.map +1 -0
  100. package/dist/components/confirm-dialog/confirm-dialog.types.d.ts +63 -0
  101. package/dist/components/confirm-dialog/confirm-dialog.types.d.ts.map +1 -0
  102. package/dist/components/confirm-dialog/confirm-dialog.types.js +2 -0
  103. package/dist/components/confirm-dialog/confirm-dialog.types.js.map +1 -0
  104. package/dist/components/confirm-dialog/index.d.ts +3 -0
  105. package/dist/components/confirm-dialog/index.d.ts.map +1 -0
  106. package/dist/components/confirm-dialog/index.js +2 -0
  107. package/dist/components/confirm-dialog/index.js.map +1 -0
  108. package/dist/components/data-table/data-table.d.ts +9 -0
  109. package/dist/components/data-table/data-table.d.ts.map +1 -0
  110. package/dist/components/data-table/data-table.js +198 -0
  111. package/dist/components/data-table/data-table.js.map +1 -0
  112. package/dist/components/data-table/data-table.types.d.ts +127 -0
  113. package/dist/components/data-table/data-table.types.d.ts.map +1 -0
  114. package/dist/components/data-table/data-table.types.js +2 -0
  115. package/dist/components/data-table/data-table.types.js.map +1 -0
  116. package/dist/components/data-table/index.d.ts +3 -0
  117. package/dist/components/data-table/index.d.ts.map +1 -0
  118. package/dist/components/data-table/index.js +2 -0
  119. package/dist/components/data-table/index.js.map +1 -0
  120. package/dist/components/dialog/dialog.d.ts +8 -0
  121. package/dist/components/dialog/dialog.d.ts.map +1 -0
  122. package/dist/components/dialog/dialog.js +45 -0
  123. package/dist/components/dialog/dialog.js.map +1 -0
  124. package/dist/components/dialog/dialog.types.d.ts +57 -0
  125. package/dist/components/dialog/dialog.types.d.ts.map +1 -0
  126. package/dist/components/dialog/dialog.types.js +2 -0
  127. package/dist/components/dialog/dialog.types.js.map +1 -0
  128. package/dist/components/dialog/index.d.ts +3 -0
  129. package/dist/components/dialog/index.d.ts.map +1 -0
  130. package/dist/components/dialog/index.js +2 -0
  131. package/dist/components/dialog/index.js.map +1 -0
  132. package/dist/components/divider/divider.d.ts +8 -0
  133. package/dist/components/divider/divider.d.ts.map +1 -0
  134. package/dist/components/divider/divider.js +12 -0
  135. package/dist/components/divider/divider.js.map +1 -0
  136. package/dist/components/divider/divider.types.d.ts +22 -0
  137. package/dist/components/divider/divider.types.d.ts.map +1 -0
  138. package/dist/components/divider/divider.types.js +2 -0
  139. package/dist/components/divider/divider.types.js.map +1 -0
  140. package/dist/components/divider/index.d.ts +3 -0
  141. package/dist/components/divider/index.d.ts.map +1 -0
  142. package/dist/components/divider/index.js +2 -0
  143. package/dist/components/divider/index.js.map +1 -0
  144. package/dist/components/drawer/drawer.d.ts +8 -0
  145. package/dist/components/drawer/drawer.d.ts.map +1 -0
  146. package/dist/components/drawer/drawer.js +45 -0
  147. package/dist/components/drawer/drawer.js.map +1 -0
  148. package/dist/components/drawer/drawer.types.d.ts +69 -0
  149. package/dist/components/drawer/drawer.types.d.ts.map +1 -0
  150. package/dist/components/drawer/drawer.types.js +2 -0
  151. package/dist/components/drawer/drawer.types.js.map +1 -0
  152. package/dist/components/drawer/index.d.ts +3 -0
  153. package/dist/components/drawer/index.d.ts.map +1 -0
  154. package/dist/components/drawer/index.js +2 -0
  155. package/dist/components/drawer/index.js.map +1 -0
  156. package/dist/components/dropdown/dropdown.d.ts +26 -0
  157. package/dist/components/dropdown/dropdown.d.ts.map +1 -0
  158. package/dist/components/dropdown/dropdown.js +70 -0
  159. package/dist/components/dropdown/dropdown.js.map +1 -0
  160. package/dist/components/dropdown/dropdown.types.d.ts +83 -0
  161. package/dist/components/dropdown/dropdown.types.d.ts.map +1 -0
  162. package/dist/components/dropdown/dropdown.types.js +2 -0
  163. package/dist/components/dropdown/dropdown.types.js.map +1 -0
  164. package/dist/components/dropdown/index.d.ts +3 -0
  165. package/dist/components/dropdown/index.d.ts.map +1 -0
  166. package/dist/components/dropdown/index.js +2 -0
  167. package/dist/components/dropdown/index.js.map +1 -0
  168. package/dist/components/dropzone/dropzone.d.ts +8 -0
  169. package/dist/components/dropzone/dropzone.d.ts.map +1 -0
  170. package/dist/components/dropzone/dropzone.js +98 -0
  171. package/dist/components/dropzone/dropzone.js.map +1 -0
  172. package/dist/components/dropzone/dropzone.types.d.ts +40 -0
  173. package/dist/components/dropzone/dropzone.types.d.ts.map +1 -0
  174. package/dist/components/dropzone/dropzone.types.js +2 -0
  175. package/dist/components/dropzone/dropzone.types.js.map +1 -0
  176. package/dist/components/dropzone/index.d.ts +3 -0
  177. package/dist/components/dropzone/index.d.ts.map +1 -0
  178. package/dist/components/dropzone/index.js +2 -0
  179. package/dist/components/dropzone/index.js.map +1 -0
  180. package/dist/components/empty-state/empty-state.d.ts +8 -0
  181. package/dist/components/empty-state/empty-state.d.ts.map +1 -0
  182. package/dist/components/empty-state/empty-state.js +13 -0
  183. package/dist/components/empty-state/empty-state.js.map +1 -0
  184. package/dist/components/empty-state/empty-state.types.d.ts +37 -0
  185. package/dist/components/empty-state/empty-state.types.d.ts.map +1 -0
  186. package/dist/components/empty-state/empty-state.types.js +2 -0
  187. package/dist/components/empty-state/empty-state.types.js.map +1 -0
  188. package/dist/components/empty-state/index.d.ts +3 -0
  189. package/dist/components/empty-state/index.d.ts.map +1 -0
  190. package/dist/components/empty-state/index.js +2 -0
  191. package/dist/components/empty-state/index.js.map +1 -0
  192. package/dist/components/file-upload/file-upload.d.ts +8 -0
  193. package/dist/components/file-upload/file-upload.d.ts.map +1 -0
  194. package/dist/components/file-upload/file-upload.js +359 -0
  195. package/dist/components/file-upload/file-upload.js.map +1 -0
  196. package/dist/components/file-upload/file-upload.types.d.ts +91 -0
  197. package/dist/components/file-upload/file-upload.types.d.ts.map +1 -0
  198. package/dist/components/file-upload/file-upload.types.js +2 -0
  199. package/dist/components/file-upload/file-upload.types.js.map +1 -0
  200. package/dist/components/file-upload/index.d.ts +3 -0
  201. package/dist/components/file-upload/index.d.ts.map +1 -0
  202. package/dist/components/file-upload/index.js +2 -0
  203. package/dist/components/file-upload/index.js.map +1 -0
  204. package/dist/components/form-field/form-field.d.ts +11 -0
  205. package/dist/components/form-field/form-field.d.ts.map +1 -0
  206. package/dist/components/form-field/form-field.js +41 -0
  207. package/dist/components/form-field/form-field.js.map +1 -0
  208. package/dist/components/form-field/form-field.types.d.ts +66 -0
  209. package/dist/components/form-field/form-field.types.d.ts.map +1 -0
  210. package/dist/components/form-field/form-field.types.js +2 -0
  211. package/dist/components/form-field/form-field.types.js.map +1 -0
  212. package/dist/components/form-field/index.d.ts +3 -0
  213. package/dist/components/form-field/index.d.ts.map +1 -0
  214. package/dist/components/form-field/index.js +2 -0
  215. package/dist/components/form-field/index.js.map +1 -0
  216. package/dist/components/icon/icon.d.ts +14 -0
  217. package/dist/components/icon/icon.d.ts.map +1 -0
  218. package/dist/components/icon/icon.js +48 -0
  219. package/dist/components/icon/icon.js.map +1 -0
  220. package/dist/components/icon/icon.types.d.ts +69 -0
  221. package/dist/components/icon/icon.types.d.ts.map +1 -0
  222. package/dist/components/icon/icon.types.js +2 -0
  223. package/dist/components/icon/icon.types.js.map +1 -0
  224. package/dist/components/icon/index.d.ts +3 -0
  225. package/dist/components/icon/index.d.ts.map +1 -0
  226. package/dist/components/icon/index.js +2 -0
  227. package/dist/components/icon/index.js.map +1 -0
  228. package/dist/components/index.d.ts +46 -0
  229. package/dist/components/index.d.ts.map +1 -0
  230. package/dist/components/index.js +45 -0
  231. package/dist/components/index.js.map +1 -0
  232. package/dist/components/inline-message/index.d.ts +4 -0
  233. package/dist/components/inline-message/index.d.ts.map +1 -0
  234. package/dist/components/inline-message/index.js +2 -0
  235. package/dist/components/inline-message/index.js.map +1 -0
  236. package/dist/components/inline-message/inline-message.d.ts +8 -0
  237. package/dist/components/inline-message/inline-message.d.ts.map +1 -0
  238. package/dist/components/inline-message/inline-message.js +20 -0
  239. package/dist/components/inline-message/inline-message.js.map +1 -0
  240. package/dist/components/inline-message/inline-message.types.d.ts +27 -0
  241. package/dist/components/inline-message/inline-message.types.d.ts.map +1 -0
  242. package/dist/components/inline-message/inline-message.types.js +2 -0
  243. package/dist/components/inline-message/inline-message.types.js.map +1 -0
  244. package/dist/components/input/index.d.ts +3 -0
  245. package/dist/components/input/index.d.ts.map +1 -0
  246. package/dist/components/input/index.js +2 -0
  247. package/dist/components/input/index.js.map +1 -0
  248. package/dist/components/input/input.d.ts +8 -0
  249. package/dist/components/input/input.d.ts.map +1 -0
  250. package/dist/components/input/input.js +13 -0
  251. package/dist/components/input/input.js.map +1 -0
  252. package/dist/components/input/input.types.d.ts +35 -0
  253. package/dist/components/input/input.types.d.ts.map +1 -0
  254. package/dist/components/input/input.types.js +2 -0
  255. package/dist/components/input/input.types.js.map +1 -0
  256. package/dist/components/list/index.d.ts +3 -0
  257. package/dist/components/list/index.d.ts.map +1 -0
  258. package/dist/components/list/index.js +2 -0
  259. package/dist/components/list/index.js.map +1 -0
  260. package/dist/components/list/list.d.ts +14 -0
  261. package/dist/components/list/list.d.ts.map +1 -0
  262. package/dist/components/list/list.js +21 -0
  263. package/dist/components/list/list.js.map +1 -0
  264. package/dist/components/list/list.types.d.ts +72 -0
  265. package/dist/components/list/list.types.d.ts.map +1 -0
  266. package/dist/components/list/list.types.js +2 -0
  267. package/dist/components/list/list.types.js.map +1 -0
  268. package/dist/components/loading-overlay/index.d.ts +3 -0
  269. package/dist/components/loading-overlay/index.d.ts.map +1 -0
  270. package/dist/components/loading-overlay/index.js +2 -0
  271. package/dist/components/loading-overlay/index.js.map +1 -0
  272. package/dist/components/loading-overlay/loading-overlay.d.ts +8 -0
  273. package/dist/components/loading-overlay/loading-overlay.d.ts.map +1 -0
  274. package/dist/components/loading-overlay/loading-overlay.js +13 -0
  275. package/dist/components/loading-overlay/loading-overlay.js.map +1 -0
  276. package/dist/components/loading-overlay/loading-overlay.types.d.ts +28 -0
  277. package/dist/components/loading-overlay/loading-overlay.types.d.ts.map +1 -0
  278. package/dist/components/loading-overlay/loading-overlay.types.js +2 -0
  279. package/dist/components/loading-overlay/loading-overlay.types.js.map +1 -0
  280. package/dist/components/multi-select/index.d.ts +3 -0
  281. package/dist/components/multi-select/index.d.ts.map +1 -0
  282. package/dist/components/multi-select/index.js +2 -0
  283. package/dist/components/multi-select/index.js.map +1 -0
  284. package/dist/components/multi-select/multi-select.d.ts +9 -0
  285. package/dist/components/multi-select/multi-select.d.ts.map +1 -0
  286. package/dist/components/multi-select/multi-select.js +74 -0
  287. package/dist/components/multi-select/multi-select.js.map +1 -0
  288. package/dist/components/multi-select/multi-select.types.d.ts +35 -0
  289. package/dist/components/multi-select/multi-select.types.d.ts.map +1 -0
  290. package/dist/components/multi-select/multi-select.types.js +2 -0
  291. package/dist/components/multi-select/multi-select.types.js.map +1 -0
  292. package/dist/components/navigation/index.d.ts +3 -0
  293. package/dist/components/navigation/index.d.ts.map +1 -0
  294. package/dist/components/navigation/index.js +2 -0
  295. package/dist/components/navigation/index.js.map +1 -0
  296. package/dist/components/navigation/navigation.d.ts +14 -0
  297. package/dist/components/navigation/navigation.d.ts.map +1 -0
  298. package/dist/components/navigation/navigation.js +29 -0
  299. package/dist/components/navigation/navigation.js.map +1 -0
  300. package/dist/components/navigation/navigation.types.d.ts +84 -0
  301. package/dist/components/navigation/navigation.types.d.ts.map +1 -0
  302. package/dist/components/navigation/navigation.types.js +2 -0
  303. package/dist/components/navigation/navigation.types.js.map +1 -0
  304. package/dist/components/page-layout/index.d.ts +3 -0
  305. package/dist/components/page-layout/index.d.ts.map +1 -0
  306. package/dist/components/page-layout/index.js +2 -0
  307. package/dist/components/page-layout/index.js.map +1 -0
  308. package/dist/components/page-layout/page-layout.d.ts +74 -0
  309. package/dist/components/page-layout/page-layout.d.ts.map +1 -0
  310. package/dist/components/page-layout/page-layout.js +103 -0
  311. package/dist/components/page-layout/page-layout.js.map +1 -0
  312. package/dist/components/page-layout/page-layout.types.d.ts +188 -0
  313. package/dist/components/page-layout/page-layout.types.d.ts.map +1 -0
  314. package/dist/components/page-layout/page-layout.types.js +2 -0
  315. package/dist/components/page-layout/page-layout.types.js.map +1 -0
  316. package/dist/components/pagination/index.d.ts +4 -0
  317. package/dist/components/pagination/index.d.ts.map +1 -0
  318. package/dist/components/pagination/index.js +2 -0
  319. package/dist/components/pagination/index.js.map +1 -0
  320. package/dist/components/pagination/pagination.d.ts +24 -0
  321. package/dist/components/pagination/pagination.d.ts.map +1 -0
  322. package/dist/components/pagination/pagination.js +48 -0
  323. package/dist/components/pagination/pagination.js.map +1 -0
  324. package/dist/components/pagination/pagination.types.d.ts +43 -0
  325. package/dist/components/pagination/pagination.types.d.ts.map +1 -0
  326. package/dist/components/pagination/pagination.types.js +2 -0
  327. package/dist/components/pagination/pagination.types.js.map +1 -0
  328. package/dist/components/panel/index.d.ts +3 -0
  329. package/dist/components/panel/index.d.ts.map +1 -0
  330. package/dist/components/panel/index.js +2 -0
  331. package/dist/components/panel/index.js.map +1 -0
  332. package/dist/components/panel/panel.d.ts +14 -0
  333. package/dist/components/panel/panel.d.ts.map +1 -0
  334. package/dist/components/panel/panel.js +22 -0
  335. package/dist/components/panel/panel.js.map +1 -0
  336. package/dist/components/panel/panel.types.d.ts +62 -0
  337. package/dist/components/panel/panel.types.d.ts.map +1 -0
  338. package/dist/components/panel/panel.types.js +2 -0
  339. package/dist/components/panel/panel.types.js.map +1 -0
  340. package/dist/components/popover/index.d.ts +3 -0
  341. package/dist/components/popover/index.d.ts.map +1 -0
  342. package/dist/components/popover/index.js +2 -0
  343. package/dist/components/popover/index.js.map +1 -0
  344. package/dist/components/popover/popover-context.d.ts +29 -0
  345. package/dist/components/popover/popover-context.d.ts.map +1 -0
  346. package/dist/components/popover/popover-context.js +14 -0
  347. package/dist/components/popover/popover-context.js.map +1 -0
  348. package/dist/components/popover/popover.d.ts +8 -0
  349. package/dist/components/popover/popover.d.ts.map +1 -0
  350. package/dist/components/popover/popover.js +60 -0
  351. package/dist/components/popover/popover.js.map +1 -0
  352. package/dist/components/popover/popover.types.d.ts +47 -0
  353. package/dist/components/popover/popover.types.d.ts.map +1 -0
  354. package/dist/components/popover/popover.types.js +2 -0
  355. package/dist/components/popover/popover.types.js.map +1 -0
  356. package/dist/components/progress/index.d.ts +3 -0
  357. package/dist/components/progress/index.d.ts.map +1 -0
  358. package/dist/components/progress/index.js +2 -0
  359. package/dist/components/progress/index.js.map +1 -0
  360. package/dist/components/progress/progress.d.ts +8 -0
  361. package/dist/components/progress/progress.d.ts.map +1 -0
  362. package/dist/components/progress/progress.js +32 -0
  363. package/dist/components/progress/progress.js.map +1 -0
  364. package/dist/components/progress/progress.types.d.ts +36 -0
  365. package/dist/components/progress/progress.types.d.ts.map +1 -0
  366. package/dist/components/progress/progress.types.js +2 -0
  367. package/dist/components/progress/progress.types.js.map +1 -0
  368. package/dist/components/radio/index.d.ts +3 -0
  369. package/dist/components/radio/index.d.ts.map +1 -0
  370. package/dist/components/radio/index.js +2 -0
  371. package/dist/components/radio/index.js.map +1 -0
  372. package/dist/components/radio/radio.d.ts +8 -0
  373. package/dist/components/radio/radio.d.ts.map +1 -0
  374. package/dist/components/radio/radio.js +12 -0
  375. package/dist/components/radio/radio.js.map +1 -0
  376. package/dist/components/radio/radio.types.d.ts +17 -0
  377. package/dist/components/radio/radio.types.d.ts.map +1 -0
  378. package/dist/components/radio/radio.types.js +2 -0
  379. package/dist/components/radio/radio.types.js.map +1 -0
  380. package/dist/components/search-input/index.d.ts +3 -0
  381. package/dist/components/search-input/index.d.ts.map +1 -0
  382. package/dist/components/search-input/index.js +2 -0
  383. package/dist/components/search-input/index.js.map +1 -0
  384. package/dist/components/search-input/search-input.d.ts +8 -0
  385. package/dist/components/search-input/search-input.d.ts.map +1 -0
  386. package/dist/components/search-input/search-input.js +35 -0
  387. package/dist/components/search-input/search-input.js.map +1 -0
  388. package/dist/components/search-input/search-input.types.d.ts +38 -0
  389. package/dist/components/search-input/search-input.types.d.ts.map +1 -0
  390. package/dist/components/search-input/search-input.types.js +2 -0
  391. package/dist/components/search-input/search-input.types.js.map +1 -0
  392. package/dist/components/select/index.d.ts +3 -0
  393. package/dist/components/select/index.d.ts.map +1 -0
  394. package/dist/components/select/index.js +2 -0
  395. package/dist/components/select/index.js.map +1 -0
  396. package/dist/components/select/select.d.ts +8 -0
  397. package/dist/components/select/select.d.ts.map +1 -0
  398. package/dist/components/select/select.js +14 -0
  399. package/dist/components/select/select.js.map +1 -0
  400. package/dist/components/select/select.types.d.ts +27 -0
  401. package/dist/components/select/select.types.d.ts.map +1 -0
  402. package/dist/components/select/select.types.js +2 -0
  403. package/dist/components/select/select.types.js.map +1 -0
  404. package/dist/components/shared.types.d.ts +13 -0
  405. package/dist/components/shared.types.d.ts.map +1 -0
  406. package/dist/components/shared.types.js +2 -0
  407. package/dist/components/shared.types.js.map +1 -0
  408. package/dist/components/skeleton/index.d.ts +3 -0
  409. package/dist/components/skeleton/index.d.ts.map +1 -0
  410. package/dist/components/skeleton/index.js +2 -0
  411. package/dist/components/skeleton/index.js.map +1 -0
  412. package/dist/components/skeleton/skeleton.d.ts +8 -0
  413. package/dist/components/skeleton/skeleton.d.ts.map +1 -0
  414. package/dist/components/skeleton/skeleton.js +12 -0
  415. package/dist/components/skeleton/skeleton.js.map +1 -0
  416. package/dist/components/skeleton/skeleton.types.d.ts +29 -0
  417. package/dist/components/skeleton/skeleton.types.d.ts.map +1 -0
  418. package/dist/components/skeleton/skeleton.types.js +2 -0
  419. package/dist/components/skeleton/skeleton.types.js.map +1 -0
  420. package/dist/components/spinner/index.d.ts +4 -0
  421. package/dist/components/spinner/index.d.ts.map +1 -0
  422. package/dist/components/spinner/index.js +2 -0
  423. package/dist/components/spinner/index.js.map +1 -0
  424. package/dist/components/spinner/spinner.d.ts +8 -0
  425. package/dist/components/spinner/spinner.d.ts.map +1 -0
  426. package/dist/components/spinner/spinner.js +19 -0
  427. package/dist/components/spinner/spinner.js.map +1 -0
  428. package/dist/components/spinner/spinner.types.d.ts +27 -0
  429. package/dist/components/spinner/spinner.types.d.ts.map +1 -0
  430. package/dist/components/spinner/spinner.types.js +2 -0
  431. package/dist/components/spinner/spinner.types.js.map +1 -0
  432. package/dist/components/status-indicator/index.d.ts +4 -0
  433. package/dist/components/status-indicator/index.d.ts.map +1 -0
  434. package/dist/components/status-indicator/index.js +2 -0
  435. package/dist/components/status-indicator/index.js.map +1 -0
  436. package/dist/components/status-indicator/status-indicator.d.ts +8 -0
  437. package/dist/components/status-indicator/status-indicator.d.ts.map +1 -0
  438. package/dist/components/status-indicator/status-indicator.js +12 -0
  439. package/dist/components/status-indicator/status-indicator.js.map +1 -0
  440. package/dist/components/status-indicator/status-indicator.types.d.ts +25 -0
  441. package/dist/components/status-indicator/status-indicator.types.d.ts.map +1 -0
  442. package/dist/components/status-indicator/status-indicator.types.js +2 -0
  443. package/dist/components/status-indicator/status-indicator.types.js.map +1 -0
  444. package/dist/components/switch/index.d.ts +3 -0
  445. package/dist/components/switch/index.d.ts.map +1 -0
  446. package/dist/components/switch/index.js +2 -0
  447. package/dist/components/switch/index.js.map +1 -0
  448. package/dist/components/switch/switch.d.ts +8 -0
  449. package/dist/components/switch/switch.d.ts.map +1 -0
  450. package/dist/components/switch/switch.js +12 -0
  451. package/dist/components/switch/switch.js.map +1 -0
  452. package/dist/components/switch/switch.types.d.ts +17 -0
  453. package/dist/components/switch/switch.types.d.ts.map +1 -0
  454. package/dist/components/switch/switch.types.js +2 -0
  455. package/dist/components/switch/switch.types.js.map +1 -0
  456. package/dist/components/table/index.d.ts +3 -0
  457. package/dist/components/table/index.d.ts.map +1 -0
  458. package/dist/components/table/index.js +2 -0
  459. package/dist/components/table/index.js.map +1 -0
  460. package/dist/components/table/table.d.ts +56 -0
  461. package/dist/components/table/table.d.ts.map +1 -0
  462. package/dist/components/table/table.js +76 -0
  463. package/dist/components/table/table.js.map +1 -0
  464. package/dist/components/table/table.types.d.ts +101 -0
  465. package/dist/components/table/table.types.d.ts.map +1 -0
  466. package/dist/components/table/table.types.js +2 -0
  467. package/dist/components/table/table.types.js.map +1 -0
  468. package/dist/components/tabs/index.d.ts +3 -0
  469. package/dist/components/tabs/index.d.ts.map +1 -0
  470. package/dist/components/tabs/index.js +2 -0
  471. package/dist/components/tabs/index.js.map +1 -0
  472. package/dist/components/tabs/tabs.d.ts +26 -0
  473. package/dist/components/tabs/tabs.d.ts.map +1 -0
  474. package/dist/components/tabs/tabs.js +122 -0
  475. package/dist/components/tabs/tabs.js.map +1 -0
  476. package/dist/components/tabs/tabs.types.d.ts +70 -0
  477. package/dist/components/tabs/tabs.types.d.ts.map +1 -0
  478. package/dist/components/tabs/tabs.types.js +2 -0
  479. package/dist/components/tabs/tabs.types.js.map +1 -0
  480. package/dist/components/textarea/index.d.ts +3 -0
  481. package/dist/components/textarea/index.d.ts.map +1 -0
  482. package/dist/components/textarea/index.js +2 -0
  483. package/dist/components/textarea/index.js.map +1 -0
  484. package/dist/components/textarea/textarea.d.ts +8 -0
  485. package/dist/components/textarea/textarea.d.ts.map +1 -0
  486. package/dist/components/textarea/textarea.js +13 -0
  487. package/dist/components/textarea/textarea.js.map +1 -0
  488. package/dist/components/textarea/textarea.types.d.ts +39 -0
  489. package/dist/components/textarea/textarea.types.d.ts.map +1 -0
  490. package/dist/components/textarea/textarea.types.js +2 -0
  491. package/dist/components/textarea/textarea.types.js.map +1 -0
  492. package/dist/components/toast/index.d.ts +3 -0
  493. package/dist/components/toast/index.d.ts.map +1 -0
  494. package/dist/components/toast/index.js +2 -0
  495. package/dist/components/toast/index.js.map +1 -0
  496. package/dist/components/toast/toast.d.ts +24 -0
  497. package/dist/components/toast/toast.d.ts.map +1 -0
  498. package/dist/components/toast/toast.js +111 -0
  499. package/dist/components/toast/toast.js.map +1 -0
  500. package/dist/components/toast/toast.types.d.ts +103 -0
  501. package/dist/components/toast/toast.types.d.ts.map +1 -0
  502. package/dist/components/toast/toast.types.js +2 -0
  503. package/dist/components/toast/toast.types.js.map +1 -0
  504. package/dist/components/toolbar/index.d.ts +3 -0
  505. package/dist/components/toolbar/index.d.ts.map +1 -0
  506. package/dist/components/toolbar/index.js +2 -0
  507. package/dist/components/toolbar/index.js.map +1 -0
  508. package/dist/components/toolbar/toolbar.d.ts +20 -0
  509. package/dist/components/toolbar/toolbar.d.ts.map +1 -0
  510. package/dist/components/toolbar/toolbar.js +28 -0
  511. package/dist/components/toolbar/toolbar.js.map +1 -0
  512. package/dist/components/toolbar/toolbar.types.d.ts +37 -0
  513. package/dist/components/toolbar/toolbar.types.d.ts.map +1 -0
  514. package/dist/components/toolbar/toolbar.types.js +2 -0
  515. package/dist/components/toolbar/toolbar.types.js.map +1 -0
  516. package/dist/components/tooltip/index.d.ts +3 -0
  517. package/dist/components/tooltip/index.d.ts.map +1 -0
  518. package/dist/components/tooltip/index.js +2 -0
  519. package/dist/components/tooltip/index.js.map +1 -0
  520. package/dist/components/tooltip/tooltip.d.ts +8 -0
  521. package/dist/components/tooltip/tooltip.d.ts.map +1 -0
  522. package/dist/components/tooltip/tooltip.js +84 -0
  523. package/dist/components/tooltip/tooltip.js.map +1 -0
  524. package/dist/components/tooltip/tooltip.types.d.ts +34 -0
  525. package/dist/components/tooltip/tooltip.types.d.ts.map +1 -0
  526. package/dist/components/tooltip/tooltip.types.js +2 -0
  527. package/dist/components/tooltip/tooltip.types.js.map +1 -0
  528. package/dist/components/tree-view/index.d.ts +3 -0
  529. package/dist/components/tree-view/index.d.ts.map +1 -0
  530. package/dist/components/tree-view/index.js +2 -0
  531. package/dist/components/tree-view/index.js.map +1 -0
  532. package/dist/components/tree-view/tree-view.d.ts +9 -0
  533. package/dist/components/tree-view/tree-view.d.ts.map +1 -0
  534. package/dist/components/tree-view/tree-view.js +573 -0
  535. package/dist/components/tree-view/tree-view.js.map +1 -0
  536. package/dist/components/tree-view/tree-view.types.d.ts +92 -0
  537. package/dist/components/tree-view/tree-view.types.d.ts.map +1 -0
  538. package/dist/components/tree-view/tree-view.types.js +2 -0
  539. package/dist/components/tree-view/tree-view.types.js.map +1 -0
  540. package/dist/components/visually-hidden/index.d.ts +3 -0
  541. package/dist/components/visually-hidden/index.d.ts.map +1 -0
  542. package/dist/components/visually-hidden/index.js +2 -0
  543. package/dist/components/visually-hidden/index.js.map +1 -0
  544. package/dist/components/visually-hidden/visually-hidden.d.ts +8 -0
  545. package/dist/components/visually-hidden/visually-hidden.d.ts.map +1 -0
  546. package/dist/components/visually-hidden/visually-hidden.js +12 -0
  547. package/dist/components/visually-hidden/visually-hidden.js.map +1 -0
  548. package/dist/components/visually-hidden/visually-hidden.types.d.ts +9 -0
  549. package/dist/components/visually-hidden/visually-hidden.types.d.ts.map +1 -0
  550. package/dist/components/visually-hidden/visually-hidden.types.js +2 -0
  551. package/dist/components/visually-hidden/visually-hidden.types.js.map +1 -0
  552. package/dist/errors/index.d.ts +2 -0
  553. package/dist/errors/index.d.ts.map +1 -0
  554. package/dist/errors/index.js +2 -0
  555. package/dist/errors/index.js.map +1 -0
  556. package/dist/errors/ui-error.d.ts +60 -0
  557. package/dist/errors/ui-error.d.ts.map +1 -0
  558. package/dist/errors/ui-error.js +219 -0
  559. package/dist/errors/ui-error.js.map +1 -0
  560. package/dist/i18n/i18n.d.ts +52 -0
  561. package/dist/i18n/i18n.d.ts.map +1 -0
  562. package/dist/i18n/i18n.js +156 -0
  563. package/dist/i18n/i18n.js.map +1 -0
  564. package/dist/i18n/index.d.ts +3 -0
  565. package/dist/i18n/index.d.ts.map +1 -0
  566. package/dist/i18n/index.js +3 -0
  567. package/dist/i18n/index.js.map +1 -0
  568. package/dist/icons/icon-names.d.ts +7 -0
  569. package/dist/icons/icon-names.d.ts.map +1 -0
  570. package/dist/icons/icon-names.js +2 -0
  571. package/dist/icons/icon-names.js.map +1 -0
  572. package/dist/icons/icon-registry.d.ts +30 -0
  573. package/dist/icons/icon-registry.d.ts.map +1 -0
  574. package/dist/icons/icon-registry.js +31 -0
  575. package/dist/icons/icon-registry.js.map +1 -0
  576. package/dist/icons/index.d.ts +4 -0
  577. package/dist/icons/index.d.ts.map +1 -0
  578. package/dist/icons/index.js +2 -0
  579. package/dist/icons/index.js.map +1 -0
  580. package/dist/index.d.ts +6 -0
  581. package/dist/index.d.ts.map +1 -0
  582. package/dist/index.js +5 -0
  583. package/dist/index.js.map +1 -0
  584. package/dist/internal/class-names.d.ts +8 -0
  585. package/dist/internal/class-names.d.ts.map +1 -0
  586. package/dist/internal/class-names.js +10 -0
  587. package/dist/internal/class-names.js.map +1 -0
  588. package/dist/internal/menu/index.d.ts +3 -0
  589. package/dist/internal/menu/index.d.ts.map +1 -0
  590. package/dist/internal/menu/index.js +2 -0
  591. package/dist/internal/menu/index.js.map +1 -0
  592. package/dist/internal/menu/menu.d.ts +33 -0
  593. package/dist/internal/menu/menu.d.ts.map +1 -0
  594. package/dist/internal/menu/menu.js +150 -0
  595. package/dist/internal/menu/menu.js.map +1 -0
  596. package/dist/internal/overlay/dismissible-layer.d.ts +38 -0
  597. package/dist/internal/overlay/dismissible-layer.d.ts.map +1 -0
  598. package/dist/internal/overlay/dismissible-layer.js +99 -0
  599. package/dist/internal/overlay/dismissible-layer.js.map +1 -0
  600. package/dist/internal/overlay/document-scroll-lock.d.ts +8 -0
  601. package/dist/internal/overlay/document-scroll-lock.d.ts.map +1 -0
  602. package/dist/internal/overlay/document-scroll-lock.js +58 -0
  603. package/dist/internal/overlay/document-scroll-lock.js.map +1 -0
  604. package/dist/internal/overlay/floating-position.d.ts +46 -0
  605. package/dist/internal/overlay/floating-position.d.ts.map +1 -0
  606. package/dist/internal/overlay/floating-position.js +137 -0
  607. package/dist/internal/overlay/floating-position.js.map +1 -0
  608. package/dist/internal/overlay/index.d.ts +8 -0
  609. package/dist/internal/overlay/index.d.ts.map +1 -0
  610. package/dist/internal/overlay/index.js +6 -0
  611. package/dist/internal/overlay/index.js.map +1 -0
  612. package/dist/internal/overlay/native-modal.d.ts +11 -0
  613. package/dist/internal/overlay/native-modal.d.ts.map +1 -0
  614. package/dist/internal/overlay/native-modal.js +160 -0
  615. package/dist/internal/overlay/native-modal.js.map +1 -0
  616. package/dist/internal/overlay/portal-target.d.ts +19 -0
  617. package/dist/internal/overlay/portal-target.d.ts.map +1 -0
  618. package/dist/internal/overlay/portal-target.js +113 -0
  619. package/dist/internal/overlay/portal-target.js.map +1 -0
  620. package/dist/internal/overlay/top-layer.d.ts +21 -0
  621. package/dist/internal/overlay/top-layer.d.ts.map +1 -0
  622. package/dist/internal/overlay/top-layer.js +51 -0
  623. package/dist/internal/overlay/top-layer.js.map +1 -0
  624. package/dist/internal/use-merged-ref.d.ts +11 -0
  625. package/dist/internal/use-merged-ref.d.ts.map +1 -0
  626. package/dist/internal/use-merged-ref.js +31 -0
  627. package/dist/internal/use-merged-ref.js.map +1 -0
  628. package/dist/internal/use-native-dialog.d.ts +9 -0
  629. package/dist/internal/use-native-dialog.d.ts.map +1 -0
  630. package/dist/internal/use-native-dialog.js +19 -0
  631. package/dist/internal/use-native-dialog.js.map +1 -0
  632. package/dist/runtime/appearance.d.ts +32 -0
  633. package/dist/runtime/appearance.d.ts.map +1 -0
  634. package/dist/runtime/appearance.js +123 -0
  635. package/dist/runtime/appearance.js.map +1 -0
  636. package/dist/styles/components/alert.css +99 -0
  637. package/dist/styles/components/avatar.css +70 -0
  638. package/dist/styles/components/badge.css +101 -0
  639. package/dist/styles/components/breadcrumb.css +65 -0
  640. package/dist/styles/components/button.css +136 -0
  641. package/dist/styles/components/choice.css +120 -0
  642. package/dist/styles/components/combobox.css +200 -0
  643. package/dist/styles/components/confirm-dialog.css +50 -0
  644. package/dist/styles/components/data-table.css +120 -0
  645. package/dist/styles/components/dialog.css +135 -0
  646. package/dist/styles/components/divider.css +27 -0
  647. package/dist/styles/components/drawer.css +160 -0
  648. package/dist/styles/components/dropdown.css +75 -0
  649. package/dist/styles/components/dropzone.css +94 -0
  650. package/dist/styles/components/empty-state.css +85 -0
  651. package/dist/styles/components/file-upload.css +145 -0
  652. package/dist/styles/components/form-field.css +49 -0
  653. package/dist/styles/components/icon.css +53 -0
  654. package/dist/styles/components/inline-message.css +33 -0
  655. package/dist/styles/components/input.css +77 -0
  656. package/dist/styles/components/list.css +132 -0
  657. package/dist/styles/components/loading-overlay.css +24 -0
  658. package/dist/styles/components/menu.css +6 -0
  659. package/dist/styles/components/multi-select.css +68 -0
  660. package/dist/styles/components/navigation.css +116 -0
  661. package/dist/styles/components/page-layout.css +279 -0
  662. package/dist/styles/components/pagination.css +99 -0
  663. package/dist/styles/components/panel.css +123 -0
  664. package/dist/styles/components/popover.css +41 -0
  665. package/dist/styles/components/progress.css +65 -0
  666. package/dist/styles/components/search-input.css +12 -0
  667. package/dist/styles/components/select.css +56 -0
  668. package/dist/styles/components/skeleton.css +93 -0
  669. package/dist/styles/components/spinner.css +27 -0
  670. package/dist/styles/components/status-indicator.css +54 -0
  671. package/dist/styles/components/switch.css +111 -0
  672. package/dist/styles/components/table.css +127 -0
  673. package/dist/styles/components/tabs.css +144 -0
  674. package/dist/styles/components/textarea.css +79 -0
  675. package/dist/styles/components/toast.css +134 -0
  676. package/dist/styles/components/toolbar.css +27 -0
  677. package/dist/styles/components/tooltip.css +32 -0
  678. package/dist/styles/components/tree-view.css +146 -0
  679. package/dist/styles/components.css +45 -0
  680. package/dist/styles/foundation/controls.css +91 -0
  681. package/dist/styles/foundation/density.css +76 -0
  682. package/dist/styles/foundation/icons.css +29 -0
  683. package/dist/styles/foundation/layout.css +150 -0
  684. package/dist/styles/foundation/motion.css +58 -0
  685. package/dist/styles/foundation/surface.css +60 -0
  686. package/dist/styles/foundation/theme.css +166 -0
  687. package/dist/styles/foundation/typography.css +84 -0
  688. package/dist/styles/foundation.css +10 -0
  689. package/dist/styles/miaixz.css +4 -0
  690. package/package.json +304 -0
@@ -0,0 +1,359 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { forwardRef, useCallback, useEffect, useRef, useState } from "react";
3
+ import { createMiaixzUiError } from "../../errors/index.js";
4
+ import { classNames } from "../../internal/class-names.js";
5
+ import { useMiaixzLocale } from "../../i18n/index.js";
6
+ import { Button } from "../button/index.js";
7
+ import { Dropzone } from "../dropzone/index.js";
8
+ import { Icon } from "../icon/index.js";
9
+ import { Progress } from "../progress/index.js";
10
+ const miaixzUploadConcurrency = 3;
11
+ /**
12
+ * Parses recognized HTML accept segments while leaving unknown segments to the browser.
13
+ *
14
+ * @param accept - Comma-separated native accept expression.
15
+ * @returns Runtime rules used for deterministic drag-and-drop validation.
16
+ */
17
+ function parseMiaixzAcceptRules(accept) {
18
+ if (accept === undefined)
19
+ return [];
20
+ const rules = [];
21
+ for (const rawSegment of accept.split(",")) {
22
+ const segment = rawSegment.trim().toLowerCase();
23
+ if (/^\.[^./,\s]+$/.test(segment)) {
24
+ rules.push({ kind: "extension", value: segment });
25
+ }
26
+ else if (/^[a-z0-9!#$&^_.+-]+\/\*$/.test(segment)) {
27
+ rules.push({ kind: "mime-family", value: segment.slice(0, -1) });
28
+ }
29
+ else if (/^[a-z0-9!#$&^_.+-]+\/[a-z0-9!#$&^_.+-]+$/.test(segment)) {
30
+ rules.push({ kind: "mime", value: segment });
31
+ }
32
+ }
33
+ return Object.freeze(rules);
34
+ }
35
+ /**
36
+ * Reports whether one file matches at least one recognized runtime accept rule.
37
+ *
38
+ * @param file - Browser File selected through input or drag-and-drop.
39
+ * @param rules - Parsed recognized accept rules.
40
+ * @returns Whether the file is accepted, including permissive behavior when no rule is recognized.
41
+ */
42
+ function isMiaixzFileAccepted(file, rules) {
43
+ if (rules.length === 0)
44
+ return true;
45
+ const fileName = file.name.toLowerCase();
46
+ const mimeType = file.type.toLowerCase();
47
+ return rules.some((rule) => {
48
+ if (rule.kind === "extension")
49
+ return fileName.endsWith(rule.value);
50
+ if (rule.kind === "mime-family")
51
+ return mimeType.startsWith(rule.value);
52
+ return mimeType === rule.value;
53
+ });
54
+ }
55
+ /**
56
+ * Resolves and validates the frozen maximum-file contract.
57
+ *
58
+ * @param multiple - Whether multiple files are permitted.
59
+ * @param maxFiles - Optional consumer-supplied maximum.
60
+ * @param createError - Localized UI error factory.
61
+ * @returns Effective maximum number of retained files.
62
+ */
63
+ function resolveMiaixzMaximumFiles(multiple, maxFiles, createError) {
64
+ if (!multiple) {
65
+ if (maxFiles !== undefined && maxFiles !== 1)
66
+ throw createError({ maxFiles, multiple });
67
+ return 1;
68
+ }
69
+ const resolved = maxFiles ?? 10;
70
+ if (!Number.isInteger(resolved) || resolved <= 0)
71
+ throw createError({ maxFiles: resolved, multiple });
72
+ return resolved;
73
+ }
74
+ /**
75
+ * Maps an upload state to its frozen built-in translation key.
76
+ *
77
+ * @param status - Current upload lifecycle state.
78
+ * @returns Built-in UI message key for the visible and announced status.
79
+ */
80
+ function getMiaixzUploadStatusKey(status) {
81
+ return `ui.upload.${status}`;
82
+ }
83
+ /**
84
+ * Maps an upload state to a frozen Lucide icon name.
85
+ *
86
+ * @param status - Current upload lifecycle state.
87
+ * @returns Registered icon representing the state without relying on color alone.
88
+ */
89
+ function getMiaixzUploadStatusIcon(status) {
90
+ if (status === "uploading")
91
+ return "LoaderCircle";
92
+ if (status === "success")
93
+ return "CircleCheck";
94
+ if (status === "error")
95
+ return "CircleAlert";
96
+ if (status === "cancelled")
97
+ return "X";
98
+ return "File";
99
+ }
100
+ /**
101
+ * Renders validated uploads with FIFO scheduling and consumer-owned requests.
102
+ *
103
+ * @public
104
+ */
105
+ export const FileUpload = forwardRef(function FileUpload({ accept, multiple = false, maxFiles, maxSizeBytes, disabled = false, label, dropLabel, browseLabel, upload, onFilesChange, onComplete, onError, className, ...props }, ref) {
106
+ const { t } = useMiaixzLocale();
107
+ const [items, setItems] = useState([]);
108
+ const [validationMessages, setValidationMessages] = useState([]);
109
+ const itemsRef = useRef(items);
110
+ const nextIdRef = useRef(0);
111
+ const mountedRef = useRef(true);
112
+ const activeIdsRef = useRef(new Set());
113
+ const controllersRef = useRef(new Map());
114
+ const acceptRules = parseMiaixzAcceptRules(accept);
115
+ /**
116
+ * Creates the frozen invalid maximum-file error with sanitized details.
117
+ *
118
+ * @param details - Non-sensitive configuration values that caused the failure.
119
+ * @returns Localized UI contract error.
120
+ */
121
+ function createMaximumFilesError(details) {
122
+ return createMiaixzUiError(t, {
123
+ code: "UI_FILE_MAX_FILES_INVALID",
124
+ messageKey: "ui.error.file.maxFilesInvalid",
125
+ details,
126
+ });
127
+ }
128
+ const resolvedMaximumFiles = resolveMiaixzMaximumFiles(multiple, maxFiles, createMaximumFilesError);
129
+ if (maxSizeBytes !== undefined && (!Number.isInteger(maxSizeBytes) || maxSizeBytes <= 0)) {
130
+ throw createMiaixzUiError(t, {
131
+ code: "UI_FILE_MAX_SIZE_INVALID",
132
+ messageKey: "ui.error.file.maxSizeInvalid",
133
+ details: { maxSizeBytes },
134
+ });
135
+ }
136
+ /**
137
+ * Commits an immutable item list and optionally publishes its File objects.
138
+ *
139
+ * @param nextItems - Complete replacement item list.
140
+ * @param notify - Whether the frozen onFilesChange condition was met.
141
+ */
142
+ const replaceItems = useCallback((nextItems, notify) => {
143
+ const frozenItems = Object.freeze([...nextItems]);
144
+ itemsRef.current = frozenItems;
145
+ setItems(frozenItems);
146
+ if (notify)
147
+ onFilesChange?.(Object.freeze(frozenItems.map((item) => item.file)));
148
+ }, [onFilesChange]);
149
+ /**
150
+ * Replaces one item by ID while preserving the current list order.
151
+ *
152
+ * @param id - Internal accepted-item identifier.
153
+ * @param update - Pure item transformation.
154
+ * @param notify - Whether to publish the unchanged or changed File list.
155
+ */
156
+ const updateItem = useCallback((id, update, notify = false) => {
157
+ replaceItems(itemsRef.current.map((item) => (item.id === id ? update(item) : item)), notify);
158
+ }, [replaceItems]);
159
+ /**
160
+ * Runs one upload attempt and settles only the matching active item.
161
+ *
162
+ * @param item - Queued item captured when its FIFO slot became available.
163
+ */
164
+ const runUpload = useCallback(async (item) => {
165
+ const controller = new AbortController();
166
+ controllersRef.current.set(item.id, controller);
167
+ let invalidProgressError;
168
+ /**
169
+ * Validates and commits one upload progress report.
170
+ *
171
+ * @param value - Consumer-reported upload percentage.
172
+ */
173
+ function reportProgress(value) {
174
+ if (!Number.isFinite(value) || value < 0 || value > 100) {
175
+ invalidProgressError = createMiaixzUiError(t, {
176
+ code: "UI_UPLOAD_PROGRESS_INVALID",
177
+ messageKey: "ui.error.upload.progressInvalid",
178
+ details: { value },
179
+ });
180
+ throw invalidProgressError;
181
+ }
182
+ if (!mountedRef.current || controller.signal.aborted)
183
+ return;
184
+ updateItem(item.id, (current) => current.status === "uploading" ? { ...current, progress: value } : current);
185
+ }
186
+ const context = Object.freeze({
187
+ signal: controller.signal,
188
+ reportProgress,
189
+ });
190
+ let shouldComplete = false;
191
+ try {
192
+ await upload(item.file, context);
193
+ if (invalidProgressError !== undefined)
194
+ throw invalidProgressError;
195
+ if (!mountedRef.current || controller.signal.aborted)
196
+ return;
197
+ const current = itemsRef.current.find((candidate) => candidate.id === item.id);
198
+ if (current?.status !== "uploading")
199
+ return;
200
+ updateItem(item.id, (candidate) => ({
201
+ ...candidate,
202
+ status: "success",
203
+ progress: 100,
204
+ completed: true,
205
+ }));
206
+ shouldComplete = !current.completed;
207
+ }
208
+ catch (error) {
209
+ if (!mountedRef.current || controller.signal.aborted)
210
+ return;
211
+ const current = itemsRef.current.find((candidate) => candidate.id === item.id);
212
+ if (current?.status !== "uploading")
213
+ return;
214
+ const resolvedError = invalidProgressError ?? error;
215
+ updateItem(item.id, (candidate) => ({ ...candidate, status: "error" }));
216
+ onError?.(item.file, resolvedError);
217
+ }
218
+ finally {
219
+ if (controllersRef.current.get(item.id) === controller) {
220
+ controllersRef.current.delete(item.id);
221
+ activeIdsRef.current.delete(item.id);
222
+ }
223
+ }
224
+ if (shouldComplete && mountedRef.current)
225
+ onComplete?.(item.file);
226
+ }, [onComplete, onError, t, updateItem, upload]);
227
+ useEffect(() => {
228
+ const availableSlots = miaixzUploadConcurrency - activeIdsRef.current.size;
229
+ if (availableSlots <= 0)
230
+ return;
231
+ const queuedItems = itemsRef.current
232
+ .filter((item) => item.status === "queued" && !activeIdsRef.current.has(item.id))
233
+ .slice(0, availableSlots);
234
+ if (queuedItems.length === 0)
235
+ return;
236
+ for (const item of queuedItems)
237
+ activeIdsRef.current.add(item.id);
238
+ const queuedIds = new Set(queuedItems.map((item) => item.id));
239
+ replaceItems(itemsRef.current.map((item) => queuedIds.has(item.id) ? { ...item, status: "uploading" } : item), false);
240
+ for (const item of queuedItems)
241
+ void runUpload(item).catch(() => undefined);
242
+ }, [items, replaceItems, runUpload]);
243
+ useEffect(() => {
244
+ const controllers = controllersRef.current;
245
+ const activeIds = activeIdsRef.current;
246
+ mountedRef.current = true;
247
+ return () => {
248
+ mountedRef.current = false;
249
+ for (const controller of controllers.values())
250
+ controller.abort();
251
+ controllers.clear();
252
+ activeIds.clear();
253
+ };
254
+ }, []);
255
+ /**
256
+ * Creates a localized validation error without retaining file names or content.
257
+ *
258
+ * @param code - Frozen file validation machine code.
259
+ * @param messageKey - Frozen built-in translation key.
260
+ * @param details - Safe size, MIME, or count diagnostics.
261
+ * @returns Localized and sanitized UI error.
262
+ */
263
+ function createValidationError(code, messageKey, details) {
264
+ return createMiaixzUiError(t, { code, messageKey, details });
265
+ }
266
+ /**
267
+ * Validates one selection operation, accepts available files, and reports rejections.
268
+ *
269
+ * @param files - Files selected through the public Dropzone primitive.
270
+ */
271
+ function handleFiles(files) {
272
+ if (disabled)
273
+ return;
274
+ const acceptedItems = [];
275
+ const errors = [];
276
+ for (const file of files) {
277
+ let error;
278
+ if (!isMiaixzFileAccepted(file, acceptRules)) {
279
+ error = createValidationError("UI_FILE_TYPE_NOT_ACCEPTED", "ui.error.file.typeNotAccepted", { accept, mimeType: file.type });
280
+ }
281
+ else if (maxSizeBytes !== undefined && file.size > maxSizeBytes) {
282
+ error = createValidationError("UI_FILE_TOO_LARGE", "ui.error.file.tooLarge", {
283
+ maxSizeBytes,
284
+ sizeBytes: file.size,
285
+ });
286
+ }
287
+ else if (itemsRef.current.length + acceptedItems.length >= resolvedMaximumFiles) {
288
+ error = createValidationError("UI_FILE_COUNT_EXCEEDED", "ui.error.file.countExceeded", {
289
+ maxFiles: resolvedMaximumFiles,
290
+ });
291
+ }
292
+ if (error !== undefined) {
293
+ errors.push(error);
294
+ onError?.(file, error);
295
+ continue;
296
+ }
297
+ nextIdRef.current += 1;
298
+ acceptedItems.push({
299
+ id: `upload-${nextIdRef.current}`,
300
+ file,
301
+ status: "queued",
302
+ progress: 0,
303
+ completed: false,
304
+ });
305
+ }
306
+ setValidationMessages(Object.freeze([...new Set(errors.map((error) => error.message))]));
307
+ if (acceptedItems.length > 0) {
308
+ replaceItems([...itemsRef.current, ...acceptedItems], true);
309
+ }
310
+ }
311
+ /**
312
+ * Cancels one queued or active item while retaining its original File for retry.
313
+ *
314
+ * @param id - Internal accepted-item identifier.
315
+ */
316
+ function handleCancel(id) {
317
+ if (disabled)
318
+ return;
319
+ controllersRef.current.get(id)?.abort();
320
+ controllersRef.current.delete(id);
321
+ activeIdsRef.current.delete(id);
322
+ updateItem(id, (item) => item.status === "queued" || item.status === "uploading"
323
+ ? { ...item, status: "cancelled" }
324
+ : item, true);
325
+ }
326
+ /**
327
+ * Returns one failed or cancelled item to the FIFO queue.
328
+ *
329
+ * @param id - Internal accepted-item identifier.
330
+ */
331
+ function handleRetry(id) {
332
+ if (disabled)
333
+ return;
334
+ setValidationMessages([]);
335
+ updateItem(id, (item) => item.status === "error" || item.status === "cancelled"
336
+ ? { ...item, status: "queued", progress: 0, completed: false }
337
+ : item, true);
338
+ }
339
+ /**
340
+ * Removes one item and aborts any request still associated with it.
341
+ *
342
+ * @param id - Internal accepted-item identifier.
343
+ */
344
+ function handleRemove(id) {
345
+ if (disabled)
346
+ return;
347
+ controllersRef.current.get(id)?.abort();
348
+ controllersRef.current.delete(id);
349
+ activeIdsRef.current.delete(id);
350
+ replaceItems(itemsRef.current.filter((item) => item.id !== id), true);
351
+ }
352
+ return (_jsxs("div", { ...props, ref: ref, role: "group", "aria-label": label, "data-disabled": disabled || undefined, className: classNames("miaixz-file-upload", className), children: [_jsx("span", { className: "miaixz-file-upload-label", children: label }), _jsxs(Dropzone, { ...(accept === undefined ? {} : { accept }), multiple: multiple, disabled: disabled, label: dropLabel, onFiles: handleFiles, children: [_jsx("span", { className: "miaixz-file-upload-drop-label", children: dropLabel }), _jsx("span", { className: "miaixz-file-upload-browse-label", children: browseLabel })] }), validationMessages.length > 0 && (_jsxs("div", { className: "miaixz-file-upload-validation", role: "alert", children: [_jsx(Icon, { name: "CircleAlert", size: "inline" }), _jsx("ul", { className: "miaixz-file-upload-validation-list", children: validationMessages.map((message) => (_jsx("li", { children: message }, message))) })] })), items.length > 0 && (_jsx("ul", { className: "miaixz-file-upload-list", children: items.map((item) => {
353
+ const statusLabel = t(getMiaixzUploadStatusKey(item.status));
354
+ return (_jsxs("li", { "data-state": item.status, className: "miaixz-file-upload-item", children: [_jsx(Icon, { name: getMiaixzUploadStatusIcon(item.status), size: "control", className: "miaixz-file-upload-status-icon" }), _jsxs("div", { className: "miaixz-file-upload-details", children: [_jsx("span", { className: "miaixz-file-upload-name", children: item.file.name }), _jsx("span", { className: "miaixz-file-upload-status", role: "status", children: statusLabel }), item.status === "uploading" && (_jsx(Progress, { value: item.progress, label: `${item.file.name}: ${statusLabel}`, showValue: true }))] }), _jsxs("div", { className: "miaixz-file-upload-actions", children: [(item.status === "queued" || item.status === "uploading") && (_jsx(Button, { variant: "ghost", size: "small", disabled: disabled, startIcon: _jsx(Icon, { name: "X" }), onClick: () => handleCancel(item.id), children: t("ui.action.cancel") })), (item.status === "error" || item.status === "cancelled") && (_jsx(Button, { variant: "ghost", size: "small", disabled: disabled, startIcon: _jsx(Icon, { name: "RotateCcw" }), onClick: () => handleRetry(item.id), children: t("ui.action.retry") })), (item.status === "success" ||
355
+ item.status === "error" ||
356
+ item.status === "cancelled") && (_jsx(Button, { variant: "ghost", size: "small", disabled: disabled, startIcon: _jsx(Icon, { name: "Trash2" }), onClick: () => handleRemove(item.id), children: t("ui.action.remove") }))] })] }, item.id));
357
+ }) }))] }));
358
+ });
359
+ //# sourceMappingURL=file-upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-upload.js","sourceRoot":"","sources":["../../../src/components/file-upload/file-upload.tsx"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, useCallback, useEffect, useRef, useState, type ReactElement } from \"react\";\n\nimport { createMiaixzUiError, type MiaixzUiError } from \"../../errors/index.js\";\nimport { classNames } from \"../../internal/class-names.js\";\nimport { useMiaixzLocale } from \"../../i18n/index.js\";\nimport { Button } from \"../button/index.js\";\nimport { Dropzone } from \"../dropzone/index.js\";\nimport { Icon } from \"../icon/index.js\";\nimport { Progress } from \"../progress/index.js\";\nimport type { FileUploadProps, MiaixzUploadContext } from \"./file-upload.types.js\";\n\nconst miaixzUploadConcurrency = 3;\n\n/**\n * Defines the complete internal upload state machine.\n */\ntype MiaixzUploadStatus = \"queued\" | \"uploading\" | \"success\" | \"error\" | \"cancelled\";\n\n/**\n * Stores one accepted file and its request-independent presentation state.\n */\ninterface MiaixzUploadItem {\n /**\n * Identifies this selection occurrence within one component instance.\n */\n readonly id: string;\n\n /**\n * Retains the original browser File object across cancellation and retry.\n */\n readonly file: File;\n\n /**\n * Indicates the current upload lifecycle state.\n */\n readonly status: MiaixzUploadStatus;\n\n /**\n * Contains the most recently accepted progress percentage.\n */\n readonly progress: number;\n\n /**\n * Prevents duplicate completion callbacks for one accepted item.\n */\n readonly completed: boolean;\n}\n\n/**\n * Represents one recognized runtime accept rule.\n */\ninterface MiaixzAcceptRule {\n /**\n * Identifies the extension, exact MIME, or MIME family matcher.\n */\n readonly kind: \"extension\" | \"mime\" | \"mime-family\";\n\n /**\n * Contains the normalized comparison value.\n */\n readonly value: string;\n}\n\n/**\n * Parses recognized HTML accept segments while leaving unknown segments to the browser.\n *\n * @param accept - Comma-separated native accept expression.\n * @returns Runtime rules used for deterministic drag-and-drop validation.\n */\nfunction parseMiaixzAcceptRules(accept: string | undefined): readonly MiaixzAcceptRule[] {\n if (accept === undefined) return [];\n const rules: MiaixzAcceptRule[] = [];\n for (const rawSegment of accept.split(\",\")) {\n const segment = rawSegment.trim().toLowerCase();\n if (/^\\.[^./,\\s]+$/.test(segment)) {\n rules.push({ kind: \"extension\", value: segment });\n } else if (/^[a-z0-9!#$&^_.+-]+\\/\\*$/.test(segment)) {\n rules.push({ kind: \"mime-family\", value: segment.slice(0, -1) });\n } else if (/^[a-z0-9!#$&^_.+-]+\\/[a-z0-9!#$&^_.+-]+$/.test(segment)) {\n rules.push({ kind: \"mime\", value: segment });\n }\n }\n return Object.freeze(rules);\n}\n\n/**\n * Reports whether one file matches at least one recognized runtime accept rule.\n *\n * @param file - Browser File selected through input or drag-and-drop.\n * @param rules - Parsed recognized accept rules.\n * @returns Whether the file is accepted, including permissive behavior when no rule is recognized.\n */\nfunction isMiaixzFileAccepted(file: File, rules: readonly MiaixzAcceptRule[]): boolean {\n if (rules.length === 0) return true;\n const fileName = file.name.toLowerCase();\n const mimeType = file.type.toLowerCase();\n return rules.some((rule) => {\n if (rule.kind === \"extension\") return fileName.endsWith(rule.value);\n if (rule.kind === \"mime-family\") return mimeType.startsWith(rule.value);\n return mimeType === rule.value;\n });\n}\n\n/**\n * Resolves and validates the frozen maximum-file contract.\n *\n * @param multiple - Whether multiple files are permitted.\n * @param maxFiles - Optional consumer-supplied maximum.\n * @param createError - Localized UI error factory.\n * @returns Effective maximum number of retained files.\n */\nfunction resolveMiaixzMaximumFiles(\n multiple: boolean,\n maxFiles: number | undefined,\n createError: (details: Readonly<Record<string, unknown>>) => MiaixzUiError,\n): number {\n if (!multiple) {\n if (maxFiles !== undefined && maxFiles !== 1) throw createError({ maxFiles, multiple });\n return 1;\n }\n const resolved = maxFiles ?? 10;\n if (!Number.isInteger(resolved) || resolved <= 0)\n throw createError({ maxFiles: resolved, multiple });\n return resolved;\n}\n\n/**\n * Maps an upload state to its frozen built-in translation key.\n *\n * @param status - Current upload lifecycle state.\n * @returns Built-in UI message key for the visible and announced status.\n */\nfunction getMiaixzUploadStatusKey(status: MiaixzUploadStatus): string {\n return `ui.upload.${status}`;\n}\n\n/**\n * Maps an upload state to a frozen Lucide icon name.\n *\n * @param status - Current upload lifecycle state.\n * @returns Registered icon representing the state without relying on color alone.\n */\nfunction getMiaixzUploadStatusIcon(\n status: MiaixzUploadStatus,\n): \"File\" | \"LoaderCircle\" | \"CircleCheck\" | \"CircleAlert\" | \"X\" {\n if (status === \"uploading\") return \"LoaderCircle\";\n if (status === \"success\") return \"CircleCheck\";\n if (status === \"error\") return \"CircleAlert\";\n if (status === \"cancelled\") return \"X\";\n return \"File\";\n}\n\n/**\n * Renders validated uploads with FIFO scheduling and consumer-owned requests.\n *\n * @public\n */\nexport const FileUpload = forwardRef<HTMLDivElement, FileUploadProps>(function FileUpload(\n {\n accept,\n multiple = false,\n maxFiles,\n maxSizeBytes,\n disabled = false,\n label,\n dropLabel,\n browseLabel,\n upload,\n onFilesChange,\n onComplete,\n onError,\n className,\n ...props\n },\n ref,\n): ReactElement {\n const { t } = useMiaixzLocale();\n const [items, setItems] = useState<readonly MiaixzUploadItem[]>([]);\n const [validationMessages, setValidationMessages] = useState<readonly string[]>([]);\n const itemsRef = useRef(items);\n const nextIdRef = useRef(0);\n const mountedRef = useRef(true);\n const activeIdsRef = useRef(new Set<string>());\n const controllersRef = useRef(new Map<string, AbortController>());\n const acceptRules = parseMiaixzAcceptRules(accept);\n\n /**\n * Creates the frozen invalid maximum-file error with sanitized details.\n *\n * @param details - Non-sensitive configuration values that caused the failure.\n * @returns Localized UI contract error.\n */\n function createMaximumFilesError(details: Readonly<Record<string, unknown>>): MiaixzUiError {\n return createMiaixzUiError(t, {\n code: \"UI_FILE_MAX_FILES_INVALID\",\n messageKey: \"ui.error.file.maxFilesInvalid\",\n details,\n });\n }\n\n const resolvedMaximumFiles = resolveMiaixzMaximumFiles(\n multiple,\n maxFiles,\n createMaximumFilesError,\n );\n if (maxSizeBytes !== undefined && (!Number.isInteger(maxSizeBytes) || maxSizeBytes <= 0)) {\n throw createMiaixzUiError(t, {\n code: \"UI_FILE_MAX_SIZE_INVALID\",\n messageKey: \"ui.error.file.maxSizeInvalid\",\n details: { maxSizeBytes },\n });\n }\n\n /**\n * Commits an immutable item list and optionally publishes its File objects.\n *\n * @param nextItems - Complete replacement item list.\n * @param notify - Whether the frozen onFilesChange condition was met.\n */\n const replaceItems = useCallback(\n (nextItems: readonly MiaixzUploadItem[], notify: boolean): void => {\n const frozenItems = Object.freeze([...nextItems]);\n itemsRef.current = frozenItems;\n setItems(frozenItems);\n if (notify) onFilesChange?.(Object.freeze(frozenItems.map((item) => item.file)));\n },\n [onFilesChange],\n );\n\n /**\n * Replaces one item by ID while preserving the current list order.\n *\n * @param id - Internal accepted-item identifier.\n * @param update - Pure item transformation.\n * @param notify - Whether to publish the unchanged or changed File list.\n */\n const updateItem = useCallback(\n (\n id: string,\n update: (item: Readonly<MiaixzUploadItem>) => MiaixzUploadItem,\n notify = false,\n ): void => {\n replaceItems(\n itemsRef.current.map((item) => (item.id === id ? update(item) : item)),\n notify,\n );\n },\n [replaceItems],\n );\n\n /**\n * Runs one upload attempt and settles only the matching active item.\n *\n * @param item - Queued item captured when its FIFO slot became available.\n */\n const runUpload = useCallback(\n async (item: Readonly<MiaixzUploadItem>): Promise<void> => {\n const controller = new AbortController();\n controllersRef.current.set(item.id, controller);\n let invalidProgressError: MiaixzUiError | undefined;\n\n /**\n * Validates and commits one upload progress report.\n *\n * @param value - Consumer-reported upload percentage.\n */\n function reportProgress(value: number): void {\n if (!Number.isFinite(value) || value < 0 || value > 100) {\n invalidProgressError = createMiaixzUiError(t, {\n code: \"UI_UPLOAD_PROGRESS_INVALID\",\n messageKey: \"ui.error.upload.progressInvalid\",\n details: { value },\n });\n throw invalidProgressError;\n }\n if (!mountedRef.current || controller.signal.aborted) return;\n updateItem(item.id, (current) =>\n current.status === \"uploading\" ? { ...current, progress: value } : current,\n );\n }\n\n const context: MiaixzUploadContext = Object.freeze({\n signal: controller.signal,\n reportProgress,\n });\n let shouldComplete = false;\n try {\n await upload(item.file, context);\n if (invalidProgressError !== undefined) throw invalidProgressError;\n if (!mountedRef.current || controller.signal.aborted) return;\n const current = itemsRef.current.find((candidate) => candidate.id === item.id);\n if (current?.status !== \"uploading\") return;\n updateItem(item.id, (candidate) => ({\n ...candidate,\n status: \"success\",\n progress: 100,\n completed: true,\n }));\n shouldComplete = !current.completed;\n } catch (error) {\n if (!mountedRef.current || controller.signal.aborted) return;\n const current = itemsRef.current.find((candidate) => candidate.id === item.id);\n if (current?.status !== \"uploading\") return;\n const resolvedError = invalidProgressError ?? error;\n updateItem(item.id, (candidate) => ({ ...candidate, status: \"error\" }));\n onError?.(item.file, resolvedError);\n } finally {\n if (controllersRef.current.get(item.id) === controller) {\n controllersRef.current.delete(item.id);\n activeIdsRef.current.delete(item.id);\n }\n }\n if (shouldComplete && mountedRef.current) onComplete?.(item.file);\n },\n [onComplete, onError, t, updateItem, upload],\n );\n\n useEffect(() => {\n const availableSlots = miaixzUploadConcurrency - activeIdsRef.current.size;\n if (availableSlots <= 0) return;\n const queuedItems = itemsRef.current\n .filter((item) => item.status === \"queued\" && !activeIdsRef.current.has(item.id))\n .slice(0, availableSlots);\n if (queuedItems.length === 0) return;\n for (const item of queuedItems) activeIdsRef.current.add(item.id);\n const queuedIds = new Set(queuedItems.map((item) => item.id));\n replaceItems(\n itemsRef.current.map((item) =>\n queuedIds.has(item.id) ? { ...item, status: \"uploading\" } : item,\n ),\n false,\n );\n for (const item of queuedItems) void runUpload(item).catch(() => undefined);\n }, [items, replaceItems, runUpload]);\n\n useEffect(() => {\n const controllers = controllersRef.current;\n const activeIds = activeIdsRef.current;\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n for (const controller of controllers.values()) controller.abort();\n controllers.clear();\n activeIds.clear();\n };\n }, []);\n\n /**\n * Creates a localized validation error without retaining file names or content.\n *\n * @param code - Frozen file validation machine code.\n * @param messageKey - Frozen built-in translation key.\n * @param details - Safe size, MIME, or count diagnostics.\n * @returns Localized and sanitized UI error.\n */\n function createValidationError(\n code: \"UI_FILE_TYPE_NOT_ACCEPTED\" | \"UI_FILE_TOO_LARGE\" | \"UI_FILE_COUNT_EXCEEDED\",\n messageKey:\n \"ui.error.file.typeNotAccepted\" | \"ui.error.file.tooLarge\" | \"ui.error.file.countExceeded\",\n details: Readonly<Record<string, unknown>>,\n ): MiaixzUiError {\n return createMiaixzUiError(t, { code, messageKey, details });\n }\n\n /**\n * Validates one selection operation, accepts available files, and reports rejections.\n *\n * @param files - Files selected through the public Dropzone primitive.\n */\n function handleFiles(files: readonly File[]): void {\n if (disabled) return;\n const acceptedItems: MiaixzUploadItem[] = [];\n const errors: MiaixzUiError[] = [];\n for (const file of files) {\n let error: MiaixzUiError | undefined;\n if (!isMiaixzFileAccepted(file, acceptRules)) {\n error = createValidationError(\n \"UI_FILE_TYPE_NOT_ACCEPTED\",\n \"ui.error.file.typeNotAccepted\",\n { accept, mimeType: file.type },\n );\n } else if (maxSizeBytes !== undefined && file.size > maxSizeBytes) {\n error = createValidationError(\"UI_FILE_TOO_LARGE\", \"ui.error.file.tooLarge\", {\n maxSizeBytes,\n sizeBytes: file.size,\n });\n } else if (itemsRef.current.length + acceptedItems.length >= resolvedMaximumFiles) {\n error = createValidationError(\"UI_FILE_COUNT_EXCEEDED\", \"ui.error.file.countExceeded\", {\n maxFiles: resolvedMaximumFiles,\n });\n }\n if (error !== undefined) {\n errors.push(error);\n onError?.(file, error);\n continue;\n }\n nextIdRef.current += 1;\n acceptedItems.push({\n id: `upload-${nextIdRef.current}`,\n file,\n status: \"queued\",\n progress: 0,\n completed: false,\n });\n }\n setValidationMessages(Object.freeze([...new Set(errors.map((error) => error.message))]));\n if (acceptedItems.length > 0) {\n replaceItems([...itemsRef.current, ...acceptedItems], true);\n }\n }\n\n /**\n * Cancels one queued or active item while retaining its original File for retry.\n *\n * @param id - Internal accepted-item identifier.\n */\n function handleCancel(id: string): void {\n if (disabled) return;\n controllersRef.current.get(id)?.abort();\n controllersRef.current.delete(id);\n activeIdsRef.current.delete(id);\n updateItem(\n id,\n (item) =>\n item.status === \"queued\" || item.status === \"uploading\"\n ? { ...item, status: \"cancelled\" }\n : item,\n true,\n );\n }\n\n /**\n * Returns one failed or cancelled item to the FIFO queue.\n *\n * @param id - Internal accepted-item identifier.\n */\n function handleRetry(id: string): void {\n if (disabled) return;\n setValidationMessages([]);\n updateItem(\n id,\n (item) =>\n item.status === \"error\" || item.status === \"cancelled\"\n ? { ...item, status: \"queued\", progress: 0, completed: false }\n : item,\n true,\n );\n }\n\n /**\n * Removes one item and aborts any request still associated with it.\n *\n * @param id - Internal accepted-item identifier.\n */\n function handleRemove(id: string): void {\n if (disabled) return;\n controllersRef.current.get(id)?.abort();\n controllersRef.current.delete(id);\n activeIdsRef.current.delete(id);\n replaceItems(\n itemsRef.current.filter((item) => item.id !== id),\n true,\n );\n }\n\n return (\n <div\n {...props}\n ref={ref}\n role=\"group\"\n aria-label={label}\n data-disabled={disabled || undefined}\n className={classNames(\"miaixz-file-upload\", className)}\n >\n <span className=\"miaixz-file-upload-label\">{label}</span>\n <Dropzone\n {...(accept === undefined ? {} : { accept })}\n multiple={multiple}\n disabled={disabled}\n label={dropLabel}\n onFiles={handleFiles}\n >\n <span className=\"miaixz-file-upload-drop-label\">{dropLabel}</span>\n <span className=\"miaixz-file-upload-browse-label\">{browseLabel}</span>\n </Dropzone>\n\n {validationMessages.length > 0 && (\n <div className=\"miaixz-file-upload-validation\" role=\"alert\">\n <Icon name=\"CircleAlert\" size=\"inline\" />\n <ul className=\"miaixz-file-upload-validation-list\">\n {validationMessages.map((message) => (\n <li key={message}>{message}</li>\n ))}\n </ul>\n </div>\n )}\n\n {items.length > 0 && (\n <ul className=\"miaixz-file-upload-list\">\n {items.map((item) => {\n const statusLabel = t(getMiaixzUploadStatusKey(item.status));\n return (\n <li key={item.id} data-state={item.status} className=\"miaixz-file-upload-item\">\n <Icon\n name={getMiaixzUploadStatusIcon(item.status)}\n size=\"control\"\n className=\"miaixz-file-upload-status-icon\"\n />\n <div className=\"miaixz-file-upload-details\">\n <span className=\"miaixz-file-upload-name\">{item.file.name}</span>\n <span className=\"miaixz-file-upload-status\" role=\"status\">\n {statusLabel}\n </span>\n {item.status === \"uploading\" && (\n <Progress\n value={item.progress}\n label={`${item.file.name}: ${statusLabel}`}\n showValue\n />\n )}\n </div>\n <div className=\"miaixz-file-upload-actions\">\n {(item.status === \"queued\" || item.status === \"uploading\") && (\n <Button\n variant=\"ghost\"\n size=\"small\"\n disabled={disabled}\n startIcon={<Icon name=\"X\" />}\n onClick={() => handleCancel(item.id)}\n >\n {t(\"ui.action.cancel\")}\n </Button>\n )}\n {(item.status === \"error\" || item.status === \"cancelled\") && (\n <Button\n variant=\"ghost\"\n size=\"small\"\n disabled={disabled}\n startIcon={<Icon name=\"RotateCcw\" />}\n onClick={() => handleRetry(item.id)}\n >\n {t(\"ui.action.retry\")}\n </Button>\n )}\n {(item.status === \"success\" ||\n item.status === \"error\" ||\n item.status === \"cancelled\") && (\n <Button\n variant=\"ghost\"\n size=\"small\"\n disabled={disabled}\n startIcon={<Icon name=\"Trash2\" />}\n onClick={() => handleRemove(item.id)}\n >\n {t(\"ui.action.remove\")}\n </Button>\n )}\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n});\n"]}
@@ -0,0 +1,91 @@
1
+ import type { HTMLAttributes } from "react";
2
+ /**
3
+ * Supplies cancellation and progress reporting to one consumer-owned upload request.
4
+ *
5
+ * @public
6
+ */
7
+ export interface MiaixzUploadContext {
8
+ /**
9
+ * Aborts when the file is cancelled, removed, or the component unmounts.
10
+ */
11
+ readonly signal: AbortSignal;
12
+ /**
13
+ * Reports a finite upload percentage from zero through one hundred.
14
+ *
15
+ * @param value - Current upload percentage.
16
+ */
17
+ reportProgress(value: number): void;
18
+ }
19
+ /**
20
+ * Defines the consumer-owned asynchronous request for one file.
21
+ *
22
+ * @public
23
+ */
24
+ export type MiaixzUploadHandler = (file: File, context: MiaixzUploadContext) => Promise<void>;
25
+ /**
26
+ * Defines properties owned by the Miaixz FileUpload contract.
27
+ *
28
+ * @public
29
+ */
30
+ export interface MiaixzFileUploadOwnProps {
31
+ /**
32
+ * Supplies the HTML file accept expression used by native and runtime validation.
33
+ */
34
+ readonly accept?: string;
35
+ /**
36
+ * Allows multiple files to remain in the upload list.
37
+ *
38
+ * @defaultValue `false`
39
+ */
40
+ readonly multiple?: boolean;
41
+ /**
42
+ * Limits accepted files, defaulting to one for single mode and ten for multiple mode.
43
+ */
44
+ readonly maxFiles?: number;
45
+ /**
46
+ * Limits each accepted file to a positive integer byte size.
47
+ */
48
+ readonly maxSizeBytes?: number;
49
+ /**
50
+ * Prevents new file selection and upload actions.
51
+ *
52
+ * @defaultValue `false`
53
+ */
54
+ readonly disabled?: boolean;
55
+ /**
56
+ * Supplies the required localized group label.
57
+ */
58
+ readonly label: string;
59
+ /**
60
+ * Supplies the localized drag-and-drop instruction.
61
+ */
62
+ readonly dropLabel: string;
63
+ /**
64
+ * Supplies the localized file picker action label.
65
+ */
66
+ readonly browseLabel: string;
67
+ /**
68
+ * Performs the consumer-owned network request for each accepted file.
69
+ */
70
+ readonly upload: MiaixzUploadHandler;
71
+ /**
72
+ * Receives the current file list after acceptance, removal, cancellation, or retry.
73
+ */
74
+ readonly onFilesChange?: (files: readonly File[]) => void;
75
+ /**
76
+ * Runs once after each file completes successfully.
77
+ */
78
+ readonly onComplete?: (file: File) => void;
79
+ /**
80
+ * Receives validation and upload failures without exposing server text in the UI.
81
+ */
82
+ readonly onError?: (file: File, error: unknown) => void;
83
+ }
84
+ /**
85
+ * Configures validated, concurrent, request-independent file uploads.
86
+ *
87
+ * @public
88
+ */
89
+ export interface FileUploadProps extends Omit<HTMLAttributes<HTMLDivElement>, keyof MiaixzFileUploadOwnProps>, MiaixzFileUploadOwnProps {
90
+ }
91
+ //# sourceMappingURL=file-upload.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-upload.types.d.ts","sourceRoot":"","sources":["../../../src/components/file-upload/file-upload.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAE7B;;;;OAIG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9F;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAErC;;OAEG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,KAAK,IAAI,CAAC;IAE1D;;OAEG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAE3C;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACzD;AAED;;;;GAIG;AACH,MAAM,WAAW,eACf,SACE,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM,wBAAwB,CAAC,EACpE,wBAAwB;CAAG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=file-upload.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-upload.types.js","sourceRoot":"","sources":["../../../src/components/file-upload/file-upload.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { HTMLAttributes } from \"react\";\n\n/**\n * Supplies cancellation and progress reporting to one consumer-owned upload request.\n *\n * @public\n */\nexport interface MiaixzUploadContext {\n /**\n * Aborts when the file is cancelled, removed, or the component unmounts.\n */\n readonly signal: AbortSignal;\n\n /**\n * Reports a finite upload percentage from zero through one hundred.\n *\n * @param value - Current upload percentage.\n */\n reportProgress(value: number): void;\n}\n\n/**\n * Defines the consumer-owned asynchronous request for one file.\n *\n * @public\n */\nexport type MiaixzUploadHandler = (file: File, context: MiaixzUploadContext) => Promise<void>;\n\n/**\n * Defines properties owned by the Miaixz FileUpload contract.\n *\n * @public\n */\nexport interface MiaixzFileUploadOwnProps {\n /**\n * Supplies the HTML file accept expression used by native and runtime validation.\n */\n readonly accept?: string;\n\n /**\n * Allows multiple files to remain in the upload list.\n *\n * @defaultValue `false`\n */\n readonly multiple?: boolean;\n\n /**\n * Limits accepted files, defaulting to one for single mode and ten for multiple mode.\n */\n readonly maxFiles?: number;\n\n /**\n * Limits each accepted file to a positive integer byte size.\n */\n readonly maxSizeBytes?: number;\n\n /**\n * Prevents new file selection and upload actions.\n *\n * @defaultValue `false`\n */\n readonly disabled?: boolean;\n\n /**\n * Supplies the required localized group label.\n */\n readonly label: string;\n\n /**\n * Supplies the localized drag-and-drop instruction.\n */\n readonly dropLabel: string;\n\n /**\n * Supplies the localized file picker action label.\n */\n readonly browseLabel: string;\n\n /**\n * Performs the consumer-owned network request for each accepted file.\n */\n readonly upload: MiaixzUploadHandler;\n\n /**\n * Receives the current file list after acceptance, removal, cancellation, or retry.\n */\n readonly onFilesChange?: (files: readonly File[]) => void;\n\n /**\n * Runs once after each file completes successfully.\n */\n readonly onComplete?: (file: File) => void;\n\n /**\n * Receives validation and upload failures without exposing server text in the UI.\n */\n readonly onError?: (file: File, error: unknown) => void;\n}\n\n/**\n * Configures validated, concurrent, request-independent file uploads.\n *\n * @public\n */\nexport interface FileUploadProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, keyof MiaixzFileUploadOwnProps>,\n MiaixzFileUploadOwnProps {}\n"]}
@@ -0,0 +1,3 @@
1
+ export { FileUpload } from "./file-upload.js";
2
+ export type { FileUploadProps, MiaixzFileUploadOwnProps, MiaixzUploadContext, MiaixzUploadHandler, } from "./file-upload.types.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/file-upload/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EACV,eAAe,EACf,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { FileUpload } from "./file-upload.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/file-upload/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export { FileUpload } from \"./file-upload.js\";\nexport type {\n FileUploadProps,\n MiaixzFileUploadOwnProps,\n MiaixzUploadContext,\n MiaixzUploadHandler,\n} from \"./file-upload.types.js\";\n"]}
@@ -0,0 +1,11 @@
1
+ import type { FormFieldProps } from "./form-field.types.js";
2
+ /**
3
+ * Connects a form control to its label, description, required state, and error.
4
+ * Generated identifiers preserve accessible relationships without caller setup.
5
+ *
6
+ * @param props - Form-field configuration and native container properties.
7
+ * @returns The connected form-field structure.
8
+ * @public
9
+ */
10
+ export declare function FormField({ label, children, helperText, errorText, optionalText, required, controlId, className, ...props }: FormFieldProps): import("react").JSX.Element;
11
+ //# sourceMappingURL=form-field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-field.d.ts","sourceRoot":"","sources":["../../../src/components/form-field/form-field.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAc5D;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,UAAU,EACV,SAAS,EACT,YAAY,EACZ,QAAgB,EAChB,SAAS,EACT,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,+BAsDhB"}
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cloneElement, useId } from "react";
3
+ import { classNames } from "../../internal/class-names.js";
4
+ /**
5
+ * Combines optional ARIA reference identifiers without empty segments.
6
+ *
7
+ * @param ids - Candidate identifiers in semantic reading order.
8
+ * @returns A space-delimited identifier list or `undefined` when empty.
9
+ */
10
+ function mergeIds(...ids) {
11
+ const value = ids.filter(Boolean).join(" ");
12
+ return value || undefined;
13
+ }
14
+ /* eslint-disable jsdoc/check-param-names, jsdoc/require-param -- TSDoc documents the typed properties instead of dotted parameter names. */
15
+ /**
16
+ * Connects a form control to its label, description, required state, and error.
17
+ * Generated identifiers preserve accessible relationships without caller setup.
18
+ *
19
+ * @param props - Form-field configuration and native container properties.
20
+ * @returns The connected form-field structure.
21
+ * @public
22
+ */
23
+ export function FormField({ label, children, helperText, errorText, optionalText, required = false, controlId, className, ...props }) {
24
+ const generatedId = useId();
25
+ const id = controlId ?? children.props.id ?? `miaixz-field-${generatedId}`;
26
+ const helperId = helperText ? `${id}-helper` : undefined;
27
+ const errorId = errorText ? `${id}-error` : undefined;
28
+ const describedBy = mergeIds(children.props["aria-describedby"], helperId, errorId);
29
+ const isRequired = required || Boolean(children.props.required);
30
+ const isInvalid = Boolean(errorText) || Boolean(children.props.invalid);
31
+ const ariaInvalid = errorText ? true : children.props["aria-invalid"];
32
+ const control = cloneElement(children, {
33
+ id,
34
+ ...(isRequired ? { required: true } : {}),
35
+ ...(isInvalid ? { invalid: true } : {}),
36
+ ...(ariaInvalid === undefined ? {} : { "aria-invalid": ariaInvalid }),
37
+ ...(describedBy === undefined ? {} : { "aria-describedby": describedBy }),
38
+ });
39
+ return (_jsxs("div", { ...props, className: classNames("miaixz-form-field", Boolean(errorText) && "miaixz-form-field-invalid", className), "data-invalid": Boolean(errorText) || undefined, children: [_jsxs("div", { className: "miaixz-form-field-label-row", children: [_jsxs("label", { className: "miaixz-form-field-label", htmlFor: id, children: [label, required && (_jsx("span", { className: "miaixz-form-field-required", "aria-hidden": "true", children: "*" }))] }), !required && optionalText && (_jsx("span", { className: "miaixz-form-field-optional", children: optionalText }))] }), control, helperText && (_jsx("div", { id: helperId, className: "miaixz-form-field-helper", children: helperText })), errorText && (_jsx("div", { id: errorId, className: "miaixz-form-field-error", role: "alert", children: errorText }))] }));
40
+ }
41
+ //# sourceMappingURL=form-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-field.js","sourceRoot":"","sources":["../../../src/components/form-field/form-field.tsx"],"names":[],"mappings":"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","sourcesContent":["import { cloneElement, useId } from \"react\";\n\nimport { classNames } from \"../../internal/class-names.js\";\nimport type { FormFieldProps } from \"./form-field.types.js\";\n\n/**\n * Combines optional ARIA reference identifiers without empty segments.\n *\n * @param ids - Candidate identifiers in semantic reading order.\n * @returns A space-delimited identifier list or `undefined` when empty.\n */\nfunction mergeIds(...ids: ReadonlyArray<string | undefined>): string | undefined {\n const value = ids.filter(Boolean).join(\" \");\n return value || undefined;\n}\n\n/* eslint-disable jsdoc/check-param-names, jsdoc/require-param -- TSDoc documents the typed properties instead of dotted parameter names. */\n/**\n * Connects a form control to its label, description, required state, and error.\n * Generated identifiers preserve accessible relationships without caller setup.\n *\n * @param props - Form-field configuration and native container properties.\n * @returns The connected form-field structure.\n * @public\n */\nexport function FormField({\n label,\n children,\n helperText,\n errorText,\n optionalText,\n required = false,\n controlId,\n className,\n ...props\n}: FormFieldProps) {\n const generatedId = useId();\n const id = controlId ?? children.props.id ?? `miaixz-field-${generatedId}`;\n const helperId = helperText ? `${id}-helper` : undefined;\n const errorId = errorText ? `${id}-error` : undefined;\n const describedBy = mergeIds(children.props[\"aria-describedby\"], helperId, errorId);\n const isRequired = required || Boolean(children.props.required);\n const isInvalid = Boolean(errorText) || Boolean(children.props.invalid);\n const ariaInvalid = errorText ? true : children.props[\"aria-invalid\"];\n\n const control = cloneElement(children, {\n id,\n ...(isRequired ? { required: true } : {}),\n ...(isInvalid ? { invalid: true } : {}),\n ...(ariaInvalid === undefined ? {} : { \"aria-invalid\": ariaInvalid }),\n ...(describedBy === undefined ? {} : { \"aria-describedby\": describedBy }),\n });\n\n return (\n <div\n {...props}\n className={classNames(\n \"miaixz-form-field\",\n Boolean(errorText) && \"miaixz-form-field-invalid\",\n className,\n )}\n data-invalid={Boolean(errorText) || undefined}\n >\n <div className=\"miaixz-form-field-label-row\">\n <label className=\"miaixz-form-field-label\" htmlFor={id}>\n {label}\n {required && (\n <span className=\"miaixz-form-field-required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n {!required && optionalText && (\n <span className=\"miaixz-form-field-optional\">{optionalText}</span>\n )}\n </div>\n {control}\n {helperText && (\n <div id={helperId} className=\"miaixz-form-field-helper\">\n {helperText}\n </div>\n )}\n {errorText && (\n <div id={errorId} className=\"miaixz-form-field-error\" role=\"alert\">\n {errorText}\n </div>\n )}\n </div>\n );\n}\n/* eslint-enable jsdoc/check-param-names, jsdoc/require-param */\n"]}