@stackcraftmx/calcita 0.0.0-stage → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (900) hide show
  1. package/LICENSE +110 -0
  2. package/README.md +700 -2
  3. package/cli/askQuestions.js +63 -0
  4. package/cli/calcita.js +150 -0
  5. package/cli/makeComponent.js +50 -0
  6. package/cli/makeForm.js +68 -0
  7. package/cli/makeModule.js +78 -0
  8. package/cli/makePage.js +62 -0
  9. package/cli/names.js +64 -0
  10. package/cli/newProject.js +103 -0
  11. package/cli/packageVersions.js +38 -0
  12. package/cli/projectAnswers.js +145 -0
  13. package/cli/projectConfig.js +38 -0
  14. package/cli/projectFiles.js +128 -0
  15. package/cli/screenLabels.js +41 -0
  16. package/cli/templateFiles.js +186 -0
  17. package/cli/templates/component/core/__ComponentName__.jsx.tpl +23 -0
  18. package/cli/templates/component/module/__ComponentName__.jsx.tpl +21 -0
  19. package/cli/templates/form/formik/__FormName__.jsx.tpl +50 -0
  20. package/cli/templates/form/hookForm/__FormName__.jsx.tpl +53 -0
  21. package/cli/templates/form/shared/__formName__Schema.js.tpl +20 -0
  22. package/cli/templates/form/shared/__formName__Texts.js.tpl +6 -0
  23. package/cli/templates/module/__Name__Page.jsx.tpl +75 -0
  24. package/cli/templates/module/__name__Api.js.tpl +39 -0
  25. package/cli/templates/module/__name__Texts.js.tpl +27 -0
  26. package/cli/templates/module/menu.js.tpl +21 -0
  27. package/cli/templates/module/routes.js.tpl +7 -0
  28. package/cli/templates/moduleServer/__name__Server.js.tpl +68 -0
  29. package/cli/templates/page/__PageName__Page.jsx.tpl +22 -0
  30. package/cli/templates/page/__pageName__PageTexts.js.tpl +23 -0
  31. package/cli/templates/project/README.md.tpl +83 -0
  32. package/cli/templates/project/dot-gitignore.tpl +11 -0
  33. package/cli/templates/project/index.html.tpl +20 -0
  34. package/cli/templates/project/jsconfig.json.tpl +16 -0
  35. package/cli/templates/project/pnpm-workspace.yaml.tpl +5 -0
  36. package/cli/templates/project/public/favicon.svg +1 -0
  37. package/cli/templates/project/public/icons/apple-touch-icon.png +0 -0
  38. package/cli/templates/project/public/icons/icon-192.png +0 -0
  39. package/cli/templates/project/public/icons/icon-512-maskable.png +0 -0
  40. package/cli/templates/project/public/icons/icon-512.png +0 -0
  41. package/cli/templates/project/public/manifest.webmanifest.tpl +17 -0
  42. package/cli/templates/project/src/app/AppProviders.jsx.tpl +107 -0
  43. package/cli/templates/project/src/app/AppShell.jsx.tpl +87 -0
  44. package/cli/templates/project/src/app/appRouter.jsx.tpl +51 -0
  45. package/cli/templates/project/src/app/appSettings.js.tpl +27 -0
  46. package/cli/templates/project/src/app/appTexts.js.tpl +15 -0
  47. package/cli/templates/project/src/app/combineTexts.js.tpl +31 -0
  48. package/cli/templates/project/src/app/i18n.js.tpl +19 -0
  49. package/cli/templates/project/src/app/shellTexts.js.tpl +16 -0
  50. package/cli/templates/project/src/core/AppLogo.jsx.tpl +14 -0
  51. package/cli/templates/project/src/core/accountConnector.js.tpl +36 -0
  52. package/cli/templates/project/src/core/apiClient.js.tpl +15 -0
  53. package/cli/templates/project/src/core/appPaths.js.tpl +11 -0
  54. package/cli/templates/project/src/core/index.js.tpl +9 -0
  55. package/cli/templates/project/src/core/publicPaths.js.tpl +24 -0
  56. package/cli/templates/project/src/fakeServer/networkDelay.js.tpl +40 -0
  57. package/cli/templates/project/src/fakeServer/serverText.js.tpl +20 -0
  58. package/cli/templates/project/src/main.jsx.tpl +24 -0
  59. package/cli/templates/project/src/modules/auth/ForgotPasswordPage.jsx.tpl +14 -0
  60. package/cli/templates/project/src/modules/auth/ResetPasswordPage.jsx.tpl +15 -0
  61. package/cli/templates/project/src/modules/auth/SignInPage.jsx.tpl +29 -0
  62. package/cli/templates/project/src/modules/auth/authTexts.js.tpl +6 -0
  63. package/cli/templates/project/src/modules/auth/routes.js.tpl +11 -0
  64. package/cli/templates/project/src/modules/home/HomePage.jsx.tpl +38 -0
  65. package/cli/templates/project/src/modules/home/homeTexts.js.tpl +29 -0
  66. package/cli/templates/project/src/modules/home/menu.js.tpl +17 -0
  67. package/cli/templates/project/src/modules/home/routes.js.tpl +4 -0
  68. package/cli/templates/project/src/modules/profile/ProfilePage.jsx.tpl +13 -0
  69. package/cli/templates/project/src/modules/profile/routes.js.tpl +6 -0
  70. package/cli/templates/project/vite.config.js.tpl +53 -0
  71. package/dist/DataTable/AuditTrailDialog.js +40 -0
  72. package/dist/DataTable/AuditTrailDialog.js.map +1 -0
  73. package/dist/DataTable/AuditTrailTable.js +89 -0
  74. package/dist/DataTable/AuditTrailTable.js.map +1 -0
  75. package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js +71 -0
  76. package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js.map +1 -0
  77. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js +51 -0
  78. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js.map +1 -0
  79. package/dist/DataTable/ColumnFilters/SortableFilterHeader.js +54 -0
  80. package/dist/DataTable/ColumnFilters/SortableFilterHeader.js.map +1 -0
  81. package/dist/DataTable/ColumnFilters/TextColumnFilter.js +24 -0
  82. package/dist/DataTable/ColumnFilters/TextColumnFilter.js.map +1 -0
  83. package/dist/DataTable/EmptyState.js +22 -0
  84. package/dist/DataTable/EmptyState.js.map +1 -0
  85. package/dist/DataTable/FilterChips.js +39 -0
  86. package/dist/DataTable/FilterChips.js.map +1 -0
  87. package/dist/DataTable/GoToPage.js +63 -0
  88. package/dist/DataTable/GoToPage.js.map +1 -0
  89. package/dist/DataTable/ServerTable.js +477 -0
  90. package/dist/DataTable/ServerTable.js.map +1 -0
  91. package/dist/DataTable/buildChipConfig.js +27 -0
  92. package/dist/DataTable/buildChipConfig.js.map +1 -0
  93. package/dist/DataTable/columns.js +122 -0
  94. package/dist/DataTable/columns.js.map +1 -0
  95. package/dist/DataTable/filterContext.js +15 -0
  96. package/dist/DataTable/filterContext.js.map +1 -0
  97. package/dist/DataTable/rowSelection.js +61 -0
  98. package/dist/DataTable/rowSelection.js.map +1 -0
  99. package/dist/DataTable/serverTableParams.js +19 -0
  100. package/dist/DataTable/serverTableParams.js.map +1 -0
  101. package/dist/DataTable/tableMachine.js +87 -0
  102. package/dist/DataTable/tableMachine.js.map +1 -0
  103. package/dist/DataTable/useDebouncedFilter.js +29 -0
  104. package/dist/DataTable/useDebouncedFilter.js.map +1 -0
  105. package/dist/DataTable/useTableState.js +132 -0
  106. package/dist/DataTable/useTableState.js.map +1 -0
  107. package/dist/access/Can.js +9 -0
  108. package/dist/access/Can.js.map +1 -0
  109. package/dist/access/PermissionMatrix.js +84 -0
  110. package/dist/access/PermissionMatrix.js.map +1 -0
  111. package/dist/access/RequireAccess.js +14 -0
  112. package/dist/access/RequireAccess.js.map +1 -0
  113. package/dist/access/accessRules.js +49 -0
  114. package/dist/access/accessRules.js.map +1 -0
  115. package/dist/access/permissionGroups.js +43 -0
  116. package/dist/access/permissionGroups.js.map +1 -0
  117. package/dist/access/useCan.js +12 -0
  118. package/dist/access/useCan.js.map +1 -0
  119. package/dist/account/AccountProvider.js +58 -0
  120. package/dist/account/AccountProvider.js.map +1 -0
  121. package/dist/account/AccountSecuritySection.js +81 -0
  122. package/dist/account/AccountSecuritySection.js.map +1 -0
  123. package/dist/account/DemoTotpCodeButton.js +26 -0
  124. package/dist/account/DemoTotpCodeButton.js.map +1 -0
  125. package/dist/account/ForgotPasswordScreen.js +27 -0
  126. package/dist/account/ForgotPasswordScreen.js.map +1 -0
  127. package/dist/account/ProfileScreen.js +134 -0
  128. package/dist/account/ProfileScreen.js.map +1 -0
  129. package/dist/account/ResetPasswordScreen.js +58 -0
  130. package/dist/account/ResetPasswordScreen.js.map +1 -0
  131. package/dist/account/SignInScreen.js +102 -0
  132. package/dist/account/SignInScreen.js.map +1 -0
  133. package/dist/account/accountConnector.js +31 -0
  134. package/dist/account/accountConnector.js.map +1 -0
  135. package/dist/account/demo/createDemoAccountConnector.js +368 -0
  136. package/dist/account/demo/createDemoAccountConnector.js.map +1 -0
  137. package/dist/account/demo/totp.js +61 -0
  138. package/dist/account/demo/totp.js.map +1 -0
  139. package/dist/account/restAccountConnector.js +118 -0
  140. package/dist/account/restAccountConnector.js.map +1 -0
  141. package/dist/account-demo.js +12 -0
  142. package/dist/account-demo.js.map +1 -0
  143. package/dist/account.js +25 -0
  144. package/dist/account.js.map +1 -0
  145. package/dist/adapters/i18next.js +7 -0
  146. package/dist/adapters/i18next.js.map +1 -0
  147. package/dist/adapters/nextNavigation.js +36 -0
  148. package/dist/adapters/nextNavigation.js.map +1 -0
  149. package/dist/adapters/reactRouter.js +7 -0
  150. package/dist/adapters/reactRouter.js.map +1 -0
  151. package/dist/adapters/reactRouterRoutes.js +49 -0
  152. package/dist/adapters/reactRouterRoutes.js.map +1 -0
  153. package/dist/api/ApiError.js +58 -0
  154. package/dist/api/ApiError.js.map +1 -0
  155. package/dist/api/createApiClient.js +256 -0
  156. package/dist/api/createApiClient.js.map +1 -0
  157. package/dist/api/staleChunks.js +47 -0
  158. package/dist/api/staleChunks.js.map +1 -0
  159. package/dist/appShell/AccountMenu.js +86 -0
  160. package/dist/appShell/AccountMenu.js.map +1 -0
  161. package/dist/appShell/AppLayout.js +513 -0
  162. package/dist/appShell/AppLayout.js.map +1 -0
  163. package/dist/appShell/AppearanceSettings.js +116 -0
  164. package/dist/appShell/AppearanceSettings.js.map +1 -0
  165. package/dist/appShell/AuthLayout.js +46 -0
  166. package/dist/appShell/AuthLayout.js.map +1 -0
  167. package/dist/appShell/BarActionButton.js +31 -0
  168. package/dist/appShell/BarActionButton.js.map +1 -0
  169. package/dist/appShell/BarActions.js +105 -0
  170. package/dist/appShell/BarActions.js.map +1 -0
  171. package/dist/appShell/BarCapsule.js +50 -0
  172. package/dist/appShell/BarCapsule.js.map +1 -0
  173. package/dist/appShell/BarSearch.js +92 -0
  174. package/dist/appShell/BarSearch.js.map +1 -0
  175. package/dist/appShell/HeaderTools.js +53 -0
  176. package/dist/appShell/HeaderTools.js.map +1 -0
  177. package/dist/appShell/MobileTabBar.js +348 -0
  178. package/dist/appShell/MobileTabBar.js.map +1 -0
  179. package/dist/appShell/SettingsMenu.js +41 -0
  180. package/dist/appShell/SettingsMenu.js.map +1 -0
  181. package/dist/appShell/SideMenu.js +217 -0
  182. package/dist/appShell/SideMenu.js.map +1 -0
  183. package/dist/appShell/SideMenuEntry.js +140 -0
  184. package/dist/appShell/SideMenuEntry.js.map +1 -0
  185. package/dist/appShell/SubmenuActionsMenu.js +71 -0
  186. package/dist/appShell/SubmenuActionsMenu.js.map +1 -0
  187. package/dist/appShell/TabBarEditor.js +55 -0
  188. package/dist/appShell/TabBarEditor.js.map +1 -0
  189. package/dist/appShell/TopMenu.js +80 -0
  190. package/dist/appShell/TopMenu.js.map +1 -0
  191. package/dist/appShell/appMenuContext.js +11 -0
  192. package/dist/appShell/appMenuContext.js.map +1 -0
  193. package/dist/appShell/barActionsSlot.js +26 -0
  194. package/dist/appShell/barActionsSlot.js.map +1 -0
  195. package/dist/appShell/barMenuPlacement.js +33 -0
  196. package/dist/appShell/barMenuPlacement.js.map +1 -0
  197. package/dist/appShell/menuItemText.js +33 -0
  198. package/dist/appShell/menuItemText.js.map +1 -0
  199. package/dist/appShell/pageTitle.js +45 -0
  200. package/dist/appShell/pageTitle.js.map +1 -0
  201. package/dist/appShell/shellSizes.js +40 -0
  202. package/dist/appShell/shellSizes.js.map +1 -0
  203. package/dist/appShell/tabBarRule.js +12 -0
  204. package/dist/appShell/tabBarRule.js.map +1 -0
  205. package/dist/appShell/tabBarScroll.js +23 -0
  206. package/dist/appShell/tabBarScroll.js.map +1 -0
  207. package/dist/appShell/useDrawerCollapsed.js +29 -0
  208. package/dist/appShell/useDrawerCollapsed.js.map +1 -0
  209. package/dist/appShell/useFittingActionCount.js +45 -0
  210. package/dist/appShell/useFittingActionCount.js.map +1 -0
  211. package/dist/appShell/usePinnedMobileTabs.js +32 -0
  212. package/dist/appShell/usePinnedMobileTabs.js.map +1 -0
  213. package/dist/appShell/useTabBarMinimized.js +33 -0
  214. package/dist/appShell/useTabBarMinimized.js.map +1 -0
  215. package/dist/auth/PasswordChecklist.js +44 -0
  216. package/dist/auth/PasswordChecklist.js.map +1 -0
  217. package/dist/auth/passwordRules.js +43 -0
  218. package/dist/auth/passwordRules.js.map +1 -0
  219. package/dist/calendar/EventCalendar.js +149 -0
  220. package/dist/calendar/EventCalendar.js.map +1 -0
  221. package/dist/calendar/EventDetails.js +74 -0
  222. package/dist/calendar/EventDetails.js.map +1 -0
  223. package/dist/calendar/calendarEvents.js +31 -0
  224. package/dist/calendar/calendarEvents.js.map +1 -0
  225. package/dist/calendar.js +13 -0
  226. package/dist/calendar.js.map +1 -0
  227. package/dist/charts.js +16 -0
  228. package/dist/charts.js.map +1 -0
  229. package/dist/date-pickers.js +8 -0
  230. package/dist/date-pickers.js.map +1 -0
  231. package/dist/datePickers/DateInput.js +76 -0
  232. package/dist/datePickers/DateInput.js.map +1 -0
  233. package/dist/datePickers/FormDateField.js +12 -0
  234. package/dist/datePickers/FormDateField.js.map +1 -0
  235. package/dist/dates.js +25 -0
  236. package/dist/dates.js.map +1 -0
  237. package/dist/dictionaries/dictionaries.js +48 -0
  238. package/dist/dictionaries/dictionaries.js.map +1 -0
  239. package/dist/downloads/DownloadManager.js +195 -0
  240. package/dist/downloads/DownloadManager.js.map +1 -0
  241. package/dist/downloads/downloadQueue.js +56 -0
  242. package/dist/downloads/downloadQueue.js.map +1 -0
  243. package/dist/downloads/downloadsMachine.js +80 -0
  244. package/dist/downloads/downloadsMachine.js.map +1 -0
  245. package/dist/downloads/fileTypes.js +22 -0
  246. package/dist/downloads/fileTypes.js.map +1 -0
  247. package/dist/excel/reportWorkbook.js +299 -0
  248. package/dist/excel/reportWorkbook.js.map +1 -0
  249. package/dist/excel.js +13 -0
  250. package/dist/excel.js.map +1 -0
  251. package/dist/feedback/ConfirmDialog.js +73 -0
  252. package/dist/feedback/ConfirmDialog.js.map +1 -0
  253. package/dist/feedback/ModalWaiting.js +23 -0
  254. package/dist/feedback/ModalWaiting.js.map +1 -0
  255. package/dist/feedback/NewBuildNotice.js +79 -0
  256. package/dist/feedback/NewBuildNotice.js.map +1 -0
  257. package/dist/feedback/StaleBuildBoundary.js +36 -0
  258. package/dist/feedback/StaleBuildBoundary.js.map +1 -0
  259. package/dist/feedback/Toaster.js +20 -0
  260. package/dist/feedback/Toaster.js.map +1 -0
  261. package/dist/feedback/confirmActionMachine.js +67 -0
  262. package/dist/feedback/confirmActionMachine.js.map +1 -0
  263. package/dist/feedback/toast.js +88 -0
  264. package/dist/feedback/toast.js.map +1 -0
  265. package/dist/feedback/useConfirmAction.js +40 -0
  266. package/dist/feedback/useConfirmAction.js.map +1 -0
  267. package/dist/filepond/FileDropzone.js +256 -0
  268. package/dist/filepond/FileDropzone.js.map +1 -0
  269. package/dist/filepond/pondServer.js +48 -0
  270. package/dist/filepond/pondServer.js.map +1 -0
  271. package/dist/filepond.js +10 -0
  272. package/dist/filepond.js.map +1 -0
  273. package/dist/files.js +43 -0
  274. package/dist/files.js.map +1 -0
  275. package/dist/formatting.js +205 -0
  276. package/dist/formatting.js.map +1 -0
  277. package/dist/forms/FormCatalogField.js +12 -0
  278. package/dist/forms/FormCatalogField.js.map +1 -0
  279. package/dist/forms/FormColorField.js +12 -0
  280. package/dist/forms/FormColorField.js.map +1 -0
  281. package/dist/forms/FormNumberField.js +12 -0
  282. package/dist/forms/FormNumberField.js.map +1 -0
  283. package/dist/forms/FormProblemAlert.js +15 -0
  284. package/dist/forms/FormProblemAlert.js.map +1 -0
  285. package/dist/forms/FormSelectField.js +12 -0
  286. package/dist/forms/FormSelectField.js.map +1 -0
  287. package/dist/forms/FormServerProblem.js +23 -0
  288. package/dist/forms/FormServerProblem.js.map +1 -0
  289. package/dist/forms/FormTextField.js +12 -0
  290. package/dist/forms/FormTextField.js.map +1 -0
  291. package/dist/forms/FormWizard.js +63 -0
  292. package/dist/forms/FormWizard.js.map +1 -0
  293. package/dist/forms/SubmitButton.js +14 -0
  294. package/dist/forms/SubmitButton.js.map +1 -0
  295. package/dist/forms/applyServerProblem.js +15 -0
  296. package/dist/forms/applyServerProblem.js.map +1 -0
  297. package/dist/forms/auth/ChangePasswordForm.js +47 -0
  298. package/dist/forms/auth/ChangePasswordForm.js.map +1 -0
  299. package/dist/forms/auth/ForgotPasswordForm.js +50 -0
  300. package/dist/forms/auth/ForgotPasswordForm.js.map +1 -0
  301. package/dist/forms/auth/SignInForm.js +48 -0
  302. package/dist/forms/auth/SignInForm.js.map +1 -0
  303. package/dist/forms/security/SecondStepForm.js +122 -0
  304. package/dist/forms/security/SecondStepForm.js.map +1 -0
  305. package/dist/forms/security/TwoStepVerificationCard.js +338 -0
  306. package/dist/forms/security/TwoStepVerificationCard.js.map +1 -0
  307. package/dist/forms/security/securityRules.js +28 -0
  308. package/dist/forms/security/securityRules.js.map +1 -0
  309. package/dist/forms/serverProblemFields.js +25 -0
  310. package/dist/forms/serverProblemFields.js.map +1 -0
  311. package/dist/forms/useFormikField.js +16 -0
  312. package/dist/forms/useFormikField.js.map +1 -0
  313. package/dist/forms/validation.js +55 -0
  314. package/dist/forms/validation.js.map +1 -0
  315. package/dist/forms/validationMessages.js +16 -0
  316. package/dist/forms/validationMessages.js.map +1 -0
  317. package/dist/forms.js +57 -0
  318. package/dist/forms.js.map +1 -0
  319. package/dist/hookForm/FormCatalogField.js +12 -0
  320. package/dist/hookForm/FormCatalogField.js.map +1 -0
  321. package/dist/hookForm/FormColorField.js +12 -0
  322. package/dist/hookForm/FormColorField.js.map +1 -0
  323. package/dist/hookForm/FormNumberField.js +12 -0
  324. package/dist/hookForm/FormNumberField.js.map +1 -0
  325. package/dist/hookForm/FormProblemAlert.js +17 -0
  326. package/dist/hookForm/FormProblemAlert.js.map +1 -0
  327. package/dist/hookForm/FormSelectField.js +12 -0
  328. package/dist/hookForm/FormSelectField.js.map +1 -0
  329. package/dist/hookForm/FormTextField.js +12 -0
  330. package/dist/hookForm/FormTextField.js.map +1 -0
  331. package/dist/hookForm/FormWizard.js +59 -0
  332. package/dist/hookForm/FormWizard.js.map +1 -0
  333. package/dist/hookForm/SubmitButton.js +15 -0
  334. package/dist/hookForm/SubmitButton.js.map +1 -0
  335. package/dist/hookForm/applyServerProblem.js +21 -0
  336. package/dist/hookForm/applyServerProblem.js.map +1 -0
  337. package/dist/hookForm/useHookFormField.js +19 -0
  338. package/dist/hookForm/useHookFormField.js.map +1 -0
  339. package/dist/i18next.js +5 -0
  340. package/dist/i18next.js.map +1 -0
  341. package/dist/identifiers.js +8 -0
  342. package/dist/identifiers.js.map +1 -0
  343. package/dist/inbox/InboxLayout.js +104 -0
  344. package/dist/inbox/InboxLayout.js.map +1 -0
  345. package/dist/inbox/MessageList.js +114 -0
  346. package/dist/inbox/MessageList.js.map +1 -0
  347. package/dist/inbox/MessageView.js +104 -0
  348. package/dist/inbox/MessageView.js.map +1 -0
  349. package/dist/inbox/inboxDates.js +9 -0
  350. package/dist/inbox/inboxDates.js.map +1 -0
  351. package/dist/index.js +407 -0
  352. package/dist/index.js.map +1 -0
  353. package/dist/inputs/CatalogInput.js +66 -0
  354. package/dist/inputs/CatalogInput.js.map +1 -0
  355. package/dist/inputs/ColorInput.js +109 -0
  356. package/dist/inputs/ColorInput.js.map +1 -0
  357. package/dist/inputs/FieldFrame.js +20 -0
  358. package/dist/inputs/FieldFrame.js.map +1 -0
  359. package/dist/inputs/FormSection.js +105 -0
  360. package/dist/inputs/FormSection.js.map +1 -0
  361. package/dist/inputs/NumberInput.js +70 -0
  362. package/dist/inputs/NumberInput.js.map +1 -0
  363. package/dist/inputs/SelectInput.js +84 -0
  364. package/dist/inputs/SelectInput.js.map +1 -0
  365. package/dist/inputs/TextInput.js +101 -0
  366. package/dist/inputs/TextInput.js.map +1 -0
  367. package/dist/inputs/WizardLayout.js +54 -0
  368. package/dist/inputs/WizardLayout.js.map +1 -0
  369. package/dist/inputs/colorContrast.js +46 -0
  370. package/dist/inputs/colorContrast.js.map +1 -0
  371. package/dist/inputs/formLayoutContext.js +9 -0
  372. package/dist/inputs/formLayoutContext.js.map +1 -0
  373. package/dist/inputs/numberText.js +48 -0
  374. package/dist/inputs/numberText.js.map +1 -0
  375. package/dist/kanban/KanbanBoard.js +338 -0
  376. package/dist/kanban/KanbanBoard.js.map +1 -0
  377. package/dist/kanban/kanbanCards.js +19 -0
  378. package/dist/kanban/kanbanCards.js.map +1 -0
  379. package/dist/kanban/kanbanMoves.js +29 -0
  380. package/dist/kanban/kanbanMoves.js.map +1 -0
  381. package/dist/kanban.js +15 -0
  382. package/dist/kanban.js.map +1 -0
  383. package/dist/laravel/csrfRetry.js +18 -0
  384. package/dist/laravel/csrfRetry.js.map +1 -0
  385. package/dist/laravel.js +6 -0
  386. package/dist/laravel.js.map +1 -0
  387. package/dist/lastListUrl.js +35 -0
  388. package/dist/lastListUrl.js.map +1 -0
  389. package/dist/locales/en.js +787 -0
  390. package/dist/locales/en.js.map +1 -0
  391. package/dist/locales/es.js +787 -0
  392. package/dist/locales/es.js.map +1 -0
  393. package/dist/maps/MapView.js +116 -0
  394. package/dist/maps/MapView.js.map +1 -0
  395. package/dist/maps/mapMarkers.js +19 -0
  396. package/dist/maps/mapMarkers.js.map +1 -0
  397. package/dist/maps.js +10 -0
  398. package/dist/maps.js.map +1 -0
  399. package/dist/money/money.js +380 -0
  400. package/dist/money/money.js.map +1 -0
  401. package/dist/money.js +6 -0
  402. package/dist/money.js.map +1 -0
  403. package/dist/navigation/appMenu.js +93 -0
  404. package/dist/navigation/appMenu.js.map +1 -0
  405. package/dist/navigation/useMenuBadges.js +45 -0
  406. package/dist/navigation/useMenuBadges.js.map +1 -0
  407. package/dist/navigation.js +30 -0
  408. package/dist/navigation.js.map +1 -0
  409. package/dist/navigationTrail.js +82 -0
  410. package/dist/navigationTrail.js.map +1 -0
  411. package/dist/next.js +5 -0
  412. package/dist/next.js.map +1 -0
  413. package/dist/observability/buildWatch.js +19 -0
  414. package/dist/observability/buildWatch.js.map +1 -0
  415. package/dist/observability/logger.js +43 -0
  416. package/dist/observability/logger.js.map +1 -0
  417. package/dist/observability/publishedBuild.js +39 -0
  418. package/dist/observability/publishedBuild.js.map +1 -0
  419. package/dist/observability/usePublishedBuildWatch.js +77 -0
  420. package/dist/observability/usePublishedBuildWatch.js.map +1 -0
  421. package/dist/passkeys.js +7 -0
  422. package/dist/passkeys.js.map +1 -0
  423. package/dist/periodRanges.js +33 -0
  424. package/dist/periodRanges.js.map +1 -0
  425. package/dist/problems.js +51 -0
  426. package/dist/problems.js.map +1 -0
  427. package/dist/pwa/InstallAppSetting.js +34 -0
  428. package/dist/pwa/InstallAppSetting.js.map +1 -0
  429. package/dist/pwa/InstallInstructionsDialog.js +35 -0
  430. package/dist/pwa/InstallInstructionsDialog.js.map +1 -0
  431. package/dist/pwa/InstallPromptBanner.js +70 -0
  432. package/dist/pwa/InstallPromptBanner.js.map +1 -0
  433. package/dist/pwa/installInstructions.js +60 -0
  434. package/dist/pwa/installInstructions.js.map +1 -0
  435. package/dist/pwa/useInstallPrompt.js +71 -0
  436. package/dist/pwa/useInstallPrompt.js.map +1 -0
  437. package/dist/react-hook-form.js +32 -0
  438. package/dist/react-hook-form.js.map +1 -0
  439. package/dist/react-router.js +10 -0
  440. package/dist/react-router.js.map +1 -0
  441. package/dist/security/ActivityLog.js +80 -0
  442. package/dist/security/ActivityLog.js.map +1 -0
  443. package/dist/security/RecoveryCodesDialog.js +85 -0
  444. package/dist/security/RecoveryCodesDialog.js.map +1 -0
  445. package/dist/security/SessionsCard.js +83 -0
  446. package/dist/security/SessionsCard.js.map +1 -0
  447. package/dist/security/passkeys.js +39 -0
  448. package/dist/security/passkeys.js.map +1 -0
  449. package/dist/table.js +37 -0
  450. package/dist/table.js.map +1 -0
  451. package/dist/theme/androidDevice.js +16 -0
  452. package/dist/theme/androidDevice.js.map +1 -0
  453. package/dist/theme/appleTracking.js +34 -0
  454. package/dist/theme/appleTracking.js.map +1 -0
  455. package/dist/theme/components/MuiAppBar.js +27 -0
  456. package/dist/theme/components/MuiAppBar.js.map +1 -0
  457. package/dist/theme/components/MuiBackdrop.js +13 -0
  458. package/dist/theme/components/MuiBackdrop.js.map +1 -0
  459. package/dist/theme/components/MuiButton.js +25 -0
  460. package/dist/theme/components/MuiButton.js.map +1 -0
  461. package/dist/theme/components/MuiButtonBase.js +16 -0
  462. package/dist/theme/components/MuiButtonBase.js.map +1 -0
  463. package/dist/theme/components/MuiChip.js +30 -0
  464. package/dist/theme/components/MuiChip.js.map +1 -0
  465. package/dist/theme/components/MuiDataGrid.js +30 -0
  466. package/dist/theme/components/MuiDataGrid.js.map +1 -0
  467. package/dist/theme/components/MuiDialog.js +13 -0
  468. package/dist/theme/components/MuiDialog.js.map +1 -0
  469. package/dist/theme/components/MuiDrawer.js +18 -0
  470. package/dist/theme/components/MuiDrawer.js.map +1 -0
  471. package/dist/theme/components/MuiMenuItem.js +17 -0
  472. package/dist/theme/components/MuiMenuItem.js.map +1 -0
  473. package/dist/theme/components/MuiTypography.js +22 -0
  474. package/dist/theme/components/MuiTypography.js.map +1 -0
  475. package/dist/theme/components/glassComponents.js +885 -0
  476. package/dist/theme/components/glassComponents.js.map +1 -0
  477. package/dist/theme/components/minimalComponents.js +146 -0
  478. package/dist/theme/components/minimalComponents.js.map +1 -0
  479. package/dist/theme/components/paletteOf.js +7 -0
  480. package/dist/theme/components/paletteOf.js.map +1 -0
  481. package/dist/theme/createToolkitTheme.js +100 -0
  482. package/dist/theme/createToolkitTheme.js.map +1 -0
  483. package/dist/theme/glassSurface.js +328 -0
  484. package/dist/theme/glassSurface.js.map +1 -0
  485. package/dist/theme/glassToasterStyles.js +50 -0
  486. package/dist/theme/glassToasterStyles.js.map +1 -0
  487. package/dist/theme/mergeComponents.js +42 -0
  488. package/dist/theme/mergeComponents.js.map +1 -0
  489. package/dist/theme/stackcraftPalette.js +59 -0
  490. package/dist/theme/stackcraftPalette.js.map +1 -0
  491. package/dist/theme/toolkitComponents.js +28 -0
  492. package/dist/theme/toolkitComponents.js.map +1 -0
  493. package/dist/timeline.js +8 -0
  494. package/dist/timeline.js.map +1 -0
  495. package/dist/toolkit/ComponentTexts.js +13 -0
  496. package/dist/toolkit/ComponentTexts.js.map +1 -0
  497. package/dist/toolkit/ToolkitProvider.js +57 -0
  498. package/dist/toolkit/ToolkitProvider.js.map +1 -0
  499. package/dist/toolkit/browserNavigation.js +33 -0
  500. package/dist/toolkit/browserNavigation.js.map +1 -0
  501. package/dist/toolkit/componentTextsContext.js +15 -0
  502. package/dist/toolkit/componentTextsContext.js.map +1 -0
  503. package/dist/toolkit/hashNavigation.js +40 -0
  504. package/dist/toolkit/hashNavigation.js.map +1 -0
  505. package/dist/toolkit/navigationPaths.js +49 -0
  506. package/dist/toolkit/navigationPaths.js.map +1 -0
  507. package/dist/toolkit/toolkitContext.js +19 -0
  508. package/dist/toolkit/toolkitContext.js.map +1 -0
  509. package/dist/toolkit/toolkitSettings.js +107 -0
  510. package/dist/toolkit/toolkitSettings.js.map +1 -0
  511. package/dist/toolkit/useFormatters.js +12 -0
  512. package/dist/toolkit/useFormatters.js.map +1 -0
  513. package/dist/toolkit/useToolkitTranslation.js +22 -0
  514. package/dist/toolkit/useToolkitTranslation.js.map +1 -0
  515. package/dist/types/DataTable/AuditTrailDialog.d.ts +32 -0
  516. package/dist/types/DataTable/AuditTrailTable.d.ts +30 -0
  517. package/dist/types/DataTable/ColumnFilters/HeaderFilterPopover.d.ts +8 -0
  518. package/dist/types/DataTable/ColumnFilters/MultiSelectColumnFilter.d.ts +16 -0
  519. package/dist/types/DataTable/ColumnFilters/SortableFilterHeader.d.ts +26 -0
  520. package/dist/types/DataTable/ColumnFilters/TextColumnFilter.d.ts +8 -0
  521. package/dist/types/DataTable/ColumnFilters/index.d.ts +4 -0
  522. package/dist/types/DataTable/EmptyState.d.ts +13 -0
  523. package/dist/types/DataTable/FilterChips.d.ts +17 -0
  524. package/dist/types/DataTable/GoToPage.d.ts +13 -0
  525. package/dist/types/DataTable/SelectionBar.d.ts +32 -0
  526. package/dist/types/DataTable/ServerTable.d.ts +171 -0
  527. package/dist/types/DataTable/buildChipConfig.d.ts +22 -0
  528. package/dist/types/DataTable/columns.d.ts +93 -0
  529. package/dist/types/DataTable/filterContext.d.ts +13 -0
  530. package/dist/types/DataTable/index.d.ts +13 -0
  531. package/dist/types/DataTable/rowSelection.d.ts +113 -0
  532. package/dist/types/DataTable/serverTableParams.d.ts +16 -0
  533. package/dist/types/DataTable/tableMachine.d.ts +41 -0
  534. package/dist/types/DataTable/useDebouncedFilter.d.ts +8 -0
  535. package/dist/types/DataTable/useTableState.d.ts +93 -0
  536. package/dist/types/access/Can.d.ts +11 -0
  537. package/dist/types/access/PermissionMatrix.d.ts +23 -0
  538. package/dist/types/access/RequireAccess.d.ts +11 -0
  539. package/dist/types/access/accessRules.d.ts +24 -0
  540. package/dist/types/access/permissionGroups.d.ts +56 -0
  541. package/dist/types/access/useCan.d.ts +11 -0
  542. package/dist/types/account/AccountProvider.d.ts +27 -0
  543. package/dist/types/account/AccountSecuritySection.d.ts +9 -0
  544. package/dist/types/account/DemoTotpCodeButton.d.ts +6 -0
  545. package/dist/types/account/ForgotPasswordScreen.d.ts +17 -0
  546. package/dist/types/account/ProfileScreen.d.ts +43 -0
  547. package/dist/types/account/ResetPasswordScreen.d.ts +21 -0
  548. package/dist/types/account/SignInScreen.d.ts +27 -0
  549. package/dist/types/account/accountConnector.d.ts +268 -0
  550. package/dist/types/account/demo/createDemoAccountConnector.d.ts +30 -0
  551. package/dist/types/account/demo/totp.d.ts +45 -0
  552. package/dist/types/account/restAccountConnector.d.ts +49 -0
  553. package/dist/types/account-demo.d.ts +2 -0
  554. package/dist/types/account.d.ts +16 -0
  555. package/dist/types/adapters/i18next.d.ts +11 -0
  556. package/dist/types/adapters/nextNavigation.d.ts +33 -0
  557. package/dist/types/adapters/reactRouter.d.ts +6 -0
  558. package/dist/types/adapters/reactRouterRoutes.d.ts +42 -0
  559. package/dist/types/api/ApiError.d.ts +42 -0
  560. package/dist/types/api/createApiClient.d.ts +174 -0
  561. package/dist/types/api/staleChunks.d.ts +15 -0
  562. package/dist/types/appShell/AccountMenu.d.ts +28 -0
  563. package/dist/types/appShell/AppLayout.d.ts +76 -0
  564. package/dist/types/appShell/AppearanceSettings.d.ts +41 -0
  565. package/dist/types/appShell/AuthLayout.d.ts +21 -0
  566. package/dist/types/appShell/BarActionButton.d.ts +15 -0
  567. package/dist/types/appShell/BarActions.d.ts +23 -0
  568. package/dist/types/appShell/BarCapsule.d.ts +20 -0
  569. package/dist/types/appShell/BarSearch.d.ts +24 -0
  570. package/dist/types/appShell/HeaderTools.d.ts +27 -0
  571. package/dist/types/appShell/MobileTabBar.d.ts +20 -0
  572. package/dist/types/appShell/SettingsMenu.d.ts +13 -0
  573. package/dist/types/appShell/SideMenu.d.ts +31 -0
  574. package/dist/types/appShell/SideMenuEntry.d.ts +17 -0
  575. package/dist/types/appShell/SubmenuActionsMenu.d.ts +24 -0
  576. package/dist/types/appShell/TabBarEditor.d.ts +13 -0
  577. package/dist/types/appShell/TopMenu.d.ts +7 -0
  578. package/dist/types/appShell/appMenuContext.d.ts +9 -0
  579. package/dist/types/appShell/barActionsSlot.d.ts +35 -0
  580. package/dist/types/appShell/barMenuPlacement.d.ts +9 -0
  581. package/dist/types/appShell/menuItemText.d.ts +55 -0
  582. package/dist/types/appShell/pageTitle.d.ts +26 -0
  583. package/dist/types/appShell/shellSizes.d.ts +46 -0
  584. package/dist/types/appShell/tabBarRule.d.ts +5 -0
  585. package/dist/types/appShell/tabBarScroll.d.ts +26 -0
  586. package/dist/types/appShell/useDrawerCollapsed.d.ts +8 -0
  587. package/dist/types/appShell/useFittingActionCount.d.ts +7 -0
  588. package/dist/types/appShell/usePinnedMobileTabs.d.ts +7 -0
  589. package/dist/types/appShell/useTabBarMinimized.d.ts +8 -0
  590. package/dist/types/auth/PasswordChecklist.d.ts +13 -0
  591. package/dist/types/auth/passwordRules.d.ts +34 -0
  592. package/dist/types/calendar/EventCalendar.d.ts +63 -0
  593. package/dist/types/calendar/EventDetails.d.ts +36 -0
  594. package/dist/types/calendar/calendarEvents.d.ts +27 -0
  595. package/dist/types/calendar.d.ts +3 -0
  596. package/dist/types/charts.d.ts +6 -0
  597. package/dist/types/date-pickers.d.ts +2 -0
  598. package/dist/types/datePickers/DateInput.d.ts +41 -0
  599. package/dist/types/datePickers/FormDateField.d.ts +7 -0
  600. package/dist/types/dates.d.ts +18 -0
  601. package/dist/types/dictionaries/dictionaries.d.ts +54 -0
  602. package/dist/types/downloads/DownloadManager.d.ts +7 -0
  603. package/dist/types/downloads/downloadQueue.d.ts +50 -0
  604. package/dist/types/downloads/downloadsMachine.d.ts +10 -0
  605. package/dist/types/downloads/fileTypes.d.ts +39 -0
  606. package/dist/types/downloads/index.d.ts +4 -0
  607. package/dist/types/excel/reportWorkbook.d.ts +157 -0
  608. package/dist/types/excel.d.ts +1 -0
  609. package/dist/types/feedback/ConfirmDialog.d.ts +31 -0
  610. package/dist/types/feedback/ModalWaiting.d.ts +13 -0
  611. package/dist/types/feedback/NewBuildNotice.d.ts +20 -0
  612. package/dist/types/feedback/StaleBuildBoundary.d.ts +21 -0
  613. package/dist/types/feedback/Toaster.d.ts +1 -0
  614. package/dist/types/feedback/confirmActionMachine.d.ts +19 -0
  615. package/dist/types/feedback/index.d.ts +8 -0
  616. package/dist/types/feedback/toast.d.ts +100 -0
  617. package/dist/types/feedback/useConfirmAction.d.ts +33 -0
  618. package/dist/types/filepond/FileDropzone.d.ts +61 -0
  619. package/dist/types/filepond/pondServer.d.ts +17 -0
  620. package/dist/types/filepond.d.ts +3 -0
  621. package/dist/types/files.d.ts +29 -0
  622. package/dist/types/formatting.d.ts +61 -0
  623. package/dist/types/forms/FormCatalogField.d.ts +6 -0
  624. package/dist/types/forms/FormColorField.d.ts +6 -0
  625. package/dist/types/forms/FormNumberField.d.ts +6 -0
  626. package/dist/types/forms/FormProblemAlert.d.ts +6 -0
  627. package/dist/types/forms/FormSelectField.d.ts +6 -0
  628. package/dist/types/forms/FormServerProblem.d.ts +8 -0
  629. package/dist/types/forms/FormTextField.d.ts +6 -0
  630. package/dist/types/forms/FormWizard.d.ts +22 -0
  631. package/dist/types/forms/SubmitButton.d.ts +9 -0
  632. package/dist/types/forms/applyServerProblem.d.ts +9 -0
  633. package/dist/types/forms/auth/ChangePasswordForm.d.ts +17 -0
  634. package/dist/types/forms/auth/ForgotPasswordForm.d.ts +14 -0
  635. package/dist/types/forms/auth/SignInForm.d.ts +20 -0
  636. package/dist/types/forms/index.d.ts +19 -0
  637. package/dist/types/forms/security/SecondStepForm.d.ts +30 -0
  638. package/dist/types/forms/security/TwoStepVerificationCard.d.ts +83 -0
  639. package/dist/types/forms/security/securityRules.d.ts +24 -0
  640. package/dist/types/forms/serverProblemFields.d.ts +19 -0
  641. package/dist/types/forms/useFormikField.d.ts +11 -0
  642. package/dist/types/forms/validation.d.ts +251 -0
  643. package/dist/types/forms/validationMessages.d.ts +12 -0
  644. package/dist/types/forms.d.ts +2 -0
  645. package/dist/types/hookForm/FormCatalogField.d.ts +8 -0
  646. package/dist/types/hookForm/FormColorField.d.ts +8 -0
  647. package/dist/types/hookForm/FormNumberField.d.ts +8 -0
  648. package/dist/types/hookForm/FormProblemAlert.d.ts +7 -0
  649. package/dist/types/hookForm/FormSelectField.d.ts +8 -0
  650. package/dist/types/hookForm/FormTextField.d.ts +8 -0
  651. package/dist/types/hookForm/FormWizard.d.ts +22 -0
  652. package/dist/types/hookForm/SubmitButton.d.ts +21 -0
  653. package/dist/types/hookForm/applyServerProblem.d.ts +10 -0
  654. package/dist/types/hookForm/useHookFormField.d.ts +13 -0
  655. package/dist/types/i18next.d.ts +1 -0
  656. package/dist/types/identifiers.d.ts +2 -0
  657. package/dist/types/inbox/InboxLayout.d.ts +38 -0
  658. package/dist/types/inbox/MessageList.d.ts +52 -0
  659. package/dist/types/inbox/MessageView.d.ts +55 -0
  660. package/dist/types/inbox/inboxDates.d.ts +11 -0
  661. package/dist/types/index.d.ts +91 -0
  662. package/dist/types/inputs/CatalogInput.d.ts +45 -0
  663. package/dist/types/inputs/ColorInput.d.ts +30 -0
  664. package/dist/types/inputs/FieldFrame.d.ts +14 -0
  665. package/dist/types/inputs/FormSection.d.ts +29 -0
  666. package/dist/types/inputs/NumberInput.d.ts +38 -0
  667. package/dist/types/inputs/SelectInput.d.ts +38 -0
  668. package/dist/types/inputs/TextInput.d.ts +62 -0
  669. package/dist/types/inputs/WizardLayout.d.ts +34 -0
  670. package/dist/types/inputs/colorContrast.d.ts +18 -0
  671. package/dist/types/inputs/formLayoutContext.d.ts +3 -0
  672. package/dist/types/inputs/numberText.d.ts +25 -0
  673. package/dist/types/kanban/KanbanBoard.d.ts +88 -0
  674. package/dist/types/kanban/kanbanCards.d.ts +22 -0
  675. package/dist/types/kanban/kanbanMoves.d.ts +38 -0
  676. package/dist/types/kanban.d.ts +3 -0
  677. package/dist/types/laravel/csrfRetry.d.ts +21 -0
  678. package/dist/types/laravel.d.ts +1 -0
  679. package/dist/types/lastListUrl.d.ts +20 -0
  680. package/dist/types/locales/en.d.ts +788 -0
  681. package/dist/types/locales/es.d.ts +788 -0
  682. package/dist/types/maps/MapView.d.ts +41 -0
  683. package/dist/types/maps/mapMarkers.d.ts +23 -0
  684. package/dist/types/maps.d.ts +2 -0
  685. package/dist/types/money/money.d.ts +203 -0
  686. package/dist/types/money.d.ts +1 -0
  687. package/dist/types/navigation/appMenu.d.ts +92 -0
  688. package/dist/types/navigation/useMenuBadges.d.ts +16 -0
  689. package/dist/types/navigation.d.ts +22 -0
  690. package/dist/types/navigationTrail.d.ts +49 -0
  691. package/dist/types/next.d.ts +1 -0
  692. package/dist/types/observability/buildWatch.d.ts +28 -0
  693. package/dist/types/observability/logger.d.ts +19 -0
  694. package/dist/types/observability/publishedBuild.d.ts +35 -0
  695. package/dist/types/observability/usePublishedBuildWatch.d.ts +18 -0
  696. package/dist/types/passkeys.d.ts +1 -0
  697. package/dist/types/periodRanges.d.ts +32 -0
  698. package/dist/types/problems.d.ts +31 -0
  699. package/dist/types/pwa/InstallAppSetting.d.ts +7 -0
  700. package/dist/types/pwa/InstallInstructionsDialog.d.ts +20 -0
  701. package/dist/types/pwa/InstallPromptBanner.d.ts +16 -0
  702. package/dist/types/pwa/installInstructions.d.ts +52 -0
  703. package/dist/types/pwa/useInstallPrompt.d.ts +13 -0
  704. package/dist/types/react-hook-form.d.ts +12 -0
  705. package/dist/types/react-router.d.ts +2 -0
  706. package/dist/types/security/ActivityLog.d.ts +33 -0
  707. package/dist/types/security/RecoveryCodesDialog.d.ts +16 -0
  708. package/dist/types/security/SessionsCard.d.ts +24 -0
  709. package/dist/types/security/passkeys.d.ts +18 -0
  710. package/dist/types/table.d.ts +3 -0
  711. package/dist/types/theme/androidDevice.d.ts +11 -0
  712. package/dist/types/theme/appleTracking.d.ts +17 -0
  713. package/dist/types/theme/components/MuiAppBar.d.ts +13 -0
  714. package/dist/types/theme/components/MuiBackdrop.d.ts +11 -0
  715. package/dist/types/theme/components/MuiButton.d.ts +27 -0
  716. package/dist/types/theme/components/MuiButtonBase.d.ts +14 -0
  717. package/dist/types/theme/components/MuiChip.d.ts +29 -0
  718. package/dist/types/theme/components/MuiDataGrid.d.ts +45 -0
  719. package/dist/types/theme/components/MuiDialog.d.ts +9 -0
  720. package/dist/types/theme/components/MuiDrawer.d.ts +13 -0
  721. package/dist/types/theme/components/MuiMenuItem.d.ts +17 -0
  722. package/dist/types/theme/components/MuiTypography.d.ts +20 -0
  723. package/dist/types/theme/components/glassComponents.d.ts +8 -0
  724. package/dist/types/theme/components/minimalComponents.d.ts +22 -0
  725. package/dist/types/theme/components/paletteOf.d.ts +5 -0
  726. package/dist/types/theme/createToolkitTheme.d.ts +48 -0
  727. package/dist/types/theme/glassSurface.d.ts +247 -0
  728. package/dist/types/theme/glassToasterStyles.d.ts +7 -0
  729. package/dist/types/theme/mergeComponents.d.ts +15 -0
  730. package/dist/types/theme/stackcraftPalette.d.ts +142 -0
  731. package/dist/types/theme/toolkitComponents.d.ts +4 -0
  732. package/dist/types/timeline.d.ts +2 -0
  733. package/dist/types/toolkit/ComponentTexts.d.ts +11 -0
  734. package/dist/types/toolkit/ToolkitProvider.d.ts +47 -0
  735. package/dist/types/toolkit/browserNavigation.d.ts +27 -0
  736. package/dist/types/toolkit/componentTextsContext.d.ts +20 -0
  737. package/dist/types/toolkit/hashNavigation.d.ts +12 -0
  738. package/dist/types/toolkit/navigationPaths.d.ts +43 -0
  739. package/dist/types/toolkit/toolkitContext.d.ts +28 -0
  740. package/dist/types/toolkit/toolkitSettings.d.ts +113 -0
  741. package/dist/types/toolkit/useFormatters.d.ts +6 -0
  742. package/dist/types/toolkit/useToolkitTranslation.d.ts +11 -0
  743. package/dist/types/ui/actions/ActionsMenu.d.ts +20 -0
  744. package/dist/types/ui/actions/CopyButton.d.ts +15 -0
  745. package/dist/types/ui/actions/DownloadMenu.d.ts +55 -0
  746. package/dist/types/ui/actions/SecretField.d.ts +17 -0
  747. package/dist/types/ui/actions/SelectionActions.d.ts +39 -0
  748. package/dist/types/ui/filters/DateRangeFilter.d.ts +18 -0
  749. package/dist/types/ui/filters/PeriodRangeSelector.d.ts +28 -0
  750. package/dist/types/ui/filters/QuickFilters.d.ts +23 -0
  751. package/dist/types/ui/filters/SegmentedControl.d.ts +44 -0
  752. package/dist/types/ui/index.d.ts +33 -0
  753. package/dist/types/ui/labels/DictionaryText.d.ts +7 -0
  754. package/dist/types/ui/labels/StatusChip.d.ts +21 -0
  755. package/dist/types/ui/labels/Tag.d.ts +19 -0
  756. package/dist/types/ui/labels/tagOf.d.ts +13 -0
  757. package/dist/types/ui/layout/CollapsibleSection.d.ts +18 -0
  758. package/dist/types/ui/layout/ContentDialog.d.ts +15 -0
  759. package/dist/types/ui/layout/DefinitionList.d.ts +15 -0
  760. package/dist/types/ui/layout/DetailHeader.d.ts +15 -0
  761. package/dist/types/ui/layout/ErrorPage.d.ts +35 -0
  762. package/dist/types/ui/layout/FullPageLoader.d.ts +7 -0
  763. package/dist/types/ui/layout/GlassLensFilter.d.ts +1 -0
  764. package/dist/types/ui/layout/GlassPanel.d.ts +11 -0
  765. package/dist/types/ui/layout/PageHeader.d.ts +15 -0
  766. package/dist/types/ui/layout/PageHeading.d.ts +20 -0
  767. package/dist/types/ui/layout/ProfileHeader.d.ts +17 -0
  768. package/dist/types/ui/layout/ScrollableRow.d.ts +33 -0
  769. package/dist/types/ui/layout/SectionCard.d.ts +11 -0
  770. package/dist/types/ui/layout/appBarHeight.d.ts +13 -0
  771. package/dist/types/ui/metrics/BarList.d.ts +25 -0
  772. package/dist/types/ui/metrics/CalendarHeatmap.d.ts +34 -0
  773. package/dist/types/ui/metrics/ChartTooltip.d.ts +11 -0
  774. package/dist/types/ui/metrics/ColumnChart.d.ts +47 -0
  775. package/dist/types/ui/metrics/LineChart.d.ts +41 -0
  776. package/dist/types/ui/metrics/MetricCard.d.ts +39 -0
  777. package/dist/types/ui/metrics/TableToggle.d.ts +14 -0
  778. package/dist/types/ui/metrics/barListLabels.d.ts +17 -0
  779. package/dist/types/ui/metrics/chartParts.d.ts +112 -0
  780. package/dist/types/ui/metrics/heatmapScale.d.ts +45 -0
  781. package/dist/types/ui/navigation/BackButton.d.ts +13 -0
  782. package/dist/types/ui/navigation/ColorSchemeToggle.d.ts +13 -0
  783. package/dist/types/ui/navigation/DocumentTitle.d.ts +6 -0
  784. package/dist/types/ui/navigation/FontSizeToggle.d.ts +11 -0
  785. package/dist/types/ui/navigation/LanguageToggle.d.ts +13 -0
  786. package/dist/types/ui/navigation/PageBreadcrumbs.d.ts +12 -0
  787. package/dist/types/ui/navigation/colorMode.d.ts +18 -0
  788. package/dist/types/ui/navigation/fontSizeLevels.d.ts +25 -0
  789. package/dist/types/ui/navigation/useFontSize.d.ts +10 -0
  790. package/dist/types/ui/timeline/GroupedTimeline.d.ts +41 -0
  791. package/dist/types/ui/timeline/timelineDot.d.ts +19 -0
  792. package/dist/types/upload/FileDropzone.d.ts +36 -0
  793. package/dist/types/upload/fileRules.d.ts +51 -0
  794. package/dist/types/upload/uploadMachine.d.ts +23 -0
  795. package/dist/types/upload/uploadWithProgress.d.ts +16 -0
  796. package/dist/ui/actions/ActionsMenu.js +51 -0
  797. package/dist/ui/actions/ActionsMenu.js.map +1 -0
  798. package/dist/ui/actions/CopyButton.js +28 -0
  799. package/dist/ui/actions/CopyButton.js.map +1 -0
  800. package/dist/ui/actions/DownloadMenu.js +162 -0
  801. package/dist/ui/actions/DownloadMenu.js.map +1 -0
  802. package/dist/ui/actions/SecretField.js +61 -0
  803. package/dist/ui/actions/SecretField.js.map +1 -0
  804. package/dist/ui/actions/SelectionActions.js +142 -0
  805. package/dist/ui/actions/SelectionActions.js.map +1 -0
  806. package/dist/ui/filters/DateRangeFilter.js +87 -0
  807. package/dist/ui/filters/DateRangeFilter.js.map +1 -0
  808. package/dist/ui/filters/PeriodRangeSelector.js +56 -0
  809. package/dist/ui/filters/PeriodRangeSelector.js.map +1 -0
  810. package/dist/ui/filters/QuickFilters.js +91 -0
  811. package/dist/ui/filters/QuickFilters.js.map +1 -0
  812. package/dist/ui/filters/SegmentedControl.js +80 -0
  813. package/dist/ui/filters/SegmentedControl.js.map +1 -0
  814. package/dist/ui/labels/DictionaryText.js +11 -0
  815. package/dist/ui/labels/DictionaryText.js.map +1 -0
  816. package/dist/ui/labels/StatusChip.js +52 -0
  817. package/dist/ui/labels/StatusChip.js.map +1 -0
  818. package/dist/ui/labels/Tag.js +26 -0
  819. package/dist/ui/labels/Tag.js.map +1 -0
  820. package/dist/ui/labels/tagOf.js +7 -0
  821. package/dist/ui/labels/tagOf.js.map +1 -0
  822. package/dist/ui/layout/CollapsibleSection.js +52 -0
  823. package/dist/ui/layout/CollapsibleSection.js.map +1 -0
  824. package/dist/ui/layout/ContentDialog.js +97 -0
  825. package/dist/ui/layout/ContentDialog.js.map +1 -0
  826. package/dist/ui/layout/DefinitionList.js +30 -0
  827. package/dist/ui/layout/DefinitionList.js.map +1 -0
  828. package/dist/ui/layout/DetailHeader.js +27 -0
  829. package/dist/ui/layout/DetailHeader.js.map +1 -0
  830. package/dist/ui/layout/ErrorPage.js +54 -0
  831. package/dist/ui/layout/ErrorPage.js.map +1 -0
  832. package/dist/ui/layout/FullPageLoader.js +13 -0
  833. package/dist/ui/layout/FullPageLoader.js.map +1 -0
  834. package/dist/ui/layout/GlassLensFilter.js +53 -0
  835. package/dist/ui/layout/GlassLensFilter.js.map +1 -0
  836. package/dist/ui/layout/GlassPanel.js +18 -0
  837. package/dist/ui/layout/GlassPanel.js.map +1 -0
  838. package/dist/ui/layout/PageHeader.js +23 -0
  839. package/dist/ui/layout/PageHeader.js.map +1 -0
  840. package/dist/ui/layout/PageHeading.js +51 -0
  841. package/dist/ui/layout/PageHeading.js.map +1 -0
  842. package/dist/ui/layout/ProfileHeader.js +64 -0
  843. package/dist/ui/layout/ProfileHeader.js.map +1 -0
  844. package/dist/ui/layout/ScrollableRow.js +156 -0
  845. package/dist/ui/layout/ScrollableRow.js.map +1 -0
  846. package/dist/ui/layout/SectionCard.js +18 -0
  847. package/dist/ui/layout/SectionCard.js.map +1 -0
  848. package/dist/ui/layout/appBarHeight.js +42 -0
  849. package/dist/ui/layout/appBarHeight.js.map +1 -0
  850. package/dist/ui/metrics/BarList.js +94 -0
  851. package/dist/ui/metrics/BarList.js.map +1 -0
  852. package/dist/ui/metrics/CalendarHeatmap.js +136 -0
  853. package/dist/ui/metrics/CalendarHeatmap.js.map +1 -0
  854. package/dist/ui/metrics/ChartTooltip.js +16 -0
  855. package/dist/ui/metrics/ChartTooltip.js.map +1 -0
  856. package/dist/ui/metrics/ColumnChart.js +106 -0
  857. package/dist/ui/metrics/ColumnChart.js.map +1 -0
  858. package/dist/ui/metrics/LineChart.js +117 -0
  859. package/dist/ui/metrics/LineChart.js.map +1 -0
  860. package/dist/ui/metrics/MetricCard.js +97 -0
  861. package/dist/ui/metrics/MetricCard.js.map +1 -0
  862. package/dist/ui/metrics/TableToggle.js +15 -0
  863. package/dist/ui/metrics/TableToggle.js.map +1 -0
  864. package/dist/ui/metrics/barListLabels.js +9 -0
  865. package/dist/ui/metrics/barListLabels.js.map +1 -0
  866. package/dist/ui/metrics/chartParts.js +93 -0
  867. package/dist/ui/metrics/chartParts.js.map +1 -0
  868. package/dist/ui/metrics/heatmapScale.js +67 -0
  869. package/dist/ui/metrics/heatmapScale.js.map +1 -0
  870. package/dist/ui/navigation/BackButton.js +28 -0
  871. package/dist/ui/navigation/BackButton.js.map +1 -0
  872. package/dist/ui/navigation/ColorSchemeToggle.js +40 -0
  873. package/dist/ui/navigation/ColorSchemeToggle.js.map +1 -0
  874. package/dist/ui/navigation/DocumentTitle.js +11 -0
  875. package/dist/ui/navigation/DocumentTitle.js.map +1 -0
  876. package/dist/ui/navigation/FontSizeToggle.js +41 -0
  877. package/dist/ui/navigation/FontSizeToggle.js.map +1 -0
  878. package/dist/ui/navigation/LanguageToggle.js +48 -0
  879. package/dist/ui/navigation/LanguageToggle.js.map +1 -0
  880. package/dist/ui/navigation/PageBreadcrumbs.js +51 -0
  881. package/dist/ui/navigation/PageBreadcrumbs.js.map +1 -0
  882. package/dist/ui/navigation/colorMode.js +13 -0
  883. package/dist/ui/navigation/colorMode.js.map +1 -0
  884. package/dist/ui/navigation/fontSizeLevels.js +24 -0
  885. package/dist/ui/navigation/fontSizeLevels.js.map +1 -0
  886. package/dist/ui/navigation/useFontSize.js +44 -0
  887. package/dist/ui/navigation/useFontSize.js.map +1 -0
  888. package/dist/ui/timeline/GroupedTimeline.js +106 -0
  889. package/dist/ui/timeline/GroupedTimeline.js.map +1 -0
  890. package/dist/ui/timeline/timelineDot.js +20 -0
  891. package/dist/ui/timeline/timelineDot.js.map +1 -0
  892. package/dist/upload/FileDropzone.js +145 -0
  893. package/dist/upload/FileDropzone.js.map +1 -0
  894. package/dist/upload/fileRules.js +62 -0
  895. package/dist/upload/fileRules.js.map +1 -0
  896. package/dist/upload/uploadMachine.js +73 -0
  897. package/dist/upload/uploadMachine.js.map +1 -0
  898. package/dist/upload/uploadWithProgress.js +45 -0
  899. package/dist/upload/uploadWithProgress.js.map +1 -0
  900. package/package.json +311 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageHeading.js","sources":["../../../src/ui/layout/PageHeading.jsx"],"sourcesContent":["// El encabezado de una pantalla al estilo de las plantillas de MUI (y del PageContainer de walk-ot): las migas arriba, el\n// título a la izquierda con los botones a la derecha, y una descripción corta abajo.\n//\n// Las migas salen SOLAS del menú de AppLayout (Inicio › Sección › Pantalla): la página no las escribe. Una pantalla que\n// no está en el menú (un detalle) pasa las suyas con `breadcrumbs`; breadcrumbs={false} las quita.\n// El título sube a la barra de AppLayout cuando sale de la vista al deslizar, y también es el título de la pestaña.\n// Con la barra en cápsulas, sus `actions` van a la barra en su propia cápsula (BarActions), como las barras de\n// herramientas de macOS; en el teléfono, y con la franja, se quedan aquí (con la franja, para no mover pantallas que ya\n// existen: quien las quiera en la franja usa BarActions).\n//\n// Cuál usar: PageHeading en las pantallas de trabajo (listas, formularios, tableros); PageHeader (centrado) en una\n// portada; DetailHeader en el detalle de un registro (título con sus insignias de estatus).\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useRef} from 'react';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport {useToolkitNavigation} from '@/toolkit/toolkitContext.js';\nimport Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport {useAppMenu} from '@/appShell/appMenuContext.js';\nimport BarActions from '@/appShell/BarActions.jsx';\nimport {useBarActionsSlot} from '@/appShell/barActionsSlot.js';\nimport {menuItemLabelOf} from '@/appShell/menuItemText.js';\nimport {useRegisterPageTitle} from '@/appShell/pageTitle.jsx';\nimport {menuBreadcrumbsOf} from '@/navigation/appMenu.js';\nimport PageBreadcrumbs from '@/ui/navigation/PageBreadcrumbs.jsx';\nimport DocumentTitle from '@/ui/navigation/DocumentTitle.jsx';\n\n// con una sola miga (estar en el inicio) no se pintan: no dicen nada\nconst MIN_BREADCRUMBS = 2;\n\n/**\n * @param {object} props\n * @param {string} props.title texto ya traducido\n * @param {import('react').ReactNode} [props.description]\n * @param {Array<{label: string, to?: string}>|false} [props.breadcrumbs] por omisión, las del menú\n * @param {import('react').ReactNode} [props.actions] botones a la derecha (en el teléfono, abajo y a lo ancho)\n * @param {string} [props.documentTitle] título de la pestaña si difiere del visible\n * @param {object} [props.texts] los textos que cambian, con la forma de `layout` en los textos del paquete\n */\nexport default function PageHeading({title, description, breadcrumbs, actions, documentTitle, texts}) {\n const {t} = useToolkitTranslation('layout', texts);\n const {useLocation} = useToolkitNavigation();\n const {pathname} = useLocation();\n const {menuItems} = useAppMenu();\n const titleRef = useRef(null);\n useRegisterPageTitle(title, titleRef);\n const {usesCapsules} = useBarActionsSlot();\n // sin cápsulas: a la derecha del título y, en el teléfono, abajo y a lo ancho\n const inlineActionsSx = {display: 'flex', gap: 1, flexWrap: 'wrap', flex: {xs: '1 1 auto', sm: '0 0 auto'}, '& > .MuiButton-root': {width: {xs: '100%', sm: 'auto'}}};\n // con cápsulas suben a la barra (escritorio) o flotan arriba (teléfono). Si no hay dónde (la barra fundida al menú), la\n // cápsula de solo íconos se queda a la derecha del título, en el mismo renglón; el título se parte si no cabe\n const isActionsCapsule = Boolean(actions) && usesCapsules;\n\n const crumbs = breadcrumbs === false\n ? []\n : breadcrumbs ?? menuBreadcrumbsOf(menuItems, pathname).map((menuItem) => ({label: menuItemLabelOf(menuItem, t), to: menuItem.to}));\n\n return (\n <Box component=\"header\" sx={{mb: 3}}>\n <DocumentTitle title={documentTitle ?? title} />\n {crumbs.length >= MIN_BREADCRUMBS && <Box sx={{mb: 1}}><PageBreadcrumbs items={crumbs} /></Box>}\n <Stack direction={isActionsCapsule ? 'row' : {xs: 'column', sm: 'row'}} spacing={{xs: 1.5, sm: 2}}\n sx={{alignItems: isActionsCapsule ? 'flex-start' : {xs: 'stretch', sm: 'flex-start'}, justifyContent: 'space-between'}}>\n <Typography ref={titleRef} variant=\"h4\" component=\"h1\" sx={{minWidth: 0}}>{title}</Typography>\n {isActionsCapsule && <BarActions label={title} inlineSx={{flexShrink: 0}}>{actions}</BarActions>}\n {actions && !usesCapsules && <Box sx={inlineActionsSx}>{actions}</Box>}\n </Stack>\n {description && (\n <Typography variant=\"body1\" color=\"text.secondary\" component=\"div\" sx={{mt: 0.75, maxWidth: 760}}>{description}</Typography>\n )}\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AA+BA,MAAM,kBAAkB;AAWxB,SAAwB,YAAY,EAAC,OAAO,aAAa,aAAa,SAAS,eAAe,SAAQ;AAClG,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AACjD,QAAM,EAAC,YAAA,IAAe,qBAAA;AACtB,QAAM,EAAC,SAAA,IAAY,YAAA;AACnB,QAAM,EAAC,UAAA,IAAa,WAAA;AACpB,QAAM,WAAW,OAAO,IAAI;AAC5B,uBAAqB,OAAO,QAAQ;AACpC,QAAM,EAAC,aAAA,IAAgB,kBAAA;AAEvB,QAAM,kBAAkB,EAAC,SAAS,QAAQ,KAAK,GAAG,UAAU,QAAQ,MAAM,EAAC,IAAI,YAAY,IAAI,WAAA,GAAa,uBAAuB,EAAC,OAAO,EAAC,IAAI,QAAQ,IAAI,OAAA,IAAO;AAGnK,QAAM,mBAAmB,QAAQ,OAAO,KAAK;AAE7C,QAAM,SAAS,gBAAgB,QACzB,CAAA,IACA,eAAe,kBAAkB,WAAW,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAC,OAAO,gBAAgB,UAAU,CAAC,GAAG,IAAI,SAAS,GAAA,EAAI;AAEtI,SACI,qBAAC,OAAI,WAAU,UAAS,IAAI,EAAC,IAAI,KAC7B,UAAA;AAAA,IAAA,oBAAC,eAAA,EAAc,OAAO,iBAAiB,MAAA,CAAO;AAAA,IAC7C,OAAO,UAAU,mBAAmB,oBAAC,OAAI,IAAI,EAAC,IAAI,EAAA,GAAI,UAAA,oBAAC,iBAAA,EAAgB,OAAO,QAAQ,GAAE;AAAA,IACzF;AAAA,MAAC;AAAA,MAAA;AAAA,QAAM,WAAW,mBAAmB,QAAQ,EAAC,IAAI,UAAU,IAAI,MAAA;AAAA,QAAQ,SAAS,EAAC,IAAI,KAAK,IAAI,EAAA;AAAA,QACxF,IAAI,EAAC,YAAY,mBAAmB,eAAe,EAAC,IAAI,WAAW,IAAI,gBAAe,gBAAgB,gBAAA;AAAA,QACzG,UAAA;AAAA,UAAA,oBAAC,YAAA,EAAW,KAAK,UAAU,SAAQ,MAAK,WAAU,MAAK,IAAI,EAAC,UAAU,EAAA,GAAK,UAAA,OAAM;AAAA,UAChF,oBAAoB,oBAAC,YAAA,EAAW,OAAO,OAAO,UAAU,EAAC,YAAY,EAAA,GAAK,UAAA,QAAA,CAAQ;AAAA,UAClF,WAAW,CAAC,oCAAiB,KAAA,EAAI,IAAI,iBAAkB,UAAA,QAAA,CAAQ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEnE,eACG,oBAAC,YAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,WAAU,OAAM,IAAI,EAAC,IAAI,MAAM,UAAU,IAAA,GAAO,UAAA,YAAA,CAAY;AAAA,EAAA,GAEvH;AAER;"}
