@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,30 @@
1
+ const REDIRECT_PARAM = "redirect";
2
+ function safeInternalPath(candidatePath) {
3
+ if (typeof candidatePath !== "string" || candidatePath.length === 0 || candidatePath.length > 2e3) {
4
+ return null;
5
+ }
6
+ if (!candidatePath.startsWith("/") || candidatePath.startsWith("//") || candidatePath.startsWith("/\\")) {
7
+ return null;
8
+ }
9
+ if (/[\u0000-\u001f\u007f]/.test(candidatePath)) {
10
+ return null;
11
+ }
12
+ return candidatePath;
13
+ }
14
+ function readRedirectParam(search) {
15
+ return safeInternalPath(new URLSearchParams(search).get(REDIRECT_PARAM));
16
+ }
17
+ function withRedirect(entryPath, targetPath) {
18
+ const safeTarget = safeInternalPath(targetPath);
19
+ if (!safeTarget || safeTarget === "/" || safeTarget.startsWith(entryPath)) {
20
+ return entryPath;
21
+ }
22
+ return `${entryPath}?${new URLSearchParams({ [REDIRECT_PARAM]: safeTarget })}`;
23
+ }
24
+ export {
25
+ REDIRECT_PARAM,
26
+ readRedirectParam,
27
+ safeInternalPath,
28
+ withRedirect
29
+ };
30
+ //# sourceMappingURL=navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.js","sources":["../src/navigation.js"],"sourcesContent":["// A dónde regresar después de iniciar sesión.\n//\n// Si la sesión vence a media consulta, la persona vuelve a /iniciar-sesion?redirect=/pedidos?estado=pendiente\n// y, al entrar, aterriza donde estaba.\n//\n// IMPORTANTE: el destino viene de la URL, así que cualquiera puede armar un enlace con él. Solo se aceptan rutas\n// internas (\"/algo\"); \"https://otro.sitio\", \"//otro.sitio\" o \"/\\otro.sitio\" se descartan. Sin esto, el login\n// sería un redirector abierto para phishing.\n//\n// Funciones puras, no renderizan: function (regla de la casa).\n\nexport const REDIRECT_PARAM = 'redirect';\n\n/**\n * La ruta si es interna y segura; null si no.\n *\n * @param {string|null|undefined} candidatePath\n * @returns {string|null}\n */\nexport function safeInternalPath(candidatePath) {\n if (typeof candidatePath !== 'string' || candidatePath.length === 0 || candidatePath.length > 2000) {\n return null;\n }\n // guard clause: tiene que empezar con una sola diagonal (// y /\\ son URLs de otro dominio para el navegador)\n if (!candidatePath.startsWith('/') || candidatePath.startsWith('//') || candidatePath.startsWith('/\\\\')) {\n return null;\n }\n // guard clause: sin caracteres de control (un salto de línea puede partir la URL)\n if (/[\\u0000-\\u001f\\u007f]/.test(candidatePath)) {\n return null;\n }\n return candidatePath;\n}\n\n/**\n * Lee el destino de ?redirect= ya validado.\n *\n * @param {string} search location.search\n * @returns {string|null}\n */\nexport function readRedirectParam(search) {\n return safeInternalPath(new URLSearchParams(search).get(REDIRECT_PARAM));\n}\n\n/**\n * Arma \"/iniciar-sesion?redirect=<destino>\" (sin parámetro si el destino no es seguro o es la misma entrada).\n *\n * @param {string} entryPath p. ej. '/iniciar-sesion'\n * @param {string} targetPath ruta que se intentó abrir\n */\nexport function withRedirect(entryPath, targetPath) {\n const safeTarget = safeInternalPath(targetPath);\n if (!safeTarget || safeTarget === '/' || safeTarget.startsWith(entryPath)) {\n return entryPath;\n }\n return `${entryPath}?${new URLSearchParams({[REDIRECT_PARAM]: safeTarget})}`;\n}\n"],"names":[],"mappings":"AAWY,MAAC,iBAAiB;AAQvB,SAAS,iBAAiB,eAAe;AAC5C,MAAI,OAAO,kBAAkB,YAAY,cAAc,WAAW,KAAK,cAAc,SAAS,KAAM;AAChG,WAAO;AAAA,EACX;AAEA,MAAI,CAAC,cAAc,WAAW,GAAG,KAAK,cAAc,WAAW,IAAI,KAAK,cAAc,WAAW,KAAK,GAAG;AACrG,WAAO;AAAA,EACX;AAEA,MAAI,wBAAwB,KAAK,aAAa,GAAG;AAC7C,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAQO,SAAS,kBAAkB,QAAQ;AACtC,SAAO,iBAAiB,IAAI,gBAAgB,MAAM,EAAE,IAAI,cAAc,CAAC;AAC3E;AAQO,SAAS,aAAa,WAAW,YAAY;AAChD,QAAM,aAAa,iBAAiB,UAAU;AAC9C,MAAI,CAAC,cAAc,eAAe,OAAO,WAAW,WAAW,SAAS,GAAG;AACvE,WAAO;AAAA,EACX;AACA,SAAO,GAAG,SAAS,IAAI,IAAI,gBAAgB,EAAC,CAAC,cAAc,GAAG,WAAU,CAAC,CAAC;AAC9E;"}
@@ -0,0 +1,82 @@
1
+ "use client";
2
+ import { useRef, useLayoutEffect, useEffect } from "react";
3
+ import { useToolkitNavigation } from "./toolkit/toolkitContext.js";
4
+ const STORAGE_KEY = "calcita:navigationTrail";
5
+ function tabStorage() {
6
+ try {
7
+ return typeof window === "undefined" ? null : window.sessionStorage ?? null;
8
+ } catch {
9
+ return null;
10
+ }
11
+ }
12
+ function currentHistoryIndex() {
13
+ if (typeof window === "undefined") {
14
+ return 0;
15
+ }
16
+ return window.history.state?.idx ?? 0;
17
+ }
18
+ function readTrail(storage) {
19
+ try {
20
+ const storedTrail = storage?.getItem(STORAGE_KEY);
21
+ const trail = storedTrail ? JSON.parse(storedTrail) : {};
22
+ return trail !== null && typeof trail === "object" && !Array.isArray(trail) ? trail : {};
23
+ } catch {
24
+ return {};
25
+ }
26
+ }
27
+ function writeTrail(storage, trail) {
28
+ try {
29
+ storage?.setItem(STORAGE_KEY, JSON.stringify(trail));
30
+ } catch {
31
+ }
32
+ }
33
+ function trailUpTo(trail, index) {
34
+ return Object.fromEntries(Object.entries(trail).filter(([position]) => Number(position) <= index));
35
+ }
36
+ function rememberPageName(index, pageName, storage = tabStorage()) {
37
+ const trail = trailUpTo(readTrail(storage), index);
38
+ trail[index] = { labelKey: pageName.labelKey, params: pageName.params ?? {} };
39
+ writeTrail(storage, trail);
40
+ }
41
+ function forgetPageName(index, storage = tabStorage()) {
42
+ const trail = trailUpTo(readTrail(storage), index);
43
+ delete trail[index];
44
+ writeTrail(storage, trail);
45
+ }
46
+ function pageNameAt(index, storage = tabStorage()) {
47
+ const pageName = readTrail(storage)[index];
48
+ return pageName && typeof pageName.labelKey === "string" ? pageName : null;
49
+ }
50
+ function useNavigationTrail() {
51
+ const { useLocation } = useToolkitNavigation();
52
+ const { pathname } = useLocation();
53
+ const shownPage = useRef(null);
54
+ useLayoutEffect(() => {
55
+ const index = currentHistoryIndex();
56
+ if (shownPage.current?.index === index && shownPage.current?.pathname === pathname) {
57
+ return;
58
+ }
59
+ forgetPageName(index);
60
+ shownPage.current = { index, pathname };
61
+ });
62
+ }
63
+ function usePageName(labelKey, params) {
64
+ const { useLocation } = useToolkitNavigation();
65
+ const { key } = useLocation();
66
+ const paramsText = JSON.stringify(params ?? {});
67
+ useEffect(() => {
68
+ if (!labelKey) {
69
+ return;
70
+ }
71
+ rememberPageName(currentHistoryIndex(), { labelKey, params: JSON.parse(paramsText) });
72
+ }, [labelKey, paramsText, key]);
73
+ }
74
+ export {
75
+ currentHistoryIndex,
76
+ forgetPageName,
77
+ pageNameAt,
78
+ rememberPageName,
79
+ useNavigationTrail,
80
+ usePageName
81
+ };
82
+ //# sourceMappingURL=navigationTrail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigationTrail.js","sources":["../src/navigationTrail.js"],"sourcesContent":["// Cómo se llama cada página para el botón «Regresar» de la página que sigue.\n//\n// Sin esto, el botón dice un texto fijo («Regresar a la lista») aunque regrese a otra página. BackButton regresa con\n// navigate(-1), a la entrada anterior del historial de esta pestaña; para que su TEXTO diga a dónde va, cada página\n// anota aquí su nombre de regreso («Regresar al detalle del pedido 15») junto a su posición en el historial\n// (history.state.idx que pone react-router), y BackButton lee el de la posición anterior. Sin historial (enlace pegado, pestaña nueva, recarga después\n// de iniciar sesión) no hay nada que leer y BackButton usa el texto de siempre.\n//\n// OJO: una posición se reusa. Si el usuario regresa y entra a otra página, la nueva ocupa la misma posición. Por eso\n// useNavigationTrail (montado una sola vez en el layout de la aplicación) borra el nombre de la posición en cuanto cambia la página, ANTES de\n// que la página nueva anote el suyo: el borrado va en un efecto de layout y la anotación en un efecto normal, y React\n// corre todos los de layout antes que los normales. Una página que no anota su nombre deja su posición vacía, y el\n// BackButton de la siguiente usa el texto que le pasen.\n//\n// Se guarda la llave del texto con sus valores y no el texto: así un cambio de idioma lo traduce. sessionStorage por lo\n// mismo que lastListUrl.js: es de esta pestaña y se borra al cerrarla.\n//\n// Funciones puras y hooks, no renderizan: function (regla de la casa).\nimport {useEffect, useLayoutEffect, useRef} from 'react';\nimport {useToolkitNavigation} from '@/toolkit/toolkitContext.js';\n\nconst STORAGE_KEY = 'calcita:navigationTrail';\n\n/**\n * El almacenamiento de esta pestaña; null si el navegador lo bloquea o si no hay ventana (pruebas).\n *\n * @returns {Storage|null}\n */\nfunction tabStorage() {\n try {\n return typeof window === 'undefined' ? null : (window.sessionStorage ?? null);\n } catch {\n return null;\n }\n}\n\n/**\n * Posición de la página actual en el historial de esta pestaña: 0 es la primera página de la app.\n *\n * @returns {number}\n */\nexport function currentHistoryIndex() {\n if (typeof window === 'undefined') {\n return 0;\n }\n return window.history.state?.idx ?? 0;\n}\n\n/**\n * El camino guardado; uno roto o ilegible cuenta como vacío (el botón vuelve a su texto de siempre).\n *\n * @param {Storage|null} storage\n * @returns {Record<string, {labelKey: string, params: object}>}\n */\nfunction readTrail(storage) {\n try {\n const storedTrail = storage?.getItem(STORAGE_KEY);\n const trail = storedTrail ? JSON.parse(storedTrail) : {};\n return trail !== null && typeof trail === 'object' && !Array.isArray(trail) ? trail : {};\n } catch {\n return {};\n }\n}\n\n/**\n * @param {Storage|null} storage\n * @param {Record<string, {labelKey: string, params: object}>} trail\n */\nfunction writeTrail(storage, trail) {\n try {\n storage?.setItem(STORAGE_KEY, JSON.stringify(trail));\n } catch {\n // almacenamiento lleno o bloqueado: el botón vuelve a su texto de siempre\n }\n}\n\n/**\n * El camino sin las posiciones posteriores a la que se toca: al entrar a una página en esa posición, el navegador ya\n * descartó las que seguían (y si el usuario avanza con el botón del navegador, esas páginas vuelven a anotar su nombre).\n *\n * @param {Record<string, {labelKey: string, params: object}>} trail\n * @param {number} index\n * @returns {Record<string, {labelKey: string, params: object}>}\n */\nfunction trailUpTo(trail, index) {\n return Object.fromEntries(Object.entries(trail).filter(([position]) => Number(position) <= index));\n}\n\n/**\n * Anota el nombre de regreso de la página que está en esa posición del historial.\n *\n * @param {number} index posición en el historial (currentHistoryIndex)\n * @param {{labelKey: string, params?: object}} pageName llave de i18n con su espacio, p. ej. 'upload-control:detail.backToList'\n * @param {Storage|null} [storage] el de la pestaña; las pruebas pasan uno de mentiras\n */\nexport function rememberPageName(index, pageName, storage = tabStorage()) {\n const trail = trailUpTo(readTrail(storage), index);\n trail[index] = {labelKey: pageName.labelKey, params: pageName.params ?? {}};\n writeTrail(storage, trail);\n}\n\n/**\n * Borra el nombre de esa posición (y los de las posteriores): una página nueva la ocupa.\n *\n * @param {number} index\n * @param {Storage|null} [storage]\n */\nexport function forgetPageName(index, storage = tabStorage()) {\n const trail = trailUpTo(readTrail(storage), index);\n delete trail[index];\n writeTrail(storage, trail);\n}\n\n/**\n * El nombre de regreso anotado en esa posición; null si la página no anotó ninguno.\n *\n * @param {number} index\n * @param {Storage|null} [storage]\n * @returns {{labelKey: string, params: object}|null}\n */\nexport function pageNameAt(index, storage = tabStorage()) {\n const pageName = readTrail(storage)[index];\n return pageName && typeof pageName.labelKey === 'string' ? pageName : null;\n}\n\n/**\n * Se monta UNA vez en el layout de la aplicación: cuando cambia la página (otra posición u otra ruta), borra el nombre que tenía esa posición\n * antes de que la página nueva anote el suyo. Cambiar solo los parámetros de la URL en la misma posición (una pestaña,\n * un filtro) no cuenta como otra página.\n */\nexport function useNavigationTrail() {\n const {useLocation} = useToolkitNavigation();\n const {pathname} = useLocation();\n const shownPage = useRef(null);\n\n useLayoutEffect(() => {\n const index = currentHistoryIndex();\n if (shownPage.current?.index === index && shownPage.current?.pathname === pathname) {\n return;\n }\n forgetPageName(index);\n shownPage.current = {index, pathname};\n });\n}\n\n/**\n * Se monta en una página: anota cómo se llama para el botón «Regresar» de la página que sigue. Mientras sus datos no\n * llegan (labelKey null) no anota nada.\n *\n * @param {string|null} labelKey llave de i18n con su espacio, p. ej. 'upload-control:detail.backToList'\n * @param {object} [params] valores de la llave, ya listos para pintarse\n */\nexport function usePageName(labelKey, params) {\n const {useLocation} = useToolkitNavigation();\n const {key} = useLocation();\n const paramsText = JSON.stringify(params ?? {});\n\n useEffect(() => {\n if (!labelKey) {\n return;\n }\n rememberPageName(currentHistoryIndex(), {labelKey, params: JSON.parse(paramsText)});\n }, [labelKey, paramsText, key]);\n}\n"],"names":[],"mappings":";;;AAqBA,MAAM,cAAc;AAOpB,SAAS,aAAa;AAClB,MAAI;AACA,WAAO,OAAO,WAAW,cAAc,OAAQ,OAAO,kBAAkB;AAAA,EAC5E,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAOO,SAAS,sBAAsB;AAClC,MAAI,OAAO,WAAW,aAAa;AAC/B,WAAO;AAAA,EACX;AACA,SAAO,OAAO,QAAQ,OAAO,OAAO;AACxC;AAQA,SAAS,UAAU,SAAS;AACxB,MAAI;AACA,UAAM,cAAc,SAAS,QAAQ,WAAW;AAChD,UAAM,QAAQ,cAAc,KAAK,MAAM,WAAW,IAAI,CAAA;AACtD,WAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAA;AAAA,EAC1F,QAAQ;AACJ,WAAO,CAAA;AAAA,EACX;AACJ;AAMA,SAAS,WAAW,SAAS,OAAO;AAChC,MAAI;AACA,aAAS,QAAQ,aAAa,KAAK,UAAU,KAAK,CAAC;AAAA,EACvD,QAAQ;AAAA,EAER;AACJ;AAUA,SAAS,UAAU,OAAO,OAAO;AAC7B,SAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,QAAQ,MAAM,OAAO,QAAQ,KAAK,KAAK,CAAC;AACrG;AASO,SAAS,iBAAiB,OAAO,UAAU,UAAU,WAAU,GAAI;AACtE,QAAM,QAAQ,UAAU,UAAU,OAAO,GAAG,KAAK;AACjD,QAAM,KAAK,IAAI,EAAC,UAAU,SAAS,UAAU,QAAQ,SAAS,UAAU,GAAE;AAC1E,aAAW,SAAS,KAAK;AAC7B;AAQO,SAAS,eAAe,OAAO,UAAU,cAAc;AAC1D,QAAM,QAAQ,UAAU,UAAU,OAAO,GAAG,KAAK;AACjD,SAAO,MAAM,KAAK;AAClB,aAAW,SAAS,KAAK;AAC7B;AASO,SAAS,WAAW,OAAO,UAAU,cAAc;AACtD,QAAM,WAAW,UAAU,OAAO,EAAE,KAAK;AACzC,SAAO,YAAY,OAAO,SAAS,aAAa,WAAW,WAAW;AAC1E;AAOO,SAAS,qBAAqB;AACjC,QAAM,EAAC,YAAW,IAAI,qBAAoB;AAC1C,QAAM,EAAC,SAAQ,IAAI,YAAW;AAC9B,QAAM,YAAY,OAAO,IAAI;AAE7B,kBAAgB,MAAM;AAClB,UAAM,QAAQ,oBAAmB;AACjC,QAAI,UAAU,SAAS,UAAU,SAAS,UAAU,SAAS,aAAa,UAAU;AAChF;AAAA,IACJ;AACA,mBAAe,KAAK;AACpB,cAAU,UAAU,EAAC,OAAO,SAAQ;AAAA,EACxC,CAAC;AACL;AASO,SAAS,YAAY,UAAU,QAAQ;AAC1C,QAAM,EAAC,YAAW,IAAI,qBAAoB;AAC1C,QAAM,EAAC,IAAG,IAAI,YAAW;AACzB,QAAM,aAAa,KAAK,UAAU,UAAU,CAAA,CAAE;AAE9C,YAAU,MAAM;AACZ,QAAI,CAAC,UAAU;AACX;AAAA,IACJ;AACA,qBAAiB,oBAAmB,GAAI,EAAC,UAAU,QAAQ,KAAK,MAAM,UAAU,EAAC,CAAC;AAAA,EACtF,GAAG,CAAC,UAAU,YAAY,GAAG,CAAC;AAClC;"}
package/dist/next.js ADDED
@@ -0,0 +1,5 @@
1
+ import { nextNavigation } from "./adapters/nextNavigation.js";
2
+ export {
3
+ nextNavigation
4
+ };
5
+ //# sourceMappingURL=next.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,19 @@
1
+ import { isAnotherBuild } from "./publishedBuild.js";
2
+ const BUILD_WATCH_ACTION = Object.freeze({ none: "none", notice: "notice", reload: "reload" });
3
+ function buildWatchActionOf({ runningBuildId, publishedBuildId, hiddenMilliseconds = 0, reloadAfterHiddenMilliseconds = null }) {
4
+ if (!isAnotherBuild(runningBuildId, publishedBuildId)) {
5
+ return BUILD_WATCH_ACTION.none;
6
+ }
7
+ const wasAwayLongEnough = reloadAfterHiddenMilliseconds !== null && hiddenMilliseconds >= reloadAfterHiddenMilliseconds;
8
+ return wasAwayLongEnough ? BUILD_WATCH_ACTION.reload : BUILD_WATCH_ACTION.notice;
9
+ }
10
+ function publishedBuildIdOf(versionFile) {
11
+ const buildId = versionFile && typeof versionFile === "object" ? versionFile.buildId : null;
12
+ return typeof buildId === "string" && buildId !== "" ? buildId : null;
13
+ }
14
+ export {
15
+ BUILD_WATCH_ACTION,
16
+ buildWatchActionOf,
17
+ publishedBuildIdOf
18
+ };
19
+ //# sourceMappingURL=buildWatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildWatch.js","sources":["../../src/observability/buildWatch.js"],"sourcesContent":["// Qué hacer cuando la app revisa qué versión del front está publicada (usePublishedBuildWatch):\n// - la misma que corre: nada;\n// - otra, y la app estuvo en segundo plano un buen rato (la abrió de nuevo desde el inicio del teléfono): recargar sola,\n// como una app nativa que se actualizó mientras no se usaba;\n// - otra, pero la persona solo salió un momento (a copiar un código del SMS) o la está usando: el aviso «Hay una versión\n// nueva · Actualizar» (NewBuildNotice). Recargar ahí le borraría lo que llevaba escrito.\n//\n// Puras, sin React ni el navegador: se prueban solas.\nimport {isAnotherBuild} from '@/observability/publishedBuild.js';\n\n/** Lo que toca hacer al ver la versión publicada. */\nexport const BUILD_WATCH_ACTION = Object.freeze({none: 'none', notice: 'notice', reload: 'reload'});\n\n/**\n * @param {object} watch\n * @param {string|null|undefined} watch.runningBuildId la versión de esta pestaña (buildId de ToolkitProvider)\n * @param {string|null|undefined} watch.publishedBuildId la que está publicada\n * @param {number} [watch.hiddenMilliseconds] cuánto estuvo la app en segundo plano antes de esta revisión (0: no estuvo)\n * @param {number|null} [watch.reloadAfterHiddenMilliseconds] desde cuánto tiempo fuera se recarga sola; null: nunca\n * (solo el aviso)\n * @returns {string} un valor de BUILD_WATCH_ACTION\n */\nexport function buildWatchActionOf({runningBuildId, publishedBuildId, hiddenMilliseconds = 0, reloadAfterHiddenMilliseconds = null}) {\n if (!isAnotherBuild(runningBuildId, publishedBuildId)) {\n return BUILD_WATCH_ACTION.none;\n }\n const wasAwayLongEnough = reloadAfterHiddenMilliseconds !== null && hiddenMilliseconds >= reloadAfterHiddenMilliseconds;\n return wasAwayLongEnough ? BUILD_WATCH_ACTION.reload : BUILD_WATCH_ACTION.notice;\n}\n\n/**\n * La versión publicada que viene en el archivo de versión ({\"buildId\": \"…\"}); null si el archivo no la trae.\n *\n * @param {unknown} versionFile lo que se leyó del archivo (JSON ya convertido)\n * @returns {string|null}\n */\nexport function publishedBuildIdOf(versionFile) {\n const buildId = versionFile && typeof versionFile === 'object' ? versionFile.buildId : null;\n return typeof buildId === 'string' && buildId !== '' ? buildId : null;\n}\n"],"names":[],"mappings":";AAWY,MAAC,qBAAqB,OAAO,OAAO,EAAC,MAAM,QAAQ,QAAQ,UAAU,QAAQ,SAAQ,CAAC;AAW3F,SAAS,mBAAmB,EAAC,gBAAgB,kBAAkB,qBAAqB,GAAG,gCAAgC,KAAI,GAAG;AACjI,MAAI,CAAC,eAAe,gBAAgB,gBAAgB,GAAG;AACnD,WAAO,mBAAmB;AAAA,EAC9B;AACA,QAAM,oBAAoB,kCAAkC,QAAQ,sBAAsB;AAC1F,SAAO,oBAAoB,mBAAmB,SAAS,mBAAmB;AAC9E;AAQO,SAAS,mBAAmB,aAAa;AAC5C,QAAM,UAAU,eAAe,OAAO,gBAAgB,WAAW,YAAY,UAAU;AACvF,SAAO,OAAO,YAAY,YAAY,YAAY,KAAK,UAAU;AACrE;"}
@@ -0,0 +1,43 @@
1
+ const LEVELS = { error: 0, warn: 1, info: 2, debug: 3 };
2
+ const LOG_LEVEL_STORAGE_KEY = "calcita:logLevel";
3
+ let defaultLevel = LEVELS.warn;
4
+ function setLogLevel(level) {
5
+ if (!(level in LEVELS)) {
6
+ throw new Error(`setLogLevel espera error, warn, info o debug y recibió «${level}»`);
7
+ }
8
+ defaultLevel = LEVELS[level];
9
+ }
10
+ function currentLevel() {
11
+ try {
12
+ const override = window.localStorage?.getItem(LOG_LEVEL_STORAGE_KEY);
13
+ if (override && override in LEVELS) {
14
+ return LEVELS[override];
15
+ }
16
+ } catch {
17
+ }
18
+ return defaultLevel;
19
+ }
20
+ function emit(level, namespace, message, context) {
21
+ if (LEVELS[level] > currentLevel()) {
22
+ return;
23
+ }
24
+ const write = level === "debug" ? console.log : console[level] ?? console.log;
25
+ if (context === void 0) {
26
+ write(`[${namespace}] ${message}`);
27
+ } else {
28
+ write(`[${namespace}] ${message}`, context);
29
+ }
30
+ }
31
+ function createLogger(namespace) {
32
+ return {
33
+ error: (message, context) => emit("error", namespace, message, context),
34
+ warn: (message, context) => emit("warn", namespace, message, context),
35
+ info: (message, context) => emit("info", namespace, message, context),
36
+ debug: (message, context) => emit("debug", namespace, message, context)
37
+ };
38
+ }
39
+ export {
40
+ createLogger,
41
+ setLogLevel
42
+ };
43
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sources":["../../src/observability/logger.js"],"sourcesContent":["// Logger con espacio de nombres sobre console.\n//\n// Por qué un envoltorio y no una librería: corre en el navegador, son pocas líneas legibles y, cuando haga falta un\n// reporte externo (Sentry o el que sea), se enchufa en emit() sin tocar cada llamada.\n//\n// Reglas:\n// - datos estructurados: log.warn('mensaje', {status, requestId}); nunca concatenar cadenas.\n// - IMPORTANTE: sin datos personales. Nada de correos, nombres, contraseñas ni contenido de archivos: solo ids,\n// códigos, status y el request_id (misma regla que el backend: logs sin datos personales).\n// - por omisión solo salen error y warn. La aplicación pide todo en desarrollo con setLogLevel('debug') (el paquete no\n// sabe si la aplicación corre en desarrollo: import.meta.env es de quien construye). Para ver más en una instalación\n// ya desplegada:\n// localStorage.setItem('calcita:logLevel', 'debug')\n//\n// Funciones puras, no renderizan: function (regla de la casa).\n\nconst LEVELS = {error: 0, warn: 1, info: 2, debug: 3};\n\nconst LOG_LEVEL_STORAGE_KEY = 'calcita:logLevel';\n\n// el nivel cuando nadie lo pidió en localStorage; lo cambia la aplicación con setLogLevel\nlet defaultLevel = LEVELS.warn;\n\n/**\n * El nivel de lo que sale en consola: 'error', 'warn', 'info' o 'debug'. Lo llama la aplicación al arrancar, por ejemplo\n * setLogLevel(import.meta.env.DEV ? 'debug' : 'warn').\n *\n * @param {'error'|'warn'|'info'|'debug'} level\n * @returns {void}\n */\nexport function setLogLevel(level) {\n if (!(level in LEVELS)) {\n throw new Error(`setLogLevel espera error, warn, info o debug y recibió «${level}»`);\n }\n defaultLevel = LEVELS[level];\n}\n\nfunction currentLevel() {\n try {\n const override = window.localStorage?.getItem(LOG_LEVEL_STORAGE_KEY);\n if (override && override in LEVELS) {\n return LEVELS[override];\n }\n } catch {\n // ventana privada o almacenamiento bloqueado: usamos el nivel por defecto\n }\n return defaultLevel;\n}\n\nfunction emit(level, namespace, message, context) {\n if (LEVELS[level] > currentLevel()) {\n return;\n }\n\n // OJO: debug sale por console.log a propósito; console.debug cae en \"Verbose\" y DevTools lo esconde\n const write = level === 'debug' ? console.log : (console[level] ?? console.log);\n if (context === undefined) {\n write(`[${namespace}] ${message}`);\n } else {\n write(`[${namespace}] ${message}`, context);\n }\n}\n\n/**\n * Logger que antepone [namespace] a cada mensaje.\n *\n * @param {string} namespace p. ej. 'api', 'session'\n */\nexport function createLogger(namespace) {\n return {\n error: (message, context) => emit('error', namespace, message, context),\n warn: (message, context) => emit('warn', namespace, message, context),\n info: (message, context) => emit('info', namespace, message, context),\n debug: (message, context) => emit('debug', namespace, message, context),\n };\n}\n"],"names":[],"mappings":"AAgBA,MAAM,SAAS,EAAC,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAA;AAEnD,MAAM,wBAAwB;AAG9B,IAAI,eAAe,OAAO;AASnB,SAAS,YAAY,OAAO;AAC/B,MAAI,EAAE,SAAS,SAAS;AACpB,UAAM,IAAI,MAAM,2DAA2D,KAAK,GAAG;AAAA,EACvF;AACA,iBAAe,OAAO,KAAK;AAC/B;AAEA,SAAS,eAAe;AACpB,MAAI;AACA,UAAM,WAAW,OAAO,cAAc,QAAQ,qBAAqB;AACnE,QAAI,YAAY,YAAY,QAAQ;AAChC,aAAO,OAAO,QAAQ;AAAA,IAC1B;AAAA,EACJ,QAAQ;AAAA,EAER;AACA,SAAO;AACX;AAEA,SAAS,KAAK,OAAO,WAAW,SAAS,SAAS;AAC9C,MAAI,OAAO,KAAK,IAAI,gBAAgB;AAChC;AAAA,EACJ;AAGA,QAAM,QAAQ,UAAU,UAAU,QAAQ,MAAO,QAAQ,KAAK,KAAK,QAAQ;AAC3E,MAAI,YAAY,QAAW;AACvB,UAAM,IAAI,SAAS,KAAK,OAAO,EAAE;AAAA,EACrC,OAAO;AACH,UAAM,IAAI,SAAS,KAAK,OAAO,IAAI,OAAO;AAAA,EAC9C;AACJ;AAOO,SAAS,aAAa,WAAW;AACpC,SAAO;AAAA,IACH,OAAO,CAAC,SAAS,YAAY,KAAK,SAAS,WAAW,SAAS,OAAO;AAAA,IACtE,MAAM,CAAC,SAAS,YAAY,KAAK,QAAQ,WAAW,SAAS,OAAO;AAAA,IACpE,MAAM,CAAC,SAAS,YAAY,KAAK,QAAQ,WAAW,SAAS,OAAO;AAAA,IACpE,OAAO,CAAC,SAAS,YAAY,KAAK,SAAS,WAAW,SAAS,OAAO;AAAA,EAAA;AAE9E;"}
@@ -0,0 +1,39 @@
1
+ "use client";
2
+ import { useSyncExternalStore } from "react";
3
+ import { toolkitSettings } from "../toolkit/toolkitSettings.js";
4
+ const listeners = /* @__PURE__ */ new Set();
5
+ let newBuildPublished = false;
6
+ function isAnotherBuild(runningBuildId, publishedBuildId) {
7
+ if (!runningBuildId || !publishedBuildId) {
8
+ return false;
9
+ }
10
+ return runningBuildId !== publishedBuildId;
11
+ }
12
+ function reportPublishedBuild(publishedBuildId, runningBuildId = toolkitSettings().buildId) {
13
+ if (newBuildPublished || !isAnotherBuild(runningBuildId, publishedBuildId)) {
14
+ return;
15
+ }
16
+ newBuildPublished = true;
17
+ listeners.forEach((listener) => listener());
18
+ }
19
+ function isNewBuildPublished() {
20
+ return newBuildPublished;
21
+ }
22
+ function subscribeToNewBuild(listener) {
23
+ listeners.add(listener);
24
+ return () => listeners.delete(listener);
25
+ }
26
+ function isNewBuildPublishedOnServer() {
27
+ return false;
28
+ }
29
+ function useNewBuildPublished() {
30
+ return useSyncExternalStore(subscribeToNewBuild, isNewBuildPublished, isNewBuildPublishedOnServer);
31
+ }
32
+ export {
33
+ isAnotherBuild,
34
+ isNewBuildPublished,
35
+ reportPublishedBuild,
36
+ subscribeToNewBuild,
37
+ useNewBuildPublished
38
+ };
39
+ //# sourceMappingURL=publishedBuild.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishedBuild.js","sources":["../../src/observability/publishedBuild.js"],"sourcesContent":["// «Hay una versión nueva»: saber cuándo se publicó una compilación del front distinta a la que corre en esta pestaña.\n//\n// Una pestaña que lleva horas abierta sigue corriendo el front con que se abrió. Dos datos lo resuelven, y los dos los\n// pone el proyecto:\n// - la compilación de ESTA pestaña: la prop buildId de ToolkitProvider (de una variable de entorno al construir, o la\n// que escribe el servidor en la página al abrirla);\n// - la compilación PUBLICADA: el servidor la anuncia en cada respuesta del API (por ejemplo, en un header) y el cliente\n// HTTP del proyecto se la entrega aquí con reportPublishedBuild.\n// Cuando llega una distinta a la de la pestaña, el aviso (NewBuildNotice) se prende y ya no se apaga: lo único que lo\n// quita es recargar, que trae la compilación nueva.\n//\n// No hace peticiones propias: se entera con las respuestas que las pantallas ya piden.\n//\n// axiosClient.interceptors.response.use((response) => {\n// reportPublishedBuild(response.headers['x-frontend-build']);\n// return response;\n// });\n//\n// Funciones puras y un hook genérico: function (regla de la casa).\nimport {useSyncExternalStore} from 'react';\nimport {toolkitSettings} from '@/toolkit/toolkitSettings.js';\n\n// quién quiere enterarse cuando el aviso se prende (los componentes que usan useNewBuildPublished)\nconst listeners = new Set();\nlet newBuildPublished = false;\n\n/**\n * Si el servidor publica una compilación distinta a la que corre en la pestaña.\n *\n * @param {string|null|undefined} runningBuildId compilación de esta pestaña; vacía en desarrollo\n * @param {string|null|undefined} publishedBuildId compilación que anuncia el servidor; vacía si la respuesta no la trae\n * @returns {boolean} false si falta cualquiera de los dos: sin los dos no hay nada que comparar\n */\nexport function isAnotherBuild(runningBuildId, publishedBuildId) {\n // guard clause: en desarrollo no hay compilación, y una respuesta sin el dato no dice nada\n if (!runningBuildId || !publishedBuildId) {\n return false;\n }\n return runningBuildId !== publishedBuildId;\n}\n\n/**\n * Recibe la compilación que anunció una respuesta del servidor y prende el aviso si ya no es la de la pestaña.\n *\n * @param {string|null|undefined} publishedBuildId la que anunció la respuesta\n * @param {string|null|undefined} [runningBuildId] la de esta pestaña; por omisión, el buildId de ToolkitProvider\n * @returns {void}\n */\nexport function reportPublishedBuild(publishedBuildId, runningBuildId = toolkitSettings().buildId) {\n // guard clause: el aviso ya está prendido, o la publicada sigue siendo la de la pestaña\n if (newBuildPublished || !isAnotherBuild(runningBuildId, publishedBuildId)) {\n return;\n }\n newBuildPublished = true;\n listeners.forEach((listener) => listener());\n}\n\n/**\n * Si ya se supo que hay una compilación nueva publicada.\n *\n * @returns {boolean}\n */\nexport function isNewBuildPublished() {\n return newBuildPublished;\n}\n\n/**\n * Avisa a quien se suscriba cuando el aviso se prende (contrato de useSyncExternalStore).\n *\n * @param {() => void} listener función que se llama al prenderse\n * @returns {() => void} función para dejar de escuchar\n */\nexport function subscribeToNewBuild(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/**\n * Pintando en el servidor (Next.js) no hay pestaña que comparar: sin aviso.\n *\n * @returns {boolean}\n */\nfunction isNewBuildPublishedOnServer() {\n return false;\n}\n\n/**\n * Para un componente: si hay una compilación nueva publicada. El componente se vuelve a pintar cuando el aviso se prende.\n *\n * @returns {boolean}\n */\nexport function useNewBuildPublished() {\n return useSyncExternalStore(subscribeToNewBuild, isNewBuildPublished, isNewBuildPublishedOnServer);\n}\n"],"names":[],"mappings":";;;AAuBA,MAAM,YAAY,oBAAI,IAAG;AACzB,IAAI,oBAAoB;AASjB,SAAS,eAAe,gBAAgB,kBAAkB;AAE7D,MAAI,CAAC,kBAAkB,CAAC,kBAAkB;AACtC,WAAO;AAAA,EACX;AACA,SAAO,mBAAmB;AAC9B;AASO,SAAS,qBAAqB,kBAAkB,iBAAiB,gBAAe,EAAG,SAAS;AAE/F,MAAI,qBAAqB,CAAC,eAAe,gBAAgB,gBAAgB,GAAG;AACxE;AAAA,EACJ;AACA,sBAAoB;AACpB,YAAU,QAAQ,CAAC,aAAa,SAAQ,CAAE;AAC9C;AAOO,SAAS,sBAAsB;AAClC,SAAO;AACX;AAQO,SAAS,oBAAoB,UAAU;AAC1C,YAAU,IAAI,QAAQ;AACtB,SAAO,MAAM,UAAU,OAAO,QAAQ;AAC1C;AAOA,SAAS,8BAA8B;AACnC,SAAO;AACX;AAOO,SAAS,uBAAuB;AACnC,SAAO,qBAAqB,qBAAqB,qBAAqB,2BAA2B;AACrG;"}
@@ -0,0 +1,77 @@
1
+ "use client";
2
+ import { useEffect } from "react";
3
+ import { publishedBuildIdOf, buildWatchActionOf, BUILD_WATCH_ACTION } from "./buildWatch.js";
4
+ import { createLogger } from "./logger.js";
5
+ import { reportPublishedBuild } from "./publishedBuild.js";
6
+ import { toolkitSettings } from "../toolkit/toolkitSettings.js";
7
+ const log = createLogger("build-watch");
8
+ const MILLISECONDS_PER_MINUTE = 60 * 1e3;
9
+ const DEFAULT_CHECK_EVERY_MINUTES = 5;
10
+ const DEFAULT_RELOAD_AFTER_HIDDEN_MINUTES = 15;
11
+ function reloadPage() {
12
+ window.location.reload();
13
+ }
14
+ function usePublishedBuildWatch({
15
+ url = null,
16
+ buildId,
17
+ checkEveryMinutes = DEFAULT_CHECK_EVERY_MINUTES,
18
+ reloadAfterHiddenMinutes = DEFAULT_RELOAD_AFTER_HIDDEN_MINUTES,
19
+ onReload = reloadPage
20
+ } = {}) {
21
+ useEffect(() => {
22
+ if (!url || typeof document === "undefined") {
23
+ return void 0;
24
+ }
25
+ let hiddenSince = null;
26
+ let isChecking = false;
27
+ const check = async (hiddenMilliseconds = 0) => {
28
+ if (isChecking) {
29
+ return;
30
+ }
31
+ isChecking = true;
32
+ try {
33
+ const response = await fetch(url, { cache: "no-store", headers: { Accept: "application/json" } });
34
+ const publishedBuildId = response.ok ? publishedBuildIdOf(await response.json()) : null;
35
+ const action = buildWatchActionOf({
36
+ runningBuildId: buildId ?? toolkitSettings().buildId,
37
+ publishedBuildId,
38
+ hiddenMilliseconds,
39
+ reloadAfterHiddenMilliseconds: reloadAfterHiddenMinutes === null ? null : reloadAfterHiddenMinutes * MILLISECONDS_PER_MINUTE
40
+ });
41
+ if (action === BUILD_WATCH_ACTION.reload) {
42
+ onReload();
43
+ } else if (action === BUILD_WATCH_ACTION.notice) {
44
+ reportPublishedBuild(publishedBuildId, buildId ?? toolkitSettings().buildId);
45
+ }
46
+ } catch (error) {
47
+ log.info("No se pudo revisar la versión publicada", { url, reason: error.message });
48
+ } finally {
49
+ isChecking = false;
50
+ }
51
+ };
52
+ const handleVisibilityChange = () => {
53
+ if (document.visibilityState === "hidden") {
54
+ hiddenSince = Date.now();
55
+ return;
56
+ }
57
+ const hiddenMilliseconds = hiddenSince === null ? 0 : Date.now() - hiddenSince;
58
+ hiddenSince = null;
59
+ check(hiddenMilliseconds);
60
+ };
61
+ const timer = window.setInterval(() => {
62
+ if (document.visibilityState === "visible") {
63
+ check();
64
+ }
65
+ }, checkEveryMinutes * MILLISECONDS_PER_MINUTE);
66
+ check();
67
+ document.addEventListener("visibilitychange", handleVisibilityChange);
68
+ return () => {
69
+ window.clearInterval(timer);
70
+ document.removeEventListener("visibilitychange", handleVisibilityChange);
71
+ };
72
+ }, [url, buildId, checkEveryMinutes, reloadAfterHiddenMinutes, onReload]);
73
+ }
74
+ export {
75
+ usePublishedBuildWatch
76
+ };
77
+ //# sourceMappingURL=usePublishedBuildWatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePublishedBuildWatch.js","sources":["../../src/observability/usePublishedBuildWatch.js"],"sourcesContent":["// Que la app se entere sola de que se publicó otra versión del front, sin depender del API. Hace falta sobre todo con la\n// app anclada al inicio del iPhone: al abrirla, el iPhone NO vuelve a pedir la página, retoma la que tenía en memoria (aunque\n// haya pasado un día), así que la persona se quedaba con la versión vieja hasta cerrarla a la fuerza.\n//\n// Cómo: al construir, el proyecto deja un archivo con su versión ({\"buildId\": \"…\"}, por omisión /version.json) y la misma\n// versión en ToolkitProvider (buildId). Esta app vuelve a leer el archivo:\n// - cada vez que regresa del segundo plano (justo cuando el iPhone la despierta), y\n// - cada tanto mientras se usa (checkEveryMinutes).\n// Si ya hay otra (buildWatchActionOf): si estuvo fuera al menos reloadAfterHiddenMinutes, se recarga sola; si no, sale el\n// aviso «Hay una versión nueva · Actualizar» (NewBuildNotice, que el marco ya pinta) para no borrar lo que llevaba escrito.\n//\n// Se monta UNA vez, en la raíz de la app, con la versión de la pestaña (la misma que va a ToolkitProvider buildId):\n// usePublishedBuildWatch({url: import.meta.env.PROD ? '/version.json' : null, buildId: APP_BUILD_ID});\n// Sin url no hace nada (en desarrollo no hay versión que comparar).\n//\n// OJO buildId: sin él se toma el de ToolkitProvider, pero la raíz suele montar este gancho ANTES de que ToolkitProvider se\n// pinte (AccountProvider lo pinta hasta tener la sesión): la primera revisión no tenía con qué comparar y, al abrir la app\n// en la pantalla de entrar, el aviso no salía (medido en el proyecto que arma calcita new).\n//\n// OJO: el archivo se pide con cache 'no-store' y el servidor no debe guardarlo (en el nginx de los ejemplos, «location /»\n// ya va con no-cache). Sin red (el teléfono en el metro) no pasa nada: se vuelve a intentar en la siguiente revisión.\n//\n// Gancho genérico del paquete: function (regla de la casa).\nimport {useEffect} from 'react';\n\nimport {BUILD_WATCH_ACTION, buildWatchActionOf, publishedBuildIdOf} from '@/observability/buildWatch.js';\nimport {createLogger} from '@/observability/logger.js';\nimport {reportPublishedBuild} from '@/observability/publishedBuild.js';\nimport {toolkitSettings} from '@/toolkit/toolkitSettings.js';\n\nconst log = createLogger('build-watch');\nconst MILLISECONDS_PER_MINUTE = 60 * 1000;\n// por omisión: revisar cada 5 minutos mientras se usa, y recargar sola si estuvo fuera 15 minutos o más\nconst DEFAULT_CHECK_EVERY_MINUTES = 5;\nconst DEFAULT_RELOAD_AFTER_HIDDEN_MINUTES = 15;\n\n/** Lo que hace si el proyecto no dice otra cosa: recargar la página, que trae la versión nueva. */\nfunction reloadPage() {\n window.location.reload();\n}\n\n/**\n * @param {object} [options]\n * @param {string|null} [options.url] dónde está el archivo de versión ({\"buildId\": \"…\"}); null: no vigila\n * @param {string} [options.buildId] la versión de esta pestaña; por omisión el buildId de ToolkitProvider (ver el OJO)\n * @param {number} [options.checkEveryMinutes] cada cuánto revisa mientras se usa; por omisión 5\n * @param {number|null} [options.reloadAfterHiddenMinutes] desde cuántos minutos fuera se recarga sola al volver; por\n * omisión 15. null: nunca se recarga sola, siempre el aviso\n * @param {() => void} [options.onReload] cómo recargar (p. ej. guardar un borrador antes). OJO: con useCallback; una\n * función nueva en cada pintada volvería a armar la vigilancia\n * @returns {void}\n */\nexport function usePublishedBuildWatch({\n url = null, buildId, checkEveryMinutes = DEFAULT_CHECK_EVERY_MINUTES, reloadAfterHiddenMinutes = DEFAULT_RELOAD_AFTER_HIDDEN_MINUTES, onReload = reloadPage,\n} = {}) {\n useEffect(() => {\n if (!url || typeof document === 'undefined') {\n return undefined;\n }\n let hiddenSince = null;\n let isChecking = false;\n\n const check = async (hiddenMilliseconds = 0) => {\n // una revisión a la vez: al volver del segundo plano pueden llegar dos avisos del navegador juntos\n if (isChecking) {\n return;\n }\n isChecking = true;\n try {\n const response = await fetch(url, {cache: 'no-store', headers: {Accept: 'application/json'}});\n const publishedBuildId = response.ok ? publishedBuildIdOf(await response.json()) : null;\n const action = buildWatchActionOf({\n runningBuildId: buildId ?? toolkitSettings().buildId,\n publishedBuildId,\n hiddenMilliseconds,\n reloadAfterHiddenMilliseconds: reloadAfterHiddenMinutes === null ? null : reloadAfterHiddenMinutes * MILLISECONDS_PER_MINUTE,\n });\n if (action === BUILD_WATCH_ACTION.reload) {\n onReload();\n } else if (action === BUILD_WATCH_ACTION.notice) {\n reportPublishedBuild(publishedBuildId, buildId ?? toolkitSettings().buildId);\n }\n } catch (error) {\n // sin red o con un archivo que no es JSON: no es algo que la persona pueda arreglar; queda en el registro\n log.info('No se pudo revisar la versión publicada', {url, reason: error.message});\n } finally {\n isChecking = false;\n }\n };\n\n // al irse a segundo plano se anota la hora; al volver se revisa con cuánto tiempo estuvo fuera\n const handleVisibilityChange = () => {\n if (document.visibilityState === 'hidden') {\n hiddenSince = Date.now();\n return;\n }\n const hiddenMilliseconds = hiddenSince === null ? 0 : Date.now() - hiddenSince;\n hiddenSince = null;\n check(hiddenMilliseconds);\n };\n // mientras se usa (en segundo plano el teléfono detiene los relojes de la página de todos modos)\n const timer = window.setInterval(() => {\n if (document.visibilityState === 'visible') {\n check();\n }\n }, checkEveryMinutes * MILLISECONDS_PER_MINUTE);\n\n check();\n document.addEventListener('visibilitychange', handleVisibilityChange);\n return () => {\n window.clearInterval(timer);\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n };\n }, [url, buildId, checkEveryMinutes, reloadAfterHiddenMinutes, onReload]);\n}\n"],"names":[],"mappings":";;;;;;AA8BA,MAAM,MAAM,aAAa,aAAa;AACtC,MAAM,0BAA0B,KAAK;AAErC,MAAM,8BAA8B;AACpC,MAAM,sCAAsC;AAG5C,SAAS,aAAa;AAClB,SAAO,SAAS,OAAA;AACpB;AAaO,SAAS,uBAAuB;AAAA,EACnC,MAAM;AAAA,EAAM;AAAA,EAAS,oBAAoB;AAAA,EAA6B,2BAA2B;AAAA,EAAqC,WAAW;AACrJ,IAAI,IAAI;AACJ,YAAU,MAAM;AACZ,QAAI,CAAC,OAAO,OAAO,aAAa,aAAa;AACzC,aAAO;AAAA,IACX;AACA,QAAI,cAAc;AAClB,QAAI,aAAa;AAEjB,UAAM,QAAQ,OAAO,qBAAqB,MAAM;AAE5C,UAAI,YAAY;AACZ;AAAA,MACJ;AACA,mBAAa;AACb,UAAI;AACA,cAAM,WAAW,MAAM,MAAM,KAAK,EAAC,OAAO,YAAY,SAAS,EAAC,QAAQ,mBAAA,EAAkB,CAAE;AAC5F,cAAM,mBAAmB,SAAS,KAAK,mBAAmB,MAAM,SAAS,KAAA,CAAM,IAAI;AACnF,cAAM,SAAS,mBAAmB;AAAA,UAC9B,gBAAgB,WAAW,gBAAA,EAAkB;AAAA,UAC7C;AAAA,UACA;AAAA,UACA,+BAA+B,6BAA6B,OAAO,OAAO,2BAA2B;AAAA,QAAA,CACxG;AACD,YAAI,WAAW,mBAAmB,QAAQ;AACtC,mBAAA;AAAA,QACJ,WAAW,WAAW,mBAAmB,QAAQ;AAC7C,+BAAqB,kBAAkB,WAAW,gBAAA,EAAkB,OAAO;AAAA,QAC/E;AAAA,MACJ,SAAS,OAAO;AAEZ,YAAI,KAAK,2CAA2C,EAAC,KAAK,QAAQ,MAAM,SAAQ;AAAA,MACpF,UAAA;AACI,qBAAa;AAAA,MACjB;AAAA,IACJ;AAGA,UAAM,yBAAyB,MAAM;AACjC,UAAI,SAAS,oBAAoB,UAAU;AACvC,sBAAc,KAAK,IAAA;AACnB;AAAA,MACJ;AACA,YAAM,qBAAqB,gBAAgB,OAAO,IAAI,KAAK,QAAQ;AACnE,oBAAc;AACd,YAAM,kBAAkB;AAAA,IAC5B;AAEA,UAAM,QAAQ,OAAO,YAAY,MAAM;AACnC,UAAI,SAAS,oBAAoB,WAAW;AACxC,cAAA;AAAA,MACJ;AAAA,IACJ,GAAG,oBAAoB,uBAAuB;AAE9C,UAAA;AACA,aAAS,iBAAiB,oBAAoB,sBAAsB;AACpE,WAAO,MAAM;AACT,aAAO,cAAc,KAAK;AAC1B,eAAS,oBAAoB,oBAAoB,sBAAsB;AAAA,IAC3E;AAAA,EACJ,GAAG,CAAC,KAAK,SAAS,mBAAmB,0BAA0B,QAAQ,CAAC;AAC5E;"}
@@ -0,0 +1,7 @@
1
+ import { createPasskey, passkeysSupported, signWithPasskey } from "./security/passkeys.js";
2
+ export {
3
+ createPasskey,
4
+ passkeysSupported,
5
+ signWithPasskey
6
+ };
7
+ //# sourceMappingURL=passkeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passkeys.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,33 @@
1
+ function positionOf(options, value) {
2
+ return options.findIndex((option) => option.value === value);
3
+ }
4
+ function rangeEndOptionsOf(options, from) {
5
+ const fromPosition = positionOf(options, from);
6
+ if (fromPosition === -1) {
7
+ return options;
8
+ }
9
+ let rangeIsBroken = false;
10
+ return options.map((option, position) => {
11
+ if (position > fromPosition && option.disabled) {
12
+ rangeIsBroken = true;
13
+ }
14
+ return { ...option, disabled: position < fromPosition || rangeIsBroken || option.disabled };
15
+ });
16
+ }
17
+ function periodRangeIsValid(options, from, to) {
18
+ const fromPosition = positionOf(options, from);
19
+ const toPosition = positionOf(options, to);
20
+ if (fromPosition === -1 || toPosition === -1 || toPosition < fromPosition) {
21
+ return false;
22
+ }
23
+ return options.slice(fromPosition, toPosition + 1).every((option) => !option.disabled);
24
+ }
25
+ function rangeEndAfterStartChange(options, from, to) {
26
+ return periodRangeIsValid(options, from, to) ? to : from;
27
+ }
28
+ export {
29
+ periodRangeIsValid,
30
+ rangeEndAfterStartChange,
31
+ rangeEndOptionsOf
32
+ };
33
+ //# sourceMappingURL=periodRanges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"periodRanges.js","sources":["../src/periodRanges.js"],"sourcesContent":["// Las reglas de un rango de periodos (de tal quincena a tal quincena, de tal mes a tal mes) sobre una lista ORDENADA de\n// opciones, cada una con su valor y si se puede elegir.\n//\n// Un rango vale si sus dos extremos se pueden elegir, «hasta» no va antes de «desde» y NINGUNA opción de en medio está\n// apagada: no se cruza un periodo roto. Por eso la lista de «hasta» se corta en la primera opción apagada después de\n// «desde».\n//\n// No sabe de quincenas ni de productos: quien la usa le pasa sus opciones ya ordenadas. Funciones puras, sin React: se\n// prueban con node --test.\n//\n// Genérico del paquete: function (regla de la casa).\n\n/**\n * @typedef {{value: string, disabled: boolean}} PeriodOption\n */\n\n/**\n * Dónde está un valor en la lista.\n *\n * @param {PeriodOption[]} options en orden\n * @param {string|null|undefined} value\n * @returns {number} su posición; -1 si no está\n */\nfunction positionOf(options, value) {\n return options.findIndex((option) => option.value === value);\n}\n\n/**\n * Las opciones de «hasta» para un «desde»: apagadas las de antes de «desde» y todas desde la primera apagada después de\n * él (un rango no salta un periodo roto).\n *\n * @param {PeriodOption[]} options en orden\n * @param {string|null|undefined} from el «desde» elegido; sin él, las opciones tal cual\n * @returns {PeriodOption[]} las mismas opciones, con disabled donde no se puede terminar el rango\n */\nexport function rangeEndOptionsOf(options, from) {\n const fromPosition = positionOf(options, from);\n\n // guard clause: sin «desde» no hay nada que cortar\n if (fromPosition === -1) {\n return options;\n }\n\n let rangeIsBroken = false;\n\n return options.map((option, position) => {\n if (position > fromPosition && option.disabled) {\n rangeIsBroken = true;\n }\n\n return {...option, disabled: position < fromPosition || rangeIsBroken || option.disabled};\n });\n}\n\n/**\n * Si un rango se puede pedir.\n *\n * @param {PeriodOption[]} options en orden\n * @param {string|null|undefined} from\n * @param {string|null|undefined} to\n * @returns {boolean} true si los dos extremos existen, se pueden elegir, van en orden y no hay nada apagado en medio\n */\nexport function periodRangeIsValid(options, from, to) {\n const fromPosition = positionOf(options, from);\n const toPosition = positionOf(options, to);\n\n // guard clause: un extremo que no existe o un rango al revés no vale\n if (fromPosition === -1 || toPosition === -1 || toPosition < fromPosition) {\n return false;\n }\n\n return options.slice(fromPosition, toPosition + 1).every((option) => !option.disabled);\n}\n\n/**\n * El «hasta» que queda al cambiar «desde»: el mismo si el rango sigue valiendo; si no, el propio «desde» (un rango de un\n * solo periodo siempre vale).\n *\n * @param {PeriodOption[]} options en orden\n * @param {string} from el «desde» nuevo\n * @param {string|null|undefined} to el «hasta» que había\n * @returns {string} el «hasta» que se queda\n */\nexport function rangeEndAfterStartChange(options, from, to) {\n return periodRangeIsValid(options, from, to) ? to : from;\n}\n"],"names":[],"mappings":"AAuBA,SAAS,WAAW,SAAS,OAAO;AAChC,SAAO,QAAQ,UAAU,CAAC,WAAW,OAAO,UAAU,KAAK;AAC/D;AAUO,SAAS,kBAAkB,SAAS,MAAM;AAC7C,QAAM,eAAe,WAAW,SAAS,IAAI;AAG7C,MAAI,iBAAiB,IAAI;AACrB,WAAO;AAAA,EACX;AAEA,MAAI,gBAAgB;AAEpB,SAAO,QAAQ,IAAI,CAAC,QAAQ,aAAa;AACrC,QAAI,WAAW,gBAAgB,OAAO,UAAU;AAC5C,sBAAgB;AAAA,IACpB;AAEA,WAAO,EAAC,GAAG,QAAQ,UAAU,WAAW,gBAAgB,iBAAiB,OAAO,SAAQ;AAAA,EAC5F,CAAC;AACL;AAUO,SAAS,mBAAmB,SAAS,MAAM,IAAI;AAClD,QAAM,eAAe,WAAW,SAAS,IAAI;AAC7C,QAAM,aAAa,WAAW,SAAS,EAAE;AAGzC,MAAI,iBAAiB,MAAM,eAAe,MAAM,aAAa,cAAc;AACvE,WAAO;AAAA,EACX;AAEA,SAAO,QAAQ,MAAM,cAAc,aAAa,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,QAAQ;AACzF;AAWO,SAAS,yBAAyB,SAAS,MAAM,IAAI;AACxD,SAAO,mBAAmB,SAAS,MAAM,EAAE,IAAI,KAAK;AACxD;"}
@@ -0,0 +1,51 @@
1
+ import { translateToolkit } from "./toolkit/toolkitSettings.js";
2
+ const GENERIC_KEY_BY_STATUS = {
3
+ 0: "offline",
4
+ 401: "unauthenticated",
5
+ 403: "forbidden",
6
+ 404: "notFound",
7
+ 409: "conflict",
8
+ 410: "gone",
9
+ 413: "payloadTooLarge",
10
+ 419: "csrfTokenMismatch",
11
+ 422: "validation",
12
+ 429: "tooManyRequests",
13
+ 500: "serverError",
14
+ 502: "serviceUnavailable",
15
+ 503: "serviceUnavailable",
16
+ 504: "serviceUnavailable"
17
+ };
18
+ function genericKeyOf(status) {
19
+ return GENERIC_KEY_BY_STATUS[status] ?? "generic";
20
+ }
21
+ function problemTitle(problem, status, { translatedByServer = true } = {}) {
22
+ if (translatedByServer && problem?.title) {
23
+ return problem.title;
24
+ }
25
+ return translateToolkit("problems", `${genericKeyOf(status)}.title`);
26
+ }
27
+ function problemMessage(problem, status, { translatedByServer = true } = {}) {
28
+ if (translatedByServer && problem?.detail) {
29
+ return problem.detail;
30
+ }
31
+ return translateToolkit("problems", `${genericKeyOf(status)}.detail`);
32
+ }
33
+ function fieldErrorsOf(problem) {
34
+ const rawErrors = problem?.errors;
35
+ const errorsByField = {};
36
+ if (!rawErrors || typeof rawErrors !== "object" || Array.isArray(rawErrors)) {
37
+ return errorsByField;
38
+ }
39
+ for (const [fieldPath, messages] of Object.entries(rawErrors)) {
40
+ const fieldName = String(fieldPath).split(".").filter((segment) => !/^\d+$/.test(segment)).at(-1) || "_";
41
+ const messageList = Array.isArray(messages) ? messages : [messages];
42
+ errorsByField[fieldName] = [...errorsByField[fieldName] ?? [], ...messageList.map(String)];
43
+ }
44
+ return errorsByField;
45
+ }
46
+ export {
47
+ fieldErrorsOf,
48
+ problemMessage,
49
+ problemTitle
50
+ };
51
+ //# sourceMappingURL=problems.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"problems.js","sources":["../src/problems.js"],"sourcesContent":["// Del error RFC 9457 del backend al texto que lee la persona.\n//\n// La regla tiene dos mitades:\n// - Lo que YA viene traducido se usa tal cual. Un backend que responde RFC 9457 manda title y detail en el idioma del\n// header Accept-Language, y los errores de validación (422, como los de Laravel) traen `errors` como\n// {campo: [mensajes]} también traducidos. Traducir aquí por `code` pisaría el texto que el backend escribió\n// para ESE caso (p. ej. \"Correo o contraseña incorrectos\").\n// - Lo genérico se traduce aquí, con los textos del paquete (namespace problems): sin red (no hubo respuesta), un\n// 502 del proxy que llega en HTML, o un error que armó el servidor web por su cuenta en otro idioma.\n//\n// OJO: estas funciones se llaman fuera de los componentes: leen el idioma y los textos de la configuración vigente\n// del proveedor.\n//\n// Funciones puras, no renderizan: function (regla de la casa).\nimport {translateToolkit} from '@/toolkit/toolkitSettings.js';\n\n// status → llave genérica de los textos del paquete (namespace problems)\nconst GENERIC_KEY_BY_STATUS = {\n 0: 'offline',\n 401: 'unauthenticated',\n 403: 'forbidden',\n 404: 'notFound',\n 409: 'conflict',\n 410: 'gone',\n 413: 'payloadTooLarge',\n 419: 'csrfTokenMismatch',\n 422: 'validation',\n 429: 'tooManyRequests',\n 500: 'serverError',\n 502: 'serviceUnavailable',\n 503: 'serviceUnavailable',\n 504: 'serviceUnavailable',\n};\n\nfunction genericKeyOf(status) {\n return GENERIC_KEY_BY_STATUS[status] ?? 'generic';\n}\n\n/**\n * Título del problema en el idioma activo.\n *\n * @param {object|null} problem cuerpo RFC 9457 (puede faltar)\n * @param {number} status status HTTP; 0 si no hubo respuesta\n * @param {{translatedByServer?: boolean}} [options] false cuando el idioma de la respuesta no es el pedido\n * @returns {string}\n */\nexport function problemTitle(problem, status, {translatedByServer = true} = {}) {\n if (translatedByServer && problem?.title) {\n return problem.title;\n }\n return translateToolkit('problems', `${genericKeyOf(status)}.title`);\n}\n\n/**\n * Mensaje principal (detail) del problema en el idioma activo.\n *\n * @param {object|null} problem cuerpo RFC 9457 (puede faltar)\n * @param {number} status status HTTP; 0 si no hubo respuesta\n * @param {{translatedByServer?: boolean}} [options] false cuando el idioma de la respuesta no es el pedido\n * @returns {string}\n */\nexport function problemMessage(problem, status, {translatedByServer = true} = {}) {\n if (translatedByServer && problem?.detail) {\n return problem.detail;\n }\n return translateToolkit('problems', `${genericKeyOf(status)}.detail`);\n}\n\n/**\n * Errores por campo de un 422 de Laravel: {campo: ['mensaje', ...]}, ya traducidos por el backend.\n * Un campo anidado (\"rows.3.email\") se reduce a su último segmento que no es número, porque el formulario\n * conoce el campo y no la ruta.\n *\n * @param {object|null} problem cuerpo RFC 9457\n * @returns {Record<string, string[]>}\n */\nexport function fieldErrorsOf(problem) {\n const rawErrors = problem?.errors;\n const errorsByField = {};\n\n // guard clause: sin errores por campo (cualquier status distinto de 422)\n if (!rawErrors || typeof rawErrors !== 'object' || Array.isArray(rawErrors)) {\n return errorsByField;\n }\n\n for (const [fieldPath, messages] of Object.entries(rawErrors)) {\n const fieldName = String(fieldPath).split('.').filter((segment) => !/^\\d+$/.test(segment)).at(-1) || '_';\n const messageList = Array.isArray(messages) ? messages : [messages];\n errorsByField[fieldName] = [...(errorsByField[fieldName] ?? []), ...messageList.map(String)];\n }\n return errorsByField;\n}\n"],"names":[],"mappings":";AAiBA,MAAM,wBAAwB;AAAA,EAC1B,GAAG;AAAA,EACH,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACT;AAEA,SAAS,aAAa,QAAQ;AAC1B,SAAO,sBAAsB,MAAM,KAAK;AAC5C;AAUO,SAAS,aAAa,SAAS,QAAQ,EAAC,qBAAqB,KAAI,IAAI,IAAI;AAC5E,MAAI,sBAAsB,SAAS,OAAO;AACtC,WAAO,QAAQ;AAAA,EACnB;AACA,SAAO,iBAAiB,YAAY,GAAG,aAAa,MAAM,CAAC,QAAQ;AACvE;AAUO,SAAS,eAAe,SAAS,QAAQ,EAAC,qBAAqB,KAAI,IAAI,IAAI;AAC9E,MAAI,sBAAsB,SAAS,QAAQ;AACvC,WAAO,QAAQ;AAAA,EACnB;AACA,SAAO,iBAAiB,YAAY,GAAG,aAAa,MAAM,CAAC,SAAS;AACxE;AAUO,SAAS,cAAc,SAAS;AACnC,QAAM,YAAY,SAAS;AAC3B,QAAM,gBAAgB,CAAA;AAGtB,MAAI,CAAC,aAAa,OAAO,cAAc,YAAY,MAAM,QAAQ,SAAS,GAAG;AACzE,WAAO;AAAA,EACX;AAEA,aAAW,CAAC,WAAW,QAAQ,KAAK,OAAO,QAAQ,SAAS,GAAG;AAC3D,UAAM,YAAY,OAAO,SAAS,EAAE,MAAM,GAAG,EAAE,OAAO,CAAC,YAAY,CAAC,QAAQ,KAAK,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK;AACrG,UAAM,cAAc,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAQ;AAClE,kBAAc,SAAS,IAAI,CAAC,GAAI,cAAc,SAAS,KAAK,CAAA,GAAK,GAAG,YAAY,IAAI,MAAM,CAAC;AAAA,EAC/F;AACA,SAAO;AACX;"}
@@ -0,0 +1,34 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import Box from "@mui/material/Box";
5
+ import Button from "@mui/material/Button";
6
+ import InstallMobileRoundedIcon from "@mui/icons-material/InstallMobileRounded";
7
+ import { useToolkitTranslation } from "../toolkit/useToolkitTranslation.js";
8
+ import { INSTALL_VARIANT } from "./installInstructions.js";
9
+ import InstallInstructionsDialog from "./InstallInstructionsDialog.js";
10
+ import { useInstallPrompt } from "./useInstallPrompt.js";
11
+ import ComponentTexts from "../toolkit/ComponentTexts.js";
12
+ function InstallAppSetting({ texts } = {}) {
13
+ const { t } = useToolkitTranslation("common", texts);
14
+ const { variant, promptInstall } = useInstallPrompt();
15
+ const [stepsOpen, setStepsOpen] = useState(false);
16
+ if (!variant) {
17
+ return null;
18
+ }
19
+ const handleClick = () => {
20
+ if (variant === INSTALL_VARIANT.native) {
21
+ promptInstall();
22
+ } else {
23
+ setStepsOpen(true);
24
+ }
25
+ };
26
+ return /* @__PURE__ */ jsx(ComponentTexts, { namespace: "common", texts, children: /* @__PURE__ */ jsxs(Box, { sx: { px: 1, py: 0.5 }, children: [
27
+ /* @__PURE__ */ jsx(Button, { fullWidth: true, variant: "outlined", startIcon: /* @__PURE__ */ jsx(InstallMobileRoundedIcon, {}), onClick: handleClick, children: t("install.menuLabel") }),
28
+ /* @__PURE__ */ jsx(InstallInstructionsDialog, { variant, open: stepsOpen, onClose: () => setStepsOpen(false) })
29
+ ] }) });
30
+ }
31
+ export {
32
+ InstallAppSetting as default
33
+ };
34
+ //# sourceMappingURL=InstallAppSetting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstallAppSetting.js","sources":["../../src/pwa/InstallAppSetting.jsx"],"sourcesContent":["// «Instalar la app» dentro del menú de la cuenta (accountSettings de AppLayout): para quien dijo «Ahora no» a la invitación\n// y después sí la quiere. No respeta el «Ahora no» (aquí la persona la busca a propósito). Ya instalada o sin manera de\n// instalar en ese equipo, no pinta nada.\n//\n// El diálogo de los pasos va aquí mismo: el menú de la cuenta se queda abierto mientras se ve, y al cerrarlo se regresa al\n// menú.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useState} from 'react';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport InstallMobileRoundedIcon from '@mui/icons-material/InstallMobileRounded';\n\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport {INSTALL_VARIANT} from '@/pwa/installInstructions.js';\nimport InstallInstructionsDialog from '@/pwa/InstallInstructionsDialog.jsx';\nimport {useInstallPrompt} from '@/pwa/useInstallPrompt.js';\nimport ComponentTexts from '@/toolkit/ComponentTexts.jsx';\n\n/**\n * @param {object} [props]\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nexport default function InstallAppSetting({texts} = {}) {\n const {t} = useToolkitTranslation('common', texts);\n const {variant, promptInstall} = useInstallPrompt();\n const [stepsOpen, setStepsOpen] = useState(false);\n\n if (!variant) {\n return null;\n }\n\n const handleClick = () => {\n if (variant === INSTALL_VARIANT.native) {\n promptInstall();\n } else {\n setStepsOpen(true);\n }\n };\n\n return (\n <ComponentTexts namespace=\"common\" texts={texts}>\n <Box sx={{px: 1, py: 0.5}}>\n <Button fullWidth variant=\"outlined\" startIcon={<InstallMobileRoundedIcon />} onClick={handleClick}>\n {t('install.menuLabel')}\n </Button>\n <InstallInstructionsDialog variant={variant} open={stepsOpen} onClose={() => setStepsOpen(false)} />\n </Box>\n </ComponentTexts>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAuBA,SAAwB,kBAAkB,EAAC,MAAA,IAAS,IAAI;AACpD,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AACjD,QAAM,EAAC,SAAS,cAAA,IAAiB,iBAAA;AACjC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAEhD,MAAI,CAAC,SAAS;AACV,WAAO;AAAA,EACX;AAEA,QAAM,cAAc,MAAM;AACtB,QAAI,YAAY,gBAAgB,QAAQ;AACpC,oBAAA;AAAA,IACJ,OAAO;AACH,mBAAa,IAAI;AAAA,IACrB;AAAA,EACJ;AAEA,SACI,oBAAC,gBAAA,EAAe,WAAU,UAAS,OAC/B,UAAA,qBAAC,KAAA,EAAI,IAAI,EAAC,IAAI,GAAG,IAAI,OACjB,UAAA;AAAA,IAAA,oBAAC,QAAA,EAAO,WAAS,MAAC,SAAQ,YAAW,WAAW,oBAAC,0BAAA,CAAA,CAAyB,GAAI,SAAS,aAClF,UAAA,EAAE,mBAAmB,GAC1B;AAAA,IACA,oBAAC,6BAA0B,SAAkB,MAAM,WAAW,SAAS,MAAM,aAAa,KAAK,EAAA,CAAG;AAAA,EAAA,EAAA,CACtG,EAAA,CACJ;AAER;"}
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import { jsxs, jsx } from "react/jsx-runtime";
3
+ import Button from "@mui/material/Button";
4
+ import Dialog from "@mui/material/Dialog";
5
+ import DialogActions from "@mui/material/DialogActions";
6
+ import DialogContent from "@mui/material/DialogContent";
7
+ import DialogTitle from "@mui/material/DialogTitle";
8
+ import Typography from "@mui/material/Typography";
9
+ import { useToolkitTranslation } from "../toolkit/useToolkitTranslation.js";
10
+ import { INSTALL_VARIANT } from "./installInstructions.js";
11
+ const STEPS_BY_VARIANT = Object.freeze({
12
+ [INSTALL_VARIANT.iosModern]: ["step1", "step2", "step3", "step4"],
13
+ [INSTALL_VARIANT.iosClassic]: ["step1", "step2", "step3"],
14
+ [INSTALL_VARIANT.androidFirefox]: ["step1", "step2", "step3"]
15
+ });
16
+ function variantHasInstructions(variant) {
17
+ return Boolean(STEPS_BY_VARIANT[variant]);
18
+ }
19
+ function InstallInstructionsDialog({ variant, open, onClose, texts }) {
20
+ const { t } = useToolkitTranslation("common", texts);
21
+ const steps = STEPS_BY_VARIANT[variant];
22
+ if (!steps) {
23
+ return null;
24
+ }
25
+ return /* @__PURE__ */ jsxs(Dialog, { open, onClose, maxWidth: "xs", fullWidth: true, children: [
26
+ /* @__PURE__ */ jsx(DialogTitle, { children: t(`install.${variant}.title`) }),
27
+ /* @__PURE__ */ jsx(DialogContent, { children: /* @__PURE__ */ jsx(Typography, { component: "ol", sx: { m: 0, pl: 3, display: "grid", gap: 1.25 }, children: steps.map((step) => /* @__PURE__ */ jsx(Typography, { component: "li", variant: "body1", children: t(`install.${variant}.${step}`) }, step)) }) }),
28
+ /* @__PURE__ */ jsx(DialogActions, { children: /* @__PURE__ */ jsx(Button, { variant: "contained", onClick: onClose, children: t("install.gotIt") }) })
29
+ ] });
30
+ }
31
+ export {
32
+ InstallInstructionsDialog as default,
33
+ variantHasInstructions
34
+ };
35
+ //# sourceMappingURL=InstallInstructionsDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstallInstructionsDialog.js","sources":["../../src/pwa/InstallInstructionsDialog.jsx"],"sourcesContent":["// Los pasos para instalar la app a mano, según el equipo (iOS 26 cambió el camino; Firefox usa su propio menú). Lo usan la\n// invitación (InstallPromptBanner) y la entrada del menú de la cuenta (InstallAppSetting): los dos abren el mismo diálogo.\n// Si la variante no lleva pasos (el navegador tiene su propio diálogo, o no hay nada que ofrecer) no pinta nada.\n//\n// OJO, para quien lo monte: NO dentro de un Menu de MUI que se cierra; el Menu quita a sus hijos al cerrarse y el diálogo\n// nunca aparecería. Va junto al Menu o en un lugar que se quede pintado.\n//\n// Genérico del paquete: function (regla de la casa).\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport Typography from '@mui/material/Typography';\n\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport {INSTALL_VARIANT} from '@/pwa/installInstructions.js';\n\n// cada variante con pasos a mano → su título y sus pasos en los textos del paquete (common:install.<variante>)\nconst STEPS_BY_VARIANT = Object.freeze({\n [INSTALL_VARIANT.iosModern]: ['step1', 'step2', 'step3', 'step4'],\n [INSTALL_VARIANT.iosClassic]: ['step1', 'step2', 'step3'],\n [INSTALL_VARIANT.androidFirefox]: ['step1', 'step2', 'step3'],\n});\n\n/**\n * ¿Esta variante se instala con pasos a mano (y no con el diálogo del navegador)?\n *\n * @param {string|null} variant\n * @returns {boolean}\n */\nexport function variantHasInstructions(variant) {\n return Boolean(STEPS_BY_VARIANT[variant]);\n}\n\n/**\n * @param {object} props\n * @param {string|null} props.variant una de INSTALL_VARIANT (useInstallPrompt)\n * @param {boolean} props.open\n * @param {() => void} props.onClose\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nexport default function InstallInstructionsDialog({variant, open, onClose, texts}) {\n const {t} = useToolkitTranslation('common', texts);\n const steps = STEPS_BY_VARIANT[variant];\n if (!steps) {\n return null;\n }\n\n return (\n <Dialog open={open} onClose={onClose} maxWidth=\"xs\" fullWidth>\n <DialogTitle>{t(`install.${variant}.title`)}</DialogTitle>\n <DialogContent>\n {/* pasos numerados con palabras, sin dibujar los íconos del sistema: cambian entre versiones */}\n <Typography component=\"ol\" sx={{m: 0, pl: 3, display: 'grid', gap: 1.25}}>\n {steps.map((step) => (\n <Typography key={step} component=\"li\" variant=\"body1\">{t(`install.${variant}.${step}`)}</Typography>\n ))}\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button variant=\"contained\" onClick={onClose}>{t('install.gotIt')}</Button>\n </DialogActions>\n </Dialog>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AAmBA,MAAM,mBAAmB,OAAO,OAAO;AAAA,EACnC,CAAC,gBAAgB,SAAS,GAAG,CAAC,SAAS,SAAS,SAAS,OAAO;AAAA,EAChE,CAAC,gBAAgB,UAAU,GAAG,CAAC,SAAS,SAAS,OAAO;AAAA,EACxD,CAAC,gBAAgB,cAAc,GAAG,CAAC,SAAS,SAAS,OAAO;AAChE,CAAC;AAQM,SAAS,uBAAuB,SAAS;AAC5C,SAAO,QAAQ,iBAAiB,OAAO,CAAC;AAC5C;AASA,SAAwB,0BAA0B,EAAC,SAAS,MAAM,SAAS,SAAQ;AAC/E,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AACjD,QAAM,QAAQ,iBAAiB,OAAO;AACtC,MAAI,CAAC,OAAO;AACR,WAAO;AAAA,EACX;AAEA,8BACK,QAAA,EAAO,MAAY,SAAkB,UAAS,MAAK,WAAS,MACzD,UAAA;AAAA,IAAA,oBAAC,aAAA,EAAa,UAAA,EAAE,WAAW,OAAO,QAAQ,GAAE;AAAA,wBAC3C,eAAA,EAEG,UAAA,oBAAC,YAAA,EAAW,WAAU,MAAK,IAAI,EAAC,GAAG,GAAG,IAAI,GAAG,SAAS,QAAQ,KAAK,QAC9D,UAAA,MAAM,IAAI,CAAC,SACR,oBAAC,YAAA,EAAsB,WAAU,MAAK,SAAQ,SAAS,UAAA,EAAE,WAAW,OAAO,IAAI,IAAI,EAAE,KAApE,IAAsE,CAC1F,GACL,GACJ;AAAA,IACA,oBAAC,eAAA,EACG,UAAA,oBAAC,QAAA,EAAO,SAAQ,aAAY,SAAS,SAAU,UAAA,EAAE,eAAe,EAAA,CAAE,EAAA,CACtE;AAAA,EAAA,GACJ;AAER;"}