@stackcraftmx/calcita 0.0.0-stage → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (900) hide show
  1. package/LICENSE +110 -0
  2. package/README.md +700 -2
  3. package/cli/askQuestions.js +63 -0
  4. package/cli/calcita.js +150 -0
  5. package/cli/makeComponent.js +50 -0
  6. package/cli/makeForm.js +68 -0
  7. package/cli/makeModule.js +78 -0
  8. package/cli/makePage.js +62 -0
  9. package/cli/names.js +64 -0
  10. package/cli/newProject.js +103 -0
  11. package/cli/packageVersions.js +38 -0
  12. package/cli/projectAnswers.js +145 -0
  13. package/cli/projectConfig.js +38 -0
  14. package/cli/projectFiles.js +128 -0
  15. package/cli/screenLabels.js +41 -0
  16. package/cli/templateFiles.js +186 -0
  17. package/cli/templates/component/core/__ComponentName__.jsx.tpl +23 -0
  18. package/cli/templates/component/module/__ComponentName__.jsx.tpl +21 -0
  19. package/cli/templates/form/formik/__FormName__.jsx.tpl +50 -0
  20. package/cli/templates/form/hookForm/__FormName__.jsx.tpl +53 -0
  21. package/cli/templates/form/shared/__formName__Schema.js.tpl +20 -0
  22. package/cli/templates/form/shared/__formName__Texts.js.tpl +6 -0
  23. package/cli/templates/module/__Name__Page.jsx.tpl +75 -0
  24. package/cli/templates/module/__name__Api.js.tpl +39 -0
  25. package/cli/templates/module/__name__Texts.js.tpl +27 -0
  26. package/cli/templates/module/menu.js.tpl +21 -0
  27. package/cli/templates/module/routes.js.tpl +7 -0
  28. package/cli/templates/moduleServer/__name__Server.js.tpl +68 -0
  29. package/cli/templates/page/__PageName__Page.jsx.tpl +22 -0
  30. package/cli/templates/page/__pageName__PageTexts.js.tpl +23 -0
  31. package/cli/templates/project/README.md.tpl +83 -0
  32. package/cli/templates/project/dot-gitignore.tpl +11 -0
  33. package/cli/templates/project/index.html.tpl +20 -0
  34. package/cli/templates/project/jsconfig.json.tpl +16 -0
  35. package/cli/templates/project/pnpm-workspace.yaml.tpl +5 -0
  36. package/cli/templates/project/public/favicon.svg +1 -0
  37. package/cli/templates/project/public/icons/apple-touch-icon.png +0 -0
  38. package/cli/templates/project/public/icons/icon-192.png +0 -0
  39. package/cli/templates/project/public/icons/icon-512-maskable.png +0 -0
  40. package/cli/templates/project/public/icons/icon-512.png +0 -0
  41. package/cli/templates/project/public/manifest.webmanifest.tpl +17 -0
  42. package/cli/templates/project/src/app/AppProviders.jsx.tpl +107 -0
  43. package/cli/templates/project/src/app/AppShell.jsx.tpl +87 -0
  44. package/cli/templates/project/src/app/appRouter.jsx.tpl +51 -0
  45. package/cli/templates/project/src/app/appSettings.js.tpl +27 -0
  46. package/cli/templates/project/src/app/appTexts.js.tpl +15 -0
  47. package/cli/templates/project/src/app/combineTexts.js.tpl +31 -0
  48. package/cli/templates/project/src/app/i18n.js.tpl +19 -0
  49. package/cli/templates/project/src/app/shellTexts.js.tpl +16 -0
  50. package/cli/templates/project/src/core/AppLogo.jsx.tpl +14 -0
  51. package/cli/templates/project/src/core/accountConnector.js.tpl +36 -0
  52. package/cli/templates/project/src/core/apiClient.js.tpl +15 -0
  53. package/cli/templates/project/src/core/appPaths.js.tpl +11 -0
  54. package/cli/templates/project/src/core/index.js.tpl +9 -0
  55. package/cli/templates/project/src/core/publicPaths.js.tpl +24 -0
  56. package/cli/templates/project/src/fakeServer/networkDelay.js.tpl +40 -0
  57. package/cli/templates/project/src/fakeServer/serverText.js.tpl +20 -0
  58. package/cli/templates/project/src/main.jsx.tpl +24 -0
  59. package/cli/templates/project/src/modules/auth/ForgotPasswordPage.jsx.tpl +14 -0
  60. package/cli/templates/project/src/modules/auth/ResetPasswordPage.jsx.tpl +15 -0
  61. package/cli/templates/project/src/modules/auth/SignInPage.jsx.tpl +29 -0
  62. package/cli/templates/project/src/modules/auth/authTexts.js.tpl +6 -0
  63. package/cli/templates/project/src/modules/auth/routes.js.tpl +11 -0
  64. package/cli/templates/project/src/modules/home/HomePage.jsx.tpl +38 -0
  65. package/cli/templates/project/src/modules/home/homeTexts.js.tpl +29 -0
  66. package/cli/templates/project/src/modules/home/menu.js.tpl +17 -0
  67. package/cli/templates/project/src/modules/home/routes.js.tpl +4 -0
  68. package/cli/templates/project/src/modules/profile/ProfilePage.jsx.tpl +13 -0
  69. package/cli/templates/project/src/modules/profile/routes.js.tpl +6 -0
  70. package/cli/templates/project/vite.config.js.tpl +53 -0
  71. package/dist/DataTable/AuditTrailDialog.js +40 -0
  72. package/dist/DataTable/AuditTrailDialog.js.map +1 -0
  73. package/dist/DataTable/AuditTrailTable.js +89 -0
  74. package/dist/DataTable/AuditTrailTable.js.map +1 -0
  75. package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js +71 -0
  76. package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js.map +1 -0
  77. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js +51 -0
  78. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js.map +1 -0
  79. package/dist/DataTable/ColumnFilters/SortableFilterHeader.js +54 -0
  80. package/dist/DataTable/ColumnFilters/SortableFilterHeader.js.map +1 -0
  81. package/dist/DataTable/ColumnFilters/TextColumnFilter.js +24 -0
  82. package/dist/DataTable/ColumnFilters/TextColumnFilter.js.map +1 -0
  83. package/dist/DataTable/EmptyState.js +22 -0
  84. package/dist/DataTable/EmptyState.js.map +1 -0
  85. package/dist/DataTable/FilterChips.js +39 -0
  86. package/dist/DataTable/FilterChips.js.map +1 -0
  87. package/dist/DataTable/GoToPage.js +63 -0
  88. package/dist/DataTable/GoToPage.js.map +1 -0
  89. package/dist/DataTable/ServerTable.js +477 -0
  90. package/dist/DataTable/ServerTable.js.map +1 -0
  91. package/dist/DataTable/buildChipConfig.js +27 -0
  92. package/dist/DataTable/buildChipConfig.js.map +1 -0
  93. package/dist/DataTable/columns.js +122 -0
  94. package/dist/DataTable/columns.js.map +1 -0
  95. package/dist/DataTable/filterContext.js +15 -0
  96. package/dist/DataTable/filterContext.js.map +1 -0
  97. package/dist/DataTable/rowSelection.js +61 -0
  98. package/dist/DataTable/rowSelection.js.map +1 -0
  99. package/dist/DataTable/serverTableParams.js +19 -0
  100. package/dist/DataTable/serverTableParams.js.map +1 -0
  101. package/dist/DataTable/tableMachine.js +87 -0
  102. package/dist/DataTable/tableMachine.js.map +1 -0
  103. package/dist/DataTable/useDebouncedFilter.js +29 -0
  104. package/dist/DataTable/useDebouncedFilter.js.map +1 -0
  105. package/dist/DataTable/useTableState.js +132 -0
  106. package/dist/DataTable/useTableState.js.map +1 -0
  107. package/dist/access/Can.js +9 -0
  108. package/dist/access/Can.js.map +1 -0
  109. package/dist/access/PermissionMatrix.js +84 -0
  110. package/dist/access/PermissionMatrix.js.map +1 -0
  111. package/dist/access/RequireAccess.js +14 -0
  112. package/dist/access/RequireAccess.js.map +1 -0
  113. package/dist/access/accessRules.js +49 -0
  114. package/dist/access/accessRules.js.map +1 -0
  115. package/dist/access/permissionGroups.js +43 -0
  116. package/dist/access/permissionGroups.js.map +1 -0
  117. package/dist/access/useCan.js +12 -0
  118. package/dist/access/useCan.js.map +1 -0
  119. package/dist/account/AccountProvider.js +58 -0
  120. package/dist/account/AccountProvider.js.map +1 -0
  121. package/dist/account/AccountSecuritySection.js +81 -0
  122. package/dist/account/AccountSecuritySection.js.map +1 -0
  123. package/dist/account/DemoTotpCodeButton.js +26 -0
  124. package/dist/account/DemoTotpCodeButton.js.map +1 -0
  125. package/dist/account/ForgotPasswordScreen.js +27 -0
  126. package/dist/account/ForgotPasswordScreen.js.map +1 -0
  127. package/dist/account/ProfileScreen.js +134 -0
  128. package/dist/account/ProfileScreen.js.map +1 -0
  129. package/dist/account/ResetPasswordScreen.js +58 -0
  130. package/dist/account/ResetPasswordScreen.js.map +1 -0
  131. package/dist/account/SignInScreen.js +102 -0
  132. package/dist/account/SignInScreen.js.map +1 -0
  133. package/dist/account/accountConnector.js +31 -0
  134. package/dist/account/accountConnector.js.map +1 -0
  135. package/dist/account/demo/createDemoAccountConnector.js +368 -0
  136. package/dist/account/demo/createDemoAccountConnector.js.map +1 -0
  137. package/dist/account/demo/totp.js +61 -0
  138. package/dist/account/demo/totp.js.map +1 -0
  139. package/dist/account/restAccountConnector.js +118 -0
  140. package/dist/account/restAccountConnector.js.map +1 -0
  141. package/dist/account-demo.js +12 -0
  142. package/dist/account-demo.js.map +1 -0
  143. package/dist/account.js +25 -0
  144. package/dist/account.js.map +1 -0
  145. package/dist/adapters/i18next.js +7 -0
  146. package/dist/adapters/i18next.js.map +1 -0
  147. package/dist/adapters/nextNavigation.js +36 -0
  148. package/dist/adapters/nextNavigation.js.map +1 -0
  149. package/dist/adapters/reactRouter.js +7 -0
  150. package/dist/adapters/reactRouter.js.map +1 -0
  151. package/dist/adapters/reactRouterRoutes.js +49 -0
  152. package/dist/adapters/reactRouterRoutes.js.map +1 -0
  153. package/dist/api/ApiError.js +58 -0
  154. package/dist/api/ApiError.js.map +1 -0
  155. package/dist/api/createApiClient.js +256 -0
  156. package/dist/api/createApiClient.js.map +1 -0
  157. package/dist/api/staleChunks.js +47 -0
  158. package/dist/api/staleChunks.js.map +1 -0
  159. package/dist/appShell/AccountMenu.js +86 -0
  160. package/dist/appShell/AccountMenu.js.map +1 -0
  161. package/dist/appShell/AppLayout.js +513 -0
  162. package/dist/appShell/AppLayout.js.map +1 -0
  163. package/dist/appShell/AppearanceSettings.js +116 -0
  164. package/dist/appShell/AppearanceSettings.js.map +1 -0
  165. package/dist/appShell/AuthLayout.js +46 -0
  166. package/dist/appShell/AuthLayout.js.map +1 -0
  167. package/dist/appShell/BarActionButton.js +31 -0
  168. package/dist/appShell/BarActionButton.js.map +1 -0
  169. package/dist/appShell/BarActions.js +105 -0
  170. package/dist/appShell/BarActions.js.map +1 -0
  171. package/dist/appShell/BarCapsule.js +50 -0
  172. package/dist/appShell/BarCapsule.js.map +1 -0
  173. package/dist/appShell/BarSearch.js +92 -0
  174. package/dist/appShell/BarSearch.js.map +1 -0
  175. package/dist/appShell/HeaderTools.js +53 -0
  176. package/dist/appShell/HeaderTools.js.map +1 -0
  177. package/dist/appShell/MobileTabBar.js +348 -0
  178. package/dist/appShell/MobileTabBar.js.map +1 -0
  179. package/dist/appShell/SettingsMenu.js +41 -0
  180. package/dist/appShell/SettingsMenu.js.map +1 -0
  181. package/dist/appShell/SideMenu.js +217 -0
  182. package/dist/appShell/SideMenu.js.map +1 -0
  183. package/dist/appShell/SideMenuEntry.js +140 -0
  184. package/dist/appShell/SideMenuEntry.js.map +1 -0
  185. package/dist/appShell/SubmenuActionsMenu.js +71 -0
  186. package/dist/appShell/SubmenuActionsMenu.js.map +1 -0
  187. package/dist/appShell/TabBarEditor.js +55 -0
  188. package/dist/appShell/TabBarEditor.js.map +1 -0
  189. package/dist/appShell/TopMenu.js +80 -0
  190. package/dist/appShell/TopMenu.js.map +1 -0
  191. package/dist/appShell/appMenuContext.js +11 -0
  192. package/dist/appShell/appMenuContext.js.map +1 -0
  193. package/dist/appShell/barActionsSlot.js +26 -0
  194. package/dist/appShell/barActionsSlot.js.map +1 -0
  195. package/dist/appShell/barMenuPlacement.js +33 -0
  196. package/dist/appShell/barMenuPlacement.js.map +1 -0
  197. package/dist/appShell/menuItemText.js +33 -0
  198. package/dist/appShell/menuItemText.js.map +1 -0
  199. package/dist/appShell/pageTitle.js +45 -0
  200. package/dist/appShell/pageTitle.js.map +1 -0
  201. package/dist/appShell/shellSizes.js +40 -0
  202. package/dist/appShell/shellSizes.js.map +1 -0
  203. package/dist/appShell/tabBarRule.js +12 -0
  204. package/dist/appShell/tabBarRule.js.map +1 -0
  205. package/dist/appShell/tabBarScroll.js +23 -0
  206. package/dist/appShell/tabBarScroll.js.map +1 -0
  207. package/dist/appShell/useDrawerCollapsed.js +29 -0
  208. package/dist/appShell/useDrawerCollapsed.js.map +1 -0
  209. package/dist/appShell/useFittingActionCount.js +45 -0
  210. package/dist/appShell/useFittingActionCount.js.map +1 -0
  211. package/dist/appShell/usePinnedMobileTabs.js +32 -0
  212. package/dist/appShell/usePinnedMobileTabs.js.map +1 -0
  213. package/dist/appShell/useTabBarMinimized.js +33 -0
  214. package/dist/appShell/useTabBarMinimized.js.map +1 -0
  215. package/dist/auth/PasswordChecklist.js +44 -0
  216. package/dist/auth/PasswordChecklist.js.map +1 -0
  217. package/dist/auth/passwordRules.js +43 -0
  218. package/dist/auth/passwordRules.js.map +1 -0
  219. package/dist/calendar/EventCalendar.js +149 -0
  220. package/dist/calendar/EventCalendar.js.map +1 -0
  221. package/dist/calendar/EventDetails.js +74 -0
  222. package/dist/calendar/EventDetails.js.map +1 -0
  223. package/dist/calendar/calendarEvents.js +31 -0
  224. package/dist/calendar/calendarEvents.js.map +1 -0
  225. package/dist/calendar.js +13 -0
  226. package/dist/calendar.js.map +1 -0
  227. package/dist/charts.js +16 -0
  228. package/dist/charts.js.map +1 -0
  229. package/dist/date-pickers.js +8 -0
  230. package/dist/date-pickers.js.map +1 -0
  231. package/dist/datePickers/DateInput.js +76 -0
  232. package/dist/datePickers/DateInput.js.map +1 -0
  233. package/dist/datePickers/FormDateField.js +12 -0
  234. package/dist/datePickers/FormDateField.js.map +1 -0
  235. package/dist/dates.js +25 -0
  236. package/dist/dates.js.map +1 -0
  237. package/dist/dictionaries/dictionaries.js +48 -0
  238. package/dist/dictionaries/dictionaries.js.map +1 -0
  239. package/dist/downloads/DownloadManager.js +195 -0
  240. package/dist/downloads/DownloadManager.js.map +1 -0
  241. package/dist/downloads/downloadQueue.js +56 -0
  242. package/dist/downloads/downloadQueue.js.map +1 -0
  243. package/dist/downloads/downloadsMachine.js +80 -0
  244. package/dist/downloads/downloadsMachine.js.map +1 -0
  245. package/dist/downloads/fileTypes.js +22 -0
  246. package/dist/downloads/fileTypes.js.map +1 -0
  247. package/dist/excel/reportWorkbook.js +299 -0
  248. package/dist/excel/reportWorkbook.js.map +1 -0
  249. package/dist/excel.js +13 -0
  250. package/dist/excel.js.map +1 -0
  251. package/dist/feedback/ConfirmDialog.js +73 -0
  252. package/dist/feedback/ConfirmDialog.js.map +1 -0
  253. package/dist/feedback/ModalWaiting.js +23 -0
  254. package/dist/feedback/ModalWaiting.js.map +1 -0
  255. package/dist/feedback/NewBuildNotice.js +79 -0
  256. package/dist/feedback/NewBuildNotice.js.map +1 -0
  257. package/dist/feedback/StaleBuildBoundary.js +36 -0
  258. package/dist/feedback/StaleBuildBoundary.js.map +1 -0
  259. package/dist/feedback/Toaster.js +20 -0
  260. package/dist/feedback/Toaster.js.map +1 -0
  261. package/dist/feedback/confirmActionMachine.js +67 -0
  262. package/dist/feedback/confirmActionMachine.js.map +1 -0
  263. package/dist/feedback/toast.js +88 -0
  264. package/dist/feedback/toast.js.map +1 -0
  265. package/dist/feedback/useConfirmAction.js +40 -0
  266. package/dist/feedback/useConfirmAction.js.map +1 -0
  267. package/dist/filepond/FileDropzone.js +256 -0
  268. package/dist/filepond/FileDropzone.js.map +1 -0
  269. package/dist/filepond/pondServer.js +48 -0
  270. package/dist/filepond/pondServer.js.map +1 -0
  271. package/dist/filepond.js +10 -0
  272. package/dist/filepond.js.map +1 -0
  273. package/dist/files.js +43 -0
  274. package/dist/files.js.map +1 -0
  275. package/dist/formatting.js +205 -0
  276. package/dist/formatting.js.map +1 -0
  277. package/dist/forms/FormCatalogField.js +12 -0
  278. package/dist/forms/FormCatalogField.js.map +1 -0
  279. package/dist/forms/FormColorField.js +12 -0
  280. package/dist/forms/FormColorField.js.map +1 -0
  281. package/dist/forms/FormNumberField.js +12 -0
  282. package/dist/forms/FormNumberField.js.map +1 -0
  283. package/dist/forms/FormProblemAlert.js +15 -0
  284. package/dist/forms/FormProblemAlert.js.map +1 -0
  285. package/dist/forms/FormSelectField.js +12 -0
  286. package/dist/forms/FormSelectField.js.map +1 -0
  287. package/dist/forms/FormServerProblem.js +23 -0
  288. package/dist/forms/FormServerProblem.js.map +1 -0
  289. package/dist/forms/FormTextField.js +12 -0
  290. package/dist/forms/FormTextField.js.map +1 -0
  291. package/dist/forms/FormWizard.js +63 -0
  292. package/dist/forms/FormWizard.js.map +1 -0
  293. package/dist/forms/SubmitButton.js +14 -0
  294. package/dist/forms/SubmitButton.js.map +1 -0
  295. package/dist/forms/applyServerProblem.js +15 -0
  296. package/dist/forms/applyServerProblem.js.map +1 -0
  297. package/dist/forms/auth/ChangePasswordForm.js +47 -0
  298. package/dist/forms/auth/ChangePasswordForm.js.map +1 -0
  299. package/dist/forms/auth/ForgotPasswordForm.js +50 -0
  300. package/dist/forms/auth/ForgotPasswordForm.js.map +1 -0
  301. package/dist/forms/auth/SignInForm.js +48 -0
  302. package/dist/forms/auth/SignInForm.js.map +1 -0
  303. package/dist/forms/security/SecondStepForm.js +122 -0
  304. package/dist/forms/security/SecondStepForm.js.map +1 -0
  305. package/dist/forms/security/TwoStepVerificationCard.js +338 -0
  306. package/dist/forms/security/TwoStepVerificationCard.js.map +1 -0
  307. package/dist/forms/security/securityRules.js +28 -0
  308. package/dist/forms/security/securityRules.js.map +1 -0
  309. package/dist/forms/serverProblemFields.js +25 -0
  310. package/dist/forms/serverProblemFields.js.map +1 -0
  311. package/dist/forms/useFormikField.js +16 -0
  312. package/dist/forms/useFormikField.js.map +1 -0
  313. package/dist/forms/validation.js +55 -0
  314. package/dist/forms/validation.js.map +1 -0
  315. package/dist/forms/validationMessages.js +16 -0
  316. package/dist/forms/validationMessages.js.map +1 -0
  317. package/dist/forms.js +57 -0
  318. package/dist/forms.js.map +1 -0
  319. package/dist/hookForm/FormCatalogField.js +12 -0
  320. package/dist/hookForm/FormCatalogField.js.map +1 -0
  321. package/dist/hookForm/FormColorField.js +12 -0
  322. package/dist/hookForm/FormColorField.js.map +1 -0
  323. package/dist/hookForm/FormNumberField.js +12 -0
  324. package/dist/hookForm/FormNumberField.js.map +1 -0
  325. package/dist/hookForm/FormProblemAlert.js +17 -0
  326. package/dist/hookForm/FormProblemAlert.js.map +1 -0
  327. package/dist/hookForm/FormSelectField.js +12 -0
  328. package/dist/hookForm/FormSelectField.js.map +1 -0
  329. package/dist/hookForm/FormTextField.js +12 -0
  330. package/dist/hookForm/FormTextField.js.map +1 -0
  331. package/dist/hookForm/FormWizard.js +59 -0
  332. package/dist/hookForm/FormWizard.js.map +1 -0
  333. package/dist/hookForm/SubmitButton.js +15 -0
  334. package/dist/hookForm/SubmitButton.js.map +1 -0
  335. package/dist/hookForm/applyServerProblem.js +21 -0
  336. package/dist/hookForm/applyServerProblem.js.map +1 -0
  337. package/dist/hookForm/useHookFormField.js +19 -0
  338. package/dist/hookForm/useHookFormField.js.map +1 -0
  339. package/dist/i18next.js +5 -0
  340. package/dist/i18next.js.map +1 -0
  341. package/dist/identifiers.js +8 -0
  342. package/dist/identifiers.js.map +1 -0
  343. package/dist/inbox/InboxLayout.js +104 -0
  344. package/dist/inbox/InboxLayout.js.map +1 -0
  345. package/dist/inbox/MessageList.js +114 -0
  346. package/dist/inbox/MessageList.js.map +1 -0
  347. package/dist/inbox/MessageView.js +104 -0
  348. package/dist/inbox/MessageView.js.map +1 -0
  349. package/dist/inbox/inboxDates.js +9 -0
  350. package/dist/inbox/inboxDates.js.map +1 -0
  351. package/dist/index.js +407 -0
  352. package/dist/index.js.map +1 -0
  353. package/dist/inputs/CatalogInput.js +66 -0
  354. package/dist/inputs/CatalogInput.js.map +1 -0
  355. package/dist/inputs/ColorInput.js +109 -0
  356. package/dist/inputs/ColorInput.js.map +1 -0
  357. package/dist/inputs/FieldFrame.js +20 -0
  358. package/dist/inputs/FieldFrame.js.map +1 -0
  359. package/dist/inputs/FormSection.js +105 -0
  360. package/dist/inputs/FormSection.js.map +1 -0
  361. package/dist/inputs/NumberInput.js +70 -0
  362. package/dist/inputs/NumberInput.js.map +1 -0
  363. package/dist/inputs/SelectInput.js +84 -0
  364. package/dist/inputs/SelectInput.js.map +1 -0
  365. package/dist/inputs/TextInput.js +101 -0
  366. package/dist/inputs/TextInput.js.map +1 -0
  367. package/dist/inputs/WizardLayout.js +54 -0
  368. package/dist/inputs/WizardLayout.js.map +1 -0
  369. package/dist/inputs/colorContrast.js +46 -0
  370. package/dist/inputs/colorContrast.js.map +1 -0
  371. package/dist/inputs/formLayoutContext.js +9 -0
  372. package/dist/inputs/formLayoutContext.js.map +1 -0
  373. package/dist/inputs/numberText.js +48 -0
  374. package/dist/inputs/numberText.js.map +1 -0
  375. package/dist/kanban/KanbanBoard.js +338 -0
  376. package/dist/kanban/KanbanBoard.js.map +1 -0
  377. package/dist/kanban/kanbanCards.js +19 -0
  378. package/dist/kanban/kanbanCards.js.map +1 -0
  379. package/dist/kanban/kanbanMoves.js +29 -0
  380. package/dist/kanban/kanbanMoves.js.map +1 -0
  381. package/dist/kanban.js +15 -0
  382. package/dist/kanban.js.map +1 -0
  383. package/dist/laravel/csrfRetry.js +18 -0
  384. package/dist/laravel/csrfRetry.js.map +1 -0
  385. package/dist/laravel.js +6 -0
  386. package/dist/laravel.js.map +1 -0
  387. package/dist/lastListUrl.js +35 -0
  388. package/dist/lastListUrl.js.map +1 -0
  389. package/dist/locales/en.js +787 -0
  390. package/dist/locales/en.js.map +1 -0
  391. package/dist/locales/es.js +787 -0
  392. package/dist/locales/es.js.map +1 -0
  393. package/dist/maps/MapView.js +116 -0
  394. package/dist/maps/MapView.js.map +1 -0
  395. package/dist/maps/mapMarkers.js +19 -0
  396. package/dist/maps/mapMarkers.js.map +1 -0
  397. package/dist/maps.js +10 -0
  398. package/dist/maps.js.map +1 -0
  399. package/dist/money/money.js +380 -0
  400. package/dist/money/money.js.map +1 -0
  401. package/dist/money.js +6 -0
  402. package/dist/money.js.map +1 -0
  403. package/dist/navigation/appMenu.js +93 -0
  404. package/dist/navigation/appMenu.js.map +1 -0
  405. package/dist/navigation/useMenuBadges.js +45 -0
  406. package/dist/navigation/useMenuBadges.js.map +1 -0
  407. package/dist/navigation.js +30 -0
  408. package/dist/navigation.js.map +1 -0
  409. package/dist/navigationTrail.js +82 -0
  410. package/dist/navigationTrail.js.map +1 -0
  411. package/dist/next.js +5 -0
  412. package/dist/next.js.map +1 -0
  413. package/dist/observability/buildWatch.js +19 -0
  414. package/dist/observability/buildWatch.js.map +1 -0
  415. package/dist/observability/logger.js +43 -0
  416. package/dist/observability/logger.js.map +1 -0
  417. package/dist/observability/publishedBuild.js +39 -0
  418. package/dist/observability/publishedBuild.js.map +1 -0
  419. package/dist/observability/usePublishedBuildWatch.js +77 -0
  420. package/dist/observability/usePublishedBuildWatch.js.map +1 -0
  421. package/dist/passkeys.js +7 -0
  422. package/dist/passkeys.js.map +1 -0
  423. package/dist/periodRanges.js +33 -0
  424. package/dist/periodRanges.js.map +1 -0
  425. package/dist/problems.js +51 -0
  426. package/dist/problems.js.map +1 -0
  427. package/dist/pwa/InstallAppSetting.js +34 -0
  428. package/dist/pwa/InstallAppSetting.js.map +1 -0
  429. package/dist/pwa/InstallInstructionsDialog.js +35 -0
  430. package/dist/pwa/InstallInstructionsDialog.js.map +1 -0
  431. package/dist/pwa/InstallPromptBanner.js +70 -0
  432. package/dist/pwa/InstallPromptBanner.js.map +1 -0
  433. package/dist/pwa/installInstructions.js +60 -0
  434. package/dist/pwa/installInstructions.js.map +1 -0
  435. package/dist/pwa/useInstallPrompt.js +71 -0
  436. package/dist/pwa/useInstallPrompt.js.map +1 -0
  437. package/dist/react-hook-form.js +32 -0
  438. package/dist/react-hook-form.js.map +1 -0
  439. package/dist/react-router.js +10 -0
  440. package/dist/react-router.js.map +1 -0
  441. package/dist/security/ActivityLog.js +80 -0
  442. package/dist/security/ActivityLog.js.map +1 -0
  443. package/dist/security/RecoveryCodesDialog.js +85 -0
  444. package/dist/security/RecoveryCodesDialog.js.map +1 -0
  445. package/dist/security/SessionsCard.js +83 -0
  446. package/dist/security/SessionsCard.js.map +1 -0
  447. package/dist/security/passkeys.js +39 -0
  448. package/dist/security/passkeys.js.map +1 -0
  449. package/dist/table.js +37 -0
  450. package/dist/table.js.map +1 -0
  451. package/dist/theme/androidDevice.js +16 -0
  452. package/dist/theme/androidDevice.js.map +1 -0
  453. package/dist/theme/appleTracking.js +34 -0
  454. package/dist/theme/appleTracking.js.map +1 -0
  455. package/dist/theme/components/MuiAppBar.js +27 -0
  456. package/dist/theme/components/MuiAppBar.js.map +1 -0
  457. package/dist/theme/components/MuiBackdrop.js +13 -0
  458. package/dist/theme/components/MuiBackdrop.js.map +1 -0
  459. package/dist/theme/components/MuiButton.js +25 -0
  460. package/dist/theme/components/MuiButton.js.map +1 -0
  461. package/dist/theme/components/MuiButtonBase.js +16 -0
  462. package/dist/theme/components/MuiButtonBase.js.map +1 -0
  463. package/dist/theme/components/MuiChip.js +30 -0
  464. package/dist/theme/components/MuiChip.js.map +1 -0
  465. package/dist/theme/components/MuiDataGrid.js +30 -0
  466. package/dist/theme/components/MuiDataGrid.js.map +1 -0
  467. package/dist/theme/components/MuiDialog.js +13 -0
  468. package/dist/theme/components/MuiDialog.js.map +1 -0
  469. package/dist/theme/components/MuiDrawer.js +18 -0
  470. package/dist/theme/components/MuiDrawer.js.map +1 -0
  471. package/dist/theme/components/MuiMenuItem.js +17 -0
  472. package/dist/theme/components/MuiMenuItem.js.map +1 -0
  473. package/dist/theme/components/MuiTypography.js +22 -0
  474. package/dist/theme/components/MuiTypography.js.map +1 -0
  475. package/dist/theme/components/glassComponents.js +885 -0
  476. package/dist/theme/components/glassComponents.js.map +1 -0
  477. package/dist/theme/components/minimalComponents.js +146 -0
  478. package/dist/theme/components/minimalComponents.js.map +1 -0
  479. package/dist/theme/components/paletteOf.js +7 -0
  480. package/dist/theme/components/paletteOf.js.map +1 -0
  481. package/dist/theme/createToolkitTheme.js +100 -0
  482. package/dist/theme/createToolkitTheme.js.map +1 -0
  483. package/dist/theme/glassSurface.js +328 -0
  484. package/dist/theme/glassSurface.js.map +1 -0
  485. package/dist/theme/glassToasterStyles.js +50 -0
  486. package/dist/theme/glassToasterStyles.js.map +1 -0
  487. package/dist/theme/mergeComponents.js +42 -0
  488. package/dist/theme/mergeComponents.js.map +1 -0
  489. package/dist/theme/stackcraftPalette.js +59 -0
  490. package/dist/theme/stackcraftPalette.js.map +1 -0
  491. package/dist/theme/toolkitComponents.js +28 -0
  492. package/dist/theme/toolkitComponents.js.map +1 -0
  493. package/dist/timeline.js +8 -0
  494. package/dist/timeline.js.map +1 -0
  495. package/dist/toolkit/ComponentTexts.js +13 -0
  496. package/dist/toolkit/ComponentTexts.js.map +1 -0
  497. package/dist/toolkit/ToolkitProvider.js +57 -0
  498. package/dist/toolkit/ToolkitProvider.js.map +1 -0
  499. package/dist/toolkit/browserNavigation.js +33 -0
  500. package/dist/toolkit/browserNavigation.js.map +1 -0
  501. package/dist/toolkit/componentTextsContext.js +15 -0
  502. package/dist/toolkit/componentTextsContext.js.map +1 -0
  503. package/dist/toolkit/hashNavigation.js +40 -0
  504. package/dist/toolkit/hashNavigation.js.map +1 -0
  505. package/dist/toolkit/navigationPaths.js +49 -0
  506. package/dist/toolkit/navigationPaths.js.map +1 -0
  507. package/dist/toolkit/toolkitContext.js +19 -0
  508. package/dist/toolkit/toolkitContext.js.map +1 -0
  509. package/dist/toolkit/toolkitSettings.js +107 -0
  510. package/dist/toolkit/toolkitSettings.js.map +1 -0
  511. package/dist/toolkit/useFormatters.js +12 -0
  512. package/dist/toolkit/useFormatters.js.map +1 -0
  513. package/dist/toolkit/useToolkitTranslation.js +22 -0
  514. package/dist/toolkit/useToolkitTranslation.js.map +1 -0
  515. package/dist/types/DataTable/AuditTrailDialog.d.ts +32 -0
  516. package/dist/types/DataTable/AuditTrailTable.d.ts +30 -0
  517. package/dist/types/DataTable/ColumnFilters/HeaderFilterPopover.d.ts +8 -0
  518. package/dist/types/DataTable/ColumnFilters/MultiSelectColumnFilter.d.ts +16 -0
  519. package/dist/types/DataTable/ColumnFilters/SortableFilterHeader.d.ts +26 -0
  520. package/dist/types/DataTable/ColumnFilters/TextColumnFilter.d.ts +8 -0
  521. package/dist/types/DataTable/ColumnFilters/index.d.ts +4 -0
  522. package/dist/types/DataTable/EmptyState.d.ts +13 -0
  523. package/dist/types/DataTable/FilterChips.d.ts +17 -0
  524. package/dist/types/DataTable/GoToPage.d.ts +13 -0
  525. package/dist/types/DataTable/SelectionBar.d.ts +32 -0
  526. package/dist/types/DataTable/ServerTable.d.ts +171 -0
  527. package/dist/types/DataTable/buildChipConfig.d.ts +22 -0
  528. package/dist/types/DataTable/columns.d.ts +93 -0
  529. package/dist/types/DataTable/filterContext.d.ts +13 -0
  530. package/dist/types/DataTable/index.d.ts +13 -0
  531. package/dist/types/DataTable/rowSelection.d.ts +113 -0
  532. package/dist/types/DataTable/serverTableParams.d.ts +16 -0
  533. package/dist/types/DataTable/tableMachine.d.ts +41 -0
  534. package/dist/types/DataTable/useDebouncedFilter.d.ts +8 -0
  535. package/dist/types/DataTable/useTableState.d.ts +93 -0
  536. package/dist/types/access/Can.d.ts +11 -0
  537. package/dist/types/access/PermissionMatrix.d.ts +23 -0
  538. package/dist/types/access/RequireAccess.d.ts +11 -0
  539. package/dist/types/access/accessRules.d.ts +24 -0
  540. package/dist/types/access/permissionGroups.d.ts +56 -0
  541. package/dist/types/access/useCan.d.ts +11 -0
  542. package/dist/types/account/AccountProvider.d.ts +27 -0
  543. package/dist/types/account/AccountSecuritySection.d.ts +9 -0
  544. package/dist/types/account/DemoTotpCodeButton.d.ts +6 -0
  545. package/dist/types/account/ForgotPasswordScreen.d.ts +17 -0
  546. package/dist/types/account/ProfileScreen.d.ts +43 -0
  547. package/dist/types/account/ResetPasswordScreen.d.ts +21 -0
  548. package/dist/types/account/SignInScreen.d.ts +27 -0
  549. package/dist/types/account/accountConnector.d.ts +268 -0
  550. package/dist/types/account/demo/createDemoAccountConnector.d.ts +30 -0
  551. package/dist/types/account/demo/totp.d.ts +45 -0
  552. package/dist/types/account/restAccountConnector.d.ts +49 -0
  553. package/dist/types/account-demo.d.ts +2 -0
  554. package/dist/types/account.d.ts +16 -0
  555. package/dist/types/adapters/i18next.d.ts +11 -0
  556. package/dist/types/adapters/nextNavigation.d.ts +33 -0
  557. package/dist/types/adapters/reactRouter.d.ts +6 -0
  558. package/dist/types/adapters/reactRouterRoutes.d.ts +42 -0
  559. package/dist/types/api/ApiError.d.ts +42 -0
  560. package/dist/types/api/createApiClient.d.ts +174 -0
  561. package/dist/types/api/staleChunks.d.ts +15 -0
  562. package/dist/types/appShell/AccountMenu.d.ts +28 -0
  563. package/dist/types/appShell/AppLayout.d.ts +76 -0
  564. package/dist/types/appShell/AppearanceSettings.d.ts +41 -0
  565. package/dist/types/appShell/AuthLayout.d.ts +21 -0
  566. package/dist/types/appShell/BarActionButton.d.ts +15 -0
  567. package/dist/types/appShell/BarActions.d.ts +23 -0
  568. package/dist/types/appShell/BarCapsule.d.ts +20 -0
  569. package/dist/types/appShell/BarSearch.d.ts +24 -0
  570. package/dist/types/appShell/HeaderTools.d.ts +27 -0
  571. package/dist/types/appShell/MobileTabBar.d.ts +20 -0
  572. package/dist/types/appShell/SettingsMenu.d.ts +13 -0
  573. package/dist/types/appShell/SideMenu.d.ts +31 -0
  574. package/dist/types/appShell/SideMenuEntry.d.ts +17 -0
  575. package/dist/types/appShell/SubmenuActionsMenu.d.ts +24 -0
  576. package/dist/types/appShell/TabBarEditor.d.ts +13 -0
  577. package/dist/types/appShell/TopMenu.d.ts +7 -0
  578. package/dist/types/appShell/appMenuContext.d.ts +9 -0
  579. package/dist/types/appShell/barActionsSlot.d.ts +35 -0
  580. package/dist/types/appShell/barMenuPlacement.d.ts +9 -0
  581. package/dist/types/appShell/menuItemText.d.ts +55 -0
  582. package/dist/types/appShell/pageTitle.d.ts +26 -0
  583. package/dist/types/appShell/shellSizes.d.ts +46 -0
  584. package/dist/types/appShell/tabBarRule.d.ts +5 -0
  585. package/dist/types/appShell/tabBarScroll.d.ts +26 -0
  586. package/dist/types/appShell/useDrawerCollapsed.d.ts +8 -0
  587. package/dist/types/appShell/useFittingActionCount.d.ts +7 -0
  588. package/dist/types/appShell/usePinnedMobileTabs.d.ts +7 -0
  589. package/dist/types/appShell/useTabBarMinimized.d.ts +8 -0
  590. package/dist/types/auth/PasswordChecklist.d.ts +13 -0
  591. package/dist/types/auth/passwordRules.d.ts +34 -0
  592. package/dist/types/calendar/EventCalendar.d.ts +63 -0
  593. package/dist/types/calendar/EventDetails.d.ts +36 -0
  594. package/dist/types/calendar/calendarEvents.d.ts +27 -0
  595. package/dist/types/calendar.d.ts +3 -0
  596. package/dist/types/charts.d.ts +6 -0
  597. package/dist/types/date-pickers.d.ts +2 -0
  598. package/dist/types/datePickers/DateInput.d.ts +41 -0
  599. package/dist/types/datePickers/FormDateField.d.ts +7 -0
  600. package/dist/types/dates.d.ts +18 -0
  601. package/dist/types/dictionaries/dictionaries.d.ts +54 -0
  602. package/dist/types/downloads/DownloadManager.d.ts +7 -0
  603. package/dist/types/downloads/downloadQueue.d.ts +50 -0
  604. package/dist/types/downloads/downloadsMachine.d.ts +10 -0
  605. package/dist/types/downloads/fileTypes.d.ts +39 -0
  606. package/dist/types/downloads/index.d.ts +4 -0
  607. package/dist/types/excel/reportWorkbook.d.ts +157 -0
  608. package/dist/types/excel.d.ts +1 -0
  609. package/dist/types/feedback/ConfirmDialog.d.ts +31 -0
  610. package/dist/types/feedback/ModalWaiting.d.ts +13 -0
  611. package/dist/types/feedback/NewBuildNotice.d.ts +20 -0
  612. package/dist/types/feedback/StaleBuildBoundary.d.ts +21 -0
  613. package/dist/types/feedback/Toaster.d.ts +1 -0
  614. package/dist/types/feedback/confirmActionMachine.d.ts +19 -0
  615. package/dist/types/feedback/index.d.ts +8 -0
  616. package/dist/types/feedback/toast.d.ts +100 -0
  617. package/dist/types/feedback/useConfirmAction.d.ts +33 -0
  618. package/dist/types/filepond/FileDropzone.d.ts +61 -0
  619. package/dist/types/filepond/pondServer.d.ts +17 -0
  620. package/dist/types/filepond.d.ts +3 -0
  621. package/dist/types/files.d.ts +29 -0
  622. package/dist/types/formatting.d.ts +61 -0
  623. package/dist/types/forms/FormCatalogField.d.ts +6 -0
  624. package/dist/types/forms/FormColorField.d.ts +6 -0
  625. package/dist/types/forms/FormNumberField.d.ts +6 -0
  626. package/dist/types/forms/FormProblemAlert.d.ts +6 -0
  627. package/dist/types/forms/FormSelectField.d.ts +6 -0
  628. package/dist/types/forms/FormServerProblem.d.ts +8 -0
  629. package/dist/types/forms/FormTextField.d.ts +6 -0
  630. package/dist/types/forms/FormWizard.d.ts +22 -0
  631. package/dist/types/forms/SubmitButton.d.ts +9 -0
  632. package/dist/types/forms/applyServerProblem.d.ts +9 -0
  633. package/dist/types/forms/auth/ChangePasswordForm.d.ts +17 -0
  634. package/dist/types/forms/auth/ForgotPasswordForm.d.ts +14 -0
  635. package/dist/types/forms/auth/SignInForm.d.ts +20 -0
  636. package/dist/types/forms/index.d.ts +19 -0
  637. package/dist/types/forms/security/SecondStepForm.d.ts +30 -0
  638. package/dist/types/forms/security/TwoStepVerificationCard.d.ts +83 -0
  639. package/dist/types/forms/security/securityRules.d.ts +24 -0
  640. package/dist/types/forms/serverProblemFields.d.ts +19 -0
  641. package/dist/types/forms/useFormikField.d.ts +11 -0
  642. package/dist/types/forms/validation.d.ts +251 -0
  643. package/dist/types/forms/validationMessages.d.ts +12 -0
  644. package/dist/types/forms.d.ts +2 -0
  645. package/dist/types/hookForm/FormCatalogField.d.ts +8 -0
  646. package/dist/types/hookForm/FormColorField.d.ts +8 -0
  647. package/dist/types/hookForm/FormNumberField.d.ts +8 -0
  648. package/dist/types/hookForm/FormProblemAlert.d.ts +7 -0
  649. package/dist/types/hookForm/FormSelectField.d.ts +8 -0
  650. package/dist/types/hookForm/FormTextField.d.ts +8 -0
  651. package/dist/types/hookForm/FormWizard.d.ts +22 -0
  652. package/dist/types/hookForm/SubmitButton.d.ts +21 -0
  653. package/dist/types/hookForm/applyServerProblem.d.ts +10 -0
  654. package/dist/types/hookForm/useHookFormField.d.ts +13 -0
  655. package/dist/types/i18next.d.ts +1 -0
  656. package/dist/types/identifiers.d.ts +2 -0
  657. package/dist/types/inbox/InboxLayout.d.ts +38 -0
  658. package/dist/types/inbox/MessageList.d.ts +52 -0
  659. package/dist/types/inbox/MessageView.d.ts +55 -0
  660. package/dist/types/inbox/inboxDates.d.ts +11 -0
  661. package/dist/types/index.d.ts +91 -0
  662. package/dist/types/inputs/CatalogInput.d.ts +45 -0
  663. package/dist/types/inputs/ColorInput.d.ts +30 -0
  664. package/dist/types/inputs/FieldFrame.d.ts +14 -0
  665. package/dist/types/inputs/FormSection.d.ts +29 -0
  666. package/dist/types/inputs/NumberInput.d.ts +38 -0
  667. package/dist/types/inputs/SelectInput.d.ts +38 -0
  668. package/dist/types/inputs/TextInput.d.ts +62 -0
  669. package/dist/types/inputs/WizardLayout.d.ts +34 -0
  670. package/dist/types/inputs/colorContrast.d.ts +18 -0
  671. package/dist/types/inputs/formLayoutContext.d.ts +3 -0
  672. package/dist/types/inputs/numberText.d.ts +25 -0
  673. package/dist/types/kanban/KanbanBoard.d.ts +88 -0
  674. package/dist/types/kanban/kanbanCards.d.ts +22 -0
  675. package/dist/types/kanban/kanbanMoves.d.ts +38 -0
  676. package/dist/types/kanban.d.ts +3 -0
  677. package/dist/types/laravel/csrfRetry.d.ts +21 -0
  678. package/dist/types/laravel.d.ts +1 -0
  679. package/dist/types/lastListUrl.d.ts +20 -0
  680. package/dist/types/locales/en.d.ts +788 -0
  681. package/dist/types/locales/es.d.ts +788 -0
  682. package/dist/types/maps/MapView.d.ts +41 -0
  683. package/dist/types/maps/mapMarkers.d.ts +23 -0
  684. package/dist/types/maps.d.ts +2 -0
  685. package/dist/types/money/money.d.ts +203 -0
  686. package/dist/types/money.d.ts +1 -0
  687. package/dist/types/navigation/appMenu.d.ts +92 -0
  688. package/dist/types/navigation/useMenuBadges.d.ts +16 -0
  689. package/dist/types/navigation.d.ts +22 -0
  690. package/dist/types/navigationTrail.d.ts +49 -0
  691. package/dist/types/next.d.ts +1 -0
  692. package/dist/types/observability/buildWatch.d.ts +28 -0
  693. package/dist/types/observability/logger.d.ts +19 -0
  694. package/dist/types/observability/publishedBuild.d.ts +35 -0
  695. package/dist/types/observability/usePublishedBuildWatch.d.ts +18 -0
  696. package/dist/types/passkeys.d.ts +1 -0
  697. package/dist/types/periodRanges.d.ts +32 -0
  698. package/dist/types/problems.d.ts +31 -0
  699. package/dist/types/pwa/InstallAppSetting.d.ts +7 -0
  700. package/dist/types/pwa/InstallInstructionsDialog.d.ts +20 -0
  701. package/dist/types/pwa/InstallPromptBanner.d.ts +16 -0
  702. package/dist/types/pwa/installInstructions.d.ts +52 -0
  703. package/dist/types/pwa/useInstallPrompt.d.ts +13 -0
  704. package/dist/types/react-hook-form.d.ts +12 -0
  705. package/dist/types/react-router.d.ts +2 -0
  706. package/dist/types/security/ActivityLog.d.ts +33 -0
  707. package/dist/types/security/RecoveryCodesDialog.d.ts +16 -0
  708. package/dist/types/security/SessionsCard.d.ts +24 -0
  709. package/dist/types/security/passkeys.d.ts +18 -0
  710. package/dist/types/table.d.ts +3 -0
  711. package/dist/types/theme/androidDevice.d.ts +11 -0
  712. package/dist/types/theme/appleTracking.d.ts +17 -0
  713. package/dist/types/theme/components/MuiAppBar.d.ts +13 -0
  714. package/dist/types/theme/components/MuiBackdrop.d.ts +11 -0
  715. package/dist/types/theme/components/MuiButton.d.ts +27 -0
  716. package/dist/types/theme/components/MuiButtonBase.d.ts +14 -0
  717. package/dist/types/theme/components/MuiChip.d.ts +29 -0
  718. package/dist/types/theme/components/MuiDataGrid.d.ts +45 -0
  719. package/dist/types/theme/components/MuiDialog.d.ts +9 -0
  720. package/dist/types/theme/components/MuiDrawer.d.ts +13 -0
  721. package/dist/types/theme/components/MuiMenuItem.d.ts +17 -0
  722. package/dist/types/theme/components/MuiTypography.d.ts +20 -0
  723. package/dist/types/theme/components/glassComponents.d.ts +8 -0
  724. package/dist/types/theme/components/minimalComponents.d.ts +22 -0
  725. package/dist/types/theme/components/paletteOf.d.ts +5 -0
  726. package/dist/types/theme/createToolkitTheme.d.ts +48 -0
  727. package/dist/types/theme/glassSurface.d.ts +247 -0
  728. package/dist/types/theme/glassToasterStyles.d.ts +7 -0
  729. package/dist/types/theme/mergeComponents.d.ts +15 -0
  730. package/dist/types/theme/stackcraftPalette.d.ts +142 -0
  731. package/dist/types/theme/toolkitComponents.d.ts +4 -0
  732. package/dist/types/timeline.d.ts +2 -0
  733. package/dist/types/toolkit/ComponentTexts.d.ts +11 -0
  734. package/dist/types/toolkit/ToolkitProvider.d.ts +47 -0
  735. package/dist/types/toolkit/browserNavigation.d.ts +27 -0
  736. package/dist/types/toolkit/componentTextsContext.d.ts +20 -0
  737. package/dist/types/toolkit/hashNavigation.d.ts +12 -0
  738. package/dist/types/toolkit/navigationPaths.d.ts +43 -0
  739. package/dist/types/toolkit/toolkitContext.d.ts +28 -0
  740. package/dist/types/toolkit/toolkitSettings.d.ts +113 -0
  741. package/dist/types/toolkit/useFormatters.d.ts +6 -0
  742. package/dist/types/toolkit/useToolkitTranslation.d.ts +11 -0
  743. package/dist/types/ui/actions/ActionsMenu.d.ts +20 -0
  744. package/dist/types/ui/actions/CopyButton.d.ts +15 -0
  745. package/dist/types/ui/actions/DownloadMenu.d.ts +55 -0
  746. package/dist/types/ui/actions/SecretField.d.ts +17 -0
  747. package/dist/types/ui/actions/SelectionActions.d.ts +39 -0
  748. package/dist/types/ui/filters/DateRangeFilter.d.ts +18 -0
  749. package/dist/types/ui/filters/PeriodRangeSelector.d.ts +28 -0
  750. package/dist/types/ui/filters/QuickFilters.d.ts +23 -0
  751. package/dist/types/ui/filters/SegmentedControl.d.ts +44 -0
  752. package/dist/types/ui/index.d.ts +33 -0
  753. package/dist/types/ui/labels/DictionaryText.d.ts +7 -0
  754. package/dist/types/ui/labels/StatusChip.d.ts +21 -0
  755. package/dist/types/ui/labels/Tag.d.ts +19 -0
  756. package/dist/types/ui/labels/tagOf.d.ts +13 -0
  757. package/dist/types/ui/layout/CollapsibleSection.d.ts +18 -0
  758. package/dist/types/ui/layout/ContentDialog.d.ts +15 -0
  759. package/dist/types/ui/layout/DefinitionList.d.ts +15 -0
  760. package/dist/types/ui/layout/DetailHeader.d.ts +15 -0
  761. package/dist/types/ui/layout/ErrorPage.d.ts +35 -0
  762. package/dist/types/ui/layout/FullPageLoader.d.ts +7 -0
  763. package/dist/types/ui/layout/GlassLensFilter.d.ts +1 -0
  764. package/dist/types/ui/layout/GlassPanel.d.ts +11 -0
  765. package/dist/types/ui/layout/PageHeader.d.ts +15 -0
  766. package/dist/types/ui/layout/PageHeading.d.ts +20 -0
  767. package/dist/types/ui/layout/ProfileHeader.d.ts +17 -0
  768. package/dist/types/ui/layout/ScrollableRow.d.ts +33 -0
  769. package/dist/types/ui/layout/SectionCard.d.ts +11 -0
  770. package/dist/types/ui/layout/appBarHeight.d.ts +13 -0
  771. package/dist/types/ui/metrics/BarList.d.ts +25 -0
  772. package/dist/types/ui/metrics/CalendarHeatmap.d.ts +34 -0
  773. package/dist/types/ui/metrics/ChartTooltip.d.ts +11 -0
  774. package/dist/types/ui/metrics/ColumnChart.d.ts +47 -0
  775. package/dist/types/ui/metrics/LineChart.d.ts +41 -0
  776. package/dist/types/ui/metrics/MetricCard.d.ts +39 -0
  777. package/dist/types/ui/metrics/TableToggle.d.ts +14 -0
  778. package/dist/types/ui/metrics/barListLabels.d.ts +17 -0
  779. package/dist/types/ui/metrics/chartParts.d.ts +112 -0
  780. package/dist/types/ui/metrics/heatmapScale.d.ts +45 -0
  781. package/dist/types/ui/navigation/BackButton.d.ts +13 -0
  782. package/dist/types/ui/navigation/ColorSchemeToggle.d.ts +13 -0
  783. package/dist/types/ui/navigation/DocumentTitle.d.ts +6 -0
  784. package/dist/types/ui/navigation/FontSizeToggle.d.ts +11 -0
  785. package/dist/types/ui/navigation/LanguageToggle.d.ts +13 -0
  786. package/dist/types/ui/navigation/PageBreadcrumbs.d.ts +12 -0
  787. package/dist/types/ui/navigation/colorMode.d.ts +18 -0
  788. package/dist/types/ui/navigation/fontSizeLevels.d.ts +25 -0
  789. package/dist/types/ui/navigation/useFontSize.d.ts +10 -0
  790. package/dist/types/ui/timeline/GroupedTimeline.d.ts +41 -0
  791. package/dist/types/ui/timeline/timelineDot.d.ts +19 -0
  792. package/dist/types/upload/FileDropzone.d.ts +36 -0
  793. package/dist/types/upload/fileRules.d.ts +51 -0
  794. package/dist/types/upload/uploadMachine.d.ts +23 -0
  795. package/dist/types/upload/uploadWithProgress.d.ts +16 -0
  796. package/dist/ui/actions/ActionsMenu.js +51 -0
  797. package/dist/ui/actions/ActionsMenu.js.map +1 -0
  798. package/dist/ui/actions/CopyButton.js +28 -0
  799. package/dist/ui/actions/CopyButton.js.map +1 -0
  800. package/dist/ui/actions/DownloadMenu.js +162 -0
  801. package/dist/ui/actions/DownloadMenu.js.map +1 -0
  802. package/dist/ui/actions/SecretField.js +61 -0
  803. package/dist/ui/actions/SecretField.js.map +1 -0
  804. package/dist/ui/actions/SelectionActions.js +142 -0
  805. package/dist/ui/actions/SelectionActions.js.map +1 -0
  806. package/dist/ui/filters/DateRangeFilter.js +87 -0
  807. package/dist/ui/filters/DateRangeFilter.js.map +1 -0
  808. package/dist/ui/filters/PeriodRangeSelector.js +56 -0
  809. package/dist/ui/filters/PeriodRangeSelector.js.map +1 -0
  810. package/dist/ui/filters/QuickFilters.js +91 -0
  811. package/dist/ui/filters/QuickFilters.js.map +1 -0
  812. package/dist/ui/filters/SegmentedControl.js +80 -0
  813. package/dist/ui/filters/SegmentedControl.js.map +1 -0
  814. package/dist/ui/labels/DictionaryText.js +11 -0
  815. package/dist/ui/labels/DictionaryText.js.map +1 -0
  816. package/dist/ui/labels/StatusChip.js +52 -0
  817. package/dist/ui/labels/StatusChip.js.map +1 -0
  818. package/dist/ui/labels/Tag.js +26 -0
  819. package/dist/ui/labels/Tag.js.map +1 -0
  820. package/dist/ui/labels/tagOf.js +7 -0
  821. package/dist/ui/labels/tagOf.js.map +1 -0
  822. package/dist/ui/layout/CollapsibleSection.js +52 -0
  823. package/dist/ui/layout/CollapsibleSection.js.map +1 -0
  824. package/dist/ui/layout/ContentDialog.js +97 -0
  825. package/dist/ui/layout/ContentDialog.js.map +1 -0
  826. package/dist/ui/layout/DefinitionList.js +30 -0
  827. package/dist/ui/layout/DefinitionList.js.map +1 -0
  828. package/dist/ui/layout/DetailHeader.js +27 -0
  829. package/dist/ui/layout/DetailHeader.js.map +1 -0
  830. package/dist/ui/layout/ErrorPage.js +54 -0
  831. package/dist/ui/layout/ErrorPage.js.map +1 -0
  832. package/dist/ui/layout/FullPageLoader.js +13 -0
  833. package/dist/ui/layout/FullPageLoader.js.map +1 -0
  834. package/dist/ui/layout/GlassLensFilter.js +53 -0
  835. package/dist/ui/layout/GlassLensFilter.js.map +1 -0
  836. package/dist/ui/layout/GlassPanel.js +18 -0
  837. package/dist/ui/layout/GlassPanel.js.map +1 -0
  838. package/dist/ui/layout/PageHeader.js +23 -0
  839. package/dist/ui/layout/PageHeader.js.map +1 -0
  840. package/dist/ui/layout/PageHeading.js +51 -0
  841. package/dist/ui/layout/PageHeading.js.map +1 -0
  842. package/dist/ui/layout/ProfileHeader.js +64 -0
  843. package/dist/ui/layout/ProfileHeader.js.map +1 -0
  844. package/dist/ui/layout/ScrollableRow.js +156 -0
  845. package/dist/ui/layout/ScrollableRow.js.map +1 -0
  846. package/dist/ui/layout/SectionCard.js +18 -0
  847. package/dist/ui/layout/SectionCard.js.map +1 -0
  848. package/dist/ui/layout/appBarHeight.js +42 -0
  849. package/dist/ui/layout/appBarHeight.js.map +1 -0
  850. package/dist/ui/metrics/BarList.js +94 -0
  851. package/dist/ui/metrics/BarList.js.map +1 -0
  852. package/dist/ui/metrics/CalendarHeatmap.js +136 -0
  853. package/dist/ui/metrics/CalendarHeatmap.js.map +1 -0
  854. package/dist/ui/metrics/ChartTooltip.js +16 -0
  855. package/dist/ui/metrics/ChartTooltip.js.map +1 -0
  856. package/dist/ui/metrics/ColumnChart.js +106 -0
  857. package/dist/ui/metrics/ColumnChart.js.map +1 -0
  858. package/dist/ui/metrics/LineChart.js +117 -0
  859. package/dist/ui/metrics/LineChart.js.map +1 -0
  860. package/dist/ui/metrics/MetricCard.js +97 -0
  861. package/dist/ui/metrics/MetricCard.js.map +1 -0
  862. package/dist/ui/metrics/TableToggle.js +15 -0
  863. package/dist/ui/metrics/TableToggle.js.map +1 -0
  864. package/dist/ui/metrics/barListLabels.js +9 -0
  865. package/dist/ui/metrics/barListLabels.js.map +1 -0
  866. package/dist/ui/metrics/chartParts.js +93 -0
  867. package/dist/ui/metrics/chartParts.js.map +1 -0
  868. package/dist/ui/metrics/heatmapScale.js +67 -0
  869. package/dist/ui/metrics/heatmapScale.js.map +1 -0
  870. package/dist/ui/navigation/BackButton.js +28 -0
  871. package/dist/ui/navigation/BackButton.js.map +1 -0
  872. package/dist/ui/navigation/ColorSchemeToggle.js +40 -0
  873. package/dist/ui/navigation/ColorSchemeToggle.js.map +1 -0
  874. package/dist/ui/navigation/DocumentTitle.js +11 -0
  875. package/dist/ui/navigation/DocumentTitle.js.map +1 -0
  876. package/dist/ui/navigation/FontSizeToggle.js +41 -0
  877. package/dist/ui/navigation/FontSizeToggle.js.map +1 -0
  878. package/dist/ui/navigation/LanguageToggle.js +48 -0
  879. package/dist/ui/navigation/LanguageToggle.js.map +1 -0
  880. package/dist/ui/navigation/PageBreadcrumbs.js +51 -0
  881. package/dist/ui/navigation/PageBreadcrumbs.js.map +1 -0
  882. package/dist/ui/navigation/colorMode.js +13 -0
  883. package/dist/ui/navigation/colorMode.js.map +1 -0
  884. package/dist/ui/navigation/fontSizeLevels.js +24 -0
  885. package/dist/ui/navigation/fontSizeLevels.js.map +1 -0
  886. package/dist/ui/navigation/useFontSize.js +44 -0
  887. package/dist/ui/navigation/useFontSize.js.map +1 -0
  888. package/dist/ui/timeline/GroupedTimeline.js +106 -0
  889. package/dist/ui/timeline/GroupedTimeline.js.map +1 -0
  890. package/dist/ui/timeline/timelineDot.js +20 -0
  891. package/dist/ui/timeline/timelineDot.js.map +1 -0
  892. package/dist/upload/FileDropzone.js +145 -0
  893. package/dist/upload/FileDropzone.js.map +1 -0
  894. package/dist/upload/fileRules.js +62 -0
  895. package/dist/upload/fileRules.js.map +1 -0
  896. package/dist/upload/uploadMachine.js +73 -0
  897. package/dist/upload/uploadMachine.js.map +1 -0
  898. package/dist/upload/uploadWithProgress.js +45 -0
  899. package/dist/upload/uploadWithProgress.js.map +1 -0
  900. package/package.json +311 -5