@@ -0,0 +1,64 @@
1
+ "use client";
2
+ import { jsxs, jsx } from "react/jsx-runtime";
3
+ import { useRef } from "react";
4
+ import Avatar from "@mui/material/Avatar";
5
+ import Box from "@mui/material/Box";
6
+ import Chip from "@mui/material/Chip";
7
+ import Paper from "@mui/material/Paper";
8
+ import Stack from "@mui/material/Stack";
9
+ import Typography from "@mui/material/Typography";
10
+ import { initialsOf } from "../../appShell/menuItemText.js";
11
+ import { useRegisterPageTitle } from "../../appShell/pageTitle.js";
12
+ import { paletteOf } from "../../theme/components/paletteOf.js";
13
+ import DocumentTitle from "../navigation/DocumentTitle.js";
14
+ const COVER_HEIGHT_PIXELS = 112;
15
+ const AVATAR_SIZE_PIXELS = 96;
16
+ const AVATAR_BORDER_PIXELS = 4;
17
+ const coverOf = (theme) => {
18
+ const palette = paletteOf(theme);
19
+ return {
20
+ height: COVER_HEIGHT_PIXELS,
21
+ backgroundColor: palette.primary.main,
22
+ backgroundImage: `radial-gradient(80% 140% at 85% 0%, color-mix(in srgb, ${palette.primary.light} 70%, transparent), transparent 60%), linear-gradient(120deg, ${palette.primary.main}, ${palette.primary.dark})`
23
+ };
24
+ };
25
+ function ProfileHeader({ name, email, subtitle, avatarUrl, chips = [], actions }) {
26
+ const titleRef = useRef(null);
27
+ useRegisterPageTitle(name, titleRef);
28
+ return /* @__PURE__ */ jsxs(Paper, { variant: "outlined", sx: { overflow: "hidden", mb: 3 }, children: [
29
+ /* @__PURE__ */ jsx(DocumentTitle, { title: name }),
30
+ /* @__PURE__ */ jsx(Box, { sx: coverOf }),
31
+ /* @__PURE__ */ jsxs(Stack, { direction: { xs: "column", sm: "row" }, spacing: 2, sx: { px: { xs: 2, md: 3 }, pb: 2.5, alignItems: { sm: "flex-end" } }, children: [
32
+ /* @__PURE__ */ jsx(
33
+ Avatar,
34
+ {
35
+ src: avatarUrl,
36
+ alt: name,
37
+ sx: {
38
+ width: AVATAR_SIZE_PIXELS,
39
+ height: AVATAR_SIZE_PIXELS,
40
+ mt: `-${AVATAR_SIZE_PIXELS / 2}px`,
41
+ fontSize: "2rem",
42
+ fontWeight: 600,
43
+ border: `${AVATAR_BORDER_PIXELS}px solid`,
44
+ borderColor: "background.paper",
45
+ bgcolor: "secondary.main",
46
+ color: "secondary.contrastText"
47
+ },
48
+ children: initialsOf(name)
49
+ }
50
+ ),
51
+ /* @__PURE__ */ jsxs(Box, { sx: { flexGrow: 1, minWidth: 0 }, children: [
52
+ /* @__PURE__ */ jsx(Typography, { ref: titleRef, variant: "h5", component: "h1", sx: { fontWeight: 600 }, children: name }),
53
+ email && /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: email }),
54
+ subtitle && /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: subtitle }),
55
+ chips.length > 0 && /* @__PURE__ */ jsx(Stack, { direction: "row", spacing: 1, useFlexGap: true, sx: { flexWrap: "wrap", mt: 1 }, children: chips.map((chip) => /* @__PURE__ */ jsx(Chip, { label: chip, size: "small", color: "primary", variant: "outlined" }, chip)) })
56
+ ] }),
57
+ actions && /* @__PURE__ */ jsx(Stack, { direction: "row", spacing: 1, useFlexGap: true, sx: { flexWrap: "wrap", flexShrink: 0 }, children: actions })
58
+ ] })
59
+ ] });
60
+ }
61
+ export {
62
+ ProfileHeader as default
63
+ };
64
+ //# sourceMappingURL=ProfileHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProfileHeader.js","sources":["../../../src/ui/layout/ProfileHeader.jsx"],"sourcesContent":["// El encabezado de una persona («Mi perfil», el detalle de un usuario): una franja de color arriba, el avatar grande\n// (su foto o sus iniciales) montado sobre la franja, el nombre, el correo, sus perfiles como etiquetas y, a la derecha,\n// las acciones (editar, desactivar…). Como el de las plantillas de tablero de MUI.\n//\n// En el teléfono las acciones bajan debajo del nombre. El nombre es el título de la página (h1) y sube a la barra al\n// deslizar, como el de PageHeading.\n//\n// Genérico del paquete: function (regla de la casa). No sabe de negocio: todo llega ya traducido.\nimport {useRef} from 'react';\nimport Avatar from '@mui/material/Avatar';\nimport Box from '@mui/material/Box';\nimport Chip from '@mui/material/Chip';\nimport Paper from '@mui/material/Paper';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport {initialsOf} from '@/appShell/menuItemText.js';\nimport {useRegisterPageTitle} from '@/appShell/pageTitle.jsx';\nimport {paletteOf} from '@/theme/components/paletteOf.js';\nimport DocumentTitle from '@/ui/navigation/DocumentTitle.jsx';\n\n// la franja de arriba y el avatar que se monta en ella (la mitad del avatar sobre la franja)\nconst COVER_HEIGHT_PIXELS = 112;\nconst AVATAR_SIZE_PIXELS = 96;\nconst AVATAR_BORDER_PIXELS = 4;\n\n/**\n * La franja de color: el principal del tema, más oscuro hacia la derecha, con un brillo suave.\n *\n * @param {object} theme\n * @returns {object}\n */\nconst coverOf = (theme) => {\n const palette = paletteOf(theme);\n return {\n height: COVER_HEIGHT_PIXELS,\n backgroundColor: palette.primary.main,\n backgroundImage: `radial-gradient(80% 140% at 85% 0%, color-mix(in srgb, ${palette.primary.light} 70%, transparent), transparent 60%), `\n + `linear-gradient(120deg, ${palette.primary.main}, ${palette.primary.dark})`,\n };\n};\n\n/**\n * @param {object} props\n * @param {string} props.name el nombre de la persona\n * @param {string} [props.email]\n * @param {string} [props.subtitle] el renglón de abajo (puesto · sucursal)\n * @param {string} [props.avatarUrl] su foto; sin ella, sus iniciales\n * @param {string[]} [props.chips] sus perfiles o etiquetas, ya traducidos\n * @param {import('react').ReactNode} [props.actions] los botones de la derecha\n */\nexport default function ProfileHeader({name, email, subtitle, avatarUrl, chips = [], actions}) {\n const titleRef = useRef(null);\n useRegisterPageTitle(name, titleRef);\n\n return (\n <Paper variant=\"outlined\" sx={{overflow: 'hidden', mb: 3}}>\n <DocumentTitle title={name} />\n <Box sx={coverOf} />\n <Stack direction={{xs: 'column', sm: 'row'}} spacing={2} sx={{px: {xs: 2, md: 3}, pb: 2.5, alignItems: {sm: 'flex-end'}}}>\n <Avatar src={avatarUrl} alt={name}\n sx={{\n width: AVATAR_SIZE_PIXELS, height: AVATAR_SIZE_PIXELS, mt: `-${AVATAR_SIZE_PIXELS / 2}px`, fontSize: '2rem', fontWeight: 600,\n border: `${AVATAR_BORDER_PIXELS}px solid`, borderColor: 'background.paper', bgcolor: 'secondary.main', color: 'secondary.contrastText',\n }}>\n {initialsOf(name)}\n </Avatar>\n <Box sx={{flexGrow: 1, minWidth: 0}}>\n <Typography ref={titleRef} variant=\"h5\" component=\"h1\" sx={{fontWeight: 600}}>{name}</Typography>\n {email && <Typography variant=\"body2\" color=\"text.secondary\">{email}</Typography>}\n {subtitle && <Typography variant=\"body2\" color=\"text.secondary\">{subtitle}</Typography>}\n {chips.length > 0 && (\n <Stack direction=\"row\" spacing={1} useFlexGap sx={{flexWrap: 'wrap', mt: 1}}>\n {chips.map((chip) => <Chip key={chip} label={chip} size=\"small\" color=\"primary\" variant=\"outlined\" />)}\n </Stack>\n )}\n </Box>\n {actions && <Stack direction=\"row\" spacing={1} useFlexGap sx={{flexWrap: 'wrap', flexShrink: 0}}>{actions}</Stack>}\n </Stack>\n </Paper>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AAsBA,MAAM,sBAAsB;AAC5B,MAAM,qBAAqB;AAC3B,MAAM,uBAAuB;AAQ7B,MAAM,UAAU,CAAC,UAAU;AACvB,QAAM,UAAU,UAAU,KAAK;AAC/B,SAAO;AAAA,IACH,QAAQ;AAAA,IACR,iBAAiB,QAAQ,QAAQ;AAAA,IACjC,iBAAiB,0DAA0D,QAAQ,QAAQ,KAAK,iEAC/D,QAAQ,QAAQ,IAAI,KAAK,QAAQ,QAAQ,IAAI;AAAA,EAAA;AAEtF;AAWA,SAAwB,cAAc,EAAC,MAAM,OAAO,UAAU,WAAW,QAAQ,IAAI,WAAU;AAC3F,QAAM,WAAW,OAAO,IAAI;AAC5B,uBAAqB,MAAM,QAAQ;AAEnC,SACI,qBAAC,OAAA,EAAM,SAAQ,YAAW,IAAI,EAAC,UAAU,UAAU,IAAI,EAAA,GACnD,UAAA;AAAA,IAAA,oBAAC,eAAA,EAAc,OAAO,KAAA,CAAM;AAAA,IAC5B,oBAAC,KAAA,EAAI,IAAI,QAAA,CAAS;AAAA,IAClB,qBAAC,OAAA,EAAM,WAAW,EAAC,IAAI,UAAU,IAAI,MAAA,GAAQ,SAAS,GAAG,IAAI,EAAC,IAAI,EAAC,IAAI,GAAG,IAAI,EAAA,GAAI,IAAI,KAAK,YAAY,EAAC,IAAI,WAAA,EAAU,GAClH,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UAAO,KAAK;AAAA,UAAW,KAAK;AAAA,UACrB,IAAI;AAAA,YACA,OAAO;AAAA,YAAoB,QAAQ;AAAA,YAAoB,IAAI,IAAI,qBAAqB,CAAC;AAAA,YAAM,UAAU;AAAA,YAAQ,YAAY;AAAA,YACzH,QAAQ,GAAG,oBAAoB;AAAA,YAAY,aAAa;AAAA,YAAoB,SAAS;AAAA,YAAkB,OAAO;AAAA,UAAA;AAAA,UAErH,qBAAW,IAAI;AAAA,QAAA;AAAA,MAAA;AAAA,MAEpB,qBAAC,OAAI,IAAI,EAAC,UAAU,GAAG,UAAU,KAC7B,UAAA;AAAA,QAAA,oBAAC,YAAA,EAAW,KAAK,UAAU,SAAQ,MAAK,WAAU,MAAK,IAAI,EAAC,YAAY,IAAA,GAAO,UAAA,MAAK;AAAA,QACnF,SAAS,oBAAC,YAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAkB,UAAA,OAAM;AAAA,QACnE,YAAY,oBAAC,YAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAkB,UAAA,UAAS;AAAA,QACzE,MAAM,SAAS,KACZ,oBAAC,SAAM,WAAU,OAAM,SAAS,GAAG,YAAU,MAAC,IAAI,EAAC,UAAU,QAAQ,IAAI,EAAA,GACpE,UAAA,MAAM,IAAI,CAAC,SAAS,oBAAC,QAAgB,OAAO,MAAM,MAAK,SAAQ,OAAM,WAAU,SAAQ,WAAA,GAAxD,IAAmE,CAAE,EAAA,CACzG;AAAA,MAAA,GAER;AAAA,MACC,WAAW,oBAAC,OAAA,EAAM,WAAU,OAAM,SAAS,GAAG,YAAU,MAAC,IAAI,EAAC,UAAU,QAAQ,YAAY,EAAA,GAAK,UAAA,QAAA,CAAQ;AAAA,IAAA,EAAA,CAC9G;AAAA,EAAA,GACJ;AAER;"}
@@ -0,0 +1,156 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useRef, useState, Children, useEffect } from "react";
4
+ import Box from "@mui/material/Box";
5
+ const scrollableRow = {
6
+ display: "flex",
7
+ flexWrap: "nowrap",
8
+ overflowX: "auto",
9
+ overflowY: "hidden",
10
+ scrollbarWidth: "none",
11
+ msOverflowStyle: "none",
12
+ "&::-webkit-scrollbar": { display: "none" }
13
+ };
14
+ const DRAG_THRESHOLD_PIXELS = 5;
15
+ function ScrollableRow({
16
+ children,
17
+ gap = 1,
18
+ py = 0.5,
19
+ sx,
20
+ enableDragScroll = true,
21
+ enableWheelToX = true,
22
+ fadeEdges = true,
23
+ ref,
24
+ ...boxProps
25
+ }) {
26
+ const rowElement = useRef(null);
27
+ const [edges, setEdges] = useState({ overflow: false, start: false, end: false });
28
+ const assignRef = (node) => {
29
+ rowElement.current = node;
30
+ if (typeof ref === "function") {
31
+ ref(node);
32
+ } else if (ref && typeof ref === "object") {
33
+ ref.current = node;
34
+ }
35
+ };
36
+ const childrenCount = Children.count(children);
37
+ useEffect(() => {
38
+ const element = rowElement.current;
39
+ if (!element) {
40
+ return void 0;
41
+ }
42
+ const measureEdges = () => setEdges({
43
+ overflow: element.scrollWidth > element.clientWidth + 1,
44
+ start: element.scrollLeft > 1,
45
+ end: element.scrollLeft + element.clientWidth < element.scrollWidth - 1
46
+ });
47
+ measureEdges();
48
+ const resizeObserver = new ResizeObserver(measureEdges);
49
+ resizeObserver.observe(element);
50
+ element.addEventListener("scroll", measureEdges, { passive: true });
51
+ return () => {
52
+ resizeObserver.disconnect();
53
+ element.removeEventListener("scroll", measureEdges);
54
+ };
55
+ }, [childrenCount]);
56
+ useEffect(() => {
57
+ const element = rowElement.current;
58
+ if (!element) {
59
+ return void 0;
60
+ }
61
+ let isDragging = false;
62
+ let hasMoved = false;
63
+ let startX = 0;
64
+ let scrollStart = 0;
65
+ const isOverflowing = () => element.scrollWidth > element.clientWidth + 1;
66
+ const handleMouseDown = (event) => {
67
+ if (event.button !== 0 || !isOverflowing()) {
68
+ return;
69
+ }
70
+ if (["INPUT", "TEXTAREA"].includes(event.target?.tagName)) {
71
+ return;
72
+ }
73
+ isDragging = true;
74
+ hasMoved = false;
75
+ startX = event.pageX;
76
+ scrollStart = element.scrollLeft;
77
+ };
78
+ const handleMouseMove = (event) => {
79
+ if (!isDragging) {
80
+ return;
81
+ }
82
+ const distance = event.pageX - startX;
83
+ if (!hasMoved && Math.abs(distance) > DRAG_THRESHOLD_PIXELS) {
84
+ hasMoved = true;
85
+ element.style.cursor = "grabbing";
86
+ }
87
+ if (hasMoved) {
88
+ event.preventDefault();
89
+ element.scrollLeft = scrollStart - distance;
90
+ }
91
+ };
92
+ const stopDragging = () => {
93
+ isDragging = false;
94
+ element.style.cursor = "";
95
+ };
96
+ const handleClickCapture = (event) => {
97
+ if (!hasMoved) {
98
+ return;
99
+ }
100
+ event.preventDefault();
101
+ event.stopPropagation();
102
+ hasMoved = false;
103
+ };
104
+ const handleWheel = (event) => {
105
+ if (isOverflowing() && Math.abs(event.deltaY) > Math.abs(event.deltaX)) {
106
+ event.preventDefault();
107
+ element.scrollLeft += event.deltaY;
108
+ }
109
+ };
110
+ if (enableDragScroll) {
111
+ element.addEventListener("mousedown", handleMouseDown);
112
+ element.addEventListener("mousemove", handleMouseMove);
113
+ element.addEventListener("mouseup", stopDragging);
114
+ element.addEventListener("mouseleave", stopDragging);
115
+ element.addEventListener("click", handleClickCapture, true);
116
+ }
117
+ if (enableWheelToX) {
118
+ element.addEventListener("wheel", handleWheel, { passive: false });
119
+ }
120
+ return () => {
121
+ element.removeEventListener("mousedown", handleMouseDown);
122
+ element.removeEventListener("mousemove", handleMouseMove);
123
+ element.removeEventListener("mouseup", stopDragging);
124
+ element.removeEventListener("mouseleave", stopDragging);
125
+ element.removeEventListener("click", handleClickCapture, true);
126
+ element.removeEventListener("wheel", handleWheel);
127
+ };
128
+ }, [enableDragScroll, enableWheelToX]);
129
+ const isDragEnabled = enableDragScroll && edges.overflow;
130
+ const fadeMask = fadeEdges && edges.overflow ? `linear-gradient(to right, ${[
131
+ edges.start ? "transparent 0, black 24px" : "black 0",
132
+ edges.end ? "black calc(100% - 24px), transparent 100%" : "black 100%"
133
+ ].join(", ")})` : void 0;
134
+ return /* @__PURE__ */ jsx(
135
+ Box,
136
+ {
137
+ ref: assignRef,
138
+ sx: {
139
+ ...scrollableRow,
140
+ gap,
141
+ py,
142
+ cursor: isDragEnabled ? "grab" : "auto",
143
+ userSelect: isDragEnabled ? "none" : "auto",
144
+ ...fadeMask && { maskImage: fadeMask, WebkitMaskImage: fadeMask },
145
+ ...sx
146
+ },
147
+ ...boxProps,
148
+ children
149
+ }
150
+ );
151
+ }
152
+ export {
153
+ ScrollableRow as default,
154
+ scrollableRow
155
+ };
156
+ //# sourceMappingURL=ScrollableRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollableRow.js","sources":["../../../src/ui/layout/ScrollableRow.jsx"],"sourcesContent":["// Tira horizontal que se desliza, no que se envuelve (chips de filtros y accesos rápidos).\n//\n// Con muchos filtros puestos los chips se envolvían en varios renglones y empujaban la tabla fuera de la pantalla,\n// justo cuando más falta hace ver el resultado. Encapsula lo que hace falta para que la tira se sienta nativa:\n// - overflow-x sin barra visible en los tres motores;\n// - arrastre con el mouse en escritorio (el deslizamiento táctil ya es gratis);\n// - la rueda vertical se convierte en desplazamiento horizontal;\n// - el borde por el que sigue habiendo contenido se DESVANECE: sin barra ni desvanecido, una tira cortada a la mitad\n// se lee como un chip mal pintado.\n// Todo eso se activa SOLO cuando de verdad hay desbordamiento.\n//\n// OJO: el umbral de 5 px separa el arrastre del clic; mover más cancela el clic que venía detrás, para no borrar un\n// filtro cuando lo que se quería era desplazar la tira.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {Children, useEffect, useRef, useState} from 'react';\nimport Box from '@mui/material/Box';\n\n/** El mixin sin arrastre, para cuando no se puede envolver el elemento. */\nexport const scrollableRow = {\n display: 'flex',\n flexWrap: 'nowrap',\n overflowX: 'auto',\n overflowY: 'hidden',\n scrollbarWidth: 'none',\n msOverflowStyle: 'none',\n '&::-webkit-scrollbar': {display: 'none'},\n};\n\nconst DRAG_THRESHOLD_PIXELS = 5;\n\n/**\n * @param {object} props\n * @param {import('react').ReactNode} props.children\n * @param {number} [props.gap]\n * @param {number} [props.py]\n * @param {object} [props.sx]\n * @param {boolean} [props.enableDragScroll]\n * @param {boolean} [props.enableWheelToX]\n * @param {boolean} [props.fadeEdges]\n * @param {import('react').Ref<HTMLElement>} [props.ref]\n */\nexport default function ScrollableRow({\n children, gap = 1, py = 0.5, sx, enableDragScroll = true, enableWheelToX = true, fadeEdges = true, ref, ...boxProps\n}) {\n const rowElement = useRef(null);\n // por dónde sigue habiendo contenido: decide de qué lado va el desvanecido\n const [edges, setEdges] = useState({overflow: false, start: false, end: false});\n\n const assignRef = (node) => {\n rowElement.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref && typeof ref === 'object') {\n ref.current = node;\n }\n };\n\n // el número de hijos es la señal estable para revisar de nuevo (el padre agrega y quita chips)\n const childrenCount = Children.count(children);\n useEffect(() => {\n const element = rowElement.current;\n if (!element) {\n return undefined;\n }\n // el +1 evita el falso positivo por subpíxel\n const measureEdges = () => setEdges({\n overflow: element.scrollWidth > element.clientWidth + 1,\n start: element.scrollLeft > 1,\n end: element.scrollLeft + element.clientWidth < element.scrollWidth - 1,\n });\n measureEdges();\n\n const resizeObserver = new ResizeObserver(measureEdges);\n resizeObserver.observe(element);\n element.addEventListener('scroll', measureEdges, {passive: true});\n return () => {\n resizeObserver.disconnect();\n element.removeEventListener('scroll', measureEdges);\n };\n }, [childrenCount]);\n\n useEffect(() => {\n const element = rowElement.current;\n if (!element) {\n return undefined;\n }\n\n let isDragging = false;\n let hasMoved = false;\n let startX = 0;\n let scrollStart = 0;\n\n const isOverflowing = () => element.scrollWidth > element.clientWidth + 1;\n\n const handleMouseDown = (event) => {\n if (event.button !== 0 || !isOverflowing()) {\n return;\n }\n // arrastrar dentro de un campo de texto es seleccionar texto, no desplazar la tira\n if (['INPUT', 'TEXTAREA'].includes(event.target?.tagName)) {\n return;\n }\n isDragging = true;\n hasMoved = false;\n startX = event.pageX;\n scrollStart = element.scrollLeft;\n };\n\n const handleMouseMove = (event) => {\n if (!isDragging) {\n return;\n }\n const distance = event.pageX - startX;\n if (!hasMoved && Math.abs(distance) > DRAG_THRESHOLD_PIXELS) {\n hasMoved = true;\n element.style.cursor = 'grabbing';\n }\n if (hasMoved) {\n event.preventDefault();\n element.scrollLeft = scrollStart - distance;\n }\n };\n\n const stopDragging = () => {\n isDragging = false;\n element.style.cursor = '';\n };\n\n const handleClickCapture = (event) => {\n if (!hasMoved) {\n return;\n }\n // se arrastró: el clic que viene detrás NO es un clic\n event.preventDefault();\n event.stopPropagation();\n hasMoved = false;\n };\n\n const handleWheel = (event) => {\n if (isOverflowing() && Math.abs(event.deltaY) > Math.abs(event.deltaX)) {\n event.preventDefault();\n element.scrollLeft += event.deltaY;\n }\n };\n\n if (enableDragScroll) {\n element.addEventListener('mousedown', handleMouseDown);\n element.addEventListener('mousemove', handleMouseMove);\n element.addEventListener('mouseup', stopDragging);\n element.addEventListener('mouseleave', stopDragging);\n element.addEventListener('click', handleClickCapture, true);\n }\n if (enableWheelToX) {\n element.addEventListener('wheel', handleWheel, {passive: false});\n }\n\n return () => {\n element.removeEventListener('mousedown', handleMouseDown);\n element.removeEventListener('mousemove', handleMouseMove);\n element.removeEventListener('mouseup', stopDragging);\n element.removeEventListener('mouseleave', stopDragging);\n element.removeEventListener('click', handleClickCapture, true);\n element.removeEventListener('wheel', handleWheel);\n };\n }, [enableDragScroll, enableWheelToX]);\n\n const isDragEnabled = enableDragScroll && edges.overflow;\n\n // máscara y no degradado encima: funciona sin saber de qué color es el fondo\n const fadeMask = fadeEdges && edges.overflow\n ? `linear-gradient(to right, ${[\n edges.start ? 'transparent 0, black 24px' : 'black 0',\n edges.end ? 'black calc(100% - 24px), transparent 100%' : 'black 100%',\n ].join(', ')})`\n : undefined;\n\n return (\n <Box ref={assignRef}\n sx={{\n ...scrollableRow,\n gap,\n py,\n cursor: isDragEnabled ? 'grab' : 'auto',\n userSelect: isDragEnabled ? 'none' : 'auto',\n ...(fadeMask && {maskImage: fadeMask, WebkitMaskImage: fadeMask}),\n ...sx,\n }}\n {...boxProps}>\n {children}\n </Box>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ "use client";
2
+ import { jsxs, jsx } from "react/jsx-runtime";
3
+ import Box from "@mui/material/Box";
4
+ import Paper from "@mui/material/Paper";
5
+ import Typography from "@mui/material/Typography";
6
+ function SectionCard({ title, action, children }) {
7
+ return /* @__PURE__ */ jsxs(Paper, { component: "section", variant: "outlined", sx: { p: { xs: 2, md: 2.5 }, minWidth: 0 }, children: [
8
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 1, mb: 1.5 }, children: [
9
+ /* @__PURE__ */ jsx(Typography, { variant: "overline", color: "text.secondary", component: "h2", sx: { lineHeight: 1.6 }, children: title }),
10
+ action
11
+ ] }),
12
+ children
13
+ ] });
14
+ }
15
+ export {
16
+ SectionCard as default
17
+ };
18
+ //# sourceMappingURL=SectionCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionCard.js","sources":["../../../src/ui/layout/SectionCard.jsx"],"sourcesContent":["// Tarjeta de una sección de una página de detalle: título en versalitas, una acción opcional a la derecha y el contenido.\n//\n// Por qué una tarjeta por sección y no una sola hoja larga con divisiones: en pantalla ancha las secciones se acomodan en\n// columnas (lo principal a la izquierda, los datos de apoyo a la derecha) y cada una se encuentra por su título.\n//\n// Genérico del paquete: function (regla de la casa). No sabe de negocio: el título y el contenido llegan ya traducidos.\nimport Box from '@mui/material/Box';\nimport Paper from '@mui/material/Paper';\nimport Typography from '@mui/material/Typography';\n\n/**\n * @param {object} props\n * @param {string} props.title texto ya traducido\n * @param {import('react').ReactNode} [props.action] botón o liga a la derecha del título\n * @param {import('react').ReactNode} props.children\n */\nexport default function SectionCard({title, action, children}) {\n return (\n <Paper component=\"section\" variant=\"outlined\" sx={{p: {xs: 2, md: 2.5}, minWidth: 0}}>\n <Box sx={{display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 1, mb: 1.5}}>\n <Typography variant=\"overline\" color=\"text.secondary\" component=\"h2\" sx={{lineHeight: 1.6}}>{title}</Typography>\n {action}\n </Box>\n {children}\n </Paper>\n );\n}\n"],"names":[],"mappings":";;;;;AAgBA,SAAwB,YAAY,EAAC,OAAO,QAAQ,YAAW;AAC3D,8BACK,OAAA,EAAM,WAAU,WAAU,SAAQ,YAAW,IAAI,EAAC,GAAG,EAAC,IAAI,GAAG,IAAI,OAAM,UAAU,KAC9E,UAAA;AAAA,IAAA,qBAAC,KAAA,EAAI,IAAI,EAAC,SAAS,QAAQ,YAAY,UAAU,gBAAgB,iBAAiB,KAAK,GAAG,IAAI,OAC1F,UAAA;AAAA,MAAA,oBAAC,YAAA,EAAW,SAAQ,YAAW,OAAM,kBAAiB,WAAU,MAAK,IAAI,EAAC,YAAY,IAAA,GAAO,UAAA,OAAM;AAAA,MAClG;AAAA,IAAA,GACL;AAAA,IACC;AAAA,EAAA,GACL;AAER;"}
@@ -0,0 +1,42 @@
1
+ "use client";
2
+ import { useRef, useEffect, useLayoutEffect } from "react";
3
+ const APP_BAR_HEIGHT_CSS_VARIABLE = "--app-bar-height";
4
+ const APP_BAR_HEIGHT_WITHOUT_RIBBON_PIXELS = 56;
5
+ const useBrowserLayoutEffect = typeof window === "undefined" ? useEffect : useLayoutEffect;
6
+ const BREATHING_ROOM_BELOW_APP_BAR_PIXELS = 16;
7
+ const APP_BAR_HEIGHT = `var(${APP_BAR_HEIGHT_CSS_VARIABLE}, ${APP_BAR_HEIGHT_WITHOUT_RIBBON_PIXELS}px)`;
8
+ const SCROLL_MARGIN_BELOW_APP_BAR = `calc(${APP_BAR_HEIGHT} + ${BREATHING_ROOM_BELOW_APP_BAR_PIXELS}px)`;
9
+ function useAppBarHeightPublisher() {
10
+ const appBarElement = useRef(null);
11
+ useBrowserLayoutEffect(() => {
12
+ const element = appBarElement.current;
13
+ if (!element || typeof ResizeObserver === "undefined") {
14
+ return void 0;
15
+ }
16
+ const rootStyle = document.documentElement.style;
17
+ const publishHeight = () => {
18
+ const box = element.getBoundingClientRect();
19
+ const isAtBottom = box.top > window.innerHeight / 2;
20
+ const stickyTopPixels = Number.parseFloat(window.getComputedStyle(element).top) || 0;
21
+ const coveredPixels = isAtBottom ? 0 : Math.round(box.height + stickyTopPixels);
22
+ rootStyle.setProperty(APP_BAR_HEIGHT_CSS_VARIABLE, `${coveredPixels}px`);
23
+ };
24
+ publishHeight();
25
+ const resizeObserver = new ResizeObserver(publishHeight);
26
+ resizeObserver.observe(element);
27
+ window.addEventListener("resize", publishHeight);
28
+ return () => {
29
+ resizeObserver.disconnect();
30
+ window.removeEventListener("resize", publishHeight);
31
+ rootStyle.removeProperty(APP_BAR_HEIGHT_CSS_VARIABLE);
32
+ };
33
+ }, []);
34
+ return appBarElement;
35
+ }
36
+ export {
37
+ APP_BAR_HEIGHT,
38
+ APP_BAR_HEIGHT_CSS_VARIABLE,
39
+ SCROLL_MARGIN_BELOW_APP_BAR,
40
+ useAppBarHeightPublisher
41
+ };
42
+ //# sourceMappingURL=appBarHeight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appBarHeight.js","sources":["../../../src/ui/layout/appBarHeight.js"],"sourcesContent":["// El alto real de la barra superior, publicado como variable CSS para quien necesite dejarle lugar. Si la barra flota\n// separada de la orilla de arriba (el marco con vidrio), cuenta también esa separación: es lo que tapa.\n//\n// La barra superior se queda fija arriba al deslizar (sticky) y puede llevar adentro un aviso (una franja «Carga en\n// curso»): no siempre mide lo mismo. Quien manda la vista a una sección de su página (scroll-margin-top) necesita el\n// alto que la barra tiene EN ESE MOMENTO; con un número fijo, la barra con el aviso tapaba el título de la sección.\n// El layout de la aplicación mide su barra (useAppBarHeightPublisher) y las páginas solo usan SCROLL_MARGIN_BELOW_APP_BAR.\n//\n// NOTA sobre la CSP (sin 'unsafe-inline'): la variable se pone con style.setProperty, que es el objeto de estilos del\n// elemento y la CSP no lo bloquea; lo que bloquea es un atributo style=\"\" escrito en el HTML.\n//\n// Helpers genéricos del paquete: function (regla de la casa).\nimport {useEffect, useLayoutEffect, useRef} from 'react';\n\n/** Nombre de la variable CSS con el alto de la barra superior, en px. */\nexport const APP_BAR_HEIGHT_CSS_VARIABLE = '--app-bar-height';\n\n// lo que mide la barra sin aviso (el minHeight de su Toolbar): vale mientras nadie ha medido\nconst APP_BAR_HEIGHT_WITHOUT_RIBBON_PIXELS = 56;\n\n// se mide ANTES del primer pintado: el menú lateral empieza debajo de la barra y, con el alto de respaldo, brincaba al\n// medirse. En el servidor useLayoutEffect avisa en consola; ahí no hay nada que medir\nconst useBrowserLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect;\n\n// aire entre la barra y el título de la sección a la que se llega\nconst BREATHING_ROOM_BELOW_APP_BAR_PIXELS = 16;\n\n/** El alto real de la barra, como valor de CSS: para lo que se acomoda justo debajo de ella (el diálogo de contenido). */\nexport const APP_BAR_HEIGHT = `var(${APP_BAR_HEIGHT_CSS_VARIABLE}, ${APP_BAR_HEIGHT_WITHOUT_RIBBON_PIXELS}px)`;\n\n/** Valor de scroll-margin-top para una sección a la que se llega con un ancla: el alto real de la barra más un respiro. */\nexport const SCROLL_MARGIN_BELOW_APP_BAR = `calc(${APP_BAR_HEIGHT} + ${BREATHING_ROOM_BELOW_APP_BAR_PIXELS}px)`;\n\n/**\n * Mide la barra superior y publica su alto en la variable CSS cada vez que cambia (aparece o se cierra un aviso, se\n * gira el teléfono, cambia el ancho de la ventana).\n *\n * @returns {import('react').RefObject<HTMLElement>} la referencia que se le pone a la barra\n */\nexport function useAppBarHeightPublisher() {\n const appBarElement = useRef(null);\n\n useBrowserLayoutEffect(() => {\n const element = appBarElement.current;\n // guard clause: sin elemento o sin ResizeObserver (navegador muy viejo) se queda el alto de respaldo\n if (!element || typeof ResizeObserver === 'undefined') {\n return undefined;\n }\n const rootStyle = document.documentElement.style;\n // el alto más lo que la barra flota separada de la orilla de arriba (con vidrio, 8 px; si no, 0): lo que tapa la barra\n // cuando se queda fija. Al cambiar eso también cambia su ancho (sus márgenes), y el ResizeObserver lo vuelve a medir\n // OJO: en el teléfono con vidrio la barra flota ABAJO (como la de Safari): arriba no tapa nada y se publica 0; si no,\n // lo que se pega arriba al deslizar dejaba un hueco del alto de una barra que ya no está ahí\n const publishHeight = () => {\n const box = element.getBoundingClientRect();\n const isAtBottom = box.top > window.innerHeight / 2;\n const stickyTopPixels = Number.parseFloat(window.getComputedStyle(element).top) || 0;\n const coveredPixels = isAtBottom ? 0 : Math.round(box.height + stickyTopPixels);\n rootStyle.setProperty(APP_BAR_HEIGHT_CSS_VARIABLE, `${coveredPixels}px`);\n };\n\n publishHeight();\n const resizeObserver = new ResizeObserver(publishHeight);\n resizeObserver.observe(element);\n // al cambiar de ancho la barra puede pasar de arriba a abajo sin cambiar de tamaño\n window.addEventListener('resize', publishHeight);\n\n return () => {\n resizeObserver.disconnect();\n window.removeEventListener('resize', publishHeight);\n rootStyle.removeProperty(APP_BAR_HEIGHT_CSS_VARIABLE);\n };\n }, []);\n\n return appBarElement;\n}\n"],"names":[],"mappings":";;AAeY,MAAC,8BAA8B;AAG3C,MAAM,uCAAuC;AAI7C,MAAM,yBAAyB,OAAO,WAAW,cAAc,YAAY;AAG3E,MAAM,sCAAsC;AAGhC,MAAC,iBAAiB,OAAO,2BAA2B,KAAK,oCAAoC;AAG7F,MAAC,8BAA8B,QAAQ,cAAc,MAAM,mCAAmC;AAQnG,SAAS,2BAA2B;AACvC,QAAM,gBAAgB,OAAO,IAAI;AAEjC,yBAAuB,MAAM;AACzB,UAAM,UAAU,cAAc;AAE9B,QAAI,CAAC,WAAW,OAAO,mBAAmB,aAAa;AACnD,aAAO;AAAA,IACX;AACA,UAAM,YAAY,SAAS,gBAAgB;AAK3C,UAAM,gBAAgB,MAAM;AACxB,YAAM,MAAM,QAAQ,sBAAqB;AACzC,YAAM,aAAa,IAAI,MAAM,OAAO,cAAc;AAClD,YAAM,kBAAkB,OAAO,WAAW,OAAO,iBAAiB,OAAO,EAAE,GAAG,KAAK;AACnF,YAAM,gBAAgB,aAAa,IAAI,KAAK,MAAM,IAAI,SAAS,eAAe;AAC9E,gBAAU,YAAY,6BAA6B,GAAG,aAAa,IAAI;AAAA,IAC3E;AAEA,kBAAa;AACb,UAAM,iBAAiB,IAAI,eAAe,aAAa;AACvD,mBAAe,QAAQ,OAAO;AAE9B,WAAO,iBAAiB,UAAU,aAAa;AAE/C,WAAO,MAAM;AACT,qBAAe,WAAU;AACzB,aAAO,oBAAoB,UAAU,aAAa;AAClD,gBAAU,eAAe,2BAA2B;AAAA,IACxD;AAAA,EACJ,GAAG,CAAA,CAAE;AAEL,SAAO;AACX;"}
@@ -0,0 +1,94 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import Box from "@mui/material/Box";
5
+ import Table from "@mui/material/Table";
6
+ import TableBody from "@mui/material/TableBody";
7
+ import TableCell from "@mui/material/TableCell";
8
+ import TableRow from "@mui/material/TableRow";
9
+ import Typography from "@mui/material/Typography";
10
+ import { ResponsiveContainer, BarChart, XAxis, YAxis, Tooltip, Bar, LabelList } from "recharts";
11
+ import { useFormatters } from "../../toolkit/useFormatters.js";
12
+ import ChartTooltip from "./ChartTooltip.js";
13
+ import TableToggle, { CHART_VIEW } from "./TableToggle.js";
14
+ import { BAR_MIN_POINT_SIZE, barLabelValueOf } from "./barListLabels.js";
15
+ import { useChartColors } from "./chartParts.js";
16
+ const ROW_HEIGHT_PIXELS = 36;
17
+ function ValueLabel({ x, y, width, height, value, colors, formatNumber }) {
18
+ return /* @__PURE__ */ jsxs("text", { x: x + width + 8, y: y + height / 2, dominantBaseline: "central", fontSize: 13, children: [
19
+ /* @__PURE__ */ jsx("tspan", { fill: colors.text, fontWeight: 600, children: formatNumber(value.value) }),
20
+ value.detail && /* @__PURE__ */ jsx("tspan", { fill: colors.muted, fontSize: 12, children: ` ${value.detail}` })
21
+ ] });
22
+ }
23
+ function BarList({ items, onSelect, emptyLabel, tone = "primary", texts, defaultView = CHART_VIEW.chart, onViewChange }) {
24
+ const [asTable, setAsTable] = useState(defaultView === CHART_VIEW.table);
25
+ const toggleView = () => {
26
+ setAsTable(!asTable);
27
+ onViewChange?.(asTable ? CHART_VIEW.chart : CHART_VIEW.table);
28
+ };
29
+ const colors = useChartColors();
30
+ const { formatNumber } = useFormatters();
31
+ if (!items.length) {
32
+ return /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: emptyLabel });
33
+ }
34
+ const labelWidth = Math.min(220, 16 + Math.max(...items.map((item) => String(item.label ?? "").length)) * 7);
35
+ const longestValue = Math.max(...items.map((item) => `${formatNumber(item.value)} ${item.detail ?? ""}`.length));
36
+ return /* @__PURE__ */ jsxs(Box, { children: [
37
+ /* @__PURE__ */ jsx(TableToggle, { asTable, onToggle: toggleView, texts }),
38
+ asTable ? /* @__PURE__ */ jsx(Table, { size: "small", children: /* @__PURE__ */ jsx(TableBody, { children: items.map((item) => /* @__PURE__ */ jsxs(
39
+ TableRow,
40
+ {
41
+ hover: Boolean(onSelect),
42
+ onClick: onSelect ? () => onSelect(item) : void 0,
43
+ sx: { cursor: onSelect ? "pointer" : "default" },
44
+ children: [
45
+ /* @__PURE__ */ jsx(TableCell, { children: item.label }),
46
+ /* @__PURE__ */ jsxs(TableCell, { align: "right", children: [
47
+ formatNumber(item.value),
48
+ " ",
49
+ item.detail
50
+ ] })
51
+ ]
52
+ },
53
+ item.key
54
+ )) }) }) : /* @__PURE__ */ jsx(Box, { sx: { height: items.length * ROW_HEIGHT_PIXELS, color: `${tone}.main` }, children: /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxs(BarChart, { data: items, layout: "vertical", margin: { top: 0, bottom: 0, left: 0, right: 16 + longestValue * 7 }, children: [
55
+ /* @__PURE__ */ jsx(XAxis, { type: "number", hide: true, domain: [0, (dataMax) => Math.max(dataMax, 1)] }),
56
+ /* @__PURE__ */ jsx(
57
+ YAxis,
58
+ {
59
+ type: "category",
60
+ dataKey: "label",
61
+ width: labelWidth,
62
+ tickLine: false,
63
+ axisLine: false,
64
+ tick: { fill: colors.text, fontSize: 13 }
65
+ }
66
+ ),
67
+ /* @__PURE__ */ jsx(
68
+ Tooltip,
69
+ {
70
+ cursor: { fill: colors.hover },
71
+ content: /* @__PURE__ */ jsx(ChartTooltip, { render: (item) => item.tooltip ?? `${item.label}: ${formatNumber(item.value)}` })
72
+ }
73
+ ),
74
+ /* @__PURE__ */ jsx(
75
+ Bar,
76
+ {
77
+ dataKey: "value",
78
+ fill: "currentColor",
79
+ maxBarSize: 16,
80
+ radius: [0, 4, 4, 0],
81
+ isAnimationActive: false,
82
+ minPointSize: BAR_MIN_POINT_SIZE,
83
+ cursor: onSelect ? "pointer" : "default",
84
+ onClick: onSelect ? (entry) => onSelect(entry.payload) : void 0,
85
+ children: /* @__PURE__ */ jsx(LabelList, { valueAccessor: barLabelValueOf, content: (labelProps) => /* @__PURE__ */ jsx(ValueLabel, { ...labelProps, colors, formatNumber }) })
86
+ }
87
+ )
88
+ ] }) }) })
89
+ ] });
90
+ }
91
+ export {
92
+ BarList as default
93
+ };
94
+ //# sourceMappingURL=BarList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BarList.js","sources":["../../../src/ui/metrics/BarList.jsx"],"sourcesContent":["// Barras horizontales de UNA serie con su nombre a la izquierda y su valor en la punta (ventas por producto,\n// cuentas por organización), dibujadas con Recharts.\n//\n// Horizontales porque los nombres son largos (\"Empresa / Área de ventas\"): se leen completos sin rotarlos. Una serie → un\n// color (el del tono, vía currentColor: los atributos SVG no leen var(...) pero sí currentColor); el valor va en tinta,\n// nunca del color de la barra; y cada barra puede llevar a la pantalla que la explica.\n//\n// OJO: el número y el detalle de la punta salen del renglón de la barra (barListLabels.js), nunca de items[index]: Recharts\n// descarta las barras de ancho 0 y renumera las etiquetas, y el detalle se corría al renglón de arriba.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useState} from 'react';\nimport Box from '@mui/material/Box';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\nimport TableRow from '@mui/material/TableRow';\nimport Typography from '@mui/material/Typography';\nimport {Bar, BarChart, LabelList, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';\n\nimport {useFormatters} from '@/toolkit/useFormatters.js';\nimport ChartTooltip from '@/ui/metrics/ChartTooltip.jsx';\nimport TableToggle, {CHART_VIEW} from '@/ui/metrics/TableToggle.jsx';\nimport {BAR_MIN_POINT_SIZE, barLabelValueOf} from '@/ui/metrics/barListLabels.js';\nimport {useChartColors} from '@/ui/metrics/chartParts.jsx';\n\nconst ROW_HEIGHT_PIXELS = 36;\n\n/**\n * El valor en la punta: el número fuerte y el detalle (\"de 8\") tenue; value es {value, detail} de barLabelValueOf. colors y\n * formatNumber: los de useChartColors y useFormatters (los da BarList: este pedazo lo pinta recharts por su cuenta).\n */\nfunction ValueLabel({x, y, width, height, value, colors, formatNumber}) {\n return (\n <text x={x + width + 8} y={y + height / 2} dominantBaseline=\"central\" fontSize={13}>\n <tspan fill={colors.text} fontWeight={600}>{formatNumber(value.value)}</tspan>\n {value.detail && <tspan fill={colors.muted} fontSize={12}>{` ${value.detail}`}</tspan>}\n </text>\n );\n}\n\n/**\n * @param {object} props\n * @param {Array<{key: string, label: string, value: number, detail?: string, tooltip?: string}>} props.items\n * @param {(item: any) => void} [props.onSelect] recibe el renglón de items que se picó\n * @param {string} props.emptyLabel ya traducido\n * @param {'primary'|'success'|'warning'|'error'|'info'} [props.tone]\n * @param {'chart'|'table'} [props.defaultView] cómo se ve al abrir (CHART_VIEW); por omisión dibujada\n * @param {(view: 'chart'|'table') => void} [props.onViewChange] la persona cambió a la tabla o a la gráfica\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nexport default function BarList({items, onSelect, emptyLabel, tone = 'primary', texts, defaultView = CHART_VIEW.chart, onViewChange}) {\n const [asTable, setAsTable] = useState(defaultView === CHART_VIEW.table);\n const toggleView = () => {\n setAsTable(!asTable);\n onViewChange?.(asTable ? CHART_VIEW.chart : CHART_VIEW.table);\n };\n const colors = useChartColors();\n const {formatNumber} = useFormatters();\n\n // guard clause: sin datos se dice, no se pinta un eje vacío\n if (!items.length) {\n return <Typography variant=\"body2\" color=\"text.secondary\">{emptyLabel}</Typography>;\n }\n\n // lo más largo de la etiqueta decide el ancho del eje: sin esto el nombre se corta o sobra medio contenedor\n // OJO: String(... ?? '') porque un renglón sin nombre (catálogo dado de baja) tumbaba toda la gráfica\n // OJO: 220 px de tope. Con 160 se cortaban etiquetas largas («Cuenta pendiente de activar») sin puntos suspensivos\n // ni forma de leerlas; el tooltip de la barra sigue mostrando el texto completo\n const labelWidth = Math.min(220, 16 + Math.max(...items.map((item) => String(item.label ?? '').length)) * 7);\n const longestValue = Math.max(...items.map((item) => `${formatNumber(item.value)} ${item.detail ?? ''}`.length));\n\n return (\n <Box>\n <TableToggle asTable={asTable} onToggle={toggleView} texts={texts} />\n {asTable ? (\n <Table size=\"small\">\n <TableBody>\n {items.map((item) => (\n <TableRow key={item.key} hover={Boolean(onSelect)} onClick={onSelect ? () => onSelect(item) : undefined}\n sx={{cursor: onSelect ? 'pointer' : 'default'}}>\n <TableCell>{item.label}</TableCell>\n <TableCell align=\"right\">{formatNumber(item.value)} {item.detail}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n ) : (\n <Box sx={{height: items.length * ROW_HEIGHT_PIXELS, color: `${tone}.main`}}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart data={items} layout=\"vertical\" margin={{top: 0, bottom: 0, left: 0, right: 16 + longestValue * 7}}>\n {/* OJO: con todo en 0 el dominio [0, 0] manda el 0 a la MITAD del eje (escala degenerada de d3) y la\n barra de 1 px con su «0 de 2» saldría a medio renglón; el tope mínimo de 1 lo deja en el origen */}\n <XAxis type=\"number\" hide domain={[0, (dataMax) => Math.max(dataMax, 1)]} />\n <YAxis type=\"category\" dataKey=\"label\" width={labelWidth} tickLine={false} axisLine={false}\n tick={{fill: colors.text, fontSize: 13}} />\n <Tooltip cursor={{fill: colors.hover}}\n content={<ChartTooltip render={(item) => item.tooltip ?? `${item.label}: ${formatNumber(item.value)}`} />} />\n <Bar dataKey=\"value\" fill=\"currentColor\" maxBarSize={16} radius={[0, 4, 4, 0]} isAnimationActive={false}\n minPointSize={BAR_MIN_POINT_SIZE} cursor={onSelect ? 'pointer' : 'default'}\n onClick={onSelect ? (entry) => onSelect(entry.payload) : undefined}>\n {/* OJO: SIN dataKey; con dataKey LabelList ignora valueAccessor y regresa el índice corrido */}\n <LabelList valueAccessor={barLabelValueOf} content={(labelProps) => <ValueLabel {...labelProps} colors={colors} formatNumber={formatNumber} />} />\n </Bar>\n </BarChart>\n </ResponsiveContainer>\n </Box>\n )}\n </Box>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ "use client";
2
+ import { jsxs, jsx } from "react/jsx-runtime";
3
+ import { useState, useMemo } from "react";
4
+ import { useToolkitTranslation } from "../../toolkit/useToolkitTranslation.js";
5
+ import Box from "@mui/material/Box";
6
+ import Stack from "@mui/material/Stack";
7
+ import Table from "@mui/material/Table";
8
+ import TableBody from "@mui/material/TableBody";
9
+ import TableCell from "@mui/material/TableCell";
10
+ import TableHead from "@mui/material/TableHead";
11
+ import TableRow from "@mui/material/TableRow";
12
+ import Tooltip from "@mui/material/Tooltip";
13
+ import Typography from "@mui/material/Typography";
14
+ import { useFormatters } from "../../toolkit/useFormatters.js";
15
+ import { calendarWeeksOf, levelOf, HEATMAP_LEVELS } from "./heatmapScale.js";
16
+ import TableToggle, { CHART_VIEW } from "./TableToggle.js";
17
+ const CELL_PIXELS = { xs: 12, md: 16 };
18
+ const GAP_PIXELS = 3;
19
+ const LABELED_WEEKDAYS = /* @__PURE__ */ new Set([1, 3, 5]);
20
+ const LEVEL_TONE_PERCENT = { 1: 30, 2: 55, 3: 78, 4: 100 };
21
+ function levelFill(theme, tone, level) {
22
+ const { palette } = theme.vars ?? theme;
23
+ if (level === 0) {
24
+ return palette.action.hover;
25
+ }
26
+ return `color-mix(in srgb, ${palette[tone].main} ${LEVEL_TONE_PERCENT[level]}%, transparent)`;
27
+ }
28
+ function CalendarHeatmap({ startsOn, endsOn, days, ariaLabel, valueLabel, describeValue, summary, emptyLabel, tone = "primary", texts, defaultView = CHART_VIEW.chart, onViewChange }) {
29
+ const { t } = useToolkitTranslation("common", texts);
30
+ const { formatDate, formatMonthShortName, formatNumber, formatWeekdayShortName } = useFormatters();
31
+ const [asTable, setAsTable] = useState(defaultView === CHART_VIEW.table);
32
+ const toggleView = () => {
33
+ setAsTable(!asTable);
34
+ onViewChange?.(asTable ? CHART_VIEW.chart : CHART_VIEW.table);
35
+ };
36
+ const { weeks, monthMarks, thresholds } = useMemo(() => calendarWeeksOf({ startsOn, endsOn, days }), [startsOn, endsOn, days]);
37
+ const activeDays = days.filter((day) => day.value > 0);
38
+ return /* @__PURE__ */ jsxs(Box, { children: [
39
+ /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 2, sx: { justifyContent: "space-between", alignItems: "center", mb: 1 }, children: [
40
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: activeDays.length ? summary : emptyLabel }),
41
+ /* @__PURE__ */ jsx(Box, { sx: { flexShrink: 0 }, children: /* @__PURE__ */ jsx(TableToggle, { asTable, onToggle: toggleView, texts }) })
42
+ ] }),
43
+ asTable ? /* @__PURE__ */ jsx(Box, { sx: { maxHeight: 260, overflowY: "auto" }, children: /* @__PURE__ */ jsxs(Table, { size: "small", "aria-label": ariaLabel, children: [
44
+ /* @__PURE__ */ jsx(TableHead, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
45
+ /* @__PURE__ */ jsx(TableCell, { children: t("charts.day") }),
46
+ /* @__PURE__ */ jsx(TableCell, { align: "right", children: valueLabel }),
47
+ /* @__PURE__ */ jsx(TableCell, {})
48
+ ] }) }),
49
+ /* @__PURE__ */ jsx(TableBody, { children: [...activeDays].reverse().map((day) => /* @__PURE__ */ jsxs(TableRow, { children: [
50
+ /* @__PURE__ */ jsx(TableCell, { sx: { whiteSpace: "nowrap" }, children: formatDate(day.date) }),
51
+ /* @__PURE__ */ jsx(TableCell, { align: "right", sx: { fontVariantNumeric: "tabular-nums" }, children: formatNumber(day.value) }),
52
+ /* @__PURE__ */ jsx(TableCell, { sx: { color: "text.secondary" }, children: day.detail })
53
+ ] }, day.date)) })
54
+ ] }) }) : (
55
+ // el calendario no se encoge: en pantallas angostas se desliza y arranca mostrando lo más reciente
56
+ /* @__PURE__ */ jsx(
57
+ Box,
58
+ {
59
+ sx: { overflowX: "auto", pb: 0.5 },
60
+ ref: (node) => {
61
+ if (node) {
62
+ node.scrollLeft = node.scrollWidth;
63
+ }
64
+ },
65
+ children: /* @__PURE__ */ jsxs(
66
+ Box,
67
+ {
68
+ role: "img",
69
+ "aria-label": ariaLabel,
70
+ sx: {
71
+ display: "inline-grid",
72
+ gridTemplateColumns: {
73
+ xs: `auto repeat(${weeks.length}, ${CELL_PIXELS.xs}px)`,
74
+ md: `auto repeat(${weeks.length}, ${CELL_PIXELS.md}px)`
75
+ },
76
+ columnGap: `${GAP_PIXELS}px`,
77
+ rowGap: `${GAP_PIXELS}px`,
78
+ alignItems: "center"
79
+ },
80
+ children: [
81
+ /* @__PURE__ */ jsx(Box, {}),
82
+ monthMarks.map((month, column) => /* @__PURE__ */ jsx(
83
+ Typography,
84
+ {
85
+ variant: "caption",
86
+ color: "text.secondary",
87
+ sx: { fontSize: 10, lineHeight: 1, whiteSpace: "nowrap", overflow: "visible", width: CELL_PIXELS },
88
+ children: month ? formatMonthShortName(month) : ""
89
+ },
90
+ `month-${column}`
91
+ )),
92
+ [1, 2, 3, 4, 5, 6, 7].map((isoWeekday) => /* @__PURE__ */ jsxs(Box, { sx: { display: "contents" }, children: [
93
+ /* @__PURE__ */ jsx(
94
+ Typography,
95
+ {
96
+ variant: "caption",
97
+ color: "text.secondary",
98
+ sx: { fontSize: 10, lineHeight: { xs: `${CELL_PIXELS.xs}px`, md: `${CELL_PIXELS.md}px` }, pr: 0.75 },
99
+ children: LABELED_WEEKDAYS.has(isoWeekday) ? formatWeekdayShortName(isoWeekday) : ""
100
+ }
101
+ ),
102
+ weeks.map((week, column) => {
103
+ const day = week[isoWeekday - 1];
104
+ if (!day) {
105
+ return /* @__PURE__ */ jsx(Box, {}, `outside-${column}-${isoWeekday}`);
106
+ }
107
+ const level = levelOf(day.value, thresholds);
108
+ return /* @__PURE__ */ jsx(
109
+ Tooltip,
110
+ {
111
+ arrow: true,
112
+ disableInteractive: true,
113
+ title: `${formatDate(day.date)}: ${describeValue(day.value)}${day.detail ? ` · ${day.detail}` : ""}`,
114
+ children: /* @__PURE__ */ jsx(Box, { sx: (theme) => ({ width: CELL_PIXELS, height: CELL_PIXELS, borderRadius: "3px", bgcolor: levelFill(theme, tone, level) }) })
115
+ },
116
+ day.date
117
+ );
118
+ })
119
+ ] }, `weekday-${isoWeekday}`))
120
+ ]
121
+ }
122
+ )
123
+ }
124
+ )
125
+ ),
126
+ !asTable && /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 0.5, sx: { alignItems: "center", justifyContent: "flex-end", mt: 1 }, "aria-hidden": "true", children: [
127
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "text.secondary", sx: { mr: 0.5 }, children: t("charts.less") }),
128
+ HEATMAP_LEVELS.map((level) => /* @__PURE__ */ jsx(Box, { sx: (theme) => ({ width: CELL_PIXELS, height: CELL_PIXELS, borderRadius: "3px", bgcolor: levelFill(theme, tone, level) }) }, level)),
129
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "text.secondary", sx: { ml: 0.5 }, children: t("charts.more") })
130
+ ] })
131
+ ] });
132
+ }
133
+ export {
134
+ CalendarHeatmap as default
135
+ };
136
+ //# sourceMappingURL=CalendarHeatmap.js.map