@stackcraftmx/calcita 0.0.0-stage → 0.25.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 (900) hide show
  1. package/LICENSE +110 -0
  2. package/README.md +700 -2
  3. package/cli/askQuestions.js +63 -0
  4. package/cli/calcita.js +150 -0
  5. package/cli/makeComponent.js +50 -0
  6. package/cli/makeForm.js +68 -0
  7. package/cli/makeModule.js +78 -0
  8. package/cli/makePage.js +62 -0
  9. package/cli/names.js +64 -0
  10. package/cli/newProject.js +103 -0
  11. package/cli/packageVersions.js +38 -0
  12. package/cli/projectAnswers.js +145 -0
  13. package/cli/projectConfig.js +38 -0
  14. package/cli/projectFiles.js +128 -0
  15. package/cli/screenLabels.js +41 -0
  16. package/cli/templateFiles.js +186 -0
  17. package/cli/templates/component/core/__ComponentName__.jsx.tpl +23 -0
  18. package/cli/templates/component/module/__ComponentName__.jsx.tpl +21 -0
  19. package/cli/templates/form/formik/__FormName__.jsx.tpl +50 -0
  20. package/cli/templates/form/hookForm/__FormName__.jsx.tpl +53 -0
  21. package/cli/templates/form/shared/__formName__Schema.js.tpl +20 -0
  22. package/cli/templates/form/shared/__formName__Texts.js.tpl +6 -0
  23. package/cli/templates/module/__Name__Page.jsx.tpl +75 -0
  24. package/cli/templates/module/__name__Api.js.tpl +39 -0
  25. package/cli/templates/module/__name__Texts.js.tpl +27 -0
  26. package/cli/templates/module/menu.js.tpl +21 -0
  27. package/cli/templates/module/routes.js.tpl +7 -0
  28. package/cli/templates/moduleServer/__name__Server.js.tpl +68 -0
  29. package/cli/templates/page/__PageName__Page.jsx.tpl +22 -0
  30. package/cli/templates/page/__pageName__PageTexts.js.tpl +23 -0
  31. package/cli/templates/project/README.md.tpl +83 -0
  32. package/cli/templates/project/dot-gitignore.tpl +11 -0
  33. package/cli/templates/project/index.html.tpl +20 -0
  34. package/cli/templates/project/jsconfig.json.tpl +16 -0
  35. package/cli/templates/project/pnpm-workspace.yaml.tpl +5 -0
  36. package/cli/templates/project/public/favicon.svg +1 -0
  37. package/cli/templates/project/public/icons/apple-touch-icon.png +0 -0
  38. package/cli/templates/project/public/icons/icon-192.png +0 -0
  39. package/cli/templates/project/public/icons/icon-512-maskable.png +0 -0
  40. package/cli/templates/project/public/icons/icon-512.png +0 -0
  41. package/cli/templates/project/public/manifest.webmanifest.tpl +17 -0
  42. package/cli/templates/project/src/app/AppProviders.jsx.tpl +107 -0
  43. package/cli/templates/project/src/app/AppShell.jsx.tpl +87 -0
  44. package/cli/templates/project/src/app/appRouter.jsx.tpl +51 -0
  45. package/cli/templates/project/src/app/appSettings.js.tpl +27 -0
  46. package/cli/templates/project/src/app/appTexts.js.tpl +15 -0
  47. package/cli/templates/project/src/app/combineTexts.js.tpl +31 -0
  48. package/cli/templates/project/src/app/i18n.js.tpl +19 -0
  49. package/cli/templates/project/src/app/shellTexts.js.tpl +16 -0
  50. package/cli/templates/project/src/core/AppLogo.jsx.tpl +14 -0
  51. package/cli/templates/project/src/core/accountConnector.js.tpl +36 -0
  52. package/cli/templates/project/src/core/apiClient.js.tpl +15 -0
  53. package/cli/templates/project/src/core/appPaths.js.tpl +11 -0
  54. package/cli/templates/project/src/core/index.js.tpl +9 -0
  55. package/cli/templates/project/src/core/publicPaths.js.tpl +24 -0
  56. package/cli/templates/project/src/fakeServer/networkDelay.js.tpl +40 -0
  57. package/cli/templates/project/src/fakeServer/serverText.js.tpl +20 -0
  58. package/cli/templates/project/src/main.jsx.tpl +24 -0
  59. package/cli/templates/project/src/modules/auth/ForgotPasswordPage.jsx.tpl +14 -0
  60. package/cli/templates/project/src/modules/auth/ResetPasswordPage.jsx.tpl +15 -0
  61. package/cli/templates/project/src/modules/auth/SignInPage.jsx.tpl +29 -0
  62. package/cli/templates/project/src/modules/auth/authTexts.js.tpl +6 -0
  63. package/cli/templates/project/src/modules/auth/routes.js.tpl +11 -0
  64. package/cli/templates/project/src/modules/home/HomePage.jsx.tpl +38 -0
  65. package/cli/templates/project/src/modules/home/homeTexts.js.tpl +29 -0
  66. package/cli/templates/project/src/modules/home/menu.js.tpl +17 -0
  67. package/cli/templates/project/src/modules/home/routes.js.tpl +4 -0
  68. package/cli/templates/project/src/modules/profile/ProfilePage.jsx.tpl +13 -0
  69. package/cli/templates/project/src/modules/profile/routes.js.tpl +6 -0
  70. package/cli/templates/project/vite.config.js.tpl +53 -0
  71. package/dist/DataTable/AuditTrailDialog.js +40 -0
  72. package/dist/DataTable/AuditTrailDialog.js.map +1 -0
  73. package/dist/DataTable/AuditTrailTable.js +89 -0
  74. package/dist/DataTable/AuditTrailTable.js.map +1 -0
  75. package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js +71 -0
  76. package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js.map +1 -0
  77. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js +51 -0
  78. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js.map +1 -0
  79. package/dist/DataTable/ColumnFilters/SortableFilterHeader.js +54 -0
  80. package/dist/DataTable/ColumnFilters/SortableFilterHeader.js.map +1 -0
  81. package/dist/DataTable/ColumnFilters/TextColumnFilter.js +24 -0
  82. package/dist/DataTable/ColumnFilters/TextColumnFilter.js.map +1 -0
  83. package/dist/DataTable/EmptyState.js +22 -0
  84. package/dist/DataTable/EmptyState.js.map +1 -0
  85. package/dist/DataTable/FilterChips.js +39 -0
  86. package/dist/DataTable/FilterChips.js.map +1 -0
  87. package/dist/DataTable/GoToPage.js +63 -0
  88. package/dist/DataTable/GoToPage.js.map +1 -0
  89. package/dist/DataTable/ServerTable.js +477 -0
  90. package/dist/DataTable/ServerTable.js.map +1 -0
  91. package/dist/DataTable/buildChipConfig.js +27 -0
  92. package/dist/DataTable/buildChipConfig.js.map +1 -0
  93. package/dist/DataTable/columns.js +122 -0
  94. package/dist/DataTable/columns.js.map +1 -0
  95. package/dist/DataTable/filterContext.js +15 -0
  96. package/dist/DataTable/filterContext.js.map +1 -0
  97. package/dist/DataTable/rowSelection.js +61 -0
  98. package/dist/DataTable/rowSelection.js.map +1 -0
  99. package/dist/DataTable/serverTableParams.js +19 -0
  100. package/dist/DataTable/serverTableParams.js.map +1 -0
  101. package/dist/DataTable/tableMachine.js +87 -0
  102. package/dist/DataTable/tableMachine.js.map +1 -0
  103. package/dist/DataTable/useDebouncedFilter.js +29 -0
  104. package/dist/DataTable/useDebouncedFilter.js.map +1 -0
  105. package/dist/DataTable/useTableState.js +132 -0
  106. package/dist/DataTable/useTableState.js.map +1 -0
  107. package/dist/access/Can.js +9 -0
  108. package/dist/access/Can.js.map +1 -0
  109. package/dist/access/PermissionMatrix.js +84 -0
  110. package/dist/access/PermissionMatrix.js.map +1 -0
  111. package/dist/access/RequireAccess.js +14 -0
  112. package/dist/access/RequireAccess.js.map +1 -0
  113. package/dist/access/accessRules.js +49 -0
  114. package/dist/access/accessRules.js.map +1 -0
  115. package/dist/access/permissionGroups.js +43 -0
  116. package/dist/access/permissionGroups.js.map +1 -0
  117. package/dist/access/useCan.js +12 -0
  118. package/dist/access/useCan.js.map +1 -0
  119. package/dist/account/AccountProvider.js +58 -0
  120. package/dist/account/AccountProvider.js.map +1 -0
  121. package/dist/account/AccountSecuritySection.js +81 -0
  122. package/dist/account/AccountSecuritySection.js.map +1 -0
  123. package/dist/account/DemoTotpCodeButton.js +26 -0
  124. package/dist/account/DemoTotpCodeButton.js.map +1 -0
  125. package/dist/account/ForgotPasswordScreen.js +27 -0
  126. package/dist/account/ForgotPasswordScreen.js.map +1 -0
  127. package/dist/account/ProfileScreen.js +134 -0
  128. package/dist/account/ProfileScreen.js.map +1 -0
  129. package/dist/account/ResetPasswordScreen.js +58 -0
  130. package/dist/account/ResetPasswordScreen.js.map +1 -0
  131. package/dist/account/SignInScreen.js +102 -0
  132. package/dist/account/SignInScreen.js.map +1 -0
  133. package/dist/account/accountConnector.js +31 -0
  134. package/dist/account/accountConnector.js.map +1 -0
  135. package/dist/account/demo/createDemoAccountConnector.js +368 -0
  136. package/dist/account/demo/createDemoAccountConnector.js.map +1 -0
  137. package/dist/account/demo/totp.js +61 -0
  138. package/dist/account/demo/totp.js.map +1 -0
  139. package/dist/account/restAccountConnector.js +118 -0
  140. package/dist/account/restAccountConnector.js.map +1 -0
  141. package/dist/account-demo.js +12 -0
  142. package/dist/account-demo.js.map +1 -0
  143. package/dist/account.js +25 -0
  144. package/dist/account.js.map +1 -0
  145. package/dist/adapters/i18next.js +7 -0
  146. package/dist/adapters/i18next.js.map +1 -0
  147. package/dist/adapters/nextNavigation.js +36 -0
  148. package/dist/adapters/nextNavigation.js.map +1 -0
  149. package/dist/adapters/reactRouter.js +7 -0
  150. package/dist/adapters/reactRouter.js.map +1 -0
  151. package/dist/adapters/reactRouterRoutes.js +49 -0
  152. package/dist/adapters/reactRouterRoutes.js.map +1 -0
  153. package/dist/api/ApiError.js +58 -0
  154. package/dist/api/ApiError.js.map +1 -0
  155. package/dist/api/createApiClient.js +256 -0
  156. package/dist/api/createApiClient.js.map +1 -0
  157. package/dist/api/staleChunks.js +47 -0
  158. package/dist/api/staleChunks.js.map +1 -0
  159. package/dist/appShell/AccountMenu.js +86 -0
  160. package/dist/appShell/AccountMenu.js.map +1 -0
  161. package/dist/appShell/AppLayout.js +513 -0
  162. package/dist/appShell/AppLayout.js.map +1 -0
  163. package/dist/appShell/AppearanceSettings.js +116 -0
  164. package/dist/appShell/AppearanceSettings.js.map +1 -0
  165. package/dist/appShell/AuthLayout.js +46 -0
  166. package/dist/appShell/AuthLayout.js.map +1 -0
  167. package/dist/appShell/BarActionButton.js +31 -0
  168. package/dist/appShell/BarActionButton.js.map +1 -0
  169. package/dist/appShell/BarActions.js +105 -0
  170. package/dist/appShell/BarActions.js.map +1 -0
  171. package/dist/appShell/BarCapsule.js +50 -0
  172. package/dist/appShell/BarCapsule.js.map +1 -0
  173. package/dist/appShell/BarSearch.js +92 -0
  174. package/dist/appShell/BarSearch.js.map +1 -0
  175. package/dist/appShell/HeaderTools.js +53 -0
  176. package/dist/appShell/HeaderTools.js.map +1 -0
  177. package/dist/appShell/MobileTabBar.js +348 -0
  178. package/dist/appShell/MobileTabBar.js.map +1 -0
  179. package/dist/appShell/SettingsMenu.js +41 -0
  180. package/dist/appShell/SettingsMenu.js.map +1 -0
  181. package/dist/appShell/SideMenu.js +217 -0
  182. package/dist/appShell/SideMenu.js.map +1 -0
  183. package/dist/appShell/SideMenuEntry.js +140 -0
  184. package/dist/appShell/SideMenuEntry.js.map +1 -0
  185. package/dist/appShell/SubmenuActionsMenu.js +71 -0
  186. package/dist/appShell/SubmenuActionsMenu.js.map +1 -0
  187. package/dist/appShell/TabBarEditor.js +55 -0
  188. package/dist/appShell/TabBarEditor.js.map +1 -0
  189. package/dist/appShell/TopMenu.js +80 -0
  190. package/dist/appShell/TopMenu.js.map +1 -0
  191. package/dist/appShell/appMenuContext.js +11 -0
  192. package/dist/appShell/appMenuContext.js.map +1 -0
  193. package/dist/appShell/barActionsSlot.js +26 -0
  194. package/dist/appShell/barActionsSlot.js.map +1 -0
  195. package/dist/appShell/barMenuPlacement.js +33 -0
  196. package/dist/appShell/barMenuPlacement.js.map +1 -0
  197. package/dist/appShell/menuItemText.js +33 -0
  198. package/dist/appShell/menuItemText.js.map +1 -0
  199. package/dist/appShell/pageTitle.js +45 -0
  200. package/dist/appShell/pageTitle.js.map +1 -0
  201. package/dist/appShell/shellSizes.js +40 -0
  202. package/dist/appShell/shellSizes.js.map +1 -0
  203. package/dist/appShell/tabBarRule.js +12 -0
  204. package/dist/appShell/tabBarRule.js.map +1 -0
  205. package/dist/appShell/tabBarScroll.js +23 -0
  206. package/dist/appShell/tabBarScroll.js.map +1 -0
  207. package/dist/appShell/useDrawerCollapsed.js +29 -0
  208. package/dist/appShell/useDrawerCollapsed.js.map +1 -0
  209. package/dist/appShell/useFittingActionCount.js +45 -0
  210. package/dist/appShell/useFittingActionCount.js.map +1 -0
  211. package/dist/appShell/usePinnedMobileTabs.js +32 -0
  212. package/dist/appShell/usePinnedMobileTabs.js.map +1 -0
  213. package/dist/appShell/useTabBarMinimized.js +33 -0
  214. package/dist/appShell/useTabBarMinimized.js.map +1 -0
  215. package/dist/auth/PasswordChecklist.js +44 -0
  216. package/dist/auth/PasswordChecklist.js.map +1 -0
  217. package/dist/auth/passwordRules.js +43 -0
  218. package/dist/auth/passwordRules.js.map +1 -0
  219. package/dist/calendar/EventCalendar.js +149 -0
  220. package/dist/calendar/EventCalendar.js.map +1 -0
  221. package/dist/calendar/EventDetails.js +74 -0
  222. package/dist/calendar/EventDetails.js.map +1 -0
  223. package/dist/calendar/calendarEvents.js +31 -0
  224. package/dist/calendar/calendarEvents.js.map +1 -0
  225. package/dist/calendar.js +13 -0
  226. package/dist/calendar.js.map +1 -0
  227. package/dist/charts.js +16 -0
  228. package/dist/charts.js.map +1 -0
  229. package/dist/date-pickers.js +8 -0
  230. package/dist/date-pickers.js.map +1 -0
  231. package/dist/datePickers/DateInput.js +76 -0
  232. package/dist/datePickers/DateInput.js.map +1 -0
  233. package/dist/datePickers/FormDateField.js +12 -0
  234. package/dist/datePickers/FormDateField.js.map +1 -0
  235. package/dist/dates.js +25 -0
  236. package/dist/dates.js.map +1 -0
  237. package/dist/dictionaries/dictionaries.js +48 -0
  238. package/dist/dictionaries/dictionaries.js.map +1 -0
  239. package/dist/downloads/DownloadManager.js +195 -0
  240. package/dist/downloads/DownloadManager.js.map +1 -0
  241. package/dist/downloads/downloadQueue.js +56 -0
  242. package/dist/downloads/downloadQueue.js.map +1 -0
  243. package/dist/downloads/downloadsMachine.js +80 -0
  244. package/dist/downloads/downloadsMachine.js.map +1 -0
  245. package/dist/downloads/fileTypes.js +22 -0
  246. package/dist/downloads/fileTypes.js.map +1 -0
  247. package/dist/excel/reportWorkbook.js +299 -0
  248. package/dist/excel/reportWorkbook.js.map +1 -0
  249. package/dist/excel.js +13 -0
  250. package/dist/excel.js.map +1 -0
  251. package/dist/feedback/ConfirmDialog.js +73 -0
  252. package/dist/feedback/ConfirmDialog.js.map +1 -0
  253. package/dist/feedback/ModalWaiting.js +23 -0
  254. package/dist/feedback/ModalWaiting.js.map +1 -0
  255. package/dist/feedback/NewBuildNotice.js +79 -0
  256. package/dist/feedback/NewBuildNotice.js.map +1 -0
  257. package/dist/feedback/StaleBuildBoundary.js +36 -0
  258. package/dist/feedback/StaleBuildBoundary.js.map +1 -0
  259. package/dist/feedback/Toaster.js +20 -0
  260. package/dist/feedback/Toaster.js.map +1 -0
  261. package/dist/feedback/confirmActionMachine.js +67 -0
  262. package/dist/feedback/confirmActionMachine.js.map +1 -0
  263. package/dist/feedback/toast.js +88 -0
  264. package/dist/feedback/toast.js.map +1 -0
  265. package/dist/feedback/useConfirmAction.js +40 -0
  266. package/dist/feedback/useConfirmAction.js.map +1 -0
  267. package/dist/filepond/FileDropzone.js +256 -0
  268. package/dist/filepond/FileDropzone.js.map +1 -0
  269. package/dist/filepond/pondServer.js +48 -0
  270. package/dist/filepond/pondServer.js.map +1 -0
  271. package/dist/filepond.js +10 -0
  272. package/dist/filepond.js.map +1 -0
  273. package/dist/files.js +43 -0
  274. package/dist/files.js.map +1 -0
  275. package/dist/formatting.js +205 -0
  276. package/dist/formatting.js.map +1 -0
  277. package/dist/forms/FormCatalogField.js +12 -0
  278. package/dist/forms/FormCatalogField.js.map +1 -0
  279. package/dist/forms/FormColorField.js +12 -0
  280. package/dist/forms/FormColorField.js.map +1 -0
  281. package/dist/forms/FormNumberField.js +12 -0
  282. package/dist/forms/FormNumberField.js.map +1 -0
  283. package/dist/forms/FormProblemAlert.js +15 -0
  284. package/dist/forms/FormProblemAlert.js.map +1 -0
  285. package/dist/forms/FormSelectField.js +12 -0
  286. package/dist/forms/FormSelectField.js.map +1 -0
  287. package/dist/forms/FormServerProblem.js +23 -0
  288. package/dist/forms/FormServerProblem.js.map +1 -0
  289. package/dist/forms/FormTextField.js +12 -0
  290. package/dist/forms/FormTextField.js.map +1 -0
  291. package/dist/forms/FormWizard.js +63 -0
  292. package/dist/forms/FormWizard.js.map +1 -0
  293. package/dist/forms/SubmitButton.js +14 -0
  294. package/dist/forms/SubmitButton.js.map +1 -0
  295. package/dist/forms/applyServerProblem.js +15 -0
  296. package/dist/forms/applyServerProblem.js.map +1 -0
  297. package/dist/forms/auth/ChangePasswordForm.js +47 -0
  298. package/dist/forms/auth/ChangePasswordForm.js.map +1 -0
  299. package/dist/forms/auth/ForgotPasswordForm.js +50 -0
  300. package/dist/forms/auth/ForgotPasswordForm.js.map +1 -0
  301. package/dist/forms/auth/SignInForm.js +48 -0
  302. package/dist/forms/auth/SignInForm.js.map +1 -0
  303. package/dist/forms/security/SecondStepForm.js +122 -0
  304. package/dist/forms/security/SecondStepForm.js.map +1 -0
  305. package/dist/forms/security/TwoStepVerificationCard.js +338 -0
  306. package/dist/forms/security/TwoStepVerificationCard.js.map +1 -0
  307. package/dist/forms/security/securityRules.js +28 -0
  308. package/dist/forms/security/securityRules.js.map +1 -0
  309. package/dist/forms/serverProblemFields.js +25 -0
  310. package/dist/forms/serverProblemFields.js.map +1 -0
  311. package/dist/forms/useFormikField.js +16 -0
  312. package/dist/forms/useFormikField.js.map +1 -0
  313. package/dist/forms/validation.js +55 -0
  314. package/dist/forms/validation.js.map +1 -0
  315. package/dist/forms/validationMessages.js +16 -0
  316. package/dist/forms/validationMessages.js.map +1 -0
  317. package/dist/forms.js +57 -0
  318. package/dist/forms.js.map +1 -0
  319. package/dist/hookForm/FormCatalogField.js +12 -0
  320. package/dist/hookForm/FormCatalogField.js.map +1 -0
  321. package/dist/hookForm/FormColorField.js +12 -0
  322. package/dist/hookForm/FormColorField.js.map +1 -0
  323. package/dist/hookForm/FormNumberField.js +12 -0
  324. package/dist/hookForm/FormNumberField.js.map +1 -0
  325. package/dist/hookForm/FormProblemAlert.js +17 -0
  326. package/dist/hookForm/FormProblemAlert.js.map +1 -0
  327. package/dist/hookForm/FormSelectField.js +12 -0
  328. package/dist/hookForm/FormSelectField.js.map +1 -0
  329. package/dist/hookForm/FormTextField.js +12 -0
  330. package/dist/hookForm/FormTextField.js.map +1 -0
  331. package/dist/hookForm/FormWizard.js +59 -0
  332. package/dist/hookForm/FormWizard.js.map +1 -0
  333. package/dist/hookForm/SubmitButton.js +15 -0
  334. package/dist/hookForm/SubmitButton.js.map +1 -0
  335. package/dist/hookForm/applyServerProblem.js +21 -0
  336. package/dist/hookForm/applyServerProblem.js.map +1 -0
  337. package/dist/hookForm/useHookFormField.js +19 -0
  338. package/dist/hookForm/useHookFormField.js.map +1 -0
  339. package/dist/i18next.js +5 -0
  340. package/dist/i18next.js.map +1 -0
  341. package/dist/identifiers.js +8 -0
  342. package/dist/identifiers.js.map +1 -0
  343. package/dist/inbox/InboxLayout.js +104 -0
  344. package/dist/inbox/InboxLayout.js.map +1 -0
  345. package/dist/inbox/MessageList.js +114 -0
  346. package/dist/inbox/MessageList.js.map +1 -0
  347. package/dist/inbox/MessageView.js +104 -0
  348. package/dist/inbox/MessageView.js.map +1 -0
  349. package/dist/inbox/inboxDates.js +9 -0
  350. package/dist/inbox/inboxDates.js.map +1 -0
  351. package/dist/index.js +407 -0
  352. package/dist/index.js.map +1 -0
  353. package/dist/inputs/CatalogInput.js +66 -0
  354. package/dist/inputs/CatalogInput.js.map +1 -0
  355. package/dist/inputs/ColorInput.js +109 -0
  356. package/dist/inputs/ColorInput.js.map +1 -0
  357. package/dist/inputs/FieldFrame.js +20 -0
  358. package/dist/inputs/FieldFrame.js.map +1 -0
  359. package/dist/inputs/FormSection.js +105 -0
  360. package/dist/inputs/FormSection.js.map +1 -0
  361. package/dist/inputs/NumberInput.js +70 -0
  362. package/dist/inputs/NumberInput.js.map +1 -0
  363. package/dist/inputs/SelectInput.js +84 -0
  364. package/dist/inputs/SelectInput.js.map +1 -0
  365. package/dist/inputs/TextInput.js +101 -0
  366. package/dist/inputs/TextInput.js.map +1 -0
  367. package/dist/inputs/WizardLayout.js +54 -0
  368. package/dist/inputs/WizardLayout.js.map +1 -0
  369. package/dist/inputs/colorContrast.js +46 -0
  370. package/dist/inputs/colorContrast.js.map +1 -0
  371. package/dist/inputs/formLayoutContext.js +9 -0
  372. package/dist/inputs/formLayoutContext.js.map +1 -0
  373. package/dist/inputs/numberText.js +48 -0
  374. package/dist/inputs/numberText.js.map +1 -0
  375. package/dist/kanban/KanbanBoard.js +338 -0
  376. package/dist/kanban/KanbanBoard.js.map +1 -0
  377. package/dist/kanban/kanbanCards.js +19 -0
  378. package/dist/kanban/kanbanCards.js.map +1 -0
  379. package/dist/kanban/kanbanMoves.js +29 -0
  380. package/dist/kanban/kanbanMoves.js.map +1 -0
  381. package/dist/kanban.js +15 -0
  382. package/dist/kanban.js.map +1 -0
  383. package/dist/laravel/csrfRetry.js +18 -0
  384. package/dist/laravel/csrfRetry.js.map +1 -0
  385. package/dist/laravel.js +6 -0
  386. package/dist/laravel.js.map +1 -0
  387. package/dist/lastListUrl.js +35 -0
  388. package/dist/lastListUrl.js.map +1 -0
  389. package/dist/locales/en.js +787 -0
  390. package/dist/locales/en.js.map +1 -0
  391. package/dist/locales/es.js +787 -0
  392. package/dist/locales/es.js.map +1 -0
  393. package/dist/maps/MapView.js +116 -0
  394. package/dist/maps/MapView.js.map +1 -0
  395. package/dist/maps/mapMarkers.js +19 -0
  396. package/dist/maps/mapMarkers.js.map +1 -0
  397. package/dist/maps.js +10 -0
  398. package/dist/maps.js.map +1 -0
  399. package/dist/money/money.js +380 -0
  400. package/dist/money/money.js.map +1 -0
  401. package/dist/money.js +6 -0
  402. package/dist/money.js.map +1 -0
  403. package/dist/navigation/appMenu.js +93 -0
  404. package/dist/navigation/appMenu.js.map +1 -0
  405. package/dist/navigation/useMenuBadges.js +45 -0
  406. package/dist/navigation/useMenuBadges.js.map +1 -0
  407. package/dist/navigation.js +30 -0
  408. package/dist/navigation.js.map +1 -0
  409. package/dist/navigationTrail.js +82 -0
  410. package/dist/navigationTrail.js.map +1 -0
  411. package/dist/next.js +5 -0
  412. package/dist/next.js.map +1 -0
  413. package/dist/observability/buildWatch.js +19 -0
  414. package/dist/observability/buildWatch.js.map +1 -0
  415. package/dist/observability/logger.js +43 -0
  416. package/dist/observability/logger.js.map +1 -0
  417. package/dist/observability/publishedBuild.js +39 -0
  418. package/dist/observability/publishedBuild.js.map +1 -0
  419. package/dist/observability/usePublishedBuildWatch.js +77 -0
  420. package/dist/observability/usePublishedBuildWatch.js.map +1 -0
  421. package/dist/passkeys.js +7 -0
  422. package/dist/passkeys.js.map +1 -0
  423. package/dist/periodRanges.js +33 -0
  424. package/dist/periodRanges.js.map +1 -0
  425. package/dist/problems.js +51 -0
  426. package/dist/problems.js.map +1 -0
  427. package/dist/pwa/InstallAppSetting.js +34 -0
  428. package/dist/pwa/InstallAppSetting.js.map +1 -0
  429. package/dist/pwa/InstallInstructionsDialog.js +35 -0
  430. package/dist/pwa/InstallInstructionsDialog.js.map +1 -0
  431. package/dist/pwa/InstallPromptBanner.js +70 -0
  432. package/dist/pwa/InstallPromptBanner.js.map +1 -0
  433. package/dist/pwa/installInstructions.js +60 -0
  434. package/dist/pwa/installInstructions.js.map +1 -0
  435. package/dist/pwa/useInstallPrompt.js +71 -0
  436. package/dist/pwa/useInstallPrompt.js.map +1 -0
  437. package/dist/react-hook-form.js +32 -0
  438. package/dist/react-hook-form.js.map +1 -0
  439. package/dist/react-router.js +10 -0
  440. package/dist/react-router.js.map +1 -0
  441. package/dist/security/ActivityLog.js +80 -0
  442. package/dist/security/ActivityLog.js.map +1 -0
  443. package/dist/security/RecoveryCodesDialog.js +85 -0
  444. package/dist/security/RecoveryCodesDialog.js.map +1 -0
  445. package/dist/security/SessionsCard.js +83 -0
  446. package/dist/security/SessionsCard.js.map +1 -0
  447. package/dist/security/passkeys.js +39 -0
  448. package/dist/security/passkeys.js.map +1 -0
  449. package/dist/table.js +37 -0
  450. package/dist/table.js.map +1 -0
  451. package/dist/theme/androidDevice.js +16 -0
  452. package/dist/theme/androidDevice.js.map +1 -0
  453. package/dist/theme/appleTracking.js +34 -0
  454. package/dist/theme/appleTracking.js.map +1 -0
  455. package/dist/theme/components/MuiAppBar.js +27 -0
  456. package/dist/theme/components/MuiAppBar.js.map +1 -0
  457. package/dist/theme/components/MuiBackdrop.js +13 -0
  458. package/dist/theme/components/MuiBackdrop.js.map +1 -0
  459. package/dist/theme/components/MuiButton.js +25 -0
  460. package/dist/theme/components/MuiButton.js.map +1 -0
  461. package/dist/theme/components/MuiButtonBase.js +16 -0
  462. package/dist/theme/components/MuiButtonBase.js.map +1 -0
  463. package/dist/theme/components/MuiChip.js +30 -0
  464. package/dist/theme/components/MuiChip.js.map +1 -0
  465. package/dist/theme/components/MuiDataGrid.js +30 -0
  466. package/dist/theme/components/MuiDataGrid.js.map +1 -0
  467. package/dist/theme/components/MuiDialog.js +13 -0
  468. package/dist/theme/components/MuiDialog.js.map +1 -0
  469. package/dist/theme/components/MuiDrawer.js +18 -0
  470. package/dist/theme/components/MuiDrawer.js.map +1 -0
  471. package/dist/theme/components/MuiMenuItem.js +17 -0
  472. package/dist/theme/components/MuiMenuItem.js.map +1 -0
  473. package/dist/theme/components/MuiTypography.js +22 -0
  474. package/dist/theme/components/MuiTypography.js.map +1 -0
  475. package/dist/theme/components/glassComponents.js +885 -0
  476. package/dist/theme/components/glassComponents.js.map +1 -0
  477. package/dist/theme/components/minimalComponents.js +146 -0
  478. package/dist/theme/components/minimalComponents.js.map +1 -0
  479. package/dist/theme/components/paletteOf.js +7 -0
  480. package/dist/theme/components/paletteOf.js.map +1 -0
  481. package/dist/theme/createToolkitTheme.js +100 -0
  482. package/dist/theme/createToolkitTheme.js.map +1 -0
  483. package/dist/theme/glassSurface.js +328 -0
  484. package/dist/theme/glassSurface.js.map +1 -0
  485. package/dist/theme/glassToasterStyles.js +50 -0
  486. package/dist/theme/glassToasterStyles.js.map +1 -0
  487. package/dist/theme/mergeComponents.js +42 -0
  488. package/dist/theme/mergeComponents.js.map +1 -0
  489. package/dist/theme/stackcraftPalette.js +59 -0
  490. package/dist/theme/stackcraftPalette.js.map +1 -0
  491. package/dist/theme/toolkitComponents.js +28 -0
  492. package/dist/theme/toolkitComponents.js.map +1 -0
  493. package/dist/timeline.js +8 -0
  494. package/dist/timeline.js.map +1 -0
  495. package/dist/toolkit/ComponentTexts.js +13 -0
  496. package/dist/toolkit/ComponentTexts.js.map +1 -0
  497. package/dist/toolkit/ToolkitProvider.js +57 -0
  498. package/dist/toolkit/ToolkitProvider.js.map +1 -0
  499. package/dist/toolkit/browserNavigation.js +33 -0
  500. package/dist/toolkit/browserNavigation.js.map +1 -0
  501. package/dist/toolkit/componentTextsContext.js +15 -0
  502. package/dist/toolkit/componentTextsContext.js.map +1 -0
  503. package/dist/toolkit/hashNavigation.js +40 -0
  504. package/dist/toolkit/hashNavigation.js.map +1 -0
  505. package/dist/toolkit/navigationPaths.js +49 -0
  506. package/dist/toolkit/navigationPaths.js.map +1 -0
  507. package/dist/toolkit/toolkitContext.js +19 -0
  508. package/dist/toolkit/toolkitContext.js.map +1 -0
  509. package/dist/toolkit/toolkitSettings.js +107 -0
  510. package/dist/toolkit/toolkitSettings.js.map +1 -0
  511. package/dist/toolkit/useFormatters.js +12 -0
  512. package/dist/toolkit/useFormatters.js.map +1 -0
  513. package/dist/toolkit/useToolkitTranslation.js +22 -0
  514. package/dist/toolkit/useToolkitTranslation.js.map +1 -0
  515. package/dist/types/DataTable/AuditTrailDialog.d.ts +32 -0
  516. package/dist/types/DataTable/AuditTrailTable.d.ts +30 -0
  517. package/dist/types/DataTable/ColumnFilters/HeaderFilterPopover.d.ts +8 -0
  518. package/dist/types/DataTable/ColumnFilters/MultiSelectColumnFilter.d.ts +16 -0
  519. package/dist/types/DataTable/ColumnFilters/SortableFilterHeader.d.ts +26 -0
  520. package/dist/types/DataTable/ColumnFilters/TextColumnFilter.d.ts +8 -0
  521. package/dist/types/DataTable/ColumnFilters/index.d.ts +4 -0
  522. package/dist/types/DataTable/EmptyState.d.ts +13 -0
  523. package/dist/types/DataTable/FilterChips.d.ts +17 -0
  524. package/dist/types/DataTable/GoToPage.d.ts +13 -0
  525. package/dist/types/DataTable/SelectionBar.d.ts +32 -0
  526. package/dist/types/DataTable/ServerTable.d.ts +171 -0
  527. package/dist/types/DataTable/buildChipConfig.d.ts +22 -0
  528. package/dist/types/DataTable/columns.d.ts +93 -0
  529. package/dist/types/DataTable/filterContext.d.ts +13 -0
  530. package/dist/types/DataTable/index.d.ts +13 -0
  531. package/dist/types/DataTable/rowSelection.d.ts +113 -0
  532. package/dist/types/DataTable/serverTableParams.d.ts +16 -0
  533. package/dist/types/DataTable/tableMachine.d.ts +41 -0
  534. package/dist/types/DataTable/useDebouncedFilter.d.ts +8 -0
  535. package/dist/types/DataTable/useTableState.d.ts +93 -0
  536. package/dist/types/access/Can.d.ts +11 -0
  537. package/dist/types/access/PermissionMatrix.d.ts +23 -0
  538. package/dist/types/access/RequireAccess.d.ts +11 -0
  539. package/dist/types/access/accessRules.d.ts +24 -0
  540. package/dist/types/access/permissionGroups.d.ts +56 -0
  541. package/dist/types/access/useCan.d.ts +11 -0
  542. package/dist/types/account/AccountProvider.d.ts +27 -0
  543. package/dist/types/account/AccountSecuritySection.d.ts +9 -0
  544. package/dist/types/account/DemoTotpCodeButton.d.ts +6 -0
  545. package/dist/types/account/ForgotPasswordScreen.d.ts +17 -0
  546. package/dist/types/account/ProfileScreen.d.ts +43 -0
  547. package/dist/types/account/ResetPasswordScreen.d.ts +21 -0
  548. package/dist/types/account/SignInScreen.d.ts +27 -0
  549. package/dist/types/account/accountConnector.d.ts +268 -0
  550. package/dist/types/account/demo/createDemoAccountConnector.d.ts +30 -0
  551. package/dist/types/account/demo/totp.d.ts +45 -0
  552. package/dist/types/account/restAccountConnector.d.ts +49 -0
  553. package/dist/types/account-demo.d.ts +2 -0
  554. package/dist/types/account.d.ts +16 -0
  555. package/dist/types/adapters/i18next.d.ts +11 -0
  556. package/dist/types/adapters/nextNavigation.d.ts +33 -0
  557. package/dist/types/adapters/reactRouter.d.ts +6 -0
  558. package/dist/types/adapters/reactRouterRoutes.d.ts +42 -0
  559. package/dist/types/api/ApiError.d.ts +42 -0
  560. package/dist/types/api/createApiClient.d.ts +174 -0
  561. package/dist/types/api/staleChunks.d.ts +15 -0
  562. package/dist/types/appShell/AccountMenu.d.ts +28 -0
  563. package/dist/types/appShell/AppLayout.d.ts +76 -0
  564. package/dist/types/appShell/AppearanceSettings.d.ts +41 -0
  565. package/dist/types/appShell/AuthLayout.d.ts +21 -0
  566. package/dist/types/appShell/BarActionButton.d.ts +15 -0
  567. package/dist/types/appShell/BarActions.d.ts +23 -0
  568. package/dist/types/appShell/BarCapsule.d.ts +20 -0
  569. package/dist/types/appShell/BarSearch.d.ts +24 -0
  570. package/dist/types/appShell/HeaderTools.d.ts +27 -0
  571. package/dist/types/appShell/MobileTabBar.d.ts +20 -0
  572. package/dist/types/appShell/SettingsMenu.d.ts +13 -0
  573. package/dist/types/appShell/SideMenu.d.ts +31 -0
  574. package/dist/types/appShell/SideMenuEntry.d.ts +17 -0
  575. package/dist/types/appShell/SubmenuActionsMenu.d.ts +24 -0
  576. package/dist/types/appShell/TabBarEditor.d.ts +13 -0
  577. package/dist/types/appShell/TopMenu.d.ts +7 -0
  578. package/dist/types/appShell/appMenuContext.d.ts +9 -0
  579. package/dist/types/appShell/barActionsSlot.d.ts +35 -0
  580. package/dist/types/appShell/barMenuPlacement.d.ts +9 -0
  581. package/dist/types/appShell/menuItemText.d.ts +55 -0
  582. package/dist/types/appShell/pageTitle.d.ts +26 -0
  583. package/dist/types/appShell/shellSizes.d.ts +46 -0
  584. package/dist/types/appShell/tabBarRule.d.ts +5 -0
  585. package/dist/types/appShell/tabBarScroll.d.ts +26 -0
  586. package/dist/types/appShell/useDrawerCollapsed.d.ts +8 -0
  587. package/dist/types/appShell/useFittingActionCount.d.ts +7 -0
  588. package/dist/types/appShell/usePinnedMobileTabs.d.ts +7 -0
  589. package/dist/types/appShell/useTabBarMinimized.d.ts +8 -0
  590. package/dist/types/auth/PasswordChecklist.d.ts +13 -0
  591. package/dist/types/auth/passwordRules.d.ts +34 -0
  592. package/dist/types/calendar/EventCalendar.d.ts +63 -0
  593. package/dist/types/calendar/EventDetails.d.ts +36 -0
  594. package/dist/types/calendar/calendarEvents.d.ts +27 -0
  595. package/dist/types/calendar.d.ts +3 -0
  596. package/dist/types/charts.d.ts +6 -0
  597. package/dist/types/date-pickers.d.ts +2 -0
  598. package/dist/types/datePickers/DateInput.d.ts +41 -0
  599. package/dist/types/datePickers/FormDateField.d.ts +7 -0
  600. package/dist/types/dates.d.ts +18 -0
  601. package/dist/types/dictionaries/dictionaries.d.ts +54 -0
  602. package/dist/types/downloads/DownloadManager.d.ts +7 -0
  603. package/dist/types/downloads/downloadQueue.d.ts +50 -0
  604. package/dist/types/downloads/downloadsMachine.d.ts +10 -0
  605. package/dist/types/downloads/fileTypes.d.ts +39 -0
  606. package/dist/types/downloads/index.d.ts +4 -0
  607. package/dist/types/excel/reportWorkbook.d.ts +157 -0
  608. package/dist/types/excel.d.ts +1 -0
  609. package/dist/types/feedback/ConfirmDialog.d.ts +31 -0
  610. package/dist/types/feedback/ModalWaiting.d.ts +13 -0
  611. package/dist/types/feedback/NewBuildNotice.d.ts +20 -0
  612. package/dist/types/feedback/StaleBuildBoundary.d.ts +21 -0
  613. package/dist/types/feedback/Toaster.d.ts +1 -0
  614. package/dist/types/feedback/confirmActionMachine.d.ts +19 -0
  615. package/dist/types/feedback/index.d.ts +8 -0
  616. package/dist/types/feedback/toast.d.ts +100 -0
  617. package/dist/types/feedback/useConfirmAction.d.ts +33 -0
  618. package/dist/types/filepond/FileDropzone.d.ts +61 -0
  619. package/dist/types/filepond/pondServer.d.ts +17 -0
  620. package/dist/types/filepond.d.ts +3 -0
  621. package/dist/types/files.d.ts +29 -0
  622. package/dist/types/formatting.d.ts +61 -0
  623. package/dist/types/forms/FormCatalogField.d.ts +6 -0
  624. package/dist/types/forms/FormColorField.d.ts +6 -0
  625. package/dist/types/forms/FormNumberField.d.ts +6 -0
  626. package/dist/types/forms/FormProblemAlert.d.ts +6 -0
  627. package/dist/types/forms/FormSelectField.d.ts +6 -0
  628. package/dist/types/forms/FormServerProblem.d.ts +8 -0
  629. package/dist/types/forms/FormTextField.d.ts +6 -0
  630. package/dist/types/forms/FormWizard.d.ts +22 -0
  631. package/dist/types/forms/SubmitButton.d.ts +9 -0
  632. package/dist/types/forms/applyServerProblem.d.ts +9 -0
  633. package/dist/types/forms/auth/ChangePasswordForm.d.ts +17 -0
  634. package/dist/types/forms/auth/ForgotPasswordForm.d.ts +14 -0
  635. package/dist/types/forms/auth/SignInForm.d.ts +20 -0
  636. package/dist/types/forms/index.d.ts +19 -0
  637. package/dist/types/forms/security/SecondStepForm.d.ts +30 -0
  638. package/dist/types/forms/security/TwoStepVerificationCard.d.ts +83 -0
  639. package/dist/types/forms/security/securityRules.d.ts +24 -0
  640. package/dist/types/forms/serverProblemFields.d.ts +19 -0
  641. package/dist/types/forms/useFormikField.d.ts +11 -0
  642. package/dist/types/forms/validation.d.ts +251 -0
  643. package/dist/types/forms/validationMessages.d.ts +12 -0
  644. package/dist/types/forms.d.ts +2 -0
  645. package/dist/types/hookForm/FormCatalogField.d.ts +8 -0
  646. package/dist/types/hookForm/FormColorField.d.ts +8 -0
  647. package/dist/types/hookForm/FormNumberField.d.ts +8 -0
  648. package/dist/types/hookForm/FormProblemAlert.d.ts +7 -0
  649. package/dist/types/hookForm/FormSelectField.d.ts +8 -0
  650. package/dist/types/hookForm/FormTextField.d.ts +8 -0
  651. package/dist/types/hookForm/FormWizard.d.ts +22 -0
  652. package/dist/types/hookForm/SubmitButton.d.ts +21 -0
  653. package/dist/types/hookForm/applyServerProblem.d.ts +10 -0
  654. package/dist/types/hookForm/useHookFormField.d.ts +13 -0
  655. package/dist/types/i18next.d.ts +1 -0
  656. package/dist/types/identifiers.d.ts +2 -0
  657. package/dist/types/inbox/InboxLayout.d.ts +38 -0
  658. package/dist/types/inbox/MessageList.d.ts +52 -0
  659. package/dist/types/inbox/MessageView.d.ts +55 -0
  660. package/dist/types/inbox/inboxDates.d.ts +11 -0
  661. package/dist/types/index.d.ts +91 -0
  662. package/dist/types/inputs/CatalogInput.d.ts +45 -0
  663. package/dist/types/inputs/ColorInput.d.ts +30 -0
  664. package/dist/types/inputs/FieldFrame.d.ts +14 -0
  665. package/dist/types/inputs/FormSection.d.ts +29 -0
  666. package/dist/types/inputs/NumberInput.d.ts +38 -0
  667. package/dist/types/inputs/SelectInput.d.ts +38 -0
  668. package/dist/types/inputs/TextInput.d.ts +62 -0
  669. package/dist/types/inputs/WizardLayout.d.ts +34 -0
  670. package/dist/types/inputs/colorContrast.d.ts +18 -0
  671. package/dist/types/inputs/formLayoutContext.d.ts +3 -0
  672. package/dist/types/inputs/numberText.d.ts +25 -0
  673. package/dist/types/kanban/KanbanBoard.d.ts +88 -0
  674. package/dist/types/kanban/kanbanCards.d.ts +22 -0
  675. package/dist/types/kanban/kanbanMoves.d.ts +38 -0
  676. package/dist/types/kanban.d.ts +3 -0
  677. package/dist/types/laravel/csrfRetry.d.ts +21 -0
  678. package/dist/types/laravel.d.ts +1 -0
  679. package/dist/types/lastListUrl.d.ts +20 -0
  680. package/dist/types/locales/en.d.ts +788 -0
  681. package/dist/types/locales/es.d.ts +788 -0
  682. package/dist/types/maps/MapView.d.ts +41 -0
  683. package/dist/types/maps/mapMarkers.d.ts +23 -0
  684. package/dist/types/maps.d.ts +2 -0
  685. package/dist/types/money/money.d.ts +203 -0
  686. package/dist/types/money.d.ts +1 -0
  687. package/dist/types/navigation/appMenu.d.ts +92 -0
  688. package/dist/types/navigation/useMenuBadges.d.ts +16 -0
  689. package/dist/types/navigation.d.ts +22 -0
  690. package/dist/types/navigationTrail.d.ts +49 -0
  691. package/dist/types/next.d.ts +1 -0
  692. package/dist/types/observability/buildWatch.d.ts +28 -0
  693. package/dist/types/observability/logger.d.ts +19 -0
  694. package/dist/types/observability/publishedBuild.d.ts +35 -0
  695. package/dist/types/observability/usePublishedBuildWatch.d.ts +18 -0
  696. package/dist/types/passkeys.d.ts +1 -0
  697. package/dist/types/periodRanges.d.ts +32 -0
  698. package/dist/types/problems.d.ts +31 -0
  699. package/dist/types/pwa/InstallAppSetting.d.ts +7 -0
  700. package/dist/types/pwa/InstallInstructionsDialog.d.ts +20 -0
  701. package/dist/types/pwa/InstallPromptBanner.d.ts +16 -0
  702. package/dist/types/pwa/installInstructions.d.ts +52 -0
  703. package/dist/types/pwa/useInstallPrompt.d.ts +13 -0
  704. package/dist/types/react-hook-form.d.ts +12 -0
  705. package/dist/types/react-router.d.ts +2 -0
  706. package/dist/types/security/ActivityLog.d.ts +33 -0
  707. package/dist/types/security/RecoveryCodesDialog.d.ts +16 -0
  708. package/dist/types/security/SessionsCard.d.ts +24 -0
  709. package/dist/types/security/passkeys.d.ts +18 -0
  710. package/dist/types/table.d.ts +3 -0
  711. package/dist/types/theme/androidDevice.d.ts +11 -0
  712. package/dist/types/theme/appleTracking.d.ts +17 -0
  713. package/dist/types/theme/components/MuiAppBar.d.ts +13 -0
  714. package/dist/types/theme/components/MuiBackdrop.d.ts +11 -0
  715. package/dist/types/theme/components/MuiButton.d.ts +27 -0
  716. package/dist/types/theme/components/MuiButtonBase.d.ts +14 -0
  717. package/dist/types/theme/components/MuiChip.d.ts +29 -0
  718. package/dist/types/theme/components/MuiDataGrid.d.ts +45 -0
  719. package/dist/types/theme/components/MuiDialog.d.ts +9 -0
  720. package/dist/types/theme/components/MuiDrawer.d.ts +13 -0
  721. package/dist/types/theme/components/MuiMenuItem.d.ts +17 -0
  722. package/dist/types/theme/components/MuiTypography.d.ts +20 -0
  723. package/dist/types/theme/components/glassComponents.d.ts +8 -0
  724. package/dist/types/theme/components/minimalComponents.d.ts +22 -0
  725. package/dist/types/theme/components/paletteOf.d.ts +5 -0
  726. package/dist/types/theme/createToolkitTheme.d.ts +48 -0
  727. package/dist/types/theme/glassSurface.d.ts +247 -0
  728. package/dist/types/theme/glassToasterStyles.d.ts +7 -0
  729. package/dist/types/theme/mergeComponents.d.ts +15 -0
  730. package/dist/types/theme/stackcraftPalette.d.ts +142 -0
  731. package/dist/types/theme/toolkitComponents.d.ts +4 -0
  732. package/dist/types/timeline.d.ts +2 -0
  733. package/dist/types/toolkit/ComponentTexts.d.ts +11 -0
  734. package/dist/types/toolkit/ToolkitProvider.d.ts +47 -0
  735. package/dist/types/toolkit/browserNavigation.d.ts +27 -0
  736. package/dist/types/toolkit/componentTextsContext.d.ts +20 -0
  737. package/dist/types/toolkit/hashNavigation.d.ts +12 -0
  738. package/dist/types/toolkit/navigationPaths.d.ts +43 -0
  739. package/dist/types/toolkit/toolkitContext.d.ts +28 -0
  740. package/dist/types/toolkit/toolkitSettings.d.ts +113 -0
  741. package/dist/types/toolkit/useFormatters.d.ts +6 -0
  742. package/dist/types/toolkit/useToolkitTranslation.d.ts +11 -0
  743. package/dist/types/ui/actions/ActionsMenu.d.ts +20 -0
  744. package/dist/types/ui/actions/CopyButton.d.ts +15 -0
  745. package/dist/types/ui/actions/DownloadMenu.d.ts +55 -0
  746. package/dist/types/ui/actions/SecretField.d.ts +17 -0
  747. package/dist/types/ui/actions/SelectionActions.d.ts +39 -0
  748. package/dist/types/ui/filters/DateRangeFilter.d.ts +18 -0
  749. package/dist/types/ui/filters/PeriodRangeSelector.d.ts +28 -0
  750. package/dist/types/ui/filters/QuickFilters.d.ts +23 -0
  751. package/dist/types/ui/filters/SegmentedControl.d.ts +44 -0
  752. package/dist/types/ui/index.d.ts +33 -0
  753. package/dist/types/ui/labels/DictionaryText.d.ts +7 -0
  754. package/dist/types/ui/labels/StatusChip.d.ts +21 -0
  755. package/dist/types/ui/labels/Tag.d.ts +19 -0
  756. package/dist/types/ui/labels/tagOf.d.ts +13 -0
  757. package/dist/types/ui/layout/CollapsibleSection.d.ts +18 -0
  758. package/dist/types/ui/layout/ContentDialog.d.ts +15 -0
  759. package/dist/types/ui/layout/DefinitionList.d.ts +15 -0
  760. package/dist/types/ui/layout/DetailHeader.d.ts +15 -0
  761. package/dist/types/ui/layout/ErrorPage.d.ts +35 -0
  762. package/dist/types/ui/layout/FullPageLoader.d.ts +7 -0
  763. package/dist/types/ui/layout/GlassLensFilter.d.ts +1 -0
  764. package/dist/types/ui/layout/GlassPanel.d.ts +11 -0
  765. package/dist/types/ui/layout/PageHeader.d.ts +15 -0
  766. package/dist/types/ui/layout/PageHeading.d.ts +20 -0
  767. package/dist/types/ui/layout/ProfileHeader.d.ts +17 -0
  768. package/dist/types/ui/layout/ScrollableRow.d.ts +33 -0
  769. package/dist/types/ui/layout/SectionCard.d.ts +11 -0
  770. package/dist/types/ui/layout/appBarHeight.d.ts +13 -0
  771. package/dist/types/ui/metrics/BarList.d.ts +25 -0
  772. package/dist/types/ui/metrics/CalendarHeatmap.d.ts +34 -0
  773. package/dist/types/ui/metrics/ChartTooltip.d.ts +11 -0
  774. package/dist/types/ui/metrics/ColumnChart.d.ts +47 -0
  775. package/dist/types/ui/metrics/LineChart.d.ts +41 -0
  776. package/dist/types/ui/metrics/MetricCard.d.ts +39 -0
  777. package/dist/types/ui/metrics/TableToggle.d.ts +14 -0
  778. package/dist/types/ui/metrics/barListLabels.d.ts +17 -0
  779. package/dist/types/ui/metrics/chartParts.d.ts +112 -0
  780. package/dist/types/ui/metrics/heatmapScale.d.ts +45 -0
  781. package/dist/types/ui/navigation/BackButton.d.ts +13 -0
  782. package/dist/types/ui/navigation/ColorSchemeToggle.d.ts +13 -0
  783. package/dist/types/ui/navigation/DocumentTitle.d.ts +6 -0
  784. package/dist/types/ui/navigation/FontSizeToggle.d.ts +11 -0
  785. package/dist/types/ui/navigation/LanguageToggle.d.ts +13 -0
  786. package/dist/types/ui/navigation/PageBreadcrumbs.d.ts +12 -0
  787. package/dist/types/ui/navigation/colorMode.d.ts +18 -0
  788. package/dist/types/ui/navigation/fontSizeLevels.d.ts +25 -0
  789. package/dist/types/ui/navigation/useFontSize.d.ts +10 -0
  790. package/dist/types/ui/timeline/GroupedTimeline.d.ts +41 -0
  791. package/dist/types/ui/timeline/timelineDot.d.ts +19 -0
  792. package/dist/types/upload/FileDropzone.d.ts +36 -0
  793. package/dist/types/upload/fileRules.d.ts +51 -0
  794. package/dist/types/upload/uploadMachine.d.ts +23 -0
  795. package/dist/types/upload/uploadWithProgress.d.ts +16 -0
  796. package/dist/ui/actions/ActionsMenu.js +51 -0
  797. package/dist/ui/actions/ActionsMenu.js.map +1 -0
  798. package/dist/ui/actions/CopyButton.js +28 -0
  799. package/dist/ui/actions/CopyButton.js.map +1 -0
  800. package/dist/ui/actions/DownloadMenu.js +162 -0
  801. package/dist/ui/actions/DownloadMenu.js.map +1 -0
  802. package/dist/ui/actions/SecretField.js +61 -0
  803. package/dist/ui/actions/SecretField.js.map +1 -0
  804. package/dist/ui/actions/SelectionActions.js +142 -0
  805. package/dist/ui/actions/SelectionActions.js.map +1 -0
  806. package/dist/ui/filters/DateRangeFilter.js +87 -0
  807. package/dist/ui/filters/DateRangeFilter.js.map +1 -0
  808. package/dist/ui/filters/PeriodRangeSelector.js +56 -0
  809. package/dist/ui/filters/PeriodRangeSelector.js.map +1 -0
  810. package/dist/ui/filters/QuickFilters.js +91 -0
  811. package/dist/ui/filters/QuickFilters.js.map +1 -0
  812. package/dist/ui/filters/SegmentedControl.js +80 -0
  813. package/dist/ui/filters/SegmentedControl.js.map +1 -0
  814. package/dist/ui/labels/DictionaryText.js +11 -0
  815. package/dist/ui/labels/DictionaryText.js.map +1 -0
  816. package/dist/ui/labels/StatusChip.js +52 -0
  817. package/dist/ui/labels/StatusChip.js.map +1 -0
  818. package/dist/ui/labels/Tag.js +26 -0
  819. package/dist/ui/labels/Tag.js.map +1 -0
  820. package/dist/ui/labels/tagOf.js +7 -0
  821. package/dist/ui/labels/tagOf.js.map +1 -0
  822. package/dist/ui/layout/CollapsibleSection.js +52 -0
  823. package/dist/ui/layout/CollapsibleSection.js.map +1 -0
  824. package/dist/ui/layout/ContentDialog.js +97 -0
  825. package/dist/ui/layout/ContentDialog.js.map +1 -0
  826. package/dist/ui/layout/DefinitionList.js +30 -0
  827. package/dist/ui/layout/DefinitionList.js.map +1 -0
  828. package/dist/ui/layout/DetailHeader.js +27 -0
  829. package/dist/ui/layout/DetailHeader.js.map +1 -0
  830. package/dist/ui/layout/ErrorPage.js +54 -0
  831. package/dist/ui/layout/ErrorPage.js.map +1 -0
  832. package/dist/ui/layout/FullPageLoader.js +13 -0
  833. package/dist/ui/layout/FullPageLoader.js.map +1 -0
  834. package/dist/ui/layout/GlassLensFilter.js +53 -0
  835. package/dist/ui/layout/GlassLensFilter.js.map +1 -0
  836. package/dist/ui/layout/GlassPanel.js +18 -0
  837. package/dist/ui/layout/GlassPanel.js.map +1 -0
  838. package/dist/ui/layout/PageHeader.js +23 -0
  839. package/dist/ui/layout/PageHeader.js.map +1 -0
  840. package/dist/ui/layout/PageHeading.js +51 -0
  841. package/dist/ui/layout/PageHeading.js.map +1 -0
  842. package/dist/ui/layout/ProfileHeader.js +64 -0
  843. package/dist/ui/layout/ProfileHeader.js.map +1 -0
  844. package/dist/ui/layout/ScrollableRow.js +156 -0
  845. package/dist/ui/layout/ScrollableRow.js.map +1 -0
  846. package/dist/ui/layout/SectionCard.js +18 -0
  847. package/dist/ui/layout/SectionCard.js.map +1 -0
  848. package/dist/ui/layout/appBarHeight.js +42 -0
  849. package/dist/ui/layout/appBarHeight.js.map +1 -0
  850. package/dist/ui/metrics/BarList.js +94 -0
  851. package/dist/ui/metrics/BarList.js.map +1 -0
  852. package/dist/ui/metrics/CalendarHeatmap.js +136 -0
  853. package/dist/ui/metrics/CalendarHeatmap.js.map +1 -0
  854. package/dist/ui/metrics/ChartTooltip.js +16 -0
  855. package/dist/ui/metrics/ChartTooltip.js.map +1 -0
  856. package/dist/ui/metrics/ColumnChart.js +106 -0
  857. package/dist/ui/metrics/ColumnChart.js.map +1 -0
  858. package/dist/ui/metrics/LineChart.js +117 -0
  859. package/dist/ui/metrics/LineChart.js.map +1 -0
  860. package/dist/ui/metrics/MetricCard.js +97 -0
  861. package/dist/ui/metrics/MetricCard.js.map +1 -0
  862. package/dist/ui/metrics/TableToggle.js +15 -0
  863. package/dist/ui/metrics/TableToggle.js.map +1 -0
  864. package/dist/ui/metrics/barListLabels.js +9 -0
  865. package/dist/ui/metrics/barListLabels.js.map +1 -0
  866. package/dist/ui/metrics/chartParts.js +93 -0
  867. package/dist/ui/metrics/chartParts.js.map +1 -0
  868. package/dist/ui/metrics/heatmapScale.js +67 -0
  869. package/dist/ui/metrics/heatmapScale.js.map +1 -0
  870. package/dist/ui/navigation/BackButton.js +28 -0
  871. package/dist/ui/navigation/BackButton.js.map +1 -0
  872. package/dist/ui/navigation/ColorSchemeToggle.js +40 -0
  873. package/dist/ui/navigation/ColorSchemeToggle.js.map +1 -0
  874. package/dist/ui/navigation/DocumentTitle.js +11 -0
  875. package/dist/ui/navigation/DocumentTitle.js.map +1 -0
  876. package/dist/ui/navigation/FontSizeToggle.js +41 -0
  877. package/dist/ui/navigation/FontSizeToggle.js.map +1 -0
  878. package/dist/ui/navigation/LanguageToggle.js +48 -0
  879. package/dist/ui/navigation/LanguageToggle.js.map +1 -0
  880. package/dist/ui/navigation/PageBreadcrumbs.js +51 -0
  881. package/dist/ui/navigation/PageBreadcrumbs.js.map +1 -0
  882. package/dist/ui/navigation/colorMode.js +13 -0
  883. package/dist/ui/navigation/colorMode.js.map +1 -0
  884. package/dist/ui/navigation/fontSizeLevels.js +24 -0
  885. package/dist/ui/navigation/fontSizeLevels.js.map +1 -0
  886. package/dist/ui/navigation/useFontSize.js +44 -0
  887. package/dist/ui/navigation/useFontSize.js.map +1 -0
  888. package/dist/ui/timeline/GroupedTimeline.js +106 -0
  889. package/dist/ui/timeline/GroupedTimeline.js.map +1 -0
  890. package/dist/ui/timeline/timelineDot.js +20 -0
  891. package/dist/ui/timeline/timelineDot.js.map +1 -0
  892. package/dist/upload/FileDropzone.js +145 -0
  893. package/dist/upload/FileDropzone.js.map +1 -0
  894. package/dist/upload/fileRules.js +62 -0
  895. package/dist/upload/fileRules.js.map +1 -0
  896. package/dist/upload/uploadMachine.js +73 -0
  897. package/dist/upload/uploadMachine.js.map +1 -0
  898. package/dist/upload/uploadWithProgress.js +45 -0
  899. package/dist/upload/uploadWithProgress.js.map +1 -0
  900. package/package.json +311 -5