@@ -0,0 +1,338 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { DragDropContext, Droppable, Draggable } from "@hello-pangea/dnd";
5
+ import Avatar from "@mui/material/Avatar";
6
+ import AvatarGroup from "@mui/material/AvatarGroup";
7
+ import Box from "@mui/material/Box";
8
+ import Chip from "@mui/material/Chip";
9
+ import IconButton from "@mui/material/IconButton";
10
+ import Paper from "@mui/material/Paper";
11
+ import Stack from "@mui/material/Stack";
12
+ import TextField from "@mui/material/TextField";
13
+ import Tooltip from "@mui/material/Tooltip";
14
+ import Typography from "@mui/material/Typography";
15
+ import AddRoundedIcon from "@mui/icons-material/AddRounded";
16
+ import AttachFileRoundedIcon from "@mui/icons-material/AttachFileRounded";
17
+ import ChatBubbleOutlineRoundedIcon from "@mui/icons-material/ChatBubbleOutlineRounded";
18
+ import CheckBoxOutlinedIcon from "@mui/icons-material/CheckBoxOutlined";
19
+ import CheckCircleRoundedIcon from "@mui/icons-material/CheckCircleRounded";
20
+ import EventOutlinedIcon from "@mui/icons-material/EventOutlined";
21
+ import KeyboardDoubleArrowLeftRoundedIcon from "@mui/icons-material/KeyboardDoubleArrowLeftRounded";
22
+ import KeyboardDoubleArrowRightRoundedIcon from "@mui/icons-material/KeyboardDoubleArrowRightRounded";
23
+ import RadioButtonUncheckedRoundedIcon from "@mui/icons-material/RadioButtonUncheckedRounded";
24
+ import { initialsOf } from "../appShell/menuItemText.js";
25
+ import { useFormatters } from "../toolkit/useFormatters.js";
26
+ import { DUE_STATUS, todayIsoDateOf, dueStatusOf } from "./kanbanCards.js";
27
+ import { cardsOfColumn, isOverLimit } from "./kanbanMoves.js";
28
+ import { useToolkitTranslation } from "../toolkit/useToolkitTranslation.js";
29
+ import ActionsMenu from "../ui/actions/ActionsMenu.js";
30
+ import { tagOf } from "../ui/labels/tagOf.js";
31
+ const COLUMN_MIN_WIDTH_PIXELS = 220;
32
+ const EMPTY_COLUMN_MIN_HEIGHT = 96;
33
+ const MAX_VISIBLE_ASSIGNEES = 3;
34
+ const ASSIGNEE_AVATAR_PIXELS = 24;
35
+ const COLLAPSED_COLUMN_WIDTH_PIXELS = 52;
36
+ const DUE_COLOR = Object.freeze({ [DUE_STATUS.overdue]: "error.main", [DUE_STATUS.today]: "warning.dark", [DUE_STATUS.upcoming]: "text.secondary" });
37
+ function CompleteButton({ card, t, onComplete }) {
38
+ const label = card.completed ? t("reopen", { title: card.title }) : t("complete", { title: card.title });
39
+ return /* @__PURE__ */ jsx(Tooltip, { title: label, children: /* @__PURE__ */ jsx(
40
+ IconButton,
41
+ {
42
+ size: "small",
43
+ "aria-label": label,
44
+ "aria-pressed": Boolean(card.completed),
45
+ sx: { m: -0.5, color: card.completed ? "success.main" : "text.secondary" },
46
+ onClick: (event) => {
47
+ event.stopPropagation();
48
+ onComplete(card, !card.completed);
49
+ },
50
+ children: card.completed ? /* @__PURE__ */ jsx(CheckCircleRoundedIcon, { fontSize: "small" }) : /* @__PURE__ */ jsx(RadioButtonUncheckedRoundedIcon, { fontSize: "small" })
51
+ }
52
+ ) });
53
+ }
54
+ function DefaultCard({ card, t, today, onComplete }) {
55
+ const { formatDate } = useFormatters();
56
+ const dueStatus = card.completed && card.dueDate ? DUE_STATUS.upcoming : dueStatusOf(card.dueDate, today);
57
+ let dueText = "";
58
+ if (card.completed && card.dueDate) {
59
+ dueText = t("dueCompleted", { date: formatDate(card.dueDate) });
60
+ } else if (dueStatus === DUE_STATUS.overdue) {
61
+ dueText = t("dueOverdue", { date: formatDate(card.dueDate) });
62
+ } else if (dueStatus === DUE_STATUS.today) {
63
+ dueText = t("dueToday");
64
+ } else if (dueStatus) {
65
+ dueText = t("dueOn", { date: formatDate(card.dueDate) });
66
+ }
67
+ const hasFooter = dueStatus || card.checklist?.total > 0 || card.comments > 0 || card.attachments > 0 || card.assignees?.length > 0;
68
+ return /* @__PURE__ */ jsxs(Stack, { spacing: 0.75, children: [
69
+ card.tags?.length > 0 && /* @__PURE__ */ jsx(Stack, { direction: "row", spacing: 0.5, useFlexGap: true, sx: { flexWrap: "wrap" }, children: card.tags.map((rawTag) => {
70
+ const tag = tagOf(rawTag);
71
+ return /* @__PURE__ */ jsx(Chip, { label: tag.label, size: "small", color: tag.color, variant: tag.color === "default" ? "filled" : "outlined" }, tag.label);
72
+ }) }),
73
+ /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, sx: { alignItems: "flex-start" }, children: [
74
+ onComplete && /* @__PURE__ */ jsx(CompleteButton, { card, t, onComplete }),
75
+ !onComplete && card.completed && /* @__PURE__ */ jsx(CheckCircleRoundedIcon, { fontSize: "small", sx: { color: "success.main" }, titleAccess: t("completed") }),
76
+ /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", component: "p", sx: { color: card.completed ? "text.secondary" : void 0 }, children: card.title })
77
+ ] }),
78
+ card.description && /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: card.description }),
79
+ hasFooter && /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1.25, useFlexGap: true, sx: { alignItems: "center", flexWrap: "wrap", color: "text.secondary" }, children: [
80
+ dueStatus && /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 0.5, sx: { alignItems: "center", color: DUE_COLOR[dueStatus] }, children: [
81
+ /* @__PURE__ */ jsx(EventOutlinedIcon, { sx: { fontSize: 16 } }),
82
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", sx: { fontWeight: dueStatus === DUE_STATUS.upcoming ? 400 : 600 }, children: dueText })
83
+ ] }),
84
+ card.checklist?.total > 0 && /* @__PURE__ */ jsxs(
85
+ Stack,
86
+ {
87
+ direction: "row",
88
+ spacing: 0.5,
89
+ sx: { alignItems: "center" },
90
+ "aria-label": t("checklist", { done: card.checklist.done, total: card.checklist.total }),
91
+ children: [
92
+ /* @__PURE__ */ jsx(CheckBoxOutlinedIcon, { sx: { fontSize: 16 } }),
93
+ /* @__PURE__ */ jsxs(Typography, { variant: "caption", "aria-hidden": "true", children: [
94
+ card.checklist.done,
95
+ "/",
96
+ card.checklist.total
97
+ ] })
98
+ ]
99
+ }
100
+ ),
101
+ card.comments > 0 && /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 0.5, sx: { alignItems: "center" }, "aria-label": t("comments", { count: card.comments }), children: [
102
+ /* @__PURE__ */ jsx(ChatBubbleOutlineRoundedIcon, { sx: { fontSize: 16 } }),
103
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", "aria-hidden": "true", children: card.comments })
104
+ ] }),
105
+ card.attachments > 0 && /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 0.5, sx: { alignItems: "center" }, "aria-label": t("attachments", { count: card.attachments }), children: [
106
+ /* @__PURE__ */ jsx(AttachFileRoundedIcon, { sx: { fontSize: 16 } }),
107
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", "aria-hidden": "true", children: card.attachments })
108
+ ] }),
109
+ card.assignees?.length > 0 && /* @__PURE__ */ jsx(
110
+ AvatarGroup,
111
+ {
112
+ max: MAX_VISIBLE_ASSIGNEES,
113
+ sx: { ml: "auto", "& .MuiAvatar-root": { width: ASSIGNEE_AVATAR_PIXELS, height: ASSIGNEE_AVATAR_PIXELS, fontSize: 11 } },
114
+ "aria-label": t("assignees", { names: card.assignees.map((person) => person.name).join(", ") }),
115
+ children: card.assignees.map((person) => /* @__PURE__ */ jsx(Tooltip, { title: person.name, children: /* @__PURE__ */ jsx(Avatar, { alt: person.name, src: person.avatarUrl, children: initialsOf(person.name) }) }, person.id))
116
+ }
117
+ )
118
+ ] })
119
+ ] });
120
+ }
121
+ function QuickAdd({ columnTitle, onAdd, onClose, t }) {
122
+ const [title, setTitle] = useState("");
123
+ return /* @__PURE__ */ jsx(
124
+ TextField,
125
+ {
126
+ size: "small",
127
+ fullWidth: true,
128
+ autoFocus: true,
129
+ multiline: true,
130
+ maxRows: 4,
131
+ value: title,
132
+ placeholder: t("addCardPlaceholder"),
133
+ slotProps: { htmlInput: { "aria-label": t("addCard", { column: columnTitle }) } },
134
+ onChange: (event) => setTitle(event.target.value),
135
+ onBlur: () => !title.trim() && onClose(),
136
+ onKeyDown: (event) => {
137
+ if (event.key === "Escape") {
138
+ onClose();
139
+ }
140
+ if (event.key === "Enter" && !event.shiftKey) {
141
+ event.preventDefault();
142
+ if (title.trim()) {
143
+ onAdd(title.trim());
144
+ setTitle("");
145
+ }
146
+ }
147
+ }
148
+ }
149
+ );
150
+ }
151
+ function KanbanBoard({
152
+ columns,
153
+ cards,
154
+ onMove,
155
+ renderCard,
156
+ onCardClick,
157
+ onAddCard,
158
+ cardActions,
159
+ columnActions,
160
+ onCardComplete,
161
+ onColumnCollapse,
162
+ ariaLabel,
163
+ texts
164
+ }) {
165
+ const { t } = useToolkitTranslation("kanban", texts);
166
+ const [addingColumnId, setAddingColumnId] = useState(null);
167
+ const [collapsedIds, setCollapsedIds] = useState(() => new Set(columns.filter((column) => column.defaultCollapsed).map((column) => column.id)));
168
+ const toggleColumn = (columnId) => {
169
+ const collapsed = !collapsedIds.has(columnId);
170
+ setCollapsedIds((current) => {
171
+ const next = new Set(current);
172
+ if (collapsed) {
173
+ next.add(columnId);
174
+ } else {
175
+ next.delete(columnId);
176
+ }
177
+ return next;
178
+ });
179
+ onColumnCollapse?.(columnId, collapsed);
180
+ };
181
+ const today = todayIsoDateOf();
182
+ const columnTitleOf = (columnId) => columns.find((column) => column.id === columnId)?.title ?? columnId;
183
+ const cardTitleOf = (cardId) => cards.find((card) => card.id === cardId)?.title ?? cardId;
184
+ const announceStart = (start, provided) => provided.announce(t("lifted", {
185
+ title: cardTitleOf(start.draggableId),
186
+ column: columnTitleOf(start.source.droppableId),
187
+ position: start.source.index + 1
188
+ }));
189
+ const announceUpdate = (update, provided) => {
190
+ if (update.destination) {
191
+ provided.announce(t("moving", { column: columnTitleOf(update.destination.droppableId), position: update.destination.index + 1 }));
192
+ }
193
+ };
194
+ const finishMove = (result, provided) => {
195
+ const { draggableId, source, destination } = result;
196
+ if (!destination || destination.droppableId === source.droppableId && destination.index === source.index) {
197
+ provided.announce(t("cancelled", { title: cardTitleOf(draggableId) }));
198
+ return;
199
+ }
200
+ provided.announce(t("dropped", { title: cardTitleOf(draggableId), column: columnTitleOf(destination.droppableId), position: destination.index + 1 }));
201
+ onMove({ cardId: draggableId, fromColumnId: source.droppableId, toColumnId: destination.droppableId, toIndex: destination.index });
202
+ };
203
+ return /* @__PURE__ */ jsx(DragDropContext, { onDragStart: announceStart, onDragUpdate: announceUpdate, onDragEnd: finishMove, dragHandleUsageInstructions: t("instructions"), children: /* @__PURE__ */ jsx(Box, { role: "region", "aria-label": ariaLabel, sx: {
204
+ display: "flex",
205
+ gap: 2,
206
+ overflowX: "auto",
207
+ pb: 1,
208
+ scrollSnapType: "x proximity",
209
+ alignItems: "flex-start"
210
+ }, children: columns.map((column) => {
211
+ const columnCards = cardsOfColumn(cards, column.id);
212
+ const total = Number.isInteger(column.count) ? column.count : columnCards.length;
213
+ const isOver = isOverLimit(column, total);
214
+ const count = Number.isInteger(column.limit) ? `${total} / ${column.limit}` : String(total);
215
+ const isCollapsed = column.collapsible && collapsedIds.has(column.id);
216
+ if (isCollapsed) {
217
+ return /* @__PURE__ */ jsx(Droppable, { droppableId: column.id, children: (droppableProvided, droppableSnapshot) => /* @__PURE__ */ jsxs(
218
+ Paper,
219
+ {
220
+ ref: droppableProvided.innerRef,
221
+ ...droppableProvided.droppableProps,
222
+ variant: "outlined",
223
+ component: "section",
224
+ "aria-label": column.title,
225
+ sx: {
226
+ flex: "0 0 auto",
227
+ width: COLLAPSED_COLUMN_WIDTH_PIXELS,
228
+ py: 1,
229
+ borderRadius: 3,
230
+ display: "flex",
231
+ flexDirection: "column",
232
+ alignItems: "center",
233
+ gap: 1,
234
+ minHeight: EMPTY_COLUMN_MIN_HEIGHT * 2,
235
+ bgcolor: droppableSnapshot.isDraggingOver ? "action.hover" : void 0
236
+ },
237
+ children: [
238
+ /* @__PURE__ */ jsx(Tooltip, { title: t("expandColumn", { column: column.title }), placement: "right", children: /* @__PURE__ */ jsx(
239
+ IconButton,
240
+ {
241
+ size: "small",
242
+ "aria-label": t("expandColumn", { column: column.title }),
243
+ "aria-expanded": "false",
244
+ onClick: () => toggleColumn(column.id),
245
+ children: /* @__PURE__ */ jsx(KeyboardDoubleArrowRightRoundedIcon, { fontSize: "small" })
246
+ }
247
+ ) }),
248
+ /* @__PURE__ */ jsx(Chip, { size: "small", label: count, color: isOver ? "warning" : "default" }),
249
+ /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", component: "h3", sx: { writingMode: "vertical-rl", whiteSpace: "nowrap" }, children: column.title }),
250
+ /* @__PURE__ */ jsx(Box, { sx: { display: "none" }, children: droppableProvided.placeholder })
251
+ ]
252
+ }
253
+ ) }, column.id);
254
+ }
255
+ return /* @__PURE__ */ jsxs(
256
+ Paper,
257
+ {
258
+ variant: "outlined",
259
+ component: "section",
260
+ "aria-label": column.title,
261
+ sx: { flex: "1 1 0", minWidth: COLUMN_MIN_WIDTH_PIXELS, p: 1.5, scrollSnapAlign: "start", borderRadius: 3 },
262
+ children: [
263
+ /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 0.5, sx: { alignItems: "center", mb: 1.5, px: 0.5 }, children: [
264
+ /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", component: "h3", sx: { flexGrow: 1, minWidth: 0 }, children: column.title }),
265
+ /* @__PURE__ */ jsx(
266
+ Chip,
267
+ {
268
+ size: "small",
269
+ label: count,
270
+ color: isOver ? "warning" : "default",
271
+ title: isOver ? t("overLimit", { limit: column.limit }) : void 0
272
+ }
273
+ ),
274
+ onAddCard && /* @__PURE__ */ jsx(Tooltip, { title: t("addCard", { column: column.title }), children: /* @__PURE__ */ jsx(IconButton, { size: "small", "aria-label": t("addCard", { column: column.title }), onClick: () => setAddingColumnId(column.id), children: /* @__PURE__ */ jsx(AddRoundedIcon, { fontSize: "small" }) }) }),
275
+ /* @__PURE__ */ jsx(ActionsMenu, { label: t("columnActions", { column: column.title }), actions: columnActions?.(column) }),
276
+ column.collapsible && /* @__PURE__ */ jsx(Tooltip, { title: t("collapseColumn", { column: column.title }), children: /* @__PURE__ */ jsx(
277
+ IconButton,
278
+ {
279
+ size: "small",
280
+ "aria-label": t("collapseColumn", { column: column.title }),
281
+ "aria-expanded": "true",
282
+ onClick: () => toggleColumn(column.id),
283
+ children: /* @__PURE__ */ jsx(KeyboardDoubleArrowLeftRoundedIcon, { fontSize: "small" })
284
+ }
285
+ ) })
286
+ ] }),
287
+ addingColumnId === column.id && /* @__PURE__ */ jsx(Box, { sx: { mb: 1 }, children: /* @__PURE__ */ jsx(
288
+ QuickAdd,
289
+ {
290
+ columnTitle: column.title,
291
+ t,
292
+ onClose: () => setAddingColumnId(null),
293
+ onAdd: (title) => onAddCard({ columnId: column.id, title })
294
+ }
295
+ ) }),
296
+ /* @__PURE__ */ jsx(Droppable, { droppableId: column.id, children: (droppableProvided, droppableSnapshot) => /* @__PURE__ */ jsxs(
297
+ Stack,
298
+ {
299
+ ref: droppableProvided.innerRef,
300
+ ...droppableProvided.droppableProps,
301
+ spacing: 1,
302
+ sx: {
303
+ minHeight: EMPTY_COLUMN_MIN_HEIGHT,
304
+ borderRadius: 2,
305
+ transition: "background-color 160ms",
306
+ bgcolor: droppableSnapshot.isDraggingOver ? "action.hover" : "transparent"
307
+ },
308
+ children: [
309
+ columnCards.map((card, index) => /* @__PURE__ */ jsx(Draggable, { draggableId: card.id, index, children: (draggableProvided, draggableSnapshot) => /* @__PURE__ */ jsxs(
310
+ Paper,
311
+ {
312
+ ref: draggableProvided.innerRef,
313
+ ...draggableProvided.draggableProps,
314
+ ...draggableProvided.dragHandleProps,
315
+ elevation: draggableSnapshot.isDragging ? 8 : 1,
316
+ onClick: onCardClick ? () => onCardClick(card.id) : void 0,
317
+ sx: { p: 1.5, borderRadius: 2, cursor: "grab", position: "relative", "&:focus-visible": { outline: 2, outlineColor: "primary.main" } },
318
+ children: [
319
+ cardActions && /* @__PURE__ */ jsx(Box, { sx: { position: "absolute", top: 4, right: 4 }, children: /* @__PURE__ */ jsx(ActionsMenu, { label: t("cardActions", { title: card.title }), actions: cardActions(card) }) }),
320
+ /* @__PURE__ */ jsx(Box, { sx: cardActions ? { pr: 3 } : void 0, children: renderCard ? renderCard(card) : /* @__PURE__ */ jsx(DefaultCard, { card, t, today, onComplete: onCardComplete }) })
321
+ ]
322
+ }
323
+ ) }, card.id)),
324
+ droppableProvided.placeholder,
325
+ columnCards.length === 0 && !droppableSnapshot.isDraggingOver && addingColumnId !== column.id && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "text.secondary", sx: { textAlign: "center", py: 3 }, children: total > 0 ? t("emptyFiltered") : t("empty") })
326
+ ]
327
+ }
328
+ ) })
329
+ ]
330
+ },
331
+ column.id
332
+ );
333
+ }) }) });
334
+ }
335
+ export {
336
+ KanbanBoard as default
337
+ };
338
+ //# sourceMappingURL=KanbanBoard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KanbanBoard.js","sources":["../../src/kanban/KanbanBoard.jsx"],"sourcesContent":["// Un tablero kanban (@stackcraftmx/calcita/kanban): columnas con tarjetas que se arrastran de una a otra con el ratón, con el\n// dedo o con el teclado (espacio para levantar, flechas para mover, espacio para soltar). Con @hello-pangea/dnd por dentro.\n//\n// <KanbanBoard columns={[{id: 'todo', title: 'Por hacer'}, {id: 'doing', title: 'En proceso', limit: 3}]}\n// cards={cards} onMove={(move) => api.post('/tasks/move', move)} ariaLabel=\"Tablero de tareas\" />\n//\n// El tablero no guarda nada: avisa la movida (onMove) y quien lo usa actualiza sus tarjetas (moveCard de kanbanMoves.js lo\n// hace sin esperar al servidor). Una columna con tope (limit, el trabajo en curso) avisa en ámbar cuando lo pasa.\n//\n// Accesible: el lector de pantalla anuncia en el idioma de la app qué se levantó, a dónde va y dónde quedó.\n//\n// Lo de un producto, todo hacia afuera (el tablero no guarda nada ni llama a ningún servidor):\n// - la tarjeta por omisión pinta lo que traiga: etiquetas (texto o {label, color}), responsables con su monograma, la\n// fecha límite (roja si ya venció, ámbar si es hoy), el avance de su lista de pendientes, comentarios y adjuntos. Para\n// otra tarjeta: renderCard;\n// - «+» en cada columna para agregar escribiendo el título (onAddCard({columnId, title}));\n// - «⋯» en cada tarjeta y en cada columna con las acciones que dé la pantalla (cardActions, columnActions): editar,\n// asignarme, mover sin arrastrar, borrar…;\n// - terminar una tarea: con onCardComplete cada tarjeta lleva su círculo para marcarla (y desmarcarla); qué pasa al\n// terminarla (pasarla a «Listo», guardar la fecha) lo decide la pantalla. Una tarjeta con completed: true sale con su\n// palomita verde y su fecha límite ya no se pinta de rojo;\n// - columnas que se encogen (collapsible), como el congelador (icebox) de ideas para después: se quedan en una tira angosta\n// con su nombre y su cuenta, y se les puede soltar una tarjeta igual. defaultCollapsed la abre encogida y\n// onColumnCollapse avisa cada cambio (para guardarlo si la pantalla quiere);\n// - texts para cualquier texto (la forma de `kanban` en los textos del paquete).\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useState} from 'react';\nimport {DragDropContext, Draggable, Droppable} from '@hello-pangea/dnd';\nimport Avatar from '@mui/material/Avatar';\nimport AvatarGroup from '@mui/material/AvatarGroup';\nimport Box from '@mui/material/Box';\nimport Chip from '@mui/material/Chip';\nimport IconButton from '@mui/material/IconButton';\nimport Paper from '@mui/material/Paper';\nimport Stack from '@mui/material/Stack';\nimport TextField from '@mui/material/TextField';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport AddRoundedIcon from '@mui/icons-material/AddRounded';\nimport AttachFileRoundedIcon from '@mui/icons-material/AttachFileRounded';\nimport ChatBubbleOutlineRoundedIcon from '@mui/icons-material/ChatBubbleOutlineRounded';\nimport CheckBoxOutlinedIcon from '@mui/icons-material/CheckBoxOutlined';\nimport CheckCircleRoundedIcon from '@mui/icons-material/CheckCircleRounded';\nimport EventOutlinedIcon from '@mui/icons-material/EventOutlined';\nimport KeyboardDoubleArrowLeftRoundedIcon from '@mui/icons-material/KeyboardDoubleArrowLeftRounded';\nimport KeyboardDoubleArrowRightRoundedIcon from '@mui/icons-material/KeyboardDoubleArrowRightRounded';\nimport RadioButtonUncheckedRoundedIcon from '@mui/icons-material/RadioButtonUncheckedRounded';\n\nimport {initialsOf} from '@/appShell/menuItemText.js';\nimport {useFormatters} from '@/toolkit/useFormatters.js';\nimport {DUE_STATUS, dueStatusOf, tagOf, todayIsoDateOf} from '@/kanban/kanbanCards.js';\nimport {cardsOfColumn, isOverLimit} from '@/kanban/kanbanMoves.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport ActionsMenu from '@/ui/actions/ActionsMenu.jsx';\n\n// las columnas se reparten el ancho, sin bajar de este mínimo; si no caben, el tablero desliza de lado.\n// OJO: con el teclado, la librería solo mueve una tarjeta a columnas que se ven COMPLETAS: con columnas fijas de 300 px la\n// cuarta quedaba cortada en un escritorio y no se podía soltar ahí con el teclado\nconst COLUMN_MIN_WIDTH_PIXELS = 220;\n// lo alto que mide una columna vacía: lo justo para soltar ahí una tarjeta\nconst EMPTY_COLUMN_MIN_HEIGHT = 96;\n// cuántas caras de responsables se ven antes del «+2»\nconst MAX_VISIBLE_ASSIGNEES = 3;\nconst ASSIGNEE_AVATAR_PIXELS = 24;\n// lo ancho de una columna encogida: su nombre de lado, su cuenta y su botón para abrirla\nconst COLLAPSED_COLUMN_WIDTH_PIXELS = 52;\n// el color del texto de la fecha según cómo va\nconst DUE_COLOR = Object.freeze({[DUE_STATUS.overdue]: 'error.main', [DUE_STATUS.today]: 'warning.dark', [DUE_STATUS.upcoming]: 'text.secondary'});\n\n/**\n * El círculo para terminar una tarea (o reabrirla, si ya está terminada). El clic no levanta la tarjeta ni la abre.\n *\n * @param {{card: any, t: Function, onComplete: (card: any, completed: boolean) => void}} props\n */\nfunction CompleteButton({card, t, onComplete}) {\n const label = card.completed ? t('reopen', {title: card.title}) : t('complete', {title: card.title});\n return (\n <Tooltip title={label}>\n <IconButton size=\"small\" aria-label={label} aria-pressed={Boolean(card.completed)} sx={{m: -0.5, color: card.completed ? 'success.main' : 'text.secondary'}}\n onClick={(event) => {\n event.stopPropagation();\n onComplete(card, !card.completed);\n }}>\n {card.completed ? <CheckCircleRoundedIcon fontSize=\"small\" /> : <RadioButtonUncheckedRoundedIcon fontSize=\"small\" />}\n </IconButton>\n </Tooltip>\n );\n}\n\n/**\n * Una tarjeta por omisión: lo que traiga, sin pedir nada (título, descripción, etiquetas, responsables, fecha, pendientes,\n * comentarios y adjuntos).\n *\n * @param {{card: any, t: Function, today: string, onComplete?: (card: any, completed: boolean) => void}} props\n */\nfunction DefaultCard({card, t, today, onComplete}) {\n const {formatDate} = useFormatters();\n // terminada, su fecha ya no apura: se pinta tenue, sin rojo ni ámbar\n const dueStatus = card.completed && card.dueDate ? DUE_STATUS.upcoming : dueStatusOf(card.dueDate, today);\n let dueText = '';\n if (card.completed && card.dueDate) {\n dueText = t('dueCompleted', {date: formatDate(card.dueDate)});\n } else if (dueStatus === DUE_STATUS.overdue) {\n dueText = t('dueOverdue', {date: formatDate(card.dueDate)});\n } else if (dueStatus === DUE_STATUS.today) {\n dueText = t('dueToday');\n } else if (dueStatus) {\n dueText = t('dueOn', {date: formatDate(card.dueDate)});\n }\n const hasFooter = dueStatus || card.checklist?.total > 0 || card.comments > 0 || card.attachments > 0 || card.assignees?.length > 0;\n\n return (\n <Stack spacing={0.75}>\n {card.tags?.length > 0 && (\n <Stack direction=\"row\" spacing={0.5} useFlexGap sx={{flexWrap: 'wrap'}}>\n {card.tags.map((rawTag) => {\n const tag = tagOf(rawTag);\n return <Chip key={tag.label} label={tag.label} size=\"small\" color={tag.color} variant={tag.color === 'default' ? 'filled' : 'outlined'} />;\n })}\n </Stack>\n )}\n <Stack direction=\"row\" spacing={1} sx={{alignItems: 'flex-start'}}>\n {onComplete && <CompleteButton card={card} t={t} onComplete={onComplete} />}\n {!onComplete && card.completed && (\n <CheckCircleRoundedIcon fontSize=\"small\" sx={{color: 'success.main'}} titleAccess={t('completed')} />\n )}\n <Typography variant=\"subtitle2\" component=\"p\" sx={{color: card.completed ? 'text.secondary' : undefined}}>{card.title}</Typography>\n </Stack>\n {card.description && <Typography variant=\"body2\" color=\"text.secondary\">{card.description}</Typography>}\n {hasFooter && (\n <Stack direction=\"row\" spacing={1.25} useFlexGap sx={{alignItems: 'center', flexWrap: 'wrap', color: 'text.secondary'}}>\n {dueStatus && (\n <Stack direction=\"row\" spacing={0.5} sx={{alignItems: 'center', color: DUE_COLOR[dueStatus]}}>\n <EventOutlinedIcon sx={{fontSize: 16}} />\n <Typography variant=\"caption\" sx={{fontWeight: dueStatus === DUE_STATUS.upcoming ? 400 : 600}}>{dueText}</Typography>\n </Stack>\n )}\n {card.checklist?.total > 0 && (\n <Stack direction=\"row\" spacing={0.5} sx={{alignItems: 'center'}}\n aria-label={t('checklist', {done: card.checklist.done, total: card.checklist.total})}>\n <CheckBoxOutlinedIcon sx={{fontSize: 16}} />\n <Typography variant=\"caption\" aria-hidden=\"true\">{card.checklist.done}/{card.checklist.total}</Typography>\n </Stack>\n )}\n {card.comments > 0 && (\n <Stack direction=\"row\" spacing={0.5} sx={{alignItems: 'center'}} aria-label={t('comments', {count: card.comments})}>\n <ChatBubbleOutlineRoundedIcon sx={{fontSize: 16}} />\n <Typography variant=\"caption\" aria-hidden=\"true\">{card.comments}</Typography>\n </Stack>\n )}\n {card.attachments > 0 && (\n <Stack direction=\"row\" spacing={0.5} sx={{alignItems: 'center'}} aria-label={t('attachments', {count: card.attachments})}>\n <AttachFileRoundedIcon sx={{fontSize: 16}} />\n <Typography variant=\"caption\" aria-hidden=\"true\">{card.attachments}</Typography>\n </Stack>\n )}\n {card.assignees?.length > 0 && (\n <AvatarGroup max={MAX_VISIBLE_ASSIGNEES} sx={{ml: 'auto', '& .MuiAvatar-root': {width: ASSIGNEE_AVATAR_PIXELS, height: ASSIGNEE_AVATAR_PIXELS, fontSize: 11}}}\n aria-label={t('assignees', {names: card.assignees.map((person) => person.name).join(', ')})}>\n {card.assignees.map((person) => (\n <Tooltip key={person.id} title={person.name}>\n <Avatar alt={person.name} src={person.avatarUrl}>{initialsOf(person.name)}</Avatar>\n </Tooltip>\n ))}\n </AvatarGroup>\n )}\n </Stack>\n )}\n </Stack>\n );\n}\n\n/**\n * Agregar una tarjeta escribiendo su título: Enter la agrega (y deja el campo listo para otra), Escape cierra.\n *\n * @param {{columnTitle: string, onAdd: (title: string) => void, onClose: () => void, t: Function}} props\n */\nfunction QuickAdd({columnTitle, onAdd, onClose, t}) {\n const [title, setTitle] = useState('');\n return (\n <TextField size=\"small\" fullWidth autoFocus multiline maxRows={4} value={title} placeholder={t('addCardPlaceholder')}\n slotProps={{htmlInput: {'aria-label': t('addCard', {column: columnTitle})}}}\n onChange={(event) => setTitle(event.target.value)}\n onBlur={() => !title.trim() && onClose()}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n onClose();\n }\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n if (title.trim()) {\n onAdd(title.trim());\n setTitle('');\n }\n }\n }} />\n );\n}\n\n/**\n * @param {object} props\n * @param {Array<{id: string, title: string, limit?: number, count?: number, collapsible?: boolean, defaultCollapsed?: boolean}>} props.columns\n * en su orden. count: cuántas tarjetas tiene de verdad cuando la pantalla le pasa solo las filtradas (el tope se cuenta\n * contra todas). collapsible: lleva su botón para encogerse (el congelador); defaultCollapsed: empieza encogida\n * @param {Array<{id: string, columnId: string, title: string, completed?: boolean, description?: string, tags?: Array<string|{label: string, color?: string}>, assignees?: Array<{id: string, name: string, avatarUrl?: string}>, dueDate?: string, checklist?: {done: number, total: number}, comments?: number, attachments?: number} & Record<string, any>>} props.cards\n * el orden de cada columna es el orden en este arreglo; cada tarjeta puede traer sus campos propios (llegan a renderCard,\n * a cardActions y a onCardClick tal cual). dueDate: AAAA-MM-DD\n * @param {(move: {cardId: string, fromColumnId: string, toColumnId: string, toIndex: number}) => void} props.onMove\n * @param {(card: any) => import('react').ReactNode} [props.renderCard] lo de adentro de cada tarjeta (recibe la tarjeta de cards)\n * @param {(cardId: string) => void} [props.onCardClick]\n * @param {(newCard: {columnId: string, title: string}) => void} [props.onAddCard] con él cada columna lleva su «+» para agregar\n * escribiendo el título\n * @param {(card: any) => Array<{key: string, label: string, icon?: import('react').ReactNode, color?: string, disabled?: boolean, onClick: () => void}>} [props.cardActions]\n * las acciones del «⋯» de cada tarjeta (editar, asignarme, borrar…); sin ellas no hay «⋯»\n * @param {(column: any) => Array<{key: string, label: string, icon?: import('react').ReactNode, color?: string, disabled?: boolean, onClick: () => void}>} [props.columnActions]\n * las acciones del «⋯» de cada columna (renombrar, limpiar…)\n * @param {(card: any, completed: boolean) => void} [props.onCardComplete] con él cada tarjeta lleva su círculo para terminarla\n * (completed true) o reabrirla (false); la pantalla decide qué más pasa (moverla a «Listo», guardar la fecha)\n * @param {(columnId: string, collapsed: boolean) => void} [props.onColumnCollapse] cada que una columna se encoge o se abre\n * @param {string} props.ariaLabel ya traducido\n * @param {object} [props.texts] los textos que cambian, con la forma de `kanban` en los textos del paquete\n */\nexport default function KanbanBoard({\n columns, cards, onMove, renderCard, onCardClick, onAddCard, cardActions, columnActions, onCardComplete, onColumnCollapse, ariaLabel, texts,\n}) {\n const {t} = useToolkitTranslation('kanban', texts);\n // la columna donde se está escribiendo una tarjeta nueva\n const [addingColumnId, setAddingColumnId] = useState(null);\n // las columnas encogidas: empiezan como dice defaultCollapsed y luego las mueve la persona\n const [collapsedIds, setCollapsedIds] = useState(() => new Set(columns.filter((column) => column.defaultCollapsed).map((column) => column.id)));\n const toggleColumn = (columnId) => {\n const collapsed = !collapsedIds.has(columnId);\n setCollapsedIds((current) => {\n const next = new Set(current);\n if (collapsed) {\n next.add(columnId);\n } else {\n next.delete(columnId);\n }\n return next;\n });\n onColumnCollapse?.(columnId, collapsed);\n };\n const today = todayIsoDateOf();\n const columnTitleOf = (columnId) => columns.find((column) => column.id === columnId)?.title ?? columnId;\n const cardTitleOf = (cardId) => cards.find((card) => card.id === cardId)?.title ?? cardId;\n\n // lo que oye quien usa lector de pantalla (posiciones desde 1, como se cuentan)\n const announceStart = (start, provided) => provided.announce(t('lifted', {\n title: cardTitleOf(start.draggableId), column: columnTitleOf(start.source.droppableId), position: start.source.index + 1,\n }));\n const announceUpdate = (update, provided) => {\n if (update.destination) {\n provided.announce(t('moving', {column: columnTitleOf(update.destination.droppableId), position: update.destination.index + 1}));\n }\n };\n const finishMove = (result, provided) => {\n const {draggableId, source, destination} = result;\n // se soltó fuera de una columna o en el mismo lugar: nada que mover\n if (!destination || (destination.droppableId === source.droppableId && destination.index === source.index)) {\n provided.announce(t('cancelled', {title: cardTitleOf(draggableId)}));\n return;\n }\n provided.announce(t('dropped', {title: cardTitleOf(draggableId), column: columnTitleOf(destination.droppableId), position: destination.index + 1}));\n onMove({cardId: draggableId, fromColumnId: source.droppableId, toColumnId: destination.droppableId, toIndex: destination.index});\n };\n\n return (\n <DragDropContext onDragStart={announceStart} onDragUpdate={announceUpdate} onDragEnd={finishMove} dragHandleUsageInstructions={t('instructions')}>\n <Box role=\"region\" aria-label={ariaLabel} sx={{\n display: 'flex', gap: 2, overflowX: 'auto', pb: 1, scrollSnapType: 'x proximity', alignItems: 'flex-start',\n }}>\n {columns.map((column) => {\n const columnCards = cardsOfColumn(cards, column.id);\n // con un filtro puesto la pantalla dice cuántas tiene de verdad: «1 / 3» mentía con la columna llena\n const total = Number.isInteger(column.count) ? column.count : columnCards.length;\n const isOver = isOverLimit(column, total);\n const count = Number.isInteger(column.limit) ? `${total} / ${column.limit}` : String(total);\n const isCollapsed = column.collapsible && collapsedIds.has(column.id);\n // encogida: una tira con su nombre de lado y su cuenta; se le puede soltar una tarjeta (queda arriba)\n if (isCollapsed) {\n return (\n <Droppable key={column.id} droppableId={column.id}>\n {(droppableProvided, droppableSnapshot) => (\n <Paper ref={droppableProvided.innerRef} {...droppableProvided.droppableProps} variant=\"outlined\" component=\"section\"\n aria-label={column.title}\n sx={{\n flex: '0 0 auto', width: COLLAPSED_COLUMN_WIDTH_PIXELS, py: 1, borderRadius: 3, display: 'flex',\n flexDirection: 'column', alignItems: 'center', gap: 1, minHeight: EMPTY_COLUMN_MIN_HEIGHT * 2,\n bgcolor: droppableSnapshot.isDraggingOver ? 'action.hover' : undefined,\n }}>\n <Tooltip title={t('expandColumn', {column: column.title})} placement=\"right\">\n <IconButton size=\"small\" aria-label={t('expandColumn', {column: column.title})} aria-expanded=\"false\"\n onClick={() => toggleColumn(column.id)}>\n <KeyboardDoubleArrowRightRoundedIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n <Chip size=\"small\" label={count} color={isOver ? 'warning' : 'default'} />\n <Typography variant=\"subtitle2\" component=\"h3\" sx={{writingMode: 'vertical-rl', whiteSpace: 'nowrap'}}>\n {column.title}\n </Typography>\n {/* el lugar de la tarjeta que se arrastra; encogida no la enseña */}\n <Box sx={{display: 'none'}}>{droppableProvided.placeholder}</Box>\n </Paper>\n )}\n </Droppable>\n );\n }\n return (\n <Paper key={column.id} variant=\"outlined\" component=\"section\" aria-label={column.title}\n sx={{flex: '1 1 0', minWidth: COLUMN_MIN_WIDTH_PIXELS, p: 1.5, scrollSnapAlign: 'start', borderRadius: 3}}>\n <Stack direction=\"row\" spacing={0.5} sx={{alignItems: 'center', mb: 1.5, px: 0.5}}>\n <Typography variant=\"subtitle2\" component=\"h3\" sx={{flexGrow: 1, minWidth: 0}}>{column.title}</Typography>\n <Chip size=\"small\" label={count} color={isOver ? 'warning' : 'default'}\n title={isOver ? t('overLimit', {limit: column.limit}) : undefined} />\n {onAddCard && (\n <Tooltip title={t('addCard', {column: column.title})}>\n <IconButton size=\"small\" aria-label={t('addCard', {column: column.title})} onClick={() => setAddingColumnId(column.id)}>\n <AddRoundedIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n <ActionsMenu label={t('columnActions', {column: column.title})} actions={columnActions?.(column)} />\n {column.collapsible && (\n <Tooltip title={t('collapseColumn', {column: column.title})}>\n <IconButton size=\"small\" aria-label={t('collapseColumn', {column: column.title})} aria-expanded=\"true\"\n onClick={() => toggleColumn(column.id)}>\n <KeyboardDoubleArrowLeftRoundedIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n </Stack>\n {addingColumnId === column.id && (\n <Box sx={{mb: 1}}>\n <QuickAdd columnTitle={column.title} t={t} onClose={() => setAddingColumnId(null)}\n onAdd={(title) => onAddCard({columnId: column.id, title})} />\n </Box>\n )}\n <Droppable droppableId={column.id}>\n {(droppableProvided, droppableSnapshot) => (\n <Stack ref={droppableProvided.innerRef} {...droppableProvided.droppableProps} spacing={1}\n sx={{\n minHeight: EMPTY_COLUMN_MIN_HEIGHT, borderRadius: 2, transition: 'background-color 160ms',\n bgcolor: droppableSnapshot.isDraggingOver ? 'action.hover' : 'transparent',\n }}>\n {columnCards.map((card, index) => (\n <Draggable key={card.id} draggableId={card.id} index={index}>\n {(draggableProvided, draggableSnapshot) => (\n <Paper ref={draggableProvided.innerRef} {...draggableProvided.draggableProps} {...draggableProvided.dragHandleProps}\n elevation={draggableSnapshot.isDragging ? 8 : 1}\n onClick={onCardClick ? () => onCardClick(card.id) : undefined}\n sx={{p: 1.5, borderRadius: 2, cursor: 'grab', position: 'relative', '&:focus-visible': {outline: 2, outlineColor: 'primary.main'}}}>\n {/* el «⋯» arriba a la derecha; el contenido le deja su lugar */}\n {cardActions && (\n <Box sx={{position: 'absolute', top: 4, right: 4}}>\n <ActionsMenu label={t('cardActions', {title: card.title})} actions={cardActions(card)} />\n </Box>\n )}\n <Box sx={cardActions ? {pr: 3} : undefined}>\n {renderCard ? renderCard(card) : <DefaultCard card={card} t={t} today={today} onComplete={onCardComplete} />}\n </Box>\n </Paper>\n )}\n </Draggable>\n ))}\n {droppableProvided.placeholder}\n {/* vacía de verdad, o con tarjetas que el filtro de la pantalla esconde (no se dice «sin tarjetas») */}\n {columnCards.length === 0 && !droppableSnapshot.isDraggingOver && addingColumnId !== column.id && (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{textAlign: 'center', py: 3}}>\n {total > 0 ? t('emptyFiltered') : t('empty')}\n </Typography>\n )}\n </Stack>\n )}\n </Droppable>\n </Paper>\n );\n })}\n </Box>\n </DragDropContext>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ const DUE_STATUS = Object.freeze({ overdue: "overdue", today: "today", upcoming: "upcoming" });
2
+ function todayIsoDateOf(now = /* @__PURE__ */ new Date()) {
3
+ return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}`;
4
+ }
5
+ function dueStatusOf(dueDate, today) {
6
+ if (!dueDate) {
7
+ return null;
8
+ }
9
+ if (dueDate < today) {
10
+ return DUE_STATUS.overdue;
11
+ }
12
+ return dueDate === today ? DUE_STATUS.today : DUE_STATUS.upcoming;
13
+ }
14
+ export {
15
+ DUE_STATUS,
16
+ dueStatusOf,
17
+ todayIsoDateOf
18
+ };
19
+ //# sourceMappingURL=kanbanCards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kanbanCards.js","sources":["../../src/kanban/kanbanCards.js"],"sourcesContent":["// Lo que la tarjeta del tablero decide sin pintar nada: si su fecha ya venció, vence hoy o falta. Cómo se lee una etiqueta\n// (texto suelto o con su color) vive en ui/labels/tagOf.js y aquí se vuelve a exportar. Funciones puras: se prueban sin\n// navegador (kanbanCards.test.js).\n//\n// Funciones puras, no renderizan: function (regla de la casa).\n\n/** Cómo va la fecha límite de una tarjeta. */\nexport const DUE_STATUS = Object.freeze({overdue: 'overdue', today: 'today', upcoming: 'upcoming'});\n\n/**\n * El día de hoy como AAAA-MM-DD en la zona de este navegador (la fecha límite es un día, no un instante).\n *\n * @param {Date} [now]\n * @returns {string}\n */\nexport function todayIsoDateOf(now = new Date()) {\n return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;\n}\n\n/**\n * Cómo va una fecha límite contra hoy. AAAA-MM-DD se compara bien como texto.\n *\n * @param {string|null|undefined} dueDate AAAA-MM-DD\n * @param {string} today AAAA-MM-DD\n * @returns {'overdue'|'today'|'upcoming'|null} null sin fecha\n */\nexport function dueStatusOf(dueDate, today) {\n if (!dueDate) {\n return null;\n }\n if (dueDate < today) {\n return DUE_STATUS.overdue;\n }\n return dueDate === today ? DUE_STATUS.today : DUE_STATUS.upcoming;\n}\n\n// la regla de una etiqueta vive en lo compartido (la usan el tablero y la bandeja); aquí sigue a la mano\nexport {tagOf} from '@/ui/labels/tagOf.js';\n"],"names":[],"mappings":"AAOY,MAAC,aAAa,OAAO,OAAO,EAAC,SAAS,WAAW,OAAO,SAAS,UAAU,WAAU,CAAC;AAQ3F,SAAS,eAAe,MAAM,oBAAI,QAAQ;AAC7C,SAAO,GAAG,IAAI,YAAW,CAAE,IAAI,OAAO,IAAI,SAAQ,IAAK,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,IAAI,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AACxH;AASO,SAAS,YAAY,SAAS,OAAO;AACxC,MAAI,CAAC,SAAS;AACV,WAAO;AAAA,EACX;AACA,MAAI,UAAU,OAAO;AACjB,WAAO,WAAW;AAAA,EACtB;AACA,SAAO,YAAY,QAAQ,WAAW,QAAQ,WAAW;AAC7D;"}
@@ -0,0 +1,29 @@
1
+ function cardsOfColumn(cards, columnId) {
2
+ return cards.filter((card) => card.columnId === columnId);
3
+ }
4
+ function moveCard(cards, { cardId, toColumnId, toIndex }) {
5
+ const card = cards.find((candidate) => candidate.id === cardId);
6
+ if (!card) {
7
+ return cards;
8
+ }
9
+ const others = cards.filter((candidate) => candidate.id !== cardId);
10
+ const movedCard = { ...card, columnId: toColumnId };
11
+ const cardAtPlace = cardsOfColumn(others, toColumnId)[toIndex];
12
+ let insertAt;
13
+ if (cardAtPlace) {
14
+ insertAt = others.indexOf(cardAtPlace);
15
+ } else {
16
+ const lastOfColumn = others.map((candidate) => candidate.columnId).lastIndexOf(toColumnId);
17
+ insertAt = lastOfColumn === -1 ? others.length : lastOfColumn + 1;
18
+ }
19
+ return [...others.slice(0, insertAt), movedCard, ...others.slice(insertAt)];
20
+ }
21
+ function isOverLimit(column, cardCount) {
22
+ return Number.isInteger(column.limit) && cardCount > column.limit;
23
+ }
24
+ export {
25
+ cardsOfColumn,
26
+ isOverLimit,
27
+ moveCard
28
+ };
29
+ //# sourceMappingURL=kanbanMoves.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kanbanMoves.js","sources":["../../src/kanban/kanbanMoves.js"],"sourcesContent":["// Lo puro del tablero kanban: mover una tarjeta a otra columna (o a otro lugar de la suya) sin perder el orden de las\n// demás. Las tarjetas van en UN arreglo y el orden de cada columna es el orden en que aparecen ahí, como lo regresaría un\n// servidor ordenado por columna y posición.\n//\n// Funciones puras, sin React: function (regla de la casa).\n\n/**\n * Las tarjetas de una columna, en su orden.\n *\n * @template {{id: string, columnId: string}} Card las tarjetas del proyecto, con lo que traigan (título, etiquetas…)\n * @param {Card[]} cards\n * @param {string} columnId\n * @returns {Card[]}\n */\nexport function cardsOfColumn(cards, columnId) {\n return cards.filter((card) => card.columnId === columnId);\n}\n\n/**\n * Las tarjetas con una movida: la tarjeta queda en toColumnId, en la posición toIndex de esa columna.\n *\n * @template {{id: string, columnId: string}} Card las tarjetas del proyecto, con lo que traigan (título, etiquetas…)\n * @param {Card[]} cards\n * @param {{cardId: string, toColumnId: string, toIndex: number}} move\n * @returns {Card[]} un arreglo nuevo (el de entrada no se toca), con las mismas tarjetas\n */\nexport function moveCard(cards, {cardId, toColumnId, toIndex}) {\n const card = cards.find((candidate) => candidate.id === cardId);\n if (!card) {\n return cards;\n }\n const others = cards.filter((candidate) => candidate.id !== cardId);\n const movedCard = {...card, columnId: toColumnId};\n // va antes de la que hoy ocupa ese lugar en la columna; si no hay, después de la última de la columna\n const cardAtPlace = cardsOfColumn(others, toColumnId)[toIndex];\n let insertAt;\n if (cardAtPlace) {\n insertAt = others.indexOf(cardAtPlace);\n } else {\n const lastOfColumn = others.map((candidate) => candidate.columnId).lastIndexOf(toColumnId);\n insertAt = lastOfColumn === -1 ? others.length : lastOfColumn + 1;\n }\n return [...others.slice(0, insertAt), movedCard, ...others.slice(insertAt)];\n}\n\n/**\n * ¿La columna pasó su tope de tarjetas (el límite de trabajo en curso)? Sin tope, nunca.\n *\n * @param {{limit?: number}} column\n * @param {number} cardCount\n * @returns {boolean}\n */\nexport function isOverLimit(column, cardCount) {\n return Number.isInteger(column.limit) && cardCount > column.limit;\n}\n"],"names":[],"mappings":"AAcO,SAAS,cAAc,OAAO,UAAU;AAC3C,SAAO,MAAM,OAAO,CAAC,SAAS,KAAK,aAAa,QAAQ;AAC5D;AAUO,SAAS,SAAS,OAAO,EAAC,QAAQ,YAAY,QAAO,GAAG;AAC3D,QAAM,OAAO,MAAM,KAAK,CAAC,cAAc,UAAU,OAAO,MAAM;AAC9D,MAAI,CAAC,MAAM;AACP,WAAO;AAAA,EACX;AACA,QAAM,SAAS,MAAM,OAAO,CAAC,cAAc,UAAU,OAAO,MAAM;AAClE,QAAM,YAAY,EAAC,GAAG,MAAM,UAAU,WAAU;AAEhD,QAAM,cAAc,cAAc,QAAQ,UAAU,EAAE,OAAO;AAC7D,MAAI;AACJ,MAAI,aAAa;AACb,eAAW,OAAO,QAAQ,WAAW;AAAA,EACzC,OAAO;AACH,UAAM,eAAe,OAAO,IAAI,CAAC,cAAc,UAAU,QAAQ,EAAE,YAAY,UAAU;AACzF,eAAW,iBAAiB,KAAK,OAAO,SAAS,eAAe;AAAA,EACpE;AACA,SAAO,CAAC,GAAG,OAAO,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,MAAM,QAAQ,CAAC;AAC9E;AASO,SAAS,YAAY,QAAQ,WAAW;AAC3C,SAAO,OAAO,UAAU,OAAO,KAAK,KAAK,YAAY,OAAO;AAChE;"}
package/dist/kanban.js ADDED
@@ -0,0 +1,15 @@
1
+ import { default as default2 } from "./kanban/KanbanBoard.js";
2
+ import { cardsOfColumn, isOverLimit, moveCard } from "./kanban/kanbanMoves.js";
3
+ import { DUE_STATUS, dueStatusOf, todayIsoDateOf } from "./kanban/kanbanCards.js";
4
+ import { tagOf } from "./ui/labels/tagOf.js";
5
+ export {
6
+ DUE_STATUS,
7
+ default2 as KanbanBoard,
8
+ cardsOfColumn,
9
+ dueStatusOf,
10
+ isOverLimit,
11
+ moveCard,
12
+ tagOf,
13
+ todayIsoDateOf
14
+ };
15
+ //# sourceMappingURL=kanban.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kanban.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,18 @@
1
+ const CSRF_TOKEN_MISMATCH_STATUS = 419;
2
+ function createCsrfRetryHandler({ refreshCsrfToken, repeatRequest, onRetry }) {
3
+ return async function retryAfterCsrfRefresh(error) {
4
+ const { config, response } = error ?? {};
5
+ if (response?.status !== CSRF_TOKEN_MISMATCH_STATUS || !config || config.retriedAfterCsrfRefresh) {
6
+ return null;
7
+ }
8
+ config.retriedAfterCsrfRefresh = true;
9
+ onRetry?.(config);
10
+ await refreshCsrfToken();
11
+ return repeatRequest(config);
12
+ };
13
+ }
14
+ export {
15
+ CSRF_TOKEN_MISMATCH_STATUS,
16
+ createCsrfRetryHandler
17
+ };
18
+ //# sourceMappingURL=csrfRetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csrfRetry.js","sources":["../../src/laravel/csrfRetry.js"],"sourcesContent":["// 419 de Laravel (la cookie XSRF-TOKEN venció, p. ej. la sesión del servidor expiró con la pantalla abierta): se pide\n// una cookie nueva y se repite la MISMA petición UNA sola vez.\n//\n// Vive aparte de api.js para probarlo con node --test (csrfRetry.test.js) sin navegador. api.js lo engancha en el\n// interceptor de respuesta del cliente único.\n//\n// OJO: la bandera va en el config de axios de ESA petición. Si la repetición vuelve a responder 419, la bandera ya\n// está puesta y el error sigue su camino: sin ella, un servidor que siempre responde 419 sería un ciclo infinito.\n// El 419 no gasta intentos del límite de login: la revisión CSRF corre antes que throttle:login.\n//\n// Función pura, no renderiza: function (regla de la casa). Solo importa lo que recibe.\n\nexport const CSRF_TOKEN_MISMATCH_STATUS = 419;\n\n/**\n * Arma el manejador del 419 para el interceptor de respuesta.\n *\n * @param {object} dependencies\n * @param {() => Promise<unknown>} dependencies.refreshCsrfToken GET auth/csrf-token (deja la cookie nueva)\n * @param {(config: any) => Promise<any>} dependencies.repeatRequest vuelve a mandar la petición con el mismo\n * cliente\n * @param {(config: any) => void} [dependencies.onRetry] para el log (sin datos personales)\n * @returns {(error: {config?: object, response?: {status: number}}) => Promise<object|null>} la respuesta de la repetición, o null si no aplica\n */\nexport function createCsrfRetryHandler({refreshCsrfToken, repeatRequest, onRetry}) {\n return async function retryAfterCsrfRefresh(error) {\n const {config, response} = error ?? {};\n\n // guard clause: no es un 419, no hay config que repetir, o ya se repitió una vez\n if (response?.status !== CSRF_TOKEN_MISMATCH_STATUS || !config || config.retriedAfterCsrfRefresh) {\n return null;\n }\n\n config.retriedAfterCsrfRefresh = true;\n onRetry?.(config);\n await refreshCsrfToken();\n return repeatRequest(config);\n };\n}\n"],"names":[],"mappings":"AAYY,MAAC,6BAA6B;AAYnC,SAAS,uBAAuB,EAAC,kBAAkB,eAAe,QAAO,GAAG;AAC/E,SAAO,eAAe,sBAAsB,OAAO;AAC/C,UAAM,EAAC,QAAQ,SAAQ,IAAI,SAAS,CAAA;AAGpC,QAAI,UAAU,WAAW,8BAA8B,CAAC,UAAU,OAAO,yBAAyB;AAC9F,aAAO;AAAA,IACX;AAEA,WAAO,0BAA0B;AACjC,cAAU,MAAM;AAChB,UAAM,iBAAgB;AACtB,WAAO,cAAc,MAAM;AAAA,EAC/B;AACJ;"}
@@ -0,0 +1,6 @@
1
+ import { CSRF_TOKEN_MISMATCH_STATUS, createCsrfRetryHandler } from "./laravel/csrfRetry.js";
2
+ export {
3
+ CSRF_TOKEN_MISMATCH_STATUS,
4
+ createCsrfRetryHandler
5
+ };
6
+ //# sourceMappingURL=laravel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"laravel.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import { useRef, useEffect } from "react";
3
+ import { useToolkitNavigation } from "./toolkit/toolkitContext.js";
4
+ import { safeInternalPath } from "./navigation.js";
5
+ const STORAGE_KEY_PREFIX = "calcita:lastListUrl:";
6
+ function rememberListUrl(listKey, listUrl) {
7
+ const safeListUrl = safeInternalPath(listUrl);
8
+ if (!safeListUrl) {
9
+ return;
10
+ }
11
+ try {
12
+ window.sessionStorage?.setItem(`${STORAGE_KEY_PREFIX}${listKey}`, safeListUrl);
13
+ } catch {
14
+ }
15
+ }
16
+ function recallListUrl(listKey) {
17
+ try {
18
+ return safeInternalPath(window.sessionStorage?.getItem(`${STORAGE_KEY_PREFIX}${listKey}`));
19
+ } catch {
20
+ return null;
21
+ }
22
+ }
23
+ function useRememberListUrl(listKey) {
24
+ const { useLocation } = useToolkitNavigation();
25
+ const { pathname, search } = useLocation();
26
+ const currentListUrl = useRef(`${pathname}${search}`);
27
+ currentListUrl.current = `${pathname}${search}`;
28
+ useEffect(() => () => rememberListUrl(listKey, currentListUrl.current), [listKey]);
29
+ }
30
+ export {
31
+ recallListUrl,
32
+ rememberListUrl,
33
+ useRememberListUrl
34
+ };
35
+ //# sourceMappingURL=lastListUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lastListUrl.js","sources":["../src/lastListUrl.js"],"sourcesContent":["// La última URL de una lista (con sus filtros, orden, pestaña y página), para que el detalle sepa a dónde regresar.\n//\n// BackButton usa navigate(-1) cuando hay historial. Esto es el RESPALDO para cuando no lo hay: el detalle se abrió en\n// una pestaña nueva, se recargó, o se llegó después de iniciar sesión. Se guarda al SALIR de la lista (desmontar).\n//\n// Por qué sessionStorage y no localStorage: es de esta pestaña y se borra al cerrarla. La URL de una lista no trae\n// datos personales, pero no tiene por qué sobrevivir en una máquina compartida.\n//\n// Funciones puras y un hook, no renderizan: function (regla de la casa).\nimport {useEffect, useRef} from 'react';\nimport {useToolkitNavigation} from '@/toolkit/toolkitContext.js';\n\nimport {safeInternalPath} from '@/navigation.js';\n\nconst STORAGE_KEY_PREFIX = 'calcita:lastListUrl:';\n\n/**\n * Anota la URL de una lista.\n *\n * @param {string} listKey p. ej. 'upload-control'\n * @param {string} listUrl pathname + search\n */\nexport function rememberListUrl(listKey, listUrl) {\n const safeListUrl = safeInternalPath(listUrl);\n if (!safeListUrl) {\n return;\n }\n try {\n window.sessionStorage?.setItem(`${STORAGE_KEY_PREFIX}${listKey}`, safeListUrl);\n } catch {\n // almacenamiento bloqueado o ventana privada: sin respaldo, BackButton usa fallbackTo\n }\n}\n\n/**\n * La última URL anotada de una lista, ya validada como ruta interna; null si no hay.\n *\n * @param {string} listKey\n * @returns {string|null}\n */\nexport function recallListUrl(listKey) {\n try {\n return safeInternalPath(window.sessionStorage?.getItem(`${STORAGE_KEY_PREFIX}${listKey}`));\n } catch {\n return null;\n }\n}\n\n/**\n * Se monta en la página de la lista: al salir de ella guarda la URL con la que se estaba viendo.\n *\n * @param {string} listKey\n */\nexport function useRememberListUrl(listKey) {\n const {useLocation} = useToolkitNavigation();\n const {pathname, search} = useLocation();\n const currentListUrl = useRef(`${pathname}${search}`);\n currentListUrl.current = `${pathname}${search}`;\n\n useEffect(() => () => rememberListUrl(listKey, currentListUrl.current), [listKey]);\n}\n"],"names":[],"mappings":";;;;AAcA,MAAM,qBAAqB;AAQpB,SAAS,gBAAgB,SAAS,SAAS;AAC9C,QAAM,cAAc,iBAAiB,OAAO;AAC5C,MAAI,CAAC,aAAa;AACd;AAAA,EACJ;AACA,MAAI;AACA,WAAO,gBAAgB,QAAQ,GAAG,kBAAkB,GAAG,OAAO,IAAI,WAAW;AAAA,EACjF,QAAQ;AAAA,EAER;AACJ;AAQO,SAAS,cAAc,SAAS;AACnC,MAAI;AACA,WAAO,iBAAiB,OAAO,gBAAgB,QAAQ,GAAG,kBAAkB,GAAG,OAAO,EAAE,CAAC;AAAA,EAC7F,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAOO,SAAS,mBAAmB,SAAS;AACxC,QAAM,EAAC,YAAW,IAAI,qBAAoB;AAC1C,QAAM,EAAC,UAAU,OAAM,IAAI,YAAW;AACtC,QAAM,iBAAiB,OAAO,GAAG,QAAQ,GAAG,MAAM,EAAE;AACpD,iBAAe,UAAU,GAAG,QAAQ,GAAG,MAAM;AAE7C,YAAU,MAAM,MAAM,gBAAgB,SAAS,eAAe,OAAO,GAAG,CAAC,OAAO,CAAC;AACrF;"}