@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
package/README.md CHANGED
@@ -1,3 +1,612 @@
1
- # Temporary Holding Version
1
+ # Calcita
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ `@stackcraftmx/calcita` · un framework de React sobre MUI 7 con el vidrio líquido de Apple. La calcita es el cristal
4
+ transparente famoso por doblar la luz, y eso es lo que define al vidrio líquido: su lente.
5
+
6
+ Arranca un proyecto sin copiar y volver a probar lo de siempre: el marco de la app con menú y permisos, tabla de servidor,
7
+ diálogos de confirmación, avisos, descargas, formularios, formatos de número y fecha, errores RFC 9457, reportes en Excel
8
+ y el tema con vidrio líquido, interpretado componente por componente según la guía de Apple.
9
+
10
+ JavaScript con sus tipos generados: se usa igual desde un proyecto en TypeScript.
11
+
12
+ ## Arrancar un proyecto con el CLI
13
+
14
+ ```bash
15
+ pnpm dlx @stackcraftmx/calcita new mi-tienda # o: npx @stackcraftmx/calcita new mi-tienda
16
+ cd mi-tienda
17
+ pnpm install
18
+ pnpm dev
19
+ ```
20
+
21
+ Pregunta cómo lo quiere (Enter acepta lo recomendado): el menú a un lado o arriba; vidrio, sin vidrio o minimalista; claro
22
+ y oscuro o solo claro; los colores de Stackcraft, los de MUI o uno propio; formik o react-hook-form; los textos de Calcita o
23
+ i18next; las pantallas de entrar, «¿Olvidó su contraseña?» y Mi perfil; y si se puede instalar como app (PWA). Con `--yes`
24
+ no pregunta, y cada respuesta también va como opción (`--forms=react-hook-form`, `--menu-position=top`…;
25
+ `calcita --help` las dice todas).
26
+
27
+ Sale un proyecto de Vite con la forma de los ejemplos: `src/app` (el único lugar donde se conecta el framework),
28
+ `src/core` (lo que comparten los módulos), `src/fakeServer` (el servidor de mentira, con la forma del API de verdad) y
29
+ `src/modules/<módulo>`, cada uno con su menú, sus rutas, sus pantallas, su API y sus textos en español e inglés, que se
30
+ descubren solos. Trae un módulo de ejemplo (Contactos: lista, formulario, errores del servidor en su campo) y
31
+ `src/core/apiClient.js` listo para cambiar el servidor de mentira por el de verdad.
32
+
33
+ Para crecerlo, dentro del proyecto:
34
+
35
+ ```bash
36
+ pnpm exec calcita make:module purchase-orders --label-es "Órdenes de compra" --label-en "Purchase orders"
37
+ pnpm exec calcita make:page purchase-orders OrderDetail # la pantalla y su ruta en routes.js del módulo
38
+ pnpm exec calcita make:form purchase-orders SupplierForm # con la librería del proyecto (calcita.json)
39
+ pnpm exec calcita make:component StatusBadge # en src/core, y en su puerta
40
+ pnpm exec calcita make:component OrderTotals --module purchase-orders
41
+ ```
42
+
43
+ El CLI nunca pisa un archivo que ya existe. Sus plantillas son los archivos tal cual (`cli/templates`), con
44
+ `//#if pwa` … `//#endif` en lo que depende de una respuesta.
45
+
46
+ ## Arrancar en un proyecto que ya existe
47
+
48
+ ```bash
49
+ pnpm add @stackcraftmx/calcita @mui/material @mui/icons-material @emotion/react @emotion/styled xstate @xstate/react sonner
50
+ ```
51
+
52
+ Con npm es igual, con `npm install` en lugar de `pnpm add`.
53
+
54
+ ```jsx
55
+ import {ThemeProvider, createTheme} from '@mui/material/styles';
56
+ import {ToolkitProvider, Toaster} from '@stackcraftmx/calcita';
57
+
58
+ const theme = createTheme(); // el tema lo arma cada proyecto; sin él, los colores por omisión de MUI
59
+
60
+ export const App = () => (
61
+ <ThemeProvider theme={theme}>
62
+ <ToolkitProvider appName="Mi aplicación">
63
+ <Toaster />
64
+ {/* las pantallas */}
65
+ </ToolkitProvider>
66
+ </ThemeProvider>
67
+ );
68
+ ```
69
+
70
+ Sin nada más, todo sale en español, con la zona horaria del navegador, montos en pesos y la navegación del navegador.
71
+
72
+ ## Lo que se conecta en ToolkitProvider
73
+
74
+ | Prop | Para qué | Por omisión |
75
+ |---|---|---|
76
+ | `language`, `onLanguageChange` | idioma activo (`es` o `en`) y a quién avisar cuando se cambia | `es` |
77
+ | `texts` | cambiar textos del paquete, por idioma: `{es: {common: {actions: {back: 'Volver'}}}}` | los del paquete |
78
+ | `translate` | un traductor propio, por ejemplo i18next | ninguno |
79
+ | `timeZone` | zona en que se pintan las horas | la del navegador |
80
+ | `currency` | moneda de los montos (ISO 4217) | `MXN` |
81
+ | `appName` | nombre en el título de la pestaña | ninguno |
82
+ | `navigation` | el router: `{useNavigate, useLocation, Link}` | la del navegador |
83
+ | `canAccess` | quién ve qué (menú, rutas, botones): la regla del proyecto, normalmente `createAccessChecker(...)` | solo lo que no tiene regla |
84
+ | `buildId` | la compilación del front que corre en la pestaña, para el aviso de versión nueva | ninguna (sin aviso) |
85
+
86
+ Con react-router y i18next:
87
+
88
+ ```jsx
89
+ import {reactRouterNavigation} from '@stackcraftmx/calcita/react-router';
90
+ import {translateWithI18next} from '@stackcraftmx/calcita/i18next';
91
+
92
+ <ToolkitProvider
93
+ navigation={reactRouterNavigation}
94
+ language={i18n.resolvedLanguage}
95
+ onLanguageChange={(language) => i18n.changeLanguage(language)}
96
+ translate={translateWithI18next(i18n)}
97
+ >
98
+ ```
99
+
100
+ ## Aviso de versión nueva
101
+
102
+ Una pestaña abierta desde hace horas sigue corriendo el front con que se abrió. Si el servidor anuncia en sus
103
+ respuestas qué compilación está publicada, el paquete enseña una franja «Hay una versión nueva» con su botón
104
+ «Recargar». No recarga solo: la persona decide cuándo.
105
+
106
+ ```jsx
107
+ import {NewBuildNotice, reportPublishedBuild} from '@stackcraftmx/calcita';
108
+
109
+ // 1. la compilación de esta pestaña (por ejemplo, de una variable de entorno al construir)
110
+ <ToolkitProvider buildId={import.meta.env.VITE_BUILD_ID}>
111
+
112
+ // 2. el cliente HTTP entrega la que anuncia el servidor en cada respuesta (aquí, en un header)
113
+ axiosClient.interceptors.response.use((response) => {
114
+ reportPublishedBuild(response.headers['x-frontend-build']);
115
+ return response;
116
+ });
117
+
118
+ // 3. la franja, donde se vea siempre (normalmente dentro del AppBar); sin versión nueva no ocupa lugar
119
+ <NewBuildNotice />
120
+ ```
121
+
122
+ Con `AppLayout` no hace falta el paso 3: el marco ya lo pone. Con vidrio no es franja sino una cápsula que flota aparte
123
+ de la barra (`variant="floating"`): en escritorio, centrada debajo de la barra de arriba; en el teléfono, encima de la
124
+ barra de abajo, como el reproductor chico que Apple pone encima de las pestañas.
125
+
126
+ Sin API que anuncie la versión, o con la app anclada al inicio del iPhone (al abrirla, el iPhone no vuelve a pedir la
127
+ página: retoma la que tenía en memoria, aunque haya pasado un día), `usePublishedBuildWatch` se entera sola. El build deja
128
+ un archivo con su versión y la app lo vuelve a leer cada vez que regresa del segundo plano y cada tanto. Si estuvo fuera
129
+ 15 minutos o más, se recarga sola con lo nuevo; si solo salió un momento (a copiar un código del SMS), sale el aviso con su
130
+ botón, para no borrar lo que llevaba escrito.
131
+
132
+ ```js
133
+ // vite.config.js: la versión va dentro de la app y en dist/version.json
134
+ const BUILD_ID = process.env.VITE_BUILD_ID || new Date().toISOString();
135
+ export default defineConfig({
136
+ plugins: [react(), {
137
+ name: 'build-version', apply: 'build',
138
+ generateBundle() { this.emitFile({type: 'asset', fileName: 'version.json', source: JSON.stringify({buildId: BUILD_ID})}); },
139
+ }],
140
+ define: {'import.meta.env.VITE_BUILD_ID': JSON.stringify(BUILD_ID)},
141
+ });
142
+
143
+ // en la raíz de la app, una vez (en desarrollo no hay archivo: sin url no hace nada)
144
+ usePublishedBuildWatch({url: import.meta.env.PROD ? '/version.json' : null});
145
+ // opciones: checkEveryMinutes (5), reloadAfterHiddenMinutes (15; null = nunca recarga sola), onReload
146
+ ```
147
+
148
+ El servidor no debe guardar `version.json` (con `Cache-Control: no-cache`, como el `index.html`).
149
+
150
+ ## Qué trae cada puerta
151
+
152
+ Cada puerta pide solo sus librerías; un proyecto instala lo que usa.
153
+
154
+ | Importar de | Trae | Pide además |
155
+ |---|---|---|
156
+ | `@stackcraftmx/calcita` | proveedor, diálogos, avisos, descargas, encabezados, filtros, chips, métricas, formatos, fechas, errores RFC 9457, la petición de la casa (`createApiClient`), la recuperación de versión vieja, la seguridad de la cuenta (códigos de recuperación, sesiones, bitácora) y la bandeja tipo correo (`InboxLayout`, `MessageList`, `MessageView`) | — |
157
+ | `@stackcraftmx/calcita/table` | `ServerTable`: paginada, filtrada y ordenada en el servidor, con su estado en la URL | `@mui/x-data-grid`, `nuqs` |
158
+ | `@stackcraftmx/calcita/forms` | campos de formik (texto, lista, número con miles, catálogo, color), formulario por pasos, aviso de arriba, errores del servidor pegados a cada campo; `Formik`, `Form` y `Yup` vienen con el paquete | — |
159
+ | `@stackcraftmx/calcita/react-hook-form` | los mismos campos con los mismos nombres, conectados a react-hook-form, y `yupResolver` | `react-hook-form`, `@hookform/resolvers` |
160
+ | `@stackcraftmx/calcita/date-pickers` | la fecha con el DatePicker de MUI X (`DateInput`, `FormDateField`); viaja `AAAA-MM-DD` | `@mui/x-date-pickers` 8, `dayjs` |
161
+ | `@stackcraftmx/calcita/charts` | barras y columnas con vista de tabla | `recharts` |
162
+ | `@stackcraftmx/calcita/timeline` | línea de tiempo por grupos | `@mui/lab` |
163
+ | `@stackcraftmx/calcita/excel` | reporte en Excel (Resumen y Datos) y CSV | `exceljs`, que se le pasa al llamarlo |
164
+ | `@stackcraftmx/calcita/react-router` | el adaptador de navegación | `react-router` |
165
+ | `@stackcraftmx/calcita/i18next` | el adaptador de textos | `i18next` (la instancia del proyecto) |
166
+ | `@stackcraftmx/calcita/laravel` | el reintento del 419 de Sanctum | — |
167
+ | `@stackcraftmx/calcita/filepond` | `FileDropzone` con FilePond: el mismo uso que la de la puerta principal, más varios archivos, avance por archivo y `createPondServer` | `filepond`, `react-filepond`, `filepond-plugin-file-validate-type`, `filepond-plugin-file-validate-size` |
168
+ | `@stackcraftmx/calcita/next` | la navegación de Next.js (App Router) para ToolkitProvider; los componentes ya vienen marcados con `'use client'` y los puros sirven en el servidor | `next` |
169
+ | `@stackcraftmx/calcita/money` | `Money`: dinero exacto en centavos enteros, con suma, resta, multiplicación, división, potencia, raíz y su formato con la moneda | — |
170
+ | `@stackcraftmx/calcita/passkeys` | llaves de acceso (passkeys): crearlas y firmar con ellas, con los errores del navegador en palabras de la persona | `@simplewebauthn/browser` 14 |
171
+ | `@stackcraftmx/calcita/account` | la cuenta completa: `SignInScreen` (con el segundo paso), `ForgotPasswordScreen`, `ResetPasswordScreen`, `ProfileScreen`, `AccountSecuritySection`, `AccountProvider` y `createRestAccountConnector` | `@simplewebauthn/browser` 14 |
172
+ | `@stackcraftmx/calcita/account-demo` | `createDemoAccountConnector`: la cuenta en el navegador, sin backend (y los códigos TOTP) | — |
173
+ | `@stackcraftmx/calcita/maps` | `MapView`: mapa con marcadores del color del tema, el elegido con su globo, se acomoda solo; en oscuro, mosaicos oscuros | `leaflet`, `react-leaflet` 5 |
174
+ | `@stackcraftmx/calcita/calendar` | `EventCalendar`: mes, semana, día y lista, con la barra del framework; arrastrar cambia la cita y regresa si el servidor dice que no | `@fullcalendar/react`, `core`, `daygrid`, `timegrid`, `list`, `interaction` 6.1 |
175
+ | `@stackcraftmx/calcita/kanban` | `KanbanBoard`: columnas con tope y tarjetas que se arrastran con el ratón, el dedo o el teclado; `moveCard` para ver la movida al instante | `@hello-pangea/dnd` 18 |
176
+
177
+ ## El tema
178
+
179
+ `createToolkitTheme()` es opcional (ToolkitProvider funciona con cualquier tema de MUI) y trae el estilo de Stackcraft:
180
+ claro y oscuro con variables CSS, letra base de 16 px (con menos, el iPhone hace zoom al entrar a un campo), tamaños que
181
+ se ajustan al ancho, transiciones de 220 ms, esquinas de 8 px, botones sin mayúsculas y contorno de foco visible.
182
+
183
+ ```js
184
+ const theme = createToolkitTheme(); // los colores de Stackcraft
185
+ const theme = createToolkitTheme({glass: true}); // vidrio líquido en lo que flota y en los controles
186
+ const theme = createToolkitTheme({colorSchemes: {light: {palette: {primary: {main: '#0B5FFF'}}}, dark: {palette: {…}}}});
187
+ const theme = createToolkitTheme({components: {MuiCard: {…}}}); // se SUMA a los ajustes del framework
188
+ ```
189
+
190
+ El vidrio es la versión en CSS del Liquid Glass de Apple, poco transparente (80 %). Va en lo que flota sobre el
191
+ contenido y en los controles, como pide su guía:
192
+
193
+ - la barra y el menú lateral, que en escritorio flotan a 8 px de la orilla;
194
+ - los menús, las listas de opciones, el calendario, los menús de la tabla, los diálogos, los tooltips, los avisos, el
195
+ panel de descargas, el botón flotante y la barra de pestañas de abajo;
196
+ - la «gota» que marca lo elegido en las pestañas y en los botones de opción, que se desliza a la opción nueva;
197
+ - botones en píldora que se hunden al apretarlos;
198
+ - un lienzo con manchas tenues de color, para que el vidrio tenga algo que desenfocar.
199
+
200
+ Las tarjetas del contenido se quedan sólidas, para que el texto largo se lea, salvo que el proyecto las pida de vidrio.
201
+ Todo se pinta sólido si la persona pidió en su equipo «Reducir transparencia» o «Aumentar contraste». No trae refracción
202
+ (la lupa que deforma lo de atrás): en la web solo sale con filtros que hoy funcionan nada más en Chrome.
203
+
204
+ ```js
205
+ const theme = createToolkitTheme({glass: {opacity: 0.7}}); // más transparente (0 a 1)
206
+ const theme = createToolkitTheme({glass: {surfaces: true}}); // también las tarjetas del contenido
207
+ ```
208
+
209
+ `surfaces` se puede usar, pero avisa en la consola: cada tarjeta de vidrio desenfoca lo que tiene detrás (pesa más en
210
+ equipos modestos) y la guía de Apple pide el contenido sin vidrio. Va bien en una portada o una demostración, no en
211
+ pantallas de trabajo.
212
+
213
+ La barra de arriba va sin franja, como las ventanas de macOS Tahoe: la ☰ con el nombre, el menú y la cuenta en cápsulas,
214
+ y el título suelto. Con vidrio las cápsulas son de vidrio y el contenido pasa por debajo, desenfocado en la orilla para
215
+ que todo se lea (`scrollEdgeStylesOf`); con el minimalista son bloques del tono de las tarjetas, también en el teléfono.
216
+ Con cápsulas, el menú encogido deja la cuenta arriba en su cápsula, y en el teléfono el minimalista también lleva la
217
+ barra de pestañas de abajo (sólida, del gris 5 de Apple). Quien prefiera la franja de lado a lado la pide;
218
+ está en el mismo alto y el mismo lugar, así que nada más se mueve. El estilo de Stackcraft sin vidrio sigue con su barra.
219
+
220
+ ```js
221
+ const theme = createToolkitTheme({glass: true, bar: TOP_BAR.band}); // la franja; por omisión TOP_BAR.capsules
222
+ ```
223
+
224
+ Cada pantalla puede poner sus propias cápsulas en la barra (buscar, agregar, exportar) con `BarActions`: las escribe en
225
+ su código donde quiera y, en escritorio con cápsulas, el marco las sube a la barra; con la franja entran a la franja, y en
226
+ el teléfono, con cápsulas, flotan arriba a la derecha y se quedan al bajar: las que caben, solo con ícono, y las que no,
227
+ en un menú «⋯». Las `actions` de `PageHeading` ya suben solas, y `ServerTable` sube su búsqueda con
228
+ `searchInBar`. «Hecho en Calcita» → «Marco y menú» lo enseña vivo.
229
+
230
+ ```jsx
231
+ <BarActions label="Buscar en pedidos" order={1}>
232
+ <IconButton aria-label="Buscar" onClick={openSearch}><SearchRoundedIcon /></IconButton>
233
+ </BarActions>
234
+ <BarActions label="Acciones de pedidos" order={2}> {/* otro grupo, otra cápsula */}
235
+ {/* en la cápsula, solo el ícono con su nombre en el tooltip */}
236
+ <BarActionButton label="Agregar pedido" icon={<AddRoundedIcon />} onClick={openNew} />
237
+ </BarActions>
238
+ <BarCapsule aria-label="Zoom">…</BarCapsule> {/* la misma cápsula, fuera de la barra */}
239
+ ```
240
+
241
+ En Android conviene arrancar con el minimalista: el vidrio es el estilo de Apple (allá se ve ajeno) y el desenfoque pesa
242
+ en los teléfonos baratos. `isAndroidDevice()` lo dice; con Next, desde el servidor, se le pasa la identificación del
243
+ navegador: `isAndroidDevice({userAgent: headers.get('user-agent')})`. Sirve para elegir un estilo, no para seguridad.
244
+
245
+ ```js
246
+ const theme = isAndroidDevice() ? createToolkitTheme({look: THEME_LOOK.minimal}) : createToolkitTheme({glass: true});
247
+ ```
248
+
249
+ Para lo que el proyecto quiera hacer flotar (los botones encima de un mapa, una barra de acciones): `GlassPanel`, que es
250
+ de vidrio si el tema lo trae y una tarjeta con sombra si no. Para algo propio: `sx={(theme) => glassStylesOf(theme)}` e
251
+ `isGlassTheme(theme)`. Cada ajuste vive en su archivo (`src/theme/components/MuiButton.js`…).
252
+
253
+ ## El marco de la app, el menú y los permisos
254
+
255
+ `AppLayout` es el marco de las plantillas de MUI: la barra a todo lo ancho, con el logo y el nombre de la app; debajo,
256
+ el menú lateral por secciones, que la ☰ encoge a solo íconos (y lo recuerda). La barra trae el título de la página
257
+ cuando el grande sale de la vista, el tamaño de letra, el idioma, claro u oscuro y la cuenta (Mi perfil, lo que agregue
258
+ el proyecto y Salir). Con `menuPosition="top"` el menú va dentro de la barra. En el teléfono, la hamburguesa abre el menú
259
+ en un cajón y los ajustes se juntan detrás de un engrane. Con vidrio, en el teléfono las secciones van en una barra de
260
+ pestañas abajo que se encoge al leer hacia abajo y regresa al subir, como en iOS 26 (`minimizeTabBarOnScroll={false}` la
261
+ deja fija). Van las que el `menu.js` marca con `mobileTab: true`, y en «Más» → «Editar la barra» cada quien elige las suyas
262
+ (se recuerda en su navegador; «Como venía» regresa a las del proyecto). Van tantas como quepan a lo ancho sin cortar su
263
+ nombre; las demás, en «Más».
264
+
265
+ Claro u oscuro tiene tres opciones en el menú de la cuenta: Claro, Oscuro y Automático, que sigue lo que diga el equipo y
266
+ es lo de omisión. El botón de la barra fija claro u oscuro; Automático es la forma de volver a seguir al equipo.
267
+
268
+ El menú no se escribe en una lista central: cada módulo trae su `menu.js` y `composeMenu` los junta, los ordena y deja
269
+ solo los que la sesión puede ver (también dentro de los submenús).
270
+
271
+ ```js
272
+ // modules/orders/menu.js
273
+ export const order = 10;
274
+ export const access = {ability: 'orders.view'}; // o {role}, {anyOf}, {policy: 'sameOrganization'}, {check}
275
+ export function buildMenuItem() {
276
+ return {
277
+ to: '/orders', labelKey: 'orders:menu.label', sectionKey: 'app:sections.operation', Icon: ReceiptLongIcon,
278
+ badge: 3, // opcional
279
+ children: [{to: '/orders/returns', labelKey: 'orders:menu.returns', access: {ability: 'returns.view'}}], // opcional
280
+ };
281
+ }
282
+ ```
283
+
284
+ ```jsx
285
+ const canAccess = createAccessChecker({abilities: session.abilities, roles: session.roles, policies, context: {session}});
286
+ const menuItems = composeMenu(import.meta.glob('@/modules/*/menu.js', {eager: true}), {canAccess});
287
+
288
+ <ToolkitProvider canAccess={canAccess}>
289
+ <AppLayout logo={<Logo />} menuItems={menuItems} user={session.user} profilePath="/me" onSignOut={signOut}
290
+ headerActions={<MiBoton />} sidebarFooter={<MiTarjeta />} accountMenuItems={[{to: '/billing', label: 'Facturación'}]}>
291
+ …
292
+ </AppLayout>
293
+ </ToolkitProvider>
294
+ ```
295
+
296
+ En cada pantalla, `PageHeading` pone el título, la descripción y los botones, y arma las migas solo desde el menú
297
+ (Inicio › Sección › Pantalla). `PageHeader` es el encabezado centrado de una portada y `DetailHeader` el de un registro.
298
+
299
+ La misma regla protege las rutas (`withAccess(access, routes)` de `/react-router`: quien no puede ve «sin permiso») y
300
+ los botones (`<Can access={…}>`, `useCan`). El framework no sabe de roles: RBAC por permisos o roles y ABAC por políticas
301
+ con nombre o reglas escritas ahí mismo, como cada proyecto las necesite. Lo que se pinta no protege nada: el backend
302
+ vuelve a revisar cada petición. `ErrorPage` trae las pantallas de 404, 403 y 500.
303
+
304
+ ## La petición de la casa
305
+
306
+ Todo lo que habla con el servidor pasa por un cliente, armado una vez por proyecto con `fetch` del navegador (sin axios):
307
+
308
+ ```js
309
+ import {createApiClient} from '@stackcraftmx/calcita';
310
+
311
+ export const api = createApiClient({
312
+ baseUrl: '/api/v1',
313
+ csrf: {refreshPath: '/auth/csrf-token'}, // Laravel Sanctum: la cookie XSRF-TOKEN y el reintento del 419
314
+ onUnauthenticated: () => navigate('/sign-in'), // un 401 a media consulta
315
+ });
316
+
317
+ const orders = await api.get('/orders', {params: {page: 2}, signal});
318
+ await api.post('/orders', {customerId: 7});
319
+ const {blob, fileName} = await api.download('/orders/export', {onDownloadProgress});
320
+ ```
321
+
322
+ - Cada petición lleva el idioma vigente (`Accept-Language`): el servidor responde sus mensajes ya traducidos.
323
+ - Un error es siempre un `ApiError`: el problema RFC 9457 del servidor con su mensaje ya traducido, su status, su
324
+ `requestId` para soporte y los errores por campo de un 422 (los formularios los ponen en su campo). Sin red es la misma
325
+ forma (status 0); cancelar no es un error.
326
+ - Cada respuesta le avisa al aviso de versión nueva qué compilación está publicada (header `X-Frontend-Build`).
327
+ - Un Excel que llegó cortado no se entrega.
328
+
329
+ Si se publica otra versión con la pestaña abierta, la pantalla que no se había abierto pide un archivo que ya no existe.
330
+ `withChunkRecovery` (de `/react-router`) recarga una vez y `RouteErrorScreen` dice «Hay una versión nueva» con su botón;
331
+ sin router de datos, `recoverFromStaleChunk` en el `.catch()` del import y `StaleBuildBoundary` alrededor de las pantallas.
332
+
333
+ ## La cuenta completa: conectar su backend
334
+
335
+ Entrar (con el segundo paso), «¿Olvidó su contraseña?», elegir una contraseña nueva, Mi perfil (sus datos, seguridad y
336
+ preferencias) y la seguridad de la cuenta (llaves de acceso, app autenticadora, códigos de recuperación, sesiones abiertas y
337
+ bitácora) vienen hechos en `@stackcraftmx/calcita/account`. El proyecto **solo escribe el conector**: las llamadas a su
338
+ backend. Pide `@simplewebauthn/browser` (las llaves de acceso).
339
+
340
+ ```jsx
341
+ import {AccountProvider, ProfileScreen, SignInScreen, createRestAccountConnector} from '@stackcraftmx/calcita/account';
342
+
343
+ // 1. el conector: si el backend sigue el contrato de abajo, es una línea
344
+ const accountConnector = createRestAccountConnector(apiClient);
345
+
346
+ // 2. el proveedor, por fuera de ToolkitProvider (le pasa la regla de permisos de quien está dentro)
347
+ <AccountProvider connector={accountConnector}>
348
+ {(canAccess) => <ToolkitProvider canAccess={canAccess} …>…</ToolkitProvider>}
349
+ </AccountProvider>
350
+
351
+ // 3. las pantallas, en sus rutas
352
+ {path: '/sign-in', element: <SignInScreen forgotPasswordPath="/forgot-password" logo={<AppLogo />} />}
353
+ {path: '/forgot-password', element: <ForgotPasswordScreen signInPath="/sign-in" />}
354
+ {path: '/reset-password', element: <ResetPasswordScreen signInPath="/sign-in" />} // el enlace del correo: ?token=…
355
+ {path: '/profile', element: <ProfileScreen />}
356
+ ```
357
+
358
+ `useAccount()` da `{session, refreshSession, signOut}` para la barra y las pantallas propias.
359
+
360
+ **Sin backend todavía:** `createDemoAccountConnector()` de `@stackcraftmx/calcita/account-demo` (todo en el navegador,
361
+ con la verificación en dos pasos funcionando con su teléfono de verdad). Con `toQrImageUrl` sale el QR de la app; el
362
+ proyecto que arma `calcita new` usa la demostración mientras no tenga `VITE_API_URL` y el REST en cuanto la tiene (la
363
+ demostración ni siquiera viaja en lo construido).
364
+
365
+ **Si el backend es distinto:** se cambia la ruta en `paths` o solo la función que no coincida; TypeScript (o el editor,
366
+ con el JSDoc) avisa si una función no regresa lo que piden las pantallas (`AccountConnector`).
367
+
368
+ ```js
369
+ const accountConnector = {
370
+ ...createRestAccountConnector(apiClient, {paths: {session: '/me'}}),
371
+ signIn: async ({email, password, remember}) => {
372
+ const response = await apiClient.post('/login', {username: email, password, remember});
373
+ return {secondStep: response.mfa_required ? {methods: ['totp']} : null};
374
+ },
375
+ };
376
+ ```
377
+
378
+ El contrato REST (`ACCOUNT_REST_PATHS`; llaves en snake_case, errores RFC 9457 con `errors` por campo):
379
+
380
+ | Petición | Manda | Responde |
381
+ |---|---|---|
382
+ | `GET /auth/session` | — | `{user: {id, name, email, subtitle, phone}, roles, abilities, labels}`; 401 si nadie está dentro |
383
+ | `POST /auth/sign-in` | `{email, password, remember}` | `{second_step: {methods: ['passkey', 'totp', 'recovery_code']} \| null}` |
384
+ | `POST /auth/second-step` | `{method: 'totp' \| 'recovery_code', code}` | 204; 401 con `remaining_attempts`, 423 `account_locked` |
385
+ | `GET /auth/second-step/passkey-options` | — | las opciones de WebAuthn para firmar |
386
+ | `POST /auth/second-step/passkey` | `{credential}` | 204 |
387
+ | `POST /auth/sign-out` | — | 204 |
388
+ | `POST /auth/forgot-password` | `{email}` | 204, exista o no el correo |
389
+ | `POST /auth/reset-password` | `{token, new_password}` | 204 |
390
+ | `PUT /account` | `{name, phone}` | `{message?}` |
391
+ | `PUT /account/password` | `{current_password, new_password}` | 204 |
392
+ | `GET /account/security` | — | `{is_enabled, enabled_at, passkeys: [{id, name, created_at, last_used_at}], totp: {is_enabled, enabled_at}, recovery_codes_remaining}` |
393
+ | `POST /account/security/totp` | — | `{secret, qr_image_url}` |
394
+ | `POST /account/security/totp/confirm` | `{code}` | `{security, recovery_codes?}` |
395
+ | `DELETE /account/security/totp` | `{password}` | `{security}` |
396
+ | `GET /account/security/passkeys/registration-options` | — | las opciones de WebAuthn para crear |
397
+ | `POST /account/security/passkeys` | `{name, credential}` | `{security, recovery_codes?}` |
398
+ | `DELETE /account/security/passkeys/{id}` | `{password}` | `{security}` |
399
+ | `POST /account/security/recovery-codes` | `{password}` | `{security, recovery_codes}` |
400
+ | `GET /account/sessions` | — | `[{id, browser, platform, is_mobile, started_at, network, is_current}]` |
401
+ | `POST /account/sessions/close-others` | — | `{closed}` |
402
+ | `GET /account/activity` | — | `[{id, kind, occurred_at, device, network}]` |
403
+
404
+ Las opciones y la firma de WebAuthn viajan tal cual: las arma y las revisa la librería del servidor (py_webauthn,
405
+ @simplewebauthn/server, web-auth/webauthn-lib). Lo que quita protección pide la contraseña; `recovery_codes` se enseña una
406
+ sola vez. `kind` de la bitácora es uno de `ACCOUNT_EVENT_KIND`.
407
+
408
+ ## Seguridad de la cuenta (las piezas sueltas)
409
+
410
+ Las mismas piezas de la cuenta completa, para armar pantallas propias:
411
+ - En `/forms`, `TwoStepVerificationCard`: llaves de acceso, app autenticadora y códigos de recuperación. Lo que quita
412
+ protección pide la contraseña. El proyecto conecta las acciones con su API; la tarjeta no sabe del servidor.
413
+ - En `/forms`, `SecondStepForm`: el segundo paso al entrar (llave, código de la app o de recuperación), con los intentos
414
+ que quedan.
415
+ - `RecoveryCodesDialog`: los códigos se enseñan una vez y no se cierra sin «Ya los guardé»; se copian o se bajan en .txt.
416
+ - `SessionsCard`: dónde está abierta la cuenta y «cerrar la sesión en los demás equipos». `ActivityLog`: la bitácora.
417
+ - En `/passkeys`, `createPasskey` y `signWithPasskey`: el navegador pide la huella, el rostro o el PIN.
418
+
419
+ Contra XSS: los textos del servidor se pintan como texto (nunca `dangerouslySetInnerHTML`), `safeInternalPath` solo deja
420
+ seguir direcciones de la app en `?next=`, la sesión va en una cookie HttpOnly (sin tokens en `localStorage`) y el CSRF con
421
+ la cookie doble de Sanctum. Los ejemplos lo enseñan en Componentes → Seguridad, y la verificación funciona con su
422
+ teléfono de verdad en Mi perfil → Seguridad.
423
+
424
+ ## Entrar, Mi perfil y los permisos (el template)
425
+
426
+ Lo que piden todos los sistemas, listo para conectar a su API:
427
+
428
+ - `AuthLayout`: la pantalla de entrar, con el logo, una tarjeta al centro y el idioma y claro u oscuro arriba (con
429
+ vidrio, la tarjeta es de vidrio sobre el lienzo de color).
430
+ - En `/forms`, `SignInForm`, `ForgotPasswordForm` y `ChangePasswordForm`. Los errores del servidor salen en su lugar.
431
+ «¿Olvidó su contraseña?» no dice si el correo existe, a propósito. La contraseña nueva trae su lista de reglas, que se
432
+ va palomeando (`DEFAULT_PASSWORD_POLICY`: 12 caracteres, minúscula, mayúscula y número; cada proyecto pone la suya).
433
+ - `ProfileHeader`: portada, avatar con iniciales, nombre y perfil. `AppearanceSettings`: tamaño de letra, idioma y claro
434
+ u oscuro, los mismos del engrane del teléfono.
435
+ - `PermissionMatrix`: los permisos de un perfil por grupo, con «todos» y cuántos tiene. Cada módulo declara los suyos en
436
+ su `menu.js` y `composePermissionGroups` los junta: no hay lista central.
437
+ - `MetricCard` con `trend`: cuánto cambió contra el periodo anterior, en verde si es bueno y en rojo si es malo.
438
+
439
+ ```jsx
440
+ <AuthLayout logo={<Logo />} title={t('auth:signIn.title')} description={t('auth:signIn.subtitle')}>
441
+ <SignInForm onSubmit={(values) => api.signIn(values)} forgotPasswordPath="/forgot-password" />
442
+ </AuthLayout>
443
+
444
+ // modules/orders/menu.js
445
+ export const permissions = [
446
+ {key: 'orders.view', labelKey: 'orders:permissions.view', descriptionKey: 'orders:permissions.viewDescription'},
447
+ {key: 'orders.cancel', labelKey: 'orders:permissions.cancel'},
448
+ ];
449
+
450
+ // la pantalla de perfiles
451
+ const groups = composePermissionGroups(import.meta.glob('@/modules/*/menu.js', {eager: true}), t);
452
+ <PermissionMatrix groups={groups} value={profile.abilities} onChange={setAbilities} />
453
+ ```
454
+
455
+ Los ejemplos lo traen armado: entrar (con «Entrar como…» para los tres perfiles de prueba), «¿olvidó su contraseña?»,
456
+ elegir una contraseña nueva, Mi perfil (sus datos, seguridad y preferencias), Perfiles y permisos (al guardar los de su
457
+ propio perfil, el menú cambia en ese momento) y un tablero con tarjetas, gráficas y los últimos pedidos.
458
+
459
+ ## Next.js (App Router)
460
+
461
+ El paquete ya viene marcado para Next: los componentes llevan `'use client'` y lo puro (formatos, `Money`, permisos,
462
+ menú, diccionarios) no lleva marca, así que también corre en los componentes de servidor. Lo que se conecta:
463
+
464
+ ```jsx
465
+ // app/layout.jsx (servidor)
466
+ <html lang="es" suppressHydrationWarning>
467
+ <body>
468
+ <InitColorSchemeScript attribute="class" /> {/* claro u oscuro antes de pintar, sin brinco */}
469
+ <AppRouterCacheProvider> {/* @mui/material-nextjs/v16-appRouter */}
470
+ <AppProviders>{children}</AppProviders> {/* 'use client': tema, ToolkitProvider y AppLayout */}
471
+ </AppRouterCacheProvider>
472
+ </body>
473
+ </html>
474
+
475
+ // AppProviders.jsx ('use client')
476
+ <ToolkitProvider navigation={nextNavigation} …> {/* de @stackcraftmx/calcita/next */}
477
+ ```
478
+
479
+ - El servidor calcula con las piezas puras y le pasa TEXTO al cliente (`money.toJSON()`): lo que cruza del servidor al
480
+ navegador tiene que ser JSON.
481
+ - Zona y moneda del servidor con `configureToolkit({timeZone, currency})` una vez (son de toda la app; sin eso, en un
482
+ contenedor la zona es UTC). El idioma NO: cambia por persona y vive en el cliente.
483
+ - Los `menu.js` se descubren con `require.context` (Next no tiene `import.meta.glob`).
484
+ - El «Regresar» de `BackButton` no sabe a dónde regresa (Next no guarda el índice del historial que pone react-router):
485
+ regresa a la última lista anotada o a `fallbackTo`.
486
+
487
+
488
+ ## Formularios
489
+
490
+ Cada campo tiene su vista suelta en la puerta principal (`TextInput`, `SelectInput`, `NumberInput`, `CatalogInput`,
491
+ `ColorInput`; sirven sin formulario) y su conexión: a formik en `/forms` y a react-hook-form en `/react-hook-form`, con
492
+ los mismos nombres. Cambiar de librería es cambiar el import.
493
+
494
+ ```jsx
495
+ import {Form, Formik, FormNumberField, FormProblemAlert, FormTextField, SubmitButton, Yup, applyServerProblem} from '@stackcraftmx/calcita/forms';
496
+
497
+ <Formik initialValues={{name: '', credit_limit: ''}} validationSchema={schema}
498
+ onSubmit={async (values, helpers) => {
499
+ try { await api.save(values); } catch (error) { applyServerProblem(error, {...helpers, values}); }
500
+ }}>
501
+ <Form noValidate>
502
+ <FormProblemAlert />
503
+ <FormTextField name="name" label="Nombre" />
504
+ <FormNumberField name="credit_limit" label="Límite de crédito" prefix="$" /> {/* viaja '50000.00' */}
505
+ <SubmitButton>Guardar</SubmitButton>
506
+ </Form>
507
+ </Formik>
508
+ ```
509
+
510
+ formik y yup vienen con el paquete: se importan de `@stackcraftmx/calcita/forms` y no de `formik` / `yup` directo (con
511
+ otra versión en el proyecto, los campos no encontrarían el formulario). `FormWizard` parte un formulario en pasos, con
512
+ pasos opcionales; los ejemplos traen uno completo.
513
+
514
+ Para que el formulario se vea como los de Apple (Ajustes, la hoja «Nuevo evento» de Calendario), los campos van dentro de
515
+ una `FormSection`: cada uno se vuelve un renglón, con la etiqueta a la izquierda y el valor a la derecha, sin la caja de
516
+ MUI. Son los mismos campos, sin cambiarles nada; las listas llevan su ⌃⌄ y la fecha va en una cápsula. `FormRow` es el
517
+ renglón suelto para lo demás (un interruptor, un texto).
518
+
519
+ ```jsx
520
+ import {FormRow, FormSection} from '@stackcraftmx/calcita';
521
+
522
+ <FormSection title="Contacto" footer="Con el correo le avisamos de cada pedido.">
523
+ <FormTextField name="name" label="Nombre" placeholder="Nombre y apellidos" />
524
+ <FormTextField name="email" label="Correo" type="email" />
525
+ <FormRow label="Avisos por correo"><Switch /></FormRow>
526
+ </FormSection>
527
+ ```
528
+
529
+ Los campos van directo dentro de la `FormSection` (sin Grid ni Stack en medio): la línea entre renglones se dibuja entre
530
+ hermanos.
531
+
532
+ ## Subir archivos
533
+
534
+ Dos zonas para soltar archivos con el mismo uso: la de la puerta principal, con puro MUI (un archivo), y la de
535
+ `/filepond` (varios archivos, animaciones, avance por archivo). Cambiar de una a otra es cambiar el import. Las dos solo
536
+ eligen; la pantalla sube con `uploadWithProgress` (el avance real de la subida) y sigue la subida con `uploadMachine`.
537
+
538
+ ```jsx
539
+ import {FileDropzone, buildUploadActors, uploadMachine, uploadWithProgress} from '@stackcraftmx/calcita';
540
+
541
+ <FileDropzone value={file} onChange={setFile} accept="excel" maxSize="10 MB" busy={isUploading}
542
+ actions={<Button onClick={() => send({type: 'UPLOAD', input: {file}})}>Importar</Button>} />
543
+ ```
544
+
545
+ `accept` acepta nombres (`'excel'`, `['pdf', 'image']`) o lo de siempre del input (`'.xlsx,.xls'`); `maxSize` va en bytes
546
+ o con unidades (`'10 MB'`, en base 1000 como el navegador).
547
+
548
+ ## Dinero sin problemas de decimales
549
+
550
+ En JavaScript `0.1 + 0.2` da `0.30000000000000004`. `Money` guarda los montos en centavos enteros (como el Money de PHP
551
+ con bcmath y el de Go con int64), así que las sumas siempre cuadran al centavo:
552
+
553
+ ```js
554
+ import {MONEY_ROUNDING, Money} from '@stackcraftmx/calcita/money';
555
+
556
+ const total = Money.fromString(order.total).plus(Money.fromNumber(order.shipping)); // del API, en texto o número
557
+ const withTax = total.times('1.16'); // redondea una vez, al centavo
558
+ const perPayment = total.dividedBy(3, {rounding: MONEY_ROUNDING.halfEven}); // redondeo bancario
559
+ total.format(); // "$1,234.50", en el idioma y la moneda de ToolkitProvider
560
+ total.amount(); // "1234.50", lo que se le manda al API
561
+ ```
562
+
563
+ Los decimales salen de la moneda (`MXN` 2, `JPY` 0, `KWD` 3) y se pueden cambiar con `{currency, decimals}`. Truena en
564
+ vez de perder centavos: un texto que no es número, decimales de más, mezclar monedas o usar `+` y `>` en lugar de
565
+ `plus` e `isGreaterThan`.
566
+
567
+ ## Desarrollo del paquete
568
+
569
+ Se trabaja con Node 22 y pnpm, las dos versiones fijadas en el paquete: `nvm use` toma la de `.nvmrc`, Volta la toma
570
+ sola de `package.json`, y Corepack (viene con Node 22) baja la versión de pnpm que dice `packageManager`.
571
+
572
+ ```bash
573
+ nvm use
574
+ pnpm install
575
+ pnpm test # pruebas sin navegador (node --test)
576
+ pnpm run build # dist/ con un archivo por módulo y sus tipos en dist/types
577
+ pnpm run check # pruebas, build, cada componente pintado con el tema por omisión de MUI, el CLI, un proyecto en TypeScript y los ejemplos
578
+ pnpm run examples # construye el paquete y abre los ejemplos sin backend en http://localhost:5173
579
+ ```
580
+
581
+ Los ejemplos ([examples/](examples/README.md)) usan el paquete ya construido, como un proyecto nuevo: tabla de servidor,
582
+ formulario, avisos, descargas y Excel, y métricas, con datos inventados en memoria. No viajan a npm.
583
+
584
+ ## Probar sin instalar nada
585
+
586
+ Con Docker, los ejemplos se construyen y se sirven en una imagen; no hace falta Node ni pnpm:
587
+
588
+ ```bash
589
+ docker compose up -d examples # construye y arranca: http://localhost:8095
590
+ docker compose down # lo apaga
591
+ ```
592
+
593
+ Es la versión de producción (archivos construidos, servidos por nginx sin permisos de administrador), no el servidor de
594
+ desarrollo. `EXAMPLES_PORT=8100 docker compose up -d examples` cambia el puerto.
595
+
596
+ ### Enseñarlo por internet (túnel de Cloudflare)
597
+
598
+ `scripts/tunnel.sh` publica los ejemplos con un túnel de Cloudflare. El token va en `tunnel/.cloudflared.token` (una
599
+ línea, fuera de git) y la dirección pública y su destino se configuran en el panel de Cloudflare; el destino es el puerto
600
+ de Docker (`http://localhost:8095`), no el servidor de desarrollo, que se rompe cada vez que cambian sus dependencias.
601
+
602
+ ```bash
603
+ pnpm run tunnel:start # arranca y dice la dirección pública y a dónde apunta
604
+ pnpm run tunnel:status # ¿corre? y las dos direcciones responden
605
+ pnpm run tunnel:stop # lo apaga (solo el suyo, nunca el cloudflared de otro proyecto)
606
+ ```
607
+
608
+ ## Licencia
609
+
610
+ [FSL-1.1-MIT](LICENSE) (Functional Source License): se puede usar, copiar, modificar y poner en producción gratis, en
611
+ cualquier proyecto y empresa, también comercial. Lo único que no se permite es ofrecer Calcita (o algo que la sustituya)
612
+ como producto o servicio comercial que compita con ella. Dos años después de publicada, cada versión pasa sola a MIT.