@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,61 @@
1
+ const BASE32_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
2
+ const STEP_SECONDS = 30;
3
+ const CODE_DIGITS = 6;
4
+ const ACCEPTED_DRIFT_STEPS = 1;
5
+ const SECRET_BYTES = 20;
6
+ function base32Of(bytes) {
7
+ let bits = "";
8
+ for (const byte of bytes) {
9
+ bits += byte.toString(2).padStart(8, "0");
10
+ }
11
+ let text = "";
12
+ for (let start = 0; start < bits.length; start += 5) {
13
+ text += BASE32_ALPHABET[parseInt(bits.slice(start, start + 5).padEnd(5, "0"), 2)];
14
+ }
15
+ return text;
16
+ }
17
+ function bytesOfBase32(text) {
18
+ const bits = text.replace(/[\s=]/g, "").toUpperCase().split("").map((character) => BASE32_ALPHABET.indexOf(character).toString(2).padStart(5, "0")).join("");
19
+ const bytes = new Uint8Array(Math.floor(bits.length / 8));
20
+ for (let index = 0; index < bytes.length; index += 1) {
21
+ bytes[index] = parseInt(bits.slice(index * 8, index * 8 + 8), 2);
22
+ }
23
+ return bytes;
24
+ }
25
+ function newTotpSecret() {
26
+ return base32Of(crypto.getRandomValues(new Uint8Array(SECRET_BYTES)));
27
+ }
28
+ async function codeOfStep(secret, step, digits = CODE_DIGITS) {
29
+ const counter = new ArrayBuffer(8);
30
+ new DataView(counter).setBigUint64(0, BigInt(step));
31
+ const key = await crypto.subtle.importKey("raw", bytesOfBase32(secret), { name: "HMAC", hash: "SHA-1" }, false, ["sign"]);
32
+ const hmac = new Uint8Array(await crypto.subtle.sign("HMAC", key, counter));
33
+ const offset = hmac[hmac.length - 1] & 15;
34
+ const number = (hmac[offset] & 127) << 24 | hmac[offset + 1] << 16 | hmac[offset + 2] << 8 | hmac[offset + 3];
35
+ return String(number % 10 ** digits).padStart(digits, "0");
36
+ }
37
+ function totpCodeAt(secret, timeMilliseconds = Date.now(), digits = CODE_DIGITS) {
38
+ return codeOfStep(secret, Math.floor(timeMilliseconds / 1e3 / STEP_SECONDS), digits);
39
+ }
40
+ async function isValidTotpCode(secret, code, timeMilliseconds = Date.now()) {
41
+ const currentStep = Math.floor(timeMilliseconds / 1e3 / STEP_SECONDS);
42
+ for (let drift = -ACCEPTED_DRIFT_STEPS; drift <= ACCEPTED_DRIFT_STEPS; drift += 1) {
43
+ if (await codeOfStep(secret, currentStep + drift) === code) {
44
+ return true;
45
+ }
46
+ }
47
+ return false;
48
+ }
49
+ function otpauthUrlOf({ secret, account, issuer }) {
50
+ const label = encodeURIComponent(`${issuer}:${account}`);
51
+ return `otpauth://totp/${label}?secret=${secret}&issuer=${encodeURIComponent(issuer)}&digits=${CODE_DIGITS}&period=${STEP_SECONDS}`;
52
+ }
53
+ export {
54
+ base32Of,
55
+ bytesOfBase32,
56
+ isValidTotpCode,
57
+ newTotpSecret,
58
+ otpauthUrlOf,
59
+ totpCodeAt
60
+ };
61
+ //# sourceMappingURL=totp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"totp.js","sources":["../../../src/account/demo/totp.js"],"sourcesContent":["// Los códigos de 6 dígitos de una app autenticadora (TOTP, RFC 6238): los mismos que calcula Google Authenticator con la\n// clave que se escaneó. En un proyecto real esto lo hace el servidor (pyotp, otplib, spomky-labs/otphp); aquí lo usa el\n// conector de demostración (y el servidor de mentira de los ejemplos) para que la verificación funcione con la app de verdad.\n//\n// El código sale de la clave y de la hora: HMAC-SHA1 de los «pasos» de 30 segundos desde 1970, recortado a 6 dígitos.\n// Al revisar se acepta el paso de antes y el de después: el reloj del teléfono puede ir unos segundos desfasado.\n//\n// Funciones puras con crypto.subtle (navegador y node): function (regla de la casa).\n\nconst BASE32_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\nconst STEP_SECONDS = 30;\nconst CODE_DIGITS = 6;\n// cuántos pasos de diferencia se aceptan al revisar (el de antes y el de después)\nconst ACCEPTED_DRIFT_STEPS = 1;\nconst SECRET_BYTES = 20;\n\n/**\n * Bytes → base32 (la clave como la escribe la persona en su app).\n *\n * @param {Uint8Array} bytes\n * @returns {string}\n */\nexport function base32Of(bytes) {\n let bits = '';\n for (const byte of bytes) {\n bits += byte.toString(2).padStart(8, '0');\n }\n let text = '';\n for (let start = 0; start < bits.length; start += 5) {\n text += BASE32_ALPHABET[parseInt(bits.slice(start, start + 5).padEnd(5, '0'), 2)];\n }\n return text;\n}\n\n/**\n * Base32 → bytes (sin espacios ni relleno).\n *\n * @param {string} text\n * @returns {Uint8Array}\n */\nexport function bytesOfBase32(text) {\n const bits = text.replace(/[\\s=]/g, '').toUpperCase().split('')\n .map((character) => BASE32_ALPHABET.indexOf(character).toString(2).padStart(5, '0')).join('');\n const bytes = new Uint8Array(Math.floor(bits.length / 8));\n for (let index = 0; index < bytes.length; index += 1) {\n bytes[index] = parseInt(bits.slice(index * 8, index * 8 + 8), 2);\n }\n return bytes;\n}\n\n/** Una clave nueva al azar, en base32. */\nexport function newTotpSecret() {\n return base32Of(crypto.getRandomValues(new Uint8Array(SECRET_BYTES)));\n}\n\n/**\n * El código de un paso de 30 segundos.\n *\n * @param {string} secret la clave en base32\n * @param {number} step los pasos de 30 segundos desde 1970\n * @param {number} [digits]\n * @returns {Promise<string>}\n */\nasync function codeOfStep(secret, step, digits = CODE_DIGITS) {\n const counter = new ArrayBuffer(8);\n new DataView(counter).setBigUint64(0, BigInt(step));\n const key = await crypto.subtle.importKey('raw', bytesOfBase32(secret), {name: 'HMAC', hash: 'SHA-1'}, false, ['sign']);\n const hmac = new Uint8Array(await crypto.subtle.sign('HMAC', key, counter));\n // el recorte del RFC: 4 bytes desde la posición que dicen los últimos 4 bits\n const offset = hmac[hmac.length - 1] & 0x0f;\n const number = ((hmac[offset] & 0x7f) << 24) | (hmac[offset + 1] << 16) | (hmac[offset + 2] << 8) | hmac[offset + 3];\n return String(number % 10 ** digits).padStart(digits, '0');\n}\n\n/**\n * El código que enseña la app en ese momento.\n *\n * @param {string} secret la clave en base32\n * @param {number} [timeMilliseconds] por omisión, ahora\n * @param {number} [digits]\n * @returns {Promise<string>}\n */\nexport function totpCodeAt(secret, timeMilliseconds = Date.now(), digits = CODE_DIGITS) {\n return codeOfStep(secret, Math.floor(timeMilliseconds / 1000 / STEP_SECONDS), digits);\n}\n\n/**\n * ¿El código es el de ahora (o el de un paso antes o después)?\n *\n * @param {string} secret\n * @param {string} code los 6 dígitos\n * @param {number} [timeMilliseconds]\n * @returns {Promise<boolean>}\n */\nexport async function isValidTotpCode(secret, code, timeMilliseconds = Date.now()) {\n const currentStep = Math.floor(timeMilliseconds / 1000 / STEP_SECONDS);\n for (let drift = -ACCEPTED_DRIFT_STEPS; drift <= ACCEPTED_DRIFT_STEPS; drift += 1) {\n if (await codeOfStep(secret, currentStep + drift) === code) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * La dirección otpauth:// que va en el QR: la app la lee y guarda la cuenta con su clave.\n *\n * @param {{secret: string, account: string, issuer: string}} details\n * @returns {string}\n */\nexport function otpauthUrlOf({secret, account, issuer}) {\n const label = encodeURIComponent(`${issuer}:${account}`);\n return `otpauth://totp/${label}?secret=${secret}&issuer=${encodeURIComponent(issuer)}&digits=${CODE_DIGITS}&period=${STEP_SECONDS}`;\n}\n"],"names":[],"mappings":"AASA,MAAM,kBAAkB;AACxB,MAAM,eAAe;AACrB,MAAM,cAAc;AAEpB,MAAM,uBAAuB;AAC7B,MAAM,eAAe;AAQd,SAAS,SAAS,OAAO;AAC5B,MAAI,OAAO;AACX,aAAW,QAAQ,OAAO;AACtB,YAAQ,KAAK,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG;AAAA,EAC5C;AACA,MAAI,OAAO;AACX,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACjD,YAAQ,gBAAgB,SAAS,KAAK,MAAM,OAAO,QAAQ,CAAC,EAAE,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC;AAAA,EACpF;AACA,SAAO;AACX;AAQO,SAAS,cAAc,MAAM;AAChC,QAAM,OAAO,KAAK,QAAQ,UAAU,EAAE,EAAE,cAAc,MAAM,EAAE,EACzD,IAAI,CAAC,cAAc,gBAAgB,QAAQ,SAAS,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAChG,QAAM,QAAQ,IAAI,WAAW,KAAK,MAAM,KAAK,SAAS,CAAC,CAAC;AACxD,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AAClD,UAAM,KAAK,IAAI,SAAS,KAAK,MAAM,QAAQ,GAAG,QAAQ,IAAI,CAAC,GAAG,CAAC;AAAA,EACnE;AACA,SAAO;AACX;AAGO,SAAS,gBAAgB;AAC5B,SAAO,SAAS,OAAO,gBAAgB,IAAI,WAAW,YAAY,CAAC,CAAC;AACxE;AAUA,eAAe,WAAW,QAAQ,MAAM,SAAS,aAAa;AAC1D,QAAM,UAAU,IAAI,YAAY,CAAC;AACjC,MAAI,SAAS,OAAO,EAAE,aAAa,GAAG,OAAO,IAAI,CAAC;AAClD,QAAM,MAAM,MAAM,OAAO,OAAO,UAAU,OAAO,cAAc,MAAM,GAAG,EAAC,MAAM,QAAQ,MAAM,QAAO,GAAG,OAAO,CAAC,MAAM,CAAC;AACtH,QAAM,OAAO,IAAI,WAAW,MAAM,OAAO,OAAO,KAAK,QAAQ,KAAK,OAAO,CAAC;AAE1E,QAAM,SAAS,KAAK,KAAK,SAAS,CAAC,IAAI;AACvC,QAAM,UAAW,KAAK,MAAM,IAAI,QAAS,KAAO,KAAK,SAAS,CAAC,KAAK,KAAO,KAAK,SAAS,CAAC,KAAK,IAAK,KAAK,SAAS,CAAC;AACnH,SAAO,OAAO,SAAS,MAAM,MAAM,EAAE,SAAS,QAAQ,GAAG;AAC7D;AAUO,SAAS,WAAW,QAAQ,mBAAmB,KAAK,IAAG,GAAI,SAAS,aAAa;AACpF,SAAO,WAAW,QAAQ,KAAK,MAAM,mBAAmB,MAAO,YAAY,GAAG,MAAM;AACxF;AAUO,eAAe,gBAAgB,QAAQ,MAAM,mBAAmB,KAAK,IAAG,GAAI;AAC/E,QAAM,cAAc,KAAK,MAAM,mBAAmB,MAAO,YAAY;AACrE,WAAS,QAAQ,CAAC,sBAAsB,SAAS,sBAAsB,SAAS,GAAG;AAC/E,QAAI,MAAM,WAAW,QAAQ,cAAc,KAAK,MAAM,MAAM;AACxD,aAAO;AAAA,IACX;AAAA,EACJ;AACA,SAAO;AACX;AAQO,SAAS,aAAa,EAAC,QAAQ,SAAS,OAAM,GAAG;AACpD,QAAM,QAAQ,mBAAmB,GAAG,MAAM,IAAI,OAAO,EAAE;AACvD,SAAO,kBAAkB,KAAK,WAAW,MAAM,WAAW,mBAAmB,MAAM,CAAC,WAAW,WAAW,WAAW,YAAY;AACrI;"}
@@ -0,0 +1,117 @@
1
+ const ACCOUNT_REST_PATHS = Object.freeze({
2
+ session: "/auth/session",
3
+ signIn: "/auth/sign-in",
4
+ secondStep: "/auth/second-step",
5
+ secondStepPasskeyOptions: "/auth/second-step/passkey-options",
6
+ secondStepPasskey: "/auth/second-step/passkey",
7
+ signOut: "/auth/sign-out",
8
+ forgotPassword: "/auth/forgot-password",
9
+ resetPassword: "/auth/reset-password",
10
+ profile: "/account",
11
+ password: "/account/password",
12
+ security: "/account/security",
13
+ totp: "/account/security/totp",
14
+ totpConfirm: "/account/security/totp/confirm",
15
+ passkeyRegistrationOptions: "/account/security/passkeys/registration-options",
16
+ passkeys: "/account/security/passkeys",
17
+ recoveryCodes: "/account/security/recovery-codes",
18
+ sessions: "/account/sessions",
19
+ closeOtherSessions: "/account/sessions/close-others",
20
+ activity: "/account/activity"
21
+ });
22
+ const SECOND_STEP_METHOD_IN_API = Object.freeze({ passkey: "passkey", totp: "totp", recoveryCode: "recovery_code" });
23
+ const SECOND_STEP_METHOD_FROM_API = Object.freeze({ passkey: "passkey", totp: "totp", recovery_code: "recoveryCode" });
24
+ function securityFromResponse(response) {
25
+ return {
26
+ isEnabled: Boolean(response.is_enabled),
27
+ enabledAt: response.enabled_at ?? null,
28
+ passkeys: (response.passkeys ?? []).map((passkey) => ({
29
+ id: passkey.id,
30
+ name: passkey.name,
31
+ createdAt: passkey.created_at,
32
+ lastUsedAt: passkey.last_used_at ?? null
33
+ })),
34
+ totp: { isEnabled: Boolean(response.totp?.is_enabled), enabledAt: response.totp?.enabled_at ?? null },
35
+ recoveryCodesRemaining: response.recovery_codes_remaining ?? 0
36
+ };
37
+ }
38
+ function securityChangeFromResponse(response) {
39
+ return { security: securityFromResponse(response.security), recoveryCodes: response.recovery_codes ?? void 0 };
40
+ }
41
+ function createRestAccountConnector(apiClient, { paths = {} } = {}) {
42
+ const path = { ...ACCOUNT_REST_PATHS, ...paths };
43
+ return {
44
+ loadSession: async () => {
45
+ try {
46
+ return await apiClient.get(path.session, { skipUnauthenticatedHandler: true });
47
+ } catch (error) {
48
+ if (error?.isUnauthenticated) {
49
+ return null;
50
+ }
51
+ throw error;
52
+ }
53
+ },
54
+ signIn: async ({ email, password, remember }) => {
55
+ const response = await apiClient.post(path.signIn, { email, password, remember }, { skipUnauthenticatedHandler: true });
56
+ const methods = response?.second_step?.methods;
57
+ return { secondStep: methods ? { methods: methods.map((method) => SECOND_STEP_METHOD_FROM_API[method] ?? method) } : null };
58
+ },
59
+ signInSecondStep: async ({ method, code }) => {
60
+ await apiClient.post(path.secondStep, { method: SECOND_STEP_METHOD_IN_API[method] ?? method, code }, { skipUnauthenticatedHandler: true });
61
+ },
62
+ secondStepPasskeyOptions: () => apiClient.get(path.secondStepPasskeyOptions, { skipUnauthenticatedHandler: true }),
63
+ signInWithPasskey: async (credential) => {
64
+ await apiClient.post(path.secondStepPasskey, { credential }, { skipUnauthenticatedHandler: true });
65
+ },
66
+ signOut: async () => {
67
+ await apiClient.post(path.signOut, void 0, { skipUnauthenticatedHandler: true });
68
+ },
69
+ requestPasswordReset: async ({ email }) => {
70
+ await apiClient.post(path.forgotPassword, { email });
71
+ },
72
+ resetPassword: async ({ token, newPassword }) => {
73
+ await apiClient.post(path.resetPassword, { token, new_password: newPassword });
74
+ },
75
+ updateProfile: async ({ name, phone }) => await apiClient.put(path.profile, { name, phone }) ?? {},
76
+ changePassword: async ({ currentPassword, newPassword }) => {
77
+ await apiClient.put(path.password, { current_password: currentPassword, new_password: newPassword });
78
+ },
79
+ loadSecurity: async () => securityFromResponse(await apiClient.get(path.security)),
80
+ startTotp: async () => {
81
+ const response = await apiClient.post(path.totp);
82
+ return { secret: response.secret, qrImageUrl: response.qr_image_url ?? null };
83
+ },
84
+ confirmTotp: async (code) => securityChangeFromResponse(await apiClient.post(path.totpConfirm, { code })),
85
+ disableTotp: async (password) => securityChangeFromResponse(await apiClient.delete(path.totp, { body: { password } })),
86
+ passkeyRegistrationOptions: () => apiClient.get(path.passkeyRegistrationOptions),
87
+ savePasskey: async ({ name, credential }) => securityChangeFromResponse(await apiClient.post(path.passkeys, { name, credential })),
88
+ removePasskey: async ({ passkeyId, password }) => securityChangeFromResponse(
89
+ await apiClient.delete(`${path.passkeys}/${encodeURIComponent(passkeyId)}`, { body: { password } })
90
+ ),
91
+ regenerateRecoveryCodes: async (password) => securityChangeFromResponse(await apiClient.post(path.recoveryCodes, { password })),
92
+ listSessions: async () => (await apiClient.get(path.sessions)).map((session) => ({
93
+ id: session.id,
94
+ browser: session.browser,
95
+ platform: session.platform,
96
+ isMobile: Boolean(session.is_mobile),
97
+ startedAt: session.started_at,
98
+ network: session.network,
99
+ isCurrent: Boolean(session.is_current)
100
+ })),
101
+ closeOtherSessions: async () => (await apiClient.post(path.closeOtherSessions))?.closed ?? 0,
102
+ listActivity: async () => (await apiClient.get(path.activity)).map((event) => ({
103
+ id: event.id,
104
+ kind: event.kind,
105
+ occurredAt: event.occurred_at,
106
+ device: event.device,
107
+ network: event.network
108
+ }))
109
+ };
110
+ }
111
+ export {
112
+ ACCOUNT_REST_PATHS,
113
+ createRestAccountConnector,
114
+ securityChangeFromResponse,
115
+ securityFromResponse
116
+ };
117
+ //# sourceMappingURL=restAccountConnector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restAccountConnector.js","sources":["../../src/account/restAccountConnector.js"],"sourcesContent":["// El conector de la cuenta para un backend REST que sigue este contrato (llaves en snake_case, errores RFC 9457). Si el\n// backend lo sigue, conectar la cuenta es una línea:\n//\n// export const accountConnector = createRestAccountConnector(apiClient);\n//\n// Si alguna ruta se llama distinto, se cambia en `paths`; si alguna respuesta tiene otra forma, se reemplaza esa función:\n//\n// export const accountConnector = {...createRestAccountConnector(apiClient), signIn: async (credentials) => …};\n//\n// El contrato (las rutas por omisión, ACCOUNT_REST_PATHS):\n//\n// GET /auth/session → {user, roles, abilities, labels} | 401 si nadie está dentro\n// POST /auth/sign-in {email, password, remember} → {second_step: {methods} | null}\n// POST /auth/second-step {method, code} → 204 (method: totp | recovery_code)\n// GET /auth/second-step/passkey-options → opciones de WebAuthn para firmar\n// POST /auth/second-step/passkey {credential} → 204\n// POST /auth/sign-out → 204\n// POST /auth/forgot-password {email} → 204 (igual exista o no el correo)\n// POST /auth/reset-password {token, new_password} → 204\n// PUT /account {name, phone} → {message?}\n// PUT /account/password {current_password, new_password} → 204\n// GET /account/security → el estado de la verificación (abajo)\n// POST /account/security/totp → {secret, qr_image_url}\n// POST /account/security/totp/confirm {code} → {security, recovery_codes?}\n// DELETE /account/security/totp {password} → {security}\n// GET /account/security/passkeys/registration-options → opciones de WebAuthn para crear\n// POST /account/security/passkeys {name, credential} → {security, recovery_codes?}\n// DELETE /account/security/passkeys/{id} {password} → {security}\n// POST /account/security/recovery-codes {password} → {security, recovery_codes}\n// GET /account/sessions → [{id, browser, platform, is_mobile, started_at, network, is_current}]\n// POST /account/sessions/close-others → {closed}\n// GET /account/activity → [{id, kind, occurred_at, device, network}]\n//\n// El estado de la verificación: {is_enabled, enabled_at, passkeys: [{id, name, created_at, last_used_at}],\n// totp: {is_enabled, enabled_at}, recovery_codes_remaining}. Las opciones y la firma de WebAuthn viajan tal cual (las arma\n// y las revisa la librería del servidor: py_webauthn, @simplewebauthn/server, web-auth/webauthn-lib).\n//\n// Funciones puras, no renderizan: function (regla de la casa). Pruebas en restAccountConnector.test.js.\n\n/** Las rutas del contrato; se pegan a la baseUrl del cliente (/api + /auth/session). */\nexport const ACCOUNT_REST_PATHS = Object.freeze({\n session: '/auth/session',\n signIn: '/auth/sign-in',\n secondStep: '/auth/second-step',\n secondStepPasskeyOptions: '/auth/second-step/passkey-options',\n secondStepPasskey: '/auth/second-step/passkey',\n signOut: '/auth/sign-out',\n forgotPassword: '/auth/forgot-password',\n resetPassword: '/auth/reset-password',\n profile: '/account',\n password: '/account/password',\n security: '/account/security',\n totp: '/account/security/totp',\n totpConfirm: '/account/security/totp/confirm',\n passkeyRegistrationOptions: '/account/security/passkeys/registration-options',\n passkeys: '/account/security/passkeys',\n recoveryCodes: '/account/security/recovery-codes',\n sessions: '/account/sessions',\n closeOtherSessions: '/account/sessions/close-others',\n activity: '/account/activity',\n});\n\n// cómo se llama cada método del segundo paso en el contrato (snake_case) y en las pantallas (SECOND_STEP_METHOD)\nconst SECOND_STEP_METHOD_IN_API = Object.freeze({passkey: 'passkey', totp: 'totp', recoveryCode: 'recovery_code'});\nconst SECOND_STEP_METHOD_FROM_API = Object.freeze({passkey: 'passkey', totp: 'totp', recovery_code: 'recoveryCode'});\n\n/**\n * El estado de la verificación, del contrato a camelCase.\n *\n * @param {object} response\n * @returns {import('@/account/accountConnector.js').AccountSecurity}\n */\nexport function securityFromResponse(response) {\n return {\n isEnabled: Boolean(response.is_enabled),\n enabledAt: response.enabled_at ?? null,\n passkeys: (response.passkeys ?? []).map((passkey) => ({\n id: passkey.id, name: passkey.name, createdAt: passkey.created_at, lastUsedAt: passkey.last_used_at ?? null,\n })),\n totp: {isEnabled: Boolean(response.totp?.is_enabled), enabledAt: response.totp?.enabled_at ?? null},\n recoveryCodesRemaining: response.recovery_codes_remaining ?? 0,\n };\n}\n\n/**\n * Lo que regresa un cambio de seguridad: {security, recovery_codes?} → {security, recoveryCodes?}.\n *\n * @param {object} response\n * @returns {import('@/account/accountConnector.js').AccountSecurityChange}\n */\nexport function securityChangeFromResponse(response) {\n return {security: securityFromResponse(response.security), recoveryCodes: response.recovery_codes ?? undefined};\n}\n\n/**\n * @param {{get: Function, post: Function, put: Function, delete: Function}} apiClient el de createApiClient\n * @param {{paths?: Partial<Record<keyof typeof ACCOUNT_REST_PATHS, string>>}} [options] las rutas que se llaman distinto\n * @returns {import('@/account/accountConnector.js').AccountConnector}\n */\nexport function createRestAccountConnector(apiClient, {paths = {}} = {}) {\n const path = {...ACCOUNT_REST_PATHS, ...paths};\n\n return {\n loadSession: async () => {\n try {\n // sin el aviso de «sesión vencida»: aquí que no haya sesión es una respuesta normal\n return await apiClient.get(path.session, {skipUnauthenticatedHandler: true});\n } catch (error) {\n if (error?.isUnauthenticated) {\n return null;\n }\n throw error;\n }\n },\n signIn: async ({email, password, remember}) => {\n const response = await apiClient.post(path.signIn, {email, password, remember}, {skipUnauthenticatedHandler: true});\n const methods = response?.second_step?.methods;\n return {secondStep: methods ? {methods: methods.map((method) => SECOND_STEP_METHOD_FROM_API[method] ?? method)} : null};\n },\n signInSecondStep: async ({method, code}) => {\n await apiClient.post(path.secondStep, {method: SECOND_STEP_METHOD_IN_API[method] ?? method, code}, {skipUnauthenticatedHandler: true});\n },\n secondStepPasskeyOptions: () => apiClient.get(path.secondStepPasskeyOptions, {skipUnauthenticatedHandler: true}),\n signInWithPasskey: async (credential) => {\n await apiClient.post(path.secondStepPasskey, {credential}, {skipUnauthenticatedHandler: true});\n },\n signOut: async () => {\n await apiClient.post(path.signOut, undefined, {skipUnauthenticatedHandler: true});\n },\n requestPasswordReset: async ({email}) => {\n await apiClient.post(path.forgotPassword, {email});\n },\n resetPassword: async ({token, newPassword}) => {\n await apiClient.post(path.resetPassword, {token, new_password: newPassword});\n },\n updateProfile: async ({name, phone}) => (await apiClient.put(path.profile, {name, phone})) ?? {},\n changePassword: async ({currentPassword, newPassword}) => {\n await apiClient.put(path.password, {current_password: currentPassword, new_password: newPassword});\n },\n loadSecurity: async () => securityFromResponse(await apiClient.get(path.security)),\n startTotp: async () => {\n const response = await apiClient.post(path.totp);\n return {secret: response.secret, qrImageUrl: response.qr_image_url ?? null};\n },\n confirmTotp: async (code) => securityChangeFromResponse(await apiClient.post(path.totpConfirm, {code})),\n disableTotp: async (password) => securityChangeFromResponse(await apiClient.delete(path.totp, {body: {password}})),\n passkeyRegistrationOptions: () => apiClient.get(path.passkeyRegistrationOptions),\n savePasskey: async ({name, credential}) => securityChangeFromResponse(await apiClient.post(path.passkeys, {name, credential})),\n removePasskey: async ({passkeyId, password}) => securityChangeFromResponse(\n await apiClient.delete(`${path.passkeys}/${encodeURIComponent(passkeyId)}`, {body: {password}}),\n ),\n regenerateRecoveryCodes: async (password) => securityChangeFromResponse(await apiClient.post(path.recoveryCodes, {password})),\n listSessions: async () => (await apiClient.get(path.sessions)).map((session) => ({\n id: session.id, browser: session.browser, platform: session.platform, isMobile: Boolean(session.is_mobile),\n startedAt: session.started_at, network: session.network, isCurrent: Boolean(session.is_current),\n })),\n closeOtherSessions: async () => (await apiClient.post(path.closeOtherSessions))?.closed ?? 0,\n listActivity: async () => (await apiClient.get(path.activity)).map((event) => ({\n id: event.id, kind: event.kind, occurredAt: event.occurred_at, device: event.device, network: event.network,\n })),\n };\n}\n"],"names":[],"mappings":"AAwCY,MAAC,qBAAqB,OAAO,OAAO;AAAA,EAC5C,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,0BAA0B;AAAA,EAC1B,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,4BAA4B;AAAA,EAC5B,UAAU;AAAA,EACV,eAAe;AAAA,EACf,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,UAAU;AACd,CAAC;AAGD,MAAM,4BAA4B,OAAO,OAAO,EAAC,SAAS,WAAW,MAAM,QAAQ,cAAc,gBAAe,CAAC;AACjH,MAAM,8BAA8B,OAAO,OAAO,EAAC,SAAS,WAAW,MAAM,QAAQ,eAAe,eAAc,CAAC;AAQ5G,SAAS,qBAAqB,UAAU;AAC3C,SAAO;AAAA,IACH,WAAW,QAAQ,SAAS,UAAU;AAAA,IACtC,WAAW,SAAS,cAAc;AAAA,IAClC,WAAW,SAAS,YAAY,CAAA,GAAI,IAAI,CAAC,aAAa;AAAA,MAClD,IAAI,QAAQ;AAAA,MAAI,MAAM,QAAQ;AAAA,MAAM,WAAW,QAAQ;AAAA,MAAY,YAAY,QAAQ,gBAAgB;AAAA,IACnH,EAAU;AAAA,IACF,MAAM,EAAC,WAAW,QAAQ,SAAS,MAAM,UAAU,GAAG,WAAW,SAAS,MAAM,cAAc,KAAI;AAAA,IAClG,wBAAwB,SAAS,4BAA4B;AAAA,EACrE;AACA;AAQO,SAAS,2BAA2B,UAAU;AACjD,SAAO,EAAC,UAAU,qBAAqB,SAAS,QAAQ,GAAG,eAAe,SAAS,kBAAkB,OAAS;AAClH;AAOO,SAAS,2BAA2B,WAAW,EAAC,QAAQ,CAAA,EAAE,IAAI,CAAA,GAAI;AACrE,QAAM,OAAO,EAAC,GAAG,oBAAoB,GAAG,MAAK;AAE7C,SAAO;AAAA,IACH,aAAa,YAAY;AACrB,UAAI;AAEA,eAAO,MAAM,UAAU,IAAI,KAAK,SAAS,EAAC,4BAA4B,KAAI,CAAC;AAAA,MAC/E,SAAS,OAAO;AACZ,YAAI,OAAO,mBAAmB;AAC1B,iBAAO;AAAA,QACX;AACA,cAAM;AAAA,MACV;AAAA,IACJ;AAAA,IACA,QAAQ,OAAO,EAAC,OAAO,UAAU,SAAQ,MAAM;AAC3C,YAAM,WAAW,MAAM,UAAU,KAAK,KAAK,QAAQ,EAAC,OAAO,UAAU,SAAQ,GAAG,EAAC,4BAA4B,KAAI,CAAC;AAClH,YAAM,UAAU,UAAU,aAAa;AACvC,aAAO,EAAC,YAAY,UAAU,EAAC,SAAS,QAAQ,IAAI,CAAC,WAAW,4BAA4B,MAAM,KAAK,MAAM,EAAC,IAAI,KAAI;AAAA,IAC1H;AAAA,IACA,kBAAkB,OAAO,EAAC,QAAQ,KAAI,MAAM;AACxC,YAAM,UAAU,KAAK,KAAK,YAAY,EAAC,QAAQ,0BAA0B,MAAM,KAAK,QAAQ,KAAI,GAAG,EAAC,4BAA4B,KAAI,CAAC;AAAA,IACzI;AAAA,IACA,0BAA0B,MAAM,UAAU,IAAI,KAAK,0BAA0B,EAAC,4BAA4B,KAAI,CAAC;AAAA,IAC/G,mBAAmB,OAAO,eAAe;AACrC,YAAM,UAAU,KAAK,KAAK,mBAAmB,EAAC,WAAU,GAAG,EAAC,4BAA4B,KAAI,CAAC;AAAA,IACjG;AAAA,IACA,SAAS,YAAY;AACjB,YAAM,UAAU,KAAK,KAAK,SAAS,QAAW,EAAC,4BAA4B,KAAI,CAAC;AAAA,IACpF;AAAA,IACA,sBAAsB,OAAO,EAAC,MAAK,MAAM;AACrC,YAAM,UAAU,KAAK,KAAK,gBAAgB,EAAC,MAAK,CAAC;AAAA,IACrD;AAAA,IACA,eAAe,OAAO,EAAC,OAAO,YAAW,MAAM;AAC3C,YAAM,UAAU,KAAK,KAAK,eAAe,EAAC,OAAO,cAAc,YAAW,CAAC;AAAA,IAC/E;AAAA,IACA,eAAe,OAAO,EAAC,MAAM,MAAK,MAAO,MAAM,UAAU,IAAI,KAAK,SAAS,EAAC,MAAM,MAAK,CAAC,KAAM,CAAA;AAAA,IAC9F,gBAAgB,OAAO,EAAC,iBAAiB,YAAW,MAAM;AACtD,YAAM,UAAU,IAAI,KAAK,UAAU,EAAC,kBAAkB,iBAAiB,cAAc,YAAW,CAAC;AAAA,IACrG;AAAA,IACA,cAAc,YAAY,qBAAqB,MAAM,UAAU,IAAI,KAAK,QAAQ,CAAC;AAAA,IACjF,WAAW,YAAY;AACnB,YAAM,WAAW,MAAM,UAAU,KAAK,KAAK,IAAI;AAC/C,aAAO,EAAC,QAAQ,SAAS,QAAQ,YAAY,SAAS,gBAAgB,KAAI;AAAA,IAC9E;AAAA,IACA,aAAa,OAAO,SAAS,2BAA2B,MAAM,UAAU,KAAK,KAAK,aAAa,EAAC,KAAI,CAAC,CAAC;AAAA,IACtG,aAAa,OAAO,aAAa,2BAA2B,MAAM,UAAU,OAAO,KAAK,MAAM,EAAC,MAAM,EAAC,SAAQ,EAAC,CAAC,CAAC;AAAA,IACjH,4BAA4B,MAAM,UAAU,IAAI,KAAK,0BAA0B;AAAA,IAC/E,aAAa,OAAO,EAAC,MAAM,WAAU,MAAM,2BAA2B,MAAM,UAAU,KAAK,KAAK,UAAU,EAAC,MAAM,WAAU,CAAC,CAAC;AAAA,IAC7H,eAAe,OAAO,EAAC,WAAW,SAAQ,MAAM;AAAA,MAC5C,MAAM,UAAU,OAAO,GAAG,KAAK,QAAQ,IAAI,mBAAmB,SAAS,CAAC,IAAI,EAAC,MAAM,EAAC,SAAQ,EAAC,CAAC;AAAA,IAC1G;AAAA,IACQ,yBAAyB,OAAO,aAAa,2BAA2B,MAAM,UAAU,KAAK,KAAK,eAAe,EAAC,SAAQ,CAAC,CAAC;AAAA,IAC5H,cAAc,aAAa,MAAM,UAAU,IAAI,KAAK,QAAQ,GAAG,IAAI,CAAC,aAAa;AAAA,MAC7E,IAAI,QAAQ;AAAA,MAAI,SAAS,QAAQ;AAAA,MAAS,UAAU,QAAQ;AAAA,MAAU,UAAU,QAAQ,QAAQ,SAAS;AAAA,MACzG,WAAW,QAAQ;AAAA,MAAY,SAAS,QAAQ;AAAA,MAAS,WAAW,QAAQ,QAAQ,UAAU;AAAA,IAC1G,EAAU;AAAA,IACF,oBAAoB,aAAa,MAAM,UAAU,KAAK,KAAK,kBAAkB,IAAI,UAAU;AAAA,IAC3F,cAAc,aAAa,MAAM,UAAU,IAAI,KAAK,QAAQ,GAAG,IAAI,CAAC,WAAW;AAAA,MAC3E,IAAI,MAAM;AAAA,MAAI,MAAM,MAAM;AAAA,MAAM,YAAY,MAAM;AAAA,MAAa,QAAQ,MAAM;AAAA,MAAQ,SAAS,MAAM;AAAA,IAChH,EAAU;AAAA,EACV;AACA;"}
@@ -0,0 +1,12 @@
1
+ import { createDemoAccountConnector } from "./account/demo/createDemoAccountConnector.js";
2
+ import { base32Of, bytesOfBase32, isValidTotpCode, newTotpSecret, otpauthUrlOf, totpCodeAt } from "./account/demo/totp.js";
3
+ export {
4
+ base32Of,
5
+ bytesOfBase32,
6
+ createDemoAccountConnector,
7
+ isValidTotpCode,
8
+ newTotpSecret,
9
+ otpauthUrlOf,
10
+ totpCodeAt
11
+ };
12
+ //# sourceMappingURL=account-demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-demo.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -0,0 +1,25 @@
1
+ import { ACCOUNT_CONNECTOR_FUNCTIONS, missingConnectorFunctionsOf } from "./account/accountConnector.js";
2
+ import { ACCOUNT_REST_PATHS, createRestAccountConnector, securityChangeFromResponse, securityFromResponse } from "./account/restAccountConnector.js";
3
+ import { default as default2, useAccount } from "./account/AccountProvider.js";
4
+ import { default as default3 } from "./account/AccountSecuritySection.js";
5
+ import { default as default4 } from "./account/ForgotPasswordScreen.js";
6
+ import { PROFILE_TAB, default as default5 } from "./account/ProfileScreen.js";
7
+ import { default as default6 } from "./account/ResetPasswordScreen.js";
8
+ import { default as default7 } from "./account/SignInScreen.js";
9
+ export {
10
+ ACCOUNT_CONNECTOR_FUNCTIONS,
11
+ ACCOUNT_REST_PATHS,
12
+ default2 as AccountProvider,
13
+ default3 as AccountSecuritySection,
14
+ default4 as ForgotPasswordScreen,
15
+ PROFILE_TAB,
16
+ default5 as ProfileScreen,
17
+ default6 as ResetPasswordScreen,
18
+ default7 as SignInScreen,
19
+ createRestAccountConnector,
20
+ missingConnectorFunctionsOf,
21
+ securityChangeFromResponse,
22
+ securityFromResponse,
23
+ useAccount
24
+ };
25
+ //# sourceMappingURL=account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -0,0 +1,7 @@
1
+ function translateWithI18next(i18n) {
2
+ return (namespace, key, values) => i18n.exists(key, { ns: namespace }) ? i18n.t(key, { ns: namespace, ...values }) : void 0;
3
+ }
4
+ export {
5
+ translateWithI18next
6
+ };
7
+ //# sourceMappingURL=i18next.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18next.js","sources":["../../src/adapters/i18next.js"],"sourcesContent":["// Los textos del paquete desde i18next, para un proyecto que ya lo usa: el proyecto escribe sus textos en sus\n// namespaces de siempre (table, common, problems, validation, dictionaries) y lo que no escriba sale del paquete.\n//\n// <ToolkitProvider language={i18n.resolvedLanguage} onLanguageChange={(language) => i18n.changeLanguage(language)}\n// translate={translateWithI18next(i18n)}>\n//\n// No importa i18next: recibe la instancia del proyecto.\n//\n// Funciones puras, no renderizan: function (regla de la casa).\n\n/**\n * El traductor de ToolkitProvider sobre una instancia de i18next: si la llave existe en el proyecto regresa su texto;\n * si no, undefined, y el paquete usa el suyo.\n *\n * @param {{exists: Function, t: Function}} i18n la instancia de i18next del proyecto\n * @returns {(namespace: string, key: string, values?: object) => string|undefined}\n */\nexport function translateWithI18next(i18n) {\n return (namespace, key, values) => (i18n.exists(key, {ns: namespace}) ? i18n.t(key, {ns: namespace, ...values}) : undefined);\n}\n"],"names":[],"mappings":"AAiBO,SAAS,qBAAqB,MAAM;AACvC,SAAO,CAAC,WAAW,KAAK,WAAY,KAAK,OAAO,KAAK,EAAC,IAAI,UAAS,CAAC,IAAI,KAAK,EAAE,KAAK,EAAC,IAAI,WAAW,GAAG,OAAM,CAAC,IAAI;AACtH;"}
@@ -0,0 +1,36 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useCallback } from "react";
4
+ import NextLink from "next/link";
5
+ import { usePathname, useRouter } from "next/navigation";
6
+ function useNextNavigate() {
7
+ const router = useRouter();
8
+ return useCallback((to, options) => {
9
+ if (typeof to === "number") {
10
+ if (to < 0) {
11
+ router.back();
12
+ } else {
13
+ router.forward();
14
+ }
15
+ return;
16
+ }
17
+ if (options?.replace) {
18
+ router.replace(to);
19
+ } else {
20
+ router.push(to);
21
+ }
22
+ }, [router]);
23
+ }
24
+ function useNextLocation() {
25
+ const pathname = usePathname();
26
+ const search = typeof window === "undefined" ? "" : window.location.search;
27
+ return { pathname, search, key: `${pathname}${search}` };
28
+ }
29
+ function NextToLink({ to, href, ...linkProps }) {
30
+ return /* @__PURE__ */ jsx(NextLink, { href: to ?? href, ...linkProps });
31
+ }
32
+ const nextNavigation = Object.freeze({ useNavigate: useNextNavigate, useLocation: useNextLocation, Link: NextToLink });
33
+ export {
34
+ nextNavigation
35
+ };
36
+ //# sourceMappingURL=nextNavigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextNavigation.js","sources":["../../src/adapters/nextNavigation.jsx"],"sourcesContent":["// La navegación de Next.js (App Router) para ToolkitProvider (@stackcraftmx/calcita/next): las tres piezas que piden los\n// componentes del framework, sacadas de next/navigation y next/link.\n//\n// <ToolkitProvider navigation={nextNavigation}> (dentro de un componente de cliente: el de los proveedores)\n//\n// Decisiones, con su porqué:\n// - search se lee del navegador al pintar y NO con useSearchParams: useSearchParams obliga a envolver la página en\n// <Suspense> (si no, `next build` truena con «Missing Suspense boundary»). En el servidor no hay búsqueda: ''.\n// - useNavigate(-1) regresa (router.back): BackButton lo usa cuando hay historial.\n// - Link recibe `to` (como los componentes del framework, y como MUI con component={Link}) y se lo da a next/link como\n// href.\n// OJO: el «Regresar» que dice a dónde regresa (navigationTrail) lee el índice del historial que pone react-router; con\n// Next no existe, así que BackButton regresa a la última lista anotada o a fallbackTo.\n//\n// Genéricos del paquete: function (regla de la casa).\nimport {useCallback} from 'react';\nimport NextLink from 'next/link';\nimport {usePathname, useRouter} from 'next/navigation';\n\n/**\n * navigate(to) del framework con el router de Next.\n *\n * @returns {(to: string|number, options?: {replace?: boolean}) => void}\n */\nfunction useNextNavigate() {\n const router = useRouter();\n return useCallback((to, options) => {\n if (typeof to === 'number') {\n if (to < 0) {\n router.back();\n } else {\n router.forward();\n }\n return;\n }\n if (options?.replace) {\n router.replace(to);\n } else {\n router.push(to);\n }\n }, [router]);\n}\n\n/**\n * {pathname, search, key} de la página abierta.\n *\n * @returns {{pathname: string, search: string, key: string}}\n */\nfunction useNextLocation() {\n const pathname = usePathname();\n const search = typeof window === 'undefined' ? '' : window.location.search;\n return {pathname, search, key: `${pathname}${search}`};\n}\n\n/**\n * next/link con la prop `to` del framework.\n *\n * @param {{to?: string, href?: string}} props\n */\nfunction NextToLink({to, href, ...linkProps}) {\n return <NextLink href={to ?? href} {...linkProps} />;\n}\n\nexport const nextNavigation = Object.freeze({useNavigate: useNextNavigate, useLocation: useNextLocation, Link: NextToLink});\n"],"names":[],"mappings":";;;;;AAwBA,SAAS,kBAAkB;AACvB,QAAM,SAAS,UAAA;AACf,SAAO,YAAY,CAAC,IAAI,YAAY;AAChC,QAAI,OAAO,OAAO,UAAU;AACxB,UAAI,KAAK,GAAG;AACR,eAAO,KAAA;AAAA,MACX,OAAO;AACH,eAAO,QAAA;AAAA,MACX;AACA;AAAA,IACJ;AACA,QAAI,SAAS,SAAS;AAClB,aAAO,QAAQ,EAAE;AAAA,IACrB,OAAO;AACH,aAAO,KAAK,EAAE;AAAA,IAClB;AAAA,EACJ,GAAG,CAAC,MAAM,CAAC;AACf;AAOA,SAAS,kBAAkB;AACvB,QAAM,WAAW,YAAA;AACjB,QAAM,SAAS,OAAO,WAAW,cAAc,KAAK,OAAO,SAAS;AACpE,SAAO,EAAC,UAAU,QAAQ,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAA;AACvD;AAOA,SAAS,WAAW,EAAC,IAAI,MAAM,GAAG,aAAY;AAC1C,6BAAQ,UAAA,EAAS,MAAM,MAAM,MAAO,GAAG,WAAW;AACtD;AAEO,MAAM,iBAAiB,OAAO,OAAO,EAAC,aAAa,iBAAiB,aAAa,iBAAiB,MAAM,WAAA,CAAW;"}
@@ -0,0 +1,7 @@
1
+ "use client";
2
+ import { Link, useLocation, useNavigate } from "react-router";
3
+ const reactRouterNavigation = Object.freeze({ useNavigate, useLocation, Link });
4
+ export {
5
+ reactRouterNavigation
6
+ };
7
+ //# sourceMappingURL=reactRouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactRouter.js","sources":["../../src/adapters/reactRouter.js"],"sourcesContent":["// La navegación de react-router para ToolkitProvider: tiene justo las tres piezas que piden los componentes del paquete.\n//\n// <ToolkitProvider navigation={reactRouterNavigation}>\n//\n// Va dentro del router (RouterProvider o BrowserRouter), porque sus hooks leen el router.\nimport {Link, useLocation, useNavigate} from 'react-router';\n\nexport const reactRouterNavigation = Object.freeze({useNavigate, useLocation, Link});\n"],"names":[],"mappings":";;AAOY,MAAC,wBAAwB,OAAO,OAAO,EAAC,aAAa,aAAa,KAAI,CAAC;"}
@@ -0,0 +1,48 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useEffect } from "react";
4
+ import { useRouteError, isRouteErrorResponse, useNavigation, useOutletContext, Outlet } from "react-router";
5
+ import RequireAccess from "../access/RequireAccess.js";
6
+ import { isStaleChunkError, recoverFromStaleChunk } from "../api/staleChunks.js";
7
+ import { createLogger } from "../observability/logger.js";
8
+ import ErrorPage, { ERROR_PAGE_KIND } from "../ui/layout/ErrorPage.js";
9
+ const log = createLogger("navigation");
10
+ const NOT_FOUND_STATUS = 404;
11
+ function AccessOutlet({ access }) {
12
+ const parentContext = useOutletContext();
13
+ return /* @__PURE__ */ jsx(RequireAccess, { access, children: /* @__PURE__ */ jsx(Outlet, { context: parentContext }) });
14
+ }
15
+ function withAccess(access, routes) {
16
+ return { element: /* @__PURE__ */ jsx(AccessOutlet, { access }), children: routes };
17
+ }
18
+ function useIsNavigating() {
19
+ return useNavigation().state === "loading";
20
+ }
21
+ function withChunkRecovery(routes) {
22
+ return routes.map((route) => ({
23
+ ...route,
24
+ ...typeof route.lazy === "function" && { lazy: () => route.lazy().catch(recoverFromStaleChunk) },
25
+ ...route.children && { children: withChunkRecovery(route.children) }
26
+ }));
27
+ }
28
+ function reloadPage() {
29
+ window.location.reload();
30
+ }
31
+ function RouteErrorScreen() {
32
+ const error = useRouteError();
33
+ const isNotFound = isRouteErrorResponse(error) && error.status === NOT_FOUND_STATUS;
34
+ const kind = isNotFound ? ERROR_PAGE_KIND.notFound : isStaleChunkError(error) ? ERROR_PAGE_KIND.newVersion : ERROR_PAGE_KIND.serverError;
35
+ useEffect(() => {
36
+ if (!isNotFound) {
37
+ log.error("una pantalla no se pudo pintar", { name: error?.name, message: error?.message ?? String(error) });
38
+ }
39
+ }, [error, isNotFound]);
40
+ return /* @__PURE__ */ jsx(ErrorPage, { kind, onRetry: isNotFound ? void 0 : reloadPage });
41
+ }
42
+ export {
43
+ RouteErrorScreen,
44
+ useIsNavigating,
45
+ withAccess,
46
+ withChunkRecovery
47
+ };
48
+ //# sourceMappingURL=reactRouterRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactRouterRoutes.js","sources":["../../src/adapters/reactRouterRoutes.jsx"],"sourcesContent":["// Lo que conecta los permisos y la barra con react-router (@stackcraftmx/calcita/react-router):\n//\n// withAccess(access, routes) un grupo de rutas con la regla del menu.js de su módulo: quien no puede ve la página de\n// «sin permiso» en lugar de la pantalla\n// useIsNavigating() la pantalla siguiente se está descargando (rutas lazy): para la rayita de AppLayout\n// withChunkRecovery(routes) las rutas lazy recargan UNA vez si su archivo es de una versión que ya no existe\n// RouteErrorScreen la pantalla de error de una ruta (errorElement / ErrorBoundary del router): «Hay una\n// versión nueva» o «Algo falló», con su botón para recargar\n//\n// import {access} from '@/modules/users/menu.js';\n// import {routes} from '@/modules/users/routes.js';\n// children: [withAccess(access, routes)]\n//\n// OJO: useIsNavigating solo funciona con un router de datos (createBrowserRouter); con <BrowserRouter> no hay estado de\n// navegación.\n//\n// Genéricos del paquete: function (regla de la casa).\nimport {useEffect} from 'react';\nimport {Outlet, isRouteErrorResponse, useNavigation, useOutletContext, useRouteError} from 'react-router';\n\nimport RequireAccess from '@/access/RequireAccess.jsx';\nimport {isStaleChunkError, recoverFromStaleChunk} from '@/api/staleChunks.js';\nimport {createLogger} from '@/observability/logger.js';\nimport ErrorPage, {ERROR_PAGE_KIND} from '@/ui/layout/ErrorPage.jsx';\n\nconst log = createLogger('navigation');\nconst NOT_FOUND_STATUS = 404;\n\n/**\n * El grupo con permiso: RequireAccess alrededor de las rutas hijas.\n *\n * OJO, trampa pagada: un <Outlet /> nuevo corta el contexto que la ruta de arriba le pasa a sus hijas (<Outlet\n * context={...} />, useOutletContext); el inicio de los ejemplos tronaba sin el menú. Aquí se pasa tal cual.\n *\n * @param {{access: object|undefined}} props\n */\nfunction AccessOutlet({access}) {\n const parentContext = useOutletContext();\n return <RequireAccess access={access}><Outlet context={parentContext} /></RequireAccess>;\n}\n\n/**\n * Un grupo de rutas sin camino propio que pide permiso antes de pintar a sus hijas.\n *\n * @param {object|undefined} access la regla (accessRules.js); sin ella, el grupo es de todos\n * @param {object[]} routes las rutas del módulo\n * @returns {object} la ruta de react-router\n */\nexport function withAccess(access, routes) {\n return {element: <AccessOutlet access={access} />, children: routes};\n}\n\n/**\n * ¿Se está descargando la pantalla siguiente?\n *\n * @returns {boolean}\n */\nexport function useIsNavigating() {\n return useNavigation().state === 'loading';\n}\n\n/**\n * Las rutas con la recuperación de archivos viejos (staleChunks.js): cada `lazy`, también la de las hijas, recarga la\n * página UNA vez si el archivo de su pantalla ya no existe porque se publicó otra versión. Lo demás de la ruta no cambia.\n *\n * @param {object[]} routes\n * @returns {object[]}\n */\nexport function withChunkRecovery(routes) {\n return routes.map((route) => ({\n ...route,\n ...(typeof route.lazy === 'function' && {lazy: () => route.lazy().catch(recoverFromStaleChunk)}),\n ...(route.children && {children: withChunkRecovery(route.children)}),\n }));\n}\n\n/** Recargar la página: trae la versión publicada. */\nfunction reloadPage() {\n window.location.reload();\n}\n\n/**\n * La pantalla de error de una ruta (la que el router enseña cuando la pantalla truena o no se pudo descargar): una ruta\n * que no existe es «Esta página no existe»; un archivo de otra versión, «Hay una versión nueva»; lo demás, «Algo falló de\n * nuestro lado». Las dos últimas con su botón para recargar.\n *\n * createBrowserRouter([{path: '/', element: <App />, ErrorBoundary: RouteErrorScreen, children: [...]}])\n */\nexport function RouteErrorScreen() {\n const error = useRouteError();\n const isNotFound = isRouteErrorResponse(error) && error.status === NOT_FOUND_STATUS;\n const kind = isNotFound ? ERROR_PAGE_KIND.notFound : (isStaleChunkError(error) ? ERROR_PAGE_KIND.newVersion : ERROR_PAGE_KIND.serverError);\n\n useEffect(() => {\n if (!isNotFound) {\n log.error('una pantalla no se pudo pintar', {name: error?.name, message: error?.message ?? String(error)});\n }\n }, [error, isNotFound]);\n\n return <ErrorPage kind={kind} onRetry={isNotFound ? undefined : reloadPage} />;\n}\n"],"names":[],"mappings":";;;;;;;;AAyBA,MAAM,MAAM,aAAa,YAAY;AACrC,MAAM,mBAAmB;AAUzB,SAAS,aAAa,EAAC,UAAS;AAC5B,QAAM,gBAAgB,iBAAA;AACtB,6BAAQ,eAAA,EAAc,QAAgB,8BAAC,QAAA,EAAO,SAAS,eAAe,EAAA,CAAE;AAC5E;AASO,SAAS,WAAW,QAAQ,QAAQ;AACvC,SAAO,EAAC,SAAS,oBAAC,gBAAa,QAAgB,GAAI,UAAU,OAAA;AACjE;AAOO,SAAS,kBAAkB;AAC9B,SAAO,cAAA,EAAgB,UAAU;AACrC;AASO,SAAS,kBAAkB,QAAQ;AACtC,SAAO,OAAO,IAAI,CAAC,WAAW;AAAA,IAC1B,GAAG;AAAA,IACH,GAAI,OAAO,MAAM,SAAS,cAAc,EAAC,MAAM,MAAM,MAAM,KAAA,EAAO,MAAM,qBAAqB,EAAA;AAAA,IAC7F,GAAI,MAAM,YAAY,EAAC,UAAU,kBAAkB,MAAM,QAAQ,EAAA;AAAA,EAAC,EACpE;AACN;AAGA,SAAS,aAAa;AAClB,SAAO,SAAS,OAAA;AACpB;AASO,SAAS,mBAAmB;AAC/B,QAAM,QAAQ,cAAA;AACd,QAAM,aAAa,qBAAqB,KAAK,KAAK,MAAM,WAAW;AACnE,QAAM,OAAO,aAAa,gBAAgB,WAAY,kBAAkB,KAAK,IAAI,gBAAgB,aAAa,gBAAgB;AAE9H,YAAU,MAAM;AACZ,QAAI,CAAC,YAAY;AACb,UAAI,MAAM,kCAAkC,EAAC,MAAM,OAAO,MAAM,SAAS,OAAO,WAAW,OAAO,KAAK,EAAA,CAAE;AAAA,IAC7G;AAAA,EACJ,GAAG,CAAC,OAAO,UAAU,CAAC;AAEtB,6BAAQ,WAAA,EAAU,MAAY,SAAS,aAAa,SAAY,YAAY;AAChF;"}
@@ -0,0 +1,58 @@
1
+ import { problemMessage, problemTitle } from "../problems.js";
2
+ const API_ERROR_STATUS = Object.freeze({
3
+ // no hubo respuesta: red caída, servidor apagado o se acabó el tiempo
4
+ offline: 0,
5
+ unauthenticated: 401,
6
+ forbidden: 403,
7
+ notFound: 404,
8
+ // el registro no está en el estado que la acción necesita (p. ej. cerrar un mes que no está completo)
9
+ conflict: 409,
10
+ // la liga ya venció, ya se usó o no existe
11
+ gone: 410,
12
+ validation: 422,
13
+ tooManyRequests: 429
14
+ });
15
+ class ApiError extends Error {
16
+ /**
17
+ * @param {object} details
18
+ * @param {number} details.status el status HTTP; 0 si no hubo respuesta
19
+ * @param {object|null} [details.problem] el cuerpo RFC 9457 del servidor ({title, detail, code, errors, request_id})
20
+ * @param {boolean} [details.translatedByServer] false si la respuesta llegó en otro idioma que el pedido
21
+ * @param {number|null} [details.retryAfterSeconds] 429: los segundos del header Retry-After
22
+ */
23
+ constructor({ status, problem = null, translatedByServer = true, retryAfterSeconds = null }) {
24
+ super(problemMessage(problem, status, { translatedByServer }));
25
+ this.name = "ApiError";
26
+ this.status = status;
27
+ this.problem = problem ?? {};
28
+ this.code = problem?.code ?? (status === API_ERROR_STATUS.offline ? "offline" : null);
29
+ this.title = problemTitle(problem, status, { translatedByServer });
30
+ this.requestId = problem?.request_id ?? null;
31
+ this.retryAfterSeconds = retryAfterSeconds;
32
+ }
33
+ /** No hubo respuesta del servidor (red caída, servidor apagado, se acabó el tiempo). */
34
+ get isOffline() {
35
+ return this.status === API_ERROR_STATUS.offline;
36
+ }
37
+ /** Sin sesión, o se venció mientras se usaba la app. */
38
+ get isUnauthenticated() {
39
+ return this.status === API_ERROR_STATUS.unauthenticated;
40
+ }
41
+ /** El registro no está en el estado que la acción necesita. */
42
+ get isConflict() {
43
+ return this.status === API_ERROR_STATUS.conflict;
44
+ }
45
+ /** La liga venció, ya se usó o no existe. */
46
+ get isGone() {
47
+ return this.status === API_ERROR_STATUS.gone;
48
+ }
49
+ /** Errores de un formulario: los mensajes por campo van en problem.errors (fieldErrorsOf). */
50
+ get isValidation() {
51
+ return this.status === API_ERROR_STATUS.validation;
52
+ }
53
+ }
54
+ export {
55
+ API_ERROR_STATUS,
56
+ ApiError
57
+ };
58
+ //# sourceMappingURL=ApiError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiError.js","sources":["../../src/api/ApiError.js"],"sourcesContent":["// El error de cualquier petición al servidor, con la misma forma siempre: un error del servidor (RFC 9457), una red caída\n// o un archivo que llegó cortado. Así la pantalla tiene UNA forma de error que enseñar y no dos.\n//\n// El mensaje ya viene en el idioma de la persona: si el servidor lo mandó traducido (title y detail en el idioma de\n// Accept-Language) se usa tal cual; si no (sin red, un 502 del proxy en HTML, una respuesta en otro idioma), el texto\n// genérico del paquete según el status (problems.js).\n//\n// Lo usan los formularios (applyServerProblem: los errores de un 422 van a su campo), toastProblem, la tabla, las\n// descargas y la subida de archivos.\n//\n// Una clase porque es un Error (trae su pila y `instanceof ApiError` funciona); lo demás del paquete son funciones.\nimport {problemMessage, problemTitle} from '@/problems.js';\n\n/** Los status que la pantalla suele tratar distinto, con su nombre. */\nexport const API_ERROR_STATUS = Object.freeze({\n // no hubo respuesta: red caída, servidor apagado o se acabó el tiempo\n offline: 0,\n unauthenticated: 401,\n forbidden: 403,\n notFound: 404,\n // el registro no está en el estado que la acción necesita (p. ej. cerrar un mes que no está completo)\n conflict: 409,\n // la liga ya venció, ya se usó o no existe\n gone: 410,\n validation: 422,\n tooManyRequests: 429,\n});\n\nexport class ApiError extends Error {\n /**\n * @param {object} details\n * @param {number} details.status el status HTTP; 0 si no hubo respuesta\n * @param {object|null} [details.problem] el cuerpo RFC 9457 del servidor ({title, detail, code, errors, request_id})\n * @param {boolean} [details.translatedByServer] false si la respuesta llegó en otro idioma que el pedido\n * @param {number|null} [details.retryAfterSeconds] 429: los segundos del header Retry-After\n */\n constructor({status, problem = null, translatedByServer = true, retryAfterSeconds = null}) {\n super(problemMessage(problem, status, {translatedByServer}));\n this.name = 'ApiError';\n this.status = status;\n this.problem = problem ?? {};\n this.code = problem?.code ?? (status === API_ERROR_STATUS.offline ? 'offline' : null);\n this.title = problemTitle(problem, status, {translatedByServer});\n // el id con que el servidor guardó el error en su bitácora: lo que se le pasa a soporte\n this.requestId = problem?.request_id ?? null;\n this.retryAfterSeconds = retryAfterSeconds;\n }\n\n /** No hubo respuesta del servidor (red caída, servidor apagado, se acabó el tiempo). */\n get isOffline() {\n return this.status === API_ERROR_STATUS.offline;\n }\n\n /** Sin sesión, o se venció mientras se usaba la app. */\n get isUnauthenticated() {\n return this.status === API_ERROR_STATUS.unauthenticated;\n }\n\n /** El registro no está en el estado que la acción necesita. */\n get isConflict() {\n return this.status === API_ERROR_STATUS.conflict;\n }\n\n /** La liga venció, ya se usó o no existe. */\n get isGone() {\n return this.status === API_ERROR_STATUS.gone;\n }\n\n /** Errores de un formulario: los mensajes por campo van en problem.errors (fieldErrorsOf). */\n get isValidation() {\n return this.status === API_ERROR_STATUS.validation;\n }\n}\n"],"names":[],"mappings":";AAcY,MAAC,mBAAmB,OAAO,OAAO;AAAA;AAAA,EAE1C,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,UAAU;AAAA;AAAA,EAEV,UAAU;AAAA;AAAA,EAEV,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,iBAAiB;AACrB,CAAC;AAEM,MAAM,iBAAiB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQhC,YAAY,EAAC,QAAQ,UAAU,MAAM,qBAAqB,MAAM,oBAAoB,KAAI,GAAG;AACvF,UAAM,eAAe,SAAS,QAAQ,EAAC,mBAAkB,CAAC,CAAC;AAC3D,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,UAAU,WAAW,CAAA;AAC1B,SAAK,OAAO,SAAS,SAAS,WAAW,iBAAiB,UAAU,YAAY;AAChF,SAAK,QAAQ,aAAa,SAAS,QAAQ,EAAC,mBAAkB,CAAC;AAE/D,SAAK,YAAY,SAAS,cAAc;AACxC,SAAK,oBAAoB;AAAA,EAC7B;AAAA;AAAA,EAGA,IAAI,YAAY;AACZ,WAAO,KAAK,WAAW,iBAAiB;AAAA,EAC5C;AAAA;AAAA,EAGA,IAAI,oBAAoB;AACpB,WAAO,KAAK,WAAW,iBAAiB;AAAA,EAC5C;AAAA;AAAA,EAGA,IAAI,aAAa;AACb,WAAO,KAAK,WAAW,iBAAiB;AAAA,EAC5C;AAAA;AAAA,EAGA,IAAI,SAAS;AACT,WAAO,KAAK,WAAW,iBAAiB;AAAA,EAC5C;AAAA;AAAA,EAGA,IAAI,eAAe;AACf,WAAO,KAAK,WAAW,iBAAiB;AAAA,EAC5C;AACJ;"}