@stackcraftmx/calcita 0.0.0-stage → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (900) hide show
  1. package/LICENSE +110 -0
  2. package/README.md +700 -2
  3. package/cli/askQuestions.js +63 -0
  4. package/cli/calcita.js +150 -0
  5. package/cli/makeComponent.js +50 -0
  6. package/cli/makeForm.js +68 -0
  7. package/cli/makeModule.js +78 -0
  8. package/cli/makePage.js +62 -0
  9. package/cli/names.js +64 -0
  10. package/cli/newProject.js +103 -0
  11. package/cli/packageVersions.js +38 -0
  12. package/cli/projectAnswers.js +145 -0
  13. package/cli/projectConfig.js +38 -0
  14. package/cli/projectFiles.js +128 -0
  15. package/cli/screenLabels.js +41 -0
  16. package/cli/templateFiles.js +186 -0
  17. package/cli/templates/component/core/__ComponentName__.jsx.tpl +23 -0
  18. package/cli/templates/component/module/__ComponentName__.jsx.tpl +21 -0
  19. package/cli/templates/form/formik/__FormName__.jsx.tpl +50 -0
  20. package/cli/templates/form/hookForm/__FormName__.jsx.tpl +53 -0
  21. package/cli/templates/form/shared/__formName__Schema.js.tpl +20 -0
  22. package/cli/templates/form/shared/__formName__Texts.js.tpl +6 -0
  23. package/cli/templates/module/__Name__Page.jsx.tpl +75 -0
  24. package/cli/templates/module/__name__Api.js.tpl +39 -0
  25. package/cli/templates/module/__name__Texts.js.tpl +27 -0
  26. package/cli/templates/module/menu.js.tpl +21 -0
  27. package/cli/templates/module/routes.js.tpl +7 -0
  28. package/cli/templates/moduleServer/__name__Server.js.tpl +68 -0
  29. package/cli/templates/page/__PageName__Page.jsx.tpl +22 -0
  30. package/cli/templates/page/__pageName__PageTexts.js.tpl +23 -0
  31. package/cli/templates/project/README.md.tpl +83 -0
  32. package/cli/templates/project/dot-gitignore.tpl +11 -0
  33. package/cli/templates/project/index.html.tpl +20 -0
  34. package/cli/templates/project/jsconfig.json.tpl +16 -0
  35. package/cli/templates/project/pnpm-workspace.yaml.tpl +5 -0
  36. package/cli/templates/project/public/favicon.svg +1 -0
  37. package/cli/templates/project/public/icons/apple-touch-icon.png +0 -0
  38. package/cli/templates/project/public/icons/icon-192.png +0 -0
  39. package/cli/templates/project/public/icons/icon-512-maskable.png +0 -0
  40. package/cli/templates/project/public/icons/icon-512.png +0 -0
  41. package/cli/templates/project/public/manifest.webmanifest.tpl +17 -0
  42. package/cli/templates/project/src/app/AppProviders.jsx.tpl +107 -0
  43. package/cli/templates/project/src/app/AppShell.jsx.tpl +87 -0
  44. package/cli/templates/project/src/app/appRouter.jsx.tpl +51 -0
  45. package/cli/templates/project/src/app/appSettings.js.tpl +27 -0
  46. package/cli/templates/project/src/app/appTexts.js.tpl +15 -0
  47. package/cli/templates/project/src/app/combineTexts.js.tpl +31 -0
  48. package/cli/templates/project/src/app/i18n.js.tpl +19 -0
  49. package/cli/templates/project/src/app/shellTexts.js.tpl +16 -0
  50. package/cli/templates/project/src/core/AppLogo.jsx.tpl +14 -0
  51. package/cli/templates/project/src/core/accountConnector.js.tpl +36 -0
  52. package/cli/templates/project/src/core/apiClient.js.tpl +15 -0
  53. package/cli/templates/project/src/core/appPaths.js.tpl +11 -0
  54. package/cli/templates/project/src/core/index.js.tpl +9 -0
  55. package/cli/templates/project/src/core/publicPaths.js.tpl +24 -0
  56. package/cli/templates/project/src/fakeServer/networkDelay.js.tpl +40 -0
  57. package/cli/templates/project/src/fakeServer/serverText.js.tpl +20 -0
  58. package/cli/templates/project/src/main.jsx.tpl +24 -0
  59. package/cli/templates/project/src/modules/auth/ForgotPasswordPage.jsx.tpl +14 -0
  60. package/cli/templates/project/src/modules/auth/ResetPasswordPage.jsx.tpl +15 -0
  61. package/cli/templates/project/src/modules/auth/SignInPage.jsx.tpl +29 -0
  62. package/cli/templates/project/src/modules/auth/authTexts.js.tpl +6 -0
  63. package/cli/templates/project/src/modules/auth/routes.js.tpl +11 -0
  64. package/cli/templates/project/src/modules/home/HomePage.jsx.tpl +38 -0
  65. package/cli/templates/project/src/modules/home/homeTexts.js.tpl +29 -0
  66. package/cli/templates/project/src/modules/home/menu.js.tpl +17 -0
  67. package/cli/templates/project/src/modules/home/routes.js.tpl +4 -0
  68. package/cli/templates/project/src/modules/profile/ProfilePage.jsx.tpl +13 -0
  69. package/cli/templates/project/src/modules/profile/routes.js.tpl +6 -0
  70. package/cli/templates/project/vite.config.js.tpl +53 -0
  71. package/dist/DataTable/AuditTrailDialog.js +40 -0
  72. package/dist/DataTable/AuditTrailDialog.js.map +1 -0
  73. package/dist/DataTable/AuditTrailTable.js +89 -0
  74. package/dist/DataTable/AuditTrailTable.js.map +1 -0
  75. package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js +71 -0
  76. package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js.map +1 -0
  77. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js +51 -0
  78. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js.map +1 -0
  79. package/dist/DataTable/ColumnFilters/SortableFilterHeader.js +54 -0
  80. package/dist/DataTable/ColumnFilters/SortableFilterHeader.js.map +1 -0
  81. package/dist/DataTable/ColumnFilters/TextColumnFilter.js +24 -0
  82. package/dist/DataTable/ColumnFilters/TextColumnFilter.js.map +1 -0
  83. package/dist/DataTable/EmptyState.js +22 -0
  84. package/dist/DataTable/EmptyState.js.map +1 -0
  85. package/dist/DataTable/FilterChips.js +39 -0
  86. package/dist/DataTable/FilterChips.js.map +1 -0
  87. package/dist/DataTable/GoToPage.js +63 -0
  88. package/dist/DataTable/GoToPage.js.map +1 -0
  89. package/dist/DataTable/ServerTable.js +477 -0
  90. package/dist/DataTable/ServerTable.js.map +1 -0
  91. package/dist/DataTable/buildChipConfig.js +27 -0
  92. package/dist/DataTable/buildChipConfig.js.map +1 -0
  93. package/dist/DataTable/columns.js +122 -0
  94. package/dist/DataTable/columns.js.map +1 -0
  95. package/dist/DataTable/filterContext.js +15 -0
  96. package/dist/DataTable/filterContext.js.map +1 -0
  97. package/dist/DataTable/rowSelection.js +61 -0
  98. package/dist/DataTable/rowSelection.js.map +1 -0
  99. package/dist/DataTable/serverTableParams.js +19 -0
  100. package/dist/DataTable/serverTableParams.js.map +1 -0
  101. package/dist/DataTable/tableMachine.js +87 -0
  102. package/dist/DataTable/tableMachine.js.map +1 -0
  103. package/dist/DataTable/useDebouncedFilter.js +29 -0
  104. package/dist/DataTable/useDebouncedFilter.js.map +1 -0
  105. package/dist/DataTable/useTableState.js +132 -0
  106. package/dist/DataTable/useTableState.js.map +1 -0
  107. package/dist/access/Can.js +9 -0
  108. package/dist/access/Can.js.map +1 -0
  109. package/dist/access/PermissionMatrix.js +84 -0
  110. package/dist/access/PermissionMatrix.js.map +1 -0
  111. package/dist/access/RequireAccess.js +14 -0
  112. package/dist/access/RequireAccess.js.map +1 -0
  113. package/dist/access/accessRules.js +49 -0
  114. package/dist/access/accessRules.js.map +1 -0
  115. package/dist/access/permissionGroups.js +43 -0
  116. package/dist/access/permissionGroups.js.map +1 -0
  117. package/dist/access/useCan.js +12 -0
  118. package/dist/access/useCan.js.map +1 -0
  119. package/dist/account/AccountProvider.js +58 -0
  120. package/dist/account/AccountProvider.js.map +1 -0
  121. package/dist/account/AccountSecuritySection.js +81 -0
  122. package/dist/account/AccountSecuritySection.js.map +1 -0
  123. package/dist/account/DemoTotpCodeButton.js +26 -0
  124. package/dist/account/DemoTotpCodeButton.js.map +1 -0
  125. package/dist/account/ForgotPasswordScreen.js +27 -0
  126. package/dist/account/ForgotPasswordScreen.js.map +1 -0
  127. package/dist/account/ProfileScreen.js +134 -0
  128. package/dist/account/ProfileScreen.js.map +1 -0
  129. package/dist/account/ResetPasswordScreen.js +58 -0
  130. package/dist/account/ResetPasswordScreen.js.map +1 -0
  131. package/dist/account/SignInScreen.js +102 -0
  132. package/dist/account/SignInScreen.js.map +1 -0
  133. package/dist/account/accountConnector.js +31 -0
  134. package/dist/account/accountConnector.js.map +1 -0
  135. package/dist/account/demo/createDemoAccountConnector.js +368 -0
  136. package/dist/account/demo/createDemoAccountConnector.js.map +1 -0
  137. package/dist/account/demo/totp.js +61 -0
  138. package/dist/account/demo/totp.js.map +1 -0
  139. package/dist/account/restAccountConnector.js +118 -0
  140. package/dist/account/restAccountConnector.js.map +1 -0
  141. package/dist/account-demo.js +12 -0
  142. package/dist/account-demo.js.map +1 -0
  143. package/dist/account.js +25 -0
  144. package/dist/account.js.map +1 -0
  145. package/dist/adapters/i18next.js +7 -0
  146. package/dist/adapters/i18next.js.map +1 -0
  147. package/dist/adapters/nextNavigation.js +36 -0
  148. package/dist/adapters/nextNavigation.js.map +1 -0
  149. package/dist/adapters/reactRouter.js +7 -0
  150. package/dist/adapters/reactRouter.js.map +1 -0
  151. package/dist/adapters/reactRouterRoutes.js +49 -0
  152. package/dist/adapters/reactRouterRoutes.js.map +1 -0
  153. package/dist/api/ApiError.js +58 -0
  154. package/dist/api/ApiError.js.map +1 -0
  155. package/dist/api/createApiClient.js +256 -0
  156. package/dist/api/createApiClient.js.map +1 -0
  157. package/dist/api/staleChunks.js +47 -0
  158. package/dist/api/staleChunks.js.map +1 -0
  159. package/dist/appShell/AccountMenu.js +86 -0
  160. package/dist/appShell/AccountMenu.js.map +1 -0
  161. package/dist/appShell/AppLayout.js +513 -0
  162. package/dist/appShell/AppLayout.js.map +1 -0
  163. package/dist/appShell/AppearanceSettings.js +116 -0
  164. package/dist/appShell/AppearanceSettings.js.map +1 -0
  165. package/dist/appShell/AuthLayout.js +46 -0
  166. package/dist/appShell/AuthLayout.js.map +1 -0
  167. package/dist/appShell/BarActionButton.js +31 -0
  168. package/dist/appShell/BarActionButton.js.map +1 -0
  169. package/dist/appShell/BarActions.js +105 -0
  170. package/dist/appShell/BarActions.js.map +1 -0
  171. package/dist/appShell/BarCapsule.js +50 -0
  172. package/dist/appShell/BarCapsule.js.map +1 -0
  173. package/dist/appShell/BarSearch.js +92 -0
  174. package/dist/appShell/BarSearch.js.map +1 -0
  175. package/dist/appShell/HeaderTools.js +53 -0
  176. package/dist/appShell/HeaderTools.js.map +1 -0
  177. package/dist/appShell/MobileTabBar.js +348 -0
  178. package/dist/appShell/MobileTabBar.js.map +1 -0
  179. package/dist/appShell/SettingsMenu.js +41 -0
  180. package/dist/appShell/SettingsMenu.js.map +1 -0
  181. package/dist/appShell/SideMenu.js +217 -0
  182. package/dist/appShell/SideMenu.js.map +1 -0
  183. package/dist/appShell/SideMenuEntry.js +140 -0
  184. package/dist/appShell/SideMenuEntry.js.map +1 -0
  185. package/dist/appShell/SubmenuActionsMenu.js +71 -0
  186. package/dist/appShell/SubmenuActionsMenu.js.map +1 -0
  187. package/dist/appShell/TabBarEditor.js +55 -0
  188. package/dist/appShell/TabBarEditor.js.map +1 -0
  189. package/dist/appShell/TopMenu.js +80 -0
  190. package/dist/appShell/TopMenu.js.map +1 -0
  191. package/dist/appShell/appMenuContext.js +11 -0
  192. package/dist/appShell/appMenuContext.js.map +1 -0
  193. package/dist/appShell/barActionsSlot.js +26 -0
  194. package/dist/appShell/barActionsSlot.js.map +1 -0
  195. package/dist/appShell/barMenuPlacement.js +33 -0
  196. package/dist/appShell/barMenuPlacement.js.map +1 -0
  197. package/dist/appShell/menuItemText.js +33 -0
  198. package/dist/appShell/menuItemText.js.map +1 -0
  199. package/dist/appShell/pageTitle.js +45 -0
  200. package/dist/appShell/pageTitle.js.map +1 -0
  201. package/dist/appShell/shellSizes.js +40 -0
  202. package/dist/appShell/shellSizes.js.map +1 -0
  203. package/dist/appShell/tabBarRule.js +12 -0
  204. package/dist/appShell/tabBarRule.js.map +1 -0
  205. package/dist/appShell/tabBarScroll.js +23 -0
  206. package/dist/appShell/tabBarScroll.js.map +1 -0
  207. package/dist/appShell/useDrawerCollapsed.js +29 -0
  208. package/dist/appShell/useDrawerCollapsed.js.map +1 -0
  209. package/dist/appShell/useFittingActionCount.js +45 -0
  210. package/dist/appShell/useFittingActionCount.js.map +1 -0
  211. package/dist/appShell/usePinnedMobileTabs.js +32 -0
  212. package/dist/appShell/usePinnedMobileTabs.js.map +1 -0
  213. package/dist/appShell/useTabBarMinimized.js +33 -0
  214. package/dist/appShell/useTabBarMinimized.js.map +1 -0
  215. package/dist/auth/PasswordChecklist.js +44 -0
  216. package/dist/auth/PasswordChecklist.js.map +1 -0
  217. package/dist/auth/passwordRules.js +43 -0
  218. package/dist/auth/passwordRules.js.map +1 -0
  219. package/dist/calendar/EventCalendar.js +149 -0
  220. package/dist/calendar/EventCalendar.js.map +1 -0
  221. package/dist/calendar/EventDetails.js +74 -0
  222. package/dist/calendar/EventDetails.js.map +1 -0
  223. package/dist/calendar/calendarEvents.js +31 -0
  224. package/dist/calendar/calendarEvents.js.map +1 -0
  225. package/dist/calendar.js +13 -0
  226. package/dist/calendar.js.map +1 -0
  227. package/dist/charts.js +16 -0
  228. package/dist/charts.js.map +1 -0
  229. package/dist/date-pickers.js +8 -0
  230. package/dist/date-pickers.js.map +1 -0
  231. package/dist/datePickers/DateInput.js +76 -0
  232. package/dist/datePickers/DateInput.js.map +1 -0
  233. package/dist/datePickers/FormDateField.js +12 -0
  234. package/dist/datePickers/FormDateField.js.map +1 -0
  235. package/dist/dates.js +25 -0
  236. package/dist/dates.js.map +1 -0
  237. package/dist/dictionaries/dictionaries.js +48 -0
  238. package/dist/dictionaries/dictionaries.js.map +1 -0
  239. package/dist/downloads/DownloadManager.js +195 -0
  240. package/dist/downloads/DownloadManager.js.map +1 -0
  241. package/dist/downloads/downloadQueue.js +56 -0
  242. package/dist/downloads/downloadQueue.js.map +1 -0
  243. package/dist/downloads/downloadsMachine.js +80 -0
  244. package/dist/downloads/downloadsMachine.js.map +1 -0
  245. package/dist/downloads/fileTypes.js +22 -0
  246. package/dist/downloads/fileTypes.js.map +1 -0
  247. package/dist/excel/reportWorkbook.js +299 -0
  248. package/dist/excel/reportWorkbook.js.map +1 -0
  249. package/dist/excel.js +13 -0
  250. package/dist/excel.js.map +1 -0
  251. package/dist/feedback/ConfirmDialog.js +73 -0
  252. package/dist/feedback/ConfirmDialog.js.map +1 -0
  253. package/dist/feedback/ModalWaiting.js +23 -0
  254. package/dist/feedback/ModalWaiting.js.map +1 -0
  255. package/dist/feedback/NewBuildNotice.js +79 -0
  256. package/dist/feedback/NewBuildNotice.js.map +1 -0
  257. package/dist/feedback/StaleBuildBoundary.js +36 -0
  258. package/dist/feedback/StaleBuildBoundary.js.map +1 -0
  259. package/dist/feedback/Toaster.js +20 -0
  260. package/dist/feedback/Toaster.js.map +1 -0
  261. package/dist/feedback/confirmActionMachine.js +67 -0
  262. package/dist/feedback/confirmActionMachine.js.map +1 -0
  263. package/dist/feedback/toast.js +88 -0
  264. package/dist/feedback/toast.js.map +1 -0
  265. package/dist/feedback/useConfirmAction.js +40 -0
  266. package/dist/feedback/useConfirmAction.js.map +1 -0
  267. package/dist/filepond/FileDropzone.js +256 -0
  268. package/dist/filepond/FileDropzone.js.map +1 -0
  269. package/dist/filepond/pondServer.js +48 -0
  270. package/dist/filepond/pondServer.js.map +1 -0
  271. package/dist/filepond.js +10 -0
  272. package/dist/filepond.js.map +1 -0
  273. package/dist/files.js +43 -0
  274. package/dist/files.js.map +1 -0
  275. package/dist/formatting.js +205 -0
  276. package/dist/formatting.js.map +1 -0
  277. package/dist/forms/FormCatalogField.js +12 -0
  278. package/dist/forms/FormCatalogField.js.map +1 -0
  279. package/dist/forms/FormColorField.js +12 -0
  280. package/dist/forms/FormColorField.js.map +1 -0
  281. package/dist/forms/FormNumberField.js +12 -0
  282. package/dist/forms/FormNumberField.js.map +1 -0
  283. package/dist/forms/FormProblemAlert.js +15 -0
  284. package/dist/forms/FormProblemAlert.js.map +1 -0
  285. package/dist/forms/FormSelectField.js +12 -0
  286. package/dist/forms/FormSelectField.js.map +1 -0
  287. package/dist/forms/FormServerProblem.js +23 -0
  288. package/dist/forms/FormServerProblem.js.map +1 -0
  289. package/dist/forms/FormTextField.js +12 -0
  290. package/dist/forms/FormTextField.js.map +1 -0
  291. package/dist/forms/FormWizard.js +63 -0
  292. package/dist/forms/FormWizard.js.map +1 -0
  293. package/dist/forms/SubmitButton.js +14 -0
  294. package/dist/forms/SubmitButton.js.map +1 -0
  295. package/dist/forms/applyServerProblem.js +15 -0
  296. package/dist/forms/applyServerProblem.js.map +1 -0
  297. package/dist/forms/auth/ChangePasswordForm.js +47 -0
  298. package/dist/forms/auth/ChangePasswordForm.js.map +1 -0
  299. package/dist/forms/auth/ForgotPasswordForm.js +50 -0
  300. package/dist/forms/auth/ForgotPasswordForm.js.map +1 -0
  301. package/dist/forms/auth/SignInForm.js +48 -0
  302. package/dist/forms/auth/SignInForm.js.map +1 -0
  303. package/dist/forms/security/SecondStepForm.js +122 -0
  304. package/dist/forms/security/SecondStepForm.js.map +1 -0
  305. package/dist/forms/security/TwoStepVerificationCard.js +338 -0
  306. package/dist/forms/security/TwoStepVerificationCard.js.map +1 -0
  307. package/dist/forms/security/securityRules.js +28 -0
  308. package/dist/forms/security/securityRules.js.map +1 -0
  309. package/dist/forms/serverProblemFields.js +25 -0
  310. package/dist/forms/serverProblemFields.js.map +1 -0
  311. package/dist/forms/useFormikField.js +16 -0
  312. package/dist/forms/useFormikField.js.map +1 -0
  313. package/dist/forms/validation.js +55 -0
  314. package/dist/forms/validation.js.map +1 -0
  315. package/dist/forms/validationMessages.js +16 -0
  316. package/dist/forms/validationMessages.js.map +1 -0
  317. package/dist/forms.js +57 -0
  318. package/dist/forms.js.map +1 -0
  319. package/dist/hookForm/FormCatalogField.js +12 -0
  320. package/dist/hookForm/FormCatalogField.js.map +1 -0
  321. package/dist/hookForm/FormColorField.js +12 -0
  322. package/dist/hookForm/FormColorField.js.map +1 -0
  323. package/dist/hookForm/FormNumberField.js +12 -0
  324. package/dist/hookForm/FormNumberField.js.map +1 -0
  325. package/dist/hookForm/FormProblemAlert.js +17 -0
  326. package/dist/hookForm/FormProblemAlert.js.map +1 -0
  327. package/dist/hookForm/FormSelectField.js +12 -0
  328. package/dist/hookForm/FormSelectField.js.map +1 -0
  329. package/dist/hookForm/FormTextField.js +12 -0
  330. package/dist/hookForm/FormTextField.js.map +1 -0
  331. package/dist/hookForm/FormWizard.js +59 -0
  332. package/dist/hookForm/FormWizard.js.map +1 -0
  333. package/dist/hookForm/SubmitButton.js +15 -0
  334. package/dist/hookForm/SubmitButton.js.map +1 -0
  335. package/dist/hookForm/applyServerProblem.js +21 -0
  336. package/dist/hookForm/applyServerProblem.js.map +1 -0
  337. package/dist/hookForm/useHookFormField.js +19 -0
  338. package/dist/hookForm/useHookFormField.js.map +1 -0
  339. package/dist/i18next.js +5 -0
  340. package/dist/i18next.js.map +1 -0
  341. package/dist/identifiers.js +8 -0
  342. package/dist/identifiers.js.map +1 -0
  343. package/dist/inbox/InboxLayout.js +104 -0
  344. package/dist/inbox/InboxLayout.js.map +1 -0
  345. package/dist/inbox/MessageList.js +114 -0
  346. package/dist/inbox/MessageList.js.map +1 -0
  347. package/dist/inbox/MessageView.js +104 -0
  348. package/dist/inbox/MessageView.js.map +1 -0
  349. package/dist/inbox/inboxDates.js +9 -0
  350. package/dist/inbox/inboxDates.js.map +1 -0
  351. package/dist/index.js +407 -0
  352. package/dist/index.js.map +1 -0
  353. package/dist/inputs/CatalogInput.js +66 -0
  354. package/dist/inputs/CatalogInput.js.map +1 -0
  355. package/dist/inputs/ColorInput.js +109 -0
  356. package/dist/inputs/ColorInput.js.map +1 -0
  357. package/dist/inputs/FieldFrame.js +20 -0
  358. package/dist/inputs/FieldFrame.js.map +1 -0
  359. package/dist/inputs/FormSection.js +105 -0
  360. package/dist/inputs/FormSection.js.map +1 -0
  361. package/dist/inputs/NumberInput.js +70 -0
  362. package/dist/inputs/NumberInput.js.map +1 -0
  363. package/dist/inputs/SelectInput.js +84 -0
  364. package/dist/inputs/SelectInput.js.map +1 -0
  365. package/dist/inputs/TextInput.js +101 -0
  366. package/dist/inputs/TextInput.js.map +1 -0
  367. package/dist/inputs/WizardLayout.js +54 -0
  368. package/dist/inputs/WizardLayout.js.map +1 -0
  369. package/dist/inputs/colorContrast.js +46 -0
  370. package/dist/inputs/colorContrast.js.map +1 -0
  371. package/dist/inputs/formLayoutContext.js +9 -0
  372. package/dist/inputs/formLayoutContext.js.map +1 -0
  373. package/dist/inputs/numberText.js +48 -0
  374. package/dist/inputs/numberText.js.map +1 -0
  375. package/dist/kanban/KanbanBoard.js +338 -0
  376. package/dist/kanban/KanbanBoard.js.map +1 -0
  377. package/dist/kanban/kanbanCards.js +19 -0
  378. package/dist/kanban/kanbanCards.js.map +1 -0
  379. package/dist/kanban/kanbanMoves.js +29 -0
  380. package/dist/kanban/kanbanMoves.js.map +1 -0
  381. package/dist/kanban.js +15 -0
  382. package/dist/kanban.js.map +1 -0
  383. package/dist/laravel/csrfRetry.js +18 -0
  384. package/dist/laravel/csrfRetry.js.map +1 -0
  385. package/dist/laravel.js +6 -0
  386. package/dist/laravel.js.map +1 -0
  387. package/dist/lastListUrl.js +35 -0
  388. package/dist/lastListUrl.js.map +1 -0
  389. package/dist/locales/en.js +787 -0
  390. package/dist/locales/en.js.map +1 -0
  391. package/dist/locales/es.js +787 -0
  392. package/dist/locales/es.js.map +1 -0
  393. package/dist/maps/MapView.js +116 -0
  394. package/dist/maps/MapView.js.map +1 -0
  395. package/dist/maps/mapMarkers.js +19 -0
  396. package/dist/maps/mapMarkers.js.map +1 -0
  397. package/dist/maps.js +10 -0
  398. package/dist/maps.js.map +1 -0
  399. package/dist/money/money.js +380 -0
  400. package/dist/money/money.js.map +1 -0
  401. package/dist/money.js +6 -0
  402. package/dist/money.js.map +1 -0
  403. package/dist/navigation/appMenu.js +93 -0
  404. package/dist/navigation/appMenu.js.map +1 -0
  405. package/dist/navigation/useMenuBadges.js +45 -0
  406. package/dist/navigation/useMenuBadges.js.map +1 -0
  407. package/dist/navigation.js +30 -0
  408. package/dist/navigation.js.map +1 -0
  409. package/dist/navigationTrail.js +82 -0
  410. package/dist/navigationTrail.js.map +1 -0
  411. package/dist/next.js +5 -0
  412. package/dist/next.js.map +1 -0
  413. package/dist/observability/buildWatch.js +19 -0
  414. package/dist/observability/buildWatch.js.map +1 -0
  415. package/dist/observability/logger.js +43 -0
  416. package/dist/observability/logger.js.map +1 -0
  417. package/dist/observability/publishedBuild.js +39 -0
  418. package/dist/observability/publishedBuild.js.map +1 -0
  419. package/dist/observability/usePublishedBuildWatch.js +77 -0
  420. package/dist/observability/usePublishedBuildWatch.js.map +1 -0
  421. package/dist/passkeys.js +7 -0
  422. package/dist/passkeys.js.map +1 -0
  423. package/dist/periodRanges.js +33 -0
  424. package/dist/periodRanges.js.map +1 -0
  425. package/dist/problems.js +51 -0
  426. package/dist/problems.js.map +1 -0
  427. package/dist/pwa/InstallAppSetting.js +34 -0
  428. package/dist/pwa/InstallAppSetting.js.map +1 -0
  429. package/dist/pwa/InstallInstructionsDialog.js +35 -0
  430. package/dist/pwa/InstallInstructionsDialog.js.map +1 -0
  431. package/dist/pwa/InstallPromptBanner.js +70 -0
  432. package/dist/pwa/InstallPromptBanner.js.map +1 -0
  433. package/dist/pwa/installInstructions.js +60 -0
  434. package/dist/pwa/installInstructions.js.map +1 -0
  435. package/dist/pwa/useInstallPrompt.js +71 -0
  436. package/dist/pwa/useInstallPrompt.js.map +1 -0
  437. package/dist/react-hook-form.js +32 -0
  438. package/dist/react-hook-form.js.map +1 -0
  439. package/dist/react-router.js +10 -0
  440. package/dist/react-router.js.map +1 -0
  441. package/dist/security/ActivityLog.js +80 -0
  442. package/dist/security/ActivityLog.js.map +1 -0
  443. package/dist/security/RecoveryCodesDialog.js +85 -0
  444. package/dist/security/RecoveryCodesDialog.js.map +1 -0
  445. package/dist/security/SessionsCard.js +83 -0
  446. package/dist/security/SessionsCard.js.map +1 -0
  447. package/dist/security/passkeys.js +39 -0
  448. package/dist/security/passkeys.js.map +1 -0
  449. package/dist/table.js +37 -0
  450. package/dist/table.js.map +1 -0
  451. package/dist/theme/androidDevice.js +16 -0
  452. package/dist/theme/androidDevice.js.map +1 -0
  453. package/dist/theme/appleTracking.js +34 -0
  454. package/dist/theme/appleTracking.js.map +1 -0
  455. package/dist/theme/components/MuiAppBar.js +27 -0
  456. package/dist/theme/components/MuiAppBar.js.map +1 -0
  457. package/dist/theme/components/MuiBackdrop.js +13 -0
  458. package/dist/theme/components/MuiBackdrop.js.map +1 -0
  459. package/dist/theme/components/MuiButton.js +25 -0
  460. package/dist/theme/components/MuiButton.js.map +1 -0
  461. package/dist/theme/components/MuiButtonBase.js +16 -0
  462. package/dist/theme/components/MuiButtonBase.js.map +1 -0
  463. package/dist/theme/components/MuiChip.js +30 -0
  464. package/dist/theme/components/MuiChip.js.map +1 -0
  465. package/dist/theme/components/MuiDataGrid.js +30 -0
  466. package/dist/theme/components/MuiDataGrid.js.map +1 -0
  467. package/dist/theme/components/MuiDialog.js +13 -0
  468. package/dist/theme/components/MuiDialog.js.map +1 -0
  469. package/dist/theme/components/MuiDrawer.js +18 -0
  470. package/dist/theme/components/MuiDrawer.js.map +1 -0
  471. package/dist/theme/components/MuiMenuItem.js +17 -0
  472. package/dist/theme/components/MuiMenuItem.js.map +1 -0
  473. package/dist/theme/components/MuiTypography.js +22 -0
  474. package/dist/theme/components/MuiTypography.js.map +1 -0
  475. package/dist/theme/components/glassComponents.js +885 -0
  476. package/dist/theme/components/glassComponents.js.map +1 -0
  477. package/dist/theme/components/minimalComponents.js +146 -0
  478. package/dist/theme/components/minimalComponents.js.map +1 -0
  479. package/dist/theme/components/paletteOf.js +7 -0
  480. package/dist/theme/components/paletteOf.js.map +1 -0
  481. package/dist/theme/createToolkitTheme.js +100 -0
  482. package/dist/theme/createToolkitTheme.js.map +1 -0
  483. package/dist/theme/glassSurface.js +328 -0
  484. package/dist/theme/glassSurface.js.map +1 -0
  485. package/dist/theme/glassToasterStyles.js +50 -0
  486. package/dist/theme/glassToasterStyles.js.map +1 -0
  487. package/dist/theme/mergeComponents.js +42 -0
  488. package/dist/theme/mergeComponents.js.map +1 -0
  489. package/dist/theme/stackcraftPalette.js +59 -0
  490. package/dist/theme/stackcraftPalette.js.map +1 -0
  491. package/dist/theme/toolkitComponents.js +28 -0
  492. package/dist/theme/toolkitComponents.js.map +1 -0
  493. package/dist/timeline.js +8 -0
  494. package/dist/timeline.js.map +1 -0
  495. package/dist/toolkit/ComponentTexts.js +13 -0
  496. package/dist/toolkit/ComponentTexts.js.map +1 -0
  497. package/dist/toolkit/ToolkitProvider.js +57 -0
  498. package/dist/toolkit/ToolkitProvider.js.map +1 -0
  499. package/dist/toolkit/browserNavigation.js +33 -0
  500. package/dist/toolkit/browserNavigation.js.map +1 -0
  501. package/dist/toolkit/componentTextsContext.js +15 -0
  502. package/dist/toolkit/componentTextsContext.js.map +1 -0
  503. package/dist/toolkit/hashNavigation.js +40 -0
  504. package/dist/toolkit/hashNavigation.js.map +1 -0
  505. package/dist/toolkit/navigationPaths.js +49 -0
  506. package/dist/toolkit/navigationPaths.js.map +1 -0
  507. package/dist/toolkit/toolkitContext.js +19 -0
  508. package/dist/toolkit/toolkitContext.js.map +1 -0
  509. package/dist/toolkit/toolkitSettings.js +107 -0
  510. package/dist/toolkit/toolkitSettings.js.map +1 -0
  511. package/dist/toolkit/useFormatters.js +12 -0
  512. package/dist/toolkit/useFormatters.js.map +1 -0
  513. package/dist/toolkit/useToolkitTranslation.js +22 -0
  514. package/dist/toolkit/useToolkitTranslation.js.map +1 -0
  515. package/dist/types/DataTable/AuditTrailDialog.d.ts +32 -0
  516. package/dist/types/DataTable/AuditTrailTable.d.ts +30 -0
  517. package/dist/types/DataTable/ColumnFilters/HeaderFilterPopover.d.ts +8 -0
  518. package/dist/types/DataTable/ColumnFilters/MultiSelectColumnFilter.d.ts +16 -0
  519. package/dist/types/DataTable/ColumnFilters/SortableFilterHeader.d.ts +26 -0
  520. package/dist/types/DataTable/ColumnFilters/TextColumnFilter.d.ts +8 -0
  521. package/dist/types/DataTable/ColumnFilters/index.d.ts +4 -0
  522. package/dist/types/DataTable/EmptyState.d.ts +13 -0
  523. package/dist/types/DataTable/FilterChips.d.ts +17 -0
  524. package/dist/types/DataTable/GoToPage.d.ts +13 -0
  525. package/dist/types/DataTable/SelectionBar.d.ts +32 -0
  526. package/dist/types/DataTable/ServerTable.d.ts +171 -0
  527. package/dist/types/DataTable/buildChipConfig.d.ts +22 -0
  528. package/dist/types/DataTable/columns.d.ts +93 -0
  529. package/dist/types/DataTable/filterContext.d.ts +13 -0
  530. package/dist/types/DataTable/index.d.ts +13 -0
  531. package/dist/types/DataTable/rowSelection.d.ts +113 -0
  532. package/dist/types/DataTable/serverTableParams.d.ts +16 -0
  533. package/dist/types/DataTable/tableMachine.d.ts +41 -0
  534. package/dist/types/DataTable/useDebouncedFilter.d.ts +8 -0
  535. package/dist/types/DataTable/useTableState.d.ts +93 -0
  536. package/dist/types/access/Can.d.ts +11 -0
  537. package/dist/types/access/PermissionMatrix.d.ts +23 -0
  538. package/dist/types/access/RequireAccess.d.ts +11 -0
  539. package/dist/types/access/accessRules.d.ts +24 -0
  540. package/dist/types/access/permissionGroups.d.ts +56 -0
  541. package/dist/types/access/useCan.d.ts +11 -0
  542. package/dist/types/account/AccountProvider.d.ts +27 -0
  543. package/dist/types/account/AccountSecuritySection.d.ts +9 -0
  544. package/dist/types/account/DemoTotpCodeButton.d.ts +6 -0
  545. package/dist/types/account/ForgotPasswordScreen.d.ts +17 -0
  546. package/dist/types/account/ProfileScreen.d.ts +43 -0
  547. package/dist/types/account/ResetPasswordScreen.d.ts +21 -0
  548. package/dist/types/account/SignInScreen.d.ts +27 -0
  549. package/dist/types/account/accountConnector.d.ts +268 -0
  550. package/dist/types/account/demo/createDemoAccountConnector.d.ts +30 -0
  551. package/dist/types/account/demo/totp.d.ts +45 -0
  552. package/dist/types/account/restAccountConnector.d.ts +49 -0
  553. package/dist/types/account-demo.d.ts +2 -0
  554. package/dist/types/account.d.ts +16 -0
  555. package/dist/types/adapters/i18next.d.ts +11 -0
  556. package/dist/types/adapters/nextNavigation.d.ts +33 -0
  557. package/dist/types/adapters/reactRouter.d.ts +6 -0
  558. package/dist/types/adapters/reactRouterRoutes.d.ts +42 -0
  559. package/dist/types/api/ApiError.d.ts +42 -0
  560. package/dist/types/api/createApiClient.d.ts +174 -0
  561. package/dist/types/api/staleChunks.d.ts +15 -0
  562. package/dist/types/appShell/AccountMenu.d.ts +28 -0
  563. package/dist/types/appShell/AppLayout.d.ts +76 -0
  564. package/dist/types/appShell/AppearanceSettings.d.ts +41 -0
  565. package/dist/types/appShell/AuthLayout.d.ts +21 -0
  566. package/dist/types/appShell/BarActionButton.d.ts +15 -0
  567. package/dist/types/appShell/BarActions.d.ts +23 -0
  568. package/dist/types/appShell/BarCapsule.d.ts +20 -0
  569. package/dist/types/appShell/BarSearch.d.ts +24 -0
  570. package/dist/types/appShell/HeaderTools.d.ts +27 -0
  571. package/dist/types/appShell/MobileTabBar.d.ts +20 -0
  572. package/dist/types/appShell/SettingsMenu.d.ts +13 -0
  573. package/dist/types/appShell/SideMenu.d.ts +31 -0
  574. package/dist/types/appShell/SideMenuEntry.d.ts +17 -0
  575. package/dist/types/appShell/SubmenuActionsMenu.d.ts +24 -0
  576. package/dist/types/appShell/TabBarEditor.d.ts +13 -0
  577. package/dist/types/appShell/TopMenu.d.ts +7 -0
  578. package/dist/types/appShell/appMenuContext.d.ts +9 -0
  579. package/dist/types/appShell/barActionsSlot.d.ts +35 -0
  580. package/dist/types/appShell/barMenuPlacement.d.ts +9 -0
  581. package/dist/types/appShell/menuItemText.d.ts +55 -0
  582. package/dist/types/appShell/pageTitle.d.ts +26 -0
  583. package/dist/types/appShell/shellSizes.d.ts +46 -0
  584. package/dist/types/appShell/tabBarRule.d.ts +5 -0
  585. package/dist/types/appShell/tabBarScroll.d.ts +26 -0
  586. package/dist/types/appShell/useDrawerCollapsed.d.ts +8 -0
  587. package/dist/types/appShell/useFittingActionCount.d.ts +7 -0
  588. package/dist/types/appShell/usePinnedMobileTabs.d.ts +7 -0
  589. package/dist/types/appShell/useTabBarMinimized.d.ts +8 -0
  590. package/dist/types/auth/PasswordChecklist.d.ts +13 -0
  591. package/dist/types/auth/passwordRules.d.ts +34 -0
  592. package/dist/types/calendar/EventCalendar.d.ts +63 -0
  593. package/dist/types/calendar/EventDetails.d.ts +36 -0
  594. package/dist/types/calendar/calendarEvents.d.ts +27 -0
  595. package/dist/types/calendar.d.ts +3 -0
  596. package/dist/types/charts.d.ts +6 -0
  597. package/dist/types/date-pickers.d.ts +2 -0
  598. package/dist/types/datePickers/DateInput.d.ts +41 -0
  599. package/dist/types/datePickers/FormDateField.d.ts +7 -0
  600. package/dist/types/dates.d.ts +18 -0
  601. package/dist/types/dictionaries/dictionaries.d.ts +54 -0
  602. package/dist/types/downloads/DownloadManager.d.ts +7 -0
  603. package/dist/types/downloads/downloadQueue.d.ts +50 -0
  604. package/dist/types/downloads/downloadsMachine.d.ts +10 -0
  605. package/dist/types/downloads/fileTypes.d.ts +39 -0
  606. package/dist/types/downloads/index.d.ts +4 -0
  607. package/dist/types/excel/reportWorkbook.d.ts +157 -0
  608. package/dist/types/excel.d.ts +1 -0
  609. package/dist/types/feedback/ConfirmDialog.d.ts +31 -0
  610. package/dist/types/feedback/ModalWaiting.d.ts +13 -0
  611. package/dist/types/feedback/NewBuildNotice.d.ts +20 -0
  612. package/dist/types/feedback/StaleBuildBoundary.d.ts +21 -0
  613. package/dist/types/feedback/Toaster.d.ts +1 -0
  614. package/dist/types/feedback/confirmActionMachine.d.ts +19 -0
  615. package/dist/types/feedback/index.d.ts +8 -0
  616. package/dist/types/feedback/toast.d.ts +100 -0
  617. package/dist/types/feedback/useConfirmAction.d.ts +33 -0
  618. package/dist/types/filepond/FileDropzone.d.ts +61 -0
  619. package/dist/types/filepond/pondServer.d.ts +17 -0
  620. package/dist/types/filepond.d.ts +3 -0
  621. package/dist/types/files.d.ts +29 -0
  622. package/dist/types/formatting.d.ts +61 -0
  623. package/dist/types/forms/FormCatalogField.d.ts +6 -0
  624. package/dist/types/forms/FormColorField.d.ts +6 -0
  625. package/dist/types/forms/FormNumberField.d.ts +6 -0
  626. package/dist/types/forms/FormProblemAlert.d.ts +6 -0
  627. package/dist/types/forms/FormSelectField.d.ts +6 -0
  628. package/dist/types/forms/FormServerProblem.d.ts +8 -0
  629. package/dist/types/forms/FormTextField.d.ts +6 -0
  630. package/dist/types/forms/FormWizard.d.ts +22 -0
  631. package/dist/types/forms/SubmitButton.d.ts +9 -0
  632. package/dist/types/forms/applyServerProblem.d.ts +9 -0
  633. package/dist/types/forms/auth/ChangePasswordForm.d.ts +17 -0
  634. package/dist/types/forms/auth/ForgotPasswordForm.d.ts +14 -0
  635. package/dist/types/forms/auth/SignInForm.d.ts +20 -0
  636. package/dist/types/forms/index.d.ts +19 -0
  637. package/dist/types/forms/security/SecondStepForm.d.ts +30 -0
  638. package/dist/types/forms/security/TwoStepVerificationCard.d.ts +83 -0
  639. package/dist/types/forms/security/securityRules.d.ts +24 -0
  640. package/dist/types/forms/serverProblemFields.d.ts +19 -0
  641. package/dist/types/forms/useFormikField.d.ts +11 -0
  642. package/dist/types/forms/validation.d.ts +251 -0
  643. package/dist/types/forms/validationMessages.d.ts +12 -0
  644. package/dist/types/forms.d.ts +2 -0
  645. package/dist/types/hookForm/FormCatalogField.d.ts +8 -0
  646. package/dist/types/hookForm/FormColorField.d.ts +8 -0
  647. package/dist/types/hookForm/FormNumberField.d.ts +8 -0
  648. package/dist/types/hookForm/FormProblemAlert.d.ts +7 -0
  649. package/dist/types/hookForm/FormSelectField.d.ts +8 -0
  650. package/dist/types/hookForm/FormTextField.d.ts +8 -0
  651. package/dist/types/hookForm/FormWizard.d.ts +22 -0
  652. package/dist/types/hookForm/SubmitButton.d.ts +21 -0
  653. package/dist/types/hookForm/applyServerProblem.d.ts +10 -0
  654. package/dist/types/hookForm/useHookFormField.d.ts +13 -0
  655. package/dist/types/i18next.d.ts +1 -0
  656. package/dist/types/identifiers.d.ts +2 -0
  657. package/dist/types/inbox/InboxLayout.d.ts +38 -0
  658. package/dist/types/inbox/MessageList.d.ts +52 -0
  659. package/dist/types/inbox/MessageView.d.ts +55 -0
  660. package/dist/types/inbox/inboxDates.d.ts +11 -0
  661. package/dist/types/index.d.ts +91 -0
  662. package/dist/types/inputs/CatalogInput.d.ts +45 -0
  663. package/dist/types/inputs/ColorInput.d.ts +30 -0
  664. package/dist/types/inputs/FieldFrame.d.ts +14 -0
  665. package/dist/types/inputs/FormSection.d.ts +29 -0
  666. package/dist/types/inputs/NumberInput.d.ts +38 -0
  667. package/dist/types/inputs/SelectInput.d.ts +38 -0
  668. package/dist/types/inputs/TextInput.d.ts +62 -0
  669. package/dist/types/inputs/WizardLayout.d.ts +34 -0
  670. package/dist/types/inputs/colorContrast.d.ts +18 -0
  671. package/dist/types/inputs/formLayoutContext.d.ts +3 -0
  672. package/dist/types/inputs/numberText.d.ts +25 -0
  673. package/dist/types/kanban/KanbanBoard.d.ts +88 -0
  674. package/dist/types/kanban/kanbanCards.d.ts +22 -0
  675. package/dist/types/kanban/kanbanMoves.d.ts +38 -0
  676. package/dist/types/kanban.d.ts +3 -0
  677. package/dist/types/laravel/csrfRetry.d.ts +21 -0
  678. package/dist/types/laravel.d.ts +1 -0
  679. package/dist/types/lastListUrl.d.ts +20 -0
  680. package/dist/types/locales/en.d.ts +788 -0
  681. package/dist/types/locales/es.d.ts +788 -0
  682. package/dist/types/maps/MapView.d.ts +41 -0
  683. package/dist/types/maps/mapMarkers.d.ts +23 -0
  684. package/dist/types/maps.d.ts +2 -0
  685. package/dist/types/money/money.d.ts +203 -0
  686. package/dist/types/money.d.ts +1 -0
  687. package/dist/types/navigation/appMenu.d.ts +92 -0
  688. package/dist/types/navigation/useMenuBadges.d.ts +16 -0
  689. package/dist/types/navigation.d.ts +22 -0
  690. package/dist/types/navigationTrail.d.ts +49 -0
  691. package/dist/types/next.d.ts +1 -0
  692. package/dist/types/observability/buildWatch.d.ts +28 -0
  693. package/dist/types/observability/logger.d.ts +19 -0
  694. package/dist/types/observability/publishedBuild.d.ts +35 -0
  695. package/dist/types/observability/usePublishedBuildWatch.d.ts +18 -0
  696. package/dist/types/passkeys.d.ts +1 -0
  697. package/dist/types/periodRanges.d.ts +32 -0
  698. package/dist/types/problems.d.ts +31 -0
  699. package/dist/types/pwa/InstallAppSetting.d.ts +7 -0
  700. package/dist/types/pwa/InstallInstructionsDialog.d.ts +20 -0
  701. package/dist/types/pwa/InstallPromptBanner.d.ts +16 -0
  702. package/dist/types/pwa/installInstructions.d.ts +52 -0
  703. package/dist/types/pwa/useInstallPrompt.d.ts +13 -0
  704. package/dist/types/react-hook-form.d.ts +12 -0
  705. package/dist/types/react-router.d.ts +2 -0
  706. package/dist/types/security/ActivityLog.d.ts +33 -0
  707. package/dist/types/security/RecoveryCodesDialog.d.ts +16 -0
  708. package/dist/types/security/SessionsCard.d.ts +24 -0
  709. package/dist/types/security/passkeys.d.ts +18 -0
  710. package/dist/types/table.d.ts +3 -0
  711. package/dist/types/theme/androidDevice.d.ts +11 -0
  712. package/dist/types/theme/appleTracking.d.ts +17 -0
  713. package/dist/types/theme/components/MuiAppBar.d.ts +13 -0
  714. package/dist/types/theme/components/MuiBackdrop.d.ts +11 -0
  715. package/dist/types/theme/components/MuiButton.d.ts +27 -0
  716. package/dist/types/theme/components/MuiButtonBase.d.ts +14 -0
  717. package/dist/types/theme/components/MuiChip.d.ts +29 -0
  718. package/dist/types/theme/components/MuiDataGrid.d.ts +45 -0
  719. package/dist/types/theme/components/MuiDialog.d.ts +9 -0
  720. package/dist/types/theme/components/MuiDrawer.d.ts +13 -0
  721. package/dist/types/theme/components/MuiMenuItem.d.ts +17 -0
  722. package/dist/types/theme/components/MuiTypography.d.ts +20 -0
  723. package/dist/types/theme/components/glassComponents.d.ts +8 -0
  724. package/dist/types/theme/components/minimalComponents.d.ts +22 -0
  725. package/dist/types/theme/components/paletteOf.d.ts +5 -0
  726. package/dist/types/theme/createToolkitTheme.d.ts +48 -0
  727. package/dist/types/theme/glassSurface.d.ts +247 -0
  728. package/dist/types/theme/glassToasterStyles.d.ts +7 -0
  729. package/dist/types/theme/mergeComponents.d.ts +15 -0
  730. package/dist/types/theme/stackcraftPalette.d.ts +142 -0
  731. package/dist/types/theme/toolkitComponents.d.ts +4 -0
  732. package/dist/types/timeline.d.ts +2 -0
  733. package/dist/types/toolkit/ComponentTexts.d.ts +11 -0
  734. package/dist/types/toolkit/ToolkitProvider.d.ts +47 -0
  735. package/dist/types/toolkit/browserNavigation.d.ts +27 -0
  736. package/dist/types/toolkit/componentTextsContext.d.ts +20 -0
  737. package/dist/types/toolkit/hashNavigation.d.ts +12 -0
  738. package/dist/types/toolkit/navigationPaths.d.ts +43 -0
  739. package/dist/types/toolkit/toolkitContext.d.ts +28 -0
  740. package/dist/types/toolkit/toolkitSettings.d.ts +113 -0
  741. package/dist/types/toolkit/useFormatters.d.ts +6 -0
  742. package/dist/types/toolkit/useToolkitTranslation.d.ts +11 -0
  743. package/dist/types/ui/actions/ActionsMenu.d.ts +20 -0
  744. package/dist/types/ui/actions/CopyButton.d.ts +15 -0
  745. package/dist/types/ui/actions/DownloadMenu.d.ts +55 -0
  746. package/dist/types/ui/actions/SecretField.d.ts +17 -0
  747. package/dist/types/ui/actions/SelectionActions.d.ts +39 -0
  748. package/dist/types/ui/filters/DateRangeFilter.d.ts +18 -0
  749. package/dist/types/ui/filters/PeriodRangeSelector.d.ts +28 -0
  750. package/dist/types/ui/filters/QuickFilters.d.ts +23 -0
  751. package/dist/types/ui/filters/SegmentedControl.d.ts +44 -0
  752. package/dist/types/ui/index.d.ts +33 -0
  753. package/dist/types/ui/labels/DictionaryText.d.ts +7 -0
  754. package/dist/types/ui/labels/StatusChip.d.ts +21 -0
  755. package/dist/types/ui/labels/Tag.d.ts +19 -0
  756. package/dist/types/ui/labels/tagOf.d.ts +13 -0
  757. package/dist/types/ui/layout/CollapsibleSection.d.ts +18 -0
  758. package/dist/types/ui/layout/ContentDialog.d.ts +15 -0
  759. package/dist/types/ui/layout/DefinitionList.d.ts +15 -0
  760. package/dist/types/ui/layout/DetailHeader.d.ts +15 -0
  761. package/dist/types/ui/layout/ErrorPage.d.ts +35 -0
  762. package/dist/types/ui/layout/FullPageLoader.d.ts +7 -0
  763. package/dist/types/ui/layout/GlassLensFilter.d.ts +1 -0
  764. package/dist/types/ui/layout/GlassPanel.d.ts +11 -0
  765. package/dist/types/ui/layout/PageHeader.d.ts +15 -0
  766. package/dist/types/ui/layout/PageHeading.d.ts +20 -0
  767. package/dist/types/ui/layout/ProfileHeader.d.ts +17 -0
  768. package/dist/types/ui/layout/ScrollableRow.d.ts +33 -0
  769. package/dist/types/ui/layout/SectionCard.d.ts +11 -0
  770. package/dist/types/ui/layout/appBarHeight.d.ts +13 -0
  771. package/dist/types/ui/metrics/BarList.d.ts +25 -0
  772. package/dist/types/ui/metrics/CalendarHeatmap.d.ts +34 -0
  773. package/dist/types/ui/metrics/ChartTooltip.d.ts +11 -0
  774. package/dist/types/ui/metrics/ColumnChart.d.ts +47 -0
  775. package/dist/types/ui/metrics/LineChart.d.ts +41 -0
  776. package/dist/types/ui/metrics/MetricCard.d.ts +39 -0
  777. package/dist/types/ui/metrics/TableToggle.d.ts +14 -0
  778. package/dist/types/ui/metrics/barListLabels.d.ts +17 -0
  779. package/dist/types/ui/metrics/chartParts.d.ts +112 -0
  780. package/dist/types/ui/metrics/heatmapScale.d.ts +45 -0
  781. package/dist/types/ui/navigation/BackButton.d.ts +13 -0
  782. package/dist/types/ui/navigation/ColorSchemeToggle.d.ts +13 -0
  783. package/dist/types/ui/navigation/DocumentTitle.d.ts +6 -0
  784. package/dist/types/ui/navigation/FontSizeToggle.d.ts +11 -0
  785. package/dist/types/ui/navigation/LanguageToggle.d.ts +13 -0
  786. package/dist/types/ui/navigation/PageBreadcrumbs.d.ts +12 -0
  787. package/dist/types/ui/navigation/colorMode.d.ts +18 -0
  788. package/dist/types/ui/navigation/fontSizeLevels.d.ts +25 -0
  789. package/dist/types/ui/navigation/useFontSize.d.ts +10 -0
  790. package/dist/types/ui/timeline/GroupedTimeline.d.ts +41 -0
  791. package/dist/types/ui/timeline/timelineDot.d.ts +19 -0
  792. package/dist/types/upload/FileDropzone.d.ts +36 -0
  793. package/dist/types/upload/fileRules.d.ts +51 -0
  794. package/dist/types/upload/uploadMachine.d.ts +23 -0
  795. package/dist/types/upload/uploadWithProgress.d.ts +16 -0
  796. package/dist/ui/actions/ActionsMenu.js +51 -0
  797. package/dist/ui/actions/ActionsMenu.js.map +1 -0
  798. package/dist/ui/actions/CopyButton.js +28 -0
  799. package/dist/ui/actions/CopyButton.js.map +1 -0
  800. package/dist/ui/actions/DownloadMenu.js +162 -0
  801. package/dist/ui/actions/DownloadMenu.js.map +1 -0
  802. package/dist/ui/actions/SecretField.js +61 -0
  803. package/dist/ui/actions/SecretField.js.map +1 -0
  804. package/dist/ui/actions/SelectionActions.js +142 -0
  805. package/dist/ui/actions/SelectionActions.js.map +1 -0
  806. package/dist/ui/filters/DateRangeFilter.js +87 -0
  807. package/dist/ui/filters/DateRangeFilter.js.map +1 -0
  808. package/dist/ui/filters/PeriodRangeSelector.js +56 -0
  809. package/dist/ui/filters/PeriodRangeSelector.js.map +1 -0
  810. package/dist/ui/filters/QuickFilters.js +91 -0
  811. package/dist/ui/filters/QuickFilters.js.map +1 -0
  812. package/dist/ui/filters/SegmentedControl.js +80 -0
  813. package/dist/ui/filters/SegmentedControl.js.map +1 -0
  814. package/dist/ui/labels/DictionaryText.js +11 -0
  815. package/dist/ui/labels/DictionaryText.js.map +1 -0
  816. package/dist/ui/labels/StatusChip.js +52 -0
  817. package/dist/ui/labels/StatusChip.js.map +1 -0
  818. package/dist/ui/labels/Tag.js +26 -0
  819. package/dist/ui/labels/Tag.js.map +1 -0
  820. package/dist/ui/labels/tagOf.js +7 -0
  821. package/dist/ui/labels/tagOf.js.map +1 -0
  822. package/dist/ui/layout/CollapsibleSection.js +52 -0
  823. package/dist/ui/layout/CollapsibleSection.js.map +1 -0
  824. package/dist/ui/layout/ContentDialog.js +97 -0
  825. package/dist/ui/layout/ContentDialog.js.map +1 -0
  826. package/dist/ui/layout/DefinitionList.js +30 -0
  827. package/dist/ui/layout/DefinitionList.js.map +1 -0
  828. package/dist/ui/layout/DetailHeader.js +27 -0
  829. package/dist/ui/layout/DetailHeader.js.map +1 -0
  830. package/dist/ui/layout/ErrorPage.js +54 -0
  831. package/dist/ui/layout/ErrorPage.js.map +1 -0
  832. package/dist/ui/layout/FullPageLoader.js +13 -0
  833. package/dist/ui/layout/FullPageLoader.js.map +1 -0
  834. package/dist/ui/layout/GlassLensFilter.js +53 -0
  835. package/dist/ui/layout/GlassLensFilter.js.map +1 -0
  836. package/dist/ui/layout/GlassPanel.js +18 -0
  837. package/dist/ui/layout/GlassPanel.js.map +1 -0
  838. package/dist/ui/layout/PageHeader.js +23 -0
  839. package/dist/ui/layout/PageHeader.js.map +1 -0
  840. package/dist/ui/layout/PageHeading.js +51 -0
  841. package/dist/ui/layout/PageHeading.js.map +1 -0
  842. package/dist/ui/layout/ProfileHeader.js +64 -0
  843. package/dist/ui/layout/ProfileHeader.js.map +1 -0
  844. package/dist/ui/layout/ScrollableRow.js +156 -0
  845. package/dist/ui/layout/ScrollableRow.js.map +1 -0
  846. package/dist/ui/layout/SectionCard.js +18 -0
  847. package/dist/ui/layout/SectionCard.js.map +1 -0
  848. package/dist/ui/layout/appBarHeight.js +42 -0
  849. package/dist/ui/layout/appBarHeight.js.map +1 -0
  850. package/dist/ui/metrics/BarList.js +94 -0
  851. package/dist/ui/metrics/BarList.js.map +1 -0
  852. package/dist/ui/metrics/CalendarHeatmap.js +136 -0
  853. package/dist/ui/metrics/CalendarHeatmap.js.map +1 -0
  854. package/dist/ui/metrics/ChartTooltip.js +16 -0
  855. package/dist/ui/metrics/ChartTooltip.js.map +1 -0
  856. package/dist/ui/metrics/ColumnChart.js +106 -0
  857. package/dist/ui/metrics/ColumnChart.js.map +1 -0
  858. package/dist/ui/metrics/LineChart.js +117 -0
  859. package/dist/ui/metrics/LineChart.js.map +1 -0
  860. package/dist/ui/metrics/MetricCard.js +97 -0
  861. package/dist/ui/metrics/MetricCard.js.map +1 -0
  862. package/dist/ui/metrics/TableToggle.js +15 -0
  863. package/dist/ui/metrics/TableToggle.js.map +1 -0
  864. package/dist/ui/metrics/barListLabels.js +9 -0
  865. package/dist/ui/metrics/barListLabels.js.map +1 -0
  866. package/dist/ui/metrics/chartParts.js +93 -0
  867. package/dist/ui/metrics/chartParts.js.map +1 -0
  868. package/dist/ui/metrics/heatmapScale.js +67 -0
  869. package/dist/ui/metrics/heatmapScale.js.map +1 -0
  870. package/dist/ui/navigation/BackButton.js +28 -0
  871. package/dist/ui/navigation/BackButton.js.map +1 -0
  872. package/dist/ui/navigation/ColorSchemeToggle.js +40 -0
  873. package/dist/ui/navigation/ColorSchemeToggle.js.map +1 -0
  874. package/dist/ui/navigation/DocumentTitle.js +11 -0
  875. package/dist/ui/navigation/DocumentTitle.js.map +1 -0
  876. package/dist/ui/navigation/FontSizeToggle.js +41 -0
  877. package/dist/ui/navigation/FontSizeToggle.js.map +1 -0
  878. package/dist/ui/navigation/LanguageToggle.js +48 -0
  879. package/dist/ui/navigation/LanguageToggle.js.map +1 -0
  880. package/dist/ui/navigation/PageBreadcrumbs.js +51 -0
  881. package/dist/ui/navigation/PageBreadcrumbs.js.map +1 -0
  882. package/dist/ui/navigation/colorMode.js +13 -0
  883. package/dist/ui/navigation/colorMode.js.map +1 -0
  884. package/dist/ui/navigation/fontSizeLevels.js +24 -0
  885. package/dist/ui/navigation/fontSizeLevels.js.map +1 -0
  886. package/dist/ui/navigation/useFontSize.js +44 -0
  887. package/dist/ui/navigation/useFontSize.js.map +1 -0
  888. package/dist/ui/timeline/GroupedTimeline.js +106 -0
  889. package/dist/ui/timeline/GroupedTimeline.js.map +1 -0
  890. package/dist/ui/timeline/timelineDot.js +20 -0
  891. package/dist/ui/timeline/timelineDot.js.map +1 -0
  892. package/dist/upload/FileDropzone.js +145 -0
  893. package/dist/upload/FileDropzone.js.map +1 -0
  894. package/dist/upload/fileRules.js +62 -0
  895. package/dist/upload/fileRules.js.map +1 -0
  896. package/dist/upload/uploadMachine.js +73 -0
  897. package/dist/upload/uploadMachine.js.map +1 -0
  898. package/dist/upload/uploadWithProgress.js +45 -0
  899. package/dist/upload/uploadWithProgress.js.map +1 -0
  900. package/package.json +311 -5
