@stackcraftmx/calcita 0.0.0-stage → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (841) hide show
  1. package/LICENSE +110 -0
  2. package/README.md +611 -2
  3. package/cli/askQuestions.js +63 -0
  4. package/cli/calcita.js +150 -0
  5. package/cli/makeComponent.js +50 -0
  6. package/cli/makeForm.js +68 -0
  7. package/cli/makeModule.js +78 -0
  8. package/cli/makePage.js +62 -0
  9. package/cli/names.js +64 -0
  10. package/cli/newProject.js +103 -0
  11. package/cli/packageVersions.js +38 -0
  12. package/cli/projectAnswers.js +145 -0
  13. package/cli/projectConfig.js +38 -0
  14. package/cli/projectFiles.js +126 -0
  15. package/cli/screenLabels.js +41 -0
  16. package/cli/templateFiles.js +186 -0
  17. package/cli/templates/component/core/__ComponentName__.jsx.tpl +23 -0
  18. package/cli/templates/component/module/__ComponentName__.jsx.tpl +21 -0
  19. package/cli/templates/form/formik/__FormName__.jsx.tpl +50 -0
  20. package/cli/templates/form/hookForm/__FormName__.jsx.tpl +53 -0
  21. package/cli/templates/form/shared/__formName__Schema.js.tpl +20 -0
  22. package/cli/templates/form/shared/__formName__Texts.js.tpl +6 -0
  23. package/cli/templates/module/__Name__Page.jsx.tpl +75 -0
  24. package/cli/templates/module/__name__Api.js.tpl +39 -0
  25. package/cli/templates/module/__name__Texts.js.tpl +27 -0
  26. package/cli/templates/module/menu.js.tpl +21 -0
  27. package/cli/templates/module/routes.js.tpl +7 -0
  28. package/cli/templates/moduleServer/__name__Server.js.tpl +68 -0
  29. package/cli/templates/page/__PageName__Page.jsx.tpl +22 -0
  30. package/cli/templates/page/__pageName__PageTexts.js.tpl +23 -0
  31. package/cli/templates/project/README.md.tpl +55 -0
  32. package/cli/templates/project/dot-gitignore.tpl +11 -0
  33. package/cli/templates/project/index.html.tpl +20 -0
  34. package/cli/templates/project/jsconfig.json.tpl +16 -0
  35. package/cli/templates/project/pnpm-workspace.yaml.tpl +5 -0
  36. package/cli/templates/project/public/favicon.svg +1 -0
  37. package/cli/templates/project/public/icons/apple-touch-icon.png +0 -0
  38. package/cli/templates/project/public/icons/icon-192.png +0 -0
  39. package/cli/templates/project/public/icons/icon-512-maskable.png +0 -0
  40. package/cli/templates/project/public/icons/icon-512.png +0 -0
  41. package/cli/templates/project/public/manifest.webmanifest.tpl +17 -0
  42. package/cli/templates/project/src/app/AppProviders.jsx.tpl +102 -0
  43. package/cli/templates/project/src/app/AppShell.jsx.tpl +87 -0
  44. package/cli/templates/project/src/app/appRouter.jsx.tpl +49 -0
  45. package/cli/templates/project/src/app/appSettings.js.tpl +13 -0
  46. package/cli/templates/project/src/app/appTexts.js.tpl +15 -0
  47. package/cli/templates/project/src/app/combineTexts.js.tpl +31 -0
  48. package/cli/templates/project/src/app/i18n.js.tpl +19 -0
  49. package/cli/templates/project/src/app/shellTexts.js.tpl +16 -0
  50. package/cli/templates/project/src/core/AppLogo.jsx.tpl +12 -0
  51. package/cli/templates/project/src/core/accountConnector.js.tpl +36 -0
  52. package/cli/templates/project/src/core/apiClient.js.tpl +15 -0
  53. package/cli/templates/project/src/core/appPaths.js.tpl +11 -0
  54. package/cli/templates/project/src/core/index.js.tpl +8 -0
  55. package/cli/templates/project/src/fakeServer/networkDelay.js.tpl +40 -0
  56. package/cli/templates/project/src/fakeServer/serverText.js.tpl +20 -0
  57. package/cli/templates/project/src/main.jsx.tpl +24 -0
  58. package/cli/templates/project/src/modules/auth/ForgotPasswordPage.jsx.tpl +14 -0
  59. package/cli/templates/project/src/modules/auth/ResetPasswordPage.jsx.tpl +15 -0
  60. package/cli/templates/project/src/modules/auth/SignInPage.jsx.tpl +29 -0
  61. package/cli/templates/project/src/modules/auth/authTexts.js.tpl +6 -0
  62. package/cli/templates/project/src/modules/auth/routes.js.tpl +11 -0
  63. package/cli/templates/project/src/modules/home/HomePage.jsx.tpl +38 -0
  64. package/cli/templates/project/src/modules/home/homeTexts.js.tpl +29 -0
  65. package/cli/templates/project/src/modules/home/menu.js.tpl +17 -0
  66. package/cli/templates/project/src/modules/home/routes.js.tpl +4 -0
  67. package/cli/templates/project/src/modules/profile/ProfilePage.jsx.tpl +13 -0
  68. package/cli/templates/project/src/modules/profile/routes.js.tpl +6 -0
  69. package/cli/templates/project/vite.config.js.tpl +27 -0
  70. package/dist/DataTable/AuditTrailDialog.js +40 -0
  71. package/dist/DataTable/AuditTrailDialog.js.map +1 -0
  72. package/dist/DataTable/AuditTrailTable.js +87 -0
  73. package/dist/DataTable/AuditTrailTable.js.map +1 -0
  74. package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js +71 -0
  75. package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js.map +1 -0
  76. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js +50 -0
  77. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js.map +1 -0
  78. package/dist/DataTable/ColumnFilters/SortableFilterHeader.js +54 -0
  79. package/dist/DataTable/ColumnFilters/SortableFilterHeader.js.map +1 -0
  80. package/dist/DataTable/ColumnFilters/TextColumnFilter.js +24 -0
  81. package/dist/DataTable/ColumnFilters/TextColumnFilter.js.map +1 -0
  82. package/dist/DataTable/EmptyState.js +22 -0
  83. package/dist/DataTable/EmptyState.js.map +1 -0
  84. package/dist/DataTable/FilterChips.js +39 -0
  85. package/dist/DataTable/FilterChips.js.map +1 -0
  86. package/dist/DataTable/GoToPage.js +62 -0
  87. package/dist/DataTable/GoToPage.js.map +1 -0
  88. package/dist/DataTable/ServerTable.js +407 -0
  89. package/dist/DataTable/ServerTable.js.map +1 -0
  90. package/dist/DataTable/buildChipConfig.js +27 -0
  91. package/dist/DataTable/buildChipConfig.js.map +1 -0
  92. package/dist/DataTable/columns.js +122 -0
  93. package/dist/DataTable/columns.js.map +1 -0
  94. package/dist/DataTable/filterContext.js +15 -0
  95. package/dist/DataTable/filterContext.js.map +1 -0
  96. package/dist/DataTable/serverTableParams.js +19 -0
  97. package/dist/DataTable/serverTableParams.js.map +1 -0
  98. package/dist/DataTable/tableMachine.js +87 -0
  99. package/dist/DataTable/tableMachine.js.map +1 -0
  100. package/dist/DataTable/useDebouncedFilter.js +29 -0
  101. package/dist/DataTable/useDebouncedFilter.js.map +1 -0
  102. package/dist/DataTable/useTableState.js +132 -0
  103. package/dist/DataTable/useTableState.js.map +1 -0
  104. package/dist/access/Can.js +9 -0
  105. package/dist/access/Can.js.map +1 -0
  106. package/dist/access/PermissionMatrix.js +83 -0
  107. package/dist/access/PermissionMatrix.js.map +1 -0
  108. package/dist/access/RequireAccess.js +14 -0
  109. package/dist/access/RequireAccess.js.map +1 -0
  110. package/dist/access/accessRules.js +49 -0
  111. package/dist/access/accessRules.js.map +1 -0
  112. package/dist/access/permissionGroups.js +43 -0
  113. package/dist/access/permissionGroups.js.map +1 -0
  114. package/dist/access/useCan.js +12 -0
  115. package/dist/access/useCan.js.map +1 -0
  116. package/dist/account/AccountProvider.js +58 -0
  117. package/dist/account/AccountProvider.js.map +1 -0
  118. package/dist/account/AccountSecuritySection.js +81 -0
  119. package/dist/account/AccountSecuritySection.js.map +1 -0
  120. package/dist/account/DemoTotpCodeButton.js +26 -0
  121. package/dist/account/DemoTotpCodeButton.js.map +1 -0
  122. package/dist/account/ForgotPasswordScreen.js +26 -0
  123. package/dist/account/ForgotPasswordScreen.js.map +1 -0
  124. package/dist/account/ProfileScreen.js +108 -0
  125. package/dist/account/ProfileScreen.js.map +1 -0
  126. package/dist/account/ResetPasswordScreen.js +57 -0
  127. package/dist/account/ResetPasswordScreen.js.map +1 -0
  128. package/dist/account/SignInScreen.js +101 -0
  129. package/dist/account/SignInScreen.js.map +1 -0
  130. package/dist/account/accountConnector.js +31 -0
  131. package/dist/account/accountConnector.js.map +1 -0
  132. package/dist/account/demo/createDemoAccountConnector.js +368 -0
  133. package/dist/account/demo/createDemoAccountConnector.js.map +1 -0
  134. package/dist/account/demo/totp.js +61 -0
  135. package/dist/account/demo/totp.js.map +1 -0
  136. package/dist/account/restAccountConnector.js +117 -0
  137. package/dist/account/restAccountConnector.js.map +1 -0
  138. package/dist/account-demo.js +12 -0
  139. package/dist/account-demo.js.map +1 -0
  140. package/dist/account.js +25 -0
  141. package/dist/account.js.map +1 -0
  142. package/dist/adapters/i18next.js +7 -0
  143. package/dist/adapters/i18next.js.map +1 -0
  144. package/dist/adapters/nextNavigation.js +36 -0
  145. package/dist/adapters/nextNavigation.js.map +1 -0
  146. package/dist/adapters/reactRouter.js +7 -0
  147. package/dist/adapters/reactRouter.js.map +1 -0
  148. package/dist/adapters/reactRouterRoutes.js +48 -0
  149. package/dist/adapters/reactRouterRoutes.js.map +1 -0
  150. package/dist/api/ApiError.js +58 -0
  151. package/dist/api/ApiError.js.map +1 -0
  152. package/dist/api/createApiClient.js +226 -0
  153. package/dist/api/createApiClient.js.map +1 -0
  154. package/dist/api/staleChunks.js +47 -0
  155. package/dist/api/staleChunks.js.map +1 -0
  156. package/dist/appShell/AccountMenu.js +86 -0
  157. package/dist/appShell/AccountMenu.js.map +1 -0
  158. package/dist/appShell/AppLayout.js +493 -0
  159. package/dist/appShell/AppLayout.js.map +1 -0
  160. package/dist/appShell/AppearanceSettings.js +93 -0
  161. package/dist/appShell/AppearanceSettings.js.map +1 -0
  162. package/dist/appShell/AuthLayout.js +44 -0
  163. package/dist/appShell/AuthLayout.js.map +1 -0
  164. package/dist/appShell/BarActionButton.js +31 -0
  165. package/dist/appShell/BarActionButton.js.map +1 -0
  166. package/dist/appShell/BarActions.js +94 -0
  167. package/dist/appShell/BarActions.js.map +1 -0
  168. package/dist/appShell/BarCapsule.js +35 -0
  169. package/dist/appShell/BarCapsule.js.map +1 -0
  170. package/dist/appShell/HeaderTools.js +53 -0
  171. package/dist/appShell/HeaderTools.js.map +1 -0
  172. package/dist/appShell/MobileTabBar.js +346 -0
  173. package/dist/appShell/MobileTabBar.js.map +1 -0
  174. package/dist/appShell/SettingsMenu.js +41 -0
  175. package/dist/appShell/SettingsMenu.js.map +1 -0
  176. package/dist/appShell/SideMenu.js +217 -0
  177. package/dist/appShell/SideMenu.js.map +1 -0
  178. package/dist/appShell/SideMenuEntry.js +140 -0
  179. package/dist/appShell/SideMenuEntry.js.map +1 -0
  180. package/dist/appShell/SubmenuActionsMenu.js +71 -0
  181. package/dist/appShell/SubmenuActionsMenu.js.map +1 -0
  182. package/dist/appShell/TabBarEditor.js +55 -0
  183. package/dist/appShell/TabBarEditor.js.map +1 -0
  184. package/dist/appShell/TopMenu.js +80 -0
  185. package/dist/appShell/TopMenu.js.map +1 -0
  186. package/dist/appShell/appMenuContext.js +11 -0
  187. package/dist/appShell/appMenuContext.js.map +1 -0
  188. package/dist/appShell/barActionsSlot.js +26 -0
  189. package/dist/appShell/barActionsSlot.js.map +1 -0
  190. package/dist/appShell/barMenuPlacement.js +33 -0
  191. package/dist/appShell/barMenuPlacement.js.map +1 -0
  192. package/dist/appShell/menuItemText.js +33 -0
  193. package/dist/appShell/menuItemText.js.map +1 -0
  194. package/dist/appShell/pageTitle.js +45 -0
  195. package/dist/appShell/pageTitle.js.map +1 -0
  196. package/dist/appShell/shellSizes.js +38 -0
  197. package/dist/appShell/shellSizes.js.map +1 -0
  198. package/dist/appShell/tabBarRule.js +12 -0
  199. package/dist/appShell/tabBarRule.js.map +1 -0
  200. package/dist/appShell/tabBarScroll.js +23 -0
  201. package/dist/appShell/tabBarScroll.js.map +1 -0
  202. package/dist/appShell/useDrawerCollapsed.js +29 -0
  203. package/dist/appShell/useDrawerCollapsed.js.map +1 -0
  204. package/dist/appShell/useFittingActionCount.js +45 -0
  205. package/dist/appShell/useFittingActionCount.js.map +1 -0
  206. package/dist/appShell/usePinnedMobileTabs.js +32 -0
  207. package/dist/appShell/usePinnedMobileTabs.js.map +1 -0
  208. package/dist/appShell/useTabBarMinimized.js +33 -0
  209. package/dist/appShell/useTabBarMinimized.js.map +1 -0
  210. package/dist/auth/PasswordChecklist.js +44 -0
  211. package/dist/auth/PasswordChecklist.js.map +1 -0
  212. package/dist/auth/passwordRules.js +43 -0
  213. package/dist/auth/passwordRules.js.map +1 -0
  214. package/dist/calendar/EventCalendar.js +138 -0
  215. package/dist/calendar/EventCalendar.js.map +1 -0
  216. package/dist/calendar.js +6 -0
  217. package/dist/calendar.js.map +1 -0
  218. package/dist/charts.js +7 -0
  219. package/dist/charts.js.map +1 -0
  220. package/dist/date-pickers.js +8 -0
  221. package/dist/date-pickers.js.map +1 -0
  222. package/dist/datePickers/DateInput.js +75 -0
  223. package/dist/datePickers/DateInput.js.map +1 -0
  224. package/dist/datePickers/FormDateField.js +12 -0
  225. package/dist/datePickers/FormDateField.js.map +1 -0
  226. package/dist/dates.js +25 -0
  227. package/dist/dates.js.map +1 -0
  228. package/dist/dictionaries/dictionaries.js +48 -0
  229. package/dist/dictionaries/dictionaries.js.map +1 -0
  230. package/dist/downloads/DownloadManager.js +201 -0
  231. package/dist/downloads/DownloadManager.js.map +1 -0
  232. package/dist/downloads/downloadQueue.js +54 -0
  233. package/dist/downloads/downloadQueue.js.map +1 -0
  234. package/dist/downloads/downloadsMachine.js +77 -0
  235. package/dist/downloads/downloadsMachine.js.map +1 -0
  236. package/dist/excel/reportWorkbook.js +299 -0
  237. package/dist/excel/reportWorkbook.js.map +1 -0
  238. package/dist/excel.js +13 -0
  239. package/dist/excel.js.map +1 -0
  240. package/dist/feedback/ConfirmDialog.js +72 -0
  241. package/dist/feedback/ConfirmDialog.js.map +1 -0
  242. package/dist/feedback/ModalWaiting.js +23 -0
  243. package/dist/feedback/ModalWaiting.js.map +1 -0
  244. package/dist/feedback/NewBuildNotice.js +79 -0
  245. package/dist/feedback/NewBuildNotice.js.map +1 -0
  246. package/dist/feedback/StaleBuildBoundary.js +36 -0
  247. package/dist/feedback/StaleBuildBoundary.js.map +1 -0
  248. package/dist/feedback/Toaster.js +20 -0
  249. package/dist/feedback/Toaster.js.map +1 -0
  250. package/dist/feedback/confirmActionMachine.js +67 -0
  251. package/dist/feedback/confirmActionMachine.js.map +1 -0
  252. package/dist/feedback/toast.js +88 -0
  253. package/dist/feedback/toast.js.map +1 -0
  254. package/dist/feedback/useConfirmAction.js +40 -0
  255. package/dist/feedback/useConfirmAction.js.map +1 -0
  256. package/dist/filepond/FileDropzone.js +254 -0
  257. package/dist/filepond/FileDropzone.js.map +1 -0
  258. package/dist/filepond/pondServer.js +48 -0
  259. package/dist/filepond/pondServer.js.map +1 -0
  260. package/dist/filepond.js +10 -0
  261. package/dist/filepond.js.map +1 -0
  262. package/dist/files.js +43 -0
  263. package/dist/files.js.map +1 -0
  264. package/dist/formatting.js +177 -0
  265. package/dist/formatting.js.map +1 -0
  266. package/dist/forms/FormCatalogField.js +12 -0
  267. package/dist/forms/FormCatalogField.js.map +1 -0
  268. package/dist/forms/FormColorField.js +12 -0
  269. package/dist/forms/FormColorField.js.map +1 -0
  270. package/dist/forms/FormNumberField.js +12 -0
  271. package/dist/forms/FormNumberField.js.map +1 -0
  272. package/dist/forms/FormProblemAlert.js +15 -0
  273. package/dist/forms/FormProblemAlert.js.map +1 -0
  274. package/dist/forms/FormSelectField.js +12 -0
  275. package/dist/forms/FormSelectField.js.map +1 -0
  276. package/dist/forms/FormServerProblem.js +23 -0
  277. package/dist/forms/FormServerProblem.js.map +1 -0
  278. package/dist/forms/FormTextField.js +12 -0
  279. package/dist/forms/FormTextField.js.map +1 -0
  280. package/dist/forms/FormWizard.js +90 -0
  281. package/dist/forms/FormWizard.js.map +1 -0
  282. package/dist/forms/SubmitButton.js +14 -0
  283. package/dist/forms/SubmitButton.js.map +1 -0
  284. package/dist/forms/applyServerProblem.js +15 -0
  285. package/dist/forms/applyServerProblem.js.map +1 -0
  286. package/dist/forms/auth/ChangePasswordForm.js +46 -0
  287. package/dist/forms/auth/ChangePasswordForm.js.map +1 -0
  288. package/dist/forms/auth/ForgotPasswordForm.js +50 -0
  289. package/dist/forms/auth/ForgotPasswordForm.js.map +1 -0
  290. package/dist/forms/auth/SignInForm.js +48 -0
  291. package/dist/forms/auth/SignInForm.js.map +1 -0
  292. package/dist/forms/security/SecondStepForm.js +122 -0
  293. package/dist/forms/security/SecondStepForm.js.map +1 -0
  294. package/dist/forms/security/TwoStepVerificationCard.js +336 -0
  295. package/dist/forms/security/TwoStepVerificationCard.js.map +1 -0
  296. package/dist/forms/security/securityRules.js +28 -0
  297. package/dist/forms/security/securityRules.js.map +1 -0
  298. package/dist/forms/serverProblemFields.js +25 -0
  299. package/dist/forms/serverProblemFields.js.map +1 -0
  300. package/dist/forms/useFormikField.js +16 -0
  301. package/dist/forms/useFormikField.js.map +1 -0
  302. package/dist/forms/validation.js +55 -0
  303. package/dist/forms/validation.js.map +1 -0
  304. package/dist/forms/validationMessages.js +16 -0
  305. package/dist/forms/validationMessages.js.map +1 -0
  306. package/dist/forms.js +57 -0
  307. package/dist/forms.js.map +1 -0
  308. package/dist/hookForm/FormCatalogField.js +12 -0
  309. package/dist/hookForm/FormCatalogField.js.map +1 -0
  310. package/dist/hookForm/FormColorField.js +12 -0
  311. package/dist/hookForm/FormColorField.js.map +1 -0
  312. package/dist/hookForm/FormNumberField.js +12 -0
  313. package/dist/hookForm/FormNumberField.js.map +1 -0
  314. package/dist/hookForm/FormProblemAlert.js +17 -0
  315. package/dist/hookForm/FormProblemAlert.js.map +1 -0
  316. package/dist/hookForm/FormSelectField.js +12 -0
  317. package/dist/hookForm/FormSelectField.js.map +1 -0
  318. package/dist/hookForm/FormTextField.js +12 -0
  319. package/dist/hookForm/FormTextField.js.map +1 -0
  320. package/dist/hookForm/SubmitButton.js +15 -0
  321. package/dist/hookForm/SubmitButton.js.map +1 -0
  322. package/dist/hookForm/applyServerProblem.js +21 -0
  323. package/dist/hookForm/applyServerProblem.js.map +1 -0
  324. package/dist/hookForm/useHookFormField.js +19 -0
  325. package/dist/hookForm/useHookFormField.js.map +1 -0
  326. package/dist/i18next.js +5 -0
  327. package/dist/i18next.js.map +1 -0
  328. package/dist/identifiers.js +8 -0
  329. package/dist/identifiers.js.map +1 -0
  330. package/dist/inbox/InboxLayout.js +68 -0
  331. package/dist/inbox/InboxLayout.js.map +1 -0
  332. package/dist/inbox/MessageList.js +64 -0
  333. package/dist/inbox/MessageList.js.map +1 -0
  334. package/dist/inbox/MessageView.js +53 -0
  335. package/dist/inbox/MessageView.js.map +1 -0
  336. package/dist/inbox/inboxDates.js +8 -0
  337. package/dist/inbox/inboxDates.js.map +1 -0
  338. package/dist/index.js +383 -0
  339. package/dist/index.js.map +1 -0
  340. package/dist/inputs/CatalogInput.js +62 -0
  341. package/dist/inputs/CatalogInput.js.map +1 -0
  342. package/dist/inputs/ColorInput.js +108 -0
  343. package/dist/inputs/ColorInput.js.map +1 -0
  344. package/dist/inputs/FieldFrame.js +20 -0
  345. package/dist/inputs/FieldFrame.js.map +1 -0
  346. package/dist/inputs/FormSection.js +105 -0
  347. package/dist/inputs/FormSection.js.map +1 -0
  348. package/dist/inputs/NumberInput.js +69 -0
  349. package/dist/inputs/NumberInput.js.map +1 -0
  350. package/dist/inputs/SelectInput.js +66 -0
  351. package/dist/inputs/SelectInput.js.map +1 -0
  352. package/dist/inputs/TextInput.js +97 -0
  353. package/dist/inputs/TextInput.js.map +1 -0
  354. package/dist/inputs/colorContrast.js +46 -0
  355. package/dist/inputs/colorContrast.js.map +1 -0
  356. package/dist/inputs/formLayoutContext.js +9 -0
  357. package/dist/inputs/formLayoutContext.js.map +1 -0
  358. package/dist/inputs/numberText.js +48 -0
  359. package/dist/inputs/numberText.js.map +1 -0
  360. package/dist/kanban/KanbanBoard.js +113 -0
  361. package/dist/kanban/KanbanBoard.js.map +1 -0
  362. package/dist/kanban/kanbanMoves.js +29 -0
  363. package/dist/kanban/kanbanMoves.js.map +1 -0
  364. package/dist/kanban.js +9 -0
  365. package/dist/kanban.js.map +1 -0
  366. package/dist/laravel/csrfRetry.js +18 -0
  367. package/dist/laravel/csrfRetry.js.map +1 -0
  368. package/dist/laravel.js +6 -0
  369. package/dist/laravel.js.map +1 -0
  370. package/dist/lastListUrl.js +35 -0
  371. package/dist/lastListUrl.js.map +1 -0
  372. package/dist/locales/en.js +714 -0
  373. package/dist/locales/en.js.map +1 -0
  374. package/dist/locales/es.js +714 -0
  375. package/dist/locales/es.js.map +1 -0
  376. package/dist/maps/MapView.js +96 -0
  377. package/dist/maps/MapView.js.map +1 -0
  378. package/dist/maps/mapMarkers.js +19 -0
  379. package/dist/maps/mapMarkers.js.map +1 -0
  380. package/dist/maps.js +10 -0
  381. package/dist/maps.js.map +1 -0
  382. package/dist/money/money.js +380 -0
  383. package/dist/money/money.js.map +1 -0
  384. package/dist/money.js +6 -0
  385. package/dist/money.js.map +1 -0
  386. package/dist/navigation/appMenu.js +93 -0
  387. package/dist/navigation/appMenu.js.map +1 -0
  388. package/dist/navigation/useMenuBadges.js +45 -0
  389. package/dist/navigation/useMenuBadges.js.map +1 -0
  390. package/dist/navigation.js +30 -0
  391. package/dist/navigation.js.map +1 -0
  392. package/dist/navigationTrail.js +82 -0
  393. package/dist/navigationTrail.js.map +1 -0
  394. package/dist/next.js +5 -0
  395. package/dist/next.js.map +1 -0
  396. package/dist/observability/buildWatch.js +19 -0
  397. package/dist/observability/buildWatch.js.map +1 -0
  398. package/dist/observability/logger.js +43 -0
  399. package/dist/observability/logger.js.map +1 -0
  400. package/dist/observability/publishedBuild.js +39 -0
  401. package/dist/observability/publishedBuild.js.map +1 -0
  402. package/dist/observability/usePublishedBuildWatch.js +76 -0
  403. package/dist/observability/usePublishedBuildWatch.js.map +1 -0
  404. package/dist/passkeys.js +7 -0
  405. package/dist/passkeys.js.map +1 -0
  406. package/dist/periodRanges.js +33 -0
  407. package/dist/periodRanges.js.map +1 -0
  408. package/dist/problems.js +51 -0
  409. package/dist/problems.js.map +1 -0
  410. package/dist/pwa/InstallAppSetting.js +33 -0
  411. package/dist/pwa/InstallAppSetting.js.map +1 -0
  412. package/dist/pwa/InstallInstructionsDialog.js +35 -0
  413. package/dist/pwa/InstallInstructionsDialog.js.map +1 -0
  414. package/dist/pwa/InstallPromptBanner.js +64 -0
  415. package/dist/pwa/InstallPromptBanner.js.map +1 -0
  416. package/dist/pwa/installInstructions.js +60 -0
  417. package/dist/pwa/installInstructions.js.map +1 -0
  418. package/dist/pwa/useInstallPrompt.js +70 -0
  419. package/dist/pwa/useInstallPrompt.js.map +1 -0
  420. package/dist/react-hook-form.js +30 -0
  421. package/dist/react-hook-form.js.map +1 -0
  422. package/dist/react-router.js +10 -0
  423. package/dist/react-router.js.map +1 -0
  424. package/dist/security/ActivityLog.js +79 -0
  425. package/dist/security/ActivityLog.js.map +1 -0
  426. package/dist/security/RecoveryCodesDialog.js +84 -0
  427. package/dist/security/RecoveryCodesDialog.js.map +1 -0
  428. package/dist/security/SessionsCard.js +81 -0
  429. package/dist/security/SessionsCard.js.map +1 -0
  430. package/dist/security/passkeys.js +39 -0
  431. package/dist/security/passkeys.js.map +1 -0
  432. package/dist/table.js +35 -0
  433. package/dist/table.js.map +1 -0
  434. package/dist/theme/androidDevice.js +16 -0
  435. package/dist/theme/androidDevice.js.map +1 -0
  436. package/dist/theme/appleTracking.js +34 -0
  437. package/dist/theme/appleTracking.js.map +1 -0
  438. package/dist/theme/components/MuiAppBar.js +27 -0
  439. package/dist/theme/components/MuiAppBar.js.map +1 -0
  440. package/dist/theme/components/MuiBackdrop.js +13 -0
  441. package/dist/theme/components/MuiBackdrop.js.map +1 -0
  442. package/dist/theme/components/MuiButton.js +25 -0
  443. package/dist/theme/components/MuiButton.js.map +1 -0
  444. package/dist/theme/components/MuiButtonBase.js +16 -0
  445. package/dist/theme/components/MuiButtonBase.js.map +1 -0
  446. package/dist/theme/components/MuiChip.js +30 -0
  447. package/dist/theme/components/MuiChip.js.map +1 -0
  448. package/dist/theme/components/MuiDataGrid.js +30 -0
  449. package/dist/theme/components/MuiDataGrid.js.map +1 -0
  450. package/dist/theme/components/MuiDrawer.js +18 -0
  451. package/dist/theme/components/MuiDrawer.js.map +1 -0
  452. package/dist/theme/components/MuiMenuItem.js +17 -0
  453. package/dist/theme/components/MuiMenuItem.js.map +1 -0
  454. package/dist/theme/components/MuiTypography.js +22 -0
  455. package/dist/theme/components/MuiTypography.js.map +1 -0
  456. package/dist/theme/components/glassComponents.js +885 -0
  457. package/dist/theme/components/glassComponents.js.map +1 -0
  458. package/dist/theme/components/minimalComponents.js +146 -0
  459. package/dist/theme/components/minimalComponents.js.map +1 -0
  460. package/dist/theme/components/paletteOf.js +7 -0
  461. package/dist/theme/components/paletteOf.js.map +1 -0
  462. package/dist/theme/createToolkitTheme.js +100 -0
  463. package/dist/theme/createToolkitTheme.js.map +1 -0
  464. package/dist/theme/glassSurface.js +328 -0
  465. package/dist/theme/glassSurface.js.map +1 -0
  466. package/dist/theme/glassToasterStyles.js +50 -0
  467. package/dist/theme/glassToasterStyles.js.map +1 -0
  468. package/dist/theme/mergeComponents.js +42 -0
  469. package/dist/theme/mergeComponents.js.map +1 -0
  470. package/dist/theme/stackcraftPalette.js +59 -0
  471. package/dist/theme/stackcraftPalette.js.map +1 -0
  472. package/dist/theme/toolkitComponents.js +26 -0
  473. package/dist/theme/toolkitComponents.js.map +1 -0
  474. package/dist/timeline.js +8 -0
  475. package/dist/timeline.js.map +1 -0
  476. package/dist/toolkit/ToolkitProvider.js +49 -0
  477. package/dist/toolkit/ToolkitProvider.js.map +1 -0
  478. package/dist/toolkit/browserNavigation.js +34 -0
  479. package/dist/toolkit/browserNavigation.js.map +1 -0
  480. package/dist/toolkit/toolkitContext.js +19 -0
  481. package/dist/toolkit/toolkitContext.js.map +1 -0
  482. package/dist/toolkit/toolkitSettings.js +87 -0
  483. package/dist/toolkit/toolkitSettings.js.map +1 -0
  484. package/dist/toolkit/useToolkitTranslation.js +18 -0
  485. package/dist/toolkit/useToolkitTranslation.js.map +1 -0
  486. package/dist/types/DataTable/AuditTrailDialog.d.ts +32 -0
  487. package/dist/types/DataTable/AuditTrailTable.d.ts +28 -0
  488. package/dist/types/DataTable/ColumnFilters/HeaderFilterPopover.d.ts +8 -0
  489. package/dist/types/DataTable/ColumnFilters/MultiSelectColumnFilter.d.ts +16 -0
  490. package/dist/types/DataTable/ColumnFilters/SortableFilterHeader.d.ts +26 -0
  491. package/dist/types/DataTable/ColumnFilters/TextColumnFilter.d.ts +8 -0
  492. package/dist/types/DataTable/ColumnFilters/index.d.ts +4 -0
  493. package/dist/types/DataTable/EmptyState.d.ts +8 -0
  494. package/dist/types/DataTable/FilterChips.d.ts +15 -0
  495. package/dist/types/DataTable/GoToPage.d.ts +8 -0
  496. package/dist/types/DataTable/ServerTable.d.ts +110 -0
  497. package/dist/types/DataTable/buildChipConfig.d.ts +22 -0
  498. package/dist/types/DataTable/columns.d.ts +93 -0
  499. package/dist/types/DataTable/filterContext.d.ts +13 -0
  500. package/dist/types/DataTable/index.d.ts +13 -0
  501. package/dist/types/DataTable/serverTableParams.d.ts +16 -0
  502. package/dist/types/DataTable/tableMachine.d.ts +41 -0
  503. package/dist/types/DataTable/useDebouncedFilter.d.ts +8 -0
  504. package/dist/types/DataTable/useTableState.d.ts +93 -0
  505. package/dist/types/access/Can.d.ts +11 -0
  506. package/dist/types/access/PermissionMatrix.d.ts +21 -0
  507. package/dist/types/access/RequireAccess.d.ts +11 -0
  508. package/dist/types/access/accessRules.d.ts +24 -0
  509. package/dist/types/access/permissionGroups.d.ts +56 -0
  510. package/dist/types/access/useCan.d.ts +11 -0
  511. package/dist/types/account/AccountProvider.d.ts +27 -0
  512. package/dist/types/account/AccountSecuritySection.d.ts +7 -0
  513. package/dist/types/account/DemoTotpCodeButton.d.ts +6 -0
  514. package/dist/types/account/ForgotPasswordScreen.d.ts +15 -0
  515. package/dist/types/account/ProfileScreen.d.ts +13 -0
  516. package/dist/types/account/ResetPasswordScreen.d.ts +19 -0
  517. package/dist/types/account/SignInScreen.d.ts +25 -0
  518. package/dist/types/account/accountConnector.d.ts +263 -0
  519. package/dist/types/account/demo/createDemoAccountConnector.d.ts +30 -0
  520. package/dist/types/account/demo/totp.d.ts +45 -0
  521. package/dist/types/account/restAccountConnector.d.ts +49 -0
  522. package/dist/types/account-demo.d.ts +2 -0
  523. package/dist/types/account.d.ts +16 -0
  524. package/dist/types/adapters/i18next.d.ts +11 -0
  525. package/dist/types/adapters/nextNavigation.d.ts +33 -0
  526. package/dist/types/adapters/reactRouter.d.ts +6 -0
  527. package/dist/types/adapters/reactRouterRoutes.d.ts +30 -0
  528. package/dist/types/api/ApiError.d.ts +42 -0
  529. package/dist/types/api/createApiClient.d.ts +146 -0
  530. package/dist/types/api/staleChunks.d.ts +15 -0
  531. package/dist/types/appShell/AccountMenu.d.ts +28 -0
  532. package/dist/types/appShell/AppLayout.d.ts +66 -0
  533. package/dist/types/appShell/AppearanceSettings.d.ts +34 -0
  534. package/dist/types/appShell/AuthLayout.d.ts +21 -0
  535. package/dist/types/appShell/BarActionButton.d.ts +15 -0
  536. package/dist/types/appShell/BarActions.d.ts +18 -0
  537. package/dist/types/appShell/BarCapsule.d.ts +12 -0
  538. package/dist/types/appShell/HeaderTools.d.ts +27 -0
  539. package/dist/types/appShell/MobileTabBar.d.ts +17 -0
  540. package/dist/types/appShell/SettingsMenu.d.ts +13 -0
  541. package/dist/types/appShell/SideMenu.d.ts +31 -0
  542. package/dist/types/appShell/SideMenuEntry.d.ts +17 -0
  543. package/dist/types/appShell/SubmenuActionsMenu.d.ts +24 -0
  544. package/dist/types/appShell/TabBarEditor.d.ts +13 -0
  545. package/dist/types/appShell/TopMenu.d.ts +7 -0
  546. package/dist/types/appShell/appMenuContext.d.ts +9 -0
  547. package/dist/types/appShell/barActionsSlot.d.ts +35 -0
  548. package/dist/types/appShell/barMenuPlacement.d.ts +9 -0
  549. package/dist/types/appShell/menuItemText.d.ts +55 -0
  550. package/dist/types/appShell/pageTitle.d.ts +26 -0
  551. package/dist/types/appShell/shellSizes.d.ts +45 -0
  552. package/dist/types/appShell/tabBarRule.d.ts +5 -0
  553. package/dist/types/appShell/tabBarScroll.d.ts +26 -0
  554. package/dist/types/appShell/useDrawerCollapsed.d.ts +8 -0
  555. package/dist/types/appShell/useFittingActionCount.d.ts +7 -0
  556. package/dist/types/appShell/usePinnedMobileTabs.d.ts +7 -0
  557. package/dist/types/appShell/useTabBarMinimized.d.ts +8 -0
  558. package/dist/types/auth/PasswordChecklist.d.ts +11 -0
  559. package/dist/types/auth/passwordRules.d.ts +34 -0
  560. package/dist/types/calendar/EventCalendar.d.ts +46 -0
  561. package/dist/types/calendar.d.ts +1 -0
  562. package/dist/types/charts.d.ts +2 -0
  563. package/dist/types/date-pickers.d.ts +2 -0
  564. package/dist/types/datePickers/DateInput.d.ts +39 -0
  565. package/dist/types/datePickers/FormDateField.d.ts +7 -0
  566. package/dist/types/dates.d.ts +18 -0
  567. package/dist/types/dictionaries/dictionaries.d.ts +54 -0
  568. package/dist/types/downloads/DownloadManager.d.ts +1 -0
  569. package/dist/types/downloads/downloadQueue.d.ts +45 -0
  570. package/dist/types/downloads/downloadsMachine.d.ts +10 -0
  571. package/dist/types/downloads/index.d.ts +3 -0
  572. package/dist/types/excel/reportWorkbook.d.ts +157 -0
  573. package/dist/types/excel.d.ts +1 -0
  574. package/dist/types/feedback/ConfirmDialog.d.ts +29 -0
  575. package/dist/types/feedback/ModalWaiting.d.ts +8 -0
  576. package/dist/types/feedback/NewBuildNotice.d.ts +18 -0
  577. package/dist/types/feedback/StaleBuildBoundary.d.ts +21 -0
  578. package/dist/types/feedback/Toaster.d.ts +1 -0
  579. package/dist/types/feedback/confirmActionMachine.d.ts +19 -0
  580. package/dist/types/feedback/index.d.ts +8 -0
  581. package/dist/types/feedback/toast.d.ts +100 -0
  582. package/dist/types/feedback/useConfirmAction.d.ts +33 -0
  583. package/dist/types/filepond/FileDropzone.d.ts +59 -0
  584. package/dist/types/filepond/pondServer.d.ts +17 -0
  585. package/dist/types/filepond.d.ts +3 -0
  586. package/dist/types/files.d.ts +29 -0
  587. package/dist/types/formatting.d.ts +106 -0
  588. package/dist/types/forms/FormCatalogField.d.ts +6 -0
  589. package/dist/types/forms/FormColorField.d.ts +6 -0
  590. package/dist/types/forms/FormNumberField.d.ts +6 -0
  591. package/dist/types/forms/FormProblemAlert.d.ts +6 -0
  592. package/dist/types/forms/FormSelectField.d.ts +6 -0
  593. package/dist/types/forms/FormServerProblem.d.ts +8 -0
  594. package/dist/types/forms/FormTextField.d.ts +6 -0
  595. package/dist/types/forms/FormWizard.d.ts +20 -0
  596. package/dist/types/forms/SubmitButton.d.ts +9 -0
  597. package/dist/types/forms/applyServerProblem.d.ts +9 -0
  598. package/dist/types/forms/auth/ChangePasswordForm.d.ts +15 -0
  599. package/dist/types/forms/auth/ForgotPasswordForm.d.ts +12 -0
  600. package/dist/types/forms/auth/SignInForm.d.ts +18 -0
  601. package/dist/types/forms/index.d.ts +19 -0
  602. package/dist/types/forms/security/SecondStepForm.d.ts +28 -0
  603. package/dist/types/forms/security/TwoStepVerificationCard.d.ts +81 -0
  604. package/dist/types/forms/security/securityRules.d.ts +24 -0
  605. package/dist/types/forms/serverProblemFields.d.ts +19 -0
  606. package/dist/types/forms/useFormikField.d.ts +11 -0
  607. package/dist/types/forms/validation.d.ts +251 -0
  608. package/dist/types/forms/validationMessages.d.ts +12 -0
  609. package/dist/types/forms.d.ts +2 -0
  610. package/dist/types/hookForm/FormCatalogField.d.ts +8 -0
  611. package/dist/types/hookForm/FormColorField.d.ts +8 -0
  612. package/dist/types/hookForm/FormNumberField.d.ts +8 -0
  613. package/dist/types/hookForm/FormProblemAlert.d.ts +7 -0
  614. package/dist/types/hookForm/FormSelectField.d.ts +8 -0
  615. package/dist/types/hookForm/FormTextField.d.ts +8 -0
  616. package/dist/types/hookForm/SubmitButton.d.ts +21 -0
  617. package/dist/types/hookForm/applyServerProblem.d.ts +10 -0
  618. package/dist/types/hookForm/useHookFormField.d.ts +13 -0
  619. package/dist/types/i18next.d.ts +1 -0
  620. package/dist/types/identifiers.d.ts +2 -0
  621. package/dist/types/inbox/InboxLayout.d.ts +26 -0
  622. package/dist/types/inbox/MessageList.d.ts +27 -0
  623. package/dist/types/inbox/MessageView.d.ts +23 -0
  624. package/dist/types/inbox/inboxDates.d.ts +6 -0
  625. package/dist/types/index.d.ts +84 -0
  626. package/dist/types/inputs/CatalogInput.d.ts +41 -0
  627. package/dist/types/inputs/ColorInput.d.ts +28 -0
  628. package/dist/types/inputs/FieldFrame.d.ts +14 -0
  629. package/dist/types/inputs/FormSection.d.ts +29 -0
  630. package/dist/types/inputs/NumberInput.d.ts +36 -0
  631. package/dist/types/inputs/SelectInput.d.ts +34 -0
  632. package/dist/types/inputs/TextInput.d.ts +60 -0
  633. package/dist/types/inputs/colorContrast.d.ts +18 -0
  634. package/dist/types/inputs/formLayoutContext.d.ts +3 -0
  635. package/dist/types/inputs/numberText.d.ts +25 -0
  636. package/dist/types/kanban/KanbanBoard.d.ts +33 -0
  637. package/dist/types/kanban/kanbanMoves.d.ts +38 -0
  638. package/dist/types/kanban.d.ts +2 -0
  639. package/dist/types/laravel/csrfRetry.d.ts +21 -0
  640. package/dist/types/laravel.d.ts +1 -0
  641. package/dist/types/lastListUrl.d.ts +20 -0
  642. package/dist/types/locales/en.d.ts +711 -0
  643. package/dist/types/locales/es.d.ts +711 -0
  644. package/dist/types/maps/MapView.d.ts +32 -0
  645. package/dist/types/maps/mapMarkers.d.ts +23 -0
  646. package/dist/types/maps.d.ts +2 -0
  647. package/dist/types/money/money.d.ts +203 -0
  648. package/dist/types/money.d.ts +1 -0
  649. package/dist/types/navigation/appMenu.d.ts +92 -0
  650. package/dist/types/navigation/useMenuBadges.d.ts +16 -0
  651. package/dist/types/navigation.d.ts +22 -0
  652. package/dist/types/navigationTrail.d.ts +49 -0
  653. package/dist/types/next.d.ts +1 -0
  654. package/dist/types/observability/buildWatch.d.ts +28 -0
  655. package/dist/types/observability/logger.d.ts +19 -0
  656. package/dist/types/observability/publishedBuild.d.ts +35 -0
  657. package/dist/types/observability/usePublishedBuildWatch.d.ts +16 -0
  658. package/dist/types/passkeys.d.ts +1 -0
  659. package/dist/types/periodRanges.d.ts +32 -0
  660. package/dist/types/problems.d.ts +31 -0
  661. package/dist/types/pwa/InstallAppSetting.d.ts +1 -0
  662. package/dist/types/pwa/InstallInstructionsDialog.d.ts +18 -0
  663. package/dist/types/pwa/InstallPromptBanner.d.ts +7 -0
  664. package/dist/types/pwa/installInstructions.d.ts +52 -0
  665. package/dist/types/pwa/useInstallPrompt.d.ts +12 -0
  666. package/dist/types/react-hook-form.d.ts +11 -0
  667. package/dist/types/react-router.d.ts +2 -0
  668. package/dist/types/security/ActivityLog.d.ts +31 -0
  669. package/dist/types/security/RecoveryCodesDialog.d.ts +11 -0
  670. package/dist/types/security/SessionsCard.d.ts +22 -0
  671. package/dist/types/security/passkeys.d.ts +18 -0
  672. package/dist/types/table.d.ts +1 -0
  673. package/dist/types/theme/androidDevice.d.ts +11 -0
  674. package/dist/types/theme/appleTracking.d.ts +17 -0
  675. package/dist/types/theme/components/MuiAppBar.d.ts +13 -0
  676. package/dist/types/theme/components/MuiBackdrop.d.ts +11 -0
  677. package/dist/types/theme/components/MuiButton.d.ts +27 -0
  678. package/dist/types/theme/components/MuiButtonBase.d.ts +14 -0
  679. package/dist/types/theme/components/MuiChip.d.ts +29 -0
  680. package/dist/types/theme/components/MuiDataGrid.d.ts +45 -0
  681. package/dist/types/theme/components/MuiDrawer.d.ts +13 -0
  682. package/dist/types/theme/components/MuiMenuItem.d.ts +17 -0
  683. package/dist/types/theme/components/MuiTypography.d.ts +20 -0
  684. package/dist/types/theme/components/glassComponents.d.ts +8 -0
  685. package/dist/types/theme/components/minimalComponents.d.ts +22 -0
  686. package/dist/types/theme/components/paletteOf.d.ts +5 -0
  687. package/dist/types/theme/createToolkitTheme.d.ts +48 -0
  688. package/dist/types/theme/glassSurface.d.ts +247 -0
  689. package/dist/types/theme/glassToasterStyles.d.ts +7 -0
  690. package/dist/types/theme/mergeComponents.d.ts +15 -0
  691. package/dist/types/theme/stackcraftPalette.d.ts +142 -0
  692. package/dist/types/theme/toolkitComponents.d.ts +4 -0
  693. package/dist/types/timeline.d.ts +2 -0
  694. package/dist/types/toolkit/ToolkitProvider.d.ts +31 -0
  695. package/dist/types/toolkit/browserNavigation.d.ts +32 -0
  696. package/dist/types/toolkit/toolkitContext.d.ts +28 -0
  697. package/dist/types/toolkit/toolkitSettings.d.ts +68 -0
  698. package/dist/types/toolkit/useToolkitTranslation.d.ts +10 -0
  699. package/dist/types/ui/actions/CopyButton.d.ts +13 -0
  700. package/dist/types/ui/actions/DownloadMenu.d.ts +50 -0
  701. package/dist/types/ui/actions/SecretField.d.ts +13 -0
  702. package/dist/types/ui/filters/DateRangeFilter.d.ts +16 -0
  703. package/dist/types/ui/filters/PeriodRangeSelector.d.ts +28 -0
  704. package/dist/types/ui/filters/QuickFilters.d.ts +21 -0
  705. package/dist/types/ui/filters/SegmentedControl.d.ts +44 -0
  706. package/dist/types/ui/index.d.ts +33 -0
  707. package/dist/types/ui/labels/DictionaryText.d.ts +7 -0
  708. package/dist/types/ui/labels/StatusChip.d.ts +21 -0
  709. package/dist/types/ui/labels/Tag.d.ts +19 -0
  710. package/dist/types/ui/layout/CollapsibleSection.d.ts +15 -0
  711. package/dist/types/ui/layout/ContentDialog.d.ts +13 -0
  712. package/dist/types/ui/layout/DefinitionList.d.ts +15 -0
  713. package/dist/types/ui/layout/DetailHeader.d.ts +15 -0
  714. package/dist/types/ui/layout/ErrorPage.d.ts +22 -0
  715. package/dist/types/ui/layout/FullPageLoader.d.ts +1 -0
  716. package/dist/types/ui/layout/GlassLensFilter.d.ts +1 -0
  717. package/dist/types/ui/layout/GlassPanel.d.ts +11 -0
  718. package/dist/types/ui/layout/PageHeader.d.ts +15 -0
  719. package/dist/types/ui/layout/PageHeading.d.ts +18 -0
  720. package/dist/types/ui/layout/ProfileHeader.d.ts +17 -0
  721. package/dist/types/ui/layout/ScrollableRow.d.ts +33 -0
  722. package/dist/types/ui/layout/SectionCard.d.ts +11 -0
  723. package/dist/types/ui/layout/appBarHeight.d.ts +13 -0
  724. package/dist/types/ui/metrics/BarList.d.ts +19 -0
  725. package/dist/types/ui/metrics/CalendarHeatmap.d.ts +28 -0
  726. package/dist/types/ui/metrics/ChartTooltip.d.ts +5 -0
  727. package/dist/types/ui/metrics/ColumnChart.d.ts +35 -0
  728. package/dist/types/ui/metrics/MetricCard.d.ts +31 -0
  729. package/dist/types/ui/metrics/TableToggle.d.ts +7 -0
  730. package/dist/types/ui/metrics/barListLabels.d.ts +17 -0
  731. package/dist/types/ui/metrics/heatmapScale.d.ts +45 -0
  732. package/dist/types/ui/navigation/BackButton.d.ts +11 -0
  733. package/dist/types/ui/navigation/ColorSchemeToggle.d.ts +7 -0
  734. package/dist/types/ui/navigation/DocumentTitle.d.ts +6 -0
  735. package/dist/types/ui/navigation/FontSizeToggle.d.ts +6 -0
  736. package/dist/types/ui/navigation/LanguageToggle.d.ts +8 -0
  737. package/dist/types/ui/navigation/PageBreadcrumbs.d.ts +9 -0
  738. package/dist/types/ui/navigation/colorMode.d.ts +18 -0
  739. package/dist/types/ui/navigation/fontSizeLevels.d.ts +25 -0
  740. package/dist/types/ui/navigation/useFontSize.d.ts +10 -0
  741. package/dist/types/ui/timeline/GroupedTimeline.d.ts +38 -0
  742. package/dist/types/ui/timeline/timelineDot.d.ts +19 -0
  743. package/dist/types/upload/FileDropzone.d.ts +34 -0
  744. package/dist/types/upload/fileRules.d.ts +51 -0
  745. package/dist/types/upload/uploadMachine.d.ts +23 -0
  746. package/dist/types/upload/uploadWithProgress.d.ts +16 -0
  747. package/dist/ui/actions/CopyButton.js +28 -0
  748. package/dist/ui/actions/CopyButton.js.map +1 -0
  749. package/dist/ui/actions/DownloadMenu.js +163 -0
  750. package/dist/ui/actions/DownloadMenu.js.map +1 -0
  751. package/dist/ui/actions/SecretField.js +57 -0
  752. package/dist/ui/actions/SecretField.js.map +1 -0
  753. package/dist/ui/filters/DateRangeFilter.js +86 -0
  754. package/dist/ui/filters/DateRangeFilter.js.map +1 -0
  755. package/dist/ui/filters/PeriodRangeSelector.js +56 -0
  756. package/dist/ui/filters/PeriodRangeSelector.js.map +1 -0
  757. package/dist/ui/filters/QuickFilters.js +91 -0
  758. package/dist/ui/filters/QuickFilters.js.map +1 -0
  759. package/dist/ui/filters/SegmentedControl.js +80 -0
  760. package/dist/ui/filters/SegmentedControl.js.map +1 -0
  761. package/dist/ui/labels/DictionaryText.js +11 -0
  762. package/dist/ui/labels/DictionaryText.js.map +1 -0
  763. package/dist/ui/labels/StatusChip.js +52 -0
  764. package/dist/ui/labels/StatusChip.js.map +1 -0
  765. package/dist/ui/labels/Tag.js +26 -0
  766. package/dist/ui/labels/Tag.js.map +1 -0
  767. package/dist/ui/layout/CollapsibleSection.js +48 -0
  768. package/dist/ui/layout/CollapsibleSection.js.map +1 -0
  769. package/dist/ui/layout/ContentDialog.js +97 -0
  770. package/dist/ui/layout/ContentDialog.js.map +1 -0
  771. package/dist/ui/layout/DefinitionList.js +30 -0
  772. package/dist/ui/layout/DefinitionList.js.map +1 -0
  773. package/dist/ui/layout/DetailHeader.js +27 -0
  774. package/dist/ui/layout/DetailHeader.js.map +1 -0
  775. package/dist/ui/layout/ErrorPage.js +40 -0
  776. package/dist/ui/layout/ErrorPage.js.map +1 -0
  777. package/dist/ui/layout/FullPageLoader.js +13 -0
  778. package/dist/ui/layout/FullPageLoader.js.map +1 -0
  779. package/dist/ui/layout/GlassLensFilter.js +53 -0
  780. package/dist/ui/layout/GlassLensFilter.js.map +1 -0
  781. package/dist/ui/layout/GlassPanel.js +18 -0
  782. package/dist/ui/layout/GlassPanel.js.map +1 -0
  783. package/dist/ui/layout/PageHeader.js +23 -0
  784. package/dist/ui/layout/PageHeader.js.map +1 -0
  785. package/dist/ui/layout/PageHeading.js +51 -0
  786. package/dist/ui/layout/PageHeading.js.map +1 -0
  787. package/dist/ui/layout/ProfileHeader.js +64 -0
  788. package/dist/ui/layout/ProfileHeader.js.map +1 -0
  789. package/dist/ui/layout/ScrollableRow.js +156 -0
  790. package/dist/ui/layout/ScrollableRow.js.map +1 -0
  791. package/dist/ui/layout/SectionCard.js +18 -0
  792. package/dist/ui/layout/SectionCard.js.map +1 -0
  793. package/dist/ui/layout/appBarHeight.js +42 -0
  794. package/dist/ui/layout/appBarHeight.js.map +1 -0
  795. package/dist/ui/metrics/BarList.js +89 -0
  796. package/dist/ui/metrics/BarList.js.map +1 -0
  797. package/dist/ui/metrics/CalendarHeatmap.js +131 -0
  798. package/dist/ui/metrics/CalendarHeatmap.js.map +1 -0
  799. package/dist/ui/metrics/ChartTooltip.js +16 -0
  800. package/dist/ui/metrics/ChartTooltip.js.map +1 -0
  801. package/dist/ui/metrics/ColumnChart.js +110 -0
  802. package/dist/ui/metrics/ColumnChart.js.map +1 -0
  803. package/dist/ui/metrics/MetricCard.js +64 -0
  804. package/dist/ui/metrics/MetricCard.js.map +1 -0
  805. package/dist/ui/metrics/TableToggle.js +13 -0
  806. package/dist/ui/metrics/TableToggle.js.map +1 -0
  807. package/dist/ui/metrics/barListLabels.js +9 -0
  808. package/dist/ui/metrics/barListLabels.js.map +1 -0
  809. package/dist/ui/metrics/heatmapScale.js +67 -0
  810. package/dist/ui/metrics/heatmapScale.js.map +1 -0
  811. package/dist/ui/navigation/BackButton.js +28 -0
  812. package/dist/ui/navigation/BackButton.js.map +1 -0
  813. package/dist/ui/navigation/ColorSchemeToggle.js +37 -0
  814. package/dist/ui/navigation/ColorSchemeToggle.js.map +1 -0
  815. package/dist/ui/navigation/DocumentTitle.js +11 -0
  816. package/dist/ui/navigation/DocumentTitle.js.map +1 -0
  817. package/dist/ui/navigation/FontSizeToggle.js +40 -0
  818. package/dist/ui/navigation/FontSizeToggle.js.map +1 -0
  819. package/dist/ui/navigation/LanguageToggle.js +27 -0
  820. package/dist/ui/navigation/LanguageToggle.js.map +1 -0
  821. package/dist/ui/navigation/PageBreadcrumbs.js +51 -0
  822. package/dist/ui/navigation/PageBreadcrumbs.js.map +1 -0
  823. package/dist/ui/navigation/colorMode.js +13 -0
  824. package/dist/ui/navigation/colorMode.js.map +1 -0
  825. package/dist/ui/navigation/fontSizeLevels.js +24 -0
  826. package/dist/ui/navigation/fontSizeLevels.js.map +1 -0
  827. package/dist/ui/navigation/useFontSize.js +44 -0
  828. package/dist/ui/navigation/useFontSize.js.map +1 -0
  829. package/dist/ui/timeline/GroupedTimeline.js +104 -0
  830. package/dist/ui/timeline/GroupedTimeline.js.map +1 -0
  831. package/dist/ui/timeline/timelineDot.js +20 -0
  832. package/dist/ui/timeline/timelineDot.js.map +1 -0
  833. package/dist/upload/FileDropzone.js +143 -0
  834. package/dist/upload/FileDropzone.js.map +1 -0
  835. package/dist/upload/fileRules.js +62 -0
  836. package/dist/upload/fileRules.js.map +1 -0
  837. package/dist/upload/uploadMachine.js +73 -0
  838. package/dist/upload/uploadMachine.js.map +1 -0
  839. package/dist/upload/uploadWithProgress.js +45 -0
  840. package/dist/upload/uploadWithProgress.js.map +1 -0
  841. package/package.json +303 -5