@@ -0,0 +1,36 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { Component } from "react";
4
+ import { isStaleChunkError } from "../api/staleChunks.js";
5
+ import { createLogger } from "../observability/logger.js";
6
+ import ErrorPage, { ERROR_PAGE_KIND } from "../ui/layout/ErrorPage.js";
7
+ const log = createLogger("navigation");
8
+ function reloadPage() {
9
+ window.location.reload();
10
+ }
11
+ class StaleBuildBoundary extends Component {
12
+ state = { error: null };
13
+ static getDerivedStateFromError(error) {
14
+ return { error };
15
+ }
16
+ componentDidCatch(error) {
17
+ log.error("una pantalla no se pudo pintar", { name: error?.name, message: error?.message });
18
+ }
19
+ componentDidUpdate(previousProps) {
20
+ if (this.state.error && previousProps.resetKey !== this.props.resetKey) {
21
+ this.setState({ error: null });
22
+ }
23
+ }
24
+ render() {
25
+ const { error } = this.state;
26
+ if (!error) {
27
+ return this.props.children;
28
+ }
29
+ const kind = isStaleChunkError(error) ? ERROR_PAGE_KIND.newVersion : ERROR_PAGE_KIND.serverError;
30
+ return /* @__PURE__ */ jsx(ErrorPage, { kind, onRetry: reloadPage, homePath: this.props.homePath });
31
+ }
32
+ }
33
+ export {
34
+ StaleBuildBoundary as default
35
+ };
36
+ //# sourceMappingURL=StaleBuildBoundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StaleBuildBoundary.js","sources":["../../src/feedback/StaleBuildBoundary.jsx"],"sourcesContent":["// La barrera de errores de las pantallas, para una app sin router de datos (con react-router va RouteErrorScreen, que el\n// router le pasa solo). Si una pantalla truena al pintarse, en lugar de dejar la página en blanco dice qué pasó y ofrece\n// recargar:\n// - se publicó otra versión con la pestaña abierta (el archivo de la pantalla ya no existe; recoverFromStaleChunk ya\n// recargó una vez y volvió a fallar): «Hay una versión nueva» y «Recargar»;\n// - otra cosa: «Algo falló de nuestro lado» y «Intentar de nuevo» (recarga).\n// Al cambiar resetKey (normalmente la dirección de la página) se vuelve a intentar: el error era de la pantalla anterior.\n//\n// <StaleBuildBoundary resetKey={pathname}>{pantallas}</StaleBuildBoundary>\n//\n// OJO: es una clase porque React solo atrapa los errores al pintar con componentDidCatch; no hay hook para eso.\nimport {Component} from 'react';\n\nimport {isStaleChunkError} from '@/api/staleChunks.js';\nimport {createLogger} from '@/observability/logger.js';\nimport ErrorPage, {ERROR_PAGE_KIND} from '@/ui/layout/ErrorPage.jsx';\n\nconst log = createLogger('navigation');\n\n/** Recargar la página: trae la versión publicada. */\nfunction reloadPage() {\n window.location.reload();\n}\n\n/**\n * @extends {Component<{resetKey?: string, homePath?: string, children?: import('react').ReactNode}, {error: unknown}>}\n */\nexport default class StaleBuildBoundary extends Component {\n state = {error: null};\n\n static getDerivedStateFromError(error) {\n return {error};\n }\n\n componentDidCatch(error) {\n log.error('una pantalla no se pudo pintar', {name: error?.name, message: error?.message});\n }\n\n componentDidUpdate(previousProps) {\n if (this.state.error && previousProps.resetKey !== this.props.resetKey) {\n this.setState({error: null});\n }\n }\n\n render() {\n const {error} = this.state;\n if (!error) {\n return this.props.children;\n }\n const kind = isStaleChunkError(error) ? ERROR_PAGE_KIND.newVersion : ERROR_PAGE_KIND.serverError;\n return <ErrorPage kind={kind} onRetry={reloadPage} homePath={this.props.homePath} />;\n }\n}\n"],"names":[],"mappings":";;;;;;AAiBA,MAAM,MAAM,aAAa,YAAY;AAGrC,SAAS,aAAa;AAClB,SAAO,SAAS,OAAA;AACpB;AAKA,MAAqB,2BAA2B,UAAU;AAAA,EACtD,QAAQ,EAAC,OAAO,KAAA;AAAA,EAEhB,OAAO,yBAAyB,OAAO;AACnC,WAAO,EAAC,MAAA;AAAA,EACZ;AAAA,EAEA,kBAAkB,OAAO;AACrB,QAAI,MAAM,kCAAkC,EAAC,MAAM,OAAO,MAAM,SAAS,OAAO,SAAQ;AAAA,EAC5F;AAAA,EAEA,mBAAmB,eAAe;AAC9B,QAAI,KAAK,MAAM,SAAS,cAAc,aAAa,KAAK,MAAM,UAAU;AACpE,WAAK,SAAS,EAAC,OAAO,KAAA,CAAK;AAAA,IAC/B;AAAA,EACJ;AAAA,EAEA,SAAS;AACL,UAAM,EAAC,UAAS,KAAK;AACrB,QAAI,CAAC,OAAO;AACR,aAAO,KAAK,MAAM;AAAA,IACtB;AACA,UAAM,OAAO,kBAAkB,KAAK,IAAI,gBAAgB,aAAa,gBAAgB;AACrF,WAAO,oBAAC,aAAU,MAAY,SAAS,YAAY,UAAU,KAAK,MAAM,UAAU;AAAA,EACtF;AACJ;"}
@@ -0,0 +1,20 @@
1
+ "use client";
2
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
3
+ import { Toaster as Toaster$1 } from "sonner";
4
+ import GlobalStyles from "@mui/material/GlobalStyles";
5
+ import { useTheme, useColorScheme } from "@mui/material/styles";
6
+ import { isGlassTheme } from "../theme/glassSurface.js";
7
+ import { glassToasterStylesOf } from "../theme/glassToasterStyles.js";
8
+ import { resolvedColorModeOf } from "../ui/navigation/colorMode.js";
9
+ function Toaster() {
10
+ const theme = useTheme();
11
+ const { mode, systemMode } = useColorScheme();
12
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
13
+ isGlassTheme(theme) && /* @__PURE__ */ jsx(GlobalStyles, { styles: glassToasterStylesOf(theme) }),
14
+ /* @__PURE__ */ jsx(Toaster$1, { position: "bottom-left", richColors: true, closeButton: true, theme: resolvedColorModeOf(mode, systemMode) })
15
+ ] });
16
+ }
17
+ export {
18
+ Toaster as default
19
+ };
20
+ //# sourceMappingURL=Toaster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toaster.js","sources":["../../src/feedback/Toaster.jsx"],"sourcesContent":["// El <Toaster/> de sonner, montado UNA sola vez en la raíz de la aplicación: dos montados son dos avisos por cada aviso.\n//\n// Abajo a la izquierda: arriba taparía la barra superior (nombre y \"Salir\"); a la derecha, el panel de detalle (que\n// abre del lado derecho, con su botón de descarga abajo) y la paginación de las tablas de MUI.\n//\n// Sigue el modo claro / oscuro de MUI (va DENTRO del ThemeProvider de la aplicación): sin eso, un aviso blanco sobre la app en\n// oscuro es una linterna. Con el vidrio del tema (createToolkitTheme({glass: true})), los avisos también son de vidrio\n// (glassToasterStyles.js).\n//\n// Genérico del paquete: function (regla de la casa).\nimport {Toaster as SonnerToaster} from 'sonner';\nimport GlobalStyles from '@mui/material/GlobalStyles';\nimport {useColorScheme, useTheme} from '@mui/material/styles';\n\nimport {isGlassTheme} from '@/theme/glassSurface.js';\nimport {glassToasterStylesOf} from '@/theme/glassToasterStyles.js';\nimport {resolvedColorModeOf} from '@/ui/navigation/colorMode.js';\n\nexport default function Toaster() {\n const theme = useTheme();\n const {mode, systemMode} = useColorScheme();\n return (\n <>\n {isGlassTheme(theme) && <GlobalStyles styles={glassToasterStylesOf(theme)} />}\n <SonnerToaster position=\"bottom-left\" richColors closeButton theme={resolvedColorModeOf(mode, systemMode)} />\n </>\n );\n}\n"],"names":["SonnerToaster"],"mappings":";;;;;;;;AAkBA,SAAwB,UAAU;AAC9B,QAAM,QAAQ,SAAA;AACd,QAAM,EAAC,MAAM,WAAA,IAAc,eAAA;AAC3B,SACI,qBAAA,UAAA,EACK,UAAA;AAAA,IAAA,aAAa,KAAK,KAAK,oBAAC,gBAAa,QAAQ,qBAAqB,KAAK,GAAG;AAAA,IAC3E,oBAACA,WAAA,EAAc,UAAS,eAAc,YAAU,MAAC,aAAW,MAAC,OAAO,oBAAoB,MAAM,UAAU,EAAA,CAAG;AAAA,EAAA,GAC/G;AAER;"}
@@ -0,0 +1,67 @@
1
+ import { setup, fromPromise, assign } from "xstate";
2
+ const confirmActionMachine = setup({
3
+ actors: {
4
+ // ({input: {subject}}) → lo que regrese el API; lo reemplaza useConfirmAction
5
+ runAction: fromPromise(async () => {
6
+ throw new Error("confirmActionMachine: falta proveer runAction.");
7
+ })
8
+ },
9
+ actions: {
10
+ // se llama con el resultado de runAction (p. ej. para el aviso y para volver a pedir la tabla)
11
+ onDone: () => {
12
+ }
13
+ }
14
+ }).createMachine({
15
+ id: "confirmAction",
16
+ initial: "idle",
17
+ context: {
18
+ // sobre qué renglón se va a actuar (lo que se pinta en el diálogo y lo que recibe runAction)
19
+ subject: null,
20
+ // datos que la persona agrega en el diálogo antes de confirmar (p. ej. el motivo)
21
+ details: null,
22
+ error: null,
23
+ output: null
24
+ },
25
+ states: {
26
+ idle: {
27
+ on: {
28
+ OPEN: { target: "confirming", actions: assign({ subject: ({ event }) => event.subject, details: null, error: null }) }
29
+ }
30
+ },
31
+ confirming: {
32
+ on: {
33
+ CONFIRM: { target: "running", actions: assign({ details: ({ event }) => event.details ?? null }) },
34
+ CANCEL: { target: "idle", actions: assign({ error: null }) }
35
+ }
36
+ },
37
+ running: {
38
+ entry: assign({ error: null }),
39
+ invoke: {
40
+ src: "runAction",
41
+ input: ({ context }) => ({ subject: context.subject, details: context.details }),
42
+ onDone: {
43
+ target: "done",
44
+ actions: [assign({ output: ({ event }) => event.output ?? null }), { type: "onDone", params: ({ event }) => ({ output: event.output }) }]
45
+ },
46
+ onError: { target: "failed", actions: assign({ error: ({ event }) => event.error }) }
47
+ }
48
+ // NOTA: sin CANCEL ni CONFIRM a propósito; a media petición no se cierra el diálogo ni sale otra petición
49
+ },
50
+ done: {
51
+ on: {
52
+ OPEN: { target: "confirming", actions: assign({ subject: ({ event }) => event.subject, details: null, error: null, output: null }) }
53
+ }
54
+ },
55
+ failed: {
56
+ on: {
57
+ // reintentar desde el mismo diálogo, con el error a la vista
58
+ CONFIRM: { target: "running", actions: assign({ details: ({ event, context }) => event.details ?? context.details }) },
59
+ CANCEL: { target: "idle", actions: assign({ error: null }) }
60
+ }
61
+ }
62
+ }
63
+ });
64
+ export {
65
+ confirmActionMachine
66
+ };
67
+ //# sourceMappingURL=confirmActionMachine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirmActionMachine.js","sources":["../../src/feedback/confirmActionMachine.js"],"sourcesContent":["// Máquina de \"¿Seguro?\": toda acción que cambia algo, manda un correo o descarga un archivo pasa por aquí.\n//\n// idle ──OPEN──▶ confirming ──CONFIRM──▶ running ──ok──▶ done\n// ▲ │ ▲ │\n// └──── CANCEL ────┘ └──── CONFIRM ─── failed ◀──error──┘\n// └── CANCEL ──▶ idle\n//\n// Por qué una máquina y no un useState con banderas: las dos trampas que ya se pagaron en otras pantallas son\n// \"cancelar igual ejecutó\" y \"doble clic en Confirmar mandó dos POST\". Aquí no son posibles por construcción: CONFIRM\n// solo existe en confirming y failed, y running no escucha nada (ni CONFIRM ni CANCEL) hasta que la petición termina.\n// Lo prueba confirmActionMachine.test.js.\n//\n// Pura: solo importa xstate. La acción real (runAction) y lo que pasa al terminar (onDone) los pone quien la usa con\n// useConfirmAction; core no conoce el API.\nimport {assign, fromPromise, setup} from 'xstate';\n\nexport const confirmActionMachine = setup({\n actors: {\n // ({input: {subject}}) → lo que regrese el API; lo reemplaza useConfirmAction\n runAction: fromPromise(async () => {\n throw new Error('confirmActionMachine: falta proveer runAction.');\n }),\n },\n actions: {\n // se llama con el resultado de runAction (p. ej. para el aviso y para volver a pedir la tabla)\n onDone: () => {},\n },\n}).createMachine({\n id: 'confirmAction',\n initial: 'idle',\n context: {\n // sobre qué renglón se va a actuar (lo que se pinta en el diálogo y lo que recibe runAction)\n subject: null,\n // datos que la persona agrega en el diálogo antes de confirmar (p. ej. el motivo)\n details: null,\n error: null,\n output: null,\n },\n states: {\n idle: {\n on: {\n OPEN: {target: 'confirming', actions: assign({subject: ({event}) => event.subject, details: null, error: null})},\n },\n },\n confirming: {\n on: {\n CONFIRM: {target: 'running', actions: assign({details: ({event}) => event.details ?? null})},\n CANCEL: {target: 'idle', actions: assign({error: null})},\n },\n },\n running: {\n entry: assign({error: null}),\n invoke: {\n src: 'runAction',\n input: ({context}) => ({subject: context.subject, details: context.details}),\n onDone: {\n target: 'done',\n actions: [assign({output: ({event}) => event.output ?? null}), {type: 'onDone', params: ({event}) => ({output: event.output})}],\n },\n onError: {target: 'failed', actions: assign({error: ({event}) => event.error})},\n },\n // NOTA: sin CANCEL ni CONFIRM a propósito; a media petición no se cierra el diálogo ni sale otra petición\n },\n done: {\n on: {\n OPEN: {target: 'confirming', actions: assign({subject: ({event}) => event.subject, details: null, error: null, output: null})},\n },\n },\n failed: {\n on: {\n // reintentar desde el mismo diálogo, con el error a la vista\n CONFIRM: {target: 'running', actions: assign({details: ({event, context}) => event.details ?? context.details})},\n CANCEL: {target: 'idle', actions: assign({error: null})},\n },\n },\n },\n});\n"],"names":[],"mappings":";AAgBY,MAAC,uBAAuB,MAAM;AAAA,EACtC,QAAQ;AAAA;AAAA,IAEJ,WAAW,YAAY,YAAY;AAC/B,YAAM,IAAI,MAAM,gDAAgD;AAAA,IACpE,CAAC;AAAA,EACT;AAAA,EACI,SAAS;AAAA;AAAA,IAEL,QAAQ,MAAM;AAAA,IAAC;AAAA,EACvB;AACA,CAAC,EAAE,cAAc;AAAA,EACb,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,SAAS;AAAA;AAAA,IAEL,SAAS;AAAA;AAAA,IAET,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,EAChB;AAAA,EACI,QAAQ;AAAA,IACJ,MAAM;AAAA,MACF,IAAI;AAAA,QACA,MAAM,EAAC,QAAQ,cAAc,SAAS,OAAO,EAAC,SAAS,CAAC,EAAC,MAAK,MAAM,MAAM,SAAS,SAAS,MAAM,OAAO,KAAI,CAAC,EAAC;AAAA,MAC/H;AAAA,IACA;AAAA,IACQ,YAAY;AAAA,MACR,IAAI;AAAA,QACA,SAAS,EAAC,QAAQ,WAAW,SAAS,OAAO,EAAC,SAAS,CAAC,EAAC,MAAK,MAAM,MAAM,WAAW,KAAI,CAAC,EAAC;AAAA,QAC3F,QAAQ,EAAC,QAAQ,QAAQ,SAAS,OAAO,EAAC,OAAO,KAAI,CAAC,EAAC;AAAA,MACvE;AAAA,IACA;AAAA,IACQ,SAAS;AAAA,MACL,OAAO,OAAO,EAAC,OAAO,KAAI,CAAC;AAAA,MAC3B,QAAQ;AAAA,QACJ,KAAK;AAAA,QACL,OAAO,CAAC,EAAC,QAAO,OAAO,EAAC,SAAS,QAAQ,SAAS,SAAS,QAAQ,QAAO;AAAA,QAC1E,QAAQ;AAAA,UACJ,QAAQ;AAAA,UACR,SAAS,CAAC,OAAO,EAAC,QAAQ,CAAC,EAAC,MAAK,MAAM,MAAM,UAAU,KAAI,CAAC,GAAG,EAAC,MAAM,UAAU,QAAQ,CAAC,EAAC,MAAK,OAAO,EAAC,QAAQ,MAAM,OAAM,GAAE,CAAC;AAAA,QAClJ;AAAA,QACgB,SAAS,EAAC,QAAQ,UAAU,SAAS,OAAO,EAAC,OAAO,CAAC,EAAC,MAAK,MAAM,MAAM,MAAK,CAAC,EAAC;AAAA,MAC9F;AAAA;AAAA,IAEA;AAAA,IACQ,MAAM;AAAA,MACF,IAAI;AAAA,QACA,MAAM,EAAC,QAAQ,cAAc,SAAS,OAAO,EAAC,SAAS,CAAC,EAAC,MAAK,MAAM,MAAM,SAAS,SAAS,MAAM,OAAO,MAAM,QAAQ,KAAI,CAAC,EAAC;AAAA,MAC7I;AAAA,IACA;AAAA,IACQ,QAAQ;AAAA,MACJ,IAAI;AAAA;AAAA,QAEA,SAAS,EAAC,QAAQ,WAAW,SAAS,OAAO,EAAC,SAAS,CAAC,EAAC,OAAO,QAAO,MAAM,MAAM,WAAW,QAAQ,QAAO,CAAC,EAAC;AAAA,QAC/G,QAAQ,EAAC,QAAQ,QAAQ,SAAS,OAAO,EAAC,OAAO,KAAI,CAAC,EAAC;AAAA,MACvE;AAAA,IACA;AAAA,EACA;AACA,CAAC;"}
@@ -0,0 +1,88 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { toast } from "sonner";
4
+ import { fieldErrorsOf } from "../problems.js";
5
+ import { translateToolkit } from "../toolkit/toolkitSettings.js";
6
+ const TOAST_DEFAULT_OPTIONS = Object.freeze({
7
+ duration: 5e3,
8
+ closeButton: true,
9
+ dismissible: true
10
+ });
11
+ const TOAST_FUNCTION_BY_TYPE = {
12
+ success: toast.success,
13
+ error: toast.error,
14
+ warning: toast.warning,
15
+ info: toast.info,
16
+ default: toast
17
+ };
18
+ function toToastContent(message) {
19
+ if (message === null || message === void 0) {
20
+ return "";
21
+ }
22
+ if (typeof message !== "string" || !message.includes("\n")) {
23
+ return message;
24
+ }
25
+ const lines = message.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
26
+ return /* @__PURE__ */ jsx("div", { style: { display: "grid", gap: 4 }, children: lines.map((line, position) => /* @__PURE__ */ jsx("div", { children: line }, position)) });
27
+ }
28
+ function mergeOptions(options) {
29
+ return { ...TOAST_DEFAULT_OPTIONS, ...options };
30
+ }
31
+ function showToast(type, message, options) {
32
+ const showFunction = TOAST_FUNCTION_BY_TYPE[type] ?? toast;
33
+ return showFunction(toToastContent(message), mergeOptions(options));
34
+ }
35
+ function toastSuccess(message, options) {
36
+ return showToast("success", message ?? translateToolkit("common", "toast.done"), options);
37
+ }
38
+ function toastError(message, options) {
39
+ return showToast("error", message ?? translateToolkit("common", "toast.error"), options);
40
+ }
41
+ function toastWarn(message, options) {
42
+ return showToast("warning", message ?? translateToolkit("common", "toast.warning"), options);
43
+ }
44
+ function toastInfo(message, options) {
45
+ return showToast("info", message ?? translateToolkit("common", "toast.info"), options);
46
+ }
47
+ function toastDefault(message, options) {
48
+ return showToast("default", message ?? "", options);
49
+ }
50
+ function toastLoading(message, options) {
51
+ return toast.loading(toToastContent(message ?? translateToolkit("common", "toast.working")), { ...mergeOptions(options), duration: Infinity });
52
+ }
53
+ function toastPromise(promise, { loading, success, error }, options) {
54
+ return toast.promise(promise, {
55
+ loading: toToastContent(loading),
56
+ success: typeof success === "function" ? (data) => toToastContent(success(data)) : toToastContent(success),
57
+ error: typeof error === "function" ? (failure) => toToastContent(error(failure)) : toToastContent(error),
58
+ ...mergeOptions(options)
59
+ });
60
+ }
61
+ function dismissToast(toastId) {
62
+ return toast.dismiss(toastId);
63
+ }
64
+ function errorsObjectToMessage(errorsByField, { dedup = true } = {}) {
65
+ if (!errorsByField || typeof errorsByField !== "object") {
66
+ return "";
67
+ }
68
+ const messages = Object.values(errorsByField).flatMap((fieldMessages) => Array.isArray(fieldMessages) ? fieldMessages : [String(fieldMessages)]).map((message) => String(message).trim()).filter(Boolean);
69
+ return (dedup ? [...new Set(messages)] : messages).join("\n");
70
+ }
71
+ function toastProblem(error, options) {
72
+ const fieldMessages = errorsObjectToMessage(fieldErrorsOf(error?.problem));
73
+ return toastError(fieldMessages || error?.message || translateToolkit("common", "toast.error"), options);
74
+ }
75
+ export {
76
+ TOAST_DEFAULT_OPTIONS,
77
+ dismissToast,
78
+ errorsObjectToMessage,
79
+ toastDefault,
80
+ toastError,
81
+ toastInfo,
82
+ toastLoading,
83
+ toastProblem,
84
+ toastPromise,
85
+ toastSuccess,
86
+ toastWarn
87
+ };
88
+ //# sourceMappingURL=toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.js","sources":["../../src/feedback/toast.jsx"],"sourcesContent":["// Avisos efímeros: el punto ÚNICO de uso de sonner.\n//\n// Siempre se importa desde aquí (del paquete) y nunca de 'sonner' directo: así los defaults, el texto multilínea y las\n// opciones se comparten, y cambiar de librería es tocar un archivo.\n//\n// Los avisos NO sustituyen al mensaje en pantalla. Un error de una tabla o de un formulario se explica en su lugar;\n// el toast es para lo que pasa fuera de la vista: \"periodo cerrado\", \"descarga lista\", \"sesión terminada\".\n//\n// API:\n// toastSuccess / toastError / toastWarn / toastInfo / toastDefault (mensaje, opciones?)\n// toastLoading(mensaje, opciones?) → id para dismissToast(id)\n// toastPromise(promesa, {loading, success, error}, opciones?)\n// dismissToast(id)\n// errorsObjectToMessage(errores, {dedup?}) → texto multilínea\n// toastProblem(error, opciones?) → de un ApiError (RFC 9457)\n//\n// OJO: los textos por defecto salen de los textos del paquete (common:toast.*) con la configuración vigente del\n// proveedor, porque estas funciones se llaman fuera de los componentes.\n//\n// Funciones que no renderizan por sí mismas: function (regla de la casa).\nimport {toast} from 'sonner';\n\nimport {fieldErrorsOf} from '@/problems.js';\nimport {translateToolkit} from '@/toolkit/toolkitSettings.js';\n\nexport const TOAST_DEFAULT_OPTIONS = Object.freeze({\n duration: 5000,\n closeButton: true,\n dismissible: true,\n});\n\n// mapa en vez de switch: agregar un tipo es una línea\nconst TOAST_FUNCTION_BY_TYPE = {\n success: toast.success,\n error: toast.error,\n warning: toast.warning,\n info: toast.info,\n default: toast,\n};\n\n/**\n * Texto con saltos de línea → nodos. Sin dangerouslySetInnerHTML a propósito: aquí terminan mensajes del servidor y\n * ninguno debe poder inyectar HTML.\n *\n * @param {import('react').ReactNode} message\n */\nfunction toToastContent(message) {\n if (message === null || message === undefined) {\n return '';\n }\n if (typeof message !== 'string' || !message.includes('\\n')) {\n return message;\n }\n const lines = message.split(/\\r?\\n/).map((line) => line.trim()).filter(Boolean);\n return (\n <div style={{display: 'grid', gap: 4}}>\n {lines.map((line, position) => <div key={position}>{line}</div>)}\n </div>\n );\n}\n\nfunction mergeOptions(options) {\n return {...TOAST_DEFAULT_OPTIONS, ...options};\n}\n\nfunction showToast(type, message, options) {\n const showFunction = TOAST_FUNCTION_BY_TYPE[type] ?? toast;\n return showFunction(toToastContent(message), mergeOptions(options));\n}\n\n/**\n * Aviso de que algo salió bien.\n *\n * @param {import('react').ReactNode} [message] ya traducido; con saltos de línea, un renglón cada uno; por omisión «Listo» (common:toast.done)\n * @param {import('sonner').ExternalToast} [options] las de sonner (duración, acción…), encima de TOAST_DEFAULT_OPTIONS\n * @returns {string|number} el id del aviso (para cerrarlo con dismissToast)\n */\nexport function toastSuccess(message, options) {\n return showToast('success', message ?? translateToolkit('common', 'toast.done'), options);\n}\n\n/**\n * Aviso de error.\n *\n * @param {import('react').ReactNode} [message] ya traducido; con saltos de línea, un renglón cada uno; por omisión el error genérico (common:toast.error)\n * @param {import('sonner').ExternalToast} [options] las de sonner (duración, acción…), encima de TOAST_DEFAULT_OPTIONS\n * @returns {string|number} el id del aviso (para cerrarlo con dismissToast)\n */\nexport function toastError(message, options) {\n return showToast('error', message ?? translateToolkit('common', 'toast.error'), options);\n}\n\n/**\n * Aviso de advertencia.\n *\n * @param {import('react').ReactNode} [message] ya traducido; con saltos de línea, un renglón cada uno; por omisión la advertencia genérica (common:toast.warning)\n * @param {import('sonner').ExternalToast} [options] las de sonner (duración, acción…), encima de TOAST_DEFAULT_OPTIONS\n * @returns {string|number} el id del aviso (para cerrarlo con dismissToast)\n */\nexport function toastWarn(message, options) {\n return showToast('warning', message ?? translateToolkit('common', 'toast.warning'), options);\n}\n\n/**\n * Aviso informativo.\n *\n * @param {import('react').ReactNode} [message] ya traducido; con saltos de línea, un renglón cada uno; por omisión el aviso genérico (common:toast.info)\n * @param {import('sonner').ExternalToast} [options] las de sonner (duración, acción…), encima de TOAST_DEFAULT_OPTIONS\n * @returns {string|number} el id del aviso (para cerrarlo con dismissToast)\n */\nexport function toastInfo(message, options) {\n return showToast('info', message ?? translateToolkit('common', 'toast.info'), options);\n}\n\n/**\n * Aviso sin tipo (sin ícono ni color).\n *\n * @param {import('react').ReactNode} [message] ya traducido; con saltos de línea, un renglón cada uno\n * @param {import('sonner').ExternalToast} [options] las de sonner (duración, acción…), encima de TOAST_DEFAULT_OPTIONS\n * @returns {string|number} el id del aviso (para cerrarlo con dismissToast)\n */\nexport function toastDefault(message, options) {\n return showToast('default', message ?? '', options);\n}\n\n/**\n * Aviso que NO se cierra solo. Regresa el id para cerrarlo al terminar.\n *\n * @param {import('react').ReactNode} [message] ya traducido; por omisión «Trabajando…» (common:toast.working)\n * @param {import('sonner').ExternalToast} [options]\n * @returns {string|number} el id del aviso (para dismissToast)\n */\nexport function toastLoading(message, options) {\n return toast.loading(toToastContent(message ?? translateToolkit('common', 'toast.working')), {...mergeOptions(options), duration: Infinity});\n}\n\n/**\n * Envuelve una promesa: cargando → listo | error, solo.\n *\n * @template T\n * @param {Promise<T>} promise\n * @param {object} messages ya traducidos\n * @param {import('react').ReactNode} messages.loading\n * @param {import('react').ReactNode | ((data: T) => import('react').ReactNode)} messages.success\n * @param {import('react').ReactNode | ((failure: unknown) => import('react').ReactNode)} messages.error\n * @param {import('sonner').ExternalToast} [options]\n */\nexport function toastPromise(promise, {loading, success, error}, options) {\n return toast.promise(promise, {\n loading: toToastContent(loading),\n success: typeof success === 'function' ? (data) => toToastContent(success(data)) : toToastContent(success),\n error: typeof error === 'function' ? (failure) => toToastContent(error(failure)) : toToastContent(error),\n ...mergeOptions(options),\n });\n}\n\n/**\n * Cierra un aviso (el id que regresan las funciones de arriba); sin id, todos.\n *\n * @param {string|number} [toastId]\n */\nexport function dismissToast(toastId) {\n return toast.dismiss(toastId);\n}\n\n/**\n * {email: ['Requerido', 'Inválido']} → \"Requerido\\nInválido\".\n *\n * @param {Record<string, string[]|string>|null|undefined} errorsByField\n * @param {{dedup?: boolean}} [options]\n * @returns {string}\n */\nexport function errorsObjectToMessage(errorsByField, {dedup = true} = {}) {\n if (!errorsByField || typeof errorsByField !== 'object') {\n return '';\n }\n const messages = Object.values(errorsByField)\n .flatMap((fieldMessages) => (Array.isArray(fieldMessages) ? fieldMessages : [String(fieldMessages)]))\n .map((message) => String(message).trim())\n .filter(Boolean);\n return (dedup ? [...new Set(messages)] : messages).join('\\n');\n}\n\n/**\n * Aviso de error a partir de un ApiError: usa el detail traducido y, si es un 422, enumera los mensajes por campo.\n *\n * @param {Error & {problem?: object}} error\n * @param {object} [options] opciones de sonner\n */\nexport function toastProblem(error, options) {\n const fieldMessages = errorsObjectToMessage(fieldErrorsOf(error?.problem));\n return toastError(fieldMessages || error?.message || translateToolkit('common', 'toast.error'), options);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ "use client";
2
+ import { useRef } from "react";
3
+ import { useMachine } from "@xstate/react";
4
+ import { fromPromise } from "xstate";
5
+ import { confirmActionMachine } from "./confirmActionMachine.js";
6
+ function useConfirmAction({ run, onDone }) {
7
+ const latestRun = useRef(run);
8
+ const latestOnDone = useRef(onDone);
9
+ latestRun.current = run;
10
+ latestOnDone.current = onDone;
11
+ const [snapshot, send] = useMachine(confirmActionMachine.provide({
12
+ actors: { runAction: fromPromise(({ input }) => latestRun.current(input)) },
13
+ actions: { onDone: ({ context }, params) => latestOnDone.current?.(params?.output, context.subject) }
14
+ }));
15
+ const { subject, error } = snapshot.context;
16
+ const isOpen = ["confirming", "running", "failed"].some((stateName) => snapshot.matches(stateName));
17
+ const isRunning = snapshot.matches("running");
18
+ const confirm = (details) => send({ type: "CONFIRM", details });
19
+ const cancel = () => send({ type: "CANCEL" });
20
+ return {
21
+ subject,
22
+ isOpen,
23
+ isRunning,
24
+ error,
25
+ open: (nextSubject) => send({ type: "OPEN", subject: nextSubject }),
26
+ confirm,
27
+ cancel,
28
+ dialogProps: {
29
+ open: isOpen,
30
+ isPending: isRunning,
31
+ errorMessage: error?.message ?? null,
32
+ onConfirm: () => confirm(),
33
+ onClose: cancel
34
+ }
35
+ };
36
+ }
37
+ export {
38
+ useConfirmAction
39
+ };
40
+ //# sourceMappingURL=useConfirmAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useConfirmAction.js","sources":["../../src/feedback/useConfirmAction.js"],"sourcesContent":["// Conecta confirmActionMachine con una pantalla: qué se ejecuta al confirmar y qué pasa cuando termina.\n//\n// Uso (una acción por hook; la pantalla pinta su ConfirmDialog con lo que regresa):\n// const deactivate = useConfirmAction({\n// run: ({subject, details}) => administrationApi.deactivate(subject.id, details),\n// onDone: (response) => { toastSuccess(response.message); refreshTable(); },\n// });\n// deactivate.open(row) abre la confirmación sobre ese renglón\n// <ConfirmDialog {...deactivate.dialogProps} title=... description=... />\n//\n// NOTA: run y onDone suelen ser funciones nuevas en cada render; la máquina siempre llama a las más recientes.\n//\n// Hook genérico del paquete, no renderiza: function (regla de la casa).\nimport {useRef} from 'react';\nimport {useMachine} from '@xstate/react';\nimport {fromPromise} from 'xstate';\n\nimport {confirmActionMachine} from '@/feedback/confirmActionMachine.js';\n\n/**\n * @param {object} options\n * @param {(input: {subject: any, details: any}) => Promise<unknown>|void} options.run lo que se hace al confirmar (subject: lo que\n * se le pasó a open)\n * @param {(output: any, subject: any) => void} [options.onDone] output: lo que regresó run\n * @returns {{\n * subject: object|null, isOpen: boolean, isRunning: boolean, error: Error|null,\n * open: (subject: any) => void, confirm: (details?: any) => void, cancel: () => void,\n * dialogProps: {open: boolean, isPending: boolean, errorMessage: string|null, onConfirm: (details?: object) => void, onClose: () => void},\n * }}\n */\nexport function useConfirmAction({run, onDone}) {\n const latestRun = useRef(run);\n const latestOnDone = useRef(onDone);\n latestRun.current = run;\n latestOnDone.current = onDone;\n\n const [snapshot, send] = useMachine(confirmActionMachine.provide({\n actors: {runAction: fromPromise(({input}) => latestRun.current(input))},\n actions: {onDone: ({context}, params) => latestOnDone.current?.(params?.output, context.subject)},\n }));\n\n const {subject, error} = snapshot.context;\n const isOpen = ['confirming', 'running', 'failed'].some((stateName) => snapshot.matches(stateName));\n const isRunning = snapshot.matches('running');\n const confirm = (details) => send({type: 'CONFIRM', details});\n const cancel = () => send({type: 'CANCEL'});\n\n return {\n subject,\n isOpen,\n isRunning,\n error,\n open: (nextSubject) => send({type: 'OPEN', subject: nextSubject}),\n confirm,\n cancel,\n dialogProps: {\n open: isOpen,\n isPending: isRunning,\n errorMessage: error?.message ?? null,\n onConfirm: () => confirm(),\n onClose: cancel,\n },\n };\n}\n"],"names":[],"mappings":";;;;;AA8BO,SAAS,iBAAiB,EAAC,KAAK,OAAM,GAAG;AAC5C,QAAM,YAAY,OAAO,GAAG;AAC5B,QAAM,eAAe,OAAO,MAAM;AAClC,YAAU,UAAU;AACpB,eAAa,UAAU;AAEvB,QAAM,CAAC,UAAU,IAAI,IAAI,WAAW,qBAAqB,QAAQ;AAAA,IAC7D,QAAQ,EAAC,WAAW,YAAY,CAAC,EAAC,MAAK,MAAM,UAAU,QAAQ,KAAK,CAAC,EAAC;AAAA,IACtE,SAAS,EAAC,QAAQ,CAAC,EAAC,QAAO,GAAG,WAAW,aAAa,UAAU,QAAQ,QAAQ,QAAQ,OAAO,EAAC;AAAA,EACxG,CAAK,CAAC;AAEF,QAAM,EAAC,SAAS,MAAK,IAAI,SAAS;AAClC,QAAM,SAAS,CAAC,cAAc,WAAW,QAAQ,EAAE,KAAK,CAAC,cAAc,SAAS,QAAQ,SAAS,CAAC;AAClG,QAAM,YAAY,SAAS,QAAQ,SAAS;AAC5C,QAAM,UAAU,CAAC,YAAY,KAAK,EAAC,MAAM,WAAW,QAAO,CAAC;AAC5D,QAAM,SAAS,MAAM,KAAK,EAAC,MAAM,SAAQ,CAAC;AAE1C,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,CAAC,gBAAgB,KAAK,EAAC,MAAM,QAAQ,SAAS,YAAW,CAAC;AAAA,IAChE;AAAA,IACA;AAAA,IACA,aAAa;AAAA,MACT,MAAM;AAAA,MACN,WAAW;AAAA,MACX,cAAc,OAAO,WAAW;AAAA,MAChC,WAAW,MAAM,QAAO;AAAA,MACxB,SAAS;AAAA,IACrB;AAAA,EACA;AACA;"}
@@ -0,0 +1,256 @@
1
+ "use client";
2
+ import { jsxs, jsx } from "react/jsx-runtime";
3
+ import { useId, useMemo, useRef, useEffect, useCallback } from "react";
4
+ import { useToolkitTranslation } from "../toolkit/useToolkitTranslation.js";
5
+ import Box from "@mui/material/Box";
6
+ import Stack from "@mui/material/Stack";
7
+ import Typography from "@mui/material/Typography";
8
+ import { FileStatus } from "filepond";
9
+ import FilePondPluginFileValidateSize from "filepond-plugin-file-validate-size";
10
+ import FilePondPluginFileValidateType from "filepond-plugin-file-validate-type";
11
+ import { registerPlugin, FilePond } from "react-filepond";
12
+ import "filepond/dist/filepond.min.css";
13
+ import ModalWaiting from "../feedback/ModalWaiting.js";
14
+ import { toastError } from "../feedback/toast.js";
15
+ import { accentTextStylesOf } from "../theme/glassSurface.js";
16
+ import { useFormatters } from "../toolkit/useFormatters.js";
17
+ import { resolveAccept, parseFileSize, FILE_REJECTION } from "../upload/fileRules.js";
18
+ registerPlugin(FilePondPluginFileValidateType, FilePondPluginFileValidateSize);
19
+ const AUTO_REJECT_DELAY_MILLISECONDS = 1800;
20
+ const MAX_FILES_WARNING = "max files";
21
+ function detectFileType(file) {
22
+ const mimeType = (file.type ?? "").toLowerCase();
23
+ if (/^(image|audio|video)\//.test(mimeType)) {
24
+ return Promise.resolve(mimeType);
25
+ }
26
+ const dotPosition = file.name.lastIndexOf(".");
27
+ return Promise.resolve(dotPosition >= 0 ? file.name.slice(dotPosition).toLowerCase() : mimeType);
28
+ }
29
+ function sameFiles(firstFiles, secondFiles) {
30
+ return firstFiles.length === secondFiles.length && firstFiles.every((file, position) => file === secondFiles[position]);
31
+ }
32
+ function filesOf(value, multiple) {
33
+ if (multiple) {
34
+ return Array.isArray(value) ? value : value ? [value] : [];
35
+ }
36
+ return value ? [value] : [];
37
+ }
38
+ function pondLabelsOf(t) {
39
+ return {
40
+ labelFileLoading: t("upload.pond.loading"),
41
+ labelFileLoadError: t("upload.pond.loadError"),
42
+ labelFileWaitingForSize: t("upload.pond.waitingForSize"),
43
+ labelFileSizeNotAvailable: t("upload.pond.sizeNotAvailable"),
44
+ labelInvalidField: t("upload.pond.invalidField"),
45
+ labelFileProcessing: t("upload.pond.processing"),
46
+ labelFileProcessingComplete: t("upload.pond.processingComplete"),
47
+ labelFileProcessingAborted: t("upload.pond.processingAborted"),
48
+ labelFileProcessingError: (error) => error?.body || t("upload.pond.processingError"),
49
+ labelFileProcessingRevertError: t("upload.pond.revertError"),
50
+ labelFileRemoveError: t("upload.pond.removeError"),
51
+ labelTapToCancel: t("upload.pond.tapToCancel"),
52
+ labelTapToRetry: t("upload.pond.tapToRetry"),
53
+ labelTapToUndo: t("upload.pond.tapToUndo"),
54
+ labelButtonRemoveItem: t("upload.pond.remove"),
55
+ labelButtonAbortItemLoad: t("upload.pond.abortLoad"),
56
+ labelButtonRetryItemLoad: t("upload.pond.retryLoad"),
57
+ labelButtonAbortItemProcessing: t("upload.pond.abortProcessing"),
58
+ labelButtonUndoItemProcessing: t("upload.pond.undoProcessing"),
59
+ labelButtonRetryItemProcessing: t("upload.pond.retryProcessing"),
60
+ labelButtonProcessItem: t("upload.pond.processItem")
61
+ };
62
+ }
63
+ function pondThemeSxOf(theme) {
64
+ const { palette } = theme.vars ?? theme;
65
+ return {
66
+ "& .filepond--root": { fontFamily: theme.typography.fontFamily, mb: 0 },
67
+ "& .filepond--panel-root": { bgcolor: palette.background.paper, border: `2px dashed ${palette.divider}`, borderRadius: 2 },
68
+ "& .filepond--drop-label": { color: palette.text.primary },
69
+ // la liga «Elegir archivos»: del color del tema pero legible (accentTextStylesOf); el naranja tal cual se perdía en oscuro
70
+ "& .filepond--label-action": { ...accentTextStylesOf(theme), textDecorationColor: "currentColor" },
71
+ "& .filepond--item-panel": { bgcolor: palette.primary.main },
72
+ "& .filepond--file, & .filepond--file-action-button": { color: palette.primary.contrastText }
73
+ };
74
+ }
75
+ function FileDropzone({
76
+ value = null,
77
+ onChange,
78
+ accept,
79
+ maxSize,
80
+ multiple = false,
81
+ maxFiles,
82
+ maxTotalSize,
83
+ name,
84
+ hint,
85
+ buttonLabel,
86
+ disabled = false,
87
+ busy = false,
88
+ busyModal = false,
89
+ autoReject = true,
90
+ validate = null,
91
+ server = null,
92
+ instantUpload = false,
93
+ apiRef = null,
94
+ onProcessProgress,
95
+ onReject,
96
+ actions,
97
+ children,
98
+ sx,
99
+ texts
100
+ }) {
101
+ const { t } = useToolkitTranslation("common", texts);
102
+ const { formatFileSize } = useFormatters();
103
+ const generatedId = useId();
104
+ const pondName = name ?? `file-dropzone-${generatedId}`;
105
+ const isLocked = disabled || busy;
106
+ const resolvedAccept = useMemo(() => resolveAccept(accept), [accept]);
107
+ const acceptedTypes = useMemo(() => resolvedAccept ? resolvedAccept.split(",") : null, [resolvedAccept]);
108
+ const maxBytes = parseFileSize(maxSize);
109
+ const maxTotalBytes = multiple ? parseFileSize(maxTotalSize) : null;
110
+ const typeErrorLabel = t("upload.invalidTitle");
111
+ const totalErrorLabel = t("upload.totalTooLargeShort");
112
+ const files = useMemo(() => filesOf(value, multiple), [value, multiple]);
113
+ const pondRef = useRef(null);
114
+ const latest = useRef({});
115
+ latest.current = { files, multiple, onChange, onReject, autoReject, validate, onProcessProgress, maxFiles, typeErrorLabel, totalErrorLabel, t };
116
+ useEffect(() => {
117
+ if (apiRef) {
118
+ apiRef.current = pondRef.current;
119
+ }
120
+ });
121
+ const syncFromPond = useCallback(() => {
122
+ const { files: currentFiles, multiple: isMultiple, onChange: emitChange } = latest.current;
123
+ const pondItems = pondRef.current?.getFiles?.() ?? [];
124
+ const nextFiles = pondItems.filter((item) => item.status !== FileStatus.LOAD_ERROR).map((item) => item.file);
125
+ if (isMultiple) {
126
+ if (!sameFiles(nextFiles, currentFiles)) {
127
+ emitChange(nextFiles);
128
+ }
129
+ return;
130
+ }
131
+ const nextFile = nextFiles[0] ?? null;
132
+ if (nextFile !== (currentFiles[0] ?? null)) {
133
+ emitChange(nextFile);
134
+ }
135
+ }, []);
136
+ const handleError = useCallback((error, item) => {
137
+ syncFromPond();
138
+ const { onReject: reject, autoReject: shouldAutoReject, typeErrorLabel: typeLabel, totalErrorLabel: totalLabel } = latest.current;
139
+ let reason = FILE_REJECTION.size;
140
+ if (error?.main === typeLabel) {
141
+ reason = FILE_REJECTION.type;
142
+ } else if (error?.main === totalLabel) {
143
+ reason = FILE_REJECTION.total;
144
+ }
145
+ if (reason === FILE_REJECTION.type && shouldAutoReject && item?.id) {
146
+ setTimeout(() => {
147
+ if (pondRef.current?.getFile?.(item.id)) {
148
+ pondRef.current.removeFile(item.id);
149
+ }
150
+ }, AUTO_REJECT_DELAY_MILLISECONDS);
151
+ }
152
+ if (reject && item?.file) {
153
+ reject(item.file, reason);
154
+ }
155
+ }, [syncFromPond]);
156
+ const handleBeforeAdd = useCallback(async (item) => {
157
+ const { validate: judge, onReject: reject, typeErrorLabel: fallbackMessage } = latest.current;
158
+ if (!judge) {
159
+ return true;
160
+ }
161
+ let verdict;
162
+ try {
163
+ verdict = await judge(item.file);
164
+ } catch {
165
+ verdict = false;
166
+ }
167
+ if (verdict === true) {
168
+ return true;
169
+ }
170
+ const message = typeof verdict === "string" ? verdict : fallbackMessage;
171
+ if (reject) {
172
+ reject(item.file, FILE_REJECTION.content, message);
173
+ } else {
174
+ toastError(`${item.file?.name}: ${message}`);
175
+ }
176
+ return false;
177
+ }, []);
178
+ const handleProcessed = useCallback(() => {
179
+ const report = latest.current.onProcessProgress;
180
+ if (!report) {
181
+ return;
182
+ }
183
+ const pondItems = pondRef.current?.getFiles?.() ?? [];
184
+ report({ done: pondItems.filter((item) => item.status === FileStatus.PROCESSING_COMPLETE).length, total: pondItems.length });
185
+ }, []);
186
+ const handleWarning = useCallback((warning) => {
187
+ const { maxFiles: maxFileCount, onReject: reject, t: translate } = latest.current;
188
+ if (maxFileCount && String(warning?.body ?? "").toLowerCase().includes(MAX_FILES_WARNING)) {
189
+ if (reject) {
190
+ reject(null, FILE_REJECTION.count);
191
+ } else {
192
+ toastError(translate("upload.tooManyFiles", { count: maxFileCount }));
193
+ }
194
+ }
195
+ }, []);
196
+ useEffect(() => {
197
+ const pondItems = pondRef.current?.getFiles?.() ?? [];
198
+ if (files.length === 0 && pondItems.length > 0) {
199
+ pondRef.current.removeFiles();
200
+ }
201
+ }, [files]);
202
+ const limitHints = [
203
+ maxBytes && t("upload.maxSizeHint", { max: formatFileSize(maxBytes) }),
204
+ maxTotalBytes && t("upload.maxTotalSizeHint", { max: formatFileSize(maxTotalBytes) }),
205
+ multiple && maxFiles && t("upload.maxFilesHint", { count: maxFiles })
206
+ ].filter(Boolean);
207
+ const totalBytes = multiple ? files.reduce((sum, file) => sum + (file?.size ?? 0), 0) : 0;
208
+ const hintText = hint ?? (multiple ? t("upload.hintMultiple") : t("upload.hint"));
209
+ const chooseText = buttonLabel ?? (multiple ? t("upload.chooseMultiple") : t("upload.choose"));
210
+ return /* @__PURE__ */ jsxs(Box, { sx: [(theme) => pondThemeSxOf(theme), ...Array.isArray(sx) ? sx : [sx]], children: [
211
+ /* @__PURE__ */ jsx(
212
+ FilePond,
213
+ {
214
+ ref: pondRef,
215
+ name: pondName,
216
+ server,
217
+ instantUpload,
218
+ beforeAddFile: handleBeforeAdd,
219
+ onprocessfile: handleProcessed,
220
+ onupdatefiles: syncFromPond,
221
+ allowMultiple: multiple,
222
+ maxFiles: multiple ? maxFiles ?? null : 1,
223
+ disabled: isLocked,
224
+ allowDrop: !isLocked,
225
+ allowBrowse: !isLocked,
226
+ allowPaste: !isLocked,
227
+ allowRemove: !isLocked,
228
+ allowReplace: !isLocked,
229
+ credits: false,
230
+ acceptedFileTypes: acceptedTypes,
231
+ fileValidateTypeDetectType: detectFileType,
232
+ fileValidateTypeLabelExpectedTypes: resolvedAccept ?? "",
233
+ maxFileSize: maxBytes ? String(maxBytes) : null,
234
+ maxTotalFileSize: maxTotalBytes ? String(maxTotalBytes) : null,
235
+ labelIdle: `${hintText} — <span class="filepond--label-action">${chooseText}</span>`,
236
+ labelFileTypeNotAllowed: typeErrorLabel,
237
+ labelMaxFileSizeExceeded: t("upload.tooLargeShort"),
238
+ labelMaxFileSize: maxBytes ? t("upload.maxSizeHint", { max: formatFileSize(maxBytes) }) : "",
239
+ labelMaxTotalFileSizeExceeded: totalErrorLabel,
240
+ labelMaxTotalFileSize: maxTotalBytes ? t("upload.maxTotalSizeHint", { max: formatFileSize(maxTotalBytes) }) : "",
241
+ onwarning: handleWarning,
242
+ onerror: handleError,
243
+ ...pondLabelsOf(t)
244
+ }
245
+ ),
246
+ multiple && files.length > 0 && /* @__PURE__ */ jsx(Typography, { variant: "body2", sx: { textAlign: "center", mt: 1, fontWeight: 500 }, children: maxTotalBytes ? t("upload.summaryOf", { count: files.length, total: formatFileSize(totalBytes), max: formatFileSize(maxTotalBytes) }) : t("upload.summary", { count: files.length, total: formatFileSize(totalBytes) }) }),
247
+ limitHints.length > 0 && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "text.secondary", sx: { display: "block", textAlign: "center", mt: 0.5 }, children: limitHints.join(" · ") }),
248
+ actions && /* @__PURE__ */ jsx(Stack, { direction: { xs: "column", sm: "row" }, spacing: 2, sx: { justifyContent: "center", alignItems: { xs: "stretch", sm: "center" }, mt: 2 }, children: actions }),
249
+ children && /* @__PURE__ */ jsx(Box, { sx: { mt: 3 }, children }),
250
+ busyModal && /* @__PURE__ */ jsx(ModalWaiting, { open: busy, title: busyModal.title, text: busyModal.text })
251
+ ] });
252
+ }
253
+ export {
254
+ FileDropzone as default
255
+ };
256
+ //# sourceMappingURL=FileDropzone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileDropzone.js","sources":["../../src/filepond/FileDropzone.jsx"],"sourcesContent":["// La zona para soltar archivos con FilePond por dentro (react-filepond): el MISMO uso que la de MUI (FileDropzone de la\n// puerta principal) más varios archivos, animaciones, el error dentro de cada archivo y, si se quiere, la subida de cada\n// archivo con su propia barra de avance (server). Cambiar de una a otra es cambiar el import.\n//\n// Solo ELIGE archivos (controlado: value / onChange). Enviarlos es de la pantalla: arma su FormData y los sube\n// (uploadWithProgress + uploadMachine). Huecos: actions (botones abajo) y children (lo que va debajo).\n//\n// Configuración, además de la de la zona de MUI (accept, maxSize, hint, buttonLabel, disabled, busy, busyModal, onReject):\n// multiple varios archivos: value / onChange hablan en ARREGLOS de File\n// maxFiles tope de archivos (solo con multiple)\n// maxTotalSize tope de lo que pesan todos juntos (solo con multiple), con unidades como maxSize\n// validate revisión del CONTENIDO al entrar: async (file) => true | 'mensaje de rechazo' (un .xml bien formado\n// puede no ser una factura); lo que no pasa no entra a la lista\n// server subir cada archivo por su cuenta con su barra (createPondServer, o un process propio)\n// instantUpload con server, sube al soltar (por omisión NO: regla de la casa, sube cuando la persona oprime el botón,\n// que llama apiRef.current.processFiles())\n// apiRef la API de FilePond para ese botón (processFiles, getFiles, removeFiles…). OJO: processFiles() regresa\n// una promesa que FALLA si algún archivo no subió; el porqué ya se ve en su tarjeta, pero hay que\n// atraparla (.catch) o queda un error suelto en la consola\n// onProcessProgress({done, total}) el «subidos 2 de 5» del modo server\n// autoReject (por omisión sí) lo que no es de un tipo permitido enseña su error un momento y se quita solo\n//\n// OJO, trampa pagada (react-filepond#198): react-filepond no siempre refresca sus funciones después de montar, y puede\n// quedarse para siempre con la del primer render: quitar el archivo no apagaba el botón porque se comparaba contra un\n// value viejo. Blindaje: las funciones que recibe FilePond no cambian nunca (useCallback sin dependencias) y todo lo que\n// necesitan de afuera lo leen de UN ref que cada render vuelve a apuntar (latest).\n//\n// OJO: FilePond va NO controlado. Pasarle los archivos como prop revive archivos recién quitados; la verdad es FilePond y\n// value es su espejo. Lo único que se manda de afuera hacia adentro es LIMPIAR (value vacío vacía la zona).\n//\n// Los colores salen del tema (claro y oscuro) con selectores que le ganan a la hoja de FilePond sin importar el orden.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useCallback, useEffect, useId, useMemo, useRef} from 'react';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport {FileStatus} from 'filepond';\nimport FilePondPluginFileValidateSize from 'filepond-plugin-file-validate-size';\nimport FilePondPluginFileValidateType from 'filepond-plugin-file-validate-type';\nimport {FilePond, registerPlugin} from 'react-filepond';\n// la hoja de FilePond la carga el empaquetador del proyecto junto con la zona (en los tipos se quita: ver\n// scripts/stripStyleImportsFromTypes.js)\nimport 'filepond/dist/filepond.min.css';\n\nimport ModalWaiting from '@/feedback/ModalWaiting.jsx';\nimport {toastError} from '@/feedback/toast.jsx';\nimport {accentTextStylesOf} from '@/theme/glassSurface.js';\nimport {useFormatters} from '@/toolkit/useFormatters.js';\nimport {FILE_REJECTION, parseFileSize, resolveAccept} from '@/upload/fileRules.js';\n\nregisterPlugin(FilePondPluginFileValidateType, FilePondPluginFileValidateSize);\n\n// cuánto se ve el error de un archivo de tipo no permitido antes de quitarse solo: lo suficiente para leer por qué\nconst AUTO_REJECT_DELAY_MILLISECONDS = 1800;\n// el aviso de FilePond cuando se sueltan más archivos de los permitidos\nconst MAX_FILES_WARNING = 'max files';\n\n/**\n * El tipo de un archivo para el complemento de tipos: el paquete habla de EXTENSIONES (.xlsx) y FilePond, por omisión,\n * del tipo MIME. Imagen, audio y video van por su tipo (para que 'image/*' funcione); lo demás, por su extensión.\n *\n * @param {File} file\n * @returns {Promise<string>}\n */\nfunction detectFileType(file) {\n const mimeType = (file.type ?? '').toLowerCase();\n if (/^(image|audio|video)\\//.test(mimeType)) {\n return Promise.resolve(mimeType);\n }\n const dotPosition = file.name.lastIndexOf('.');\n return Promise.resolve(dotPosition >= 0 ? file.name.slice(dotPosition).toLowerCase() : mimeType);\n}\n\n/**\n * ¿Los mismos archivos en el mismo orden?\n *\n * @param {File[]} firstFiles\n * @param {File[]} secondFiles\n * @returns {boolean}\n */\nfunction sameFiles(firstFiles, secondFiles) {\n return firstFiles.length === secondFiles.length && firstFiles.every((file, position) => file === secondFiles[position]);\n}\n\n/**\n * value (File | File[] | null) como arreglo.\n *\n * @param {File|File[]|null} value\n * @param {boolean} multiple\n * @returns {File[]}\n */\nfunction filesOf(value, multiple) {\n if (multiple) {\n return Array.isArray(value) ? value : (value ? [value] : []);\n }\n return value ? [value] : [];\n}\n\n/**\n * Los textos que FilePond pinta dentro de cada tarjeta (vienen en inglés), desde los textos del paquete.\n *\n * El de «no se pudo subir» enseña el mensaje del servidor cuando lo hay (createPondServer manda el título del problema\n * RFC 9457): «No se pudo subir» a secas no le dice a la persona qué corregir.\n *\n * @param {(key: string) => string} t traductor de common\n * @returns {object} props de FilePond\n */\nfunction pondLabelsOf(t) {\n return {\n labelFileLoading: t('upload.pond.loading'),\n labelFileLoadError: t('upload.pond.loadError'),\n labelFileWaitingForSize: t('upload.pond.waitingForSize'),\n labelFileSizeNotAvailable: t('upload.pond.sizeNotAvailable'),\n labelInvalidField: t('upload.pond.invalidField'),\n labelFileProcessing: t('upload.pond.processing'),\n labelFileProcessingComplete: t('upload.pond.processingComplete'),\n labelFileProcessingAborted: t('upload.pond.processingAborted'),\n labelFileProcessingError: (error) => error?.body || t('upload.pond.processingError'),\n labelFileProcessingRevertError: t('upload.pond.revertError'),\n labelFileRemoveError: t('upload.pond.removeError'),\n labelTapToCancel: t('upload.pond.tapToCancel'),\n labelTapToRetry: t('upload.pond.tapToRetry'),\n labelTapToUndo: t('upload.pond.tapToUndo'),\n labelButtonRemoveItem: t('upload.pond.remove'),\n labelButtonAbortItemLoad: t('upload.pond.abortLoad'),\n labelButtonRetryItemLoad: t('upload.pond.retryLoad'),\n labelButtonAbortItemProcessing: t('upload.pond.abortProcessing'),\n labelButtonUndoItemProcessing: t('upload.pond.undoProcessing'),\n labelButtonRetryItemProcessing: t('upload.pond.retryProcessing'),\n labelButtonProcessItem: t('upload.pond.processItem'),\n };\n}\n\n/**\n * Los colores de FilePond desde el tema. El «& » los anida dentro de la caja: pesan más que los de la hoja de FilePond\n * aunque esa hoja cargue después.\n *\n * @param {object} theme tema de MUI (con o sin variables CSS)\n * @returns {object}\n */\nfunction pondThemeSxOf(theme) {\n const {palette} = theme.vars ?? theme;\n return {\n '& .filepond--root': {fontFamily: theme.typography.fontFamily, mb: 0},\n '& .filepond--panel-root': {bgcolor: palette.background.paper, border: `2px dashed ${palette.divider}`, borderRadius: 2},\n '& .filepond--drop-label': {color: palette.text.primary},\n // la liga «Elegir archivos»: del color del tema pero legible (accentTextStylesOf); el naranja tal cual se perdía en oscuro\n '& .filepond--label-action': {...accentTextStylesOf(theme), textDecorationColor: 'currentColor'},\n '& .filepond--item-panel': {bgcolor: palette.primary.main},\n '& .filepond--file, & .filepond--file-action-button': {color: palette.primary.contrastText},\n };\n}\n\n/**\n * @param {object} props\n * @param {File|File[]|null} [props.value]\n * @param {(value: File|File[]|null) => void} props.onChange\n * @param {string|string[]} [props.accept]\n * @param {number|string} [props.maxSize] por archivo\n * @param {boolean} [props.multiple]\n * @param {number} [props.maxFiles]\n * @param {number|string} [props.maxTotalSize]\n * @param {string} [props.name] nombre del campo; por omisión uno propio por zona (dos zonas no se pisan)\n * @param {string} [props.hint]\n * @param {string} [props.buttonLabel]\n * @param {boolean} [props.disabled]\n * @param {boolean} [props.busy]\n * @param {boolean|{title?: string, text?: string}} [props.busyModal]\n * @param {boolean} [props.autoReject]\n * @param {((file: File) => Promise<true|string>)|null} [props.validate]\n * @param {object|null} [props.server] createPondServer(...) o {process} propio\n * @param {boolean} [props.instantUpload]\n * @param {{current: object|null}|null} [props.apiRef]\n * @param {(progress: {done: number, total: number}) => void} [props.onProcessProgress]\n * @param {(file: File|null, reason: string, message?: string) => void} [props.onReject] reason de FILE_REJECTION\n * @param {import('react').ReactNode} [props.actions]\n * @param {import('react').ReactNode} [props.children]\n * @param {object} [props.sx]\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nexport default function FileDropzone({\n value = null, onChange, accept, maxSize, multiple = false, maxFiles, maxTotalSize, name, hint, buttonLabel, disabled = false,\n busy = false, busyModal = false, autoReject = true, validate = null, server = null, instantUpload = false, apiRef = null,\n onProcessProgress, onReject, actions, children, sx, texts,\n}) {\n const {t} = useToolkitTranslation('common', texts);\n const {formatFileSize} = useFormatters();\n const generatedId = useId();\n const pondName = name ?? `file-dropzone-${generatedId}`;\n // el candado: apagado o subiendo. Va también en cada allow* de FilePond, no solo en lo visual\n const isLocked = disabled || busy;\n\n const resolvedAccept = useMemo(() => resolveAccept(accept), [accept]);\n const acceptedTypes = useMemo(() => (resolvedAccept ? resolvedAccept.split(',') : null), [resolvedAccept]);\n const maxBytes = parseFileSize(maxSize);\n const maxTotalBytes = multiple ? parseFileSize(maxTotalSize) : null;\n const typeErrorLabel = t('upload.invalidTitle');\n const totalErrorLabel = t('upload.totalTooLargeShort');\n const files = useMemo(() => filesOf(value, multiple), [value, multiple]);\n\n const pondRef = useRef(null);\n // lo que las funciones fijas necesitan de afuera, siempre al día (ver la trampa del encabezado)\n const latest = useRef({});\n latest.current = {files, multiple, onChange, onReject, autoReject, validate, onProcessProgress, maxFiles, typeErrorLabel, totalErrorLabel, t};\n\n useEffect(() => {\n if (apiRef) {\n apiRef.current = pondRef.current;\n }\n });\n\n // value desde FilePond. Los archivos con error se quedan en pantalla (en rojo) pero no cuentan: con un archivo malo\n // el botón de enviar no se prende. Y un removeFiles() hecho desde aquí no debe avisar un cambio fantasma\n const syncFromPond = useCallback(() => {\n const {files: currentFiles, multiple: isMultiple, onChange: emitChange} = latest.current;\n const pondItems = pondRef.current?.getFiles?.() ?? [];\n const nextFiles = pondItems.filter((item) => item.status !== FileStatus.LOAD_ERROR).map((item) => item.file);\n if (isMultiple) {\n if (!sameFiles(nextFiles, currentFiles)) {\n emitChange(nextFiles);\n }\n return;\n }\n const nextFile = nextFiles[0] ?? null;\n if (nextFile !== (currentFiles[0] ?? null)) {\n emitChange(nextFile);\n }\n }, []);\n\n const handleError = useCallback((error, item) => {\n // el archivo acaba de quedar con error: se saca de value\n syncFromPond();\n const {onReject: reject, autoReject: shouldAutoReject, typeErrorLabel: typeLabel, totalErrorLabel: totalLabel} = latest.current;\n // el motivo se reconoce por el texto, que es nuestro: comparación estable\n let reason = FILE_REJECTION.size;\n if (error?.main === typeLabel) {\n reason = FILE_REJECTION.type;\n } else if (error?.main === totalLabel) {\n reason = FILE_REJECTION.total;\n }\n // el de tipo no permitido se va solo después de que se lea su error; el de peso se queda para saber cuál pesa de más\n if (reason === FILE_REJECTION.type && shouldAutoReject && item?.id) {\n setTimeout(() => {\n if (pondRef.current?.getFile?.(item.id)) {\n pondRef.current.removeFile(item.id);\n }\n }, AUTO_REJECT_DELAY_MILLISECONDS);\n }\n if (reject && item?.file) {\n reject(item.file, reason);\n }\n }, [syncFromPond]);\n\n // la revisión del contenido, ANTES de que el archivo entre a la lista\n const handleBeforeAdd = useCallback(async (item) => {\n const {validate: judge, onReject: reject, typeErrorLabel: fallbackMessage} = latest.current;\n if (!judge) {\n return true;\n }\n let verdict;\n try {\n verdict = await judge(item.file);\n } catch {\n verdict = false;\n }\n if (verdict === true) {\n return true;\n }\n const message = typeof verdict === 'string' ? verdict : fallbackMessage;\n if (reject) {\n reject(item.file, FILE_REJECTION.content, message);\n } else {\n toastError(`${item.file?.name}: ${message}`);\n }\n return false;\n }, []);\n\n // el «subidos X de N» del modo server: cada archivo que termina su subida avisa la cuenta\n const handleProcessed = useCallback(() => {\n const report = latest.current.onProcessProgress;\n if (!report) {\n return;\n }\n const pondItems = pondRef.current?.getFiles?.() ?? [];\n report({done: pondItems.filter((item) => item.status === FileStatus.PROCESSING_COMPLETE).length, total: pondItems.length});\n }, []);\n\n // lo que pasa de maxFiles ni siquiera entra (FilePond corta lo soltado y solo avisa): el aviso lo damos nosotros\n const handleWarning = useCallback((warning) => {\n const {maxFiles: maxFileCount, onReject: reject, t: translate} = latest.current;\n if (maxFileCount && String(warning?.body ?? '').toLowerCase().includes(MAX_FILES_WARNING)) {\n if (reject) {\n reject(null, FILE_REJECTION.count);\n } else {\n toastError(translate('upload.tooManyFiles', {count: maxFileCount}));\n }\n }\n }, []);\n\n // limpiar desde afuera: value vacío (p. ej. después de subir bien) vacía la zona\n useEffect(() => {\n const pondItems = pondRef.current?.getFiles?.() ?? [];\n if (files.length === 0 && pondItems.length > 0) {\n pondRef.current.removeFiles();\n }\n }, [files]);\n\n const limitHints = [\n maxBytes && t('upload.maxSizeHint', {max: formatFileSize(maxBytes)}),\n maxTotalBytes && t('upload.maxTotalSizeHint', {max: formatFileSize(maxTotalBytes)}),\n multiple && maxFiles && t('upload.maxFilesHint', {count: maxFiles}),\n ].filter(Boolean);\n // con varios archivos se dice cuántos van y cuánto pesan juntos: nadie suma tarjeta por tarjeta\n const totalBytes = multiple ? files.reduce((sum, file) => sum + (file?.size ?? 0), 0) : 0;\n const hintText = hint ?? (multiple ? t('upload.hintMultiple') : t('upload.hint'));\n const chooseText = buttonLabel ?? (multiple ? t('upload.chooseMultiple') : t('upload.choose'));\n\n return (\n <Box sx={[(theme) => pondThemeSxOf(theme), ...(Array.isArray(sx) ? sx : [sx])]}>\n <FilePond\n ref={pondRef}\n name={pondName}\n server={server}\n instantUpload={instantUpload}\n beforeAddFile={handleBeforeAdd}\n onprocessfile={handleProcessed}\n onupdatefiles={syncFromPond}\n allowMultiple={multiple}\n maxFiles={multiple ? (maxFiles ?? null) : 1}\n disabled={isLocked}\n allowDrop={!isLocked}\n allowBrowse={!isLocked}\n allowPaste={!isLocked}\n allowRemove={!isLocked}\n allowReplace={!isLocked}\n credits={false}\n acceptedFileTypes={acceptedTypes}\n fileValidateTypeDetectType={detectFileType}\n fileValidateTypeLabelExpectedTypes={resolvedAccept ?? ''}\n maxFileSize={maxBytes ? String(maxBytes) : null}\n maxTotalFileSize={maxTotalBytes ? String(maxTotalBytes) : null}\n labelIdle={`${hintText} — <span class=\"filepond--label-action\">${chooseText}</span>`}\n labelFileTypeNotAllowed={typeErrorLabel}\n labelMaxFileSizeExceeded={t('upload.tooLargeShort')}\n labelMaxFileSize={maxBytes ? t('upload.maxSizeHint', {max: formatFileSize(maxBytes)}) : ''}\n labelMaxTotalFileSizeExceeded={totalErrorLabel}\n labelMaxTotalFileSize={maxTotalBytes ? t('upload.maxTotalSizeHint', {max: formatFileSize(maxTotalBytes)}) : ''}\n onwarning={handleWarning}\n onerror={handleError}\n {...pondLabelsOf(t)}\n />\n {multiple && files.length > 0 && (\n <Typography variant=\"body2\" sx={{textAlign: 'center', mt: 1, fontWeight: 500}}>\n {maxTotalBytes\n ? t('upload.summaryOf', {count: files.length, total: formatFileSize(totalBytes), max: formatFileSize(maxTotalBytes)})\n : t('upload.summary', {count: files.length, total: formatFileSize(totalBytes)})}\n </Typography>\n )}\n {limitHints.length > 0 && (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{display: 'block', textAlign: 'center', mt: 0.5}}>\n {limitHints.join(' · ')}\n </Typography>\n )}\n {actions && (\n <Stack direction={{xs: 'column', sm: 'row'}} spacing={2} sx={{justifyContent: 'center', alignItems: {xs: 'stretch', sm: 'center'}, mt: 2}}>\n {actions}\n </Stack>\n )}\n {children && <Box sx={{mt: 3}}>{children}</Box>}\n {busyModal && <ModalWaiting open={busy} title={busyModal.title} text={busyModal.text} />}\n </Box>\n );\n}\n"],"names":[],"mappings":"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"}