@stackcraftmx/calcita 0.0.0-stage → 0.23.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 (841) hide show
  1. package/LICENSE +110 -0
  2. package/README.md +611 -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 +126 -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 +55 -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 +102 -0
  43. package/cli/templates/project/src/app/AppShell.jsx.tpl +87 -0
  44. package/cli/templates/project/src/app/appRouter.jsx.tpl +49 -0
  45. package/cli/templates/project/src/app/appSettings.js.tpl +13 -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 +12 -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 +8 -0
  55. package/cli/templates/project/src/fakeServer/networkDelay.js.tpl +40 -0
  56. package/cli/templates/project/src/fakeServer/serverText.js.tpl +20 -0
  57. package/cli/templates/project/src/main.jsx.tpl +24 -0
  58. package/cli/templates/project/src/modules/auth/ForgotPasswordPage.jsx.tpl +14 -0
  59. package/cli/templates/project/src/modules/auth/ResetPasswordPage.jsx.tpl +15 -0
  60. package/cli/templates/project/src/modules/auth/SignInPage.jsx.tpl +29 -0
  61. package/cli/templates/project/src/modules/auth/authTexts.js.tpl +6 -0
  62. package/cli/templates/project/src/modules/auth/routes.js.tpl +11 -0
  63. package/cli/templates/project/src/modules/home/HomePage.jsx.tpl +38 -0
  64. package/cli/templates/project/src/modules/home/homeTexts.js.tpl +29 -0
  65. package/cli/templates/project/src/modules/home/menu.js.tpl +17 -0
  66. package/cli/templates/project/src/modules/home/routes.js.tpl +4 -0
  67. package/cli/templates/project/src/modules/profile/ProfilePage.jsx.tpl +13 -0
  68. package/cli/templates/project/src/modules/profile/routes.js.tpl +6 -0
  69. package/cli/templates/project/vite.config.js.tpl +27 -0
  70. package/dist/DataTable/AuditTrailDialog.js +40 -0
  71. package/dist/DataTable/AuditTrailDialog.js.map +1 -0
  72. package/dist/DataTable/AuditTrailTable.js +87 -0
  73. package/dist/DataTable/AuditTrailTable.js.map +1 -0
  74. package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js +71 -0
  75. package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js.map +1 -0
  76. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js +50 -0
  77. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js.map +1 -0
  78. package/dist/DataTable/ColumnFilters/SortableFilterHeader.js +54 -0
  79. package/dist/DataTable/ColumnFilters/SortableFilterHeader.js.map +1 -0
  80. package/dist/DataTable/ColumnFilters/TextColumnFilter.js +24 -0
  81. package/dist/DataTable/ColumnFilters/TextColumnFilter.js.map +1 -0
  82. package/dist/DataTable/EmptyState.js +22 -0
  83. package/dist/DataTable/EmptyState.js.map +1 -0
  84. package/dist/DataTable/FilterChips.js +39 -0
  85. package/dist/DataTable/FilterChips.js.map +1 -0
  86. package/dist/DataTable/GoToPage.js +62 -0
  87. package/dist/DataTable/GoToPage.js.map +1 -0
  88. package/dist/DataTable/ServerTable.js +407 -0
  89. package/dist/DataTable/ServerTable.js.map +1 -0
  90. package/dist/DataTable/buildChipConfig.js +27 -0
  91. package/dist/DataTable/buildChipConfig.js.map +1 -0
  92. package/dist/DataTable/columns.js +122 -0
  93. package/dist/DataTable/columns.js.map +1 -0
  94. package/dist/DataTable/filterContext.js +15 -0
  95. package/dist/DataTable/filterContext.js.map +1 -0
  96. package/dist/DataTable/serverTableParams.js +19 -0
  97. package/dist/DataTable/serverTableParams.js.map +1 -0
  98. package/dist/DataTable/tableMachine.js +87 -0
  99. package/dist/DataTable/tableMachine.js.map +1 -0
  100. package/dist/DataTable/useDebouncedFilter.js +29 -0
  101. package/dist/DataTable/useDebouncedFilter.js.map +1 -0
  102. package/dist/DataTable/useTableState.js +132 -0
  103. package/dist/DataTable/useTableState.js.map +1 -0
  104. package/dist/access/Can.js +9 -0
  105. package/dist/access/Can.js.map +1 -0
  106. package/dist/access/PermissionMatrix.js +83 -0
  107. package/dist/access/PermissionMatrix.js.map +1 -0
  108. package/dist/access/RequireAccess.js +14 -0
  109. package/dist/access/RequireAccess.js.map +1 -0
  110. package/dist/access/accessRules.js +49 -0
  111. package/dist/access/accessRules.js.map +1 -0
  112. package/dist/access/permissionGroups.js +43 -0
  113. package/dist/access/permissionGroups.js.map +1 -0
  114. package/dist/access/useCan.js +12 -0
  115. package/dist/access/useCan.js.map +1 -0
  116. package/dist/account/AccountProvider.js +58 -0
  117. package/dist/account/AccountProvider.js.map +1 -0
  118. package/dist/account/AccountSecuritySection.js +81 -0
  119. package/dist/account/AccountSecuritySection.js.map +1 -0
  120. package/dist/account/DemoTotpCodeButton.js +26 -0
  121. package/dist/account/DemoTotpCodeButton.js.map +1 -0
  122. package/dist/account/ForgotPasswordScreen.js +26 -0
  123. package/dist/account/ForgotPasswordScreen.js.map +1 -0
  124. package/dist/account/ProfileScreen.js +108 -0
  125. package/dist/account/ProfileScreen.js.map +1 -0
  126. package/dist/account/ResetPasswordScreen.js +57 -0
  127. package/dist/account/ResetPasswordScreen.js.map +1 -0
  128. package/dist/account/SignInScreen.js +101 -0
  129. package/dist/account/SignInScreen.js.map +1 -0
  130. package/dist/account/accountConnector.js +31 -0
  131. package/dist/account/accountConnector.js.map +1 -0
  132. package/dist/account/demo/createDemoAccountConnector.js +368 -0
  133. package/dist/account/demo/createDemoAccountConnector.js.map +1 -0
  134. package/dist/account/demo/totp.js +61 -0
  135. package/dist/account/demo/totp.js.map +1 -0
  136. package/dist/account/restAccountConnector.js +117 -0
  137. package/dist/account/restAccountConnector.js.map +1 -0
  138. package/dist/account-demo.js +12 -0
  139. package/dist/account-demo.js.map +1 -0
  140. package/dist/account.js +25 -0
  141. package/dist/account.js.map +1 -0
  142. package/dist/adapters/i18next.js +7 -0
  143. package/dist/adapters/i18next.js.map +1 -0
  144. package/dist/adapters/nextNavigation.js +36 -0
  145. package/dist/adapters/nextNavigation.js.map +1 -0
  146. package/dist/adapters/reactRouter.js +7 -0
  147. package/dist/adapters/reactRouter.js.map +1 -0
  148. package/dist/adapters/reactRouterRoutes.js +48 -0
  149. package/dist/adapters/reactRouterRoutes.js.map +1 -0
  150. package/dist/api/ApiError.js +58 -0
  151. package/dist/api/ApiError.js.map +1 -0
  152. package/dist/api/createApiClient.js +226 -0
  153. package/dist/api/createApiClient.js.map +1 -0
  154. package/dist/api/staleChunks.js +47 -0
  155. package/dist/api/staleChunks.js.map +1 -0
  156. package/dist/appShell/AccountMenu.js +86 -0
  157. package/dist/appShell/AccountMenu.js.map +1 -0
  158. package/dist/appShell/AppLayout.js +493 -0
  159. package/dist/appShell/AppLayout.js.map +1 -0
  160. package/dist/appShell/AppearanceSettings.js +93 -0
  161. package/dist/appShell/AppearanceSettings.js.map +1 -0
  162. package/dist/appShell/AuthLayout.js +44 -0
  163. package/dist/appShell/AuthLayout.js.map +1 -0
  164. package/dist/appShell/BarActionButton.js +31 -0
  165. package/dist/appShell/BarActionButton.js.map +1 -0
  166. package/dist/appShell/BarActions.js +94 -0
  167. package/dist/appShell/BarActions.js.map +1 -0
  168. package/dist/appShell/BarCapsule.js +35 -0
  169. package/dist/appShell/BarCapsule.js.map +1 -0
  170. package/dist/appShell/HeaderTools.js +53 -0
  171. package/dist/appShell/HeaderTools.js.map +1 -0
  172. package/dist/appShell/MobileTabBar.js +346 -0
  173. package/dist/appShell/MobileTabBar.js.map +1 -0
  174. package/dist/appShell/SettingsMenu.js +41 -0
  175. package/dist/appShell/SettingsMenu.js.map +1 -0
  176. package/dist/appShell/SideMenu.js +217 -0
  177. package/dist/appShell/SideMenu.js.map +1 -0
  178. package/dist/appShell/SideMenuEntry.js +140 -0
  179. package/dist/appShell/SideMenuEntry.js.map +1 -0
  180. package/dist/appShell/SubmenuActionsMenu.js +71 -0
  181. package/dist/appShell/SubmenuActionsMenu.js.map +1 -0
  182. package/dist/appShell/TabBarEditor.js +55 -0
  183. package/dist/appShell/TabBarEditor.js.map +1 -0
  184. package/dist/appShell/TopMenu.js +80 -0
  185. package/dist/appShell/TopMenu.js.map +1 -0
  186. package/dist/appShell/appMenuContext.js +11 -0
  187. package/dist/appShell/appMenuContext.js.map +1 -0
  188. package/dist/appShell/barActionsSlot.js +26 -0
  189. package/dist/appShell/barActionsSlot.js.map +1 -0
  190. package/dist/appShell/barMenuPlacement.js +33 -0
  191. package/dist/appShell/barMenuPlacement.js.map +1 -0
  192. package/dist/appShell/menuItemText.js +33 -0
  193. package/dist/appShell/menuItemText.js.map +1 -0
  194. package/dist/appShell/pageTitle.js +45 -0
  195. package/dist/appShell/pageTitle.js.map +1 -0
  196. package/dist/appShell/shellSizes.js +38 -0
  197. package/dist/appShell/shellSizes.js.map +1 -0
  198. package/dist/appShell/tabBarRule.js +12 -0
  199. package/dist/appShell/tabBarRule.js.map +1 -0
  200. package/dist/appShell/tabBarScroll.js +23 -0
  201. package/dist/appShell/tabBarScroll.js.map +1 -0
  202. package/dist/appShell/useDrawerCollapsed.js +29 -0
  203. package/dist/appShell/useDrawerCollapsed.js.map +1 -0
  204. package/dist/appShell/useFittingActionCount.js +45 -0
  205. package/dist/appShell/useFittingActionCount.js.map +1 -0
  206. package/dist/appShell/usePinnedMobileTabs.js +32 -0
  207. package/dist/appShell/usePinnedMobileTabs.js.map +1 -0
  208. package/dist/appShell/useTabBarMinimized.js +33 -0
  209. package/dist/appShell/useTabBarMinimized.js.map +1 -0
  210. package/dist/auth/PasswordChecklist.js +44 -0
  211. package/dist/auth/PasswordChecklist.js.map +1 -0
  212. package/dist/auth/passwordRules.js +43 -0
  213. package/dist/auth/passwordRules.js.map +1 -0
  214. package/dist/calendar/EventCalendar.js +138 -0
  215. package/dist/calendar/EventCalendar.js.map +1 -0
  216. package/dist/calendar.js +6 -0
  217. package/dist/calendar.js.map +1 -0
  218. package/dist/charts.js +7 -0
  219. package/dist/charts.js.map +1 -0
  220. package/dist/date-pickers.js +8 -0
  221. package/dist/date-pickers.js.map +1 -0
  222. package/dist/datePickers/DateInput.js +75 -0
  223. package/dist/datePickers/DateInput.js.map +1 -0
  224. package/dist/datePickers/FormDateField.js +12 -0
  225. package/dist/datePickers/FormDateField.js.map +1 -0
  226. package/dist/dates.js +25 -0
  227. package/dist/dates.js.map +1 -0
  228. package/dist/dictionaries/dictionaries.js +48 -0
  229. package/dist/dictionaries/dictionaries.js.map +1 -0
  230. package/dist/downloads/DownloadManager.js +201 -0
  231. package/dist/downloads/DownloadManager.js.map +1 -0
  232. package/dist/downloads/downloadQueue.js +54 -0
  233. package/dist/downloads/downloadQueue.js.map +1 -0
  234. package/dist/downloads/downloadsMachine.js +77 -0
  235. package/dist/downloads/downloadsMachine.js.map +1 -0
  236. package/dist/excel/reportWorkbook.js +299 -0
  237. package/dist/excel/reportWorkbook.js.map +1 -0
  238. package/dist/excel.js +13 -0
  239. package/dist/excel.js.map +1 -0
  240. package/dist/feedback/ConfirmDialog.js +72 -0
  241. package/dist/feedback/ConfirmDialog.js.map +1 -0
  242. package/dist/feedback/ModalWaiting.js +23 -0
  243. package/dist/feedback/ModalWaiting.js.map +1 -0
  244. package/dist/feedback/NewBuildNotice.js +79 -0
  245. package/dist/feedback/NewBuildNotice.js.map +1 -0
  246. package/dist/feedback/StaleBuildBoundary.js +36 -0
  247. package/dist/feedback/StaleBuildBoundary.js.map +1 -0
  248. package/dist/feedback/Toaster.js +20 -0
  249. package/dist/feedback/Toaster.js.map +1 -0
  250. package/dist/feedback/confirmActionMachine.js +67 -0
  251. package/dist/feedback/confirmActionMachine.js.map +1 -0
  252. package/dist/feedback/toast.js +88 -0
  253. package/dist/feedback/toast.js.map +1 -0
  254. package/dist/feedback/useConfirmAction.js +40 -0
  255. package/dist/feedback/useConfirmAction.js.map +1 -0
  256. package/dist/filepond/FileDropzone.js +254 -0
  257. package/dist/filepond/FileDropzone.js.map +1 -0
  258. package/dist/filepond/pondServer.js +48 -0
  259. package/dist/filepond/pondServer.js.map +1 -0
  260. package/dist/filepond.js +10 -0
  261. package/dist/filepond.js.map +1 -0
  262. package/dist/files.js +43 -0
  263. package/dist/files.js.map +1 -0
  264. package/dist/formatting.js +177 -0
  265. package/dist/formatting.js.map +1 -0
  266. package/dist/forms/FormCatalogField.js +12 -0
  267. package/dist/forms/FormCatalogField.js.map +1 -0
  268. package/dist/forms/FormColorField.js +12 -0
  269. package/dist/forms/FormColorField.js.map +1 -0
  270. package/dist/forms/FormNumberField.js +12 -0
  271. package/dist/forms/FormNumberField.js.map +1 -0
  272. package/dist/forms/FormProblemAlert.js +15 -0
  273. package/dist/forms/FormProblemAlert.js.map +1 -0
  274. package/dist/forms/FormSelectField.js +12 -0
  275. package/dist/forms/FormSelectField.js.map +1 -0
  276. package/dist/forms/FormServerProblem.js +23 -0
  277. package/dist/forms/FormServerProblem.js.map +1 -0
  278. package/dist/forms/FormTextField.js +12 -0
  279. package/dist/forms/FormTextField.js.map +1 -0
  280. package/dist/forms/FormWizard.js +90 -0
  281. package/dist/forms/FormWizard.js.map +1 -0
  282. package/dist/forms/SubmitButton.js +14 -0
  283. package/dist/forms/SubmitButton.js.map +1 -0
  284. package/dist/forms/applyServerProblem.js +15 -0
  285. package/dist/forms/applyServerProblem.js.map +1 -0
  286. package/dist/forms/auth/ChangePasswordForm.js +46 -0
  287. package/dist/forms/auth/ChangePasswordForm.js.map +1 -0
  288. package/dist/forms/auth/ForgotPasswordForm.js +50 -0
  289. package/dist/forms/auth/ForgotPasswordForm.js.map +1 -0
  290. package/dist/forms/auth/SignInForm.js +48 -0
  291. package/dist/forms/auth/SignInForm.js.map +1 -0
  292. package/dist/forms/security/SecondStepForm.js +122 -0
  293. package/dist/forms/security/SecondStepForm.js.map +1 -0
  294. package/dist/forms/security/TwoStepVerificationCard.js +336 -0
  295. package/dist/forms/security/TwoStepVerificationCard.js.map +1 -0
  296. package/dist/forms/security/securityRules.js +28 -0
  297. package/dist/forms/security/securityRules.js.map +1 -0
  298. package/dist/forms/serverProblemFields.js +25 -0
  299. package/dist/forms/serverProblemFields.js.map +1 -0
  300. package/dist/forms/useFormikField.js +16 -0
  301. package/dist/forms/useFormikField.js.map +1 -0
  302. package/dist/forms/validation.js +55 -0
  303. package/dist/forms/validation.js.map +1 -0
  304. package/dist/forms/validationMessages.js +16 -0
  305. package/dist/forms/validationMessages.js.map +1 -0
  306. package/dist/forms.js +57 -0
  307. package/dist/forms.js.map +1 -0
  308. package/dist/hookForm/FormCatalogField.js +12 -0
  309. package/dist/hookForm/FormCatalogField.js.map +1 -0
  310. package/dist/hookForm/FormColorField.js +12 -0
  311. package/dist/hookForm/FormColorField.js.map +1 -0
  312. package/dist/hookForm/FormNumberField.js +12 -0
  313. package/dist/hookForm/FormNumberField.js.map +1 -0
  314. package/dist/hookForm/FormProblemAlert.js +17 -0
  315. package/dist/hookForm/FormProblemAlert.js.map +1 -0
  316. package/dist/hookForm/FormSelectField.js +12 -0
  317. package/dist/hookForm/FormSelectField.js.map +1 -0
  318. package/dist/hookForm/FormTextField.js +12 -0
  319. package/dist/hookForm/FormTextField.js.map +1 -0
  320. package/dist/hookForm/SubmitButton.js +15 -0
  321. package/dist/hookForm/SubmitButton.js.map +1 -0
  322. package/dist/hookForm/applyServerProblem.js +21 -0
  323. package/dist/hookForm/applyServerProblem.js.map +1 -0
  324. package/dist/hookForm/useHookFormField.js +19 -0
  325. package/dist/hookForm/useHookFormField.js.map +1 -0
  326. package/dist/i18next.js +5 -0
  327. package/dist/i18next.js.map +1 -0
  328. package/dist/identifiers.js +8 -0
  329. package/dist/identifiers.js.map +1 -0
  330. package/dist/inbox/InboxLayout.js +68 -0
  331. package/dist/inbox/InboxLayout.js.map +1 -0
  332. package/dist/inbox/MessageList.js +64 -0
  333. package/dist/inbox/MessageList.js.map +1 -0
  334. package/dist/inbox/MessageView.js +53 -0
  335. package/dist/inbox/MessageView.js.map +1 -0
  336. package/dist/inbox/inboxDates.js +8 -0
  337. package/dist/inbox/inboxDates.js.map +1 -0
  338. package/dist/index.js +383 -0
  339. package/dist/index.js.map +1 -0
  340. package/dist/inputs/CatalogInput.js +62 -0
  341. package/dist/inputs/CatalogInput.js.map +1 -0
  342. package/dist/inputs/ColorInput.js +108 -0
  343. package/dist/inputs/ColorInput.js.map +1 -0
  344. package/dist/inputs/FieldFrame.js +20 -0
  345. package/dist/inputs/FieldFrame.js.map +1 -0
  346. package/dist/inputs/FormSection.js +105 -0
  347. package/dist/inputs/FormSection.js.map +1 -0
  348. package/dist/inputs/NumberInput.js +69 -0
  349. package/dist/inputs/NumberInput.js.map +1 -0
  350. package/dist/inputs/SelectInput.js +66 -0
  351. package/dist/inputs/SelectInput.js.map +1 -0
  352. package/dist/inputs/TextInput.js +97 -0
  353. package/dist/inputs/TextInput.js.map +1 -0
  354. package/dist/inputs/colorContrast.js +46 -0
  355. package/dist/inputs/colorContrast.js.map +1 -0
  356. package/dist/inputs/formLayoutContext.js +9 -0
  357. package/dist/inputs/formLayoutContext.js.map +1 -0
  358. package/dist/inputs/numberText.js +48 -0
  359. package/dist/inputs/numberText.js.map +1 -0
  360. package/dist/kanban/KanbanBoard.js +113 -0
  361. package/dist/kanban/KanbanBoard.js.map +1 -0
  362. package/dist/kanban/kanbanMoves.js +29 -0
  363. package/dist/kanban/kanbanMoves.js.map +1 -0
  364. package/dist/kanban.js +9 -0
  365. package/dist/kanban.js.map +1 -0
  366. package/dist/laravel/csrfRetry.js +18 -0
  367. package/dist/laravel/csrfRetry.js.map +1 -0
  368. package/dist/laravel.js +6 -0
  369. package/dist/laravel.js.map +1 -0
  370. package/dist/lastListUrl.js +35 -0
  371. package/dist/lastListUrl.js.map +1 -0
  372. package/dist/locales/en.js +714 -0
  373. package/dist/locales/en.js.map +1 -0
  374. package/dist/locales/es.js +714 -0
  375. package/dist/locales/es.js.map +1 -0
  376. package/dist/maps/MapView.js +96 -0
  377. package/dist/maps/MapView.js.map +1 -0
  378. package/dist/maps/mapMarkers.js +19 -0
  379. package/dist/maps/mapMarkers.js.map +1 -0
  380. package/dist/maps.js +10 -0
  381. package/dist/maps.js.map +1 -0
  382. package/dist/money/money.js +380 -0
  383. package/dist/money/money.js.map +1 -0
  384. package/dist/money.js +6 -0
  385. package/dist/money.js.map +1 -0
  386. package/dist/navigation/appMenu.js +93 -0
  387. package/dist/navigation/appMenu.js.map +1 -0
  388. package/dist/navigation/useMenuBadges.js +45 -0
  389. package/dist/navigation/useMenuBadges.js.map +1 -0
  390. package/dist/navigation.js +30 -0
  391. package/dist/navigation.js.map +1 -0
  392. package/dist/navigationTrail.js +82 -0
  393. package/dist/navigationTrail.js.map +1 -0
  394. package/dist/next.js +5 -0
  395. package/dist/next.js.map +1 -0
  396. package/dist/observability/buildWatch.js +19 -0
  397. package/dist/observability/buildWatch.js.map +1 -0
  398. package/dist/observability/logger.js +43 -0
  399. package/dist/observability/logger.js.map +1 -0
  400. package/dist/observability/publishedBuild.js +39 -0
  401. package/dist/observability/publishedBuild.js.map +1 -0
  402. package/dist/observability/usePublishedBuildWatch.js +76 -0
  403. package/dist/observability/usePublishedBuildWatch.js.map +1 -0
  404. package/dist/passkeys.js +7 -0
  405. package/dist/passkeys.js.map +1 -0
  406. package/dist/periodRanges.js +33 -0
  407. package/dist/periodRanges.js.map +1 -0
  408. package/dist/problems.js +51 -0
  409. package/dist/problems.js.map +1 -0
  410. package/dist/pwa/InstallAppSetting.js +33 -0
  411. package/dist/pwa/InstallAppSetting.js.map +1 -0
  412. package/dist/pwa/InstallInstructionsDialog.js +35 -0
  413. package/dist/pwa/InstallInstructionsDialog.js.map +1 -0
  414. package/dist/pwa/InstallPromptBanner.js +64 -0
  415. package/dist/pwa/InstallPromptBanner.js.map +1 -0
  416. package/dist/pwa/installInstructions.js +60 -0
  417. package/dist/pwa/installInstructions.js.map +1 -0
  418. package/dist/pwa/useInstallPrompt.js +70 -0
  419. package/dist/pwa/useInstallPrompt.js.map +1 -0
  420. package/dist/react-hook-form.js +30 -0
  421. package/dist/react-hook-form.js.map +1 -0
  422. package/dist/react-router.js +10 -0
  423. package/dist/react-router.js.map +1 -0
  424. package/dist/security/ActivityLog.js +79 -0
  425. package/dist/security/ActivityLog.js.map +1 -0
  426. package/dist/security/RecoveryCodesDialog.js +84 -0
  427. package/dist/security/RecoveryCodesDialog.js.map +1 -0
  428. package/dist/security/SessionsCard.js +81 -0
  429. package/dist/security/SessionsCard.js.map +1 -0
  430. package/dist/security/passkeys.js +39 -0
  431. package/dist/security/passkeys.js.map +1 -0
  432. package/dist/table.js +35 -0
  433. package/dist/table.js.map +1 -0
  434. package/dist/theme/androidDevice.js +16 -0
  435. package/dist/theme/androidDevice.js.map +1 -0
  436. package/dist/theme/appleTracking.js +34 -0
  437. package/dist/theme/appleTracking.js.map +1 -0
  438. package/dist/theme/components/MuiAppBar.js +27 -0
  439. package/dist/theme/components/MuiAppBar.js.map +1 -0
  440. package/dist/theme/components/MuiBackdrop.js +13 -0
  441. package/dist/theme/components/MuiBackdrop.js.map +1 -0
  442. package/dist/theme/components/MuiButton.js +25 -0
  443. package/dist/theme/components/MuiButton.js.map +1 -0
  444. package/dist/theme/components/MuiButtonBase.js +16 -0
  445. package/dist/theme/components/MuiButtonBase.js.map +1 -0
  446. package/dist/theme/components/MuiChip.js +30 -0
  447. package/dist/theme/components/MuiChip.js.map +1 -0
  448. package/dist/theme/components/MuiDataGrid.js +30 -0
  449. package/dist/theme/components/MuiDataGrid.js.map +1 -0
  450. package/dist/theme/components/MuiDrawer.js +18 -0
  451. package/dist/theme/components/MuiDrawer.js.map +1 -0
  452. package/dist/theme/components/MuiMenuItem.js +17 -0
  453. package/dist/theme/components/MuiMenuItem.js.map +1 -0
  454. package/dist/theme/components/MuiTypography.js +22 -0
  455. package/dist/theme/components/MuiTypography.js.map +1 -0
  456. package/dist/theme/components/glassComponents.js +885 -0
  457. package/dist/theme/components/glassComponents.js.map +1 -0
  458. package/dist/theme/components/minimalComponents.js +146 -0
  459. package/dist/theme/components/minimalComponents.js.map +1 -0
  460. package/dist/theme/components/paletteOf.js +7 -0
  461. package/dist/theme/components/paletteOf.js.map +1 -0
  462. package/dist/theme/createToolkitTheme.js +100 -0
  463. package/dist/theme/createToolkitTheme.js.map +1 -0
  464. package/dist/theme/glassSurface.js +328 -0
  465. package/dist/theme/glassSurface.js.map +1 -0
  466. package/dist/theme/glassToasterStyles.js +50 -0
  467. package/dist/theme/glassToasterStyles.js.map +1 -0
  468. package/dist/theme/mergeComponents.js +42 -0
  469. package/dist/theme/mergeComponents.js.map +1 -0
  470. package/dist/theme/stackcraftPalette.js +59 -0
  471. package/dist/theme/stackcraftPalette.js.map +1 -0
  472. package/dist/theme/toolkitComponents.js +26 -0
  473. package/dist/theme/toolkitComponents.js.map +1 -0
  474. package/dist/timeline.js +8 -0
  475. package/dist/timeline.js.map +1 -0
  476. package/dist/toolkit/ToolkitProvider.js +49 -0
  477. package/dist/toolkit/ToolkitProvider.js.map +1 -0
  478. package/dist/toolkit/browserNavigation.js +34 -0
  479. package/dist/toolkit/browserNavigation.js.map +1 -0
  480. package/dist/toolkit/toolkitContext.js +19 -0
  481. package/dist/toolkit/toolkitContext.js.map +1 -0
  482. package/dist/toolkit/toolkitSettings.js +87 -0
  483. package/dist/toolkit/toolkitSettings.js.map +1 -0
  484. package/dist/toolkit/useToolkitTranslation.js +18 -0
  485. package/dist/toolkit/useToolkitTranslation.js.map +1 -0
  486. package/dist/types/DataTable/AuditTrailDialog.d.ts +32 -0
  487. package/dist/types/DataTable/AuditTrailTable.d.ts +28 -0
  488. package/dist/types/DataTable/ColumnFilters/HeaderFilterPopover.d.ts +8 -0
  489. package/dist/types/DataTable/ColumnFilters/MultiSelectColumnFilter.d.ts +16 -0
  490. package/dist/types/DataTable/ColumnFilters/SortableFilterHeader.d.ts +26 -0
  491. package/dist/types/DataTable/ColumnFilters/TextColumnFilter.d.ts +8 -0
  492. package/dist/types/DataTable/ColumnFilters/index.d.ts +4 -0
  493. package/dist/types/DataTable/EmptyState.d.ts +8 -0
  494. package/dist/types/DataTable/FilterChips.d.ts +15 -0
  495. package/dist/types/DataTable/GoToPage.d.ts +8 -0
  496. package/dist/types/DataTable/ServerTable.d.ts +110 -0
  497. package/dist/types/DataTable/buildChipConfig.d.ts +22 -0
  498. package/dist/types/DataTable/columns.d.ts +93 -0
  499. package/dist/types/DataTable/filterContext.d.ts +13 -0
  500. package/dist/types/DataTable/index.d.ts +13 -0
  501. package/dist/types/DataTable/serverTableParams.d.ts +16 -0
  502. package/dist/types/DataTable/tableMachine.d.ts +41 -0
  503. package/dist/types/DataTable/useDebouncedFilter.d.ts +8 -0
  504. package/dist/types/DataTable/useTableState.d.ts +93 -0
  505. package/dist/types/access/Can.d.ts +11 -0
  506. package/dist/types/access/PermissionMatrix.d.ts +21 -0
  507. package/dist/types/access/RequireAccess.d.ts +11 -0
  508. package/dist/types/access/accessRules.d.ts +24 -0
  509. package/dist/types/access/permissionGroups.d.ts +56 -0
  510. package/dist/types/access/useCan.d.ts +11 -0
  511. package/dist/types/account/AccountProvider.d.ts +27 -0
  512. package/dist/types/account/AccountSecuritySection.d.ts +7 -0
  513. package/dist/types/account/DemoTotpCodeButton.d.ts +6 -0
  514. package/dist/types/account/ForgotPasswordScreen.d.ts +15 -0
  515. package/dist/types/account/ProfileScreen.d.ts +13 -0
  516. package/dist/types/account/ResetPasswordScreen.d.ts +19 -0
  517. package/dist/types/account/SignInScreen.d.ts +25 -0
  518. package/dist/types/account/accountConnector.d.ts +263 -0
  519. package/dist/types/account/demo/createDemoAccountConnector.d.ts +30 -0
  520. package/dist/types/account/demo/totp.d.ts +45 -0
  521. package/dist/types/account/restAccountConnector.d.ts +49 -0
  522. package/dist/types/account-demo.d.ts +2 -0
  523. package/dist/types/account.d.ts +16 -0
  524. package/dist/types/adapters/i18next.d.ts +11 -0
  525. package/dist/types/adapters/nextNavigation.d.ts +33 -0
  526. package/dist/types/adapters/reactRouter.d.ts +6 -0
  527. package/dist/types/adapters/reactRouterRoutes.d.ts +30 -0
  528. package/dist/types/api/ApiError.d.ts +42 -0
  529. package/dist/types/api/createApiClient.d.ts +146 -0
  530. package/dist/types/api/staleChunks.d.ts +15 -0
  531. package/dist/types/appShell/AccountMenu.d.ts +28 -0
  532. package/dist/types/appShell/AppLayout.d.ts +66 -0
  533. package/dist/types/appShell/AppearanceSettings.d.ts +34 -0
  534. package/dist/types/appShell/AuthLayout.d.ts +21 -0
  535. package/dist/types/appShell/BarActionButton.d.ts +15 -0
  536. package/dist/types/appShell/BarActions.d.ts +18 -0
  537. package/dist/types/appShell/BarCapsule.d.ts +12 -0
  538. package/dist/types/appShell/HeaderTools.d.ts +27 -0
  539. package/dist/types/appShell/MobileTabBar.d.ts +17 -0
  540. package/dist/types/appShell/SettingsMenu.d.ts +13 -0
  541. package/dist/types/appShell/SideMenu.d.ts +31 -0
  542. package/dist/types/appShell/SideMenuEntry.d.ts +17 -0
  543. package/dist/types/appShell/SubmenuActionsMenu.d.ts +24 -0
  544. package/dist/types/appShell/TabBarEditor.d.ts +13 -0
  545. package/dist/types/appShell/TopMenu.d.ts +7 -0
  546. package/dist/types/appShell/appMenuContext.d.ts +9 -0
  547. package/dist/types/appShell/barActionsSlot.d.ts +35 -0
  548. package/dist/types/appShell/barMenuPlacement.d.ts +9 -0
  549. package/dist/types/appShell/menuItemText.d.ts +55 -0
  550. package/dist/types/appShell/pageTitle.d.ts +26 -0
  551. package/dist/types/appShell/shellSizes.d.ts +45 -0
  552. package/dist/types/appShell/tabBarRule.d.ts +5 -0
  553. package/dist/types/appShell/tabBarScroll.d.ts +26 -0
  554. package/dist/types/appShell/useDrawerCollapsed.d.ts +8 -0
  555. package/dist/types/appShell/useFittingActionCount.d.ts +7 -0
  556. package/dist/types/appShell/usePinnedMobileTabs.d.ts +7 -0
  557. package/dist/types/appShell/useTabBarMinimized.d.ts +8 -0
  558. package/dist/types/auth/PasswordChecklist.d.ts +11 -0
  559. package/dist/types/auth/passwordRules.d.ts +34 -0
  560. package/dist/types/calendar/EventCalendar.d.ts +46 -0
  561. package/dist/types/calendar.d.ts +1 -0
  562. package/dist/types/charts.d.ts +2 -0
  563. package/dist/types/date-pickers.d.ts +2 -0
  564. package/dist/types/datePickers/DateInput.d.ts +39 -0
  565. package/dist/types/datePickers/FormDateField.d.ts +7 -0
  566. package/dist/types/dates.d.ts +18 -0
  567. package/dist/types/dictionaries/dictionaries.d.ts +54 -0
  568. package/dist/types/downloads/DownloadManager.d.ts +1 -0
  569. package/dist/types/downloads/downloadQueue.d.ts +45 -0
  570. package/dist/types/downloads/downloadsMachine.d.ts +10 -0
  571. package/dist/types/downloads/index.d.ts +3 -0
  572. package/dist/types/excel/reportWorkbook.d.ts +157 -0
  573. package/dist/types/excel.d.ts +1 -0
  574. package/dist/types/feedback/ConfirmDialog.d.ts +29 -0
  575. package/dist/types/feedback/ModalWaiting.d.ts +8 -0
  576. package/dist/types/feedback/NewBuildNotice.d.ts +18 -0
  577. package/dist/types/feedback/StaleBuildBoundary.d.ts +21 -0
  578. package/dist/types/feedback/Toaster.d.ts +1 -0
  579. package/dist/types/feedback/confirmActionMachine.d.ts +19 -0
  580. package/dist/types/feedback/index.d.ts +8 -0
  581. package/dist/types/feedback/toast.d.ts +100 -0
  582. package/dist/types/feedback/useConfirmAction.d.ts +33 -0
  583. package/dist/types/filepond/FileDropzone.d.ts +59 -0
  584. package/dist/types/filepond/pondServer.d.ts +17 -0
  585. package/dist/types/filepond.d.ts +3 -0
  586. package/dist/types/files.d.ts +29 -0
  587. package/dist/types/formatting.d.ts +106 -0
  588. package/dist/types/forms/FormCatalogField.d.ts +6 -0
  589. package/dist/types/forms/FormColorField.d.ts +6 -0
  590. package/dist/types/forms/FormNumberField.d.ts +6 -0
  591. package/dist/types/forms/FormProblemAlert.d.ts +6 -0
  592. package/dist/types/forms/FormSelectField.d.ts +6 -0
  593. package/dist/types/forms/FormServerProblem.d.ts +8 -0
  594. package/dist/types/forms/FormTextField.d.ts +6 -0
  595. package/dist/types/forms/FormWizard.d.ts +20 -0
  596. package/dist/types/forms/SubmitButton.d.ts +9 -0
  597. package/dist/types/forms/applyServerProblem.d.ts +9 -0
  598. package/dist/types/forms/auth/ChangePasswordForm.d.ts +15 -0
  599. package/dist/types/forms/auth/ForgotPasswordForm.d.ts +12 -0
  600. package/dist/types/forms/auth/SignInForm.d.ts +18 -0
  601. package/dist/types/forms/index.d.ts +19 -0
  602. package/dist/types/forms/security/SecondStepForm.d.ts +28 -0
  603. package/dist/types/forms/security/TwoStepVerificationCard.d.ts +81 -0
  604. package/dist/types/forms/security/securityRules.d.ts +24 -0
  605. package/dist/types/forms/serverProblemFields.d.ts +19 -0
  606. package/dist/types/forms/useFormikField.d.ts +11 -0
  607. package/dist/types/forms/validation.d.ts +251 -0
  608. package/dist/types/forms/validationMessages.d.ts +12 -0
  609. package/dist/types/forms.d.ts +2 -0
  610. package/dist/types/hookForm/FormCatalogField.d.ts +8 -0
  611. package/dist/types/hookForm/FormColorField.d.ts +8 -0
  612. package/dist/types/hookForm/FormNumberField.d.ts +8 -0
  613. package/dist/types/hookForm/FormProblemAlert.d.ts +7 -0
  614. package/dist/types/hookForm/FormSelectField.d.ts +8 -0
  615. package/dist/types/hookForm/FormTextField.d.ts +8 -0
  616. package/dist/types/hookForm/SubmitButton.d.ts +21 -0
  617. package/dist/types/hookForm/applyServerProblem.d.ts +10 -0
  618. package/dist/types/hookForm/useHookFormField.d.ts +13 -0
  619. package/dist/types/i18next.d.ts +1 -0
  620. package/dist/types/identifiers.d.ts +2 -0
  621. package/dist/types/inbox/InboxLayout.d.ts +26 -0
  622. package/dist/types/inbox/MessageList.d.ts +27 -0
  623. package/dist/types/inbox/MessageView.d.ts +23 -0
  624. package/dist/types/inbox/inboxDates.d.ts +6 -0
  625. package/dist/types/index.d.ts +84 -0
  626. package/dist/types/inputs/CatalogInput.d.ts +41 -0
  627. package/dist/types/inputs/ColorInput.d.ts +28 -0
  628. package/dist/types/inputs/FieldFrame.d.ts +14 -0
  629. package/dist/types/inputs/FormSection.d.ts +29 -0
  630. package/dist/types/inputs/NumberInput.d.ts +36 -0
  631. package/dist/types/inputs/SelectInput.d.ts +34 -0
  632. package/dist/types/inputs/TextInput.d.ts +60 -0
  633. package/dist/types/inputs/colorContrast.d.ts +18 -0
  634. package/dist/types/inputs/formLayoutContext.d.ts +3 -0
  635. package/dist/types/inputs/numberText.d.ts +25 -0
  636. package/dist/types/kanban/KanbanBoard.d.ts +33 -0
  637. package/dist/types/kanban/kanbanMoves.d.ts +38 -0
  638. package/dist/types/kanban.d.ts +2 -0
  639. package/dist/types/laravel/csrfRetry.d.ts +21 -0
  640. package/dist/types/laravel.d.ts +1 -0
  641. package/dist/types/lastListUrl.d.ts +20 -0
  642. package/dist/types/locales/en.d.ts +711 -0
  643. package/dist/types/locales/es.d.ts +711 -0
  644. package/dist/types/maps/MapView.d.ts +32 -0
  645. package/dist/types/maps/mapMarkers.d.ts +23 -0
  646. package/dist/types/maps.d.ts +2 -0
  647. package/dist/types/money/money.d.ts +203 -0
  648. package/dist/types/money.d.ts +1 -0
  649. package/dist/types/navigation/appMenu.d.ts +92 -0
  650. package/dist/types/navigation/useMenuBadges.d.ts +16 -0
  651. package/dist/types/navigation.d.ts +22 -0
  652. package/dist/types/navigationTrail.d.ts +49 -0
  653. package/dist/types/next.d.ts +1 -0
  654. package/dist/types/observability/buildWatch.d.ts +28 -0
  655. package/dist/types/observability/logger.d.ts +19 -0
  656. package/dist/types/observability/publishedBuild.d.ts +35 -0
  657. package/dist/types/observability/usePublishedBuildWatch.d.ts +16 -0
  658. package/dist/types/passkeys.d.ts +1 -0
  659. package/dist/types/periodRanges.d.ts +32 -0
  660. package/dist/types/problems.d.ts +31 -0
  661. package/dist/types/pwa/InstallAppSetting.d.ts +1 -0
  662. package/dist/types/pwa/InstallInstructionsDialog.d.ts +18 -0
  663. package/dist/types/pwa/InstallPromptBanner.d.ts +7 -0
  664. package/dist/types/pwa/installInstructions.d.ts +52 -0
  665. package/dist/types/pwa/useInstallPrompt.d.ts +12 -0
  666. package/dist/types/react-hook-form.d.ts +11 -0
  667. package/dist/types/react-router.d.ts +2 -0
  668. package/dist/types/security/ActivityLog.d.ts +31 -0
  669. package/dist/types/security/RecoveryCodesDialog.d.ts +11 -0
  670. package/dist/types/security/SessionsCard.d.ts +22 -0
  671. package/dist/types/security/passkeys.d.ts +18 -0
  672. package/dist/types/table.d.ts +1 -0
  673. package/dist/types/theme/androidDevice.d.ts +11 -0
  674. package/dist/types/theme/appleTracking.d.ts +17 -0
  675. package/dist/types/theme/components/MuiAppBar.d.ts +13 -0
  676. package/dist/types/theme/components/MuiBackdrop.d.ts +11 -0
  677. package/dist/types/theme/components/MuiButton.d.ts +27 -0
  678. package/dist/types/theme/components/MuiButtonBase.d.ts +14 -0
  679. package/dist/types/theme/components/MuiChip.d.ts +29 -0
  680. package/dist/types/theme/components/MuiDataGrid.d.ts +45 -0
  681. package/dist/types/theme/components/MuiDrawer.d.ts +13 -0
  682. package/dist/types/theme/components/MuiMenuItem.d.ts +17 -0
  683. package/dist/types/theme/components/MuiTypography.d.ts +20 -0
  684. package/dist/types/theme/components/glassComponents.d.ts +8 -0
  685. package/dist/types/theme/components/minimalComponents.d.ts +22 -0
  686. package/dist/types/theme/components/paletteOf.d.ts +5 -0
  687. package/dist/types/theme/createToolkitTheme.d.ts +48 -0
  688. package/dist/types/theme/glassSurface.d.ts +247 -0
  689. package/dist/types/theme/glassToasterStyles.d.ts +7 -0
  690. package/dist/types/theme/mergeComponents.d.ts +15 -0
  691. package/dist/types/theme/stackcraftPalette.d.ts +142 -0
  692. package/dist/types/theme/toolkitComponents.d.ts +4 -0
  693. package/dist/types/timeline.d.ts +2 -0
  694. package/dist/types/toolkit/ToolkitProvider.d.ts +31 -0
  695. package/dist/types/toolkit/browserNavigation.d.ts +32 -0
  696. package/dist/types/toolkit/toolkitContext.d.ts +28 -0
  697. package/dist/types/toolkit/toolkitSettings.d.ts +68 -0
  698. package/dist/types/toolkit/useToolkitTranslation.d.ts +10 -0
  699. package/dist/types/ui/actions/CopyButton.d.ts +13 -0
  700. package/dist/types/ui/actions/DownloadMenu.d.ts +50 -0
  701. package/dist/types/ui/actions/SecretField.d.ts +13 -0
  702. package/dist/types/ui/filters/DateRangeFilter.d.ts +16 -0
  703. package/dist/types/ui/filters/PeriodRangeSelector.d.ts +28 -0
  704. package/dist/types/ui/filters/QuickFilters.d.ts +21 -0
  705. package/dist/types/ui/filters/SegmentedControl.d.ts +44 -0
  706. package/dist/types/ui/index.d.ts +33 -0
  707. package/dist/types/ui/labels/DictionaryText.d.ts +7 -0
  708. package/dist/types/ui/labels/StatusChip.d.ts +21 -0
  709. package/dist/types/ui/labels/Tag.d.ts +19 -0
  710. package/dist/types/ui/layout/CollapsibleSection.d.ts +15 -0
  711. package/dist/types/ui/layout/ContentDialog.d.ts +13 -0
  712. package/dist/types/ui/layout/DefinitionList.d.ts +15 -0
  713. package/dist/types/ui/layout/DetailHeader.d.ts +15 -0
  714. package/dist/types/ui/layout/ErrorPage.d.ts +22 -0
  715. package/dist/types/ui/layout/FullPageLoader.d.ts +1 -0
  716. package/dist/types/ui/layout/GlassLensFilter.d.ts +1 -0
  717. package/dist/types/ui/layout/GlassPanel.d.ts +11 -0
  718. package/dist/types/ui/layout/PageHeader.d.ts +15 -0
  719. package/dist/types/ui/layout/PageHeading.d.ts +18 -0
  720. package/dist/types/ui/layout/ProfileHeader.d.ts +17 -0
  721. package/dist/types/ui/layout/ScrollableRow.d.ts +33 -0
  722. package/dist/types/ui/layout/SectionCard.d.ts +11 -0
  723. package/dist/types/ui/layout/appBarHeight.d.ts +13 -0
  724. package/dist/types/ui/metrics/BarList.d.ts +19 -0
  725. package/dist/types/ui/metrics/CalendarHeatmap.d.ts +28 -0
  726. package/dist/types/ui/metrics/ChartTooltip.d.ts +5 -0
  727. package/dist/types/ui/metrics/ColumnChart.d.ts +35 -0
  728. package/dist/types/ui/metrics/MetricCard.d.ts +31 -0
  729. package/dist/types/ui/metrics/TableToggle.d.ts +7 -0
  730. package/dist/types/ui/metrics/barListLabels.d.ts +17 -0
  731. package/dist/types/ui/metrics/heatmapScale.d.ts +45 -0
  732. package/dist/types/ui/navigation/BackButton.d.ts +11 -0
  733. package/dist/types/ui/navigation/ColorSchemeToggle.d.ts +7 -0
  734. package/dist/types/ui/navigation/DocumentTitle.d.ts +6 -0
  735. package/dist/types/ui/navigation/FontSizeToggle.d.ts +6 -0
  736. package/dist/types/ui/navigation/LanguageToggle.d.ts +8 -0
  737. package/dist/types/ui/navigation/PageBreadcrumbs.d.ts +9 -0
  738. package/dist/types/ui/navigation/colorMode.d.ts +18 -0
  739. package/dist/types/ui/navigation/fontSizeLevels.d.ts +25 -0
  740. package/dist/types/ui/navigation/useFontSize.d.ts +10 -0
  741. package/dist/types/ui/timeline/GroupedTimeline.d.ts +38 -0
  742. package/dist/types/ui/timeline/timelineDot.d.ts +19 -0
  743. package/dist/types/upload/FileDropzone.d.ts +34 -0
  744. package/dist/types/upload/fileRules.d.ts +51 -0
  745. package/dist/types/upload/uploadMachine.d.ts +23 -0
  746. package/dist/types/upload/uploadWithProgress.d.ts +16 -0
  747. package/dist/ui/actions/CopyButton.js +28 -0
  748. package/dist/ui/actions/CopyButton.js.map +1 -0
  749. package/dist/ui/actions/DownloadMenu.js +163 -0
  750. package/dist/ui/actions/DownloadMenu.js.map +1 -0
  751. package/dist/ui/actions/SecretField.js +57 -0
  752. package/dist/ui/actions/SecretField.js.map +1 -0
  753. package/dist/ui/filters/DateRangeFilter.js +86 -0
  754. package/dist/ui/filters/DateRangeFilter.js.map +1 -0
  755. package/dist/ui/filters/PeriodRangeSelector.js +56 -0
  756. package/dist/ui/filters/PeriodRangeSelector.js.map +1 -0
  757. package/dist/ui/filters/QuickFilters.js +91 -0
  758. package/dist/ui/filters/QuickFilters.js.map +1 -0
  759. package/dist/ui/filters/SegmentedControl.js +80 -0
  760. package/dist/ui/filters/SegmentedControl.js.map +1 -0
  761. package/dist/ui/labels/DictionaryText.js +11 -0
  762. package/dist/ui/labels/DictionaryText.js.map +1 -0
  763. package/dist/ui/labels/StatusChip.js +52 -0
  764. package/dist/ui/labels/StatusChip.js.map +1 -0
  765. package/dist/ui/labels/Tag.js +26 -0
  766. package/dist/ui/labels/Tag.js.map +1 -0
  767. package/dist/ui/layout/CollapsibleSection.js +48 -0
  768. package/dist/ui/layout/CollapsibleSection.js.map +1 -0
  769. package/dist/ui/layout/ContentDialog.js +97 -0
  770. package/dist/ui/layout/ContentDialog.js.map +1 -0
  771. package/dist/ui/layout/DefinitionList.js +30 -0
  772. package/dist/ui/layout/DefinitionList.js.map +1 -0
  773. package/dist/ui/layout/DetailHeader.js +27 -0
  774. package/dist/ui/layout/DetailHeader.js.map +1 -0
  775. package/dist/ui/layout/ErrorPage.js +40 -0
  776. package/dist/ui/layout/ErrorPage.js.map +1 -0
  777. package/dist/ui/layout/FullPageLoader.js +13 -0
  778. package/dist/ui/layout/FullPageLoader.js.map +1 -0
  779. package/dist/ui/layout/GlassLensFilter.js +53 -0
  780. package/dist/ui/layout/GlassLensFilter.js.map +1 -0
  781. package/dist/ui/layout/GlassPanel.js +18 -0
  782. package/dist/ui/layout/GlassPanel.js.map +1 -0
  783. package/dist/ui/layout/PageHeader.js +23 -0
  784. package/dist/ui/layout/PageHeader.js.map +1 -0
  785. package/dist/ui/layout/PageHeading.js +51 -0
  786. package/dist/ui/layout/PageHeading.js.map +1 -0
  787. package/dist/ui/layout/ProfileHeader.js +64 -0
  788. package/dist/ui/layout/ProfileHeader.js.map +1 -0
  789. package/dist/ui/layout/ScrollableRow.js +156 -0
  790. package/dist/ui/layout/ScrollableRow.js.map +1 -0
  791. package/dist/ui/layout/SectionCard.js +18 -0
  792. package/dist/ui/layout/SectionCard.js.map +1 -0
  793. package/dist/ui/layout/appBarHeight.js +42 -0
  794. package/dist/ui/layout/appBarHeight.js.map +1 -0
  795. package/dist/ui/metrics/BarList.js +89 -0
  796. package/dist/ui/metrics/BarList.js.map +1 -0
  797. package/dist/ui/metrics/CalendarHeatmap.js +131 -0
  798. package/dist/ui/metrics/CalendarHeatmap.js.map +1 -0
  799. package/dist/ui/metrics/ChartTooltip.js +16 -0
  800. package/dist/ui/metrics/ChartTooltip.js.map +1 -0
  801. package/dist/ui/metrics/ColumnChart.js +110 -0
  802. package/dist/ui/metrics/ColumnChart.js.map +1 -0
  803. package/dist/ui/metrics/MetricCard.js +64 -0
  804. package/dist/ui/metrics/MetricCard.js.map +1 -0
  805. package/dist/ui/metrics/TableToggle.js +13 -0
  806. package/dist/ui/metrics/TableToggle.js.map +1 -0
  807. package/dist/ui/metrics/barListLabels.js +9 -0
  808. package/dist/ui/metrics/barListLabels.js.map +1 -0
  809. package/dist/ui/metrics/heatmapScale.js +67 -0
  810. package/dist/ui/metrics/heatmapScale.js.map +1 -0
  811. package/dist/ui/navigation/BackButton.js +28 -0
  812. package/dist/ui/navigation/BackButton.js.map +1 -0
  813. package/dist/ui/navigation/ColorSchemeToggle.js +37 -0
  814. package/dist/ui/navigation/ColorSchemeToggle.js.map +1 -0
  815. package/dist/ui/navigation/DocumentTitle.js +11 -0
  816. package/dist/ui/navigation/DocumentTitle.js.map +1 -0
  817. package/dist/ui/navigation/FontSizeToggle.js +40 -0
  818. package/dist/ui/navigation/FontSizeToggle.js.map +1 -0
  819. package/dist/ui/navigation/LanguageToggle.js +27 -0
  820. package/dist/ui/navigation/LanguageToggle.js.map +1 -0
  821. package/dist/ui/navigation/PageBreadcrumbs.js +51 -0
  822. package/dist/ui/navigation/PageBreadcrumbs.js.map +1 -0
  823. package/dist/ui/navigation/colorMode.js +13 -0
  824. package/dist/ui/navigation/colorMode.js.map +1 -0
  825. package/dist/ui/navigation/fontSizeLevels.js +24 -0
  826. package/dist/ui/navigation/fontSizeLevels.js.map +1 -0
  827. package/dist/ui/navigation/useFontSize.js +44 -0
  828. package/dist/ui/navigation/useFontSize.js.map +1 -0
  829. package/dist/ui/timeline/GroupedTimeline.js +104 -0
  830. package/dist/ui/timeline/GroupedTimeline.js.map +1 -0
  831. package/dist/ui/timeline/timelineDot.js +20 -0
  832. package/dist/ui/timeline/timelineDot.js.map +1 -0
  833. package/dist/upload/FileDropzone.js +143 -0
  834. package/dist/upload/FileDropzone.js.map +1 -0
  835. package/dist/upload/fileRules.js +62 -0
  836. package/dist/upload/fileRules.js.map +1 -0
  837. package/dist/upload/uploadMachine.js +73 -0
  838. package/dist/upload/uploadMachine.js.map +1 -0
  839. package/dist/upload/uploadWithProgress.js +45 -0
  840. package/dist/upload/uploadWithProgress.js.map +1 -0
  841. package/package.json +303 -5