@@ -0,0 +1,48 @@
1
+ import { problemTitle } from "../problems.js";
2
+ import { toolkitSettings } from "../toolkit/toolkitSettings.js";
3
+ const OFFLINE_STATUS = 0;
4
+ function problemTitleOf(request) {
5
+ let problem = null;
6
+ try {
7
+ problem = JSON.parse(request.responseText);
8
+ } catch {
9
+ }
10
+ return problemTitle(problem, request.status);
11
+ }
12
+ function createPondServer({ url, fieldName, headers = {}, withCredentials = false }) {
13
+ return {
14
+ process: (pondFieldName, file, metadata, load, error, progress, abort) => {
15
+ const request = new XMLHttpRequest();
16
+ request.open("POST", url);
17
+ request.withCredentials = withCredentials;
18
+ for (const [headerName, headerValue] of Object.entries({ "Accept-Language": toolkitSettings().language, ...headers })) {
19
+ request.setRequestHeader(headerName, headerValue);
20
+ }
21
+ request.upload.onprogress = (event) => progress(event.lengthComputable, event.loaded, event.total);
22
+ request.onload = () => {
23
+ if (request.status >= 200 && request.status < 300) {
24
+ load(request.responseText || file.name);
25
+ return;
26
+ }
27
+ error(problemTitleOf(request));
28
+ };
29
+ request.onerror = () => error(problemTitle(null, OFFLINE_STATUS));
30
+ const formData = new FormData();
31
+ formData.append(fieldName ?? pondFieldName, file, file.name);
32
+ request.send(formData);
33
+ return {
34
+ abort: () => {
35
+ request.abort();
36
+ abort();
37
+ }
38
+ };
39
+ },
40
+ // sin nada que deshacer en el servidor: el «deshacer» de la tarjeta es local. Si el backend guarda el archivo,
41
+ // aquí iría su DELETE con el id que regresó
42
+ revert: (serverId, load) => load()
43
+ };
44
+ }
45
+ export {
46
+ createPondServer
47
+ };
48
+ //# sourceMappingURL=pondServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pondServer.js","sources":["../../src/filepond/pondServer.js"],"sourcesContent":["// El «server» de FilePond con lo de la casa: cada archivo se sube en su propio POST con su barra de avance dentro de su\n// tarjeta, el idioma activo en Accept-Language, el error RFC 9457 del backend escrito en la tarjeta y la ✕ que cancela la\n// petición de verdad (no solo la pantalla).\n//\n// Cuándo SÍ: archivos que valen cada uno por su cuenta (adjuntos sueltos, una galería).\n// Cuándo NO: el envío de siempre, «todos los archivos y los campos en UN solo envío»: ahí la zona solo elige y la\n// pantalla arma su FormData. OJO: aquí el backend ve UN archivo por petición; las reglas del lote completo (cuántos,\n// cuánto pesan juntos) ya no las puede revisar por petición.\n//\n// <FileDropzone multiple server={createPondServer({url: '/api/v1/adjuntos', headers: {Authorization: `Bearer ${token}`}})} />\n//\n// Funciones del navegador, sin React: function (regla de la casa).\nimport {problemTitle} from '@/problems.js';\nimport {toolkitSettings} from '@/toolkit/toolkitSettings.js';\n\n// status de «no hubo respuesta» para los textos del paquete (problems: offline)\nconst OFFLINE_STATUS = 0;\n\n/**\n * El título del problema RFC 9457 de una respuesta (o el genérico del paquete, ya traducido).\n *\n * @param {XMLHttpRequest} request\n * @returns {string}\n */\nfunction problemTitleOf(request) {\n let problem = null;\n try {\n problem = JSON.parse(request.responseText);\n } catch {\n // la respuesta no era JSON (un 502 del proxy en HTML): va el título genérico de su status\n }\n return problemTitle(problem, request.status);\n}\n\n/**\n * @param {object} options\n * @param {string} options.url a dónde va cada archivo\n * @param {string} [options.fieldName] el campo del archivo en el FormData; por omisión el name de la zona\n * @param {Record<string, string>} [options.headers] p. ej. Authorization\n * @param {boolean} [options.withCredentials] manda las cookies a otro dominio\n * @returns {{process: (...args: any[]) => any, revert: (...args: any[]) => any}} lo que recibe la prop server de FileDropzone\n */\nexport function createPondServer({url, fieldName, headers = {}, withCredentials = false}) {\n return {\n process: (pondFieldName, file, metadata, load, error, progress, abort) => {\n const request = new XMLHttpRequest();\n request.open('POST', url);\n request.withCredentials = withCredentials;\n for (const [headerName, headerValue] of Object.entries({'Accept-Language': toolkitSettings().language, ...headers})) {\n request.setRequestHeader(headerName, headerValue);\n }\n\n request.upload.onprogress = (event) => progress(event.lengthComputable, event.loaded, event.total);\n request.onload = () => {\n if (request.status >= 200 && request.status < 300) {\n // lo que responda el servidor es el id del archivo (FilePond lo guarda para deshacer)\n load(request.responseText || file.name);\n return;\n }\n error(problemTitleOf(request));\n };\n request.onerror = () => error(problemTitle(null, OFFLINE_STATUS));\n\n const formData = new FormData();\n formData.append(fieldName ?? pondFieldName, file, file.name);\n request.send(formData);\n\n // la ✕ de la tarjeta cancela la petición de verdad\n return {\n abort: () => {\n request.abort();\n abort();\n },\n };\n },\n // sin nada que deshacer en el servidor: el «deshacer» de la tarjeta es local. Si el backend guarda el archivo,\n // aquí iría su DELETE con el id que regresó\n revert: (serverId, load) => load(),\n };\n}\n"],"names":[],"mappings":";;AAgBA,MAAM,iBAAiB;AAQvB,SAAS,eAAe,SAAS;AAC7B,MAAI,UAAU;AACd,MAAI;AACA,cAAU,KAAK,MAAM,QAAQ,YAAY;AAAA,EAC7C,QAAQ;AAAA,EAER;AACA,SAAO,aAAa,SAAS,QAAQ,MAAM;AAC/C;AAUO,SAAS,iBAAiB,EAAC,KAAK,WAAW,UAAU,IAAI,kBAAkB,MAAK,GAAG;AACtF,SAAO;AAAA,IACH,SAAS,CAAC,eAAe,MAAM,UAAU,MAAM,OAAO,UAAU,UAAU;AACtE,YAAM,UAAU,IAAI,eAAc;AAClC,cAAQ,KAAK,QAAQ,GAAG;AACxB,cAAQ,kBAAkB;AAC1B,iBAAW,CAAC,YAAY,WAAW,KAAK,OAAO,QAAQ,EAAC,mBAAmB,gBAAe,EAAG,UAAU,GAAG,QAAO,CAAC,GAAG;AACjH,gBAAQ,iBAAiB,YAAY,WAAW;AAAA,MACpD;AAEA,cAAQ,OAAO,aAAa,CAAC,UAAU,SAAS,MAAM,kBAAkB,MAAM,QAAQ,MAAM,KAAK;AACjG,cAAQ,SAAS,MAAM;AACnB,YAAI,QAAQ,UAAU,OAAO,QAAQ,SAAS,KAAK;AAE/C,eAAK,QAAQ,gBAAgB,KAAK,IAAI;AACtC;AAAA,QACJ;AACA,cAAM,eAAe,OAAO,CAAC;AAAA,MACjC;AACA,cAAQ,UAAU,MAAM,MAAM,aAAa,MAAM,cAAc,CAAC;AAEhE,YAAM,WAAW,IAAI,SAAQ;AAC7B,eAAS,OAAO,aAAa,eAAe,MAAM,KAAK,IAAI;AAC3D,cAAQ,KAAK,QAAQ;AAGrB,aAAO;AAAA,QACH,OAAO,MAAM;AACT,kBAAQ,MAAK;AACb,gBAAK;AAAA,QACT;AAAA,MAChB;AAAA,IACQ;AAAA;AAAA;AAAA,IAGA,QAAQ,CAAC,UAAU,SAAS,KAAI;AAAA,EACxC;AACA;"}
@@ -0,0 +1,10 @@
1
+ import { default as default2 } from "./filepond/FileDropzone.js";
2
+ import { createPondServer } from "./filepond/pondServer.js";
3
+ import { FILE_ACCEPT_PRESETS, FILE_REJECTION } from "./upload/fileRules.js";
4
+ export {
5
+ FILE_ACCEPT_PRESETS,
6
+ FILE_REJECTION,
7
+ default2 as FileDropzone,
8
+ createPondServer
9
+ };
10
+ //# sourceMappingURL=filepond.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filepond.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
package/dist/files.js ADDED
@@ -0,0 +1,43 @@
1
+ const XLSX_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
2
+ const ZIP_END_RECORD_SIGNATURE = 101010256;
3
+ const ZIP_END_RECORD_LENGTH = 22;
4
+ const ZIP_END_RECORD_COMMENT_LENGTH_POSITION = 20;
5
+ function fileNameFromContentDisposition(contentDisposition, fallbackFileName) {
6
+ if (!contentDisposition) {
7
+ return fallbackFileName;
8
+ }
9
+ const encodedMatch = contentDisposition.match(/filename\*\s*=\s*UTF-8''([^;]+)/i);
10
+ if (encodedMatch) {
11
+ try {
12
+ return decodeURIComponent(encodedMatch[1].trim());
13
+ } catch {
14
+ }
15
+ }
16
+ const plainMatch = contentDisposition.match(/filename\s*=\s*"?([^";]+)"?/i);
17
+ return plainMatch ? plainMatch[1].trim() : fallbackFileName;
18
+ }
19
+ function saveBlob(blob, fileName) {
20
+ const objectUrl = URL.createObjectURL(blob);
21
+ const link = document.createElement("a");
22
+ link.href = objectUrl;
23
+ link.download = fileName;
24
+ link.rel = "noopener";
25
+ document.body.appendChild(link);
26
+ link.click();
27
+ link.remove();
28
+ setTimeout(() => URL.revokeObjectURL(objectUrl), 1e3);
29
+ }
30
+ async function isCompleteZip(blob) {
31
+ if (blob.size < ZIP_END_RECORD_LENGTH) {
32
+ return false;
33
+ }
34
+ const endRecord = new DataView(await blob.slice(blob.size - ZIP_END_RECORD_LENGTH).arrayBuffer());
35
+ return endRecord.getUint32(0, true) === ZIP_END_RECORD_SIGNATURE && endRecord.getUint16(ZIP_END_RECORD_COMMENT_LENGTH_POSITION, true) === 0;
36
+ }
37
+ export {
38
+ XLSX_CONTENT_TYPE,
39
+ fileNameFromContentDisposition,
40
+ isCompleteZip,
41
+ saveBlob
42
+ };
43
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sources":["../src/files.js"],"sourcesContent":["// Guardar en disco un archivo que llegó como Blob (CSV de renglones descartados, logs, salidas).\n//\n// La descarga va por el cliente HTTP y no por un <a href> directo a la API a propósito: así un 401 o un 409\n// llegan al manejador de siempre (sesión vencida, problema RFC 9457) en lugar de dejar un JSON crudo en una\n// pestaña nueva.\n//\n// Funciones puras, no renderizan: function (regla de la casa).\n\n/** Tipo de contenido de un Excel (XLSX): el mismo que manda el servidor (IngestionDictionary::XLSX_CONTENT_TYPE). */\nexport const XLSX_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n\n// Un XLSX es un zip, y un zip completo termina con su registro de cierre (End of Central Directory): 22 bytes que\n// empiezan con la firma «PK\\x05\\x06» y terminan con el largo del comentario del zip. El servidor arma sus Excel al vuelo\n// y sin comentario, así que ese registro son sus últimos 22 bytes; si la escritura falla a la mitad, nunca se escribe.\n// La firma se lee como entero de 4 bytes con el byte menos significativo primero (así la guarda el zip).\nconst ZIP_END_RECORD_SIGNATURE = 0x06054b50;\nconst ZIP_END_RECORD_LENGTH = 22;\nconst ZIP_END_RECORD_COMMENT_LENGTH_POSITION = 20;\n\n/**\n * Nombre de archivo del header Content-Disposition. Prefiere filename*=UTF-8'' (acentos) sobre filename=.\n *\n * @param {string|null|undefined} contentDisposition\n * @param {string} fallbackFileName si el header no trae nombre\n */\nexport function fileNameFromContentDisposition(contentDisposition, fallbackFileName) {\n if (!contentDisposition) {\n return fallbackFileName;\n }\n const encodedMatch = contentDisposition.match(/filename\\*\\s*=\\s*UTF-8''([^;]+)/i);\n if (encodedMatch) {\n try {\n return decodeURIComponent(encodedMatch[1].trim());\n } catch {\n // nombre mal codificado: seguimos con filename=\n }\n }\n const plainMatch = contentDisposition.match(/filename\\s*=\\s*\"?([^\";]+)\"?/i);\n return plainMatch ? plainMatch[1].trim() : fallbackFileName;\n}\n\n/**\n * Dispara la descarga de un Blob con el nombre dado.\n *\n * @param {Blob} blob\n * @param {string} fileName\n */\nexport function saveBlob(blob, fileName) {\n const objectUrl = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = objectUrl;\n link.download = fileName;\n link.rel = 'noopener';\n document.body.appendChild(link);\n link.click();\n link.remove();\n // OJO: liberamos la URL un momento después; revocarla en el mismo tick cancela la descarga en Safari\n setTimeout(() => URL.revokeObjectURL(objectUrl), 1000);\n}\n\n/**\n * ¿Llegó completo el zip (un XLSX)? Sí, si termina con su registro de cierre.\n *\n * Por qué hace falta: el servidor manda los Excel por partes y con 200 desde el primer pedazo. Si algo falla a media\n * escritura (p. ej. llegan más renglones de los que se contaron), ya no puede cambiar la respuesta a un error: el archivo\n * llega cortado y Excel no lo abre. Esta revisión es lo que evita guardarlo como si estuviera bien.\n *\n * OJO: supone un zip sin comentario, como los que escribe el servidor (zipstream sin comentario).\n *\n * @param {Blob} blob el archivo descargado\n * @returns {Promise<boolean>}\n */\nexport async function isCompleteZip(blob) {\n // guard clause: ni siquiera cabe el registro de cierre\n if (blob.size < ZIP_END_RECORD_LENGTH) {\n return false;\n }\n\n const endRecord = new DataView(await blob.slice(blob.size - ZIP_END_RECORD_LENGTH).arrayBuffer());\n return endRecord.getUint32(0, true) === ZIP_END_RECORD_SIGNATURE\n && endRecord.getUint16(ZIP_END_RECORD_COMMENT_LENGTH_POSITION, true) === 0;\n}\n"],"names":[],"mappings":"AASY,MAAC,oBAAoB;AAMjC,MAAM,2BAA2B;AACjC,MAAM,wBAAwB;AAC9B,MAAM,yCAAyC;AAQxC,SAAS,+BAA+B,oBAAoB,kBAAkB;AACjF,MAAI,CAAC,oBAAoB;AACrB,WAAO;AAAA,EACX;AACA,QAAM,eAAe,mBAAmB,MAAM,kCAAkC;AAChF,MAAI,cAAc;AACd,QAAI;AACA,aAAO,mBAAmB,aAAa,CAAC,EAAE,KAAI,CAAE;AAAA,IACpD,QAAQ;AAAA,IAER;AAAA,EACJ;AACA,QAAM,aAAa,mBAAmB,MAAM,8BAA8B;AAC1E,SAAO,aAAa,WAAW,CAAC,EAAE,KAAI,IAAK;AAC/C;AAQO,SAAS,SAAS,MAAM,UAAU;AACrC,QAAM,YAAY,IAAI,gBAAgB,IAAI;AAC1C,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,OAAO;AACZ,OAAK,WAAW;AAChB,OAAK,MAAM;AACX,WAAS,KAAK,YAAY,IAAI;AAC9B,OAAK,MAAK;AACV,OAAK,OAAM;AAEX,aAAW,MAAM,IAAI,gBAAgB,SAAS,GAAG,GAAI;AACzD;AAcO,eAAe,cAAc,MAAM;AAEtC,MAAI,KAAK,OAAO,uBAAuB;AACnC,WAAO;AAAA,EACX;AAEA,QAAM,YAAY,IAAI,SAAS,MAAM,KAAK,MAAM,KAAK,OAAO,qBAAqB,EAAE,aAAa;AAChG,SAAO,UAAU,UAAU,GAAG,IAAI,MAAM,4BACjC,UAAU,UAAU,wCAAwC,IAAI,MAAM;AACjF;"}
@@ -0,0 +1,205 @@
1
+ import { parseInstant, parsePlainDate } from "./dates.js";
2
+ import { intlLocaleOf, toolkitSettings } from "./toolkit/toolkitSettings.js";
3
+ const formatterCache = /* @__PURE__ */ new Map();
4
+ function formattersOf(settingsOf) {
5
+ function cachedFormatter(kind, options, createFormatter) {
6
+ const settings = settingsOf();
7
+ const locale = intlLocaleOf(settings.language, settings.languages);
8
+ const cacheKey = `${kind}|${locale}|${JSON.stringify(options)}`;
9
+ if (!formatterCache.has(cacheKey)) {
10
+ formatterCache.set(cacheKey, createFormatter(locale, options));
11
+ }
12
+ return formatterCache.get(cacheKey);
13
+ }
14
+ function formatNumber2(value, fallback = "—") {
15
+ if (value === null || value === void 0 || value === "" || Number.isNaN(Number(value))) {
16
+ return fallback;
17
+ }
18
+ const formatter = cachedFormatter(
19
+ "number",
20
+ { maximumFractionDigits: 0 },
21
+ (locale, options) => new Intl.NumberFormat(locale, options)
22
+ );
23
+ return formatter.format(Number(value));
24
+ }
25
+ function formatList2(items) {
26
+ const formatter = cachedFormatter(
27
+ "list",
28
+ { style: "long", type: "conjunction" },
29
+ (locale, options) => new Intl.ListFormat(locale, options)
30
+ );
31
+ return formatter.format(items);
32
+ }
33
+ function formatCurrency2(value, fallback = "—") {
34
+ if (value === null || value === void 0 || value === "" || Number.isNaN(Number(value))) {
35
+ return fallback;
36
+ }
37
+ const formatter = cachedFormatter("currency", {
38
+ style: "currency",
39
+ currency: settingsOf().currency,
40
+ currencyDisplay: "narrowSymbol",
41
+ minimumFractionDigits: 2,
42
+ maximumFractionDigits: 2
43
+ }, (locale, options) => new Intl.NumberFormat(locale, options));
44
+ return formatter.format(Number(value));
45
+ }
46
+ function formatFileSize2(bytes, fallback = "—") {
47
+ if (bytes === null || bytes === void 0 || Number.isNaN(Number(bytes))) {
48
+ return fallback;
49
+ }
50
+ const units = [["gigabyte", 1e9], ["megabyte", 1e6], ["kilobyte", 1e3]];
51
+ for (const [unit, unitBytes] of units) {
52
+ if (Number(bytes) >= unitBytes) {
53
+ const formatter2 = cachedFormatter(
54
+ `fileSize-${unit}`,
55
+ { style: "unit", unit, maximumFractionDigits: 1 },
56
+ (locale, options) => new Intl.NumberFormat(locale, options)
57
+ );
58
+ return formatter2.format(Number(bytes) / unitBytes);
59
+ }
60
+ }
61
+ const formatter = cachedFormatter(
62
+ "fileSize-byte",
63
+ { style: "unit", unit: "byte", unitDisplay: "long", maximumFractionDigits: 0 },
64
+ (locale, options) => new Intl.NumberFormat(locale, options)
65
+ );
66
+ return formatter.format(Number(bytes));
67
+ }
68
+ function formatPercent2(value, { fractionDigits = 2, isRatio = false, fallback = "—" } = {}) {
69
+ if (value === null || value === void 0 || Number.isNaN(Number(value))) {
70
+ return fallback;
71
+ }
72
+ const ratio = isRatio ? Number(value) : Number(value) / 100;
73
+ const formatter = cachedFormatter(
74
+ "percent",
75
+ { style: "percent", minimumFractionDigits: fractionDigits, maximumFractionDigits: fractionDigits },
76
+ (locale, options) => new Intl.NumberFormat(locale, options)
77
+ );
78
+ return formatter.format(ratio);
79
+ }
80
+ function formatDateTime2(value, { fallback = "—" } = {}) {
81
+ const instant = parseInstant(value);
82
+ if (!instant) {
83
+ return fallback;
84
+ }
85
+ const options = {
86
+ timeZone: settingsOf().timeZone,
87
+ day: "numeric",
88
+ month: "short",
89
+ year: "numeric",
90
+ hour: "2-digit",
91
+ minute: "2-digit",
92
+ hourCycle: "h23"
93
+ };
94
+ const formatter = cachedFormatter("dateTime", options, (locale, formatOptions) => new Intl.DateTimeFormat(locale, formatOptions));
95
+ return formatter.format(instant);
96
+ }
97
+ function formatDate2(value, { fallback = "—" } = {}) {
98
+ const calendarDate = parsePlainDate(value);
99
+ if (calendarDate) {
100
+ const formatter2 = cachedFormatter(
101
+ "plainDate",
102
+ { timeZone: "UTC", day: "numeric", month: "short", year: "numeric" },
103
+ (locale, options) => new Intl.DateTimeFormat(locale, options)
104
+ );
105
+ return formatter2.format(new Date(Date.UTC(calendarDate.year, calendarDate.month - 1, calendarDate.day, 12)));
106
+ }
107
+ const instant = parseInstant(value);
108
+ if (!instant) {
109
+ return fallback;
110
+ }
111
+ const formatter = cachedFormatter(
112
+ "date",
113
+ { timeZone: settingsOf().timeZone, day: "numeric", month: "short", year: "numeric" },
114
+ (locale, options) => new Intl.DateTimeFormat(locale, options)
115
+ );
116
+ return formatter.format(instant);
117
+ }
118
+ function formatTime2(value, { fallback = "—" } = {}) {
119
+ const instant = parseInstant(value);
120
+ if (!instant) {
121
+ return fallback;
122
+ }
123
+ const formatter = cachedFormatter(
124
+ "time",
125
+ { timeZone: settingsOf().timeZone, hour: "2-digit", minute: "2-digit", hourCycle: "h23" },
126
+ (locale, options) => new Intl.DateTimeFormat(locale, options)
127
+ );
128
+ return formatter.format(instant);
129
+ }
130
+ function formatMonthName2(year, month, { style = "long", capitalize = false } = {}) {
131
+ if (!Number.isInteger(Number(year)) || !Number.isInteger(Number(month))) {
132
+ return "—";
133
+ }
134
+ const formatter = cachedFormatter(
135
+ "monthName",
136
+ { timeZone: "UTC", month: style },
137
+ (locale, options) => new Intl.DateTimeFormat(locale, options)
138
+ );
139
+ const monthName = formatter.format(new Date(Date.UTC(Number(year), Number(month) - 1, 15, 12))).replace(/\.$/, "");
140
+ const label = `${monthName} ${year}`;
141
+ return capitalize ? label.charAt(0).toUpperCase() + label.slice(1) : label;
142
+ }
143
+ function formatMonthShortName2(month) {
144
+ const formatter = cachedFormatter(
145
+ "monthShortName",
146
+ { timeZone: "UTC", month: "short" },
147
+ (locale, options) => new Intl.DateTimeFormat(locale, options)
148
+ );
149
+ return formatter.format(new Date(Date.UTC(2024, Number(month) - 1, 15, 12))).replace(/\.$/, "");
150
+ }
151
+ function formatWeekdayShortName2(isoWeekday) {
152
+ const formatter = cachedFormatter(
153
+ "weekdayShortName",
154
+ { timeZone: "UTC", weekday: "short" },
155
+ (locale, options) => new Intl.DateTimeFormat(locale, options)
156
+ );
157
+ return formatter.format(new Date(Date.UTC(2024, 0, Number(isoWeekday), 12))).replace(/\.$/, "");
158
+ }
159
+ return Object.freeze({
160
+ formatNumber: formatNumber2,
161
+ formatList: formatList2,
162
+ formatCurrency: formatCurrency2,
163
+ formatFileSize: formatFileSize2,
164
+ formatPercent: formatPercent2,
165
+ formatDateTime: formatDateTime2,
166
+ formatDate: formatDate2,
167
+ formatTime: formatTime2,
168
+ formatMonthName: formatMonthName2,
169
+ formatMonthShortName: formatMonthShortName2,
170
+ formatWeekdayShortName: formatWeekdayShortName2
171
+ });
172
+ }
173
+ const currentFormatters = formattersOf(toolkitSettings);
174
+ const {
175
+ formatNumber,
176
+ formatList,
177
+ formatCurrency,
178
+ formatFileSize,
179
+ formatPercent,
180
+ formatDateTime,
181
+ formatDate,
182
+ formatTime,
183
+ formatMonthName,
184
+ formatMonthShortName,
185
+ formatWeekdayShortName
186
+ } = currentFormatters;
187
+ function dayOfPlainDate(value) {
188
+ return parsePlainDate(value)?.day ?? null;
189
+ }
190
+ export {
191
+ dayOfPlainDate,
192
+ formatCurrency,
193
+ formatDate,
194
+ formatDateTime,
195
+ formatFileSize,
196
+ formatList,
197
+ formatMonthName,
198
+ formatMonthShortName,
199
+ formatNumber,
200
+ formatPercent,
201
+ formatTime,
202
+ formatWeekdayShortName,
203
+ formattersOf
204
+ };
205
+ //# sourceMappingURL=formatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.js","sources":["../src/formatting.js"],"sourcesContent":["// Cómo se escriben números, porcentajes y fechas en pantalla.\n//\n// Siempre en el idioma activo (es-MX o en-US), las fechas en la zona y los montos en la moneda del proveedor\n// (ToolkitProvider). Cuando una hora necesita rótulo, la pantalla lo escribe con su propio texto («hora del centro de\n// México») y no con la abreviatura de Intl (GMT-6), que no le dice nada a la persona.\n//\n// Los Intl.* se memorizan por idioma: crear un formateador por celda en una tabla de cientos de filas se nota.\n//\n// Dos formas de usarlos:\n// - sueltos (formatDate, formatNumber…): con la configuración vigente, la del ToolkitProvider de la raíz. Para lo que no\n// es componente (un aviso, un Excel);\n// - dentro de un componente, useFormatters() (toolkit/useFormatters.js): con la del proveedor MÁS CERCANO. Con dos\n// proveedores (una parte de la app en otro idioma, o dos islas de React en una página vieja) cada parte escribe con\n// el suyo; con los sueltos, el último proveedor que se pintaba le cambiaba el idioma a todos.\n// Los dos salen de formattersOf: una sola versión de cada formato.\n//\n// Funciones puras, no renderizan: function (regla de la casa).\nimport {parseInstant, parsePlainDate} from '@/dates.js';\nimport {intlLocaleOf, toolkitSettings} from '@/toolkit/toolkitSettings.js';\n\nconst formatterCache = new Map();\n\n/**\n * Los formatos con la configuración que da settingsOf (se lee en cada llamada: si cambia el idioma, el siguiente formato ya\n * sale en el nuevo).\n *\n * @param {() => {language: string, languages?: Array<{code: string, locale?: string}>, timeZone: string, currency: string}} settingsOf\n */\nexport function formattersOf(settingsOf) {\n function cachedFormatter(kind, options, createFormatter) {\n const settings = settingsOf();\n const locale = intlLocaleOf(settings.language, settings.languages);\n const cacheKey = `${kind}|${locale}|${JSON.stringify(options)}`;\n if (!formatterCache.has(cacheKey)) {\n formatterCache.set(cacheKey, createFormatter(locale, options));\n }\n return formatterCache.get(cacheKey);\n }\n\n /**\n * Número con separador de miles: 321,540.\n *\n * @param {number|string|null|undefined} value\n * @param {string} [fallback] lo que se pinta si no hay dato\n * @returns {string}\n */\n function formatNumber(value, fallback = '—') {\n if (value === null || value === undefined || value === '' || Number.isNaN(Number(value))) {\n return fallback;\n }\n const formatter = cachedFormatter('number', {maximumFractionDigits: 0},\n (locale, options) => new Intl.NumberFormat(locale, options));\n return formatter.format(Number(value));\n }\n\n /**\n * Una lista en una frase, con su «y» antes de la última parte: «resumen, motivos de rechazo y descargas».\n *\n * @param {string[]} items las partes de la lista, ya traducidas\n * @returns {string} la frase; '' si la lista viene vacía\n */\n function formatList(items) {\n const formatter = cachedFormatter('list', {style: 'long', type: 'conjunction'},\n (locale, options) => new Intl.ListFormat(locale, options));\n return formatter.format(items);\n }\n\n\n /**\n * Monto en la moneda del proveedor con dos decimales: $2,567,951.00. Recibe el texto que manda el API (numeric de la base) o un número;\n * solo pinta, nunca suma (las sumas las hace el backend al centavo).\n *\n * @param {number|string|null|undefined} value\n * @param {string} [fallback] lo que se pinta si no hay dato\n * @returns {string}\n */\n function formatCurrency(value, fallback = '—') {\n if (value === null || value === undefined || value === '' || Number.isNaN(Number(value))) {\n return fallback;\n }\n const formatter = cachedFormatter('currency', {\n style: 'currency', currency: settingsOf().currency, currencyDisplay: 'narrowSymbol', minimumFractionDigits: 2, maximumFractionDigits: 2,\n }, (locale, options) => new Intl.NumberFormat(locale, options));\n return formatter.format(Number(value));\n }\n\n /**\n * Tamaño de un archivo en la unidad que se lee mejor: 950 B, 12.4 kB, 60.1 MB, 2.3 GB.\n *\n * @param {number|null|undefined} bytes\n * @param {string} [fallback] lo que se pinta si no hay dato\n * @returns {string}\n */\n function formatFileSize(bytes, fallback = '—') {\n if (bytes === null || bytes === undefined || Number.isNaN(Number(bytes))) {\n return fallback;\n }\n // unidades de Intl en base 1000, igual que las que enseña el navegador en sus descargas\n const units = [['gigabyte', 1e9], ['megabyte', 1e6], ['kilobyte', 1e3]];\n for (const [unit, unitBytes] of units) {\n if (Number(bytes) >= unitBytes) {\n const formatter = cachedFormatter(`fileSize-${unit}`, {style: 'unit', unit, maximumFractionDigits: 1},\n (locale, options) => new Intl.NumberFormat(locale, options));\n return formatter.format(Number(bytes) / unitBytes);\n }\n }\n // OJO: con la forma corta Intl no pone plural («74 byte», y «1 B» con el uno); la larga dice «74 bytes» y «1 byte»,\n // como lo enseña la Mac. Las demás unidades se quedan cortas (kB, MB): ahí la abreviatura sí se lee bien.\n const formatter = cachedFormatter('fileSize-byte', {style: 'unit', unit: 'byte', unitDisplay: 'long', maximumFractionDigits: 0},\n (locale, options) => new Intl.NumberFormat(locale, options));\n return formatter.format(Number(bytes));\n }\n\n /**\n * Porcentaje a partir de una proporción o de un número ya en porcentaje.\n *\n * @param {number|null|undefined} value 99.58 (con isRatio false) o 0.9958 (con isRatio true)\n * @param {{fractionDigits?: number, isRatio?: boolean, fallback?: string}} [options]\n * @returns {string}\n */\n function formatPercent(value, {fractionDigits = 2, isRatio = false, fallback = '—'} = {}) {\n if (value === null || value === undefined || Number.isNaN(Number(value))) {\n return fallback;\n }\n const ratio = isRatio ? Number(value) : Number(value) / 100;\n const formatter = cachedFormatter('percent', {style: 'percent', minimumFractionDigits: fractionDigits, maximumFractionDigits: fractionDigits},\n (locale, options) => new Intl.NumberFormat(locale, options));\n return formatter.format(ratio);\n }\n\n /**\n * Fecha y hora de un instante ISO en la zona del negocio.\n *\n * @param {string|null|undefined} value instante ISO con desfase\n * @param {{fallback?: string}} [options]\n * @returns {string}\n */\n function formatDateTime(value, {fallback = '—'} = {}) {\n const instant = parseInstant(value);\n if (!instant) {\n return fallback;\n }\n const options = {\n timeZone: settingsOf().timeZone,\n day: 'numeric', month: 'short', year: 'numeric', hour: '2-digit', minute: '2-digit', hourCycle: 'h23',\n };\n const formatter = cachedFormatter('dateTime', options, (locale, formatOptions) => new Intl.DateTimeFormat(locale, formatOptions));\n return formatter.format(instant);\n }\n\n /**\n * Solo la fecha. Acepta un instante ISO (se pasa a la zona del negocio) o una fecha de calendario \"2026-08-16\"\n * (se pinta tal cual, sin moverla de día).\n *\n * @param {string|null|undefined} value\n * @param {{fallback?: string}} [options]\n * @returns {string}\n */\n function formatDate(value, {fallback = '—'} = {}) {\n const calendarDate = parsePlainDate(value);\n if (calendarDate) {\n const formatter = cachedFormatter('plainDate', {timeZone: 'UTC', day: 'numeric', month: 'short', year: 'numeric'},\n (locale, options) => new Intl.DateTimeFormat(locale, options));\n // mediodía UTC y Intl en UTC: el mismo día en cualquier zona\n return formatter.format(new Date(Date.UTC(calendarDate.year, calendarDate.month - 1, calendarDate.day, 12)));\n }\n const instant = parseInstant(value);\n if (!instant) {\n return fallback;\n }\n const formatter = cachedFormatter('date', {timeZone: settingsOf().timeZone, day: 'numeric', month: 'short', year: 'numeric'},\n (locale, options) => new Intl.DateTimeFormat(locale, options));\n return formatter.format(instant);\n }\n\n /**\n * Solo la hora (24 h) de un instante ISO en la zona del negocio: \"07:00\".\n *\n * Existe aparte de formatDateTime porque las pantallas escriben \"16 ago 2026 · 07:00\" con punto medio, y Intl une\n * fecha y hora con coma: se arma formatDate + formatTime.\n *\n * @param {string|null|undefined} value instante ISO con desfase\n * @param {{fallback?: string}} [options]\n * @returns {string}\n */\n function formatTime(value, {fallback = '—'} = {}) {\n const instant = parseInstant(value);\n if (!instant) {\n return fallback;\n }\n const formatter = cachedFormatter('time', {timeZone: settingsOf().timeZone, hour: '2-digit', minute: '2-digit', hourCycle: 'h23'},\n (locale, options) => new Intl.DateTimeFormat(locale, options));\n return formatter.format(instant);\n }\n\n /**\n * Nombre de un mes de calendario: \"agosto 2026\" (long) o \"ago 2026\" (short).\n *\n * OJO: no se usa Intl con {month, year} juntos porque en español sale \"agosto de 2026\" y las pantallas dicen\n * \"agosto 2026\"; se pide solo el mes y se pega el año.\n *\n * @param {number} year\n * @param {number} month 1 a 12\n * @param {{style?: 'long'|'short', capitalize?: boolean}} [options] capitalize: \"Agosto 2026\" (fila de mes)\n */\n function formatMonthName(year, month, {style = 'long', capitalize = false} = {}) {\n if (!Number.isInteger(Number(year)) || !Number.isInteger(Number(month))) {\n return '—';\n }\n const formatter = cachedFormatter('monthName', {timeZone: 'UTC', month: style},\n (locale, options) => new Intl.DateTimeFormat(locale, options));\n // día 15 a mediodía UTC: el mismo mes en cualquier zona\n const monthName = formatter.format(new Date(Date.UTC(Number(year), Number(month) - 1, 15, 12))).replace(/\\.$/, '');\n const label = `${monthName} ${year}`;\n return capitalize ? label.charAt(0).toUpperCase() + label.slice(1) : label;\n }\n\n /**\n * Nombre corto de un mes sin año: \"ene\", \"feb\" (rótulos de columnas de calendario y rejillas por periodo).\n *\n * @param {number} month 1 a 12\n * @returns {string}\n */\n function formatMonthShortName(month) {\n const formatter = cachedFormatter('monthShortName', {timeZone: 'UTC', month: 'short'},\n (locale, options) => new Intl.DateTimeFormat(locale, options));\n // 2024 empieza en lunes y es bisiesto: da igual, solo se pide el mes a mediodía UTC\n return formatter.format(new Date(Date.UTC(2024, Number(month) - 1, 15, 12))).replace(/\\.$/, '');\n }\n\n /**\n * Nombre corto de un día de la semana: \"lun\", \"mié\" (renglones del calendario de actividad).\n *\n * @param {number} isoWeekday 1 = lunes ... 7 = domingo\n * @returns {string}\n */\n function formatWeekdayShortName(isoWeekday) {\n const formatter = cachedFormatter('weekdayShortName', {timeZone: 'UTC', weekday: 'short'},\n (locale, options) => new Intl.DateTimeFormat(locale, options));\n // el 1 de enero de 2024 fue lunes: lunes + (isoWeekday - 1) días\n return formatter.format(new Date(Date.UTC(2024, 0, Number(isoWeekday), 12))).replace(/\\.$/, '');\n }\n\n return Object.freeze({\n formatNumber, formatList, formatCurrency, formatFileSize, formatPercent, formatDateTime, formatDate, formatTime, formatMonthName,\n formatMonthShortName, formatWeekdayShortName,\n });\n}\n\n// los sueltos: con la configuración vigente (la del proveedor de la raíz)\nconst currentFormatters = formattersOf(toolkitSettings);\nexport const {\n formatNumber, formatList, formatCurrency, formatFileSize, formatPercent, formatDateTime, formatDate, formatTime, formatMonthName,\n formatMonthShortName, formatWeekdayShortName,\n} = currentFormatters;\n\n/**\n * Día del mes de una fecha de calendario (\"2026-08-16\" → 16), sin moverla de zona.\n *\n * @param {string|null|undefined} value\n * @returns {number|null}\n */\nexport function dayOfPlainDate(value) {\n return parsePlainDate(value)?.day ?? null;\n}\n"],"names":["formatNumber","formatList","formatCurrency","formatFileSize","formatter","formatPercent","formatDateTime","formatDate","formatTime","formatMonthName","formatMonthShortName","formatWeekdayShortName"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import CatalogInput from "../inputs/CatalogInput.js";
4
+ import { useFormikField } from "./useFormikField.js";
5
+ function FormCatalogField({ name, ...catalogInputProps }) {
6
+ const fieldProps = useFormikField(name);
7
+ return /* @__PURE__ */ jsx(CatalogInput, { ...catalogInputProps, ...fieldProps });
8
+ }
9
+ export {
10
+ FormCatalogField as default
11
+ };
12
+ //# sourceMappingURL=FormCatalogField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormCatalogField.js","sources":["../../src/forms/FormCatalogField.jsx"],"sourcesContent":["// Campo de catálogo de formik: CatalogInput (inputs/) conectado a su campo. Al formulario llega solo la clave.\n//\n// Genérico del paquete: function (regla de la casa).\nimport CatalogInput from '@/inputs/CatalogInput.jsx';\nimport {useFormikField} from '@/forms/useFormikField.js';\n\n/**\n * @param {{name: string} & Omit<Parameters<typeof import('@/inputs/CatalogInput.jsx').default>[0], 'name'|'value'|'onChange'|'onBlur'|'error'>} props las de CatalogInput (options, formatLabel, loading…), sin value / onChange / onBlur / error\n */\nexport default function FormCatalogField({name, ...catalogInputProps}) {\n const fieldProps = useFormikField(name);\n return <CatalogInput {...catalogInputProps} {...fieldProps} />;\n}\n"],"names":[],"mappings":";;;;AASA,SAAwB,iBAAiB,EAAC,MAAM,GAAG,qBAAoB;AACnE,QAAM,aAAa,eAAe,IAAI;AACtC,SAAO,oBAAC,cAAA,EAAc,GAAG,mBAAoB,GAAG,WAAA,CAAY;AAChE;"}
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import ColorInput from "../inputs/ColorInput.js";
4
+ import { useFormikField } from "./useFormikField.js";
5
+ function FormColorField({ name, ...colorInputProps }) {
6
+ const fieldProps = useFormikField(name);
7
+ return /* @__PURE__ */ jsx(ColorInput, { ...colorInputProps, ...fieldProps });
8
+ }
9
+ export {
10
+ FormColorField as default
11
+ };
12
+ //# sourceMappingURL=FormColorField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormColorField.js","sources":["../../src/forms/FormColorField.jsx"],"sourcesContent":["// Campo de color de formik: ColorInput (inputs/) conectado a su campo. Al formulario llega '#RRGGBB' en mayúsculas.\n//\n// Genérico del paquete: function (regla de la casa).\nimport ColorInput from '@/inputs/ColorInput.jsx';\nimport {useFormikField} from '@/forms/useFormikField.js';\n\n/**\n * @param {{name: string} & Omit<Parameters<typeof import('@/inputs/ColorInput.jsx').default>[0], 'name'|'value'|'onChange'|'onBlur'|'error'>} props las de ColorInput (checkContrast…), sin value / onChange / onBlur / error\n */\nexport default function FormColorField({name, ...colorInputProps}) {\n const fieldProps = useFormikField(name);\n return <ColorInput {...colorInputProps} {...fieldProps} />;\n}\n"],"names":[],"mappings":";;;;AASA,SAAwB,eAAe,EAAC,MAAM,GAAG,mBAAkB;AAC/D,QAAM,aAAa,eAAe,IAAI;AACtC,SAAO,oBAAC,YAAA,EAAY,GAAG,iBAAkB,GAAG,WAAA,CAAY;AAC5D;"}
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import NumberInput from "../inputs/NumberInput.js";
4
+ import { useFormikField } from "./useFormikField.js";
5
+ function FormNumberField({ name, ...numberInputProps }) {
6
+ const fieldProps = useFormikField(name);
7
+ return /* @__PURE__ */ jsx(NumberInput, { ...numberInputProps, ...fieldProps });
8
+ }
9
+ export {
10
+ FormNumberField as default
11
+ };
12
+ //# sourceMappingURL=FormNumberField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormNumberField.js","sources":["../../src/forms/FormNumberField.jsx"],"sourcesContent":["// Campo de número de formik: NumberInput (inputs/) conectado a su campo. Al formulario llega el texto limpio\n// ('2850000.50'), listo para Money.fromString o para el servidor.\n//\n// Genérico del paquete: function (regla de la casa).\nimport NumberInput from '@/inputs/NumberInput.jsx';\nimport {useFormikField} from '@/forms/useFormikField.js';\n\n/**\n * @param {{name: string} & Omit<Parameters<typeof import('@/inputs/NumberInput.jsx').default>[0], 'name'|'value'|'onChange'|'onBlur'|'error'>} props las de NumberInput (decimals, prefix, suffix, allowNegative…), sin value / onChange / onBlur / error\n */\nexport default function FormNumberField({name, ...numberInputProps}) {\n const fieldProps = useFormikField(name);\n return <NumberInput {...numberInputProps} {...fieldProps} />;\n}\n"],"names":[],"mappings":";;;;AAUA,SAAwB,gBAAgB,EAAC,MAAM,GAAG,oBAAmB;AACjE,QAAM,aAAa,eAAe,IAAI;AACtC,SAAO,oBAAC,aAAA,EAAa,GAAG,kBAAmB,GAAG,WAAA,CAAY;AAC9D;"}
@@ -0,0 +1,15 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useFormikContext } from "formik";
4
+ import Alert from "@mui/material/Alert";
5
+ function FormProblemAlert({ sx }) {
6
+ const { status } = useFormikContext();
7
+ if (!status) {
8
+ return null;
9
+ }
10
+ return /* @__PURE__ */ jsx(Alert, { severity: "error", role: "alert", sx, children: status });
11
+ }
12
+ export {
13
+ FormProblemAlert as default
14
+ };
15
+ //# sourceMappingURL=FormProblemAlert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormProblemAlert.js","sources":["../../src/forms/FormProblemAlert.jsx"],"sourcesContent":["// El aviso de arriba del formulario de formik: lo que el servidor dijo que no es de un campo (sin conexión, un 409, un 500)\n// o el error de un campo que el formulario no tiene. applyServerProblem lo deja en el status de formik; aquí se pinta.\n//\n// Sin mensaje no pinta nada ni ocupa lugar.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useFormikContext} from 'formik';\nimport Alert from '@mui/material/Alert';\n\n/**\n * @param {{sx?: object}} props\n */\nexport default function FormProblemAlert({sx}) {\n const {status} = useFormikContext();\n\n // guard clause: sin aviso del servidor\n if (!status) {\n return null;\n }\n return <Alert severity=\"error\" role=\"alert\" sx={sx}>{status}</Alert>;\n}\n"],"names":[],"mappings":";;;;AAYA,SAAwB,iBAAiB,EAAC,MAAK;AAC3C,QAAM,EAAC,OAAA,IAAU,iBAAA;AAGjB,MAAI,CAAC,QAAQ;AACT,WAAO;AAAA,EACX;AACA,6BAAQ,OAAA,EAAM,UAAS,SAAQ,MAAK,SAAQ,IAAS,UAAA,QAAO;AAChE;"}
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import SelectInput from "../inputs/SelectInput.js";
4
+ import { useFormikField } from "./useFormikField.js";
5
+ function FormSelectField({ name, ...selectInputProps }) {
6
+ const fieldProps = useFormikField(name);
7
+ return /* @__PURE__ */ jsx(SelectInput, { ...selectInputProps, ...fieldProps });
8
+ }
9
+ export {
10
+ FormSelectField as default
11
+ };
12
+ //# sourceMappingURL=FormSelectField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormSelectField.js","sources":["../../src/forms/FormSelectField.jsx"],"sourcesContent":["// Lista desplegable de formik: SelectInput (inputs/) conectada a su campo.\n//\n// Genérico del paquete: function (regla de la casa).\nimport SelectInput from '@/inputs/SelectInput.jsx';\nimport {useFormikField} from '@/forms/useFormikField.js';\n\n/**\n * @param {{name: string} & Omit<Parameters<typeof import('@/inputs/SelectInput.jsx').default>[0], 'name'|'value'|'onChange'|'onBlur'|'error'>} props las de SelectInput, sin value / onChange / onBlur / error\n */\nexport default function FormSelectField({name, ...selectInputProps}) {\n const fieldProps = useFormikField(name);\n return <SelectInput {...selectInputProps} {...fieldProps} />;\n}\n"],"names":[],"mappings":";;;;AASA,SAAwB,gBAAgB,EAAC,MAAM,GAAG,oBAAmB;AACjE,QAAM,aAAa,eAAe,IAAI;AACtC,SAAO,oBAAC,aAAA,EAAa,GAAG,kBAAmB,GAAG,WAAA,CAAY;AAC9D;"}
@@ -0,0 +1,23 @@
1
+ "use client";
2
+ import { useEffect } from "react";
3
+ import { useFormikContext } from "formik";
4
+ import { splitServerFieldErrors } from "./serverProblemFields.js";
5
+ import { fieldErrorsOf } from "../problems.js";
6
+ function FormServerProblem({ error }) {
7
+ const { setFieldError, setFieldTouched, values } = useFormikContext();
8
+ useEffect(() => {
9
+ if (!error) {
10
+ return;
11
+ }
12
+ const { fieldErrors } = splitServerFieldErrors(fieldErrorsOf(error.problem), Object.keys(values));
13
+ for (const [fieldName, message] of Object.entries(fieldErrors)) {
14
+ setFieldTouched(fieldName, true, false);
15
+ setFieldError(fieldName, message);
16
+ }
17
+ }, [error]);
18
+ return null;
19
+ }
20
+ export {
21
+ FormServerProblem as default
22
+ };
23
+ //# sourceMappingURL=FormServerProblem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormServerProblem.js","sources":["../../src/forms/FormServerProblem.jsx"],"sourcesContent":["// Puente entre una máquina de estados y Formik: pinta en sus campos los errores 422 que trae el error del servidor.\n//\n// Por qué existe: con XState el envío lo hace la máquina (no el onSubmit de Formik), así que el error llega en el\n// contexto de la máquina y no en los helpers de Formik. Este componente vive DENTRO del <Formik> y, cada vez que\n// llega un error nuevo, lo reparte en los campos que existen. El aviso de arriba lo pinta la pantalla desde el estado\n// de la máquina (formLevelMessageOf).\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useEffect} from 'react';\nimport {useFormikContext} from 'formik';\n\nimport {splitServerFieldErrors} from '@/forms/serverProblemFields.js';\nimport {fieldErrorsOf} from '@/problems.js';\n\n/**\n * @param {{error: (Error & {problem?: object})|null}} props el error del contexto de la máquina (null = sin error)\n */\nexport default function FormServerProblem({error}) {\n const {setFieldError, setFieldTouched, values} = useFormikContext();\n\n useEffect(() => {\n // guard clause: sin error nuevo no hay nada que pintar\n if (!error) {\n return;\n }\n const {fieldErrors} = splitServerFieldErrors(fieldErrorsOf(error.problem), Object.keys(values));\n for (const [fieldName, message] of Object.entries(fieldErrors)) {\n // tocado primero y sin validar: si no, la validación de yup borraría el error del servidor al instante\n setFieldTouched(fieldName, true, false);\n setFieldError(fieldName, message);\n }\n // OJO: solo cuando cambia el error; values cambia con cada tecla y no debe volver a pintar el error viejo\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [error]);\n\n return null;\n}\n"],"names":[],"mappings":";;;;;AAiBA,SAAwB,kBAAkB,EAAC,SAAQ;AAC/C,QAAM,EAAC,eAAe,iBAAiB,OAAA,IAAU,iBAAA;AAEjD,YAAU,MAAM;AAEZ,QAAI,CAAC,OAAO;AACR;AAAA,IACJ;AACA,UAAM,EAAC,YAAA,IAAe,uBAAuB,cAAc,MAAM,OAAO,GAAG,OAAO,KAAK,MAAM,CAAC;AAC9F,eAAW,CAAC,WAAW,OAAO,KAAK,OAAO,QAAQ,WAAW,GAAG;AAE5D,sBAAgB,WAAW,MAAM,KAAK;AACtC,oBAAc,WAAW,OAAO;AAAA,IACpC;AAAA,EAGJ,GAAG,CAAC,KAAK,CAAC;AAEV,SAAO;AACX;"}
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import TextInput from "../inputs/TextInput.js";
4
+ import { useFormikField } from "./useFormikField.js";
5
+ function FormTextField({ name, ...textInputProps }) {
6
+ const fieldProps = useFormikField(name);
7
+ return /* @__PURE__ */ jsx(TextInput, { ...textInputProps, ...fieldProps });
8
+ }
9
+ export {
10
+ FormTextField as default
11
+ };
12
+ //# sourceMappingURL=FormTextField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormTextField.js","sources":["../../src/forms/FormTextField.jsx"],"sourcesContent":["// Campo de texto de formik: TextInput (inputs/) conectado a su campo. Lo visual y sus reglas (etiqueta arriba, ojo de las\n// contraseñas, mayúsculas, normalizar al salir, el error en el idioma activo) viven en TextInput.\n//\n// Genérico del paquete: function (regla de la casa).\nimport TextInput from '@/inputs/TextInput.jsx';\nimport {useFormikField} from '@/forms/useFormikField.js';\n\n/**\n * @param {{name: string} & Omit<Parameters<typeof import('@/inputs/TextInput.jsx').default>[0], 'name'|'value'|'onChange'|'onBlur'|'error'>} props las de TextInput, sin value / onChange / onBlur / error\n */\nexport default function FormTextField({name, ...textInputProps}) {\n const fieldProps = useFormikField(name);\n return <TextInput {...textInputProps} {...fieldProps} />;\n}\n"],"names":[],"mappings":";;;;AAUA,SAAwB,cAAc,EAAC,MAAM,GAAG,kBAAiB;AAC7D,QAAM,aAAa,eAAe,IAAI;AACtC,SAAO,oBAAC,WAAA,EAAW,GAAG,gBAAiB,GAAG,WAAA,CAAY;AAC1D;"}
@@ -0,0 +1,63 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useState, useRef, useEffect } from "react";
4
+ import { useFormikContext, getIn } from "formik";
5
+ import FormProblemAlert from "./FormProblemAlert.js";
6
+ import SubmitButton from "./SubmitButton.js";
7
+ import WizardLayout from "../inputs/WizardLayout.js";
8
+ function firstStepWithErrorOf(steps, errors) {
9
+ return steps.findIndex((step) => (step.fields ?? []).some((field) => getIn(errors, field)));
10
+ }
11
+ function FormWizard({ steps, submitLabel, texts }) {
12
+ const { validateForm, setFieldTouched, setFieldValue, initialValues, errors, isSubmitting } = useFormikContext();
13
+ const [activeIndex, setActiveIndex] = useState(0);
14
+ const [skippedKeys, setSkippedKeys] = useState(() => /* @__PURE__ */ new Set());
15
+ const wasSubmitting = useRef(false);
16
+ const activeStep = steps[activeIndex];
17
+ useEffect(() => {
18
+ if (wasSubmitting.current && !isSubmitting) {
19
+ const errorStepIndex = firstStepWithErrorOf(steps, errors);
20
+ if (errorStepIndex >= 0) {
21
+ setActiveIndex(errorStepIndex);
22
+ }
23
+ }
24
+ wasSubmitting.current = isSubmitting;
25
+ }, [isSubmitting, errors, steps]);
26
+ const goNext = async () => {
27
+ const stepFields = activeStep.fields ?? [];
28
+ const formErrors = await validateForm();
29
+ stepFields.forEach((field) => setFieldTouched(field, true, false));
30
+ if (stepFields.some((field) => getIn(formErrors, field))) {
31
+ return;
32
+ }
33
+ setSkippedKeys((currentKeys) => new Set([...currentKeys].filter((key) => key !== activeStep.key)));
34
+ setActiveIndex((currentIndex) => currentIndex + 1);
35
+ };
36
+ const skipStep = () => {
37
+ for (const field of activeStep.fields ?? []) {
38
+ setFieldValue(field, getIn(initialValues, field), false);
39
+ setFieldTouched(field, false, false);
40
+ }
41
+ setSkippedKeys((currentKeys) => /* @__PURE__ */ new Set([...currentKeys, activeStep.key]));
42
+ setActiveIndex((currentIndex) => currentIndex + 1);
43
+ };
44
+ return /* @__PURE__ */ jsx(
45
+ WizardLayout,
46
+ {
47
+ steps,
48
+ activeIndex,
49
+ skippedKeys,
50
+ isSubmitting,
51
+ onBack: () => setActiveIndex((currentIndex) => currentIndex - 1),
52
+ onNext: goNext,
53
+ onSkip: skipStep,
54
+ submitButton: /* @__PURE__ */ jsx(SubmitButton, { children: submitLabel }),
55
+ problemAlert: /* @__PURE__ */ jsx(FormProblemAlert, {}),
56
+ texts
57
+ }
58
+ );
59
+ }
60
+ export {
61
+ FormWizard as default
62
+ };
63
+ //# sourceMappingURL=FormWizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormWizard.js","sources":["../../src/forms/FormWizard.jsx"],"sourcesContent":["// Formulario por pasos (wizard) con formik: un solo formulario partido en pasos, con pasos opcionales que se pueden omitir.\n//\n// Cómo se porta, para que la pantalla solo declare sus pasos:\n// - «Siguiente» revisa SOLO los campos del paso (fields) y no avanza si alguno tiene error; los marca como tocados para\n// que se vea por qué;\n// - «Omitir este paso» (solo en los opcionales) regresa sus campos a como empezaron: omitir es no dar ese dato, no dejar\n// lo que se escribió a medias;\n// - el último paso envía TODO el formulario (el esquema de yup completo vale para todos los pasos);\n// - si el envío falla por un campo de un paso anterior (yup o el 422 del servidor con applyServerProblem), el wizard\n// regresa solo a ese paso: un error que no se ve no se puede corregir.\n//\n// Va DENTRO de <Formik> y <Form>:\n// <Formik initialValues={…} validationSchema={…} onSubmit={…}>\n// <Form noValidate>\n// <FormWizard submitLabel=\"Enviar solicitud\" steps={[\n// {key: 'datos', label: 'Sus datos', fields: ['name', 'email'], content: <>…campos…</>},\n// {key: 'aval', label: 'Aval', optional: true, fields: ['guarantor'], content: <>…</>},\n// ]} />\n// </Form>\n// </Formik>\n//\n// Lo que se ve vive en WizardLayout (inputs/), el mismo del FormWizard de react-hook-form. Los textos («Siguiente»,\n// «Anterior»…) se cambian con `texts`: {wizard: {next: 'Continuar'}}.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useEffect, useRef, useState} from 'react';\nimport {getIn, useFormikContext} from 'formik';\n\nimport FormProblemAlert from '@/forms/FormProblemAlert.jsx';\nimport SubmitButton from '@/forms/SubmitButton.jsx';\nimport WizardLayout from '@/inputs/WizardLayout.jsx';\n\n/**\n * El primer paso que tiene un campo con error; -1 si ninguno.\n *\n * @param {Array<{fields?: string[]}>} steps\n * @param {object} errors los de formik\n * @returns {number}\n */\nfunction firstStepWithErrorOf(steps, errors) {\n return steps.findIndex((step) => (step.fields ?? []).some((field) => getIn(errors, field)));\n}\n\n/**\n * @param {object} props\n * @param {Object[]} props.steps en orden\n * @param {string} props.steps[].key\n * @param {string} props.steps[].label ya traducido\n * @param {string[]} [props.steps[].fields] los campos del paso (los que revisa «Siguiente»)\n * @param {boolean} [props.steps[].optional] se puede omitir\n * @param {import('react').ReactNode} props.steps[].content los campos del paso\n * @param {string} props.submitLabel ya traducido: el botón del último paso\n * @param {object} [props.texts] los textos que cambian, con la forma de `common`: {wizard: {next, back, skip, optional, skipped, stepOf}}\n */\nexport default function FormWizard({steps, submitLabel, texts}) {\n const {validateForm, setFieldTouched, setFieldValue, initialValues, errors, isSubmitting} = useFormikContext();\n const [activeIndex, setActiveIndex] = useState(0);\n const [skippedKeys, setSkippedKeys] = useState(() => new Set());\n const wasSubmitting = useRef(false);\n const activeStep = steps[activeIndex];\n\n // al terminar un envío fallido, regresa al paso con el primer error (solo en ese momento: escribir en otro paso no\n // debe jalar a la persona de regreso)\n useEffect(() => {\n if (wasSubmitting.current && !isSubmitting) {\n const errorStepIndex = firstStepWithErrorOf(steps, errors);\n if (errorStepIndex >= 0) {\n setActiveIndex(errorStepIndex);\n }\n }\n wasSubmitting.current = isSubmitting;\n }, [isSubmitting, errors, steps]);\n\n const goNext = async () => {\n const stepFields = activeStep.fields ?? [];\n const formErrors = await validateForm();\n stepFields.forEach((field) => setFieldTouched(field, true, false));\n // guard clause: el paso tiene errores; se queda para que se corrijan\n if (stepFields.some((field) => getIn(formErrors, field))) {\n return;\n }\n setSkippedKeys((currentKeys) => new Set([...currentKeys].filter((key) => key !== activeStep.key)));\n setActiveIndex((currentIndex) => currentIndex + 1);\n };\n\n const skipStep = () => {\n for (const field of activeStep.fields ?? []) {\n setFieldValue(field, getIn(initialValues, field), false);\n setFieldTouched(field, false, false);\n }\n setSkippedKeys((currentKeys) => new Set([...currentKeys, activeStep.key]));\n setActiveIndex((currentIndex) => currentIndex + 1);\n };\n\n return (\n <WizardLayout steps={steps} activeIndex={activeIndex} skippedKeys={skippedKeys} isSubmitting={isSubmitting}\n onBack={() => setActiveIndex((currentIndex) => currentIndex - 1)} onNext={goNext} onSkip={skipStep}\n submitButton={<SubmitButton>{submitLabel}</SubmitButton>} problemAlert={<FormProblemAlert />} texts={texts} />\n );\n}\n"],"names":[],"mappings":";;;;;;;AAuCA,SAAS,qBAAqB,OAAO,QAAQ;AACzC,SAAO,MAAM,UAAU,CAAC,UAAU,KAAK,UAAU,CAAA,GAAI,KAAK,CAAC,UAAU,MAAM,QAAQ,KAAK,CAAC,CAAC;AAC9F;AAaA,SAAwB,WAAW,EAAC,OAAO,aAAa,SAAQ;AAC5D,QAAM,EAAC,cAAc,iBAAiB,eAAe,eAAe,QAAQ,aAAA,IAAgB,iBAAA;AAC5F,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,CAAC;AAChD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,MAAM,oBAAI,KAAK;AAC9D,QAAM,gBAAgB,OAAO,KAAK;AAClC,QAAM,aAAa,MAAM,WAAW;AAIpC,YAAU,MAAM;AACZ,QAAI,cAAc,WAAW,CAAC,cAAc;AACxC,YAAM,iBAAiB,qBAAqB,OAAO,MAAM;AACzD,UAAI,kBAAkB,GAAG;AACrB,uBAAe,cAAc;AAAA,MACjC;AAAA,IACJ;AACA,kBAAc,UAAU;AAAA,EAC5B,GAAG,CAAC,cAAc,QAAQ,KAAK,CAAC;AAEhC,QAAM,SAAS,YAAY;AACvB,UAAM,aAAa,WAAW,UAAU,CAAA;AACxC,UAAM,aAAa,MAAM,aAAA;AACzB,eAAW,QAAQ,CAAC,UAAU,gBAAgB,OAAO,MAAM,KAAK,CAAC;AAEjE,QAAI,WAAW,KAAK,CAAC,UAAU,MAAM,YAAY,KAAK,CAAC,GAAG;AACtD;AAAA,IACJ;AACA,mBAAe,CAAC,gBAAgB,IAAI,IAAI,CAAC,GAAG,WAAW,EAAE,OAAO,CAAC,QAAQ,QAAQ,WAAW,GAAG,CAAC,CAAC;AACjG,mBAAe,CAAC,iBAAiB,eAAe,CAAC;AAAA,EACrD;AAEA,QAAM,WAAW,MAAM;AACnB,eAAW,SAAS,WAAW,UAAU,CAAA,GAAI;AACzC,oBAAc,OAAO,MAAM,eAAe,KAAK,GAAG,KAAK;AACvD,sBAAgB,OAAO,OAAO,KAAK;AAAA,IACvC;AACA,mBAAe,CAAC,gBAAgB,oBAAI,IAAI,CAAC,GAAG,aAAa,WAAW,GAAG,CAAC,CAAC;AACzE,mBAAe,CAAC,iBAAiB,eAAe,CAAC;AAAA,EACrD;AAEA,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MAAa;AAAA,MAAc;AAAA,MAA0B;AAAA,MAA0B;AAAA,MAClE,QAAQ,MAAM,eAAe,CAAC,iBAAiB,eAAe,CAAC;AAAA,MAAG,QAAQ;AAAA,MAAQ,QAAQ;AAAA,MAC1F,cAAc,oBAAC,cAAA,EAAc,UAAA,YAAA,CAAY;AAAA,MAAiB,kCAAe,kBAAA,EAAiB;AAAA,MAAI;AAAA,IAAA;AAAA,EAAA;AAEpH;"}
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useFormikContext } from "formik";
4
+ import Button from "@mui/material/Button";
5
+ import CircularProgress from "@mui/material/CircularProgress";
6
+ function SubmitButton({ children, disabled, isPending, ...buttonProps }) {
7
+ const { isSubmitting } = useFormikContext();
8
+ const isBusy = Boolean(isPending ?? isSubmitting);
9
+ return /* @__PURE__ */ jsx(Button, { type: "submit", variant: "contained", size: "large", disabled: disabled || isBusy, "aria-busy": isBusy, ...buttonProps, children: isBusy ? /* @__PURE__ */ jsx(CircularProgress, { size: 22, color: "inherit" }) : children });
10
+ }
11
+ export {
12
+ SubmitButton as default
13
+ };
14
+ //# sourceMappingURL=SubmitButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubmitButton.js","sources":["../../src/forms/SubmitButton.jsx"],"sourcesContent":["// Botón de enviar de un formulario de Formik.\n//\n// Se deshabilita mientras el envío está en curso y muestra su propio indicador: un doble clic en un botón que no se\n// bloquea manda dos peticiones (dos intentos de login contra el límite por IP).\n//\n// isPending: cuando el envío lo hace una máquina de estados (XState) y no el onSubmit async de Formik, la pantalla\n// pasa aquí si la máquina está en su estado de envío. La máquina además IGNORA un segundo envío en ese estado: el botón\n// deshabilitado es la cortesía, la máquina es la garantía.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useFormikContext} from 'formik';\nimport Button from '@mui/material/Button';\nimport CircularProgress from '@mui/material/CircularProgress';\n\n/**\n * @param {{children: import('react').ReactNode, disabled?: boolean, isPending?: boolean} & Omit<import('@mui/material/Button').ButtonProps, 'type'|'children'>} props\n * lo demás va al Button de MUI (sx, size, fullWidth…)\n */\nexport default function SubmitButton({children, disabled, isPending, ...buttonProps}) {\n const {isSubmitting} = useFormikContext();\n const isBusy = Boolean(isPending ?? isSubmitting);\n\n return (\n <Button type=\"submit\" variant=\"contained\" size=\"large\" disabled={disabled || isBusy} aria-busy={isBusy} {...buttonProps}>\n {isBusy ? <CircularProgress size={22} color=\"inherit\" /> : children}\n </Button>\n );\n}\n"],"names":[],"mappings":";;;;;AAkBA,SAAwB,aAAa,EAAC,UAAU,UAAU,WAAW,GAAG,eAAc;AAClF,QAAM,EAAC,aAAA,IAAgB,iBAAA;AACvB,QAAM,SAAS,QAAQ,aAAa,YAAY;AAEhD,SACI,oBAAC,UAAO,MAAK,UAAS,SAAQ,aAAY,MAAK,SAAQ,UAAU,YAAY,QAAQ,aAAW,QAAS,GAAG,aACvG,UAAA,SAAS,oBAAC,kBAAA,EAAiB,MAAM,IAAI,OAAM,WAAU,IAAK,SAAA,CAC/D;AAER;"}