@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
package/dist/dates.js ADDED
@@ -0,0 +1,25 @@
1
+ const PLAIN_DATE_PATTERN = /^(\d{4})-(\d{2})-(\d{2})$/;
2
+ function parseInstant(value) {
3
+ if (value === null || value === void 0 || value === "") {
4
+ return null;
5
+ }
6
+ const instant = new Date(value);
7
+ return Number.isNaN(instant.getTime()) ? null : instant;
8
+ }
9
+ function parsePlainDate(value) {
10
+ const match = typeof value === "string" ? PLAIN_DATE_PATTERN.exec(value) : null;
11
+ if (!match) {
12
+ return null;
13
+ }
14
+ const [year, month, day] = [Number(match[1]), Number(match[2]), Number(match[3])];
15
+ const calendarDate = new Date(Date.UTC(year, month - 1, day));
16
+ if (calendarDate.getUTCMonth() !== month - 1 || calendarDate.getUTCDate() !== day) {
17
+ return null;
18
+ }
19
+ return { year, month, day };
20
+ }
21
+ export {
22
+ parseInstant,
23
+ parsePlainDate
24
+ };
25
+ //# sourceMappingURL=dates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dates.js","sources":["../src/dates.js"],"sourcesContent":["// Fechas que llegan del API, leídas sin librería (Date + Intl).\n//\n// La zona en que se pintan las horas es la del proveedor (`timeZone` de ToolkitProvider; por omisión la del navegador).\n// Un negocio que decide sus cortes en una zona fija la pasa ahí, para que alguien que abre la pantalla desde otra zona\n// vea la misma hora que ve operación.\n//\n// El backend manda instantes ISO con desfase (UTC) y fechas de calendario sin hora (\"2026-08-16\"). Son dos cosas\n// distintas:\n// - un instante es un punto en el tiempo (parseInstant); la zona del negocio la aplica Intl con timeZone al\n// pintarlo (formatting.js), así que aquí no se convierte nada;\n// - una fecha de calendario NO tiene zona: pasarla por Date la podría correr un día (parsePlainDate la separa en\n// año, mes y día).\n//\n// Funciones puras, no renderizan: function (regla de la casa).\n\nconst PLAIN_DATE_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\n/**\n * Un instante (ISO con desfase, milisegundos o Date) como Date válido.\n *\n * @param {string|Date|number|null|undefined} value\n * @returns {Date|null} null si no hay dato o no es una fecha válida\n */\nexport function parseInstant(value) {\n if (value === null || value === undefined || value === '') {\n return null;\n }\n const instant = new Date(value);\n return Number.isNaN(instant.getTime()) ? null : instant;\n}\n\n/**\n * Una fecha de calendario (\"2026-08-16\") en sus partes, sin moverla de zona.\n *\n * @param {string|null|undefined} value\n * @returns {{year: number, month: number, day: number}|null} null si no tiene la forma o no existe (2026-02-31)\n */\nexport function parsePlainDate(value) {\n const match = typeof value === 'string' ? PLAIN_DATE_PATTERN.exec(value) : null;\n if (!match) {\n return null;\n }\n const [year, month, day] = [Number(match[1]), Number(match[2]), Number(match[3])];\n // guard clause: Date.UTC \"arregla\" el 31 de febrero pasándolo a marzo; si el día cambió, la fecha no existe\n const calendarDate = new Date(Date.UTC(year, month - 1, day));\n if (calendarDate.getUTCMonth() !== month - 1 || calendarDate.getUTCDate() !== day) {\n return null;\n }\n return {year, month, day};\n}\n"],"names":[],"mappings":"AAeA,MAAM,qBAAqB;AAQpB,SAAS,aAAa,OAAO;AAChC,MAAI,UAAU,QAAQ,UAAU,UAAa,UAAU,IAAI;AACvD,WAAO;AAAA,EACX;AACA,QAAM,UAAU,IAAI,KAAK,KAAK;AAC9B,SAAO,OAAO,MAAM,QAAQ,QAAO,CAAE,IAAI,OAAO;AACpD;AAQO,SAAS,eAAe,OAAO;AAClC,QAAM,QAAQ,OAAO,UAAU,WAAW,mBAAmB,KAAK,KAAK,IAAI;AAC3E,MAAI,CAAC,OAAO;AACR,WAAO;AAAA,EACX;AACA,QAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,MAAM,CAAC,CAAC,GAAG,OAAO,MAAM,CAAC,CAAC,GAAG,OAAO,MAAM,CAAC,CAAC,CAAC;AAEhF,QAAM,eAAe,IAAI,KAAK,KAAK,IAAI,MAAM,QAAQ,GAAG,GAAG,CAAC;AAC5D,MAAI,aAAa,YAAW,MAAO,QAAQ,KAAK,aAAa,WAAU,MAAO,KAAK;AAC/E,WAAO;AAAA,EACX;AACA,SAAO,EAAC,MAAM,OAAO,IAAG;AAC5B;"}
@@ -0,0 +1,48 @@
1
+ import { createLogger } from "../observability/logger.js";
2
+ const log = createLogger("dictionaries");
3
+ const NAMESPACE = "dictionaries";
4
+ const UNKNOWN_ENTRY = Object.freeze({
5
+ value: null,
6
+ labelKey: `${NAMESPACE}:unknown.label`,
7
+ tooltipKey: `${NAMESPACE}:unknown.tooltip`,
8
+ color: "default",
9
+ isKnown: false
10
+ });
11
+ function dictionaryEntryOf(value, keyPrefix, color, { hasShortLabel = false } = {}) {
12
+ return Object.freeze({
13
+ value,
14
+ labelKey: `${NAMESPACE}:${keyPrefix}.label`,
15
+ tooltipKey: `${NAMESPACE}:${keyPrefix}.tooltip`,
16
+ ...hasShortLabel ? { shortLabelKey: `${NAMESPACE}:${keyPrefix}.shortLabel` } : {},
17
+ color,
18
+ isKnown: true
19
+ });
20
+ }
21
+ function lookup(dictionary, value) {
22
+ if (value !== null && value !== void 0 && Object.hasOwn(dictionary, value)) {
23
+ return dictionary[value];
24
+ }
25
+ if (value !== null && value !== void 0) {
26
+ log.warn("valor sin entrada en el diccionario", { value });
27
+ }
28
+ return { ...UNKNOWN_ENTRY, value: value ?? null };
29
+ }
30
+ function labelOf(dictionaryEntry, translate) {
31
+ if (dictionaryEntry.isKnown || dictionaryEntry.value === null) {
32
+ return translate(dictionaryEntry.labelKey);
33
+ }
34
+ return dictionaryEntry.value;
35
+ }
36
+ function shortLabelOf(dictionaryEntry, translate) {
37
+ if (dictionaryEntry.isKnown && dictionaryEntry.shortLabelKey) {
38
+ return translate(dictionaryEntry.shortLabelKey);
39
+ }
40
+ return labelOf(dictionaryEntry, translate);
41
+ }
42
+ export {
43
+ dictionaryEntryOf,
44
+ labelOf,
45
+ lookup,
46
+ shortLabelOf
47
+ };
48
+ //# sourceMappingURL=dictionaries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dictionaries.js","sources":["../../src/dictionaries/dictionaries.js"],"sourcesContent":["// Diccionarios de valores cerrados que llegan del API → etiqueta, tooltip y color del chip (StatusChip, DictionaryText).\n//\n// El paquete trae el mecanismo; los diccionarios los arma cada proyecto con dictionaryEntryOf:\n//\n// export const ORDER_STATUS = Object.freeze({\n// pending: dictionaryEntryOf('pending', 'orderStatus.pending', 'warning'),\n// paid: dictionaryEntryOf('paid', 'orderStatus.paid', 'success'),\n// });\n//\n// Forma de cada entrada: {value, labelKey, tooltipKey, color, isKnown} y, solo en algunas, shortLabelKey\n// - value: el código del API tal cual.\n// - labelKey / tooltipKey: llaves de texto del namespace \"dictionaries\" (los textos los pone el proyecto con `texts` o\n// `translate` de ToolkitProvider). El texto NUNCA va aquí: así cambia de idioma sin tocar el diccionario.\n// - shortLabelKey: palabra corta para una columna angosta («Rechazada» por «Rechazada por estructura»). Solo la traen\n// las entradas cuyo nombre completo no cabe; quien la pinta deja el nombre completo en el tooltip (StatusChip, short).\n// - color: color de paleta de MUI (success, warning, error, info, default).\n// - isKnown: false solo en la entrada \"unknown\"; sirve para pintar el código crudo cuando no hay texto (p. ej. un\n// estatus nuevo que el backend empezó a mandar).\n//\n// Se congelan con Object.freeze para que nadie los mute por accidente desde una pantalla.\n// Un valor que el API mande y no esté en el diccionario no truena la pantalla: lookup regresa la entrada \"unknown\" y lo\n// anota en el log para agregarlo.\n//\n// Funciones puras, no renderizan: function (regla de la casa).\nimport {createLogger} from '@/observability/logger.js';\n\nconst log = createLogger('dictionaries');\n\nconst NAMESPACE = 'dictionaries';\n\nconst UNKNOWN_ENTRY = Object.freeze({\n value: null,\n labelKey: `${NAMESPACE}:unknown.label`,\n tooltipKey: `${NAMESPACE}:unknown.tooltip`,\n color: 'default',\n isKnown: false,\n});\n\n/**\n * Una entrada de diccionario, congelada.\n *\n * @param {string} value el código del API\n * @param {string} keyPrefix dónde viven sus textos dentro del namespace dictionaries ('orderStatus.paid' → orderStatus.paid.label)\n * @param {string} color color de paleta de MUI\n * @param {{hasShortLabel?: boolean}} [options] hasShortLabel: trae palabra corta (keyPrefix.shortLabel)\n * @returns {{value: string, labelKey: string, tooltipKey: string, shortLabelKey?: string, color: string, isKnown: boolean}}\n */\nexport function dictionaryEntryOf(value, keyPrefix, color, {hasShortLabel = false} = {}) {\n return Object.freeze({\n value,\n labelKey: `${NAMESPACE}:${keyPrefix}.label`,\n tooltipKey: `${NAMESPACE}:${keyPrefix}.tooltip`,\n ...(hasShortLabel ? {shortLabelKey: `${NAMESPACE}:${keyPrefix}.shortLabel`} : {}),\n color,\n isKnown: true,\n });\n}\n\n/**\n * La entrada del diccionario para un valor del API.\n *\n * @param {Record<string, object>} dictionary p. ej. ORDER_STATUS\n * @param {string|null|undefined} value código del API\n * @returns {{value: string|null, labelKey: string, tooltipKey: string, color: string, isKnown: boolean}}\n */\nexport function lookup(dictionary, value) {\n if (value !== null && value !== undefined && Object.hasOwn(dictionary, value)) {\n return dictionary[value];\n }\n if (value !== null && value !== undefined) {\n log.warn('valor sin entrada en el diccionario', {value});\n }\n return {...UNKNOWN_ENTRY, value: value ?? null};\n}\n\n/**\n * Texto que se pinta para una entrada: su etiqueta traducida o, si el valor no está en el diccionario, el código\n * crudo. Un estatus nuevo se lee con su código y no como \"Sin estatus\".\n *\n * @param {{value: string|null, labelKey: string, isKnown: boolean}} dictionaryEntry lo que regresa lookup\n * @param {(key: string) => string} translate el t de useToolkitTranslation\n * @returns {string}\n */\nexport function labelOf(dictionaryEntry, translate) {\n if (dictionaryEntry.isKnown || dictionaryEntry.value === null) {\n return translate(dictionaryEntry.labelKey);\n }\n return dictionaryEntry.value;\n}\n\n/**\n * La palabra corta de una entrada, para una columna angosta. Una entrada sin palabra corta regresa su etiqueta de siempre.\n *\n * @param {object} dictionaryEntry entrada del diccionario (lookup)\n * @param {Function} translate traductor\n * @returns {string}\n */\nexport function shortLabelOf(dictionaryEntry, translate) {\n if (dictionaryEntry.isKnown && dictionaryEntry.shortLabelKey) {\n return translate(dictionaryEntry.shortLabelKey);\n }\n return labelOf(dictionaryEntry, translate);\n}\n"],"names":[],"mappings":";AA0BA,MAAM,MAAM,aAAa,cAAc;AAEvC,MAAM,YAAY;AAElB,MAAM,gBAAgB,OAAO,OAAO;AAAA,EAChC,OAAO;AAAA,EACP,UAAU,GAAG,SAAS;AAAA,EACtB,YAAY,GAAG,SAAS;AAAA,EACxB,OAAO;AAAA,EACP,SAAS;AACb,CAAC;AAWM,SAAS,kBAAkB,OAAO,WAAW,OAAO,EAAC,gBAAgB,MAAK,IAAI,IAAI;AACrF,SAAO,OAAO,OAAO;AAAA,IACjB;AAAA,IACA,UAAU,GAAG,SAAS,IAAI,SAAS;AAAA,IACnC,YAAY,GAAG,SAAS,IAAI,SAAS;AAAA,IACrC,GAAI,gBAAgB,EAAC,eAAe,GAAG,SAAS,IAAI,SAAS,cAAa,IAAI;IAC9E;AAAA,IACA,SAAS;AAAA,EACjB,CAAK;AACL;AASO,SAAS,OAAO,YAAY,OAAO;AACtC,MAAI,UAAU,QAAQ,UAAU,UAAa,OAAO,OAAO,YAAY,KAAK,GAAG;AAC3E,WAAO,WAAW,KAAK;AAAA,EAC3B;AACA,MAAI,UAAU,QAAQ,UAAU,QAAW;AACvC,QAAI,KAAK,uCAAuC,EAAC,MAAK,CAAC;AAAA,EAC3D;AACA,SAAO,EAAC,GAAG,eAAe,OAAO,SAAS,KAAI;AAClD;AAUO,SAAS,QAAQ,iBAAiB,WAAW;AAChD,MAAI,gBAAgB,WAAW,gBAAgB,UAAU,MAAM;AAC3D,WAAO,UAAU,gBAAgB,QAAQ;AAAA,EAC7C;AACA,SAAO,gBAAgB;AAC3B;AASO,SAAS,aAAa,iBAAiB,WAAW;AACrD,MAAI,gBAAgB,WAAW,gBAAgB,eAAe;AAC1D,WAAO,UAAU,gBAAgB,aAAa;AAAA,EAClD;AACA,SAAO,QAAQ,iBAAiB,SAAS;AAC7C;"}
@@ -0,0 +1,195 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState, useRef, useEffect, Fragment } from "react";
4
+ import { useToolkitTranslation } from "../toolkit/useToolkitTranslation.js";
5
+ import { useSelector } from "@xstate/react";
6
+ import Box from "@mui/material/Box";
7
+ import CircularProgress from "@mui/material/CircularProgress";
8
+ import Collapse from "@mui/material/Collapse";
9
+ import Divider from "@mui/material/Divider";
10
+ import IconButton from "@mui/material/IconButton";
11
+ import List from "@mui/material/List";
12
+ import ListItem from "@mui/material/ListItem";
13
+ import Paper from "@mui/material/Paper";
14
+ import Slide from "@mui/material/Slide";
15
+ import Stack from "@mui/material/Stack";
16
+ import Tooltip from "@mui/material/Tooltip";
17
+ import Typography from "@mui/material/Typography";
18
+ import BlockOutlinedIcon from "@mui/icons-material/BlockOutlined";
19
+ import CheckCircleIcon from "@mui/icons-material/CheckCircle";
20
+ import CloseIcon from "@mui/icons-material/Close";
21
+ import ErrorOutlineIcon from "@mui/icons-material/ErrorOutline";
22
+ import ExpandLessIcon from "@mui/icons-material/ExpandLess";
23
+ import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
24
+ import { downloadsActor, countActiveDownloads, clearFinishedDownloads, cancelDownload } from "./downloadQueue.js";
25
+ import { useFileTypes, UNKNOWN_FILE_TYPE } from "./fileTypes.js";
26
+ import { DOWNLOAD_STATUS } from "./downloadsMachine.js";
27
+ import { useFormatters } from "../toolkit/useFormatters.js";
28
+ import { isGlassTheme, glassStylesOf } from "../theme/glassSurface.js";
29
+ import ComponentTexts from "../toolkit/ComponentTexts.js";
30
+ const AUTO_DISMISS_MILLISECONDS = 5e3;
31
+ const SCREEN_EDGE_SPACING = 3;
32
+ const PANEL_WIDTH_PIXELS = 360;
33
+ const LIST_MAX_HEIGHT = "40vh";
34
+ const PROGRESS_RING_PIXELS = 22;
35
+ function fileTypeAppearanceOf(download, fileTypes) {
36
+ const extension = download.fileName?.split(".").pop()?.toLowerCase();
37
+ const fileType = fileTypes[download.format ?? extension];
38
+ return fileType ? { Icon: fileType.Icon ?? UNKNOWN_FILE_TYPE.Icon, color: fileType.color ?? UNKNOWN_FILE_TYPE.color } : UNKNOWN_FILE_TYPE;
39
+ }
40
+ function detailTextOf(download, t, formatFileSize) {
41
+ if (download.status === DOWNLOAD_STATUS.completed) {
42
+ return formatFileSize(download.loadedBytes);
43
+ }
44
+ if (download.status === DOWNLOAD_STATUS.failed) {
45
+ return download.errorMessage ?? t("downloads.failed");
46
+ }
47
+ if (download.status === DOWNLOAD_STATUS.canceled) {
48
+ return t("downloads.canceled");
49
+ }
50
+ if (download.loadedBytes === 0) {
51
+ return t("downloads.preparing");
52
+ }
53
+ return download.totalBytes ? t("downloads.progressOf", { loaded: formatFileSize(download.loadedBytes), total: formatFileSize(download.totalBytes) }) : t("downloads.progressLoaded", { loaded: formatFileSize(download.loadedBytes) });
54
+ }
55
+ function summaryTextOf(downloads, t) {
56
+ const activeCount = countActiveDownloads(downloads);
57
+ if (activeCount > 0) {
58
+ return t("downloads.summaryDownloading", { count: activeCount });
59
+ }
60
+ const failedCount = downloads.filter((download) => download.status === DOWNLOAD_STATUS.failed).length;
61
+ if (failedCount > 0) {
62
+ return t("downloads.summaryFailed", { count: failedCount });
63
+ }
64
+ const completedCount = downloads.filter((download) => download.status === DOWNLOAD_STATUS.completed).length;
65
+ return t("downloads.summaryCompleted", { count: completedCount });
66
+ }
67
+ function DownloadStatusIndicator({ download, displayName }) {
68
+ const { t } = useToolkitTranslation("common");
69
+ if (download.status === DOWNLOAD_STATUS.completed) {
70
+ return /* @__PURE__ */ jsx(CheckCircleIcon, { sx: { color: "success.main" }, "aria-label": t("downloads.completedOf", { name: displayName }) });
71
+ }
72
+ if (download.status === DOWNLOAD_STATUS.failed) {
73
+ return /* @__PURE__ */ jsx(ErrorOutlineIcon, { sx: { color: "error.main" }, "aria-label": t("downloads.failedOf", { name: displayName }) });
74
+ }
75
+ if (download.status === DOWNLOAD_STATUS.canceled) {
76
+ return /* @__PURE__ */ jsx(BlockOutlinedIcon, { sx: { color: "text.disabled" }, "aria-label": t("downloads.canceledOf", { name: displayName }) });
77
+ }
78
+ const hasKnownSize = Boolean(download.totalBytes);
79
+ return /* @__PURE__ */ jsx(Tooltip, { title: t("downloads.cancel"), children: /* @__PURE__ */ jsxs(
80
+ IconButton,
81
+ {
82
+ size: "small",
83
+ "aria-label": t("downloads.cancelOf", { name: displayName }),
84
+ onClick: () => cancelDownload(download.id),
85
+ sx: { position: "relative", width: PROGRESS_RING_PIXELS + 10, height: PROGRESS_RING_PIXELS + 10 },
86
+ children: [
87
+ /* @__PURE__ */ jsx(
88
+ CircularProgress,
89
+ {
90
+ size: PROGRESS_RING_PIXELS,
91
+ thickness: 4,
92
+ variant: hasKnownSize ? "determinate" : "indeterminate",
93
+ value: hasKnownSize ? Math.min(100, download.loadedBytes * 100 / download.totalBytes) : void 0,
94
+ sx: { position: "absolute" }
95
+ }
96
+ ),
97
+ /* @__PURE__ */ jsx(CloseIcon, { sx: { fontSize: 12 } })
98
+ ]
99
+ }
100
+ ) });
101
+ }
102
+ function DownloadRow({ download }) {
103
+ const { t } = useToolkitTranslation("common");
104
+ const { formatFileSize } = useFormatters();
105
+ const { Icon, color } = fileTypeAppearanceOf(download, useFileTypes());
106
+ const displayName = download.fileName ?? download.label;
107
+ const isFailed = download.status === DOWNLOAD_STATUS.failed;
108
+ return (
109
+ // minWidth 0: sin él un nombre largo empuja el renglón y la lista enseña una barra horizontal
110
+ /* @__PURE__ */ jsxs(ListItem, { disableGutters: true, sx: { gap: 1.5, px: 2, py: 1, minWidth: 0 }, children: [
111
+ /* @__PURE__ */ jsx(Icon, { fontSize: "small", sx: { color, flexShrink: 0 } }),
112
+ /* @__PURE__ */ jsxs(Box, { sx: { minWidth: 0, flex: 1 }, children: [
113
+ /* @__PURE__ */ jsx(Tooltip, { title: displayName, children: /* @__PURE__ */ jsx(Typography, { variant: "body2", noWrap: true, children: displayName }) }),
114
+ /* @__PURE__ */ jsx(
115
+ Typography,
116
+ {
117
+ variant: "caption",
118
+ component: "p",
119
+ noWrap: !isFailed,
120
+ sx: { color: isFailed ? "error.main" : "text.secondary" },
121
+ children: detailTextOf(download, t, formatFileSize)
122
+ }
123
+ )
124
+ ] }),
125
+ /* @__PURE__ */ jsx(Box, { sx: { flexShrink: 0, display: "flex", alignItems: "center" }, children: /* @__PURE__ */ jsx(DownloadStatusIndicator, { download, displayName }) })
126
+ ] })
127
+ );
128
+ }
129
+ function DownloadManager({ texts } = {}) {
130
+ const { t } = useToolkitTranslation("common", texts);
131
+ const downloads = useSelector(downloadsActor, (snapshot) => snapshot.context.downloads);
132
+ const [isExpanded, setIsExpanded] = useState(true);
133
+ const previousCountRef = useRef(downloads.length);
134
+ const activeCount = countActiveDownloads(downloads);
135
+ const allSucceeded = downloads.length > 0 && downloads.every((download) => download.status === DOWNLOAD_STATUS.completed);
136
+ useEffect(() => {
137
+ if (downloads.length > previousCountRef.current) {
138
+ setIsExpanded(true);
139
+ }
140
+ previousCountRef.current = downloads.length;
141
+ }, [downloads.length]);
142
+ useEffect(() => {
143
+ if (!allSucceeded) {
144
+ return void 0;
145
+ }
146
+ const dismissTimer = setTimeout(clearFinishedDownloads, AUTO_DISMISS_MILLISECONDS);
147
+ return () => clearTimeout(dismissTimer);
148
+ }, [allSucceeded, downloads.length]);
149
+ return /* @__PURE__ */ jsx(ComponentTexts, { namespace: "common", texts, children: /* @__PURE__ */ jsx(Slide, { direction: "up", in: downloads.length > 0, mountOnEnter: true, unmountOnExit: true, children: /* @__PURE__ */ jsxs(
150
+ Paper,
151
+ {
152
+ elevation: 8,
153
+ role: "region",
154
+ "aria-label": t("downloads.title"),
155
+ sx: [{
156
+ position: "fixed",
157
+ right: (theme) => theme.spacing(SCREEN_EDGE_SPACING),
158
+ bottom: 0,
159
+ width: (theme) => `min(${PANEL_WIDTH_PIXELS}px, calc(100vw - ${theme.spacing(SCREEN_EDGE_SPACING * 2)}))`,
160
+ // pegado al borde de abajo como en Drive: solo se redondean las esquinas de arriba
161
+ borderBottomLeftRadius: 0,
162
+ borderBottomRightRadius: 0,
163
+ overflow: "hidden",
164
+ zIndex: (theme) => theme.zIndex.snackbar
165
+ }, (theme) => isGlassTheme(theme) ? glassStylesOf(theme) : {}],
166
+ children: [
167
+ /* @__PURE__ */ jsxs(Stack, { direction: "row", sx: { alignItems: "center", gap: 0.5, pl: 2, pr: 1, py: 1, bgcolor: "action.hover" }, children: [
168
+ /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", component: "h2", noWrap: true, sx: { flex: 1 }, "aria-live": "polite", children: summaryTextOf(downloads, t) }),
169
+ /* @__PURE__ */ jsx(Tooltip, { title: isExpanded ? t("downloads.collapse") : t("downloads.expand"), children: /* @__PURE__ */ jsx(
170
+ IconButton,
171
+ {
172
+ size: "small",
173
+ "aria-expanded": isExpanded,
174
+ "aria-label": isExpanded ? t("downloads.collapse") : t("downloads.expand"),
175
+ onClick: () => setIsExpanded((wasExpanded) => !wasExpanded),
176
+ children: isExpanded ? /* @__PURE__ */ jsx(ExpandMoreIcon, { fontSize: "small" }) : /* @__PURE__ */ jsx(ExpandLessIcon, { fontSize: "small" })
177
+ }
178
+ ) }),
179
+ activeCount === 0 && /* @__PURE__ */ jsx(Tooltip, { title: t("downloads.close"), children: /* @__PURE__ */ jsx(IconButton, { size: "small", "aria-label": t("downloads.close"), onClick: clearFinishedDownloads, children: /* @__PURE__ */ jsx(CloseIcon, { fontSize: "small" }) }) })
180
+ ] }),
181
+ /* @__PURE__ */ jsxs(Collapse, { in: isExpanded, children: [
182
+ /* @__PURE__ */ jsx(Divider, {}),
183
+ /* @__PURE__ */ jsx(List, { dense: true, disablePadding: true, sx: { maxHeight: LIST_MAX_HEIGHT, overflowY: "auto", overflowX: "hidden" }, children: downloads.map((download, index) => /* @__PURE__ */ jsxs(Fragment, { children: [
184
+ index > 0 && /* @__PURE__ */ jsx(Divider, { component: "li" }),
185
+ /* @__PURE__ */ jsx(DownloadRow, { download })
186
+ ] }, download.id)) })
187
+ ] })
188
+ ]
189
+ }
190
+ ) }) });
191
+ }
192
+ export {
193
+ DownloadManager as default
194
+ };
195
+ //# sourceMappingURL=DownloadManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DownloadManager.js","sources":["../../src/downloads/DownloadManager.jsx"],"sourcesContent":["// Panel de descargas al estilo de Google Drive: se pega abajo a la derecha SOLO mientras hay descargas, con una barra que\n// resume («Descargando 2 archivos…», «3 descargas listas») y la lista con el ícono del tipo de archivo y un anillo de\n// avance que termina en ✓. Con MUI y XState, sin Redux.\n//\n// Qué hace para no hacer ruido:\n// - no hay botón fijo: sin descargas no se pinta nada;\n// - se pliega a la barra con la flecha y se vuelve a abrir cuando entra otra descarga;\n// - cuando todo terminó bien se va solo a los AUTO_DISMISS_MILLISECONDS; si algo falló o se canceló se queda hasta que\n// la persona lo cierra, para que vea el motivo;\n// - la X solo aparece cuando ya nada descarga (cerrar a media descarga dejaría el archivo sin aviso de que terminó).\n//\n// Se monta UNA sola vez en la raíz de la aplicación. Lee la lista de downloadsActor; las descargas las arranca startDownload desde cada\n// pantalla. Los avisos (sonner) salen abajo a la izquierda, así que el panel va a la derecha.\n// Con el vidrio del tema (createToolkitTheme({glass: true})) el panel es de vidrio: flota sobre la pantalla.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {Fragment, useEffect, useRef, useState} from 'react';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport {useSelector} from '@xstate/react';\nimport Box from '@mui/material/Box';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport Collapse from '@mui/material/Collapse';\nimport Divider from '@mui/material/Divider';\nimport IconButton from '@mui/material/IconButton';\nimport List from '@mui/material/List';\nimport ListItem from '@mui/material/ListItem';\nimport Paper from '@mui/material/Paper';\nimport Slide from '@mui/material/Slide';\nimport Stack from '@mui/material/Stack';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport BlockOutlinedIcon from '@mui/icons-material/BlockOutlined';\nimport CheckCircleIcon from '@mui/icons-material/CheckCircle';\nimport CloseIcon from '@mui/icons-material/Close';\nimport ErrorOutlineIcon from '@mui/icons-material/ErrorOutline';\nimport ExpandLessIcon from '@mui/icons-material/ExpandLess';\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\n\nimport {cancelDownload, clearFinishedDownloads, countActiveDownloads, downloadsActor} from '@/downloads/downloadQueue.js';\nimport {UNKNOWN_FILE_TYPE, useFileTypes} from '@/downloads/fileTypes.js';\nimport {DOWNLOAD_STATUS} from '@/downloads/downloadsMachine.js';\nimport {useFormatters} from '@/toolkit/useFormatters.js';\nimport {glassStylesOf, isGlassTheme} from '@/theme/glassSurface.js';\nimport ComponentTexts from '@/toolkit/ComponentTexts.jsx';\n\n// cuánto se queda el panel después de que TODAS las descargas terminaron bien\nconst AUTO_DISMISS_MILLISECONDS = 5000;\n\n// separación del borde derecho y ancho del panel (en el teléfono ocupa el ancho menos los márgenes)\nconst SCREEN_EDGE_SPACING = 3;\nconst PANEL_WIDTH_PIXELS = 360;\nconst LIST_MAX_HEIGHT = '40vh';\nconst PROGRESS_RING_PIXELS = 22;\n\n/**\n * Tipo de archivo de una descarga: el que dijo quien la arrancó o, al terminar, la extensión del nombre. Los tipos son los de\n * la casa y los del proyecto (ToolkitProvider fileTypes).\n *\n * @param {object} download renglón de la lista (downloadsMachine)\n * @param {Record<string, {Icon: import('react').ElementType, color?: string}>} fileTypes\n * @returns {{Icon: import('react').ElementType, color: string}}\n */\nfunction fileTypeAppearanceOf(download, fileTypes) {\n const extension = download.fileName?.split('.').pop()?.toLowerCase();\n const fileType = fileTypes[download.format ?? extension];\n return fileType ? {Icon: fileType.Icon ?? UNKNOWN_FILE_TYPE.Icon, color: fileType.color ?? UNKNOWN_FILE_TYPE.color} : UNKNOWN_FILE_TYPE;\n}\n\n/**\n * Segunda línea del renglón: cuánto lleva, cuánto pesó o por qué no se pudo.\n *\n * @param {object} download\n * @param {Function} t traductor de common\n * @param {(bytes: number) => string} formatFileSize el de useFormatters (el idioma del proveedor más cercano)\n * @returns {string}\n */\nfunction detailTextOf(download, t, formatFileSize) {\n if (download.status === DOWNLOAD_STATUS.completed) {\n return formatFileSize(download.loadedBytes);\n }\n if (download.status === DOWNLOAD_STATUS.failed) {\n return download.errorMessage ?? t('downloads.failed');\n }\n if (download.status === DOWNLOAD_STATUS.canceled) {\n return t('downloads.canceled');\n }\n if (download.loadedBytes === 0) {\n return t('downloads.preparing');\n }\n // un archivo que se arma al vuelo (el log) no dice su tamaño: se enseña lo que ya bajó\n return download.totalBytes\n ? t('downloads.progressOf', {loaded: formatFileSize(download.loadedBytes), total: formatFileSize(download.totalBytes)})\n : t('downloads.progressLoaded', {loaded: formatFileSize(download.loadedBytes)});\n}\n\n/**\n * Resumen de la barra, como en Drive: lo que está pasando ahora o cómo terminó.\n *\n * @param {Array<object>} downloads\n * @param {Function} t traductor de common\n * @returns {string}\n */\nfunction summaryTextOf(downloads, t) {\n const activeCount = countActiveDownloads(downloads);\n if (activeCount > 0) {\n return t('downloads.summaryDownloading', {count: activeCount});\n }\n const failedCount = downloads.filter((download) => download.status === DOWNLOAD_STATUS.failed).length;\n if (failedCount > 0) {\n return t('downloads.summaryFailed', {count: failedCount});\n }\n const completedCount = downloads.filter((download) => download.status === DOWNLOAD_STATUS.completed).length;\n return t('downloads.summaryCompleted', {count: completedCount});\n}\n\n/**\n * Lo que va a la derecha del renglón: el anillo de avance con su botón para cancelar, o cómo terminó.\n *\n * @param {{download: object, displayName: string}} props\n */\nfunction DownloadStatusIndicator({download, displayName}) {\n const {t} = useToolkitTranslation('common');\n\n if (download.status === DOWNLOAD_STATUS.completed) {\n return <CheckCircleIcon sx={{color: 'success.main'}} aria-label={t('downloads.completedOf', {name: displayName})} />;\n }\n if (download.status === DOWNLOAD_STATUS.failed) {\n return <ErrorOutlineIcon sx={{color: 'error.main'}} aria-label={t('downloads.failedOf', {name: displayName})} />;\n }\n if (download.status === DOWNLOAD_STATUS.canceled) {\n return <BlockOutlinedIcon sx={{color: 'text.disabled'}} aria-label={t('downloads.canceledOf', {name: displayName})} />;\n }\n\n const hasKnownSize = Boolean(download.totalBytes);\n // el anillo y, encima, la X para cancelar: como en Drive, un solo lugar para ver y detener\n return (\n <Tooltip title={t('downloads.cancel')}>\n <IconButton size=\"small\" aria-label={t('downloads.cancelOf', {name: displayName})} onClick={() => cancelDownload(download.id)}\n sx={{position: 'relative', width: PROGRESS_RING_PIXELS + 10, height: PROGRESS_RING_PIXELS + 10}}>\n <CircularProgress\n size={PROGRESS_RING_PIXELS}\n thickness={4}\n variant={hasKnownSize ? 'determinate' : 'indeterminate'}\n value={hasKnownSize ? Math.min(100, (download.loadedBytes * 100) / download.totalBytes) : undefined}\n sx={{position: 'absolute'}}\n />\n <CloseIcon sx={{fontSize: 12}} />\n </IconButton>\n </Tooltip>\n );\n}\n\n/**\n * Un renglón: ícono del tipo de archivo, nombre, detalle y estatus.\n *\n * @param {{download: object}} props\n */\nfunction DownloadRow({download}) {\n const {t} = useToolkitTranslation('common');\n const {formatFileSize} = useFormatters();\n const {Icon, color} = fileTypeAppearanceOf(download, useFileTypes());\n const displayName = download.fileName ?? download.label;\n const isFailed = download.status === DOWNLOAD_STATUS.failed;\n\n return (\n // minWidth 0: sin él un nombre largo empuja el renglón y la lista enseña una barra horizontal\n <ListItem disableGutters sx={{gap: 1.5, px: 2, py: 1, minWidth: 0}}>\n <Icon fontSize=\"small\" sx={{color, flexShrink: 0}} />\n <Box sx={{minWidth: 0, flex: 1}}>\n <Tooltip title={displayName}>\n <Typography variant=\"body2\" noWrap>{displayName}</Typography>\n </Tooltip>\n <Typography variant=\"caption\" component=\"p\" noWrap={!isFailed}\n sx={{color: isFailed ? 'error.main' : 'text.secondary'}}>\n {detailTextOf(download, t, formatFileSize)}\n </Typography>\n </Box>\n <Box sx={{flexShrink: 0, display: 'flex', alignItems: 'center'}}>\n <DownloadStatusIndicator download={download} displayName={displayName} />\n </Box>\n </ListItem>\n );\n}\n\n/**\n * @param {object} [props]\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nexport default function DownloadManager({texts} = {}) {\n const {t} = useToolkitTranslation('common', texts);\n const downloads = useSelector(downloadsActor, (snapshot) => snapshot.context.downloads);\n const [isExpanded, setIsExpanded] = useState(true);\n const previousCountRef = useRef(downloads.length);\n\n const activeCount = countActiveDownloads(downloads);\n const allSucceeded = downloads.length > 0 && downloads.every((download) => download.status === DOWNLOAD_STATUS.completed);\n\n // una descarga nueva vuelve a desplegar el panel aunque se haya plegado\n useEffect(() => {\n if (downloads.length > previousCountRef.current) {\n setIsExpanded(true);\n }\n previousCountRef.current = downloads.length;\n }, [downloads.length]);\n\n // todo terminó bien: el panel se va solo (con un error o una cancelada se queda para que se lea)\n useEffect(() => {\n if (!allSucceeded) {\n return undefined;\n }\n const dismissTimer = setTimeout(clearFinishedDownloads, AUTO_DISMISS_MILLISECONDS);\n return () => clearTimeout(dismissTimer);\n }, [allSucceeded, downloads.length]);\n\n return (\n <ComponentTexts namespace=\"common\" texts={texts}>\n <Slide direction=\"up\" in={downloads.length > 0} mountOnEnter unmountOnExit>\n <Paper\n elevation={8}\n role=\"region\"\n aria-label={t('downloads.title')}\n sx={[{\n position: 'fixed',\n right: (theme) => theme.spacing(SCREEN_EDGE_SPACING),\n bottom: 0,\n width: (theme) => `min(${PANEL_WIDTH_PIXELS}px, calc(100vw - ${theme.spacing(SCREEN_EDGE_SPACING * 2)}))`,\n // pegado al borde de abajo como en Drive: solo se redondean las esquinas de arriba\n borderBottomLeftRadius: 0,\n borderBottomRightRadius: 0,\n overflow: 'hidden',\n zIndex: (theme) => theme.zIndex.snackbar,\n }, (theme) => (isGlassTheme(theme) ? glassStylesOf(theme) : {})]}\n >\n <Stack direction=\"row\" sx={{alignItems: 'center', gap: 0.5, pl: 2, pr: 1, py: 1, bgcolor: 'action.hover'}}>\n <Typography variant=\"subtitle2\" component=\"h2\" noWrap sx={{flex: 1}} aria-live=\"polite\">\n {summaryTextOf(downloads, t)}\n </Typography>\n <Tooltip title={isExpanded ? t('downloads.collapse') : t('downloads.expand')}>\n <IconButton size=\"small\" aria-expanded={isExpanded}\n aria-label={isExpanded ? t('downloads.collapse') : t('downloads.expand')}\n onClick={() => setIsExpanded((wasExpanded) => !wasExpanded)}>\n {isExpanded ? <ExpandMoreIcon fontSize=\"small\" /> : <ExpandLessIcon fontSize=\"small\" />}\n </IconButton>\n </Tooltip>\n {/* cerrar a media descarga dejaría el archivo sin aviso de que terminó: la X sale cuando ya nada baja */}\n {activeCount === 0 && (\n <Tooltip title={t('downloads.close')}>\n <IconButton size=\"small\" aria-label={t('downloads.close')} onClick={clearFinishedDownloads}>\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n </Stack>\n <Collapse in={isExpanded}>\n <Divider />\n {/* OJO: overflowY auto también prende el scroll horizontal ante 1 px de más; se apaga explícito */}\n <List dense disablePadding sx={{maxHeight: LIST_MAX_HEIGHT, overflowY: 'auto', overflowX: 'hidden'}}>\n {downloads.map((download, index) => (\n <Fragment key={download.id}>\n {index > 0 && <Divider component=\"li\" />}\n <DownloadRow download={download} />\n </Fragment>\n ))}\n </List>\n </Collapse>\n </Paper>\n </Slide>\n </ComponentTexts>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { createActor } from "xstate";
2
+ import { downloadsMachine, DOWNLOAD_STATUS } from "./downloadsMachine.js";
3
+ import { saveBlob } from "../files.js";
4
+ import { newIdentifier } from "../identifiers.js";
5
+ const downloadsActor = createActor(downloadsMachine).start();
6
+ const abortControllerByDownloadId = /* @__PURE__ */ new Map();
7
+ async function startDownload({ label, format, request, onCompleted, onFailed, onCanceled }) {
8
+ const downloadId = newIdentifier();
9
+ const abortController = new AbortController();
10
+ abortControllerByDownloadId.set(downloadId, abortController);
11
+ downloadsActor.send({ type: "STARTED", id: downloadId, label, format });
12
+ try {
13
+ const { blob, fileName } = await request({
14
+ signal: abortController.signal,
15
+ // la petición avisa cada pedazo que llega; total viene en null cuando el servidor arma el archivo al vuelo (sin
16
+ // Content-Length) y el panel enseña lo que lleva en vez del porcentaje
17
+ onDownloadProgress: (progressEvent) => downloadsActor.send({
18
+ type: "PROGRESSED",
19
+ id: downloadId,
20
+ loadedBytes: progressEvent.loaded,
21
+ totalBytes: progressEvent.total
22
+ })
23
+ });
24
+ saveBlob(blob, fileName);
25
+ downloadsActor.send({ type: "COMPLETED", id: downloadId, fileName, sizeBytes: blob.size });
26
+ onCompleted?.(fileName);
27
+ } catch (error) {
28
+ if (abortController.signal.aborted) {
29
+ downloadsActor.send({ type: "CANCELED", id: downloadId });
30
+ onCanceled?.();
31
+ } else {
32
+ downloadsActor.send({ type: "FAILED", id: downloadId, errorMessage: error?.message ?? null });
33
+ onFailed?.(error);
34
+ }
35
+ } finally {
36
+ abortControllerByDownloadId.delete(downloadId);
37
+ }
38
+ return downloadId;
39
+ }
40
+ function cancelDownload(downloadId) {
41
+ abortControllerByDownloadId.get(downloadId)?.abort();
42
+ }
43
+ function clearFinishedDownloads() {
44
+ downloadsActor.send({ type: "CLEAR_FINISHED" });
45
+ }
46
+ function countActiveDownloads(downloads) {
47
+ return downloads.filter((download) => download.status === DOWNLOAD_STATUS.downloading).length;
48
+ }
49
+ export {
50
+ cancelDownload,
51
+ clearFinishedDownloads,
52
+ countActiveDownloads,
53
+ downloadsActor,
54
+ startDownload
55
+ };
56
+ //# sourceMappingURL=downloadQueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downloadQueue.js","sources":["../../src/downloads/downloadQueue.js"],"sourcesContent":["// Arranca descargas y las anota en la lista que pinta DownloadManager (el administrador de descargas).\n//\n// Uso (desde un módulo, que es quien conoce el API):\n// startDownload({\n// label: t('detail.downloadLog'),\n// request: (transferOptions) => ingestionApi.downloadProcessingLog(batchId, transferOptions),\n// onCompleted: () => refreshPeriods(),\n// });\n//\n// startDownload no espera a que termine quien la llama: el diálogo de confirmación se cierra en cuanto la descarga entra\n// a la lista y la persona sigue trabajando mientras baja (el log más grande tarda ~30 s). El panel (tipo Google Drive) es\n// el ÚNICO lugar que avisa: avance, lista y error con su texto del API (RFC 9457). Sin aviso aparte, para no avisar dos\n// veces lo mismo.\n//\n// Una sola lista para toda la app (un actor de módulo, como el cliente de createApiClient): la llenan varias pantallas y\n// la lee un solo panel montado en la raíz de la aplicación.\n//\n// Funciones puras del paquete, no renderizan: function (regla de la casa). No conoce el API: el archivo lo pide la\n// `request` que le pasan.\nimport {createActor} from 'xstate';\n\nimport {DOWNLOAD_STATUS, downloadsMachine} from '@/downloads/downloadsMachine.js';\nimport {saveBlob} from '@/files.js';\nimport {newIdentifier} from '@/identifiers.js';\n\nexport const downloadsActor = createActor(downloadsMachine).start();\n\n// cómo cancelar cada descarga en curso; vive fuera del contexto de la máquina porque un AbortController no es un dato\nconst abortControllerByDownloadId = new Map();\n\n/**\n * Descarga un archivo con avance en el panel, lo guarda en disco y avisa al terminar.\n *\n * @param {object} options\n * @param {string} options.label ya traducido; lo que se ve en el panel mientras todavía no se sabe el nombre del\n * archivo\n * @param {string} [options.format] el tipo de archivo, para su ícono en el panel: xlsx, csv, pdf o uno del proyecto\n * (ToolkitProvider fileTypes)\n * @param {(transferOptions: {signal: AbortSignal, onDownloadProgress: (progress: {loaded: number, total?: number|null}) => void}) => Promise<{blob: Blob, fileName: string}>} options.request\n * @param {(fileName: string) => void} [options.onCompleted] p. ej. volver a pedir la tabla (si la descarga cambia algo\n * en el servidor)\n * @param {(error: unknown) => void} [options.onFailed] cuando no se pudo (el panel ya lo dice; para avisar o reportarlo)\n * @param {() => void} [options.onCanceled] cuando la persona la canceló\n * @returns {Promise<string>} id de la descarga; la promesa se cumple cuando termina (bien, mal o cancelada), nunca falla\n */\nexport async function startDownload({label, format, request, onCompleted, onFailed, onCanceled}) {\n const downloadId = newIdentifier();\n const abortController = new AbortController();\n abortControllerByDownloadId.set(downloadId, abortController);\n downloadsActor.send({type: 'STARTED', id: downloadId, label, format});\n\n try {\n const {blob, fileName} = await request({\n signal: abortController.signal,\n // la petición avisa cada pedazo que llega; total viene en null cuando el servidor arma el archivo al vuelo (sin\n // Content-Length) y el panel enseña lo que lleva en vez del porcentaje\n onDownloadProgress: (progressEvent) => downloadsActor.send({\n type: 'PROGRESSED', id: downloadId, loadedBytes: progressEvent.loaded, totalBytes: progressEvent.total,\n }),\n });\n saveBlob(blob, fileName);\n downloadsActor.send({type: 'COMPLETED', id: downloadId, fileName, sizeBytes: blob.size});\n onCompleted?.(fileName);\n } catch (error) {\n // OJO: cancelar también llega aquí como error (el AbortError del navegador); se distingue por la señal, no por el\n // tipo de error, porque cada `request` del proyecto puede tronar con el suyo\n if (abortController.signal.aborted) {\n downloadsActor.send({type: 'CANCELED', id: downloadId});\n onCanceled?.();\n } else {\n // el mensaje ya viene traducido del API (ApiError con el detail de RFC 9457)\n downloadsActor.send({type: 'FAILED', id: downloadId, errorMessage: error?.message ?? null});\n onFailed?.(error);\n }\n } finally {\n abortControllerByDownloadId.delete(downloadId);\n }\n\n return downloadId;\n}\n\n/**\n * Cancela una descarga en curso (el panel la marca como cancelada).\n *\n * @param {string} downloadId\n */\nexport function cancelDownload(downloadId) {\n abortControllerByDownloadId.get(downloadId)?.abort();\n}\n\n/** Quita del panel todas las descargas terminadas (completadas, fallidas o canceladas). */\nexport function clearFinishedDownloads() {\n downloadsActor.send({type: 'CLEAR_FINISHED'});\n}\n\n/**\n * ¿Cuántas siguen descargando? Decide el resumen del panel y si se puede cerrar.\n *\n * @param {Array<object>} downloads\n * @returns {number}\n */\nexport function countActiveDownloads(downloads) {\n return downloads.filter((download) => download.status === DOWNLOAD_STATUS.downloading).length;\n}\n"],"names":[],"mappings":";;;;AAyBY,MAAC,iBAAiB,YAAY,gBAAgB,EAAE,MAAK;AAGjE,MAAM,8BAA8B,oBAAI,IAAG;AAiBpC,eAAe,cAAc,EAAC,OAAO,QAAQ,SAAS,aAAa,UAAU,WAAU,GAAG;AAC7F,QAAM,aAAa,cAAa;AAChC,QAAM,kBAAkB,IAAI,gBAAe;AAC3C,8BAA4B,IAAI,YAAY,eAAe;AAC3D,iBAAe,KAAK,EAAC,MAAM,WAAW,IAAI,YAAY,OAAO,OAAM,CAAC;AAEpE,MAAI;AACA,UAAM,EAAC,MAAM,SAAQ,IAAI,MAAM,QAAQ;AAAA,MACnC,QAAQ,gBAAgB;AAAA;AAAA;AAAA,MAGxB,oBAAoB,CAAC,kBAAkB,eAAe,KAAK;AAAA,QACvD,MAAM;AAAA,QAAc,IAAI;AAAA,QAAY,aAAa,cAAc;AAAA,QAAQ,YAAY,cAAc;AAAA,MACjH,CAAa;AAAA,IACb,CAAS;AACD,aAAS,MAAM,QAAQ;AACvB,mBAAe,KAAK,EAAC,MAAM,aAAa,IAAI,YAAY,UAAU,WAAW,KAAK,KAAI,CAAC;AACvF,kBAAc,QAAQ;AAAA,EAC1B,SAAS,OAAO;AAGZ,QAAI,gBAAgB,OAAO,SAAS;AAChC,qBAAe,KAAK,EAAC,MAAM,YAAY,IAAI,WAAU,CAAC;AACtD,mBAAU;AAAA,IACd,OAAO;AAEH,qBAAe,KAAK,EAAC,MAAM,UAAU,IAAI,YAAY,cAAc,OAAO,WAAW,KAAI,CAAC;AAC1F,iBAAW,KAAK;AAAA,IACpB;AAAA,EACJ,UAAC;AACG,gCAA4B,OAAO,UAAU;AAAA,EACjD;AAEA,SAAO;AACX;AAOO,SAAS,eAAe,YAAY;AACvC,8BAA4B,IAAI,UAAU,GAAG,MAAK;AACtD;AAGO,SAAS,yBAAyB;AACrC,iBAAe,KAAK,EAAC,MAAM,iBAAgB,CAAC;AAChD;AAQO,SAAS,qBAAqB,WAAW;AAC5C,SAAO,UAAU,OAAO,CAAC,aAAa,SAAS,WAAW,gBAAgB,WAAW,EAAE;AAC3F;"}
@@ -0,0 +1,80 @@
1
+ import { setup, assign } from "xstate";
2
+ const DOWNLOAD_STATUS = Object.freeze({
3
+ downloading: "downloading",
4
+ completed: "completed",
5
+ failed: "failed",
6
+ canceled: "canceled"
7
+ });
8
+ function updateActiveDownload(downloads, downloadId, changes) {
9
+ return downloads.map((download) => download.id === downloadId && download.status === DOWNLOAD_STATUS.downloading ? { ...download, ...changes } : download);
10
+ }
11
+ const downloadsMachine = setup({}).createMachine({
12
+ id: "downloads",
13
+ context: {
14
+ // la más nueva primero
15
+ downloads: []
16
+ },
17
+ on: {
18
+ STARTED: {
19
+ actions: assign({
20
+ downloads: ({ context, event }) => [
21
+ {
22
+ id: event.id,
23
+ label: event.label,
24
+ // xlsx, csv o pdf: el panel pinta el ícono del tipo de archivo (null si quien descarga no lo dice)
25
+ format: event.format ?? null,
26
+ fileName: null,
27
+ status: DOWNLOAD_STATUS.downloading,
28
+ loadedBytes: 0,
29
+ totalBytes: null,
30
+ errorMessage: null
31
+ },
32
+ ...context.downloads
33
+ ]
34
+ })
35
+ },
36
+ PROGRESSED: {
37
+ actions: assign({
38
+ downloads: ({ context, event }) => updateActiveDownload(context.downloads, event.id, {
39
+ loadedBytes: event.loadedBytes,
40
+ // un archivo que se arma al vuelo (el log) no dice su tamaño: se queda en null y la barra no tiene fin
41
+ totalBytes: event.totalBytes ?? null
42
+ })
43
+ })
44
+ },
45
+ COMPLETED: {
46
+ actions: assign({
47
+ // con el tamaño del archivo ya guardado: un archivo armado en el navegador (CSV, JSON) no avisa avance y el
48
+ // panel decía «0 bytes» de un archivo con datos
49
+ downloads: ({ context, event }) => updateActiveDownload(context.downloads, event.id, {
50
+ status: DOWNLOAD_STATUS.completed,
51
+ fileName: event.fileName,
52
+ ...typeof event.sizeBytes === "number" && { loadedBytes: event.sizeBytes, totalBytes: event.sizeBytes }
53
+ })
54
+ })
55
+ },
56
+ FAILED: {
57
+ actions: assign({
58
+ downloads: ({ context, event }) => updateActiveDownload(context.downloads, event.id, {
59
+ status: DOWNLOAD_STATUS.failed,
60
+ errorMessage: event.errorMessage ?? null
61
+ })
62
+ })
63
+ },
64
+ CANCELED: {
65
+ actions: assign({
66
+ downloads: ({ context, event }) => updateActiveDownload(context.downloads, event.id, { status: DOWNLOAD_STATUS.canceled })
67
+ })
68
+ },
69
+ CLEAR_FINISHED: {
70
+ actions: assign({
71
+ downloads: ({ context }) => context.downloads.filter((download) => download.status === DOWNLOAD_STATUS.downloading)
72
+ })
73
+ }
74
+ }
75
+ });
76
+ export {
77
+ DOWNLOAD_STATUS,
78
+ downloadsMachine
79
+ };
80
+ //# sourceMappingURL=downloadsMachine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downloadsMachine.js","sources":["../../src/downloads/downloadsMachine.js"],"sourcesContent":["// Lista de descargas de la sesión (el «administrador de descargas», sin Redux).\n//\n// Cada descarga vive así:\n//\n// STARTED ──▶ downloading ──PROGRESSED──▶ downloading\n// │\n// ├── COMPLETED ──▶ completed ─┐\n// ├── FAILED ─────▶ failed ────┼── CLEAR_FINISHED ──▶ (sale de la lista)\n// └── CANCELED ───▶ canceled ──┘\n//\n// Por qué una máquina y no un useState: la lista la alimentan varias pantallas a la vez (quien descarga) y la lee un\n// solo panel (DownloadManager); una descarga que ya terminó no puede volver a «descargando» por un aviso de progreso\n// que llegó tarde. Lo prueba downloadsMachine.test.js.\n//\n// Pura: solo importa xstate. Quien descarga de verdad es startDownload (downloadQueue.js); el paquete no conoce el API.\nimport {assign, setup} from 'xstate';\n\n/** Estatus de una descarga; son los que pinta el panel (con su texto en common:downloads.statuses). */\nexport const DOWNLOAD_STATUS = Object.freeze({\n downloading: 'downloading',\n completed: 'completed',\n failed: 'failed',\n canceled: 'canceled',\n});\n\n/**\n * Cambia una sola descarga de la lista, y solo si sigue descargando (las terminadas ya no cambian).\n *\n * @param {Array<object>} downloads\n * @param {string} downloadId\n * @param {object} changes\n * @returns {Array<object>}\n */\nfunction updateActiveDownload(downloads, downloadId, changes) {\n return downloads.map((download) => (\n download.id === downloadId && download.status === DOWNLOAD_STATUS.downloading ? {...download, ...changes} : download\n ));\n}\n\nexport const downloadsMachine = setup({}).createMachine({\n id: 'downloads',\n context: {\n // la más nueva primero\n downloads: [],\n },\n on: {\n STARTED: {\n actions: assign({\n downloads: ({context, event}) => [\n {\n id: event.id,\n label: event.label,\n // xlsx, csv o pdf: el panel pinta el ícono del tipo de archivo (null si quien descarga no lo dice)\n format: event.format ?? null,\n fileName: null,\n status: DOWNLOAD_STATUS.downloading,\n loadedBytes: 0,\n totalBytes: null,\n errorMessage: null,\n },\n ...context.downloads,\n ],\n }),\n },\n PROGRESSED: {\n actions: assign({\n downloads: ({context, event}) => updateActiveDownload(context.downloads, event.id, {\n loadedBytes: event.loadedBytes,\n // un archivo que se arma al vuelo (el log) no dice su tamaño: se queda en null y la barra no tiene fin\n totalBytes: event.totalBytes ?? null,\n }),\n }),\n },\n COMPLETED: {\n actions: assign({\n // con el tamaño del archivo ya guardado: un archivo armado en el navegador (CSV, JSON) no avisa avance y el\n // panel decía «0 bytes» de un archivo con datos\n downloads: ({context, event}) => updateActiveDownload(context.downloads, event.id, {\n status: DOWNLOAD_STATUS.completed,\n fileName: event.fileName,\n ...(typeof event.sizeBytes === 'number' && {loadedBytes: event.sizeBytes, totalBytes: event.sizeBytes}),\n }),\n }),\n },\n FAILED: {\n actions: assign({\n downloads: ({context, event}) => updateActiveDownload(context.downloads, event.id, {\n status: DOWNLOAD_STATUS.failed,\n errorMessage: event.errorMessage ?? null,\n }),\n }),\n },\n CANCELED: {\n actions: assign({\n downloads: ({context, event}) => updateActiveDownload(context.downloads, event.id, {status: DOWNLOAD_STATUS.canceled}),\n }),\n },\n CLEAR_FINISHED: {\n actions: assign({\n downloads: ({context}) => context.downloads.filter((download) => download.status === DOWNLOAD_STATUS.downloading),\n }),\n },\n },\n});\n"],"names":[],"mappings":";AAkBY,MAAC,kBAAkB,OAAO,OAAO;AAAA,EACzC,aAAa;AAAA,EACb,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AACd,CAAC;AAUD,SAAS,qBAAqB,WAAW,YAAY,SAAS;AAC1D,SAAO,UAAU,IAAI,CAAC,aAClB,SAAS,OAAO,cAAc,SAAS,WAAW,gBAAgB,cAAc,EAAC,GAAG,UAAU,GAAG,QAAO,IAAI,QAC/G;AACL;AAEY,MAAC,mBAAmB,MAAM,EAAE,EAAE,cAAc;AAAA,EACpD,IAAI;AAAA,EACJ,SAAS;AAAA;AAAA,IAEL,WAAW,CAAA;AAAA,EACnB;AAAA,EACI,IAAI;AAAA,IACA,SAAS;AAAA,MACL,SAAS,OAAO;AAAA,QACZ,WAAW,CAAC,EAAC,SAAS,MAAK,MAAM;AAAA,UAC7B;AAAA,YACI,IAAI,MAAM;AAAA,YACV,OAAO,MAAM;AAAA;AAAA,YAEb,QAAQ,MAAM,UAAU;AAAA,YACxB,UAAU;AAAA,YACV,QAAQ,gBAAgB;AAAA,YACxB,aAAa;AAAA,YACb,YAAY;AAAA,YACZ,cAAc;AAAA,UACtC;AAAA,UACoB,GAAG,QAAQ;AAAA,QAC/B;AAAA,MACA,CAAa;AAAA,IACb;AAAA,IACQ,YAAY;AAAA,MACR,SAAS,OAAO;AAAA,QACZ,WAAW,CAAC,EAAC,SAAS,MAAK,MAAM,qBAAqB,QAAQ,WAAW,MAAM,IAAI;AAAA,UAC/E,aAAa,MAAM;AAAA;AAAA,UAEnB,YAAY,MAAM,cAAc;AAAA,QACpD,CAAiB;AAAA,MACjB,CAAa;AAAA,IACb;AAAA,IACQ,WAAW;AAAA,MACP,SAAS,OAAO;AAAA;AAAA;AAAA,QAGZ,WAAW,CAAC,EAAC,SAAS,MAAK,MAAM,qBAAqB,QAAQ,WAAW,MAAM,IAAI;AAAA,UAC/E,QAAQ,gBAAgB;AAAA,UACxB,UAAU,MAAM;AAAA,UAChB,GAAI,OAAO,MAAM,cAAc,YAAY,EAAC,aAAa,MAAM,WAAW,YAAY,MAAM,UAAS;AAAA,QACzH,CAAiB;AAAA,MACjB,CAAa;AAAA,IACb;AAAA,IACQ,QAAQ;AAAA,MACJ,SAAS,OAAO;AAAA,QACZ,WAAW,CAAC,EAAC,SAAS,MAAK,MAAM,qBAAqB,QAAQ,WAAW,MAAM,IAAI;AAAA,UAC/E,QAAQ,gBAAgB;AAAA,UACxB,cAAc,MAAM,gBAAgB;AAAA,QACxD,CAAiB;AAAA,MACjB,CAAa;AAAA,IACb;AAAA,IACQ,UAAU;AAAA,MACN,SAAS,OAAO;AAAA,QACZ,WAAW,CAAC,EAAC,SAAS,MAAK,MAAM,qBAAqB,QAAQ,WAAW,MAAM,IAAI,EAAC,QAAQ,gBAAgB,SAAQ,CAAC;AAAA,MACrI,CAAa;AAAA,IACb;AAAA,IACQ,gBAAgB;AAAA,MACZ,SAAS,OAAO;AAAA,QACZ,WAAW,CAAC,EAAC,QAAO,MAAM,QAAQ,UAAU,OAAO,CAAC,aAAa,SAAS,WAAW,gBAAgB,WAAW;AAAA,MAChI,CAAa;AAAA,IACb;AAAA,EACA;AACA,CAAC;"}
@@ -0,0 +1,22 @@
1
+ "use client";
2
+ import InsertDriveFileOutlinedIcon from "@mui/icons-material/InsertDriveFileOutlined";
3
+ import PictureAsPdfOutlinedIcon from "@mui/icons-material/PictureAsPdfOutlined";
4
+ import TableViewOutlinedIcon from "@mui/icons-material/TableViewOutlined";
5
+ import TextSnippetOutlinedIcon from "@mui/icons-material/TextSnippetOutlined";
6
+ import { useToolkitSettings } from "../toolkit/toolkitContext.js";
7
+ const DEFAULT_FILE_TYPES = Object.freeze({
8
+ xlsx: Object.freeze({ Icon: TableViewOutlinedIcon, color: "success.main" }),
9
+ csv: Object.freeze({ Icon: TextSnippetOutlinedIcon, color: "info.main" }),
10
+ pdf: Object.freeze({ Icon: PictureAsPdfOutlinedIcon, color: "error.main" })
11
+ });
12
+ const UNKNOWN_FILE_TYPE = Object.freeze({ Icon: InsertDriveFileOutlinedIcon, color: "text.secondary" });
13
+ function useFileTypes() {
14
+ const { fileTypes } = useToolkitSettings();
15
+ return fileTypes ? { ...DEFAULT_FILE_TYPES, ...fileTypes } : DEFAULT_FILE_TYPES;
16
+ }
17
+ export {
18
+ DEFAULT_FILE_TYPES,
19
+ UNKNOWN_FILE_TYPE,
20
+ useFileTypes
21
+ };
22
+ //# sourceMappingURL=fileTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileTypes.js","sources":["../../src/downloads/fileTypes.js"],"sourcesContent":["// Los tipos de archivo que conocen las descargas: el ícono y el color con que se ven en el menú «Descargar» y en el panel.\n// La casa trae los básicos (Excel, CSV y PDF); el proyecto agrega los suyos en ToolkitProvider `fileTypes` (un ZIP de\n// facturas, el XML del SAT, un Word), con su ícono, su color y su texto: el paquete no conoce todos los tipos ni debe.\n//\n// <ToolkitProvider fileTypes={{zip: {Icon: FolderZipOutlinedIcon, color: 'warning.main', label: 'ZIP', hint: 'Todas las facturas'}}}>\n//\n// El texto de un tipo de la casa sale de los textos del paquete (common:download.formats.<tipo>); el de uno del proyecto, de su\n// label y hint (o de esas mismas llaves en sus texts).\n//\n// Hook genérico: function (regla de la casa).\nimport InsertDriveFileOutlinedIcon from '@mui/icons-material/InsertDriveFileOutlined';\nimport PictureAsPdfOutlinedIcon from '@mui/icons-material/PictureAsPdfOutlined';\nimport TableViewOutlinedIcon from '@mui/icons-material/TableViewOutlined';\nimport TextSnippetOutlinedIcon from '@mui/icons-material/TextSnippetOutlined';\n\nimport {useToolkitSettings} from '@/toolkit/toolkitContext.js';\n\n/** Los tipos de la casa: su ícono y su color (de la paleta del tema, claro y oscuro). */\nexport const DEFAULT_FILE_TYPES = Object.freeze({\n xlsx: Object.freeze({Icon: TableViewOutlinedIcon, color: 'success.main'}),\n csv: Object.freeze({Icon: TextSnippetOutlinedIcon, color: 'info.main'}),\n pdf: Object.freeze({Icon: PictureAsPdfOutlinedIcon, color: 'error.main'}),\n});\n\n/** Un tipo que nadie declaró: el ícono de archivo y el gris del texto. */\nexport const UNKNOWN_FILE_TYPE = Object.freeze({Icon: InsertDriveFileOutlinedIcon, color: 'text.secondary'});\n\n/**\n * Los tipos que conoce esta app: los de la casa y los del proyecto (el del proyecto gana si se llama igual).\n *\n * @returns {Record<string, {Icon: import('react').ElementType, color: string, label?: string, hint?: string}>}\n */\nexport function useFileTypes() {\n const {fileTypes} = useToolkitSettings();\n return fileTypes ? {...DEFAULT_FILE_TYPES, ...fileTypes} : DEFAULT_FILE_TYPES;\n}\n"],"names":[],"mappings":";;;;;;AAkBY,MAAC,qBAAqB,OAAO,OAAO;AAAA,EAC5C,MAAM,OAAO,OAAO,EAAC,MAAM,uBAAuB,OAAO,eAAc,CAAC;AAAA,EACxE,KAAK,OAAO,OAAO,EAAC,MAAM,yBAAyB,OAAO,YAAW,CAAC;AAAA,EACtE,KAAK,OAAO,OAAO,EAAC,MAAM,0BAA0B,OAAO,aAAY,CAAC;AAC5E,CAAC;AAGW,MAAC,oBAAoB,OAAO,OAAO,EAAC,MAAM,6BAA6B,OAAO,iBAAgB,CAAC;AAOpG,SAAS,eAAe;AAC3B,QAAM,EAAC,UAAS,IAAI,mBAAkB;AACtC,SAAO,YAAY,EAAC,GAAG,oBAAoB,GAAG,UAAS,IAAI;AAC/D;"}