@@ -0,0 +1,101 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState, useEffect } from "react";
4
+ import Alert from "@mui/material/Alert";
5
+ import { useAccount } from "./AccountProvider.js";
6
+ import DemoTotpCodeButton from "./DemoTotpCodeButton.js";
7
+ import { AuthLayout } from "../appShell/AuthLayout.js";
8
+ import SignInForm from "../forms/auth/SignInForm.js";
9
+ import SecondStepForm, { SECOND_STEP_METHOD } from "../forms/security/SecondStepForm.js";
10
+ import { readRedirectParam } from "../navigation.js";
11
+ import { signWithPasskey, passkeysSupported } from "../security/passkeys.js";
12
+ import { useToolkitNavigation } from "../toolkit/toolkitContext.js";
13
+ import { useToolkitTranslation } from "../toolkit/useToolkitTranslation.js";
14
+ function SignInScreen({ homePath = "/", forgotPasswordPath, logo, brandName, footer, showLanguageToggle = true, showColorSchemeToggle = true }) {
15
+ const { t } = useToolkitTranslation("auth");
16
+ const { connector, session, refreshSession } = useAccount();
17
+ const { useNavigate, useLocation } = useToolkitNavigation();
18
+ const navigate = useNavigate();
19
+ const { search } = useLocation();
20
+ const [secondStep, setSecondStep] = useState(null);
21
+ const [notice, setNotice] = useState(null);
22
+ const destination = readRedirectParam(search) ?? homePath;
23
+ useEffect(() => {
24
+ if (session) {
25
+ navigate(destination, { replace: true });
26
+ }
27
+ }, [session, destination, navigate]);
28
+ const signIn = async (credentials) => {
29
+ setNotice(null);
30
+ const result = await connector.signIn({ remember: false, ...credentials });
31
+ if (result?.secondStep) {
32
+ setSecondStep(result.secondStep);
33
+ return;
34
+ }
35
+ await refreshSession();
36
+ };
37
+ const signInFromFooter = async (credentials) => {
38
+ try {
39
+ await signIn(credentials);
40
+ } catch (error) {
41
+ setNotice(error?.message ?? null);
42
+ }
43
+ };
44
+ const backToPassword = (message) => {
45
+ setSecondStep(null);
46
+ setNotice(message);
47
+ };
48
+ if (session) {
49
+ return null;
50
+ }
51
+ if (secondStep) {
52
+ const showsDemoCode = typeof connector.demoTotpCode === "function" && secondStep.methods.includes(SECOND_STEP_METHOD.totp);
53
+ return /* @__PURE__ */ jsx(
54
+ AuthLayout,
55
+ {
56
+ logo,
57
+ brandName,
58
+ title: t("security:twoStep.title"),
59
+ showLanguageToggle,
60
+ showColorSchemeToggle,
61
+ children: /* @__PURE__ */ jsx(
62
+ SecondStepForm,
63
+ {
64
+ methods: secondStep.methods,
65
+ canUsePasskeys: passkeysSupported(),
66
+ onUsePasskey: async () => {
67
+ await connector.signInWithPasskey(await signWithPasskey(await connector.secondStepPasskeyOptions()));
68
+ await refreshSession();
69
+ },
70
+ onSubmitCode: async ({ method, code }) => {
71
+ await connector.signInSecondStep({ method, code });
72
+ await refreshSession();
73
+ },
74
+ onCancel: backToPassword,
75
+ footer: showsDemoCode && /* @__PURE__ */ jsx(DemoTotpCodeButton, { loadCode: connector.demoTotpCode })
76
+ }
77
+ )
78
+ }
79
+ );
80
+ }
81
+ return /* @__PURE__ */ jsxs(
82
+ AuthLayout,
83
+ {
84
+ logo,
85
+ brandName,
86
+ title: t("signIn.title"),
87
+ description: t("signIn.subtitle"),
88
+ showLanguageToggle,
89
+ showColorSchemeToggle,
90
+ footer: typeof footer === "function" ? footer({ signIn: signInFromFooter }) : footer,
91
+ children: [
92
+ notice && /* @__PURE__ */ jsx(Alert, { severity: "warning", sx: { mb: 2 }, children: notice }),
93
+ /* @__PURE__ */ jsx(SignInForm, { onSubmit: signIn, forgotPasswordPath })
94
+ ]
95
+ }
96
+ );
97
+ }
98
+ export {
99
+ SignInScreen as default
100
+ };
101
+ //# sourceMappingURL=SignInScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignInScreen.js","sources":["../../src/account/SignInScreen.jsx"],"sourcesContent":["// Entrar, completo: la contraseña (SignInForm) y, si la cuenta tiene verificación en dos pasos, el segundo paso\n// (SecondStepForm: la llave de acceso, el código de la app o uno de recuperación). Al terminar se vuelve a leer la sesión y\n// se va a la pantalla que se quería abrir (readRedirectParam: solo si es de esta app) o al inicio.\n//\n// Lo del servidor sale del conector de la cuenta (useAccount): en el proyecto la pantalla solo se pone en su ruta.\n//\n// <SignInScreen forgotPasswordPath=\"/forgot-password\" logo={<AppLogo />} />\n//\n// footer va abajo de la tarjeta. Si es una función, recibe signIn para entrar desde un botón propio (p. ej. «Entrar con la\n// cuenta de ejemplo»), con el mismo segundo paso; si falla, el motivo sale arriba del formulario.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useEffect, useState} from 'react';\nimport Alert from '@mui/material/Alert';\n\nimport {useAccount} from '@/account/AccountProvider.jsx';\nimport DemoTotpCodeButton from '@/account/DemoTotpCodeButton.jsx';\nimport {AuthLayout} from '@/appShell/AuthLayout.jsx';\nimport SignInForm from '@/forms/auth/SignInForm.jsx';\nimport SecondStepForm, {SECOND_STEP_METHOD} from '@/forms/security/SecondStepForm.jsx';\nimport {readRedirectParam} from '@/navigation.js';\nimport {passkeysSupported, signWithPasskey} from '@/security/passkeys.js';\nimport {useToolkitNavigation} from '@/toolkit/toolkitContext.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\n\n/**\n * @param {object} props\n * @param {string} [props.homePath] a dónde ir si no se quería abrir otra pantalla; por omisión '/'\n * @param {string} [props.forgotPasswordPath] sin ella no sale «¿Olvidó su contraseña?»\n * @param {import('react').ReactNode} [props.logo]\n * @param {string} [props.brandName] por omisión el appName de ToolkitProvider\n * @param {import('react').ReactNode | ((helpers: {signIn: (credentials: {email: string, password: string, remember?: boolean}) => Promise<void>}) => import('react').ReactNode)} [props.footer]\n * @param {boolean} [props.showLanguageToggle] por omisión sí\n * @param {boolean} [props.showColorSchemeToggle] por omisión sí\n */\nexport default function SignInScreen({homePath = '/', forgotPasswordPath, logo, brandName, footer, showLanguageToggle = true, showColorSchemeToggle = true}) {\n const {t} = useToolkitTranslation('auth');\n const {connector, session, refreshSession} = useAccount();\n const {useNavigate, useLocation} = useToolkitNavigation();\n const navigate = useNavigate();\n const {search} = useLocation();\n // con verificación en dos pasos: los métodos del segundo paso (la contraseña ya fue correcta)\n const [secondStep, setSecondStep] = useState(null);\n const [notice, setNotice] = useState(null);\n const destination = readRedirectParam(search) ?? homePath;\n\n // ya hay sesión (acaba de entrar, o abrió esta pantalla estando dentro): a donde iba\n useEffect(() => {\n if (session) {\n navigate(destination, {replace: true});\n }\n }, [session, destination, navigate]);\n\n // después de la contraseña: el segundo paso si lo pide el servidor; si no, ya está dentro\n const signIn = async (credentials) => {\n setNotice(null);\n const result = await connector.signIn({remember: false, ...credentials});\n if (result?.secondStep) {\n setSecondStep(result.secondStep);\n return;\n }\n await refreshSession();\n };\n // desde un botón propio del footer: el error no tiene formulario donde salir, sale arriba\n const signInFromFooter = async (credentials) => {\n try {\n await signIn(credentials);\n } catch (error) {\n setNotice(error?.message ?? null);\n }\n };\n // se acabaron los intentos o se venció el tiempo: de regreso a la contraseña, con el motivo\n const backToPassword = (message) => {\n setSecondStep(null);\n setNotice(message);\n };\n\n if (session) {\n return null;\n }\n\n if (secondStep) {\n const showsDemoCode = typeof connector.demoTotpCode === 'function' && secondStep.methods.includes(SECOND_STEP_METHOD.totp);\n return (\n <AuthLayout logo={logo} brandName={brandName} title={t('security:twoStep.title')}\n showLanguageToggle={showLanguageToggle} showColorSchemeToggle={showColorSchemeToggle}>\n <SecondStepForm methods={secondStep.methods} canUsePasskeys={passkeysSupported()}\n onUsePasskey={async () => {\n await connector.signInWithPasskey(await signWithPasskey(await connector.secondStepPasskeyOptions()));\n await refreshSession();\n }}\n onSubmitCode={async ({method, code}) => {\n await connector.signInSecondStep({method, code});\n await refreshSession();\n }}\n onCancel={backToPassword}\n footer={showsDemoCode && <DemoTotpCodeButton loadCode={connector.demoTotpCode} />} />\n </AuthLayout>\n );\n }\n\n return (\n <AuthLayout logo={logo} brandName={brandName} title={t('signIn.title')} description={t('signIn.subtitle')}\n showLanguageToggle={showLanguageToggle} showColorSchemeToggle={showColorSchemeToggle}\n footer={typeof footer === 'function' ? footer({signIn: signInFromFooter}) : footer}>\n {notice && <Alert severity=\"warning\" sx={{mb: 2}}>{notice}</Alert>}\n <SignInForm onSubmit={signIn} forgotPasswordPath={forgotPasswordPath} />\n </AuthLayout>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AAmCA,SAAwB,aAAa,EAAC,WAAW,KAAK,oBAAoB,MAAM,WAAW,QAAQ,qBAAqB,MAAM,wBAAwB,KAAA,GAAO;AACzJ,QAAM,EAAC,EAAA,IAAK,sBAAsB,MAAM;AACxC,QAAM,EAAC,WAAW,SAAS,eAAA,IAAkB,WAAA;AAC7C,QAAM,EAAC,aAAa,YAAA,IAAe,qBAAA;AACnC,QAAM,WAAW,YAAA;AACjB,QAAM,EAAC,OAAA,IAAU,YAAA;AAEjB,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,IAAI;AACjD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,IAAI;AACzC,QAAM,cAAc,kBAAkB,MAAM,KAAK;AAGjD,YAAU,MAAM;AACZ,QAAI,SAAS;AACT,eAAS,aAAa,EAAC,SAAS,KAAA,CAAK;AAAA,IACzC;AAAA,EACJ,GAAG,CAAC,SAAS,aAAa,QAAQ,CAAC;AAGnC,QAAM,SAAS,OAAO,gBAAgB;AAClC,cAAU,IAAI;AACd,UAAM,SAAS,MAAM,UAAU,OAAO,EAAC,UAAU,OAAO,GAAG,aAAY;AACvE,QAAI,QAAQ,YAAY;AACpB,oBAAc,OAAO,UAAU;AAC/B;AAAA,IACJ;AACA,UAAM,eAAA;AAAA,EACV;AAEA,QAAM,mBAAmB,OAAO,gBAAgB;AAC5C,QAAI;AACA,YAAM,OAAO,WAAW;AAAA,IAC5B,SAAS,OAAO;AACZ,gBAAU,OAAO,WAAW,IAAI;AAAA,IACpC;AAAA,EACJ;AAEA,QAAM,iBAAiB,CAAC,YAAY;AAChC,kBAAc,IAAI;AAClB,cAAU,OAAO;AAAA,EACrB;AAEA,MAAI,SAAS;AACT,WAAO;AAAA,EACX;AAEA,MAAI,YAAY;AACZ,UAAM,gBAAgB,OAAO,UAAU,iBAAiB,cAAc,WAAW,QAAQ,SAAS,mBAAmB,IAAI;AACzH,WACI;AAAA,MAAC;AAAA,MAAA;AAAA,QAAW;AAAA,QAAY;AAAA,QAAsB,OAAO,EAAE,wBAAwB;AAAA,QACnE;AAAA,QAAwC;AAAA,QAChD,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YAAe,SAAS,WAAW;AAAA,YAAS,gBAAgB,kBAAA;AAAA,YAC7C,cAAc,YAAY;AACtB,oBAAM,UAAU,kBAAkB,MAAM,gBAAgB,MAAM,UAAU,yBAAA,CAA0B,CAAC;AACnG,oBAAM,eAAA;AAAA,YACV;AAAA,YACA,cAAc,OAAO,EAAC,QAAQ,WAAU;AACpC,oBAAM,UAAU,iBAAiB,EAAC,QAAQ,MAAK;AAC/C,oBAAM,eAAA;AAAA,YACV;AAAA,YACA,UAAU;AAAA,YACV,QAAQ,iBAAiB,oBAAC,oBAAA,EAAmB,UAAU,UAAU,aAAA,CAAc;AAAA,UAAA;AAAA,QAAA;AAAA,MAAI;AAAA,IAAA;AAAA,EAG/G;AAEA,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MAAW;AAAA,MAAY;AAAA,MAAsB,OAAO,EAAE,cAAc;AAAA,MAAG,aAAa,EAAE,iBAAiB;AAAA,MAC5F;AAAA,MAAwC;AAAA,MACxC,QAAQ,OAAO,WAAW,aAAa,OAAO,EAAC,QAAQ,iBAAA,CAAiB,IAAI;AAAA,MACnF,UAAA;AAAA,QAAA,UAAU,oBAAC,SAAM,UAAS,WAAU,IAAI,EAAC,IAAI,EAAA,GAAK,UAAA,OAAA,CAAO;AAAA,QAC1D,oBAAC,YAAA,EAAW,UAAU,QAAQ,mBAAA,CAAwC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGlF;"}
@@ -0,0 +1,31 @@
1
+ const ACCOUNT_CONNECTOR_FUNCTIONS = Object.freeze([
2
+ "loadSession",
3
+ "signIn",
4
+ "signInSecondStep",
5
+ "secondStepPasskeyOptions",
6
+ "signInWithPasskey",
7
+ "signOut",
8
+ "requestPasswordReset",
9
+ "resetPassword",
10
+ "updateProfile",
11
+ "changePassword",
12
+ "loadSecurity",
13
+ "startTotp",
14
+ "confirmTotp",
15
+ "disableTotp",
16
+ "passkeyRegistrationOptions",
17
+ "savePasskey",
18
+ "removePasskey",
19
+ "regenerateRecoveryCodes",
20
+ "listSessions",
21
+ "closeOtherSessions",
22
+ "listActivity"
23
+ ]);
24
+ function missingConnectorFunctionsOf(connector) {
25
+ return ACCOUNT_CONNECTOR_FUNCTIONS.filter((name) => typeof connector?.[name] !== "function");
26
+ }
27
+ export {
28
+ ACCOUNT_CONNECTOR_FUNCTIONS,
29
+ missingConnectorFunctionsOf
30
+ };
31
+ //# sourceMappingURL=accountConnector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accountConnector.js","sources":["../../src/account/accountConnector.js"],"sourcesContent":["// El conector de la cuenta: lo ÚNICO que un proyecto escribe para tener entrar (con su segundo paso), «¿Olvidó su\n// contraseña?», elegir una contraseña nueva, Mi perfil y su seguridad (@stackcraftmx/calcita/account). Las pantallas solo\n// llaman estas funciones; cada una habla con el backend del proyecto.\n//\n// Tres formas de tenerlo:\n// - createRestAccountConnector(apiClient): si el backend sigue el contrato REST (restAccountConnector.js), ya está;\n// - createDemoAccountConnector() de @stackcraftmx/calcita/account-demo: todo en la memoria del navegador, para arrancar\n// sin backend;\n// - uno propio: un objeto con estas funciones, o el REST con las que no coincidan cambiadas ({...rest, signIn: …}).\n//\n// Cada función regresa una promesa y, si el servidor dice que no, truena con un ApiError (RFC 9457): la pantalla enseña su\n// mensaje, y lo de cada campo en su campo. Las llaves van en camelCase: la traducción desde el backend va en el conector.\n//\n// Funciones puras, no renderizan: function (regla de la casa). Pruebas en accountConnector.test.js.\n\n/**\n * Quien está dentro, como lo pintan la barra y Mi perfil.\n *\n * @typedef {object} AccountUser\n * @property {string} id\n * @property {string} name\n * @property {string} email\n * @property {string} [subtitle] el renglón bajo el nombre (puesto · sucursal)\n * @property {string} [phone]\n * @property {string} [avatarUrl]\n */\n\n/**\n * La sesión: quién está dentro y sus permisos (los lee createAccessChecker).\n *\n * @typedef {object} AccountSession\n * @property {AccountUser} user\n * @property {string[]} [roles]\n * @property {string[]} [abilities]\n * @property {string[]} [labels] sus perfiles o etiquetas, ya traducidos (salen como chips en Mi perfil)\n */\n\n/**\n * El estado de la verificación en dos pasos (el que pinta TwoStepVerificationCard).\n *\n * @typedef {object} AccountSecurity\n * @property {boolean} isEnabled\n * @property {string|null} [enabledAt]\n * @property {Array<{id: string, name: string, createdAt: string, lastUsedAt?: string|null}>} passkeys\n * @property {{isEnabled: boolean, enabledAt?: string|null}} totp\n * @property {number} recoveryCodesRemaining\n */\n\n/**\n * Lo que regresa un cambio de seguridad: el estado nuevo y, si se generaron, los códigos de recuperación (se enseñan una\n * sola vez).\n *\n * @typedef {object} AccountSecurityChange\n * @property {AccountSecurity} security\n * @property {string[]} [recoveryCodes]\n */\n\n/**\n * Un equipo donde la cuenta está abierta.\n *\n * @typedef {object} AccountDeviceSession\n * @property {string} id\n * @property {string|null} [browser]\n * @property {string|null} [platform]\n * @property {boolean} [isMobile]\n * @property {string} startedAt instante ISO\n * @property {string|null} [network] a medias (187.190.x.x), nunca la IP completa\n * @property {boolean} [isCurrent]\n */\n\n/**\n * Un renglón de la bitácora de la cuenta.\n *\n * @typedef {object} AccountEvent\n * @property {string} id\n * @property {string} kind uno de ACCOUNT_EVENT_KIND\n * @property {string} occurredAt instante ISO\n * @property {string|null} [device]\n * @property {string|null} [network]\n */\n\n/**\n * El conector completo.\n *\n * @typedef {object} AccountConnector\n * @property {() => Promise<AccountSession|null>} loadSession quién está dentro; null si nadie\n * @property {(credentials: {email: string, password: string, remember: boolean}) => Promise<{secondStep: {methods: string[]}|null}>} signIn\n * con verificación en dos pasos regresa los métodos del segundo paso (SECOND_STEP_METHOD); sin ella, secondStep null\n * y ya está dentro\n * @property {(input: {method: string, code: string}) => Promise<void>} signInSecondStep el código de la app (totp) o uno\n * de recuperación (recoveryCode)\n * @property {() => Promise<object>} secondStepPasskeyOptions las opciones de WebAuthn para firmar (JSON del servidor)\n * @property {(credential: any) => Promise<void>} signInWithPasskey la firma del navegador (JSON de WebAuthn)\n * @property {() => Promise<void>} signOut\n * @property {(input: {email: string}) => Promise<void>} requestPasswordReset contesta igual exista o no el correo\n * @property {(input: {token: string, newPassword: string}) => Promise<void>} resetPassword desde el enlace del correo\n * @property {(input: {name: string, phone: string}) => Promise<{message?: string}|void>} updateProfile\n * @property {(input: {currentPassword?: string, newPassword: string}) => Promise<void>} changePassword\n * @property {() => Promise<AccountSecurity>} loadSecurity\n * @property {() => Promise<{secret: string, qrImageUrl?: string|null}>} startTotp una clave nueva (todavía sin activar)\n * @property {(code: string) => Promise<AccountSecurityChange>} confirmTotp\n * @property {(password: string) => Promise<AccountSecurityChange>} disableTotp\n * @property {() => Promise<object>} passkeyRegistrationOptions las opciones de WebAuthn para crear una llave\n * @property {(input: {name: string, credential: any}) => Promise<AccountSecurityChange>} savePasskey\n * @property {(input: {passkeyId: string, password: string}) => Promise<AccountSecurityChange>} removePasskey\n * @property {(password: string) => Promise<AccountSecurityChange>} regenerateRecoveryCodes\n * @property {() => Promise<AccountDeviceSession[]>} listSessions\n * @property {() => Promise<number>} closeOtherSessions cuántas cerró\n * @property {() => Promise<AccountEvent[]>} listActivity de lo más nuevo a lo más viejo\n * @property {() => Promise<string|null>} [demoTotpCode] SOLO en la demostración: el código que enseñaría la app ahorita\n * (con él sale el botón «Usar el código de ejemplo»)\n */\n\n/** Las funciones que todo conector trae (demoTotpCode es opcional: solo la demostración). */\nexport const ACCOUNT_CONNECTOR_FUNCTIONS = Object.freeze([\n 'loadSession', 'signIn', 'signInSecondStep', 'secondStepPasskeyOptions', 'signInWithPasskey', 'signOut', 'requestPasswordReset',\n 'resetPassword', 'updateProfile', 'changePassword', 'loadSecurity', 'startTotp', 'confirmTotp', 'disableTotp',\n 'passkeyRegistrationOptions', 'savePasskey', 'removePasskey', 'regenerateRecoveryCodes', 'listSessions', 'closeOtherSessions',\n 'listActivity',\n]);\n\n/**\n * Las funciones que le faltan al conector (un error de quien lo escribió: se avisa al arrancar, no al picar un botón).\n *\n * @param {object|null|undefined} connector\n * @returns {string[]}\n */\nexport function missingConnectorFunctionsOf(connector) {\n return ACCOUNT_CONNECTOR_FUNCTIONS.filter((name) => typeof connector?.[name] !== 'function');\n}\n"],"names":[],"mappings":"AAkHY,MAAC,8BAA8B,OAAO,OAAO;AAAA,EACrD;AAAA,EAAe;AAAA,EAAU;AAAA,EAAoB;AAAA,EAA4B;AAAA,EAAqB;AAAA,EAAW;AAAA,EACzG;AAAA,EAAiB;AAAA,EAAiB;AAAA,EAAkB;AAAA,EAAgB;AAAA,EAAa;AAAA,EAAe;AAAA,EAChG;AAAA,EAA8B;AAAA,EAAe;AAAA,EAAiB;AAAA,EAA2B;AAAA,EAAgB;AAAA,EACzG;AACJ,CAAC;AAQM,SAAS,4BAA4B,WAAW;AACnD,SAAO,4BAA4B,OAAO,CAAC,SAAS,OAAO,YAAY,IAAI,MAAM,UAAU;AAC/F;"}
@@ -0,0 +1,368 @@
1
+ import { ApiError } from "../../api/ApiError.js";
2
+ import { totpCodeAt, newTotpSecret, isValidTotpCode, otpauthUrlOf } from "./totp.js";
3
+ import { translateToolkit } from "../../toolkit/toolkitSettings.js";
4
+ const HTTP_STATUS = Object.freeze({ unauthorized: 401, unprocessable: 422, locked: 423 });
5
+ const DEMO_USER = Object.freeze({ id: "user-demo", name: "Ana Martínez Ruiz", email: "ana.martinez@ejemplo.com", subtitle: "Administración", phone: "" });
6
+ const DEFAULT_STORAGE_KEY = "calcita-demo:session";
7
+ const DEFAULT_DELAY_MILLISECONDS = 400;
8
+ const DEFAULT_ISSUER = "Calcita";
9
+ const RECOVERY_CODE_COUNT = 10;
10
+ const RECOVERY_CODE_ALPHABET = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
11
+ const SECOND_STEP_ATTEMPTS = 5;
12
+ const SECOND_STEP_MINUTES = 5;
13
+ const MILLISECONDS_PER_MINUTE = 6e4;
14
+ const MILLISECONDS_PER_HOUR = 60 * MILLISECONDS_PER_MINUTE;
15
+ const PASSKEY_TIMEOUT_MILLISECONDS = 6e4;
16
+ const CHALLENGE_BYTES = 32;
17
+ const ES256 = -7;
18
+ const RS256 = -257;
19
+ const METHOD = Object.freeze({ passkey: "passkey", totp: "totp", recoveryCode: "recoveryCode" });
20
+ const THIS_NETWORK = "187.190.x.x";
21
+ const messageOf = (key, values) => translateToolkit("account", `demo.server.${key}`, values);
22
+ function base64UrlOf(bytes) {
23
+ return btoa(String.fromCharCode(...bytes)).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
24
+ }
25
+ function thisDevice() {
26
+ const userAgent = typeof navigator === "undefined" ? "" : navigator.userAgent;
27
+ const browser = /Edg\//.test(userAgent) ? "Edge" : /Firefox\//.test(userAgent) ? "Firefox" : /Chrome\//.test(userAgent) ? "Chrome" : /Safari\//.test(userAgent) ? "Safari" : null;
28
+ const platform = /iPhone|iPad/.test(userAgent) ? "iOS" : /Android/.test(userAgent) ? "Android" : /Mac OS X/.test(userAgent) ? "macOS" : /Windows/.test(userAgent) ? "Windows" : /Linux/.test(userAgent) ? "Linux" : null;
29
+ return { browser, platform, isMobile: /iPhone|Android.*Mobile/.test(userAgent) };
30
+ }
31
+ function newRecoveryCodes() {
32
+ return Array.from({ length: RECOVERY_CODE_COUNT }, () => {
33
+ const characters = Array.from(crypto.getRandomValues(new Uint8Array(10)), (byte) => RECOVERY_CODE_ALPHABET[byte % RECOVERY_CODE_ALPHABET.length]);
34
+ return `${characters.slice(0, 5).join("")}-${characters.slice(5).join("")}`;
35
+ });
36
+ }
37
+ function fieldError(field, message) {
38
+ return new ApiError({
39
+ status: HTTP_STATUS.unprocessable,
40
+ problem: { title: messageOf("validationTitle"), detail: messageOf("validationDetail"), errors: { [field]: [message] } }
41
+ });
42
+ }
43
+ function createDemoAccountConnector({
44
+ user = DEMO_USER,
45
+ roles = ["admin"],
46
+ abilities = [],
47
+ labels = [],
48
+ storageKey = DEFAULT_STORAGE_KEY,
49
+ toQrImageUrl,
50
+ issuer = DEFAULT_ISSUER,
51
+ delayMilliseconds = DEFAULT_DELAY_MILLISECONDS
52
+ } = {}) {
53
+ const profile = { ...user };
54
+ const security = initialSecurity();
55
+ let pendingSecondStep = null;
56
+ const wait = () => new Promise((resolve) => setTimeout(resolve, delayMilliseconds));
57
+ function initialSecurity() {
58
+ const now = Date.now();
59
+ const device = thisDevice();
60
+ const deviceName = `${device.browser ?? "—"} · ${device.platform ?? "—"}`;
61
+ return {
62
+ totp: null,
63
+ pendingTotpSecret: null,
64
+ passkeys: [],
65
+ recoveryCodes: [],
66
+ enabledAt: null,
67
+ sessions: [
68
+ { id: "session-this", ...device, startedAt: new Date(now - 2 * MILLISECONDS_PER_HOUR).toISOString(), network: THIS_NETWORK, isCurrent: true },
69
+ {
70
+ id: "session-phone",
71
+ browser: "Safari",
72
+ platform: "iOS",
73
+ isMobile: true,
74
+ startedAt: new Date(now - 26 * MILLISECONDS_PER_HOUR).toISOString(),
75
+ network: "201.141.x.x",
76
+ isCurrent: false
77
+ }
78
+ ],
79
+ // de lo más nuevo a lo más viejo
80
+ events: [
81
+ { id: "event-2", kind: "signedIn", occurredAt: new Date(now - 2 * MILLISECONDS_PER_HOUR).toISOString(), device: deviceName, network: THIS_NETWORK },
82
+ { id: "event-1", kind: "signInFailed", occurredAt: new Date(now - 30 * MILLISECONDS_PER_HOUR).toISOString(), device: "Firefox · Windows", network: "177.230.x.x" }
83
+ ]
84
+ };
85
+ }
86
+ const isSignedIn = () => {
87
+ try {
88
+ return window.localStorage.getItem(storageKey) === profile.id;
89
+ } catch {
90
+ return false;
91
+ }
92
+ };
93
+ const rememberSession = (signedIn) => {
94
+ try {
95
+ if (signedIn) {
96
+ window.localStorage.setItem(storageKey, profile.id);
97
+ } else {
98
+ window.localStorage.removeItem(storageKey);
99
+ }
100
+ } catch {
101
+ }
102
+ };
103
+ const failIfSignedOut = () => {
104
+ if (!isSignedIn()) {
105
+ throw new ApiError({ status: HTTP_STATUS.unauthorized, problem: { title: messageOf("noSessionTitle"), detail: messageOf("noSession") } });
106
+ }
107
+ };
108
+ const failWithoutPassword = (password) => {
109
+ if (!password) {
110
+ throw fieldError("password", messageOf("passwordRequired"));
111
+ }
112
+ };
113
+ const recordEvent = (kind) => {
114
+ const device = thisDevice();
115
+ security.events.unshift({
116
+ id: `event-${Date.now()}-${security.events.length}`,
117
+ kind,
118
+ occurredAt: (/* @__PURE__ */ new Date()).toISOString(),
119
+ device: `${device.browser ?? "—"} · ${device.platform ?? "—"}`,
120
+ network: THIS_NETWORK
121
+ });
122
+ };
123
+ const isSecondFactorOn = () => Boolean(security.totp) || security.passkeys.length > 0;
124
+ const securityNow = () => ({
125
+ isEnabled: isSecondFactorOn(),
126
+ enabledAt: security.enabledAt,
127
+ passkeys: security.passkeys.map(({ id, name, createdAt, lastUsedAt }) => ({ id, name, createdAt, lastUsedAt })),
128
+ totp: { isEnabled: Boolean(security.totp), enabledAt: security.totp?.enabledAt ?? null },
129
+ recoveryCodesRemaining: security.recoveryCodes.length
130
+ });
131
+ const turnOnIfFirstFactor = (wasOn) => {
132
+ if (wasOn) {
133
+ return void 0;
134
+ }
135
+ security.enabledAt = (/* @__PURE__ */ new Date()).toISOString();
136
+ security.recoveryCodes = newRecoveryCodes();
137
+ recordEvent("twoStepEnabled");
138
+ return [...security.recoveryCodes];
139
+ };
140
+ const turnOffIfNoFactorLeft = () => {
141
+ if (!isSecondFactorOn()) {
142
+ security.enabledAt = null;
143
+ security.recoveryCodes = [];
144
+ recordEvent("twoStepDisabled");
145
+ }
146
+ };
147
+ const pendingOrFail = () => {
148
+ if (!pendingSecondStep || Date.now() > pendingSecondStep.expiresAt) {
149
+ pendingSecondStep = null;
150
+ throw new ApiError({ status: HTTP_STATUS.unauthorized, problem: { code: "second_step_expired", title: messageOf("expiredTitle"), detail: messageOf("expired") } });
151
+ }
152
+ };
153
+ const failSecondStep = () => {
154
+ pendingSecondStep.attemptsLeft -= 1;
155
+ recordEvent("signInFailed");
156
+ if (pendingSecondStep.attemptsLeft <= 0) {
157
+ pendingSecondStep = null;
158
+ throw new ApiError({ status: HTTP_STATUS.locked, problem: { code: "account_locked", title: messageOf("lockedTitle"), detail: messageOf("locked") } });
159
+ }
160
+ throw new ApiError({
161
+ status: HTTP_STATUS.unauthorized,
162
+ problem: { code: "invalid_code", title: messageOf("wrongCodeTitle"), detail: messageOf("wrongCode"), remaining_attempts: pendingSecondStep.attemptsLeft }
163
+ });
164
+ };
165
+ const finishSignIn = (kind = "signedIn") => {
166
+ pendingSecondStep = null;
167
+ rememberSession(true);
168
+ recordEvent(kind);
169
+ };
170
+ const passkeyChallenge = () => base64UrlOf(crypto.getRandomValues(new Uint8Array(CHALLENGE_BYTES)));
171
+ return {
172
+ loadSession: async () => {
173
+ await wait();
174
+ return isSignedIn() ? { user: { ...profile }, roles: [...roles], abilities: [...abilities], labels: [...labels] } : null;
175
+ },
176
+ signIn: async ({ email }) => {
177
+ await wait();
178
+ if (email?.trim().toLowerCase() !== profile.email.toLowerCase()) {
179
+ throw new ApiError({
180
+ status: HTTP_STATUS.unauthorized,
181
+ problem: { title: messageOf("wrongCredentialsTitle"), detail: messageOf("wrongCredentials", { email: profile.email }) }
182
+ });
183
+ }
184
+ if (!isSecondFactorOn()) {
185
+ finishSignIn();
186
+ return { secondStep: null };
187
+ }
188
+ pendingSecondStep = { expiresAt: Date.now() + SECOND_STEP_MINUTES * MILLISECONDS_PER_MINUTE, attemptsLeft: SECOND_STEP_ATTEMPTS };
189
+ const methods = [
190
+ ...security.passkeys.length > 0 ? [METHOD.passkey] : [],
191
+ ...security.totp ? [METHOD.totp] : [],
192
+ ...security.recoveryCodes.length > 0 ? [METHOD.recoveryCode] : []
193
+ ];
194
+ return { secondStep: { methods } };
195
+ },
196
+ signInSecondStep: async ({ method, code }) => {
197
+ await wait();
198
+ pendingOrFail();
199
+ if (method === METHOD.recoveryCode) {
200
+ if (!security.recoveryCodes.includes(code)) {
201
+ failSecondStep();
202
+ }
203
+ security.recoveryCodes = security.recoveryCodes.filter((unusedCode) => unusedCode !== code);
204
+ finishSignIn("recoveryCodeUsed");
205
+ return;
206
+ }
207
+ if (!security.totp || !await isValidTotpCode(security.totp.secret, code)) {
208
+ failSecondStep();
209
+ }
210
+ finishSignIn();
211
+ },
212
+ secondStepPasskeyOptions: async () => {
213
+ await wait();
214
+ pendingOrFail();
215
+ return {
216
+ challenge: passkeyChallenge(),
217
+ rpId: window.location.hostname,
218
+ userVerification: "preferred",
219
+ timeout: PASSKEY_TIMEOUT_MILLISECONDS,
220
+ allowCredentials: security.passkeys.map((passkey) => ({ id: passkey.credentialId, type: "public-key" }))
221
+ };
222
+ },
223
+ signInWithPasskey: async (credential) => {
224
+ await wait();
225
+ pendingOrFail();
226
+ const passkey = security.passkeys.find((candidate) => candidate.credentialId === credential?.id);
227
+ if (!passkey) {
228
+ failSecondStep();
229
+ }
230
+ passkey.lastUsedAt = (/* @__PURE__ */ new Date()).toISOString();
231
+ finishSignIn();
232
+ },
233
+ signOut: async () => {
234
+ await wait();
235
+ rememberSession(false);
236
+ },
237
+ requestPasswordReset: async () => {
238
+ await wait();
239
+ },
240
+ resetPassword: async () => {
241
+ await wait();
242
+ recordEvent("passwordChanged");
243
+ },
244
+ updateProfile: async ({ name, phone }) => {
245
+ await wait();
246
+ failIfSignedOut();
247
+ if (!name?.trim()) {
248
+ throw fieldError("name", messageOf("nameRequired"));
249
+ }
250
+ profile.name = name.trim();
251
+ profile.phone = phone?.trim() ?? "";
252
+ return { message: messageOf("profileSaved") };
253
+ },
254
+ changePassword: async () => {
255
+ await wait();
256
+ failIfSignedOut();
257
+ recordEvent("passwordChanged");
258
+ },
259
+ loadSecurity: async () => {
260
+ await wait();
261
+ failIfSignedOut();
262
+ return securityNow();
263
+ },
264
+ startTotp: async () => {
265
+ await wait();
266
+ failIfSignedOut();
267
+ security.pendingTotpSecret = newTotpSecret();
268
+ const otpauthUrl = otpauthUrlOf({ secret: security.pendingTotpSecret, account: profile.email, issuer });
269
+ return { secret: security.pendingTotpSecret, qrImageUrl: toQrImageUrl ? await toQrImageUrl(otpauthUrl) : null };
270
+ },
271
+ confirmTotp: async (code) => {
272
+ await wait();
273
+ failIfSignedOut();
274
+ if (!security.pendingTotpSecret || !await isValidTotpCode(security.pendingTotpSecret, code)) {
275
+ throw fieldError("code", messageOf("wrongCode"));
276
+ }
277
+ const wasOn = isSecondFactorOn();
278
+ security.totp = { secret: security.pendingTotpSecret, enabledAt: (/* @__PURE__ */ new Date()).toISOString() };
279
+ security.pendingTotpSecret = null;
280
+ const recoveryCodes = turnOnIfFirstFactor(wasOn);
281
+ return { security: securityNow(), recoveryCodes };
282
+ },
283
+ disableTotp: async (password) => {
284
+ await wait();
285
+ failIfSignedOut();
286
+ failWithoutPassword(password);
287
+ security.totp = null;
288
+ turnOffIfNoFactorLeft();
289
+ return { security: securityNow() };
290
+ },
291
+ passkeyRegistrationOptions: async () => {
292
+ await wait();
293
+ failIfSignedOut();
294
+ return {
295
+ challenge: passkeyChallenge(),
296
+ rp: { name: issuer, id: window.location.hostname },
297
+ user: { id: base64UrlOf(new TextEncoder().encode(profile.id)), name: profile.email, displayName: profile.name },
298
+ pubKeyCredParams: [{ type: "public-key", alg: ES256 }, { type: "public-key", alg: RS256 }],
299
+ timeout: PASSKEY_TIMEOUT_MILLISECONDS,
300
+ attestation: "none",
301
+ // las que ya tiene: el navegador avisa si la persona intenta registrar la misma otra vez
302
+ excludeCredentials: security.passkeys.map((passkey) => ({ id: passkey.credentialId, type: "public-key" })),
303
+ authenticatorSelection: { residentKey: "preferred", userVerification: "preferred" }
304
+ };
305
+ },
306
+ savePasskey: async ({ name, credential }) => {
307
+ await wait();
308
+ failIfSignedOut();
309
+ const wasOn = isSecondFactorOn();
310
+ security.passkeys.push({
311
+ id: `passkey-${Date.now()}`,
312
+ credentialId: credential?.id,
313
+ name: name?.trim() || messageOf("defaultPasskeyName", { number: security.passkeys.length + 1 }),
314
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
315
+ lastUsedAt: null
316
+ });
317
+ recordEvent("passkeyAdded");
318
+ const recoveryCodes = turnOnIfFirstFactor(wasOn);
319
+ return { security: securityNow(), recoveryCodes };
320
+ },
321
+ removePasskey: async ({ passkeyId, password }) => {
322
+ await wait();
323
+ failIfSignedOut();
324
+ failWithoutPassword(password);
325
+ security.passkeys = security.passkeys.filter((passkey) => passkey.id !== passkeyId);
326
+ recordEvent("passkeyRemoved");
327
+ turnOffIfNoFactorLeft();
328
+ return { security: securityNow() };
329
+ },
330
+ regenerateRecoveryCodes: async (password) => {
331
+ await wait();
332
+ failIfSignedOut();
333
+ failWithoutPassword(password);
334
+ security.recoveryCodes = newRecoveryCodes();
335
+ recordEvent("recoveryCodesGenerated");
336
+ return { security: securityNow(), recoveryCodes: [...security.recoveryCodes] };
337
+ },
338
+ listSessions: async () => {
339
+ await wait();
340
+ failIfSignedOut();
341
+ return security.sessions.map((session) => ({ ...session }));
342
+ },
343
+ closeOtherSessions: async () => {
344
+ await wait();
345
+ failIfSignedOut();
346
+ const closed = security.sessions.filter((session) => !session.isCurrent).length;
347
+ security.sessions = security.sessions.filter((session) => session.isCurrent);
348
+ if (closed > 0) {
349
+ recordEvent("sessionsClosed");
350
+ }
351
+ return closed;
352
+ },
353
+ listActivity: async () => {
354
+ await wait();
355
+ failIfSignedOut();
356
+ return security.events.map((event) => ({ ...event }));
357
+ },
358
+ // solo de la demostración: el código que enseñaría la app ahorita, con la clave por activar o la ya activa
359
+ demoTotpCode: async () => {
360
+ const secret = security.pendingTotpSecret ?? security.totp?.secret;
361
+ return secret ? totpCodeAt(secret) : null;
362
+ }
363
+ };
364
+ }
365
+ export {
366
+ createDemoAccountConnector
367
+ };
368
+ //# sourceMappingURL=createDemoAccountConnector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createDemoAccountConnector.js","sources":["../../../src/account/demo/createDemoAccountConnector.js"],"sourcesContent":["// El conector de la cuenta de DEMOSTRACIÓN (@stackcraftmx/calcita/account-demo): todo vive en el navegador, para arrancar\n// un proyecto sin backend y ver las pantallas de la cuenta funcionando. Se cambia por el de verdad sin tocar las pantallas:\n//\n// export const accountConnector = API_URL ? createRestAccountConnector(apiClient) : createDemoAccountConnector();\n//\n// Lo que hace de verdad: la clave de la app autenticadora es real (con toQrImageUrl sale en un QR que su app escanea) y el\n// código de 6 dígitos se revisa con el mismo cálculo que un servidor (totp.js); las llaves de acceso le hablan al navegador\n// de verdad (Touch ID, Face ID, Windows Hello). Lo que NO hace: revisar contraseñas (entra el correo de la cuenta con\n// cualquiera) ni la firma de las llaves, que un servidor revisa con su librería.\n//\n// La sesión se recuerda en este navegador (localStorage); la seguridad vive en la memoria de la pestaña: al recargar, la\n// verificación en dos pasos vuelve a estar apagada. Los mensajes salen en el idioma de la app, como los mandaría un backend.\n//\n// Funciones del servidor de demostración, sin React: function (regla de la casa). Pruebas en createDemoAccountConnector.test.js.\nimport {ApiError} from '@/api/ApiError.js';\nimport {isValidTotpCode, newTotpSecret, otpauthUrlOf, totpCodeAt} from '@/account/demo/totp.js';\nimport {translateToolkit} from '@/toolkit/toolkitSettings.js';\n\nconst HTTP_STATUS = Object.freeze({unauthorized: 401, unprocessable: 422, locked: 423});\n// la persona de la demostración (datos inventados)\nconst DEMO_USER = Object.freeze({id: 'user-demo', name: 'Ana Martínez Ruiz', email: 'ana.martinez@ejemplo.com', subtitle: 'Administración', phone: ''});\nconst DEFAULT_STORAGE_KEY = 'calcita-demo:session';\n// lo que tarda una respuesta: sin espera no se verían los botones ocupados\nconst DEFAULT_DELAY_MILLISECONDS = 400;\n// quién emite la cuenta en la app autenticadora (lo que se ve arriba del código)\nconst DEFAULT_ISSUER = 'Calcita';\n// los códigos de recuperación: 10, de la forma ABCDE-FGHJK, sin letras que se confunden (I, O, 0, 1)\nconst RECOVERY_CODE_COUNT = 10;\nconst RECOVERY_CODE_ALPHABET = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';\n// el segundo paso: cuántos códigos equivocados se aceptan y cuánto tiempo hay para escribirlo\nconst SECOND_STEP_ATTEMPTS = 5;\nconst SECOND_STEP_MINUTES = 5;\nconst MILLISECONDS_PER_MINUTE = 60_000;\nconst MILLISECONDS_PER_HOUR = 60 * MILLISECONDS_PER_MINUTE;\nconst PASSKEY_TIMEOUT_MILLISECONDS = 60_000;\nconst CHALLENGE_BYTES = 32;\n// los algoritmos de firma que se aceptan para las llaves (los números de COSE: ES256 y RS256)\nconst ES256 = -7;\nconst RS256 = -257;\n// las formas del segundo paso (SECOND_STEP_METHOD de /forms)\nconst METHOD = Object.freeze({passkey: 'passkey', totp: 'totp', recoveryCode: 'recoveryCode'});\n// la red como la enseñaría un servidor: a medias, nunca la IP completa\nconst THIS_NETWORK = '187.190.x.x';\n\n/** Un mensaje del servidor de demostración en el idioma de la app. */\nconst messageOf = (key, values) => translateToolkit('account', `demo.server.${key}`, values);\n\n/** Bytes → base64url (como viajan los retos y los ids de WebAuthn). */\nfunction base64UrlOf(bytes) {\n return btoa(String.fromCharCode(...bytes)).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\n/** Este equipo según su user agent, como lo resumiría el servidor. */\nfunction thisDevice() {\n const userAgent = typeof navigator === 'undefined' ? '' : navigator.userAgent;\n const browser = /Edg\\//.test(userAgent) ? 'Edge' : /Firefox\\//.test(userAgent) ? 'Firefox' : /Chrome\\//.test(userAgent) ? 'Chrome'\n : /Safari\\//.test(userAgent) ? 'Safari' : null;\n const platform = /iPhone|iPad/.test(userAgent) ? 'iOS' : /Android/.test(userAgent) ? 'Android' : /Mac OS X/.test(userAgent) ? 'macOS'\n : /Windows/.test(userAgent) ? 'Windows' : /Linux/.test(userAgent) ? 'Linux' : null;\n return {browser, platform, isMobile: /iPhone|Android.*Mobile/.test(userAgent)};\n}\n\n/** Diez códigos nuevos, de la forma ABCDE-FGHJK. */\nfunction newRecoveryCodes() {\n return Array.from({length: RECOVERY_CODE_COUNT}, () => {\n const characters = Array.from(crypto.getRandomValues(new Uint8Array(10)), (byte) => RECOVERY_CODE_ALPHABET[byte % RECOVERY_CODE_ALPHABET.length]);\n return `${characters.slice(0, 5).join('')}-${characters.slice(5).join('')}`;\n });\n}\n\n/** El 422 con el error en su campo. */\nfunction fieldError(field, message) {\n return new ApiError({\n status: HTTP_STATUS.unprocessable,\n problem: {title: messageOf('validationTitle'), detail: messageOf('validationDetail'), errors: {[field]: [message]}},\n });\n}\n\n/**\n * @param {object} [options]\n * @param {{id: string, name: string, email: string, subtitle?: string, phone?: string}} [options.user] la persona de la\n * demostración; por omisión una inventada\n * @param {string[]} [options.roles]\n * @param {string[]} [options.abilities]\n * @param {string[]} [options.labels] sus perfiles, ya traducidos (chips en Mi perfil)\n * @param {string} [options.storageKey] dónde se recuerda la sesión en este navegador (con el nombre de la app)\n * @param {(otpauthUrl: string) => Promise<string>} [options.toQrImageUrl] el QR de la clave (p. ej. QRCode.toDataURL de\n * la librería qrcode); sin él, la persona escribe la clave a mano en su app\n * @param {string} [options.issuer] el nombre que enseña la app autenticadora\n * @param {number} [options.delayMilliseconds] lo que tarda cada respuesta\n * @returns {import('@/account/accountConnector.js').AccountConnector}\n */\nexport function createDemoAccountConnector({\n user = DEMO_USER, roles = ['admin'], abilities = [], labels = [], storageKey = DEFAULT_STORAGE_KEY, toQrImageUrl,\n issuer = DEFAULT_ISSUER, delayMilliseconds = DEFAULT_DELAY_MILLISECONDS,\n} = {}) {\n const profile = {...user};\n // la seguridad de la cuenta, en la memoria de la pestaña (con su bitácora y sus sesiones de ejemplo)\n const security = initialSecurity();\n // la persona ya puso su contraseña y le falta el segundo paso\n let pendingSecondStep = null;\n\n const wait = () => new Promise((resolve) => setTimeout(resolve, delayMilliseconds));\n\n function initialSecurity() {\n const now = Date.now();\n const device = thisDevice();\n const deviceName = `${device.browser ?? '—'} · ${device.platform ?? '—'}`;\n return {\n totp: null,\n pendingTotpSecret: null,\n passkeys: [],\n recoveryCodes: [],\n enabledAt: null,\n sessions: [\n {id: 'session-this', ...device, startedAt: new Date(now - 2 * MILLISECONDS_PER_HOUR).toISOString(), network: THIS_NETWORK, isCurrent: true},\n {id: 'session-phone', browser: 'Safari', platform: 'iOS', isMobile: true,\n startedAt: new Date(now - 26 * MILLISECONDS_PER_HOUR).toISOString(), network: '201.141.x.x', isCurrent: false},\n ],\n // de lo más nuevo a lo más viejo\n events: [\n {id: 'event-2', kind: 'signedIn', occurredAt: new Date(now - 2 * MILLISECONDS_PER_HOUR).toISOString(), device: deviceName, network: THIS_NETWORK},\n {id: 'event-1', kind: 'signInFailed', occurredAt: new Date(now - 30 * MILLISECONDS_PER_HOUR).toISOString(), device: 'Firefox · Windows', network: '177.230.x.x'},\n ],\n };\n }\n\n // ─── la sesión en este navegador ───\n\n const isSignedIn = () => {\n try {\n return window.localStorage.getItem(storageKey) === profile.id;\n } catch {\n return false;\n }\n };\n const rememberSession = (signedIn) => {\n try {\n if (signedIn) {\n window.localStorage.setItem(storageKey, profile.id);\n } else {\n window.localStorage.removeItem(storageKey);\n }\n } catch {\n // almacenamiento bloqueado: la sesión dura lo que dure la pestaña\n }\n };\n const failIfSignedOut = () => {\n if (!isSignedIn()) {\n throw new ApiError({status: HTTP_STATUS.unauthorized, problem: {title: messageOf('noSessionTitle'), detail: messageOf('noSession')}});\n }\n };\n // lo que QUITA protección pide la contraseña; en la demostración sirve cualquiera que se escriba\n const failWithoutPassword = (password) => {\n if (!password) {\n throw fieldError('password', messageOf('passwordRequired'));\n }\n };\n\n // ─── la seguridad ───\n\n const recordEvent = (kind) => {\n const device = thisDevice();\n security.events.unshift({\n id: `event-${Date.now()}-${security.events.length}`, kind, occurredAt: new Date().toISOString(),\n device: `${device.browser ?? '—'} · ${device.platform ?? '—'}`, network: THIS_NETWORK,\n });\n };\n const isSecondFactorOn = () => Boolean(security.totp) || security.passkeys.length > 0;\n const securityNow = () => ({\n isEnabled: isSecondFactorOn(),\n enabledAt: security.enabledAt,\n passkeys: security.passkeys.map(({id, name, createdAt, lastUsedAt}) => ({id, name, createdAt, lastUsedAt})),\n totp: {isEnabled: Boolean(security.totp), enabledAt: security.totp?.enabledAt ?? null},\n recoveryCodesRemaining: security.recoveryCodes.length,\n });\n // la primera protección que se prende activa la verificación y genera los códigos (se enseñan una sola vez)\n const turnOnIfFirstFactor = (wasOn) => {\n if (wasOn) {\n return undefined;\n }\n security.enabledAt = new Date().toISOString();\n security.recoveryCodes = newRecoveryCodes();\n recordEvent('twoStepEnabled');\n return [...security.recoveryCodes];\n };\n // al quitar la última, la verificación se apaga y los códigos dejan de servir\n const turnOffIfNoFactorLeft = () => {\n if (!isSecondFactorOn()) {\n security.enabledAt = null;\n security.recoveryCodes = [];\n recordEvent('twoStepDisabled');\n }\n };\n\n // ─── el segundo paso ───\n\n const pendingOrFail = () => {\n if (!pendingSecondStep || Date.now() > pendingSecondStep.expiresAt) {\n pendingSecondStep = null;\n throw new ApiError({status: HTTP_STATUS.unauthorized, problem: {code: 'second_step_expired', title: messageOf('expiredTitle'), detail: messageOf('expired')}});\n }\n };\n // un código equivocado resta un intento; sin intentos se bloquea (423) y hay que empezar de nuevo\n const failSecondStep = () => {\n pendingSecondStep.attemptsLeft -= 1;\n recordEvent('signInFailed');\n if (pendingSecondStep.attemptsLeft <= 0) {\n pendingSecondStep = null;\n throw new ApiError({status: HTTP_STATUS.locked, problem: {code: 'account_locked', title: messageOf('lockedTitle'), detail: messageOf('locked')}});\n }\n throw new ApiError({\n status: HTTP_STATUS.unauthorized,\n problem: {code: 'invalid_code', title: messageOf('wrongCodeTitle'), detail: messageOf('wrongCode'), remaining_attempts: pendingSecondStep.attemptsLeft},\n });\n };\n const finishSignIn = (kind = 'signedIn') => {\n pendingSecondStep = null;\n rememberSession(true);\n recordEvent(kind);\n };\n const passkeyChallenge = () => base64UrlOf(crypto.getRandomValues(new Uint8Array(CHALLENGE_BYTES)));\n\n return {\n loadSession: async () => {\n await wait();\n return isSignedIn() ? {user: {...profile}, roles: [...roles], abilities: [...abilities], labels: [...labels]} : null;\n },\n signIn: async ({email}) => {\n await wait();\n if (email?.trim().toLowerCase() !== profile.email.toLowerCase()) {\n throw new ApiError({\n status: HTTP_STATUS.unauthorized,\n problem: {title: messageOf('wrongCredentialsTitle'), detail: messageOf('wrongCredentials', {email: profile.email})},\n });\n }\n if (!isSecondFactorOn()) {\n finishSignIn();\n return {secondStep: null};\n }\n pendingSecondStep = {expiresAt: Date.now() + SECOND_STEP_MINUTES * MILLISECONDS_PER_MINUTE, attemptsLeft: SECOND_STEP_ATTEMPTS};\n const methods = [\n ...(security.passkeys.length > 0 ? [METHOD.passkey] : []),\n ...(security.totp ? [METHOD.totp] : []),\n ...(security.recoveryCodes.length > 0 ? [METHOD.recoveryCode] : []),\n ];\n return {secondStep: {methods}};\n },\n signInSecondStep: async ({method, code}) => {\n await wait();\n pendingOrFail();\n if (method === METHOD.recoveryCode) {\n if (!security.recoveryCodes.includes(code)) {\n failSecondStep();\n }\n // cada código sirve una sola vez\n security.recoveryCodes = security.recoveryCodes.filter((unusedCode) => unusedCode !== code);\n finishSignIn('recoveryCodeUsed');\n return;\n }\n if (!security.totp || !(await isValidTotpCode(security.totp.secret, code))) {\n failSecondStep();\n }\n finishSignIn();\n },\n secondStepPasskeyOptions: async () => {\n await wait();\n pendingOrFail();\n return {\n challenge: passkeyChallenge(), rpId: window.location.hostname, userVerification: 'preferred', timeout: PASSKEY_TIMEOUT_MILLISECONDS,\n allowCredentials: security.passkeys.map((passkey) => ({id: passkey.credentialId, type: 'public-key'})),\n };\n },\n signInWithPasskey: async (credential) => {\n await wait();\n pendingOrFail();\n const passkey = security.passkeys.find((candidate) => candidate.credentialId === credential?.id);\n if (!passkey) {\n failSecondStep();\n }\n passkey.lastUsedAt = new Date().toISOString();\n finishSignIn();\n },\n signOut: async () => {\n await wait();\n rememberSession(false);\n },\n requestPasswordReset: async () => {\n await wait();\n },\n resetPassword: async () => {\n await wait();\n recordEvent('passwordChanged');\n },\n updateProfile: async ({name, phone}) => {\n await wait();\n failIfSignedOut();\n if (!name?.trim()) {\n throw fieldError('name', messageOf('nameRequired'));\n }\n profile.name = name.trim();\n profile.phone = phone?.trim() ?? '';\n return {message: messageOf('profileSaved')};\n },\n changePassword: async () => {\n await wait();\n failIfSignedOut();\n recordEvent('passwordChanged');\n },\n loadSecurity: async () => {\n await wait();\n failIfSignedOut();\n return securityNow();\n },\n startTotp: async () => {\n await wait();\n failIfSignedOut();\n security.pendingTotpSecret = newTotpSecret();\n const otpauthUrl = otpauthUrlOf({secret: security.pendingTotpSecret, account: profile.email, issuer});\n return {secret: security.pendingTotpSecret, qrImageUrl: toQrImageUrl ? await toQrImageUrl(otpauthUrl) : null};\n },\n confirmTotp: async (code) => {\n await wait();\n failIfSignedOut();\n if (!security.pendingTotpSecret || !(await isValidTotpCode(security.pendingTotpSecret, code))) {\n throw fieldError('code', messageOf('wrongCode'));\n }\n const wasOn = isSecondFactorOn();\n security.totp = {secret: security.pendingTotpSecret, enabledAt: new Date().toISOString()};\n security.pendingTotpSecret = null;\n const recoveryCodes = turnOnIfFirstFactor(wasOn);\n return {security: securityNow(), recoveryCodes};\n },\n disableTotp: async (password) => {\n await wait();\n failIfSignedOut();\n failWithoutPassword(password);\n security.totp = null;\n turnOffIfNoFactorLeft();\n return {security: securityNow()};\n },\n passkeyRegistrationOptions: async () => {\n await wait();\n failIfSignedOut();\n return {\n challenge: passkeyChallenge(),\n rp: {name: issuer, id: window.location.hostname},\n user: {id: base64UrlOf(new TextEncoder().encode(profile.id)), name: profile.email, displayName: profile.name},\n pubKeyCredParams: [{type: 'public-key', alg: ES256}, {type: 'public-key', alg: RS256}],\n timeout: PASSKEY_TIMEOUT_MILLISECONDS,\n attestation: 'none',\n // las que ya tiene: el navegador avisa si la persona intenta registrar la misma otra vez\n excludeCredentials: security.passkeys.map((passkey) => ({id: passkey.credentialId, type: 'public-key'})),\n authenticatorSelection: {residentKey: 'preferred', userVerification: 'preferred'},\n };\n },\n savePasskey: async ({name, credential}) => {\n await wait();\n failIfSignedOut();\n const wasOn = isSecondFactorOn();\n security.passkeys.push({\n id: `passkey-${Date.now()}`, credentialId: credential?.id,\n name: name?.trim() || messageOf('defaultPasskeyName', {number: security.passkeys.length + 1}),\n createdAt: new Date().toISOString(), lastUsedAt: null,\n });\n recordEvent('passkeyAdded');\n const recoveryCodes = turnOnIfFirstFactor(wasOn);\n return {security: securityNow(), recoveryCodes};\n },\n removePasskey: async ({passkeyId, password}) => {\n await wait();\n failIfSignedOut();\n failWithoutPassword(password);\n security.passkeys = security.passkeys.filter((passkey) => passkey.id !== passkeyId);\n recordEvent('passkeyRemoved');\n turnOffIfNoFactorLeft();\n return {security: securityNow()};\n },\n regenerateRecoveryCodes: async (password) => {\n await wait();\n failIfSignedOut();\n failWithoutPassword(password);\n security.recoveryCodes = newRecoveryCodes();\n recordEvent('recoveryCodesGenerated');\n return {security: securityNow(), recoveryCodes: [...security.recoveryCodes]};\n },\n listSessions: async () => {\n await wait();\n failIfSignedOut();\n return security.sessions.map((session) => ({...session}));\n },\n closeOtherSessions: async () => {\n await wait();\n failIfSignedOut();\n const closed = security.sessions.filter((session) => !session.isCurrent).length;\n security.sessions = security.sessions.filter((session) => session.isCurrent);\n if (closed > 0) {\n recordEvent('sessionsClosed');\n }\n return closed;\n },\n listActivity: async () => {\n await wait();\n failIfSignedOut();\n return security.events.map((event) => ({...event}));\n },\n // solo de la demostración: el código que enseñaría la app ahorita, con la clave por activar o la ya activa\n demoTotpCode: async () => {\n const secret = security.pendingTotpSecret ?? security.totp?.secret;\n return secret ? totpCodeAt(secret) : null;\n },\n };\n}\n"],"names":[],"mappings":"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"}