@@ -0,0 +1,110 @@
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 TableHead from "@mui/material/TableHead";
9
+ import TableRow from "@mui/material/TableRow";
10
+ import Typography from "@mui/material/Typography";
11
+ import { ResponsiveContainer, BarChart, CartesianGrid, XAxis, YAxis, Tooltip, ReferenceLine, Bar } from "recharts";
12
+ import { formatNumber } from "../../formatting.js";
13
+ import ChartTooltip from "./ChartTooltip.js";
14
+ import TableToggle from "./TableToggle.js";
15
+ const AXIS_COLOR = "var(--mui-palette-text-secondary)";
16
+ const AXIS_FONT_PIXELS = 12;
17
+ const AXIS_TEXT = { fill: AXIS_COLOR, fontSize: AXIS_FONT_PIXELS };
18
+ const AXIS_MINIMUM_WIDTH_PIXELS = 48;
19
+ const AXIS_PADDING_PIXELS = 16;
20
+ const AXIS_CHARACTER_PIXELS = 7;
21
+ const AXIS_EXTRA_CHARACTERS = 1;
22
+ const REFERENCE_SWATCH_PIXELS = 20;
23
+ function valueAxisWidthOf(highestValue, formatValue) {
24
+ const longestLabel = formatValue(highestValue).length + AXIS_EXTRA_CHARACTERS;
25
+ return Math.max(AXIS_MINIMUM_WIDTH_PIXELS, AXIS_PADDING_PIXELS + longestLabel * AXIS_CHARACTER_PIXELS);
26
+ }
27
+ function ColumnChart({
28
+ data,
29
+ periodLabel,
30
+ valueLabel,
31
+ ariaLabel,
32
+ emptyLabel,
33
+ height = 220,
34
+ tone = "primary",
35
+ onSelect,
36
+ formatValue = formatNumber,
37
+ referenceLine
38
+ }) {
39
+ const [asTable, setAsTable] = useState(false);
40
+ if (!data.length) {
41
+ return /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: emptyLabel });
42
+ }
43
+ const highestValue = Math.max(...data.map((item) => item.value), referenceLine?.value ?? 0);
44
+ return /* @__PURE__ */ jsxs(Box, { children: [
45
+ /* @__PURE__ */ jsx(TableToggle, { asTable, onToggle: () => setAsTable((current) => !current) }),
46
+ asTable ? /* @__PURE__ */ jsx(Box, { sx: { maxHeight: height, overflowY: "auto" }, children: /* @__PURE__ */ jsxs(Table, { size: "small", children: [
47
+ /* @__PURE__ */ jsx(TableHead, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
48
+ /* @__PURE__ */ jsx(TableCell, { children: periodLabel }),
49
+ /* @__PURE__ */ jsx(TableCell, { align: "right", children: valueLabel })
50
+ ] }) }),
51
+ /* @__PURE__ */ jsx(TableBody, { children: data.map((item) => /* @__PURE__ */ jsxs(TableRow, { children: [
52
+ /* @__PURE__ */ jsx(TableCell, { children: item.label }),
53
+ /* @__PURE__ */ jsx(TableCell, { align: "right", children: formatValue(item.value) })
54
+ ] }, item.key)) })
55
+ ] }) }) : /* @__PURE__ */ jsx(Box, { role: "img", "aria-label": ariaLabel, sx: { height, color: `${tone}.main` }, children: /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxs(BarChart, { data, margin: { top: 8, right: 8, bottom: 0, left: -8 }, barCategoryGap: 4, children: [
56
+ /* @__PURE__ */ jsx(CartesianGrid, { vertical: false, stroke: "var(--mui-palette-divider)" }),
57
+ /* @__PURE__ */ jsx(
58
+ XAxis,
59
+ {
60
+ dataKey: "label",
61
+ tick: AXIS_TEXT,
62
+ tickLine: false,
63
+ axisLine: { stroke: "var(--mui-palette-divider)" },
64
+ interval: "preserveStartEnd",
65
+ minTickGap: 12
66
+ }
67
+ ),
68
+ /* @__PURE__ */ jsx(
69
+ YAxis,
70
+ {
71
+ allowDecimals: false,
72
+ tick: AXIS_TEXT,
73
+ tickLine: false,
74
+ axisLine: false,
75
+ width: valueAxisWidthOf(highestValue, formatValue),
76
+ tickFormatter: (value) => formatValue(value)
77
+ }
78
+ ),
79
+ /* @__PURE__ */ jsx(
80
+ Tooltip,
81
+ {
82
+ cursor: { fill: "var(--mui-palette-action-hover)" },
83
+ content: /* @__PURE__ */ jsx(ChartTooltip, { render: (item) => item.tooltip ?? `${item.label}: ${formatValue(item.value)}` })
84
+ }
85
+ ),
86
+ referenceLine && // extendDomain: si la referencia queda arriba de todas las columnas, el eje crece hasta ella
87
+ /* @__PURE__ */ jsx(ReferenceLine, { y: referenceLine.value, ifOverflow: "extendDomain", stroke: AXIS_COLOR, strokeDasharray: "4 4" }),
88
+ /* @__PURE__ */ jsx(
89
+ Bar,
90
+ {
91
+ dataKey: "value",
92
+ fill: "currentColor",
93
+ maxBarSize: 28,
94
+ radius: [4, 4, 0, 0],
95
+ isAnimationActive: false,
96
+ cursor: onSelect ? "pointer" : "default",
97
+ onClick: onSelect ? (entry) => onSelect(entry.payload) : void 0
98
+ }
99
+ )
100
+ ] }) }) }),
101
+ referenceLine && /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", justifyContent: "flex-end", gap: 0.75, mt: 0.5 }, children: [
102
+ /* @__PURE__ */ jsx(Box, { "aria-hidden": "true", sx: { width: REFERENCE_SWATCH_PIXELS, borderTop: "2px dashed", borderColor: "text.secondary" } }),
103
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "text.secondary", children: referenceLine.label })
104
+ ] })
105
+ ] });
106
+ }
107
+ export {
108
+ ColumnChart as default
109
+ };
110
+ //# sourceMappingURL=ColumnChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColumnChart.js","sources":["../../../src/ui/metrics/ColumnChart.jsx"],"sourcesContent":["// Columnas de UNA serie a lo largo del tiempo (p. ej. registros leídos por mes), dibujadas con Recharts.\n//\n// Recharts y no SVG a mano: ejes, escalas, rótulos que no se encimen y el tooltip ya los resolvió la librería. Lo que se\n// decide aquí son las reglas de visualización:\n// - una serie → un color (el del tono vía currentColor) y SIN leyenda: el título ya dice qué es;\n// - columnas de 28 px como máximo, punta redondeada, base cuadrada;\n// - rejilla horizontal de 1 px, sólida y recesiva; el texto de los ejes en tinta secundaria;\n// - tooltip por columna y VISTA DE TABLA;\n// - una línea de referencia opcional (p. ej. la meta), punteada y en tinta secundaria: se lee sin competir con las\n// columnas, y el eje crece lo necesario para que siempre se vea. Su rótulo va debajo de la gráfica y no sobre la\n// línea, donde se encimaba con la columna del último mes; así también lo lee quien ve la tabla.\n//\n// El valor se escribe con formatValue (por omisión, número con separador de miles): con él una serie puede ir en\n// porcentaje. El eje mide lo que mide su número más largo, para que «2,500,000» no salga cortado.\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 TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport Typography from '@mui/material/Typography';\nimport {Bar, BarChart, CartesianGrid, ReferenceLine, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';\n\nimport {formatNumber} from '@/formatting.js';\nimport ChartTooltip from '@/ui/metrics/ChartTooltip.jsx';\nimport TableToggle from '@/ui/metrics/TableToggle.jsx';\n\nconst AXIS_COLOR = 'var(--mui-palette-text-secondary)';\nconst AXIS_FONT_PIXELS = 12;\nconst AXIS_TEXT = {fill: AXIS_COLOR, fontSize: AXIS_FONT_PIXELS};\n// ancho del eje de valores: nunca menos que esto, más lo que pida su número más largo\nconst AXIS_MINIMUM_WIDTH_PIXELS = 48;\nconst AXIS_PADDING_PIXELS = 16;\n// ancho aproximado de un carácter del eje a 12 px\nconst AXIS_CHARACTER_PIXELS = 7;\n// la marca más alta del eje suele pasar del valor más alto y puede llevar un carácter más (999,999 → 1,000,000)\nconst AXIS_EXTRA_CHARACTERS = 1;\n// largo de la muestra punteada que acompaña al rótulo de la línea de referencia\nconst REFERENCE_SWATCH_PIXELS = 20;\n\n/**\n * Ancho del eje de valores para que quepa su número más largo.\n *\n * @param {number} highestValue el valor más alto que se dibuja\n * @param {(value: number) => string} formatValue cómo se escribe un valor\n * @returns {number} pixeles\n */\nfunction valueAxisWidthOf(highestValue, formatValue) {\n const longestLabel = formatValue(highestValue).length + AXIS_EXTRA_CHARACTERS;\n return Math.max(AXIS_MINIMUM_WIDTH_PIXELS, AXIS_PADDING_PIXELS + longestLabel * AXIS_CHARACTER_PIXELS);\n}\n\n/**\n * @param {object} props\n * @param {Array<{key: string, value: number, label: string, tooltip?: string}>} props.data\n * @param {string} props.periodLabel encabezado de la primera columna de la tabla («Mes»), ya traducido\n * @param {string} props.valueLabel cómo se llama lo que se cuenta, ya traducido\n * @param {string} props.ariaLabel\n * @param {string} props.emptyLabel\n * @param {number} [props.height]\n * @param {'primary'|'success'|'warning'|'error'|'info'} [props.tone]\n * @param {(item: any) => void} [props.onSelect] recibe el renglón de data que se picó\n * @param {(value: number) => string} [props.formatValue] cómo se escribe un valor (en el eje, en la tabla y en el\n * tooltip)\n * @param {{value: number, label: string}} [props.referenceLine] línea de referencia con su rótulo ya traducido («Meta:\n * 10 %»)\n */\nexport default function ColumnChart({\n data, periodLabel, valueLabel, ariaLabel, emptyLabel, height = 220, tone = 'primary', onSelect, formatValue = formatNumber, referenceLine,\n}) {\n const [asTable, setAsTable] = useState(false);\n\n // guard clause: sin datos se dice, no se pinta un eje vacío\n if (!data.length) {\n return <Typography variant=\"body2\" color=\"text.secondary\">{emptyLabel}</Typography>;\n }\n\n // el valor más alto que se dibuja (el de las columnas o el de la línea de referencia) decide el ancho del eje\n const highestValue = Math.max(...data.map((item) => item.value), referenceLine?.value ?? 0);\n\n return (\n <Box>\n <TableToggle asTable={asTable} onToggle={() => setAsTable((current) => !current)} />\n {asTable ? (\n <Box sx={{maxHeight: height, overflowY: 'auto'}}>\n <Table size=\"small\">\n <TableHead>\n <TableRow><TableCell>{periodLabel}</TableCell><TableCell align=\"right\">{valueLabel}</TableCell></TableRow>\n </TableHead>\n <TableBody>\n {data.map((item) => (\n <TableRow key={item.key}>\n <TableCell>{item.label}</TableCell>\n <TableCell align=\"right\">{formatValue(item.value)}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </Box>\n ) : (\n <Box role=\"img\" aria-label={ariaLabel} sx={{height, color: `${tone}.main`}}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart data={data} margin={{top: 8, right: 8, bottom: 0, left: -8}} barCategoryGap={4}>\n <CartesianGrid vertical={false} stroke=\"var(--mui-palette-divider)\" />\n <XAxis dataKey=\"label\" tick={AXIS_TEXT} tickLine={false} axisLine={{stroke: 'var(--mui-palette-divider)'}}\n interval=\"preserveStartEnd\" minTickGap={12} />\n <YAxis allowDecimals={false} tick={AXIS_TEXT} tickLine={false} axisLine={false}\n width={valueAxisWidthOf(highestValue, formatValue)} tickFormatter={(value) => formatValue(value)} />\n <Tooltip cursor={{fill: 'var(--mui-palette-action-hover)'}}\n content={<ChartTooltip render={(item) => item.tooltip ?? `${item.label}: ${formatValue(item.value)}`} />} />\n {referenceLine && (\n // extendDomain: si la referencia queda arriba de todas las columnas, el eje crece hasta ella\n <ReferenceLine y={referenceLine.value} ifOverflow=\"extendDomain\" stroke={AXIS_COLOR} strokeDasharray=\"4 4\" />\n )}\n <Bar dataKey=\"value\" fill=\"currentColor\" maxBarSize={28} radius={[4, 4, 0, 0]} isAnimationActive={false}\n cursor={onSelect ? 'pointer' : 'default'} onClick={onSelect ? (entry) => onSelect(entry.payload) : undefined} />\n </BarChart>\n </ResponsiveContainer>\n </Box>\n )}\n {referenceLine && (\n <Box sx={{display: 'flex', alignItems: 'center', justifyContent: 'flex-end', gap: 0.75, mt: 0.5}}>\n <Box aria-hidden=\"true\" sx={{width: REFERENCE_SWATCH_PIXELS, borderTop: '2px dashed', borderColor: 'text.secondary'}} />\n <Typography variant=\"caption\" color=\"text.secondary\">{referenceLine.label}</Typography>\n </Box>\n )}\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AA8BA,MAAM,aAAa;AACnB,MAAM,mBAAmB;AACzB,MAAM,YAAY,EAAC,MAAM,YAAY,UAAU,iBAAA;AAE/C,MAAM,4BAA4B;AAClC,MAAM,sBAAsB;AAE5B,MAAM,wBAAwB;AAE9B,MAAM,wBAAwB;AAE9B,MAAM,0BAA0B;AAShC,SAAS,iBAAiB,cAAc,aAAa;AACjD,QAAM,eAAe,YAAY,YAAY,EAAE,SAAS;AACxD,SAAO,KAAK,IAAI,2BAA2B,sBAAsB,eAAe,qBAAqB;AACzG;AAiBA,SAAwB,YAAY;AAAA,EAChC;AAAA,EAAM;AAAA,EAAa;AAAA,EAAY;AAAA,EAAW;AAAA,EAAY,SAAS;AAAA,EAAK,OAAO;AAAA,EAAW;AAAA,EAAU,cAAc;AAAA,EAAc;AAChI,GAAG;AACC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAG5C,MAAI,CAAC,KAAK,QAAQ;AACd,+BAAQ,YAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAkB,UAAA,YAAW;AAAA,EAC1E;AAGA,QAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,SAAS,KAAK,KAAK,GAAG,eAAe,SAAS,CAAC;AAE1F,8BACK,KAAA,EACG,UAAA;AAAA,IAAA,oBAAC,aAAA,EAAY,SAAkB,UAAU,MAAM,WAAW,CAAC,YAAY,CAAC,OAAO,GAAG;AAAA,IACjF,UACG,oBAAC,KAAA,EAAI,IAAI,EAAC,WAAW,QAAQ,WAAW,OAAA,GACpC,UAAA,qBAAC,OAAA,EAAM,MAAK,SACR,UAAA;AAAA,MAAA,oBAAC,WAAA,EACG,+BAAC,UAAA,EAAS,UAAA;AAAA,QAAA,oBAAC,aAAW,UAAA,YAAA,CAAY;AAAA,QAAY,oBAAC,WAAA,EAAU,OAAM,SAAS,UAAA,WAAA,CAAW;AAAA,MAAA,EAAA,CAAY,EAAA,CACnG;AAAA,0BACC,WAAA,EACI,UAAA,KAAK,IAAI,CAAC,8BACN,UAAA,EACG,UAAA;AAAA,QAAA,oBAAC,WAAA,EAAW,eAAK,MAAA,CAAM;AAAA,4BACtB,WAAA,EAAU,OAAM,SAAS,UAAA,YAAY,KAAK,KAAK,EAAA,CAAE;AAAA,MAAA,KAFvC,KAAK,GAGpB,CACH,EAAA,CACL;AAAA,IAAA,GACJ,GACJ,IAEA,oBAAC,KAAA,EAAI,MAAK,OAAM,cAAY,WAAW,IAAI,EAAC,QAAQ,OAAO,GAAG,IAAI,QAAA,GAC9D,UAAA,oBAAC,qBAAA,EAAoB,OAAM,QAAO,QAAO,QACrC,UAAA,qBAAC,UAAA,EAAS,MAAY,QAAQ,EAAC,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,MAAK,gBAAgB,GACnF,UAAA;AAAA,MAAA,oBAAC,eAAA,EAAc,UAAU,OAAO,QAAO,8BAA6B;AAAA,MACpE;AAAA,QAAC;AAAA,QAAA;AAAA,UAAM,SAAQ;AAAA,UAAQ,MAAM;AAAA,UAAW,UAAU;AAAA,UAAO,UAAU,EAAC,QAAQ,6BAAA;AAAA,UACrE,UAAS;AAAA,UAAmB,YAAY;AAAA,QAAA;AAAA,MAAA;AAAA,MAC/C;AAAA,QAAC;AAAA,QAAA;AAAA,UAAM,eAAe;AAAA,UAAO,MAAM;AAAA,UAAW,UAAU;AAAA,UAAO,UAAU;AAAA,UAClE,OAAO,iBAAiB,cAAc,WAAW;AAAA,UAAG,eAAe,CAAC,UAAU,YAAY,KAAK;AAAA,QAAA;AAAA,MAAA;AAAA,MACtG;AAAA,QAAC;AAAA,QAAA;AAAA,UAAQ,QAAQ,EAAC,MAAM,kCAAA;AAAA,UACf,SAAS,oBAAC,cAAA,EAAa,QAAQ,CAAC,SAAS,KAAK,WAAW,GAAG,KAAK,KAAK,KAAK,YAAY,KAAK,KAAK,CAAC,GAAA,CAAI;AAAA,QAAA;AAAA,MAAA;AAAA,MAC9G;AAAA,MAEG,oBAAC,eAAA,EAAc,GAAG,cAAc,OAAO,YAAW,gBAAe,QAAQ,YAAY,iBAAgB,MAAA,CAAM;AAAA,MAE/G;AAAA,QAAC;AAAA,QAAA;AAAA,UAAI,SAAQ;AAAA,UAAQ,MAAK;AAAA,UAAe,YAAY;AAAA,UAAI,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,UAAG,mBAAmB;AAAA,UAC7F,QAAQ,WAAW,YAAY;AAAA,UAAW,SAAS,WAAW,CAAC,UAAU,SAAS,MAAM,OAAO,IAAI;AAAA,QAAA;AAAA,MAAA;AAAA,IAAW,EAAA,CACvH,GACJ,GACJ;AAAA,IAEH,iBACG,qBAAC,KAAA,EAAI,IAAI,EAAC,SAAS,QAAQ,YAAY,UAAU,gBAAgB,YAAY,KAAK,MAAM,IAAI,OACxF,UAAA;AAAA,MAAA,oBAAC,KAAA,EAAI,eAAY,QAAO,IAAI,EAAC,OAAO,yBAAyB,WAAW,cAAc,aAAa,iBAAA,EAAgB,CAAG;AAAA,0BACrH,YAAA,EAAW,SAAQ,WAAU,OAAM,kBAAkB,wBAAc,MAAA,CAAM;AAAA,IAAA,EAAA,CAC9E;AAAA,EAAA,GAER;AAER;"}
@@ -0,0 +1,64 @@
1
+ "use client";
2
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
3
+ import { useToolkitNavigation } from "../../toolkit/toolkitContext.js";
4
+ import { useToolkitTranslation } from "../../toolkit/useToolkitTranslation.js";
5
+ import CardActionArea from "@mui/material/CardActionArea";
6
+ import Chip from "@mui/material/Chip";
7
+ import Paper from "@mui/material/Paper";
8
+ import Skeleton from "@mui/material/Skeleton";
9
+ import Stack from "@mui/material/Stack";
10
+ import Typography from "@mui/material/Typography";
11
+ import ArrowDownwardIcon from "@mui/icons-material/ArrowDownward";
12
+ import ArrowUpwardIcon from "@mui/icons-material/ArrowUpward";
13
+ import RemoveIcon from "@mui/icons-material/Remove";
14
+ const TONES = ["info", "success", "warning", "error"];
15
+ const TREND_DIRECTION = Object.freeze({ up: "up", down: "down", flat: "flat" });
16
+ const TREND_ICONS = Object.freeze({
17
+ [TREND_DIRECTION.up]: ArrowUpwardIcon,
18
+ [TREND_DIRECTION.down]: ArrowDownwardIcon,
19
+ [TREND_DIRECTION.flat]: RemoveIcon
20
+ });
21
+ const TITLE_ROW_MIN_HEIGHT_PIXELS = 24;
22
+ function TrendChip({ trend }) {
23
+ const { t } = useToolkitTranslation("metricCard");
24
+ const direction = TREND_ICONS[trend.direction] ? trend.direction : TREND_DIRECTION.flat;
25
+ const TrendIcon = TREND_ICONS[direction];
26
+ const isGood = trend.isGood ?? direction === TREND_DIRECTION.up;
27
+ const color = direction === TREND_DIRECTION.flat ? "default" : isGood ? "success" : "error";
28
+ return /* @__PURE__ */ jsx(
29
+ Chip,
30
+ {
31
+ size: "small",
32
+ color,
33
+ variant: "outlined",
34
+ icon: /* @__PURE__ */ jsx(TrendIcon, {}),
35
+ label: trend.label,
36
+ "aria-label": `${t(`trend.${direction}`)} ${trend.label}`,
37
+ sx: { fontWeight: 600, "& .MuiChip-icon": { fontSize: 16 } }
38
+ }
39
+ );
40
+ }
41
+ function MetricCard({ label, value, caption, tone = "info", valueColor, isLoading = false, to, trend }) {
42
+ const { Link } = useToolkitNavigation();
43
+ const paletteTone = TONES.includes(tone) ? tone : "info";
44
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
45
+ /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, sx: { alignItems: "center", justifyContent: "space-between", minHeight: TITLE_ROW_MIN_HEIGHT_PIXELS }, children: [
46
+ /* @__PURE__ */ jsx(Typography, { variant: "overline", color: "text.secondary", component: "p", sx: { minWidth: 0 }, children: label }),
47
+ trend && !isLoading && /* @__PURE__ */ jsx(TrendChip, { trend })
48
+ ] }),
49
+ /* @__PURE__ */ jsx(Typography, { variant: "h5", component: "p", sx: { mt: 0.75, fontWeight: 600, fontVariantNumeric: "tabular-nums", color: valueColor ?? `${paletteTone}.dark` }, children: isLoading ? /* @__PURE__ */ jsx(Skeleton, { width: 120 }) : value }),
50
+ caption && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "text.secondary", component: "p", sx: { mt: 0.5 }, children: isLoading ? /* @__PURE__ */ jsx(Skeleton, { width: 160 }) : caption })
51
+ ] });
52
+ return /* @__PURE__ */ jsx(Paper, { variant: "outlined", sx: {
53
+ borderTop: 3,
54
+ borderTopColor: `${paletteTone}.light`,
55
+ height: "100%",
56
+ overflow: "hidden",
57
+ ...to ? {} : { p: 2.5 }
58
+ }, children: to ? /* @__PURE__ */ jsx(CardActionArea, { component: Link, to, sx: { p: 2.5, height: "100%", alignItems: "flex-start", display: "block" }, children: content }) : content });
59
+ }
60
+ export {
61
+ TREND_DIRECTION,
62
+ MetricCard as default
63
+ };
64
+ //# sourceMappingURL=MetricCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricCard.js","sources":["../../../src/ui/metrics/MetricCard.jsx"],"sourcesContent":["// Tarjeta de métrica: etiqueta en versalitas, número grande (h5 en seminegritas, con cifras del mismo ancho) y una nota abajo, con un borde superior de\n// color según el tono (p. ej. REGISTROS LEÍDOS / ÍNTEGROS / DESCARTADOS).\n//\n// Con `to` la tarjeta entera es una liga a la pantalla que explica el número, ya filtrada: un KPI que no lleva a\n// ningún lado obliga a buscar a mano de dónde salió.\n//\n// Con `trend` lleva junto al número cuánto cambió contra el periodo anterior («▲ 12 %», como los tableros de MUI). El\n// color dice si es bueno o malo, no si subió: más cancelaciones es subir y es malo (isGood: false). La flecha y el texto\n// oculto dicen la dirección, para quien no distingue el color.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useToolkitNavigation} from '@/toolkit/toolkitContext.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport CardActionArea from '@mui/material/CardActionArea';\nimport Chip from '@mui/material/Chip';\nimport Paper from '@mui/material/Paper';\nimport Skeleton from '@mui/material/Skeleton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward';\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport RemoveIcon from '@mui/icons-material/Remove';\n\nconst TONES = ['info', 'success', 'warning', 'error'];\n\n/** Hacia dónde se movió el número. */\nexport const TREND_DIRECTION = Object.freeze({up: 'up', down: 'down', flat: 'flat'});\n\nconst TREND_ICONS = Object.freeze({\n [TREND_DIRECTION.up]: ArrowUpwardIcon,\n [TREND_DIRECTION.down]: ArrowDownwardIcon,\n [TREND_DIRECTION.flat]: RemoveIcon,\n});\n\n// el renglón del título: del alto de la píldora de tendencia, para que las tarjetas con y sin tendencia queden parejas\nconst TITLE_ROW_MIN_HEIGHT_PIXELS = 24;\n\n/**\n * El cambio contra el periodo anterior: verde si es bueno, rojo si es malo, gris si no cambió.\n *\n * @param {{trend: {label: string, direction: string, isGood?: boolean}}} props\n */\nfunction TrendChip({trend}) {\n const {t} = useToolkitTranslation('metricCard');\n const direction = TREND_ICONS[trend.direction] ? trend.direction : TREND_DIRECTION.flat;\n const TrendIcon = TREND_ICONS[direction];\n // por omisión subir es bueno; quien cuente algo malo (cancelaciones, quejas) lo dice con isGood\n const isGood = trend.isGood ?? direction === TREND_DIRECTION.up;\n const color = direction === TREND_DIRECTION.flat ? 'default' : (isGood ? 'success' : 'error');\n return (\n <Chip size=\"small\" color={color} variant=\"outlined\" icon={<TrendIcon />} label={trend.label}\n aria-label={`${t(`trend.${direction}`)} ${trend.label}`} sx={{fontWeight: 600, '& .MuiChip-icon': {fontSize: 16}}} />\n );\n}\n\n/**\n * @param {object} props\n * @param {string} props.label texto ya traducido\n * @param {import('react').ReactNode} props.value ya formateado (formatNumber)\n * @param {import('react').ReactNode} [props.caption]\n * @param {'info'|'success'|'warning'|'error'} [props.tone]\n * @param {string} [props.valueColor] color del número si no debe ir del tono (p. ej. un total en texto normal)\n * @param {boolean} [props.isLoading]\n * @param {string} [props.to] ruta interna a la que lleva la tarjeta\n * @param {{label: string, direction: 'up'|'down'|'flat', isGood?: boolean}} [props.trend] cuánto cambió (TREND_DIRECTION)\n */\nexport default function MetricCard({label, value, caption, tone = 'info', valueColor, isLoading = false, to, trend}) {\n // el enlace del router que conectó el proyecto (ToolkitProvider)\n const {Link} = useToolkitNavigation();\n const paletteTone = TONES.includes(tone) ? tone : 'info';\n\n const content = (\n <>\n {/* la tendencia va en el renglón del título, a la derecha: en el mismo lugar en todas las tarjetas aunque la cifra\n sea larga (junto a la cifra, con un importe largo se bajaba a otro renglón y no quedaban parejas; lo reportaron) */}\n <Stack direction=\"row\" spacing={1} sx={{alignItems: 'center', justifyContent: 'space-between', minHeight: TITLE_ROW_MIN_HEIGHT_PIXELS}}>\n <Typography variant=\"overline\" color=\"text.secondary\" component=\"p\" sx={{minWidth: 0}}>{label}</Typography>\n {trend && !isLoading && <TrendChip trend={trend} />}\n </Stack>\n <Typography variant=\"h5\" component=\"p\" sx={{mt: 0.75, fontWeight: 600, fontVariantNumeric: 'tabular-nums', color: valueColor ?? `${paletteTone}.dark`}}>\n {isLoading ? <Skeleton width={120} /> : value}\n </Typography>\n {caption && (\n <Typography variant=\"caption\" color=\"text.secondary\" component=\"p\" sx={{mt: 0.5}}>\n {isLoading ? <Skeleton width={160} /> : caption}\n </Typography>\n )}\n </>\n );\n\n return (\n <Paper variant=\"outlined\" sx={{\n borderTop: 3,\n borderTopColor: `${paletteTone}.light`,\n height: '100%',\n overflow: 'hidden',\n ...(to ? {} : {p: 2.5}),\n }}>\n {to ? (\n <CardActionArea component={Link} to={to} sx={{p: 2.5, height: '100%', alignItems: 'flex-start', display: 'block'}}>\n {content}\n </CardActionArea>\n ) : content}\n </Paper>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AAuBA,MAAM,QAAQ,CAAC,QAAQ,WAAW,WAAW,OAAO;AAG7C,MAAM,kBAAkB,OAAO,OAAO,EAAC,IAAI,MAAM,MAAM,QAAQ,MAAM,OAAA,CAAO;AAEnF,MAAM,cAAc,OAAO,OAAO;AAAA,EAC9B,CAAC,gBAAgB,EAAE,GAAG;AAAA,EACtB,CAAC,gBAAgB,IAAI,GAAG;AAAA,EACxB,CAAC,gBAAgB,IAAI,GAAG;AAC5B,CAAC;AAGD,MAAM,8BAA8B;AAOpC,SAAS,UAAU,EAAC,SAAQ;AACxB,QAAM,EAAC,EAAA,IAAK,sBAAsB,YAAY;AAC9C,QAAM,YAAY,YAAY,MAAM,SAAS,IAAI,MAAM,YAAY,gBAAgB;AACnF,QAAM,YAAY,YAAY,SAAS;AAEvC,QAAM,SAAS,MAAM,UAAU,cAAc,gBAAgB;AAC7D,QAAM,QAAQ,cAAc,gBAAgB,OAAO,YAAa,SAAS,YAAY;AACrF,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MAAK,MAAK;AAAA,MAAQ;AAAA,MAAc,SAAQ;AAAA,MAAW,0BAAO,WAAA,EAAU;AAAA,MAAI,OAAO,MAAM;AAAA,MAChF,cAAY,GAAG,EAAE,SAAS,SAAS,EAAE,CAAC,IAAI,MAAM,KAAK;AAAA,MAAI,IAAI,EAAC,YAAY,KAAK,mBAAmB,EAAC,UAAU,KAAE;AAAA,IAAC;AAAA,EAAA;AAE9H;AAaA,SAAwB,WAAW,EAAC,OAAO,OAAO,SAAS,OAAO,QAAQ,YAAY,YAAY,OAAO,IAAI,MAAA,GAAQ;AAEjH,QAAM,EAAC,KAAA,IAAQ,qBAAA;AACf,QAAM,cAAc,MAAM,SAAS,IAAI,IAAI,OAAO;AAElD,QAAM,UACF,qBAAA,UAAA,EAGI,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAM,WAAU,OAAM,SAAS,GAAG,IAAI,EAAC,YAAY,UAAU,gBAAgB,iBAAiB,WAAW,+BACtG,UAAA;AAAA,MAAA,oBAAC,YAAA,EAAW,SAAQ,YAAW,OAAM,kBAAiB,WAAU,KAAI,IAAI,EAAC,UAAU,EAAA,GAAK,UAAA,OAAM;AAAA,MAC7F,SAAS,CAAC,aAAa,oBAAC,aAAU,MAAA,CAAc;AAAA,IAAA,GACrD;AAAA,IACA,oBAAC,YAAA,EAAW,SAAQ,MAAK,WAAU,KAAI,IAAI,EAAC,IAAI,MAAM,YAAY,KAAK,oBAAoB,gBAAgB,OAAO,cAAc,GAAG,WAAW,QAAA,GACzI,UAAA,YAAY,oBAAC,UAAA,EAAS,OAAO,IAAA,CAAK,IAAK,MAAA,CAC5C;AAAA,IACC,+BACI,YAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,WAAU,KAAI,IAAI,EAAC,IAAI,IAAA,GACvE,UAAA,YAAY,oBAAC,YAAS,OAAO,KAAK,IAAK,QAAA,CAC5C;AAAA,EAAA,GAER;AAGJ,SACI,oBAAC,OAAA,EAAM,SAAQ,YAAW,IAAI;AAAA,IAC1B,WAAW;AAAA,IACX,gBAAgB,GAAG,WAAW;AAAA,IAC9B,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,GAAI,KAAK,CAAA,IAAK,EAAC,GAAG,IAAA;AAAA,EAAG,GAEpB,eACG,oBAAC,gBAAA,EAAe,WAAW,MAAM,IAAQ,IAAI,EAAC,GAAG,KAAK,QAAQ,QAAQ,YAAY,cAAc,SAAS,WACpG,UAAA,QAAA,CACL,IACA,SACR;AAER;"}
@@ -0,0 +1,13 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useToolkitTranslation } from "../../toolkit/useToolkitTranslation.js";
4
+ import Box from "@mui/material/Box";
5
+ import Button from "@mui/material/Button";
6
+ function TableToggle({ asTable, onToggle }) {
7
+ const { t } = useToolkitTranslation("common");
8
+ return /* @__PURE__ */ jsx(Box, { sx: { display: "flex", justifyContent: "flex-end", mb: 1 }, children: /* @__PURE__ */ jsx(Button, { size: "small", onClick: onToggle, sx: { textTransform: "none" }, children: asTable ? t("charts.viewAsChart") : t("charts.viewAsTable") }) });
9
+ }
10
+ export {
11
+ TableToggle as default
12
+ };
13
+ //# sourceMappingURL=TableToggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableToggle.js","sources":["../../../src/ui/metrics/TableToggle.jsx"],"sourcesContent":["// \"Ver como tabla\": toda gráfica tiene su versión en tabla, para quien no distingue el color, usa lector de pantalla o\n// quiere copiar los números.\n//\n// Los textos salen de i18n.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\n\n/**\n * @param {{asTable: boolean, onToggle: () => void}} props\n */\nexport default function TableToggle({asTable, onToggle}) {\n const {t} = useToolkitTranslation('common');\n\n return (\n <Box sx={{display: 'flex', justifyContent: 'flex-end', mb: 1}}>\n <Button size=\"small\" onClick={onToggle} sx={{textTransform: 'none'}}>\n {asTable ? t('charts.viewAsChart') : t('charts.viewAsTable')}\n </Button>\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;AAaA,SAAwB,YAAY,EAAC,SAAS,YAAW;AACrD,QAAM,EAAC,EAAA,IAAK,sBAAsB,QAAQ;AAE1C,SACI,oBAAC,KAAA,EAAI,IAAI,EAAC,SAAS,QAAQ,gBAAgB,YAAY,IAAI,EAAA,GACvD,UAAA,oBAAC,QAAA,EAAO,MAAK,SAAQ,SAAS,UAAU,IAAI,EAAC,eAAe,OAAA,GACvD,UAAA,UAAU,EAAE,oBAAoB,IAAI,EAAE,oBAAoB,GAC/D,GACJ;AAER;"}
@@ -0,0 +1,9 @@
1
+ const BAR_MIN_POINT_SIZE = 1;
2
+ function barLabelValueOf(barEntry) {
3
+ return { value: barEntry.payload.value, detail: barEntry.payload.detail };
4
+ }
5
+ export {
6
+ BAR_MIN_POINT_SIZE,
7
+ barLabelValueOf
8
+ };
9
+ //# sourceMappingURL=barListLabels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"barListLabels.js","sources":["../../../src/ui/metrics/barListLabels.js"],"sourcesContent":["// Etiqueta en la punta de cada barra de BarList: de dónde sale el número y su detalle («de 8», «rechazados · 120 conformes»).\n//\n// OJO (trampa ya pagada): Recharts 3 DESCARTA las barras de ancho 0 (Bar.js, computeBarRectangles →\n// `width === 0` → null → filter(Boolean)) y LabelList numera solo las que quedan. BarList tomaba el detalle con\n// items[labelProps.index]: después de una barra en 0 el detalle salía del renglón de ARRIBA («Producto C 300 rechazados\n// · 0 conformes» cuando eran 120; «Gerente 1 de 3» cuando era 1 de 1), y con todo en 0 no se pintaba nada.\n// Las dos cosas que lo arreglan, y que se prueban en barListLabels.test.js contra computeBarRectangles de verdad:\n// 1. BAR_MIN_POINT_SIZE = 1: Recharts ensancha a 1 px ANTES de filtrar, así ninguna barra se descarta y un 0 también\n// dice «0 de 2»;\n// 2. el detalle se lee del propio renglón (entry.payload) con valueAccessor y SIN dataKey: LabelList solo usa\n// valueAccessor cuando dataKey es nulo. NO sirve labelProps.payload: LabelList le pasa a la etiqueta solo las\n// propiedades SVG del renglón y payload no es una.\n//\n// Funciones puras, sin imports de pantalla: se prueban con node --test.\n\n/** Ancho mínimo (px) de una barra: con 0 Recharts la descarta y la etiqueta desaparece o se corre de renglón. */\nexport const BAR_MIN_POINT_SIZE = 1;\n\n/**\n * valueAccessor de LabelList: el número y el detalle del MISMO renglón de la barra.\n *\n * @param {{payload: {value: number, detail?: string}}} barEntry rectángulo que arma Recharts (payload = renglón de items)\n * @returns {{value: number, detail: string|undefined}}\n */\nexport function barLabelValueOf(barEntry) {\n return {value: barEntry.payload.value, detail: barEntry.payload.detail};\n}\n"],"names":[],"mappings":"AAgBY,MAAC,qBAAqB;AAQ3B,SAAS,gBAAgB,UAAU;AACtC,SAAO,EAAC,OAAO,SAAS,QAAQ,OAAO,QAAQ,SAAS,QAAQ,OAAM;AAC1E;"}
@@ -0,0 +1,67 @@
1
+ const DAY_MILLISECONDS = 24 * 60 * 60 * 1e3;
2
+ const DAYS_PER_WEEK = 7;
3
+ const HEATMAP_LEVELS = [0, 1, 2, 3, 4];
4
+ function quantileThresholds(values) {
5
+ const activeValues = values.filter((value) => value > 0).sort((first, second) => first - second);
6
+ if (!activeValues.length) {
7
+ return [1, 1, 1];
8
+ }
9
+ const valueAt = (fraction) => activeValues[Math.min(activeValues.length - 1, Math.floor(fraction * activeValues.length))];
10
+ return [valueAt(0.25), valueAt(0.5), valueAt(0.75)];
11
+ }
12
+ function levelOf(value, [firstQuartile, median, thirdQuartile]) {
13
+ if (!value) {
14
+ return 0;
15
+ }
16
+ if (value < firstQuartile) {
17
+ return 1;
18
+ }
19
+ if (value < median) {
20
+ return 2;
21
+ }
22
+ if (value < thirdQuartile) {
23
+ return 3;
24
+ }
25
+ return 4;
26
+ }
27
+ function utcDayOf(plainDate) {
28
+ const [year, month, day] = plainDate.split("-").map(Number);
29
+ return Date.UTC(year, month - 1, day);
30
+ }
31
+ function plainDateOf(utcMilliseconds) {
32
+ return new Date(utcMilliseconds).toISOString().slice(0, 10);
33
+ }
34
+ function calendarWeeksOf({ startsOn, endsOn, days }) {
35
+ const dayByDate = new Map(days.map((day) => [day.date, day]));
36
+ const firstDay = utcDayOf(startsOn);
37
+ const lastDay = utcDayOf(endsOn);
38
+ const mondayOffset = (new Date(firstDay).getUTCDay() + 6) % DAYS_PER_WEEK;
39
+ const weeks = [];
40
+ const monthMarks = [];
41
+ for (let weekStart = firstDay - mondayOffset * DAY_MILLISECONDS; weekStart <= lastDay; weekStart += DAYS_PER_WEEK * DAY_MILLISECONDS) {
42
+ const week = [];
43
+ let monthMark = null;
44
+ for (let weekday = 0; weekday < DAYS_PER_WEEK; weekday++) {
45
+ const dayMilliseconds = weekStart + weekday * DAY_MILLISECONDS;
46
+ if (dayMilliseconds < firstDay || dayMilliseconds > lastDay) {
47
+ week.push(null);
48
+ continue;
49
+ }
50
+ const date = plainDateOf(dayMilliseconds);
51
+ if (date.endsWith("-01")) {
52
+ monthMark = Number(date.slice(5, 7));
53
+ }
54
+ week.push({ date, value: dayByDate.get(date)?.value ?? 0, detail: dayByDate.get(date)?.detail });
55
+ }
56
+ weeks.push(week);
57
+ monthMarks.push(monthMark);
58
+ }
59
+ return { weeks, monthMarks, thresholds: quantileThresholds(days.map((day) => day.value)) };
60
+ }
61
+ export {
62
+ HEATMAP_LEVELS,
63
+ calendarWeeksOf,
64
+ levelOf,
65
+ quantileThresholds
66
+ };
67
+ //# sourceMappingURL=heatmapScale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heatmapScale.js","sources":["../../../src/ui/metrics/heatmapScale.js"],"sourcesContent":["// Cuentas del calendario de actividad (CalendarHeatmap): niveles de color y semanas en columnas.\n//\n// Separadas del componente para probarlas con node --test sin navegador ni MUI.\n//\n// Reglas:\n// - es MAGNITUD: cuatro niveles de un solo tono más \"sin actividad\";\n// - los niveles se cortan por CUARTILES de los días con actividad, no por valores fijos: con 120 registros al día o\n// con 12 000 el calendario se lee igual de bien;\n// - las semanas empiezan en LUNES y el mes se rotula en la semana donde cae su día 1.\n//\n// Fechas de calendario (\"2026-08-16\") con aritmética en UTC: una fecha sin hora no tiene zona y así no se corre de día.\n//\n// Funciones puras, no renderizan: function (regla de la casa).\n\nconst DAY_MILLISECONDS = 24 * 60 * 60 * 1000;\nconst DAYS_PER_WEEK = 7;\n\n/** Nivel 0 = sin actividad; 1 a 4 = el tono cada vez más lleno. */\nexport const HEATMAP_LEVELS = [0, 1, 2, 3, 4];\n\n/**\n * Cortes de los cuartiles de los valores con actividad.\n *\n * @param {number[]} values un valor por día (los ceros no cuentan)\n * @returns {[number, number, number]} q1, q2 y q3\n */\nexport function quantileThresholds(values) {\n const activeValues = values.filter((value) => value > 0).sort((first, second) => first - second);\n // guard clause: sin actividad cualquier valor positivo sería el nivel más alto; da igual, no hay ninguno\n if (!activeValues.length) {\n return [1, 1, 1];\n }\n const valueAt = (fraction) => activeValues[Math.min(activeValues.length - 1, Math.floor(fraction * activeValues.length))];\n return [valueAt(0.25), valueAt(0.5), valueAt(0.75)];\n}\n\n/**\n * Nivel de color de un valor.\n *\n * @param {number} value\n * @param {[number, number, number]} thresholds lo que regresa quantileThresholds\n * @returns {0|1|2|3|4}\n */\nexport function levelOf(value, [firstQuartile, median, thirdQuartile]) {\n if (!value) {\n return 0;\n }\n // OJO: intervalos abiertos por arriba ([q1, q2) es el nivel 2). Con «<=» el valor más repetido, que suele ser\n // la carga completa de cada corte, caía en el nivel 1 y el calendario entero se veía deslavado\n if (value < firstQuartile) {\n return 1;\n }\n if (value < median) {\n return 2;\n }\n if (value < thirdQuartile) {\n return 3;\n }\n return 4;\n}\n\n/** \"2026-08-16\" → milisegundos UTC de ese día a las 00:00. */\nfunction utcDayOf(plainDate) {\n const [year, month, day] = plainDate.split('-').map(Number);\n return Date.UTC(year, month - 1, day);\n}\n\n/** milisegundos UTC → \"2026-08-16\". */\nfunction plainDateOf(utcMilliseconds) {\n return new Date(utcMilliseconds).toISOString().slice(0, 10);\n}\n\n/**\n * Semanas del calendario: columnas de lunes a domingo desde la semana de startsOn hasta la de endsOn.\n *\n * Los días fuera del rango (antes de startsOn en la primera semana o después de endsOn en la última) van en null para\n * que la rejilla deje su hueco sin pintarlos como \"sin actividad\".\n *\n * @param {{startsOn: string, endsOn: string, days: Array<{date: string, value: number, detail?: string}>}} calendar\n * days solo trae los días con actividad (el resto vale 0)\n * @returns {{weeks: Array<Array<{date: string, value: number, detail?: string}|null>>, monthMarks: Array<number|null>, thresholds: [number, number, number]}}\n * monthMarks: el mes (1 a 12) que empieza en cada semana, o null\n */\nexport function calendarWeeksOf({startsOn, endsOn, days}) {\n const dayByDate = new Map(days.map((day) => [day.date, day]));\n const firstDay = utcDayOf(startsOn);\n const lastDay = utcDayOf(endsOn);\n // getUTCDay: 0 = domingo; lo pasamos a 0 = lunes\n const mondayOffset = (new Date(firstDay).getUTCDay() + 6) % DAYS_PER_WEEK;\n const weeks = [];\n const monthMarks = [];\n\n for (let weekStart = firstDay - mondayOffset * DAY_MILLISECONDS; weekStart <= lastDay; weekStart += DAYS_PER_WEEK * DAY_MILLISECONDS) {\n const week = [];\n let monthMark = null;\n for (let weekday = 0; weekday < DAYS_PER_WEEK; weekday++) {\n const dayMilliseconds = weekStart + weekday * DAY_MILLISECONDS;\n if (dayMilliseconds < firstDay || dayMilliseconds > lastDay) {\n week.push(null);\n continue;\n }\n const date = plainDateOf(dayMilliseconds);\n if (date.endsWith('-01')) {\n monthMark = Number(date.slice(5, 7));\n }\n week.push({date, value: dayByDate.get(date)?.value ?? 0, detail: dayByDate.get(date)?.detail});\n }\n weeks.push(week);\n monthMarks.push(monthMark);\n }\n\n return {weeks, monthMarks, thresholds: quantileThresholds(days.map((day) => day.value))};\n}\n"],"names":[],"mappings":"AAcA,MAAM,mBAAmB,KAAK,KAAK,KAAK;AACxC,MAAM,gBAAgB;AAGV,MAAC,iBAAiB,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;AAQrC,SAAS,mBAAmB,QAAQ;AACvC,QAAM,eAAe,OAAO,OAAO,CAAC,UAAU,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,WAAW,QAAQ,MAAM;AAE/F,MAAI,CAAC,aAAa,QAAQ;AACtB,WAAO,CAAC,GAAG,GAAG,CAAC;AAAA,EACnB;AACA,QAAM,UAAU,CAAC,aAAa,aAAa,KAAK,IAAI,aAAa,SAAS,GAAG,KAAK,MAAM,WAAW,aAAa,MAAM,CAAC,CAAC;AACxH,SAAO,CAAC,QAAQ,IAAI,GAAG,QAAQ,GAAG,GAAG,QAAQ,IAAI,CAAC;AACtD;AASO,SAAS,QAAQ,OAAO,CAAC,eAAe,QAAQ,aAAa,GAAG;AACnE,MAAI,CAAC,OAAO;AACR,WAAO;AAAA,EACX;AAGA,MAAI,QAAQ,eAAe;AACvB,WAAO;AAAA,EACX;AACA,MAAI,QAAQ,QAAQ;AAChB,WAAO;AAAA,EACX;AACA,MAAI,QAAQ,eAAe;AACvB,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAGA,SAAS,SAAS,WAAW;AACzB,QAAM,CAAC,MAAM,OAAO,GAAG,IAAI,UAAU,MAAM,GAAG,EAAE,IAAI,MAAM;AAC1D,SAAO,KAAK,IAAI,MAAM,QAAQ,GAAG,GAAG;AACxC;AAGA,SAAS,YAAY,iBAAiB;AAClC,SAAO,IAAI,KAAK,eAAe,EAAE,YAAW,EAAG,MAAM,GAAG,EAAE;AAC9D;AAaO,SAAS,gBAAgB,EAAC,UAAU,QAAQ,KAAI,GAAG;AACtD,QAAM,YAAY,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;AAC5D,QAAM,WAAW,SAAS,QAAQ;AAClC,QAAM,UAAU,SAAS,MAAM;AAE/B,QAAM,gBAAgB,IAAI,KAAK,QAAQ,EAAE,UAAS,IAAK,KAAK;AAC5D,QAAM,QAAQ,CAAA;AACd,QAAM,aAAa,CAAA;AAEnB,WAAS,YAAY,WAAW,eAAe,kBAAkB,aAAa,SAAS,aAAa,gBAAgB,kBAAkB;AAClI,UAAM,OAAO,CAAA;AACb,QAAI,YAAY;AAChB,aAAS,UAAU,GAAG,UAAU,eAAe,WAAW;AACtD,YAAM,kBAAkB,YAAY,UAAU;AAC9C,UAAI,kBAAkB,YAAY,kBAAkB,SAAS;AACzD,aAAK,KAAK,IAAI;AACd;AAAA,MACJ;AACA,YAAM,OAAO,YAAY,eAAe;AACxC,UAAI,KAAK,SAAS,KAAK,GAAG;AACtB,oBAAY,OAAO,KAAK,MAAM,GAAG,CAAC,CAAC;AAAA,MACvC;AACA,WAAK,KAAK,EAAC,MAAM,OAAO,UAAU,IAAI,IAAI,GAAG,SAAS,GAAG,QAAQ,UAAU,IAAI,IAAI,GAAG,OAAM,CAAC;AAAA,IACjG;AACA,UAAM,KAAK,IAAI;AACf,eAAW,KAAK,SAAS;AAAA,EAC7B;AAEA,SAAO,EAAC,OAAO,YAAY,YAAY,mBAAmB,KAAK,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAC;AAC3F;"}
@@ -0,0 +1,28 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useToolkitNavigation } from "../../toolkit/toolkitContext.js";
4
+ import { useToolkitTranslation } from "../../toolkit/useToolkitTranslation.js";
5
+ import Button from "@mui/material/Button";
6
+ import ArrowBackIcon from "@mui/icons-material/ArrowBack";
7
+ import { recallListUrl } from "../../lastListUrl.js";
8
+ import { currentHistoryIndex, pageNameAt } from "../../navigationTrail.js";
9
+ function BackButton({ fallbackTo, listKey, label, ...buttonProps }) {
10
+ const { t } = useToolkitTranslation("common");
11
+ const { useNavigate } = useToolkitNavigation();
12
+ const navigate = useNavigate();
13
+ const historyIndex = currentHistoryIndex();
14
+ const hasHistory = historyIndex > 0;
15
+ const previousPageName = hasHistory ? pageNameAt(historyIndex - 1) : null;
16
+ const goBack = () => {
17
+ if (hasHistory) {
18
+ navigate(-1);
19
+ return;
20
+ }
21
+ navigate(listKey && recallListUrl(listKey) || fallbackTo);
22
+ };
23
+ return /* @__PURE__ */ jsx(Button, { size: "small", color: "inherit", startIcon: /* @__PURE__ */ jsx(ArrowBackIcon, {}), onClick: goBack, ...buttonProps, children: previousPageName ? t(previousPageName.labelKey, previousPageName.params) : label ?? t("actions.back") });
24
+ }
25
+ export {
26
+ BackButton as default
27
+ };
28
+ //# sourceMappingURL=BackButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackButton.js","sources":["../../../src/ui/navigation/BackButton.jsx"],"sourcesContent":["// Botón de regreso por el ROUTER, no por un enlace fijo.\n//\n// navigate(-1) regresa a la entrada anterior del historial con sus parámetros intactos: los filtros, el orden, la\n// pestaña y la página que nuqs dejó en la URL de la lista siguen ahí. Un enlace fijo a la lista los perdería.\n//\n// Si alguien llegó directo (pegó el enlace del detalle, abrió en pestaña nueva, recargó después de un login) no hay\n// historial al que volver: se usa la última URL de la lista que se guardó en sessionStorage al salir de ella\n// (useRememberListUrl) y, si tampoco hay, fallbackTo.\n//\n// El TEXTO dice a dónde regresa: si la página anterior anotó su nombre de regreso (usePageName de navigationTrail.js),\n// se pinta ese («Regresar al detalle del pedido 15»); si no, o si no hay historial, el label que le pasen.\n//\n// Navega con la navegación del proveedor (ToolkitProvider), no con un router en particular.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useToolkitNavigation} from '@/toolkit/toolkitContext.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport Button from '@mui/material/Button';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\n\nimport {recallListUrl} from '@/lastListUrl.js';\nimport {currentHistoryIndex, pageNameAt} from '@/navigationTrail.js';\n\n/**\n * @param {object} props\n * @param {string} props.fallbackTo ruta de la lista sin filtros (último respaldo)\n * @param {string} [props.listKey] la misma llave que usa useRememberListUrl en la lista\n * @param {string} [props.label] ya traducido; se usa cuando la página anterior no anotó su nombre o no hay historial\n */\nexport default function BackButton({fallbackTo, listKey, label, ...buttonProps}) {\n const {t} = useToolkitTranslation('common');\n const {useNavigate} = useToolkitNavigation();\n const navigate = useNavigate();\n\n // react-router guarda en history.state un índice: 0 = primera entrada de esta pestaña en la app. Otro router no lo\n // guarda: entonces se toma como si no hubiera historial y se regresa a la última lista o a fallbackTo\n const historyIndex = currentHistoryIndex();\n const hasHistory = historyIndex > 0;\n const previousPageName = hasHistory ? pageNameAt(historyIndex - 1) : null;\n\n const goBack = () => {\n if (hasHistory) {\n navigate(-1);\n return;\n }\n navigate((listKey && recallListUrl(listKey)) || fallbackTo);\n };\n\n return (\n <Button size=\"small\" color=\"inherit\" startIcon={<ArrowBackIcon />} onClick={goBack} {...buttonProps}>\n {previousPageName ? t(previousPageName.labelKey, previousPageName.params) : (label ?? t('actions.back'))}\n </Button>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AA6BA,SAAwB,WAAW,EAAC,YAAY,SAAS,OAAO,GAAG,eAAc;AAC7E,QAAM,EAAC,EAAA,IAAK,sBAAsB,QAAQ;AAC1C,QAAM,EAAC,YAAA,IAAe,qBAAA;AACtB,QAAM,WAAW,YAAA;AAIjB,QAAM,eAAe,oBAAA;AACrB,QAAM,aAAa,eAAe;AAClC,QAAM,mBAAmB,aAAa,WAAW,eAAe,CAAC,IAAI;AAErE,QAAM,SAAS,MAAM;AACjB,QAAI,YAAY;AACZ,eAAS,EAAE;AACX;AAAA,IACJ;AACA,aAAU,WAAW,cAAc,OAAO,KAAM,UAAU;AAAA,EAC9D;AAEA,SACI,oBAAC,QAAA,EAAO,MAAK,SAAQ,OAAM,WAAU,WAAW,oBAAC,eAAA,CAAA,CAAc,GAAI,SAAS,QAAS,GAAG,aACnF,UAAA,mBAAmB,EAAE,iBAAiB,UAAU,iBAAiB,MAAM,IAAK,SAAS,EAAE,cAAc,EAAA,CAC1G;AAER;"}
@@ -0,0 +1,37 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useState, useEffect } from "react";
4
+ import { useToolkitTranslation } from "../../toolkit/useToolkitTranslation.js";
5
+ import IconButton from "@mui/material/IconButton";
6
+ import Tooltip from "@mui/material/Tooltip";
7
+ import { useColorScheme } from "@mui/material/styles";
8
+ import DarkModeIcon from "@mui/icons-material/DarkModeOutlined";
9
+ import LightModeIcon from "@mui/icons-material/LightModeOutlined";
10
+ import { nextColorModeOf } from "./colorMode.js";
11
+ function ColorSchemeToggle({ size = "small", inverted = false }) {
12
+ const { t } = useToolkitTranslation("common");
13
+ const { mode, systemMode, setMode } = useColorScheme();
14
+ const [isMounted, setIsMounted] = useState(false);
15
+ useEffect(() => {
16
+ setIsMounted(true);
17
+ }, []);
18
+ if (!isMounted || !mode) {
19
+ return /* @__PURE__ */ jsx(IconButton, { size, disabled: true, "aria-hidden": "true", sx: { width: 34, height: 34 } });
20
+ }
21
+ const nextMode = nextColorModeOf(mode, systemMode);
22
+ const label = t(`colorScheme.switchTo.${nextMode}`);
23
+ return /* @__PURE__ */ jsx(Tooltip, { title: label, children: /* @__PURE__ */ jsx(
24
+ IconButton,
25
+ {
26
+ size,
27
+ "aria-label": label,
28
+ onClick: () => setMode(nextMode),
29
+ sx: { color: inverted ? "common.white" : "text.secondary" },
30
+ children: nextMode === "light" ? /* @__PURE__ */ jsx(LightModeIcon, { fontSize: "small" }) : /* @__PURE__ */ jsx(DarkModeIcon, { fontSize: "small" })
31
+ }
32
+ ) });
33
+ }
34
+ export {
35
+ ColorSchemeToggle as default
36
+ };
37
+ //# sourceMappingURL=ColorSchemeToggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColorSchemeToggle.js","sources":["../../../src/ui/navigation/ColorSchemeToggle.jsx"],"sourcesContent":["// Interruptor de modo claro / oscuro.\n//\n// Dos estados visibles, no tres: el primer clic fija una preferencia explícita que ya se recuerda; para volver a seguir\n// al equipo está «Automático» en Apariencia (AppearanceSettings, en el menú de la cuenta). Recordar lo hace MUI:\n// setMode escribe en localStorage (con las llaves que el proyecto puso en su ThemeProvider) y un script\n// en el HTML la puede leer antes del primer pintado.\n//\n// Va en la cinta de escritorio, en el cajón del teléfono y en el inicio de sesión.\n//\n// El tooltip sale de i18n.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useEffect, useState} from 'react';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport {useColorScheme} from '@mui/material/styles';\nimport DarkModeIcon from '@mui/icons-material/DarkModeOutlined';\nimport LightModeIcon from '@mui/icons-material/LightModeOutlined';\n\nimport {nextColorModeOf} from '@/ui/navigation/colorMode.js';\n\n/**\n * @param {{size?: 'small'|'medium', inverted?: boolean}} props inverted = icono blanco para fondos oscuros\n */\nexport default function ColorSchemeToggle({size = 'small', inverted = false}) {\n const {t} = useToolkitTranslation('common');\n const {mode, systemMode, setMode} = useColorScheme();\n\n // antes de montar en el cliente mode viene undefined: reservamos el lugar para que la barra no brinque\n const [isMounted, setIsMounted] = useState(false);\n useEffect(() => {\n setIsMounted(true);\n }, []);\n if (!isMounted || !mode) {\n return <IconButton size={size} disabled aria-hidden=\"true\" sx={{width: 34, height: 34}} />;\n }\n\n const nextMode = nextColorModeOf(mode, systemMode);\n const label = t(`colorScheme.switchTo.${nextMode}`);\n\n return (\n <Tooltip title={label}>\n <IconButton size={size} aria-label={label} onClick={() => setMode(nextMode)}\n sx={{color: inverted ? 'common.white' : 'text.secondary'}}>\n {nextMode === 'light' ? <LightModeIcon fontSize=\"small\" /> : <DarkModeIcon fontSize=\"small\" />}\n </IconButton>\n </Tooltip>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AAyBA,SAAwB,kBAAkB,EAAC,OAAO,SAAS,WAAW,SAAQ;AAC1E,QAAM,EAAC,EAAA,IAAK,sBAAsB,QAAQ;AAC1C,QAAM,EAAC,MAAM,YAAY,QAAA,IAAW,eAAA;AAGpC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,YAAU,MAAM;AACZ,iBAAa,IAAI;AAAA,EACrB,GAAG,CAAA,CAAE;AACL,MAAI,CAAC,aAAa,CAAC,MAAM;AACrB,WAAO,oBAAC,YAAA,EAAW,MAAY,UAAQ,MAAC,eAAY,QAAO,IAAI,EAAC,OAAO,IAAI,QAAQ,KAAE,CAAG;AAAA,EAC5F;AAEA,QAAM,WAAW,gBAAgB,MAAM,UAAU;AACjD,QAAM,QAAQ,EAAE,wBAAwB,QAAQ,EAAE;AAElD,SACI,oBAAC,SAAA,EAAQ,OAAO,OACZ,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MAAW;AAAA,MAAY,cAAY;AAAA,MAAO,SAAS,MAAM,QAAQ,QAAQ;AAAA,MAC9D,IAAI,EAAC,OAAO,WAAW,iBAAiB,iBAAA;AAAA,MAC/C,UAAA,aAAa,UAAU,oBAAC,eAAA,EAAc,UAAS,SAAQ,IAAK,oBAAC,cAAA,EAAa,UAAS,QAAA,CAAQ;AAAA,IAAA;AAAA,EAAA,GAEpG;AAER;"}
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useToolkitSettings } from "../../toolkit/toolkitContext.js";
4
+ function DocumentTitle({ title }) {
5
+ const { appName } = useToolkitSettings();
6
+ return /* @__PURE__ */ jsx("title", { children: appName ? `${title} | ${appName}` : title });
7
+ }
8
+ export {
9
+ DocumentTitle as default
10
+ };
11
+ //# sourceMappingURL=DocumentTitle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocumentTitle.js","sources":["../../../src/ui/navigation/DocumentTitle.jsx"],"sourcesContent":["// Título de la pestaña: \"<pantalla> | <aplicación>\", con el nombre de la aplicación del proveedor (appName de\n// ToolkitProvider); sin nombre, solo la pantalla. React 19 sube <title> al <head> solo; no hace falta react-helmet.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useToolkitSettings} from '@/toolkit/toolkitContext.js';\n\n/**\n * @param {{title: string}} props texto ya traducido\n */\nexport default function DocumentTitle({title}) {\n const {appName} = useToolkitSettings();\n\n return <title>{appName ? `${title} | ${appName}` : title}</title>;\n}\n"],"names":[],"mappings":";;;AASA,SAAwB,cAAc,EAAC,SAAQ;AAC3C,QAAM,EAAC,QAAA,IAAW,mBAAA;AAElB,SAAO,oBAAC,WAAO,UAAA,UAAU,GAAG,KAAK,MAAM,OAAO,KAAK,MAAA,CAAM;AAC7D;"}
@@ -0,0 +1,40 @@
1
+ "use client";
2
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { useToolkitTranslation } from "../../toolkit/useToolkitTranslation.js";
5
+ import IconButton from "@mui/material/IconButton";
6
+ import ListItemText from "@mui/material/ListItemText";
7
+ import Menu from "@mui/material/Menu";
8
+ import MenuItem from "@mui/material/MenuItem";
9
+ import Tooltip from "@mui/material/Tooltip";
10
+ import FormatSizeIcon from "@mui/icons-material/FormatSize";
11
+ import { useFontSize } from "./useFontSize.js";
12
+ function FontSizeToggle({ size = "small" }) {
13
+ const { t } = useToolkitTranslation("layout");
14
+ const { level, setLevel, isMounted, levels } = useFontSize();
15
+ const [anchorElement, setAnchorElement] = useState(null);
16
+ if (!isMounted) {
17
+ return /* @__PURE__ */ jsx(IconButton, { size, disabled: true, "aria-hidden": "true", sx: { width: 34, height: 34 } });
18
+ }
19
+ const chooseLevel = (levelKey) => {
20
+ setLevel(levelKey);
21
+ setAnchorElement(null);
22
+ };
23
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
24
+ /* @__PURE__ */ jsx(Tooltip, { title: t("fontSize.label"), children: /* @__PURE__ */ jsx(IconButton, { size, "aria-label": t("fontSize.label"), "aria-haspopup": "menu", onClick: (event) => setAnchorElement(event.currentTarget), children: /* @__PURE__ */ jsx(FormatSizeIcon, { fontSize: "small" }) }) }),
25
+ /* @__PURE__ */ jsx(
26
+ Menu,
27
+ {
28
+ anchorEl: anchorElement,
29
+ open: Boolean(anchorElement),
30
+ onClose: () => setAnchorElement(null),
31
+ slotProps: { paper: { sx: { minWidth: 200 } } },
32
+ children: levels.map((option) => /* @__PURE__ */ jsx(MenuItem, { selected: option.key === level, onClick: () => chooseLevel(option.key), children: /* @__PURE__ */ jsx(ListItemText, { primary: t(option.labelKey), slotProps: { primary: { sx: { fontWeight: option.key === level ? 600 : 400 } } } }) }, option.key))
33
+ }
34
+ )
35
+ ] });
36
+ }
37
+ export {
38
+ FontSizeToggle as default
39
+ };
40
+ //# sourceMappingURL=FontSizeToggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FontSizeToggle.js","sources":["../../../src/ui/navigation/FontSizeToggle.jsx"],"sourcesContent":["// El botón del tamaño de letra (normal, grande, muy grande), del tema de walk-ot: para quien lee con lentes o en una\n// pantalla chica. Va en la barra de escritorio; en el teléfono vive en el menú de ajustes.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useState} from 'react';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport IconButton from '@mui/material/IconButton';\nimport ListItemText from '@mui/material/ListItemText';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport Tooltip from '@mui/material/Tooltip';\nimport FormatSizeIcon from '@mui/icons-material/FormatSize';\n\nimport {useFontSize} from '@/ui/navigation/useFontSize.js';\n\n/**\n * @param {{size?: 'small'|'medium'}} props\n */\nexport default function FontSizeToggle({size = 'small'}) {\n const {t} = useToolkitTranslation('layout');\n const {level, setLevel, isMounted, levels} = useFontSize();\n const [anchorElement, setAnchorElement] = useState(null);\n\n // antes de montar no se sabe el nivel guardado: se reserva el lugar para que la barra no brinque\n if (!isMounted) {\n return <IconButton size={size} disabled aria-hidden=\"true\" sx={{width: 34, height: 34}} />;\n }\n\n const chooseLevel = (levelKey) => {\n setLevel(levelKey);\n setAnchorElement(null);\n };\n\n return (\n <>\n <Tooltip title={t('fontSize.label')}>\n <IconButton size={size} aria-label={t('fontSize.label')} aria-haspopup=\"menu\" onClick={(event) => setAnchorElement(event.currentTarget)}>\n <FormatSizeIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n <Menu anchorEl={anchorElement} open={Boolean(anchorElement)} onClose={() => setAnchorElement(null)}\n slotProps={{paper: {sx: {minWidth: 200}}}}>\n {levels.map((option) => (\n <MenuItem key={option.key} selected={option.key === level} onClick={() => chooseLevel(option.key)}>\n <ListItemText primary={t(option.labelKey)} slotProps={{primary: {sx: {fontWeight: option.key === level ? 600 : 400}}}} />\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAkBA,SAAwB,eAAe,EAAC,OAAO,WAAU;AACrD,QAAM,EAAC,EAAA,IAAK,sBAAsB,QAAQ;AAC1C,QAAM,EAAC,OAAO,UAAU,WAAW,OAAA,IAAU,YAAA;AAC7C,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,IAAI;AAGvD,MAAI,CAAC,WAAW;AACZ,WAAO,oBAAC,YAAA,EAAW,MAAY,UAAQ,MAAC,eAAY,QAAO,IAAI,EAAC,OAAO,IAAI,QAAQ,KAAE,CAAG;AAAA,EAC5F;AAEA,QAAM,cAAc,CAAC,aAAa;AAC9B,aAAS,QAAQ;AACjB,qBAAiB,IAAI;AAAA,EACzB;AAEA,SACI,qBAAA,UAAA,EACI,UAAA;AAAA,IAAA,oBAAC,SAAA,EAAQ,OAAO,EAAE,gBAAgB,GAC9B,UAAA,oBAAC,YAAA,EAAW,MAAY,cAAY,EAAE,gBAAgB,GAAG,iBAAc,QAAO,SAAS,CAAC,UAAU,iBAAiB,MAAM,aAAa,GAClI,UAAA,oBAAC,gBAAA,EAAe,UAAS,QAAA,CAAQ,EAAA,CACrC,EAAA,CACJ;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QAAK,UAAU;AAAA,QAAe,MAAM,QAAQ,aAAa;AAAA,QAAG,SAAS,MAAM,iBAAiB,IAAI;AAAA,QAC3F,WAAW,EAAC,OAAO,EAAC,IAAI,EAAC,UAAU,IAAA,IAAI;AAAA,QACxC,iBAAO,IAAI,CAAC,WACT,oBAAC,UAAA,EAA0B,UAAU,OAAO,QAAQ,OAAO,SAAS,MAAM,YAAY,OAAO,GAAG,GAC5F,UAAA,oBAAC,gBAAa,SAAS,EAAE,OAAO,QAAQ,GAAG,WAAW,EAAC,SAAS,EAAC,IAAI,EAAC,YAAY,OAAO,QAAQ,QAAQ,MAAM,MAAG,EAAC,GAAI,EAAA,GAD5G,OAAO,GAEtB,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EACL,GACJ;AAER;"}
@@ -0,0 +1,27 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useToolkitTranslation } from "../../toolkit/useToolkitTranslation.js";
4
+ import Button from "@mui/material/Button";
5
+ const LANGUAGES = Object.freeze(["es", "en"]);
6
+ function LanguageToggle({ inverted = false }) {
7
+ const { t, language, changeLanguage } = useToolkitTranslation("common");
8
+ const currentLanguage = LANGUAGES.includes(language) ? language : "es";
9
+ const nextLanguage = currentLanguage === "es" ? "en" : "es";
10
+ return /* @__PURE__ */ jsx(
11
+ Button,
12
+ {
13
+ size: "small",
14
+ variant: "text",
15
+ onClick: () => changeLanguage(nextLanguage),
16
+ lang: nextLanguage,
17
+ "aria-label": t(`language.switchTo.${nextLanguage}`),
18
+ sx: { minWidth: 0, fontWeight: 700, letterSpacing: "0.08em", color: inverted ? "common.white" : "text.secondary" },
19
+ children: nextLanguage.toUpperCase()
20
+ }
21
+ );
22
+ }
23
+ export {
24
+ LANGUAGES,
25
+ LanguageToggle as default
26
+ };
27
+ //# sourceMappingURL=LanguageToggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LanguageToggle.js","sources":["../../../src/ui/navigation/LanguageToggle.jsx"],"sourcesContent":["// Cambio de idioma español / inglés.\n//\n// Solo avisa el idioma nuevo (onLanguageChange de ToolkitProvider). Lo demás lo hace el proyecto: su i18n, el header\n// Accept-Language de las peticiones y volver a pedir los datos del servidor, que traen textos traducidos.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport Button from '@mui/material/Button';\n\n/** Los idiomas que traen los textos del paquete. */\nexport const LANGUAGES = Object.freeze(['es', 'en']);\n\n/**\n * @param {{inverted?: boolean}} props inverted = texto blanco para fondos oscuros\n */\nexport default function LanguageToggle({inverted = false}) {\n const {t, language, changeLanguage} = useToolkitTranslation('common');\n const currentLanguage = LANGUAGES.includes(language) ? language : 'es';\n const nextLanguage = currentLanguage === 'es' ? 'en' : 'es';\n\n return (\n <Button size=\"small\" variant=\"text\" onClick={() => changeLanguage(nextLanguage)}\n lang={nextLanguage} aria-label={t(`language.switchTo.${nextLanguage}`)}\n sx={{minWidth: 0, fontWeight: 700, letterSpacing: '0.08em', color: inverted ? 'common.white' : 'text.secondary'}}>\n {nextLanguage.toUpperCase()}\n </Button>\n );\n}\n"],"names":[],"mappings":";;;;AAUO,MAAM,YAAY,OAAO,OAAO,CAAC,MAAM,IAAI,CAAC;AAKnD,SAAwB,eAAe,EAAC,WAAW,SAAQ;AACvD,QAAM,EAAC,GAAG,UAAU,eAAA,IAAkB,sBAAsB,QAAQ;AACpE,QAAM,kBAAkB,UAAU,SAAS,QAAQ,IAAI,WAAW;AAClE,QAAM,eAAe,oBAAoB,OAAO,OAAO;AAEvD,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MAAO,MAAK;AAAA,MAAQ,SAAQ;AAAA,MAAO,SAAS,MAAM,eAAe,YAAY;AAAA,MACtE,MAAM;AAAA,MAAc,cAAY,EAAE,qBAAqB,YAAY,EAAE;AAAA,MACrE,IAAI,EAAC,UAAU,GAAG,YAAY,KAAK,eAAe,UAAU,OAAO,WAAW,iBAAiB,iBAAA;AAAA,MAClG,uBAAa,YAAA;AAAA,IAAY;AAAA,EAAA;AAGtC;"}
@@ -0,0 +1,51 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useToolkitTranslation } from "../../toolkit/useToolkitTranslation.js";
4
+ import { useToolkitNavigation } from "../../toolkit/toolkitContext.js";
5
+ import Breadcrumbs from "@mui/material/Breadcrumbs";
6
+ import Link from "@mui/material/Link";
7
+ import Typography from "@mui/material/Typography";
8
+ import { textSizeOf } from "../../theme/appleTracking.js";
9
+ import ScrollableRow from "../layout/ScrollableRow.js";
10
+ import NavigateNextIcon from "@mui/icons-material/NavigateNext";
11
+ function PageBreadcrumbs({ items }) {
12
+ const { t } = useToolkitTranslation("layout");
13
+ const { Link: RouterLink } = useToolkitNavigation();
14
+ if (items.length === 0) {
15
+ return null;
16
+ }
17
+ return /* @__PURE__ */ jsx(ScrollableRow, { py: 0, children: /* @__PURE__ */ jsx(
18
+ Breadcrumbs,
19
+ {
20
+ "aria-label": t("breadcrumbs"),
21
+ separator: /* @__PURE__ */ jsx(NavigateNextIcon, { fontSize: "small" }),
22
+ sx: {
23
+ ...textSizeOf(13),
24
+ color: "text.secondary",
25
+ flex: "0 0 auto",
26
+ "& .MuiBreadcrumbs-ol": { flexWrap: "nowrap" },
27
+ "& .MuiBreadcrumbs-li": { flex: "0 0 auto" }
28
+ },
29
+ children: items.map((item, index) => {
30
+ const isLast = index === items.length - 1;
31
+ if (!isLast && item.to) {
32
+ return /* @__PURE__ */ jsx(Link, { component: RouterLink, to: item.to, underline: "hover", color: "inherit", sx: { fontSize: "inherit" }, children: item.label }, `${item.to}-${index}`);
33
+ }
34
+ return /* @__PURE__ */ jsx(
35
+ Typography,
36
+ {
37
+ component: "span",
38
+ "aria-current": isLast ? "page" : void 0,
39
+ sx: { fontSize: "inherit", fontWeight: isLast ? 500 : 400, color: isLast ? "text.primary" : "text.secondary" },
40
+ children: item.label
41
+ },
42
+ `${item.label}-${index}`
43
+ );
44
+ })
45
+ }
46
+ ) });
47
+ }
48
+ export {
49
+ PageBreadcrumbs as default
50
+ };
51
+ //# sourceMappingURL=PageBreadcrumbs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageBreadcrumbs.js","sources":["../../../src/ui/navigation/PageBreadcrumbs.jsx"],"sourcesContent":["// Las migas de una pantalla (Inicio › Catálogos › Productos): cada una lleva a su pantalla menos la última, que es donde\n// ya está la persona. En el teléfono no se parten en dos renglones: se deslizan de lado en la misma tira que los filtros\n// rápidos (ScrollableRow: sin barra de desplazamiento, la orilla donde hay más se desvanece y se arrastra con el mouse).\n// Antes deslizaba la lista de MUI y salía la barra gris del navegador debajo de las migas.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport {useToolkitNavigation} from '@/toolkit/toolkitContext.js';\nimport Breadcrumbs from '@mui/material/Breadcrumbs';\nimport Link from '@mui/material/Link';\nimport Typography from '@mui/material/Typography';\nimport {textSizeOf} from '@/theme/appleTracking.js';\nimport ScrollableRow from '@/ui/layout/ScrollableRow.jsx';\nimport NavigateNextIcon from '@mui/icons-material/NavigateNext';\n\n/**\n * @param {{items: Array<{label: string, to?: string}>}} props textos ya traducidos\n */\nexport default function PageBreadcrumbs({items}) {\n const {t} = useToolkitTranslation('layout');\n const {Link: RouterLink} = useToolkitNavigation();\n if (items.length === 0) {\n return null;\n }\n return (\n <ScrollableRow py={0}>\n <Breadcrumbs aria-label={t('breadcrumbs')} separator={<NavigateNextIcon fontSize=\"small\" />}\n sx={{...textSizeOf(13), color: 'text.secondary', flex: '0 0 auto', '& .MuiBreadcrumbs-ol': {flexWrap: 'nowrap'},\n '& .MuiBreadcrumbs-li': {flex: '0 0 auto'}}}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n if (!isLast && item.to) {\n return (\n <Link key={`${item.to}-${index}`} component={RouterLink} to={item.to} underline=\"hover\" color=\"inherit\" sx={{fontSize: 'inherit'}}>\n {item.label}\n </Link>\n );\n }\n return (\n <Typography key={`${item.label}-${index}`} component=\"span\" aria-current={isLast ? 'page' : undefined}\n sx={{fontSize: 'inherit', fontWeight: isLast ? 500 : 400, color: isLast ? 'text.primary' : 'text.secondary'}}>\n {item.label}\n </Typography>\n );\n })}\n </Breadcrumbs>\n </ScrollableRow>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AAkBA,SAAwB,gBAAgB,EAAC,SAAQ;AAC7C,QAAM,EAAC,EAAA,IAAK,sBAAsB,QAAQ;AAC1C,QAAM,EAAC,MAAM,WAAA,IAAc,qBAAA;AAC3B,MAAI,MAAM,WAAW,GAAG;AACpB,WAAO;AAAA,EACX;AACA,SACI,oBAAC,eAAA,EAAc,IAAI,GACf,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MAAY,cAAY,EAAE,aAAa;AAAA,MAAG,WAAW,oBAAC,kBAAA,EAAiB,UAAS,QAAA,CAAQ;AAAA,MAC5E,IAAI;AAAA,QAAC,GAAG,WAAW,EAAE;AAAA,QAAG,OAAO;AAAA,QAAkB,MAAM;AAAA,QAAY,wBAAwB,EAAC,UAAU,SAAA;AAAA,QACjG,wBAAwB,EAAC,MAAM,WAAA;AAAA,MAAU;AAAA,MACtD,UAAA,MAAM,IAAI,CAAC,MAAM,UAAU;AACxB,cAAM,SAAS,UAAU,MAAM,SAAS;AACxC,YAAI,CAAC,UAAU,KAAK,IAAI;AACpB,iBACI,oBAAC,QAAiC,WAAW,YAAY,IAAI,KAAK,IAAI,WAAU,SAAQ,OAAM,WAAU,IAAI,EAAC,UAAU,UAAA,GAClH,UAAA,KAAK,MAAA,GADC,GAAG,KAAK,EAAE,IAAI,KAAK,EAE9B;AAAA,QAER;AACA,eACI;AAAA,UAAC;AAAA,UAAA;AAAA,YAA0C,WAAU;AAAA,YAAO,gBAAc,SAAS,SAAS;AAAA,YAChF,IAAI,EAAC,UAAU,WAAW,YAAY,SAAS,MAAM,KAAK,OAAO,SAAS,iBAAiB,iBAAA;AAAA,YAClG,UAAA,KAAK;AAAA,UAAA;AAAA,UAFO,GAAG,KAAK,KAAK,IAAI,KAAK;AAAA,QAAA;AAAA,MAK/C,CAAC;AAAA,IAAA;AAAA,EAAA,GAET;AAER;"}
@@ -0,0 +1,13 @@
1
+ const COLOR_MODES = ["light", "dark"];
2
+ function resolvedColorModeOf(mode, systemMode) {
3
+ const visibleMode = mode === "system" ? systemMode : mode;
4
+ return COLOR_MODES.includes(visibleMode) ? visibleMode : "light";
5
+ }
6
+ function nextColorModeOf(mode, systemMode) {
7
+ return resolvedColorModeOf(mode, systemMode) === "dark" ? "light" : "dark";
8
+ }
9
+ export {
10
+ nextColorModeOf,
11
+ resolvedColorModeOf
12
+ };
13
+ //# sourceMappingURL=colorMode.js.map