@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,63 @@
1
+ // Las preguntas de «calcita new» en la terminal: cada una con sus opciones numeradas y la recomendada marcada; Enter acepta
2
+ // la recomendada. Una respuesta que no sirve se vuelve a preguntar con su motivo.
3
+ //
4
+ // Funciones de node, sin React: function (regla de la casa).
5
+ import {createInterface} from 'node:readline/promises';
6
+ import {stdin, stdout} from 'node:process';
7
+
8
+ import {QUESTIONS, problemWithAnswer} from './projectAnswers.js';
9
+
10
+ /**
11
+ * @param {Record<string, string>} recommendedAnswers las de defaultAnswersOf
12
+ * @param {Record<string, string>} [presetAnswers] las que ya llegaron como opciones: esas no se preguntan
13
+ * @returns {Promise<Record<string, string>>}
14
+ */
15
+ export async function askQuestions(recommendedAnswers, presetAnswers = {}) {
16
+ const terminal = createInterface({input: stdin, output: stdout});
17
+ const answers = {...presetAnswers};
18
+ try {
19
+ for (const question of QUESTIONS) {
20
+ if (question.key in presetAnswers || (question.when && !question.when(answers))) {
21
+ continue;
22
+ }
23
+ answers[question.key] = question.options
24
+ ? await askOption(terminal, question, recommendedAnswers[question.key])
25
+ : await askText(terminal, question, recommendedAnswers[question.key]);
26
+ }
27
+ } finally {
28
+ terminal.close();
29
+ }
30
+ return answers;
31
+ }
32
+
33
+ /** Una pregunta de opciones: se contesta con su número; Enter, la recomendada. */
34
+ async function askOption(terminal, question, recommendedValue) {
35
+ stdout.write(`\n${question.text}\n`);
36
+ question.options.forEach(([value, label], index) => {
37
+ stdout.write(` ${index + 1}) ${label}${value === recommendedValue ? ' ← recomendada' : ''}\n`);
38
+ });
39
+ for (;;) {
40
+ const reply = (await terminal.question('Número (Enter = recomendada): ')).trim();
41
+ if (reply === '') {
42
+ return recommendedValue;
43
+ }
44
+ const option = question.options[Number(reply) - 1];
45
+ if (option) {
46
+ return option[0];
47
+ }
48
+ stdout.write(`Escriba un número del 1 al ${question.options.length}.\n`);
49
+ }
50
+ }
51
+
52
+ /** Una pregunta de texto; Enter, la recomendada (si hay). */
53
+ async function askText(terminal, question, recommendedValue) {
54
+ for (;;) {
55
+ const hint = recommendedValue ? ` [${recommendedValue}]` : '';
56
+ const reply = (await terminal.question(`\n${question.text}${hint}: `)).trim() || recommendedValue || '';
57
+ const problem = problemWithAnswer(question.key, reply);
58
+ if (!problem) {
59
+ return reply;
60
+ }
61
+ stdout.write(`${problem}\n`);
62
+ }
63
+ }
package/cli/calcita.js ADDED
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/env node
2
+ // El CLI de Calcita: arma un proyecto nuevo con preguntas y el esqueleto de módulos, pantallas, formularios y componentes,
3
+ // con la forma de los ejemplos (un módulo por carpeta, con su menú, sus rutas, sus textos y su API).
4
+ //
5
+ // npx @stackcraftmx/calcita new mi-tienda (o: pnpm dlx @stackcraftmx/calcita new mi-tienda)
6
+ // pnpm exec calcita make:module purchase-orders (dentro del proyecto)
7
+ //
8
+ // Solo node, sin dependencias: corre antes de que el proyecto tenga nada instalado. Los textos para la persona van en
9
+ // español; los nombres que escribe (módulos, pantallas…), en inglés y sin acentos, como el resto del código.
10
+ //
11
+ // OJO: los imports del CLI van con «./» y no con el alias @/: el CLI se publica tal cual y node no conoce el alias.
12
+ import {basename, resolve} from 'node:path';
13
+ import {argv, cwd, exit, stdin, stdout} from 'node:process';
14
+ import {parseArgs} from 'node:util';
15
+
16
+ import {askQuestions} from './askQuestions.js';
17
+ import {makeComponent} from './makeComponent.js';
18
+ import {makeForm} from './makeForm.js';
19
+ import {makeModule} from './makeModule.js';
20
+ import {makePage} from './makePage.js';
21
+ import {namesOf} from './names.js';
22
+ import {newProject} from './newProject.js';
23
+ import {QUESTIONS, answersFromFlags, checkedAnswers, defaultAnswersOf} from './projectAnswers.js';
24
+ import {screenLabelsOf} from './screenLabels.js';
25
+ import {CliError} from './templateFiles.js';
26
+
27
+ const HELP = `Calcita: proyectos y esqueletos con la forma de los ejemplos.
28
+
29
+ calcita new <carpeta> un proyecto nuevo (pregunta cómo lo quiere)
30
+ calcita init lo mismo, en la carpeta actual (vacía)
31
+ calcita make:module <módulo> un módulo: menú, ruta, pantalla, formulario, API, textos y servidor de mentira
32
+ calcita make:page <módulo> <Pantalla> otra pantalla en un módulo, con su ruta
33
+ calcita make:form <módulo> <Formulario> un formulario con sus reglas y sus textos
34
+ calcita make:component <Componente> un componente en src/core (lo usan varios módulos)
35
+ --module <módulo> … o solo de un módulo
36
+
37
+ Opciones:
38
+ -y, --yes sin preguntas: lo recomendado, más lo que diga cada opción
39
+ --label-es, --label-en el nombre en pantalla de un módulo o una pantalla nueva
40
+ ${QUESTIONS.map((question) => ` --${namesOf(question.key).kebab}=${question.options ? question.options.map(([value]) => value).join('|') : '…'}`).join('\n')}
41
+
42
+ Los nombres van en inglés y sin acentos (purchase-orders, OrderDetail); el texto en pantalla, con --label-es y --label-en.`;
43
+
44
+ // las respuestas de «new» también llegan como opciones: --menu-position=top
45
+ const ANSWER_OPTIONS = Object.fromEntries(QUESTIONS.map((question) => [namesOf(question.key).kebab, {type: 'string'}]));
46
+
47
+ const {values: options, positionals} = parseArgs({
48
+ args: argv.slice(2),
49
+ allowPositionals: true,
50
+ options: {
51
+ 'yes': {type: 'boolean', short: 'y'},
52
+ 'help': {type: 'boolean', short: 'h'},
53
+ 'module': {type: 'string'},
54
+ 'label-es': {type: 'string'},
55
+ 'label-en': {type: 'string'},
56
+ ...ANSWER_OPTIONS,
57
+ },
58
+ });
59
+ const [command, ...commandArguments] = positionals;
60
+ // se pregunta solo en una terminal de verdad y sin --yes (en un script se usa lo recomendado)
61
+ const canAsk = Boolean(stdin.isTTY) && !options.yes;
62
+
63
+ /** Las respuestas que llegaron como opciones, con la llave de su pregunta (menuPosition). */
64
+ function answersInOptions() {
65
+ return Object.fromEntries(QUESTIONS
66
+ .map((question) => [question.key, options[namesOf(question.key).kebab]])
67
+ .filter(([, value]) => value !== undefined));
68
+ }
69
+
70
+ /** Imprime lo escrito, una ruta por renglón. */
71
+ function printWritten(written) {
72
+ stdout.write(`${written.map((path) => ` + ${path}`).join('\n')}\n`);
73
+ }
74
+
75
+ async function runNew(folder) {
76
+ if (!folder) {
77
+ throw new CliError('Falta la carpeta del proyecto: calcita new mi-tienda');
78
+ }
79
+ const folderName = basename(resolve(folder));
80
+ const presetAnswers = answersInOptions();
81
+ const answers = canAsk
82
+ ? checkedAnswers({...defaultAnswersOf(folderName), ...presetAnswers, ...await askQuestions({...defaultAnswersOf(folderName), ...presetAnswers}, presetAnswers)})
83
+ : answersFromFlags(folderName, presetAnswers);
84
+ const {projectRoot, written} = await newProject({folder, answers});
85
+ stdout.write(`\nListo: ${projectRoot}\n`);
86
+ printWritten(written);
87
+ const enterFolder = folder === '.' ? '' : ` cd ${folder}\n`;
88
+ stdout.write(`\nPara arrancar:\n${enterFolder} pnpm install\n pnpm dev\n`);
89
+ if (answers.auth === 'yes') {
90
+ stdout.write('\nEn la pantalla de entrar, «Entrar con la cuenta de ejemplo» entra sin escribir nada (servidor de mentira).\n');
91
+ }
92
+ }
93
+
94
+ async function runMakeModule(moduleName) {
95
+ const labels = await screenLabelsOf({
96
+ defaultLabel: namesOf(moduleName ?? 'module').human, labelEs: options['label-es'], labelEn: options['label-en'], canAsk, what: 'el módulo',
97
+ });
98
+ const {written, path} = await makeModule({projectRoot: cwd(), moduleName, labels});
99
+ printWritten(written);
100
+ stdout.write(`\nListo: ya sale en el menú y en ${path}.\n`);
101
+ }
102
+
103
+ async function runMakePage(moduleName, pageName) {
104
+ const labels = await screenLabelsOf({
105
+ defaultLabel: namesOf(pageName ?? 'page').human, labelEs: options['label-es'], labelEn: options['label-en'], canAsk, what: 'la pantalla',
106
+ });
107
+ const {written, path, manualLines} = await makePage({projectRoot: cwd(), moduleName, pageName, labels});
108
+ printWritten(written);
109
+ if (manualLines) {
110
+ stdout.write(`\nNo reconocí la forma de routes.js del módulo: agregue a mano estos renglones (la constante y la ruta):\n${manualLines.join('\n')}\n`);
111
+ }
112
+ stdout.write(`\nListo: la pantalla está en ${path}.\n`);
113
+ }
114
+
115
+ async function runMakeForm(moduleName, formName) {
116
+ const written = await makeForm({projectRoot: cwd(), moduleName, formName});
117
+ printWritten(written);
118
+ // el componente es el .jsx que se escribió: la pantalla le dice qué hacer con los datos
119
+ const componentName = written.find((path) => path.endsWith('.jsx'))?.split('/').at(-1).replace('.jsx', '');
120
+ stdout.write(`\nListo. En una pantalla del módulo: <${componentName} onSubmit={addRecord} onSaved={showSaved} /> (las funciones de su *Api.js).\n`);
121
+ }
122
+
123
+ async function runMakeComponent(componentName) {
124
+ printWritten(await makeComponent({projectRoot: cwd(), componentName, moduleName: options.module}));
125
+ stdout.write('\nListo.\n');
126
+ }
127
+
128
+ const COMMANDS = Object.freeze({
129
+ 'new': runNew,
130
+ 'init': () => runNew('.'),
131
+ 'make:module': runMakeModule,
132
+ 'make:page': runMakePage,
133
+ 'make:form': runMakeForm,
134
+ 'make:component': runMakeComponent,
135
+ });
136
+
137
+ try {
138
+ const run = COMMANDS[command];
139
+ if (options.help || !command) {
140
+ stdout.write(`${HELP}\n`);
141
+ } else if (!run) {
142
+ throw new CliError(`No conozco el comando «${command}». Vea: calcita --help`);
143
+ } else {
144
+ await run(...commandArguments);
145
+ }
146
+ } catch (error) {
147
+ // un error que se le explica a la persona sale solo con su mensaje; uno del CLI, completo (para reportarlo)
148
+ stdout.write(error instanceof CliError ? `\n${error.message}\n` : `\n${error.stack}\n`);
149
+ exit(1);
150
+ }
@@ -0,0 +1,50 @@
1
+ // calcita make:component <Componente> [--module <módulo>]: un componente nuevo.
2
+ //
3
+ // - Sin --module va a src/core (lo usan dos o más módulos) y se agrega a la puerta de core (src/core/index.js): se
4
+ // importa de '@/core'. Es genérico y sin estado: function.
5
+ // - Con --module va a src/modules/<módulo>/components (solo de ese módulo): arrow.
6
+ //
7
+ // Funciones de node, sin React: function (regla de la casa).
8
+ import {access, appendFile} from 'node:fs/promises';
9
+ import {join} from 'node:path';
10
+ import {fileURLToPath} from 'node:url';
11
+
12
+ import {existingModuleOf} from './makeForm.js';
13
+ import {isValidName, namesOf} from './names.js';
14
+ import {CliError, copyTemplateFolder} from './templateFiles.js';
15
+
16
+ const COMPONENT_TEMPLATES = fileURLToPath(new URL('templates/component/', import.meta.url));
17
+
18
+ /**
19
+ * @param {object} options
20
+ * @param {string} options.projectRoot
21
+ * @param {string} options.componentName
22
+ * @param {string} [options.moduleName] sin él, a core
23
+ * @returns {Promise<string[]>} las rutas escritas, relativas al proyecto
24
+ */
25
+ export async function makeComponent({projectRoot, componentName, moduleName}) {
26
+ if (!isValidName(componentName ?? '')) {
27
+ throw new CliError('Falta el nombre del componente, en inglés y sin acentos (p. ej. StatusBadge).');
28
+ }
29
+ const componentNames = namesOf(componentName);
30
+
31
+ if (moduleName) {
32
+ const {folder, names: moduleNames} = await existingModuleOf(projectRoot, moduleName);
33
+ const written = await copyTemplateFolder({
34
+ templateFolder: join(COMPONENT_TEMPLATES, 'module'), targetFolder: join(folder, 'components'),
35
+ values: {ComponentName: componentNames.pascal, module: moduleNames.camel},
36
+ });
37
+ return written.map((path) => `src/modules/${moduleNames.camel}/components/${path}`);
38
+ }
39
+
40
+ const coreFolder = join(projectRoot, 'src', 'core');
41
+ const coreIndex = join(coreFolder, 'index.js');
42
+ await access(coreIndex).catch(() => {
43
+ throw new CliError('No encontré src/core/index.js (la puerta de core).');
44
+ });
45
+ const written = await copyTemplateFolder({
46
+ templateFolder: join(COMPONENT_TEMPLATES, 'core'), targetFolder: coreFolder, values: {ComponentName: componentNames.pascal},
47
+ });
48
+ await appendFile(coreIndex, `export {${componentNames.pascal}} from '@/core/${componentNames.pascal}.jsx';\n`);
49
+ return [...written.map((path) => `src/core/${path}`), 'src/core/index.js (se agregó a la puerta de core)'];
50
+ }
@@ -0,0 +1,68 @@
1
+ // calcita make:form <módulo> <Formulario>: un formulario dentro de un módulo, con la librería del proyecto (formik o
2
+ // react-hook-form, la de calcita.json): el componente, sus reglas (yup) y sus textos.
3
+ //
4
+ // calcita make:form contacts ContactForm
5
+ // → src/modules/contacts/ContactForm.jsx, contactFormSchema.js, contactFormTexts.js
6
+ //
7
+ // El formulario no sabe del servidor: la pantalla le pasa qué hacer con los datos (onSubmit).
8
+ //
9
+ // Funciones de node, sin React: function (regla de la casa).
10
+ import {access} from 'node:fs/promises';
11
+ import {join} from 'node:path';
12
+ import {fileURLToPath} from 'node:url';
13
+
14
+ import {isValidName, namesOf, withoutSuffixWord} from './names.js';
15
+ import {readProjectConfig} from './projectConfig.js';
16
+ import {CliError, copyTemplateFolder} from './templateFiles.js';
17
+
18
+ const FORM_TEMPLATES = fileURLToPath(new URL('templates/form/', import.meta.url));
19
+ // la carpeta de plantillas de cada librería de formularios
20
+ const TEMPLATE_FOLDER_OF_LIBRARY = Object.freeze({'formik': 'formik', 'react-hook-form': 'hookForm'});
21
+
22
+ /**
23
+ * La carpeta del módulo, que ya debe existir.
24
+ *
25
+ * @param {string} projectRoot
26
+ * @param {string} moduleName como lo escribió la persona
27
+ * @returns {Promise<{folder: string, names: ReturnType<typeof namesOf>}>}
28
+ */
29
+ export async function existingModuleOf(projectRoot, moduleName) {
30
+ if (!isValidName(moduleName ?? '')) {
31
+ throw new CliError('Falta el módulo, en inglés y sin acentos (p. ej. contacts).');
32
+ }
33
+ const names = namesOf(moduleName);
34
+ const folder = join(projectRoot, 'src', 'modules', names.camel);
35
+ try {
36
+ await access(folder);
37
+ } catch {
38
+ throw new CliError(`No existe el módulo src/modules/${names.camel}. Créelo antes con: calcita make:module ${names.kebab}`);
39
+ }
40
+ return {folder, names};
41
+ }
42
+
43
+ /**
44
+ * @param {object} options
45
+ * @param {string} options.projectRoot
46
+ * @param {string} options.moduleName
47
+ * @param {string} options.formName «ContactForm» o «contact» (se le agrega Form)
48
+ * @returns {Promise<string[]>} las rutas escritas, relativas al proyecto
49
+ */
50
+ export async function makeForm({projectRoot, moduleName, formName}) {
51
+ const {folder, names: moduleNames} = await existingModuleOf(projectRoot, moduleName);
52
+ if (!isValidName(formName ?? '')) {
53
+ throw new CliError('Falta el nombre del formulario, en inglés y sin acentos (p. ej. ContactForm).');
54
+ }
55
+ const {forms} = await readProjectConfig(projectRoot);
56
+ const libraryFolder = TEMPLATE_FOLDER_OF_LIBRARY[forms];
57
+ if (!libraryFolder) {
58
+ throw new CliError(`calcita.json dice forms: «${forms}»; use formik o react-hook-form.`);
59
+ }
60
+
61
+ const formNames = namesOf(`${withoutSuffixWord(formName, 'form')} form`);
62
+ const values = {module: moduleNames.camel, FormName: formNames.pascal, formName: formNames.camel, FORM_NAME: formNames.constant};
63
+ const written = [
64
+ ...await copyTemplateFolder({templateFolder: join(FORM_TEMPLATES, 'shared'), targetFolder: folder, values}),
65
+ ...await copyTemplateFolder({templateFolder: join(FORM_TEMPLATES, libraryFolder), targetFolder: folder, values}),
66
+ ];
67
+ return written.map((path) => `src/modules/${moduleNames.camel}/${path}`);
68
+ }
@@ -0,0 +1,78 @@
1
+ // calcita make:module <nombre>: un módulo nuevo con la forma de los demás, en su carpeta y sin tocar ningún otro archivo:
2
+ // su entrada en el menú (menu.js), su ruta (routes.js), su pantalla con la lista y el formulario para agregar, su API (la
3
+ // única puerta al servidor), sus textos en español e inglés y su servidor de mentira (src/fakeServer).
4
+ //
5
+ // calcita make:module purchase-orders
6
+ // → src/modules/purchaseOrders/… y src/fakeServer/purchaseOrdersServer.js, en /purchase-orders
7
+ //
8
+ // El menú, las rutas y los textos se descubren solos (import.meta.glob): el módulo sale en la app sin más ediciones.
9
+ //
10
+ // Funciones de node, sin React: function (regla de la casa).
11
+ import {access, readFile, readdir} from 'node:fs/promises';
12
+ import {join} from 'node:path';
13
+ import {fileURLToPath} from 'node:url';
14
+
15
+ import {makeForm} from './makeForm.js';
16
+ import {isValidName, namesOf} from './names.js';
17
+ import {CliError, copyTemplateFolder} from './templateFiles.js';
18
+
19
+ const MODULE_TEMPLATES = fileURLToPath(new URL('templates/module/', import.meta.url));
20
+ const MODULE_SERVER_TEMPLATES = fileURLToPath(new URL('templates/moduleServer/', import.meta.url));
21
+ // el orden de un módulo nuevo: después del último, con espacio para meter otros en medio
22
+ const ORDER_STEP = 10;
23
+ const ORDER_PATTERN = /export const order = (\d+);/;
24
+
25
+ /**
26
+ * El lugar en el menú para el módulo nuevo: el siguiente múltiplo de 10 después del mayor que ya hay.
27
+ *
28
+ * @param {string} projectRoot
29
+ * @returns {Promise<number>}
30
+ */
31
+ async function nextMenuOrderOf(projectRoot) {
32
+ const modulesFolder = join(projectRoot, 'src', 'modules');
33
+ const orders = [];
34
+ for (const moduleFolder of await readdir(modulesFolder)) {
35
+ try {
36
+ const match = ORDER_PATTERN.exec(await readFile(join(modulesFolder, moduleFolder, 'menu.js'), 'utf8'));
37
+ if (match) {
38
+ orders.push(Number(match[1]));
39
+ }
40
+ } catch {
41
+ // un módulo sin menu.js (las pantallas de entrar): no cuenta
42
+ }
43
+ }
44
+ return (Math.floor(Math.max(0, ...orders) / ORDER_STEP) + 1) * ORDER_STEP;
45
+ }
46
+
47
+ /**
48
+ * @param {object} options
49
+ * @param {string} options.projectRoot
50
+ * @param {string} options.moduleName como lo escribió la persona
51
+ * @param {{es: string, en: string}} options.labels su nombre en pantalla
52
+ * @returns {Promise<{written: string[], path: string}>} las rutas escritas (relativas al proyecto) y su dirección en la app
53
+ */
54
+ export async function makeModule({projectRoot, moduleName, labels}) {
55
+ if (!isValidName(moduleName ?? '')) {
56
+ throw new CliError('Falta el nombre del módulo, en inglés y sin acentos (p. ej. purchase-orders).');
57
+ }
58
+ const names = namesOf(moduleName);
59
+ const moduleFolder = join(projectRoot, 'src', 'modules', names.camel);
60
+ const exists = await access(moduleFolder).then(() => true, () => false);
61
+ if (exists) {
62
+ throw new CliError(`Ya existe src/modules/${names.camel}; no se tocó nada.`);
63
+ }
64
+
65
+ const values = {
66
+ name: names.camel, Name: names.pascal, NAME: names.constant, kebab: names.kebab,
67
+ LABEL_ES: labels.es, LABEL_EN: labels.en, ORDER: String(await nextMenuOrderOf(projectRoot)),
68
+ };
69
+ const moduleFiles = await copyTemplateFolder({templateFolder: MODULE_TEMPLATES, targetFolder: moduleFolder, values});
70
+ const serverFiles = await copyTemplateFolder({templateFolder: MODULE_SERVER_TEMPLATES, targetFolder: join(projectRoot, 'src', 'fakeServer'), values});
71
+ // su formulario, con la librería del proyecto: el mismo que arma «calcita make:form»
72
+ const formFiles = await makeForm({projectRoot, moduleName: names.camel, formName: `${names.pascal}Form`});
73
+
74
+ return {
75
+ written: [...moduleFiles.map((path) => `src/modules/${names.camel}/${path}`), ...serverFiles.map((path) => `src/fakeServer/${path}`), ...formFiles],
76
+ path: `/${names.kebab}`,
77
+ };
78
+ }
@@ -0,0 +1,62 @@
1
+ // calcita make:page <módulo> <Pantalla>: otra pantalla dentro de un módulo: el componente, sus textos y su ruta (se agrega
2
+ // a routes.js del módulo, con su constante _PATH).
3
+ //
4
+ // calcita make:page contacts ContactDetail
5
+ // → src/modules/contacts/ContactDetailPage.jsx y contactDetailPageTexts.js, en /contacts/contact-detail
6
+ //
7
+ // Si routes.js ya no tiene la forma de la plantilla (alguien lo cambió), no se adivina: se dice qué renglones agregar.
8
+ //
9
+ // Funciones de node, sin React: function (regla de la casa).
10
+ import {readFile, writeFile} from 'node:fs/promises';
11
+ import {join} from 'node:path';
12
+ import {fileURLToPath} from 'node:url';
13
+
14
+ import {existingModuleOf} from './makeForm.js';
15
+ import {isValidName, namesOf, withoutSuffixWord} from './names.js';
16
+ import {CliError, copyTemplateFolder, insertAfterLastMatch, insertIntoArray} from './templateFiles.js';
17
+
18
+ const PAGE_TEMPLATES = fileURLToPath(new URL('templates/page/', import.meta.url));
19
+ const PATH_CONSTANT_LINE = /^export const \w+_PATH = '([^']*)';$/m;
20
+ const ROUTES_DECLARATION = 'export const routes = [';
21
+
22
+ /**
23
+ * @param {object} options
24
+ * @param {string} options.projectRoot
25
+ * @param {string} options.moduleName
26
+ * @param {string} options.pageName «ContactDetail» o «ContactDetailPage»
27
+ * @param {{es: string, en: string}} options.labels su título en pantalla
28
+ * @returns {Promise<{written: string[], path: string, manualLines: string[]|null}>} manualLines: los renglones que hay
29
+ * que agregar a mano a routes.js si no se pudo
30
+ */
31
+ export async function makePage({projectRoot, moduleName, pageName, labels}) {
32
+ const {folder, names: moduleNames} = await existingModuleOf(projectRoot, moduleName);
33
+ if (!isValidName(pageName ?? '')) {
34
+ throw new CliError('Falta el nombre de la pantalla, en inglés y sin acentos (p. ej. ContactDetail).');
35
+ }
36
+ const pageNames = namesOf(withoutSuffixWord(pageName, 'page'));
37
+ const routesFile = join(folder, 'routes.js');
38
+ const routesText = await readFile(routesFile, 'utf8').catch(() => {
39
+ throw new CliError(`El módulo ${moduleNames.camel} no tiene routes.js.`);
40
+ });
41
+ // la dirección del módulo (su primera constante _PATH) y la de la pantalla, debajo
42
+ const modulePath = PATH_CONSTANT_LINE.exec(routesText)?.[1] ?? `/${moduleNames.kebab}`;
43
+ const pagePath = `${modulePath.replace(/\/$/, '')}/${pageNames.kebab}`;
44
+
45
+ const values = {
46
+ module: moduleNames.camel, PageName: pageNames.pascal, pageName: pageNames.camel, PAGE_NAME: pageNames.constant,
47
+ PAGE_LABEL_ES: labels.es, PAGE_LABEL_EN: labels.en,
48
+ };
49
+ const written = (await copyTemplateFolder({templateFolder: PAGE_TEMPLATES, targetFolder: folder, values}))
50
+ .map((path) => `src/modules/${moduleNames.camel}/${path}`);
51
+
52
+ const pathLine = `export const ${pageNames.constant}_PATH = '${pagePath}';`;
53
+ const routeLine = ` {path: ${pageNames.constant}_PATH, lazy: async () => ({Component: (await import('@/modules/${moduleNames.camel}/${pageNames.pascal}Page.jsx')).${pageNames.pascal}Page})},`;
54
+ const withPath = insertAfterLastMatch(routesText, PATH_CONSTANT_LINE, pathLine);
55
+ const withRoute = withPath && insertIntoArray(withPath, ROUTES_DECLARATION, routeLine);
56
+ if (!withRoute) {
57
+ return {written, path: pagePath, manualLines: [pathLine, routeLine]};
58
+ }
59
+ await writeFile(routesFile, withRoute);
60
+ written.push(`src/modules/${moduleNames.camel}/routes.js (se agregó su ruta)`);
61
+ return {written, path: pagePath, manualLines: null};
62
+ }
package/cli/names.js ADDED
@@ -0,0 +1,64 @@
1
+ // Los nombres que salen de lo que escribe la persona («purchase-orders», «PurchaseOrders», «purchase orders»). Cada parte
2
+ // del proyecto pide el suyo: la carpeta y el namespace de textos en camelCase, el componente en PascalCase, la ruta en
3
+ // kebab-case y la constante en MAYÚSCULAS. Se arman aquí, en un solo lugar, para que no salgan distintos de un archivo a otro.
4
+ //
5
+ // Funciones puras: function (regla de la casa). Pruebas en names.test.js.
6
+
7
+ // una palabra: minúsculas con números («orders2»), una con mayúscula inicial («Orders») o unas siglas («PDF»)
8
+ const WORD_PATTERN = /[A-Z]?[a-z0-9]+|[A-Z]+(?![a-z])/g;
9
+ // lo que se acepta: letras sin acentos, números, espacios, guiones; empieza con letra. Los nombres van en inglés (regla de
10
+ // la casa) y un acento en el nombre de un archivo o de una variable da problemas entre sistemas
11
+ const NAME_PATTERN = /^[A-Za-z][A-Za-z0-9 _-]*$/;
12
+
13
+ /**
14
+ * Las palabras del nombre, en minúsculas: «PurchaseOrders» y «purchase-orders» dan ['purchase', 'orders'].
15
+ *
16
+ * @param {string} text
17
+ * @returns {string[]}
18
+ */
19
+ export function wordsOf(text) {
20
+ return (text.match(WORD_PATTERN) ?? []).map((word) => word.toLowerCase());
21
+ }
22
+
23
+ /**
24
+ * ¿Se puede usar como nombre de módulo, pantalla, formulario o componente?
25
+ *
26
+ * @param {string} text
27
+ * @returns {boolean}
28
+ */
29
+ export function isValidName(text) {
30
+ return typeof text === 'string' && NAME_PATTERN.test(text.trim()) && wordsOf(text).length > 0;
31
+ }
32
+
33
+ const capitalized = (word) => word.charAt(0).toUpperCase() + word.slice(1);
34
+
35
+ /**
36
+ * Todas las formas del nombre.
37
+ *
38
+ * @param {string} text
39
+ * @returns {{camel: string, pascal: string, kebab: string, constant: string, human: string}} human: «Purchase orders»,
40
+ * para un texto de pantalla por omisión
41
+ */
42
+ export function namesOf(text) {
43
+ const words = wordsOf(text);
44
+ return {
45
+ camel: words[0] + words.slice(1).map(capitalized).join(''),
46
+ pascal: words.map(capitalized).join(''),
47
+ kebab: words.join('-'),
48
+ constant: words.join('_').toUpperCase(),
49
+ human: capitalized(words.join(' ')),
50
+ };
51
+ }
52
+
53
+ /**
54
+ * El nombre sin una palabra del final que el CLI ya agrega: «OrderDetailPage» con 'page' da «OrderDetail» (si no, el
55
+ * componente saldría «OrderDetailPagePage»).
56
+ *
57
+ * @param {string} text
58
+ * @param {string} suffixWord en minúsculas
59
+ * @returns {string}
60
+ */
61
+ export function withoutSuffixWord(text, suffixWord) {
62
+ const words = wordsOf(text);
63
+ return words.length > 1 && words.at(-1) === suffixWord ? words.slice(0, -1).join('-') : text;
64
+ }
@@ -0,0 +1,103 @@
1
+ // calcita new <carpeta>: un proyecto nuevo de Vite + React + MUI con Calcita, armado con lo que se contestó (projectAnswers.js):
2
+ // el marco con su menú, el tema, los textos en español e inglés, las rutas que se descubren solas, el servidor de
3
+ // mentira, las pantallas de entrar (si se pidieron) y un módulo de ejemplo (contacts) hecho con «make:module».
4
+ //
5
+ // Nunca escribe en una carpeta con archivos: si ya existe y no está vacía, se detiene sin tocar nada.
6
+ //
7
+ // Funciones de node, sin React: function (regla de la casa).
8
+ import {mkdir, readdir} from 'node:fs/promises';
9
+ import {basename, join, resolve} from 'node:path';
10
+ import {fileURLToPath} from 'node:url';
11
+
12
+ import {makeModule} from './makeModule.js';
13
+ import {isValidName, namesOf} from './names.js';
14
+ import {calcitaPackageJson} from './packageVersions.js';
15
+ import {primaryColorOf, templateFlagsOf} from './projectAnswers.js';
16
+ import {projectConfigOf, PROJECT_CONFIG_FILE} from './projectConfig.js';
17
+ import {appThemeFileOf, packageJsonOf} from './projectFiles.js';
18
+ import {CliError, copyTemplateFolder, writeNewFile} from './templateFiles.js';
19
+
20
+ const PROJECT_TEMPLATES = fileURLToPath(new URL('templates/project/', import.meta.url));
21
+ // los archivos (o carpetas, con «/» al final) que solo van con una opción prendida
22
+ const FILES_ONLY_WITH = Object.freeze({
23
+ 'public/manifest.webmanifest.tpl': 'pwa',
24
+ 'public/icons/': 'pwa',
25
+ 'src/app/i18n.js.tpl': 'i18next',
26
+ 'src/core/accountConnector.js.tpl': 'auth',
27
+ 'src/modules/auth/': 'auth',
28
+ 'src/modules/profile/': 'auth',
29
+ });
30
+ // lo que puede haber en una carpeta «vacía» (la de un repo recién clonado)
31
+ const IGNORED_IN_EMPTY_FOLDER = new Set(['.git', '.DS_Store']);
32
+ // el módulo de ejemplo
33
+ const SAMPLE_MODULE = Object.freeze({name: 'contacts', labels: {es: 'Contactos', en: 'Contacts'}});
34
+
35
+ /**
36
+ * ¿Va este archivo de la plantilla con estas opciones?
37
+ *
38
+ * @param {string} relativePath
39
+ * @param {Record<string, boolean>} flags
40
+ * @returns {boolean}
41
+ */
42
+ export function isTemplateFileIncluded(relativePath, flags) {
43
+ for (const [pathOrFolder, flagName] of Object.entries(FILES_ONLY_WITH)) {
44
+ const matches = pathOrFolder.endsWith('/') ? relativePath.startsWith(pathOrFolder) : relativePath === pathOrFolder;
45
+ if (matches) {
46
+ return Boolean(flags[flagName]);
47
+ }
48
+ }
49
+ return true;
50
+ }
51
+
52
+ /** Falla si la carpeta tiene algo (se permite que no exista). */
53
+ async function checkEmptyFolder(folder) {
54
+ const entries = await readdir(folder).catch((error) => {
55
+ if (error.code === 'ENOENT') {
56
+ return [];
57
+ }
58
+ throw error;
59
+ });
60
+ if (entries.some((entry) => !IGNORED_IN_EMPTY_FOLDER.has(entry))) {
61
+ throw new CliError(`La carpeta ${folder} ya tiene archivos; use una nueva o vacía.`);
62
+ }
63
+ }
64
+
65
+ /**
66
+ * @param {object} options
67
+ * @param {string} options.folder donde se crea (relativa a donde se corre, o «.» para la actual)
68
+ * @param {Record<string, string>} options.answers ya revisadas (checkedAnswers)
69
+ * @returns {Promise<{projectRoot: string, written: string[]}>}
70
+ */
71
+ export async function newProject({folder, answers}) {
72
+ const projectRoot = resolve(folder);
73
+ const folderName = basename(projectRoot);
74
+ if (!isValidName(folderName)) {
75
+ throw new CliError(`«${folderName}» no sirve como nombre del proyecto: letras sin acentos, números y guiones (p. ej. mi-tienda).`);
76
+ }
77
+ await checkEmptyFolder(projectRoot);
78
+ await mkdir(projectRoot, {recursive: true});
79
+
80
+ const calcitaPackage = await calcitaPackageJson();
81
+ const flags = templateFlagsOf(answers);
82
+ const packageName = namesOf(folderName).kebab;
83
+ const values = {
84
+ APP_TITLE: answers.appTitle,
85
+ APP_SLUG: packageName,
86
+ PRIMARY_COLOR: primaryColorOf(answers),
87
+ MENU_POSITION: answers.menuPosition,
88
+ FORMS_LIBRARY: answers.forms,
89
+ };
90
+
91
+ const written = await copyTemplateFolder({
92
+ templateFolder: PROJECT_TEMPLATES, targetFolder: projectRoot, values, flags,
93
+ includes: (relativePath) => isTemplateFileIncluded(relativePath, flags),
94
+ });
95
+ await writeNewFile(join(projectRoot, 'package.json'), packageJsonOf({packageName, answers, calcitaPackage}));
96
+ await writeNewFile(join(projectRoot, PROJECT_CONFIG_FILE), projectConfigOf(answers, calcitaPackage.version));
97
+ await writeNewFile(join(projectRoot, 'src', 'app', 'appTheme.js'), appThemeFileOf(answers));
98
+ written.push('package.json', PROJECT_CONFIG_FILE, 'src/app/appTheme.js');
99
+
100
+ const sample = await makeModule({projectRoot, moduleName: SAMPLE_MODULE.name, labels: SAMPLE_MODULE.labels});
101
+ written.push(...sample.written);
102
+ return {projectRoot, written};
103
+ }