@stackcraftmx/calcita 0.47.0 → 0.51.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 (488) hide show
  1. package/README.md +173 -12
  2. package/cli/calcita.js +15 -0
  3. package/cli/checkTexts.js +209 -0
  4. package/cli/packageVersions.js +6 -1
  5. package/cli/projectFiles.js +4 -2
  6. package/cli/templates/project/README.md.tpl +21 -1
  7. package/cli/templates/project/eslint.config.js.tpl +27 -0
  8. package/cli/templates/project/src/app/appTexts.js.tpl +2 -1
  9. package/cli/templates/project/src/core/publicPaths.js.tpl +10 -2
  10. package/cli/templates/project/vite.config.js.tpl +8 -1
  11. package/dist/DataTable/AuditTrailDialog.js +3 -2
  12. package/dist/DataTable/AuditTrailDialog.js.map +1 -1
  13. package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js +3 -2
  14. package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js.map +1 -1
  15. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js +3 -2
  16. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js.map +1 -1
  17. package/dist/DataTable/ColumnFilters/SortableFilterHeader.js +3 -2
  18. package/dist/DataTable/ColumnFilters/SortableFilterHeader.js.map +1 -1
  19. package/dist/DataTable/EmptyState.js +3 -2
  20. package/dist/DataTable/EmptyState.js.map +1 -1
  21. package/dist/DataTable/FilterChips.js +3 -2
  22. package/dist/DataTable/FilterChips.js.map +1 -1
  23. package/dist/DataTable/GoToPage.js +3 -2
  24. package/dist/DataTable/GoToPage.js.map +1 -1
  25. package/dist/DataTable/ServerTable.js +95 -28
  26. package/dist/DataTable/ServerTable.js.map +1 -1
  27. package/dist/DataTable/ServerTableFilterDrawer.js +8 -3
  28. package/dist/DataTable/ServerTableFilterDrawer.js.map +1 -1
  29. package/dist/DataTable/StackedCell.js +60 -0
  30. package/dist/DataTable/StackedCell.js.map +1 -0
  31. package/dist/DataTable/TableCardsView.js +88 -0
  32. package/dist/DataTable/TableCardsView.js.map +1 -0
  33. package/dist/DataTable/columnWidths.js +30 -0
  34. package/dist/DataTable/columnWidths.js.map +1 -0
  35. package/dist/DataTable/columns.js +47 -1
  36. package/dist/DataTable/columns.js.map +1 -1
  37. package/dist/DataTable/fixedColumns.js +24 -0
  38. package/dist/DataTable/fixedColumns.js.map +1 -0
  39. package/dist/DataTable/useTableView.js +29 -0
  40. package/dist/DataTable/useTableView.js.map +1 -0
  41. package/dist/access/PermissionMatrix.js +3 -2
  42. package/dist/access/PermissionMatrix.js.map +1 -1
  43. package/dist/account/AccountProvider.js +1 -1
  44. package/dist/account/AccountSecuritySection.js +3 -2
  45. package/dist/account/AccountSecuritySection.js.map +1 -1
  46. package/dist/account/DemoTotpCodeButton.js +3 -2
  47. package/dist/account/DemoTotpCodeButton.js.map +1 -1
  48. package/dist/account/ProfileScreen.js +3 -2
  49. package/dist/account/ProfileScreen.js.map +1 -1
  50. package/dist/account/SignInScreen.js +3 -2
  51. package/dist/account/SignInScreen.js.map +1 -1
  52. package/dist/appShell/AccountMenu.js +3 -2
  53. package/dist/appShell/AccountMenu.js.map +1 -1
  54. package/dist/appShell/AppLayout.js +3 -2
  55. package/dist/appShell/AppLayout.js.map +1 -1
  56. package/dist/appShell/AppearanceSettings.js +3 -2
  57. package/dist/appShell/AppearanceSettings.js.map +1 -1
  58. package/dist/appShell/AuthLayout.js +3 -2
  59. package/dist/appShell/AuthLayout.js.map +1 -1
  60. package/dist/appShell/BarActionButton.js +11 -4
  61. package/dist/appShell/BarActionButton.js.map +1 -1
  62. package/dist/appShell/BarActions.js +3 -2
  63. package/dist/appShell/BarActions.js.map +1 -1
  64. package/dist/appShell/BarCapsule.js +3 -2
  65. package/dist/appShell/BarCapsule.js.map +1 -1
  66. package/dist/appShell/BarSearch.js +3 -2
  67. package/dist/appShell/BarSearch.js.map +1 -1
  68. package/dist/appShell/HeaderTools.js +3 -2
  69. package/dist/appShell/HeaderTools.js.map +1 -1
  70. package/dist/appShell/MobileTabBar.js +3 -2
  71. package/dist/appShell/MobileTabBar.js.map +1 -1
  72. package/dist/appShell/SettingsMenu.js +3 -2
  73. package/dist/appShell/SettingsMenu.js.map +1 -1
  74. package/dist/appShell/SideMenu.js +3 -2
  75. package/dist/appShell/SideMenu.js.map +1 -1
  76. package/dist/appShell/SideMenuEntry.js +3 -2
  77. package/dist/appShell/SideMenuEntry.js.map +1 -1
  78. package/dist/appShell/SubmenuActionsMenu.js +3 -2
  79. package/dist/appShell/SubmenuActionsMenu.js.map +1 -1
  80. package/dist/appShell/TabBarEditor.js +3 -2
  81. package/dist/appShell/TabBarEditor.js.map +1 -1
  82. package/dist/appShell/TopMenu.js +3 -2
  83. package/dist/appShell/TopMenu.js.map +1 -1
  84. package/dist/appShell/Wordmark.js +3 -2
  85. package/dist/appShell/Wordmark.js.map +1 -1
  86. package/dist/auth/PasswordChecklist.js +3 -2
  87. package/dist/auth/PasswordChecklist.js.map +1 -1
  88. package/dist/calendar/EventCalendar.js +3 -2
  89. package/dist/calendar/EventCalendar.js.map +1 -1
  90. package/dist/calendar/EventDetails.js +3 -2
  91. package/dist/calendar/EventDetails.js.map +1 -1
  92. package/dist/datePickers/DateInput.js +28 -22
  93. package/dist/datePickers/DateInput.js.map +1 -1
  94. package/dist/datePickers/DateTimeInput.js +33 -27
  95. package/dist/datePickers/DateTimeInput.js.map +1 -1
  96. package/dist/datePickers/MonthInput.js +27 -21
  97. package/dist/datePickers/MonthInput.js.map +1 -1
  98. package/dist/datePickers/TimeInput.js +26 -20
  99. package/dist/datePickers/TimeInput.js.map +1 -1
  100. package/dist/datePickers/usePickerField.js +5 -4
  101. package/dist/datePickers/usePickerField.js.map +1 -1
  102. package/dist/downloads/DownloadManager.js +3 -2
  103. package/dist/downloads/DownloadManager.js.map +1 -1
  104. package/dist/feedback/ConfirmDialog.js +3 -2
  105. package/dist/feedback/ConfirmDialog.js.map +1 -1
  106. package/dist/feedback/ModalWaiting.js +3 -2
  107. package/dist/feedback/ModalWaiting.js.map +1 -1
  108. package/dist/feedback/NewBuildNotice.js +3 -2
  109. package/dist/feedback/NewBuildNotice.js.map +1 -1
  110. package/dist/filepond/FileDropzone.js +3 -2
  111. package/dist/filepond/FileDropzone.js.map +1 -1
  112. package/dist/forms/FormProblemAlert.js +3 -2
  113. package/dist/forms/FormProblemAlert.js.map +1 -1
  114. package/dist/forms/SubmitButton.js +7 -2
  115. package/dist/forms/SubmitButton.js.map +1 -1
  116. package/dist/forms/auth/SignInForm.js +3 -2
  117. package/dist/forms/auth/SignInForm.js.map +1 -1
  118. package/dist/forms/fieldRules.js +30 -0
  119. package/dist/forms/fieldRules.js.map +1 -0
  120. package/dist/forms/security/SecondStepForm.js +3 -2
  121. package/dist/forms/security/SecondStepForm.js.map +1 -1
  122. package/dist/forms/security/TwoStepVerificationCard.js +3 -2
  123. package/dist/forms/security/TwoStepVerificationCard.js.map +1 -1
  124. package/dist/forms/useValidationText.js +18 -0
  125. package/dist/forms/useValidationText.js.map +1 -0
  126. package/dist/forms/validation.js +35 -31
  127. package/dist/forms/validation.js.map +1 -1
  128. package/dist/forms/validationMessages.js +64 -7
  129. package/dist/forms/validationMessages.js.map +1 -1
  130. package/dist/forms.js +3 -0
  131. package/dist/forms.js.map +1 -1
  132. package/dist/hookForm/FormProblemAlert.js +3 -2
  133. package/dist/hookForm/FormProblemAlert.js.map +1 -1
  134. package/dist/hookForm/SubmitButton.js +7 -2
  135. package/dist/hookForm/SubmitButton.js.map +1 -1
  136. package/dist/inbox/InboxLayout.js +3 -2
  137. package/dist/inbox/InboxLayout.js.map +1 -1
  138. package/dist/inbox/MessageList.js +3 -2
  139. package/dist/inbox/MessageList.js.map +1 -1
  140. package/dist/inbox/MessageView.js +3 -2
  141. package/dist/inbox/MessageView.js.map +1 -1
  142. package/dist/index.js +186 -163
  143. package/dist/index.js.map +1 -1
  144. package/dist/inputs/CatalogInput.js +32 -25
  145. package/dist/inputs/CatalogInput.js.map +1 -1
  146. package/dist/inputs/CheckboxGroupInput.js +8 -5
  147. package/dist/inputs/CheckboxGroupInput.js.map +1 -1
  148. package/dist/inputs/ColorInput.js +7 -4
  149. package/dist/inputs/ColorInput.js.map +1 -1
  150. package/dist/inputs/FieldFrame.js +10 -4
  151. package/dist/inputs/FieldFrame.js.map +1 -1
  152. package/dist/inputs/FormSection.js +1 -1
  153. package/dist/inputs/MaskedInput.js +1 -0
  154. package/dist/inputs/MaskedInput.js.map +1 -1
  155. package/dist/inputs/NumberInput.js +29 -24
  156. package/dist/inputs/NumberInput.js.map +1 -1
  157. package/dist/inputs/RepeatingFields.js +8 -5
  158. package/dist/inputs/RepeatingFields.js.map +1 -1
  159. package/dist/inputs/SelectInput.js +8 -5
  160. package/dist/inputs/SelectInput.js.map +1 -1
  161. package/dist/inputs/TextInput.js +5 -3
  162. package/dist/inputs/TextInput.js.map +1 -1
  163. package/dist/inputs/TransferListInput.js +8 -5
  164. package/dist/inputs/TransferListInput.js.map +1 -1
  165. package/dist/inputs/WizardLayout.js +3 -2
  166. package/dist/inputs/WizardLayout.js.map +1 -1
  167. package/dist/kanban/KanbanBoard.js +3 -2
  168. package/dist/kanban/KanbanBoard.js.map +1 -1
  169. package/dist/legal/CookieNotice.js +3 -2
  170. package/dist/legal/CookieNotice.js.map +1 -1
  171. package/dist/legal/TermsAcceptanceDialog.js +3 -2
  172. package/dist/legal/TermsAcceptanceDialog.js.map +1 -1
  173. package/dist/locales/en.js +24 -0
  174. package/dist/locales/en.js.map +1 -1
  175. package/dist/locales/es.js +24 -0
  176. package/dist/locales/es.js.map +1 -1
  177. package/dist/maps/MapView.js +3 -2
  178. package/dist/maps/MapView.js.map +1 -1
  179. package/dist/mexico/CfdiSummary.js +3 -2
  180. package/dist/mexico/CfdiSummary.js.map +1 -1
  181. package/dist/mexico/EfirmaFields.js +3 -2
  182. package/dist/mexico/EfirmaFields.js.map +1 -1
  183. package/dist/mexico/mexicoIdentifiers.js +5 -0
  184. package/dist/mexico/mexicoIdentifiers.js.map +1 -1
  185. package/dist/mexico/mexicoRules.js +9 -4
  186. package/dist/mexico/mexicoRules.js.map +1 -1
  187. package/dist/mexico.js +4 -2
  188. package/dist/pwa/InstallAppSetting.js +3 -2
  189. package/dist/pwa/InstallAppSetting.js.map +1 -1
  190. package/dist/pwa/InstallInstructionsDialog.js +3 -2
  191. package/dist/pwa/InstallInstructionsDialog.js.map +1 -1
  192. package/dist/pwa/InstallPromptBanner.js +3 -2
  193. package/dist/pwa/InstallPromptBanner.js.map +1 -1
  194. package/dist/react-hook-form.js +3 -0
  195. package/dist/react-hook-form.js.map +1 -1
  196. package/dist/richText/RichTextEditor.js +7 -4
  197. package/dist/richText/RichTextEditor.js.map +1 -1
  198. package/dist/richText/RichTextView.js +3 -2
  199. package/dist/richText/RichTextView.js.map +1 -1
  200. package/dist/security/ActivityLog.js +3 -2
  201. package/dist/security/ActivityLog.js.map +1 -1
  202. package/dist/security/RecoveryCodesDialog.js +3 -2
  203. package/dist/security/RecoveryCodesDialog.js.map +1 -1
  204. package/dist/security/SessionsCard.js +3 -2
  205. package/dist/security/SessionsCard.js.map +1 -1
  206. package/dist/table.js +21 -2
  207. package/dist/table.js.map +1 -1
  208. package/dist/theme/themePieces.js +70 -4
  209. package/dist/theme/themePieces.js.map +1 -1
  210. package/dist/toolkit/ToolkitProvider.js +8 -1
  211. package/dist/toolkit/ToolkitProvider.js.map +1 -1
  212. package/dist/toolkit/browserNavigation.js +19 -4
  213. package/dist/toolkit/browserNavigation.js.map +1 -1
  214. package/dist/toolkit/combineTexts.js +32 -0
  215. package/dist/toolkit/combineTexts.js.map +1 -0
  216. package/dist/toolkit/hashNavigation.js +17 -3
  217. package/dist/toolkit/hashNavigation.js.map +1 -1
  218. package/dist/toolkit/navigationPaths.js +15 -0
  219. package/dist/toolkit/navigationPaths.js.map +1 -1
  220. package/dist/toolkit/pathIndex.js +66 -0
  221. package/dist/toolkit/pathIndex.js.map +1 -0
  222. package/dist/toolkit/toolkitSettings.js +19 -1
  223. package/dist/toolkit/toolkitSettings.js.map +1 -1
  224. package/dist/types/DataTable/AuditTrailDialog.d.ts +6 -17
  225. package/dist/types/DataTable/ColumnFilters/HeaderFilterPopover.d.ts +6 -5
  226. package/dist/types/DataTable/ColumnFilters/MultiSelectColumnFilter.d.ts +6 -9
  227. package/dist/types/DataTable/ColumnFilters/SortableFilterHeader.d.ts +6 -14
  228. package/dist/types/DataTable/EmptyState.d.ts +6 -9
  229. package/dist/types/DataTable/FilterChips.d.ts +6 -11
  230. package/dist/types/DataTable/GoToPage.d.ts +6 -9
  231. package/dist/types/DataTable/ServerTable.d.ts +16 -80
  232. package/dist/types/DataTable/ServerTableFilterDrawer.d.ts +6 -13
  233. package/dist/types/DataTable/StackedCell.d.ts +12 -0
  234. package/dist/types/DataTable/TableCardsView.d.ts +27 -0
  235. package/dist/types/DataTable/columnWidths.d.ts +21 -0
  236. package/dist/types/DataTable/columns.d.ts +111 -0
  237. package/dist/types/DataTable/fixedColumns.d.ts +29 -0
  238. package/dist/types/DataTable/index.d.ts +6 -1
  239. package/dist/types/DataTable/useTableView.d.ts +22 -0
  240. package/dist/types/access/PermissionMatrix.d.ts +6 -10
  241. package/dist/types/account/AccountSecuritySection.d.ts +6 -7
  242. package/dist/types/account/DemoTotpCodeButton.d.ts +6 -5
  243. package/dist/types/account/ProfileScreen.d.ts +6 -18
  244. package/dist/types/account/SignInScreen.d.ts +6 -13
  245. package/dist/types/appShell/AccountMenu.d.ts +6 -11
  246. package/dist/types/appShell/AppLayout.d.ts +3 -40
  247. package/dist/types/appShell/AppearanceSettings.d.ts +6 -12
  248. package/dist/types/appShell/AuthLayout.d.ts +3 -11
  249. package/dist/types/appShell/BarActionButton.d.ts +6 -10
  250. package/dist/types/appShell/BarActions.d.ts +6 -15
  251. package/dist/types/appShell/BarCapsule.d.ts +6 -9
  252. package/dist/types/appShell/BarSearch.d.ts +6 -15
  253. package/dist/types/appShell/HeaderTools.d.ts +6 -16
  254. package/dist/types/appShell/MobileTabBar.d.ts +6 -13
  255. package/dist/types/appShell/SettingsMenu.d.ts +6 -10
  256. package/dist/types/appShell/SideMenu.d.ts +6 -20
  257. package/dist/types/appShell/SideMenuEntry.d.ts +6 -11
  258. package/dist/types/appShell/SubmenuActionsMenu.d.ts +6 -12
  259. package/dist/types/appShell/TabBarEditor.d.ts +6 -9
  260. package/dist/types/appShell/TopMenu.d.ts +6 -5
  261. package/dist/types/appShell/Wordmark.d.ts +6 -7
  262. package/dist/types/auth/PasswordChecklist.d.ts +6 -9
  263. package/dist/types/calendar/EventCalendar.d.ts +6 -23
  264. package/dist/types/calendar/EventDetails.d.ts +6 -10
  265. package/dist/types/datePickers/DateInput.d.ts +7 -22
  266. package/dist/types/datePickers/DateTimeInput.d.ts +7 -27
  267. package/dist/types/datePickers/MonthInput.d.ts +7 -21
  268. package/dist/types/datePickers/TimeInput.d.ts +7 -21
  269. package/dist/types/datePickers/usePickerField.d.ts +5 -1
  270. package/dist/types/downloads/DownloadManager.d.ts +6 -6
  271. package/dist/types/feedback/ConfirmDialog.d.ts +6 -18
  272. package/dist/types/feedback/ModalWaiting.d.ts +6 -9
  273. package/dist/types/feedback/NewBuildNotice.d.ts +6 -10
  274. package/dist/types/filepond/FileDropzone.d.ts +6 -29
  275. package/dist/types/forms/FormProblemAlert.d.ts +6 -5
  276. package/dist/types/forms/SubmitButton.d.ts +6 -6
  277. package/dist/types/forms/auth/SignInForm.d.ts +6 -11
  278. package/dist/types/forms/fieldRules.d.ts +44 -0
  279. package/dist/types/forms/index.d.ts +1 -0
  280. package/dist/types/forms/security/SecondStepForm.d.ts +6 -14
  281. package/dist/types/forms/security/TwoStepVerificationCard.d.ts +6 -21
  282. package/dist/types/forms/useValidationText.d.ts +12 -0
  283. package/dist/types/forms/validation.d.ts +117 -174
  284. package/dist/types/forms/validationMessages.d.ts +54 -6
  285. package/dist/types/forms.d.ts +1 -1
  286. package/dist/types/hookForm/FormProblemAlert.d.ts +6 -5
  287. package/dist/types/hookForm/SubmitButton.d.ts +6 -13
  288. package/dist/types/inbox/InboxLayout.d.ts +6 -17
  289. package/dist/types/inbox/MessageList.d.ts +6 -18
  290. package/dist/types/inbox/MessageView.d.ts +6 -14
  291. package/dist/types/index.d.ts +8 -1
  292. package/dist/types/inputs/CatalogInput.d.ts +7 -24
  293. package/dist/types/inputs/CheckboxGroupInput.d.ts +7 -18
  294. package/dist/types/inputs/ColorInput.d.ts +7 -16
  295. package/dist/types/inputs/FieldFrame.d.ts +6 -10
  296. package/dist/types/inputs/MaskedInput.d.ts +3 -0
  297. package/dist/types/inputs/NumberInput.d.ts +7 -20
  298. package/dist/types/inputs/RepeatingFields.d.ts +7 -28
  299. package/dist/types/inputs/SelectInput.d.ts +7 -20
  300. package/dist/types/inputs/TextInput.d.ts +3 -0
  301. package/dist/types/inputs/TransferListInput.d.ts +7 -20
  302. package/dist/types/inputs/WizardLayout.d.ts +6 -19
  303. package/dist/types/kanban/KanbanBoard.d.ts +6 -25
  304. package/dist/types/legal/CookieNotice.d.ts +6 -16
  305. package/dist/types/legal/TermsAcceptanceDialog.d.ts +6 -18
  306. package/dist/types/locales/en.d.ts +24 -0
  307. package/dist/types/locales/es.d.ts +24 -0
  308. package/dist/types/maps/MapView.d.ts +6 -17
  309. package/dist/types/mexico/CfdiSummary.d.ts +6 -11
  310. package/dist/types/mexico/EfirmaFields.d.ts +6 -16
  311. package/dist/types/mexico/mexicoIdentifiers.d.ts +7 -0
  312. package/dist/types/mexico/mexicoRules.d.ts +19 -3
  313. package/dist/types/mexico.d.ts +2 -2
  314. package/dist/types/pwa/InstallAppSetting.d.ts +6 -6
  315. package/dist/types/pwa/InstallInstructionsDialog.d.ts +6 -9
  316. package/dist/types/pwa/InstallPromptBanner.d.ts +6 -11
  317. package/dist/types/react-hook-form.d.ts +1 -0
  318. package/dist/types/richText/RichTextEditor.d.ts +7 -22
  319. package/dist/types/richText/RichTextView.d.ts +6 -9
  320. package/dist/types/security/ActivityLog.d.ts +6 -9
  321. package/dist/types/security/RecoveryCodesDialog.d.ts +6 -11
  322. package/dist/types/security/SessionsCard.d.ts +6 -11
  323. package/dist/types/table.d.ts +3 -1
  324. package/dist/types/theme/themePieces.d.ts +55 -3
  325. package/dist/types/toolkit/ToolkitProvider.d.ts +13 -1
  326. package/dist/types/toolkit/browserNavigation.d.ts +7 -3
  327. package/dist/types/toolkit/combineTexts.d.ts +6 -0
  328. package/dist/types/toolkit/hashNavigation.d.ts +4 -2
  329. package/dist/types/toolkit/navigationPaths.d.ts +35 -0
  330. package/dist/types/toolkit/pathIndex.d.ts +27 -0
  331. package/dist/types/toolkit/toolkitSettings.d.ts +7 -4
  332. package/dist/types/ui/actions/ActionsMenu.d.ts +9 -11
  333. package/dist/types/ui/actions/CopyButton.d.ts +6 -12
  334. package/dist/types/ui/actions/DownloadMenu.d.ts +6 -29
  335. package/dist/types/ui/actions/SecretField.d.ts +6 -11
  336. package/dist/types/ui/actions/SelectionActions.d.ts +6 -13
  337. package/dist/types/ui/cards/RecordCard.d.ts +6 -31
  338. package/dist/types/ui/cards/RecordCardSkeleton.d.ts +6 -11
  339. package/dist/types/ui/countdown/Countdown.d.ts +6 -15
  340. package/dist/types/ui/documents/PdfViewerDialog.d.ts +6 -13
  341. package/dist/types/ui/filters/DateRangeFilter.d.ts +6 -10
  342. package/dist/types/ui/filters/FilterDrawer.d.ts +6 -17
  343. package/dist/types/ui/filters/PeriodRangeSelector.d.ts +6 -13
  344. package/dist/types/ui/filters/QuickFilters.d.ts +6 -12
  345. package/dist/types/ui/help/HelpButton.d.ts +6 -10
  346. package/dist/types/ui/help/HelpCarouselDialog.d.ts +6 -14
  347. package/dist/types/ui/labels/MarkedText.d.ts +10 -0
  348. package/dist/types/ui/labels/Tag.d.ts +6 -12
  349. package/dist/types/ui/labels/markedTextPieces.d.ts +22 -0
  350. package/dist/types/ui/layout/CollapsibleSection.d.ts +6 -12
  351. package/dist/types/ui/layout/ContentDialog.d.ts +6 -10
  352. package/dist/types/ui/layout/DefinitionList.d.ts +6 -9
  353. package/dist/types/ui/layout/DetailHeader.d.ts +6 -10
  354. package/dist/types/ui/layout/ErrorPage.d.ts +6 -17
  355. package/dist/types/ui/layout/FullPageLoader.d.ts +6 -6
  356. package/dist/types/ui/layout/GlassPanel.d.ts +6 -8
  357. package/dist/types/ui/layout/PageHeader.d.ts +6 -10
  358. package/dist/types/ui/layout/PageHeading.d.ts +6 -11
  359. package/dist/types/ui/layout/ProfileHeader.d.ts +6 -11
  360. package/dist/types/ui/layout/ScrollableRow.d.ts +6 -13
  361. package/dist/types/ui/layout/SectionCard.d.ts +6 -8
  362. package/dist/types/ui/metrics/BarList.d.ts +6 -12
  363. package/dist/types/ui/metrics/CalendarHeatmap.d.ts +6 -19
  364. package/dist/types/ui/metrics/ChartTooltip.d.ts +6 -6
  365. package/dist/types/ui/metrics/ColumnChart.d.ts +6 -25
  366. package/dist/types/ui/metrics/LineChart.d.ts +6 -20
  367. package/dist/types/ui/metrics/MetricCard.d.ts +6 -17
  368. package/dist/types/ui/metrics/TableToggle.d.ts +6 -6
  369. package/dist/types/ui/metrics/chartParts.d.ts +15 -30
  370. package/dist/types/ui/navigation/BackButton.d.ts +6 -9
  371. package/dist/types/ui/navigation/ColorSchemeToggle.d.ts +6 -9
  372. package/dist/types/ui/navigation/FontSizeToggle.d.ts +6 -8
  373. package/dist/types/ui/navigation/LanguageToggle.d.ts +6 -8
  374. package/dist/types/ui/navigation/PageBreadcrumbs.d.ts +6 -7
  375. package/dist/types/ui/navigation/RouteTabs.d.ts +7 -12
  376. package/dist/types/ui/timeline/GroupedTimeline.d.ts +6 -23
  377. package/dist/types/upload/AttachmentsInput.d.ts +11 -1
  378. package/dist/types/upload/FileDropzone.d.ts +6 -21
  379. package/dist/types/upload/FileInput.d.ts +7 -24
  380. package/dist/types/upload/FileUploadInput.d.ts +7 -31
  381. package/dist/types/upload/ImageInput.d.ts +7 -25
  382. package/dist/types/upload/TemplateDownloadButton.d.ts +6 -18
  383. package/dist/ui/actions/ActionsMenu.js +14 -5
  384. package/dist/ui/actions/ActionsMenu.js.map +1 -1
  385. package/dist/ui/actions/CopyButton.js +8 -3
  386. package/dist/ui/actions/CopyButton.js.map +1 -1
  387. package/dist/ui/actions/DownloadMenu.js +3 -2
  388. package/dist/ui/actions/DownloadMenu.js.map +1 -1
  389. package/dist/ui/actions/SecretField.js +8 -3
  390. package/dist/ui/actions/SecretField.js.map +1 -1
  391. package/dist/ui/actions/SelectionActions.js +3 -2
  392. package/dist/ui/actions/SelectionActions.js.map +1 -1
  393. package/dist/ui/cards/RecordCard.js +4 -3
  394. package/dist/ui/cards/RecordCard.js.map +1 -1
  395. package/dist/ui/cards/RecordCardSkeleton.js +8 -3
  396. package/dist/ui/cards/RecordCardSkeleton.js.map +1 -1
  397. package/dist/ui/countdown/Countdown.js +3 -2
  398. package/dist/ui/countdown/Countdown.js.map +1 -1
  399. package/dist/ui/documents/PdfViewerDialog.js +3 -2
  400. package/dist/ui/documents/PdfViewerDialog.js.map +1 -1
  401. package/dist/ui/filters/DateRangeFilter.js +3 -2
  402. package/dist/ui/filters/DateRangeFilter.js.map +1 -1
  403. package/dist/ui/filters/FilterDrawer.js +3 -2
  404. package/dist/ui/filters/FilterDrawer.js.map +1 -1
  405. package/dist/ui/filters/PeriodRangeSelector.js +3 -2
  406. package/dist/ui/filters/PeriodRangeSelector.js.map +1 -1
  407. package/dist/ui/filters/QuickFilters.js +3 -2
  408. package/dist/ui/filters/QuickFilters.js.map +1 -1
  409. package/dist/ui/help/HelpButton.js +8 -3
  410. package/dist/ui/help/HelpButton.js.map +1 -1
  411. package/dist/ui/help/HelpCarouselDialog.js +3 -2
  412. package/dist/ui/help/HelpCarouselDialog.js.map +1 -1
  413. package/dist/ui/labels/MarkedText.js +31 -0
  414. package/dist/ui/labels/MarkedText.js.map +1 -0
  415. package/dist/ui/labels/Tag.js +3 -2
  416. package/dist/ui/labels/Tag.js.map +1 -1
  417. package/dist/ui/labels/markedTextPieces.js +64 -0
  418. package/dist/ui/labels/markedTextPieces.js.map +1 -0
  419. package/dist/ui/layout/CollapsibleSection.js +3 -2
  420. package/dist/ui/layout/CollapsibleSection.js.map +1 -1
  421. package/dist/ui/layout/ContentDialog.js +3 -2
  422. package/dist/ui/layout/ContentDialog.js.map +1 -1
  423. package/dist/ui/layout/DefinitionList.js +3 -2
  424. package/dist/ui/layout/DefinitionList.js.map +1 -1
  425. package/dist/ui/layout/DetailHeader.js +3 -2
  426. package/dist/ui/layout/DetailHeader.js.map +1 -1
  427. package/dist/ui/layout/ErrorPage.js +3 -2
  428. package/dist/ui/layout/ErrorPage.js.map +1 -1
  429. package/dist/ui/layout/FullPageLoader.js +3 -2
  430. package/dist/ui/layout/FullPageLoader.js.map +1 -1
  431. package/dist/ui/layout/GlassPanel.js +3 -2
  432. package/dist/ui/layout/GlassPanel.js.map +1 -1
  433. package/dist/ui/layout/PageHeader.js +3 -2
  434. package/dist/ui/layout/PageHeader.js.map +1 -1
  435. package/dist/ui/layout/PageHeading.js +3 -2
  436. package/dist/ui/layout/PageHeading.js.map +1 -1
  437. package/dist/ui/layout/ProfileHeader.js +3 -2
  438. package/dist/ui/layout/ProfileHeader.js.map +1 -1
  439. package/dist/ui/layout/ScrollableRow.js +3 -2
  440. package/dist/ui/layout/ScrollableRow.js.map +1 -1
  441. package/dist/ui/layout/SectionCard.js +3 -2
  442. package/dist/ui/layout/SectionCard.js.map +1 -1
  443. package/dist/ui/metrics/BarList.js +3 -2
  444. package/dist/ui/metrics/BarList.js.map +1 -1
  445. package/dist/ui/metrics/CalendarHeatmap.js +3 -2
  446. package/dist/ui/metrics/CalendarHeatmap.js.map +1 -1
  447. package/dist/ui/metrics/ChartTooltip.js +3 -2
  448. package/dist/ui/metrics/ChartTooltip.js.map +1 -1
  449. package/dist/ui/metrics/ColumnChart.js +3 -2
  450. package/dist/ui/metrics/ColumnChart.js.map +1 -1
  451. package/dist/ui/metrics/LineChart.js +3 -2
  452. package/dist/ui/metrics/LineChart.js.map +1 -1
  453. package/dist/ui/metrics/MetricCard.js +3 -2
  454. package/dist/ui/metrics/MetricCard.js.map +1 -1
  455. package/dist/ui/metrics/TableToggle.js +3 -2
  456. package/dist/ui/metrics/TableToggle.js.map +1 -1
  457. package/dist/ui/metrics/chartParts.js +7 -4
  458. package/dist/ui/metrics/chartParts.js.map +1 -1
  459. package/dist/ui/navigation/BackButton.js +7 -2
  460. package/dist/ui/navigation/BackButton.js.map +1 -1
  461. package/dist/ui/navigation/ColorSchemeToggle.js +3 -2
  462. package/dist/ui/navigation/ColorSchemeToggle.js.map +1 -1
  463. package/dist/ui/navigation/FontSizeToggle.js +3 -2
  464. package/dist/ui/navigation/FontSizeToggle.js.map +1 -1
  465. package/dist/ui/navigation/LanguageToggle.js +3 -2
  466. package/dist/ui/navigation/LanguageToggle.js.map +1 -1
  467. package/dist/ui/navigation/PageBreadcrumbs.js +3 -2
  468. package/dist/ui/navigation/PageBreadcrumbs.js.map +1 -1
  469. package/dist/ui/navigation/RouteTabs.js +8 -4
  470. package/dist/ui/navigation/RouteTabs.js.map +1 -1
  471. package/dist/ui/timeline/GroupedTimeline.js +3 -2
  472. package/dist/ui/timeline/GroupedTimeline.js.map +1 -1
  473. package/dist/upload/AttachmentsInput.js +9 -6
  474. package/dist/upload/AttachmentsInput.js.map +1 -1
  475. package/dist/upload/FileChip.js +2 -1
  476. package/dist/upload/FileChip.js.map +1 -1
  477. package/dist/upload/FileDropzone.js +5 -4
  478. package/dist/upload/FileDropzone.js.map +1 -1
  479. package/dist/upload/FileInput.js +9 -6
  480. package/dist/upload/FileInput.js.map +1 -1
  481. package/dist/upload/FileUploadInput.js +9 -6
  482. package/dist/upload/FileUploadInput.js.map +1 -1
  483. package/dist/upload/ImageInput.js +8 -5
  484. package/dist/upload/ImageInput.js.map +1 -1
  485. package/dist/upload/TemplateDownloadButton.js +3 -2
  486. package/dist/upload/TemplateDownloadButton.js.map +1 -1
  487. package/package.json +1 -1
  488. package/cli/templates/project/src/app/combineTexts.js.tpl +0 -31
@@ -1 +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// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaKanbanBoard con defaultProps y\n// styleOverrides de sus partes: completeButton, tags, titleRow, doneIcon, cardTitle, meta, due, dueIcon, dueText,\n// checklist, checklistIcon, comments, commentsIcon, attachments, attachmentsIcon, assignees, root, collapsedColumn,\n// collapsedTitle, hidden, column, columnHeader, columnTitle, quickAdd, dropZone, card, cardActions, cardContent, empty.\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';\nimport {piecePart, usePieceProps} from '@/theme/themePieces.js';\nimport {warnUnknownProps} from '@/toolkit/unknownProps.js';\n\n// el nombre de la pieza en el tema y sus partes (theme.components.CalcitaKanbanBoard)\nconst THEME_NAME = 'CalcitaKanbanBoard';\nconst KanbanCompleteButton = piecePart(THEME_NAME, 'CompleteButton', IconButton);\nconst KanbanTags = piecePart(THEME_NAME, 'Tags', Stack);\nconst KanbanTitleRow = piecePart(THEME_NAME, 'TitleRow', Stack);\nconst KanbanDoneIcon = piecePart(THEME_NAME, 'DoneIcon', CheckCircleRoundedIcon);\nconst KanbanCardTitle = piecePart(THEME_NAME, 'CardTitle', Typography);\nconst KanbanMeta = piecePart(THEME_NAME, 'Meta', Stack);\nconst KanbanDue = piecePart(THEME_NAME, 'Due', Stack);\nconst KanbanDueIcon = piecePart(THEME_NAME, 'DueIcon', EventOutlinedIcon);\nconst KanbanDueText = piecePart(THEME_NAME, 'DueText', Typography);\nconst KanbanChecklist = piecePart(THEME_NAME, 'Checklist', Stack);\nconst KanbanChecklistIcon = piecePart(THEME_NAME, 'ChecklistIcon', CheckBoxOutlinedIcon);\nconst KanbanComments = piecePart(THEME_NAME, 'Comments', Stack);\nconst KanbanCommentsIcon = piecePart(THEME_NAME, 'CommentsIcon', ChatBubbleOutlineRoundedIcon);\nconst KanbanAttachments = piecePart(THEME_NAME, 'Attachments', Stack);\nconst KanbanAttachmentsIcon = piecePart(THEME_NAME, 'AttachmentsIcon', AttachFileRoundedIcon);\nconst KanbanAssignees = piecePart(THEME_NAME, 'Assignees', AvatarGroup);\nconst KanbanRoot = piecePart(THEME_NAME, 'Root', Box);\nconst KanbanCollapsedColumn = piecePart(THEME_NAME, 'CollapsedColumn', Paper);\nconst KanbanCollapsedTitle = piecePart(THEME_NAME, 'CollapsedTitle', Typography);\nconst KanbanHidden = piecePart(THEME_NAME, 'Hidden', Box);\nconst KanbanColumn = piecePart(THEME_NAME, 'Column', Paper);\nconst KanbanColumnHeader = piecePart(THEME_NAME, 'ColumnHeader', Stack);\nconst KanbanColumnTitle = piecePart(THEME_NAME, 'ColumnTitle', Typography);\nconst KanbanQuickAdd = piecePart(THEME_NAME, 'QuickAdd', Box);\nconst KanbanDropZone = piecePart(THEME_NAME, 'DropZone', Stack);\nconst KanbanCard = piecePart(THEME_NAME, 'Card', Paper);\nconst KanbanCardActions = piecePart(THEME_NAME, 'CardActions', Box);\nconst KanbanCardContent = piecePart(THEME_NAME, 'CardContent', Box);\nconst KanbanEmpty = piecePart(THEME_NAME, 'Empty', Typography);\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 <KanbanCompleteButton size=\"small\" aria-label={label} aria-pressed={Boolean(card.completed)} ownSx={{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 </KanbanCompleteButton>\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 <KanbanTags direction=\"row\" spacing={0.5} useFlexGap ownSx={{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 </KanbanTags>\n )}\n <KanbanTitleRow direction=\"row\" spacing={1} ownSx={{alignItems: 'flex-start'}}>\n {onComplete && <CompleteButton card={card} t={t} onComplete={onComplete} />}\n {!onComplete && card.completed && (\n <KanbanDoneIcon fontSize=\"small\" ownSx={{color: 'success.main'}} titleAccess={t('completed')} />\n )}\n <KanbanCardTitle variant=\"subtitle2\" component=\"p\" ownSx={{color: card.completed ? 'text.secondary' : undefined}}>{card.title}</KanbanCardTitle>\n </KanbanTitleRow>\n {card.description && <Typography variant=\"body2\" color=\"text.secondary\">{card.description}</Typography>}\n {hasFooter && (\n <KanbanMeta direction=\"row\" spacing={1.25} useFlexGap ownSx={{alignItems: 'center', flexWrap: 'wrap', color: 'text.secondary'}}>\n {dueStatus && (\n <KanbanDue direction=\"row\" spacing={0.5} ownSx={{alignItems: 'center', color: DUE_COLOR[dueStatus]}}>\n <KanbanDueIcon ownSx={{fontSize: 16}} />\n <KanbanDueText variant=\"caption\" ownSx={{fontWeight: dueStatus === DUE_STATUS.upcoming ? 400 : 600}}>{dueText}</KanbanDueText>\n </KanbanDue>\n )}\n {card.checklist?.total > 0 && (\n <KanbanChecklist direction=\"row\" spacing={0.5} ownSx={{alignItems: 'center'}}\n aria-label={t('checklist', {done: card.checklist.done, total: card.checklist.total})}>\n <KanbanChecklistIcon ownSx={{fontSize: 16}} />\n <Typography variant=\"caption\" aria-hidden=\"true\">{card.checklist.done}/{card.checklist.total}</Typography>\n </KanbanChecklist>\n )}\n {card.comments > 0 && (\n <KanbanComments direction=\"row\" spacing={0.5} ownSx={{alignItems: 'center'}} aria-label={t('comments', {count: card.comments})}>\n <KanbanCommentsIcon ownSx={{fontSize: 16}} />\n <Typography variant=\"caption\" aria-hidden=\"true\">{card.comments}</Typography>\n </KanbanComments>\n )}\n {card.attachments > 0 && (\n <KanbanAttachments direction=\"row\" spacing={0.5} ownSx={{alignItems: 'center'}} aria-label={t('attachments', {count: card.attachments})}>\n <KanbanAttachmentsIcon ownSx={{fontSize: 16}} />\n <Typography variant=\"caption\" aria-hidden=\"true\">{card.attachments}</Typography>\n </KanbanAttachments>\n )}\n {card.assignees?.length > 0 && (\n <KanbanAssignees max={MAX_VISIBLE_ASSIGNEES} ownSx={{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 </KanbanAssignees>\n )}\n </KanbanMeta>\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(props) {\n // lo que el proyecto puso en su tema (components.CalcitaKanbanBoard.defaultProps) y encima lo que llega aquí\n const {\n columns, cards, onMove, renderCard, onCardClick, onAddCard, cardActions, columnActions, onCardComplete, onColumnCollapse, ariaLabel, texts,\n ...unknownProps\n} = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\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 <KanbanRoot role=\"region\" aria-label={ariaLabel} ownSx={{\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 <KanbanCollapsedColumn ref={droppableProvided.innerRef} {...droppableProvided.droppableProps} variant=\"outlined\" component=\"section\"\n aria-label={column.title}\n ownSx={{\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 <KanbanCollapsedTitle variant=\"subtitle2\" component=\"h3\" ownSx={{writingMode: 'vertical-rl', whiteSpace: 'nowrap'}}>\n {column.title}\n </KanbanCollapsedTitle>\n {/* el lugar de la tarjeta que se arrastra; encogida no la enseña */}\n <KanbanHidden ownSx={{display: 'none'}}>{droppableProvided.placeholder}</KanbanHidden>\n </KanbanCollapsedColumn>\n )}\n </Droppable>\n );\n }\n return (\n <KanbanColumn key={column.id} variant=\"outlined\" component=\"section\" aria-label={column.title}\n ownSx={{flex: '1 1 0', minWidth: COLUMN_MIN_WIDTH_PIXELS, p: 1.5, scrollSnapAlign: 'start', borderRadius: 3}}>\n <KanbanColumnHeader direction=\"row\" spacing={0.5} ownSx={{alignItems: 'center', mb: 1.5, px: 0.5}}>\n <KanbanColumnTitle variant=\"subtitle2\" component=\"h3\" ownSx={{flexGrow: 1, minWidth: 0}}>{column.title}</KanbanColumnTitle>\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 </KanbanColumnHeader>\n {addingColumnId === column.id && (\n <KanbanQuickAdd ownSx={{mb: 1}}>\n <QuickAdd columnTitle={column.title} t={t} onClose={() => setAddingColumnId(null)}\n onAdd={(title) => onAddCard({columnId: column.id, title})} />\n </KanbanQuickAdd>\n )}\n <Droppable droppableId={column.id}>\n {(droppableProvided, droppableSnapshot) => (\n <KanbanDropZone ref={droppableProvided.innerRef} {...droppableProvided.droppableProps} spacing={1}\n ownSx={{\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 <KanbanCard ref={draggableProvided.innerRef} {...draggableProvided.draggableProps} {...draggableProvided.dragHandleProps}\n elevation={draggableSnapshot.isDragging ? 8 : 1}\n onClick={onCardClick ? () => onCardClick(card.id) : undefined}\n ownSx={{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 <KanbanCardActions ownSx={{position: 'absolute', top: 4, right: 4}}>\n <ActionsMenu label={t('cardActions', {title: card.title})} actions={cardActions(card)} />\n </KanbanCardActions>\n )}\n <KanbanCardContent ownSx={cardActions ? {pr: 3} : undefined}>\n {renderCard ? renderCard(card) : <DefaultCard card={card} t={t} today={today} onComplete={onCardComplete} />}\n </KanbanCardContent>\n </KanbanCard>\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 <KanbanEmpty variant=\"caption\" color=\"text.secondary\" ownSx={{textAlign: 'center', py: 3}}>\n {total > 0 ? t('emptyFiltered') : t('empty')}\n </KanbanEmpty>\n )}\n </KanbanDropZone>\n )}\n </Droppable>\n </KanbanColumn>\n );\n })}\n </KanbanRoot>\n </DragDropContext>\n );\n}\n"],"names":[],"mappings":"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"}
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// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaKanbanBoard con defaultProps y\n// styleOverrides de sus partes: completeButton, tags, titleRow, doneIcon, cardTitle, meta, due, dueIcon, dueText,\n// checklist, checklistIcon, comments, commentsIcon, attachments, attachmentsIcon, assignees, root, collapsedColumn,\n// collapsedTitle, hidden, column, columnHeader, columnTitle, quickAdd, dropZone, card, cardActions, cardContent, empty.\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';\nimport {piecePart, usePieceProps, withPieceSlots} from '@/theme/themePieces.js';\nimport {warnUnknownProps} from '@/toolkit/unknownProps.js';\n\n// el nombre de la pieza en el tema y sus partes (theme.components.CalcitaKanbanBoard)\nconst THEME_NAME = 'CalcitaKanbanBoard';\nconst KanbanCompleteButton = piecePart(THEME_NAME, 'CompleteButton', IconButton);\nconst KanbanTags = piecePart(THEME_NAME, 'Tags', Stack);\nconst KanbanTitleRow = piecePart(THEME_NAME, 'TitleRow', Stack);\nconst KanbanDoneIcon = piecePart(THEME_NAME, 'DoneIcon', CheckCircleRoundedIcon);\nconst KanbanCardTitle = piecePart(THEME_NAME, 'CardTitle', Typography);\nconst KanbanMeta = piecePart(THEME_NAME, 'Meta', Stack);\nconst KanbanDue = piecePart(THEME_NAME, 'Due', Stack);\nconst KanbanDueIcon = piecePart(THEME_NAME, 'DueIcon', EventOutlinedIcon);\nconst KanbanDueText = piecePart(THEME_NAME, 'DueText', Typography);\nconst KanbanChecklist = piecePart(THEME_NAME, 'Checklist', Stack);\nconst KanbanChecklistIcon = piecePart(THEME_NAME, 'ChecklistIcon', CheckBoxOutlinedIcon);\nconst KanbanComments = piecePart(THEME_NAME, 'Comments', Stack);\nconst KanbanCommentsIcon = piecePart(THEME_NAME, 'CommentsIcon', ChatBubbleOutlineRoundedIcon);\nconst KanbanAttachments = piecePart(THEME_NAME, 'Attachments', Stack);\nconst KanbanAttachmentsIcon = piecePart(THEME_NAME, 'AttachmentsIcon', AttachFileRoundedIcon);\nconst KanbanAssignees = piecePart(THEME_NAME, 'Assignees', AvatarGroup);\nconst KanbanRoot = piecePart(THEME_NAME, 'Root', Box);\nconst KanbanCollapsedColumn = piecePart(THEME_NAME, 'CollapsedColumn', Paper);\nconst KanbanCollapsedTitle = piecePart(THEME_NAME, 'CollapsedTitle', Typography);\nconst KanbanHidden = piecePart(THEME_NAME, 'Hidden', Box);\nconst KanbanColumn = piecePart(THEME_NAME, 'Column', Paper);\nconst KanbanColumnHeader = piecePart(THEME_NAME, 'ColumnHeader', Stack);\nconst KanbanColumnTitle = piecePart(THEME_NAME, 'ColumnTitle', Typography);\nconst KanbanQuickAdd = piecePart(THEME_NAME, 'QuickAdd', Box);\nconst KanbanDropZone = piecePart(THEME_NAME, 'DropZone', Stack);\nconst KanbanCard = piecePart(THEME_NAME, 'Card', Paper);\nconst KanbanCardActions = piecePart(THEME_NAME, 'CardActions', Box);\nconst KanbanCardContent = piecePart(THEME_NAME, 'CardContent', Box);\nconst KanbanEmpty = piecePart(THEME_NAME, 'Empty', Typography);\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 <KanbanCompleteButton size=\"small\" aria-label={label} aria-pressed={Boolean(card.completed)} ownSx={{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 </KanbanCompleteButton>\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 <KanbanTags direction=\"row\" spacing={0.5} useFlexGap ownSx={{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 </KanbanTags>\n )}\n <KanbanTitleRow direction=\"row\" spacing={1} ownSx={{alignItems: 'flex-start'}}>\n {onComplete && <CompleteButton card={card} t={t} onComplete={onComplete} />}\n {!onComplete && card.completed && (\n <KanbanDoneIcon fontSize=\"small\" ownSx={{color: 'success.main'}} titleAccess={t('completed')} />\n )}\n <KanbanCardTitle variant=\"subtitle2\" component=\"p\" ownSx={{color: card.completed ? 'text.secondary' : undefined}}>{card.title}</KanbanCardTitle>\n </KanbanTitleRow>\n {card.description && <Typography variant=\"body2\" color=\"text.secondary\">{card.description}</Typography>}\n {hasFooter && (\n <KanbanMeta direction=\"row\" spacing={1.25} useFlexGap ownSx={{alignItems: 'center', flexWrap: 'wrap', color: 'text.secondary'}}>\n {dueStatus && (\n <KanbanDue direction=\"row\" spacing={0.5} ownSx={{alignItems: 'center', color: DUE_COLOR[dueStatus]}}>\n <KanbanDueIcon ownSx={{fontSize: 16}} />\n <KanbanDueText variant=\"caption\" ownSx={{fontWeight: dueStatus === DUE_STATUS.upcoming ? 400 : 600}}>{dueText}</KanbanDueText>\n </KanbanDue>\n )}\n {card.checklist?.total > 0 && (\n <KanbanChecklist direction=\"row\" spacing={0.5} ownSx={{alignItems: 'center'}}\n aria-label={t('checklist', {done: card.checklist.done, total: card.checklist.total})}>\n <KanbanChecklistIcon ownSx={{fontSize: 16}} />\n <Typography variant=\"caption\" aria-hidden=\"true\">{card.checklist.done}/{card.checklist.total}</Typography>\n </KanbanChecklist>\n )}\n {card.comments > 0 && (\n <KanbanComments direction=\"row\" spacing={0.5} ownSx={{alignItems: 'center'}} aria-label={t('comments', {count: card.comments})}>\n <KanbanCommentsIcon ownSx={{fontSize: 16}} />\n <Typography variant=\"caption\" aria-hidden=\"true\">{card.comments}</Typography>\n </KanbanComments>\n )}\n {card.attachments > 0 && (\n <KanbanAttachments direction=\"row\" spacing={0.5} ownSx={{alignItems: 'center'}} aria-label={t('attachments', {count: card.attachments})}>\n <KanbanAttachmentsIcon ownSx={{fontSize: 16}} />\n <Typography variant=\"caption\" aria-hidden=\"true\">{card.attachments}</Typography>\n </KanbanAttachments>\n )}\n {card.assignees?.length > 0 && (\n <KanbanAssignees max={MAX_VISIBLE_ASSIGNEES} ownSx={{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 </KanbanAssignees>\n )}\n </KanbanMeta>\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 */\nfunction KanbanBoardContent(props) {\n // lo que el proyecto puso en su tema (components.CalcitaKanbanBoard.defaultProps) y encima lo que llega aquí\n const {\n columns, cards, onMove, renderCard, onCardClick, onAddCard, cardActions, columnActions, onCardComplete, onColumnCollapse, ariaLabel, texts,\n ...unknownProps\n} = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\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 <KanbanRoot role=\"region\" aria-label={ariaLabel} ownSx={{\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 <KanbanCollapsedColumn ref={droppableProvided.innerRef} {...droppableProvided.droppableProps} variant=\"outlined\" component=\"section\"\n aria-label={column.title}\n ownSx={{\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 <KanbanCollapsedTitle variant=\"subtitle2\" component=\"h3\" ownSx={{writingMode: 'vertical-rl', whiteSpace: 'nowrap'}}>\n {column.title}\n </KanbanCollapsedTitle>\n {/* el lugar de la tarjeta que se arrastra; encogida no la enseña */}\n <KanbanHidden ownSx={{display: 'none'}}>{droppableProvided.placeholder}</KanbanHidden>\n </KanbanCollapsedColumn>\n )}\n </Droppable>\n );\n }\n return (\n <KanbanColumn key={column.id} variant=\"outlined\" component=\"section\" aria-label={column.title}\n ownSx={{flex: '1 1 0', minWidth: COLUMN_MIN_WIDTH_PIXELS, p: 1.5, scrollSnapAlign: 'start', borderRadius: 3}}>\n <KanbanColumnHeader direction=\"row\" spacing={0.5} ownSx={{alignItems: 'center', mb: 1.5, px: 0.5}}>\n <KanbanColumnTitle variant=\"subtitle2\" component=\"h3\" ownSx={{flexGrow: 1, minWidth: 0}}>{column.title}</KanbanColumnTitle>\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 </KanbanColumnHeader>\n {addingColumnId === column.id && (\n <KanbanQuickAdd ownSx={{mb: 1}}>\n <QuickAdd columnTitle={column.title} t={t} onClose={() => setAddingColumnId(null)}\n onAdd={(title) => onAddCard({columnId: column.id, title})} />\n </KanbanQuickAdd>\n )}\n <Droppable droppableId={column.id}>\n {(droppableProvided, droppableSnapshot) => (\n <KanbanDropZone ref={droppableProvided.innerRef} {...droppableProvided.droppableProps} spacing={1}\n ownSx={{\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 <KanbanCard ref={draggableProvided.innerRef} {...draggableProvided.draggableProps} {...draggableProvided.dragHandleProps}\n elevation={draggableSnapshot.isDragging ? 8 : 1}\n onClick={onCardClick ? () => onCardClick(card.id) : undefined}\n ownSx={{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 <KanbanCardActions ownSx={{position: 'absolute', top: 4, right: 4}}>\n <ActionsMenu label={t('cardActions', {title: card.title})} actions={cardActions(card)} />\n </KanbanCardActions>\n )}\n <KanbanCardContent ownSx={cardActions ? {pr: 3} : undefined}>\n {renderCard ? renderCard(card) : <DefaultCard card={card} t={t} today={today} onComplete={onCardComplete} />}\n </KanbanCardContent>\n </KanbanCard>\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 <KanbanEmpty variant=\"caption\" color=\"text.secondary\" ownSx={{textAlign: 'center', py: 3}}>\n {total > 0 ? t('emptyFiltered') : t('empty')}\n </KanbanEmpty>\n )}\n </KanbanDropZone>\n )}\n </Droppable>\n </KanbanColumn>\n );\n })}\n </KanbanRoot>\n </DragDropContext>\n );\n}\n\n// lo que se exporta: la pieza con slots y slotProps para cambiar sus partes (themePieces.js)\nconst KanbanBoard = withPieceSlots(KanbanBoardContent, THEME_NAME);\nexport default KanbanBoard;\n"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ import Stack from "@mui/material/Stack";
7
7
  import Typography from "@mui/material/Typography";
8
8
  import { FLOATING_BOTTOM_SPACE_CSS_VARIABLE } from "../appShell/shellSizes.js";
9
9
  import { DEFAULT_COOKIE_CONSENT_KEY, useCookieConsent } from "./useCookieConsent.js";
10
- import { piecePart, usePieceProps } from "../theme/themePieces.js";
10
+ import { piecePart, withPieceSlots, usePieceProps } from "../theme/themePieces.js";
11
11
  import { useToolkitTranslation } from "../toolkit/useToolkitTranslation.js";
12
12
  import { warnUnknownProps } from "../toolkit/unknownProps.js";
13
13
  const THEME_NAME = "CalcitaCookieNotice";
@@ -16,7 +16,7 @@ const NoticeText = piecePart(THEME_NAME, "Text", Typography);
16
16
  const NoticeActions = piecePart(THEME_NAME, "Actions", Stack);
17
17
  const NOTICE_MAX_WIDTH = 420;
18
18
  const NOTICE_Z_INDEX = 1200;
19
- function CookieNotice(props) {
19
+ function CookieNoticeContent(props) {
20
20
  const {
21
21
  version = "1",
22
22
  storageKey = DEFAULT_COOKIE_CONSENT_KEY,
@@ -73,6 +73,7 @@ function CookieNotice(props) {
73
73
  }
74
74
  );
75
75
  }
76
+ const CookieNotice = withPieceSlots(CookieNoticeContent, THEME_NAME);
76
77
  export {
77
78
  CookieNotice as default
78
79
  };
@@ -1 +1 @@
1
- {"version":3,"file":"CookieNotice.js","sources":["../../src/legal/CookieNotice.jsx"],"sourcesContent":["// El aviso de cookies: un recuadro abajo con el texto, la liga a la política y «Aceptar». Sale hasta que la persona acepta\n// ESA versión del aviso en este navegador; al cambiar la versión vuelve a salir. No tapa la pantalla ni la bloquea: se puede\n// seguir trabajando.\n//\n// La política se abre con su dirección (policyHref, en otra pestaña) o con lo que diga la pantalla (onPolicyClick: un\n// PdfViewerDialog, por ejemplo). El texto, los botones y dónde se recuerda se cambian desde afuera; para uno a su manera está\n// useCookieConsent.\n//\n// Con la barra de pestañas abajo del teléfono, se sube para no quedar encima (FLOATING_BOTTOM_SPACE del marco).\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaCookieNotice con defaultProps y\n// styleOverrides de sus partes: root, text, actions.\n//\n// Genérico del paquete: function (regla de la casa).\nimport Button from '@mui/material/Button';\nimport Link from '@mui/material/Link';\nimport Paper from '@mui/material/Paper';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport {FLOATING_BOTTOM_SPACE_CSS_VARIABLE} from '@/appShell/shellSizes.js';\nimport {DEFAULT_COOKIE_CONSENT_KEY, useCookieConsent} from '@/legal/useCookieConsent.js';\nimport {piecePart, usePieceProps} from '@/theme/themePieces.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport {warnUnknownProps} from '@/toolkit/unknownProps.js';\n\n// el nombre de la pieza en el tema y sus partes (theme.components.CalcitaCookieNotice)\nconst THEME_NAME = 'CalcitaCookieNotice';\nconst NoticeRoot = piecePart(THEME_NAME, 'Root', Paper);\nconst NoticeText = piecePart(THEME_NAME, 'Text', Typography);\nconst NoticeActions = piecePart(THEME_NAME, 'Actions', Stack);\n\n// lo ancho del recuadro en escritorio: un párrafo cómodo, no toda la orilla\nconst NOTICE_MAX_WIDTH = 420;\n// por encima de la app, debajo de los diálogos (MUI: modal 1300)\nconst NOTICE_Z_INDEX = 1200;\n\n/**\n * @param {object} props\n * @param {string} [props.version] la del aviso; al cambiarla se vuelve a preguntar (por omisión '1')\n * @param {string} [props.storageKey] dónde se recuerda en este navegador (por omisión 'calcita:cookieConsent')\n * @param {import('react').ReactNode} [props.text] ya traducido; por omisión el del paquete\n * @param {string} [props.policyHref] la dirección de la política (se abre en otra pestaña)\n * @param {() => void} [props.onPolicyClick] en lugar de la dirección: la pantalla la abre a su manera\n * @param {string} [props.policyLabel] ya traducido; por omisión «Política de cookies»\n * @param {string} [props.acceptLabel] ya traducido; por omisión «Aceptar»\n * @param {(acceptance: {version: string, acceptedAt: string}) => void} [props.onAccept] al aceptar (para registrarlo en su API)\n * @param {import('react').ReactNode} [props.actions] botones suyos junto a «Aceptar» («Configurar»)\n * @param {object} [props.sx]\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nexport default function CookieNotice(props) {\n const {\n version = '1', storageKey = DEFAULT_COOKIE_CONSENT_KEY, text, policyHref, onPolicyClick, policyLabel, acceptLabel, onAccept, actions, sx,\n texts,\n ...unknownProps\n } = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n const {t} = useToolkitTranslation('common', texts);\n const {hasAccepted, accept} = useCookieConsent({version, storageKey});\n\n // guard clause: ya aceptó esta versión\n if (hasAccepted) {\n return null;\n }\n\n const policyText = policyLabel ?? t('legal.cookies.policy');\n const policyLink = onPolicyClick\n ? <Link component=\"button\" type=\"button\" onClick={onPolicyClick} sx={{verticalAlign: 'baseline'}}>{policyText}</Link>\n : policyHref && <Link href={policyHref} target=\"_blank\" rel=\"noopener noreferrer\">{policyText}</Link>;\n\n return (\n <NoticeRoot\n role=\"region\"\n aria-label={t('legal.cookies.region')}\n elevation={8}\n ownSx={{\n position: 'fixed', zIndex: NOTICE_Z_INDEX, left: {xs: 16, sm: 24}, right: {xs: 16, sm: 'auto'}, maxWidth: {sm: NOTICE_MAX_WIDTH},\n bottom: `calc(16px + env(safe-area-inset-bottom, 0px) + var(${FLOATING_BOTTOM_SPACE_CSS_VARIABLE}, 0px))`,\n p: 2.5, borderRadius: 3,\n }}\n sx={sx}\n >\n <NoticeText variant=\"body2\" ownSx={{mb: 2}}>\n {text ?? t('legal.cookies.text')} {policyLink}\n </NoticeText>\n <NoticeActions direction=\"row\" ownSx={{gap: 1, justifyContent: 'flex-end', flexWrap: 'wrap'}}>\n {actions}\n <Button variant=\"contained\" onClick={() => {\n accept();\n onAccept?.({version, acceptedAt: new Date().toISOString()});\n }}>\n {acceptLabel ?? t('legal.cookies.accept')}\n </Button>\n </NoticeActions>\n </NoticeRoot>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AA2BA,MAAM,aAAa;AACnB,MAAM,aAAa,UAAU,YAAY,QAAQ,KAAK;AACtD,MAAM,aAAa,UAAU,YAAY,QAAQ,UAAU;AAC3D,MAAM,gBAAgB,UAAU,YAAY,WAAW,KAAK;AAG5D,MAAM,mBAAmB;AAEzB,MAAM,iBAAiB;AAgBvB,SAAwB,aAAa,OAAO;AACxC,QAAM;AAAA,IACF,UAAU;AAAA,IAAK,aAAa;AAAA,IAA4B;AAAA,IAAM;AAAA,IAAY;AAAA,IAAe;AAAA,IAAa;AAAA,IAAa;AAAA,IAAU;AAAA,IAAS;AAAA,IACtI;AAAA,IACA,GAAG;AAAA,EAAA,IACH,cAAc,OAAO,UAAU;AACnC,mBAAiB,YAAY,YAAY;AACzC,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AACjD,QAAM,EAAC,aAAa,OAAA,IAAU,iBAAiB,EAAC,SAAS,YAAW;AAGpE,MAAI,aAAa;AACb,WAAO;AAAA,EACX;AAEA,QAAM,aAAa,eAAe,EAAE,sBAAsB;AAC1D,QAAM,aAAa,gBACb,oBAAC,MAAA,EAAK,WAAU,UAAS,MAAK,UAAS,SAAS,eAAe,IAAI,EAAC,eAAe,cAAc,UAAA,WAAA,CAAW,IAC5G,cAAc,oBAAC,MAAA,EAAK,MAAM,YAAY,QAAO,UAAS,KAAI,uBAAuB,UAAA,WAAA,CAAW;AAElG,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,MAAK;AAAA,MACL,cAAY,EAAE,sBAAsB;AAAA,MACpC,WAAW;AAAA,MACX,OAAO;AAAA,QACH,UAAU;AAAA,QAAS,QAAQ;AAAA,QAAgB,MAAM,EAAC,IAAI,IAAI,IAAI,GAAA;AAAA,QAAK,OAAO,EAAC,IAAI,IAAI,IAAI,OAAA;AAAA,QAAS,UAAU,EAAC,IAAI,iBAAA;AAAA,QAC/G,QAAQ,sDAAsD,kCAAkC;AAAA,QAChG,GAAG;AAAA,QAAK,cAAc;AAAA,MAAA;AAAA,MAE1B;AAAA,MAEA,UAAA;AAAA,QAAA,qBAAC,cAAW,SAAQ,SAAQ,OAAO,EAAC,IAAI,KACnC,UAAA;AAAA,UAAA,QAAQ,EAAE,oBAAoB;AAAA,UAAE;AAAA,UAAE;AAAA,QAAA,GACvC;AAAA,QACA,qBAAC,eAAA,EAAc,WAAU,OAAM,OAAO,EAAC,KAAK,GAAG,gBAAgB,YAAY,UAAU,OAAA,GAChF,UAAA;AAAA,UAAA;AAAA,UACD,oBAAC,QAAA,EAAO,SAAQ,aAAY,SAAS,MAAM;AACvC,mBAAA;AACA,uBAAW,EAAC,SAAS,aAAY,oBAAI,QAAO,YAAA,GAAc;AAAA,UAC9D,GACK,UAAA,eAAe,EAAE,sBAAsB,EAAA,CAC5C;AAAA,QAAA,EAAA,CACJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGZ;"}
1
+ {"version":3,"file":"CookieNotice.js","sources":["../../src/legal/CookieNotice.jsx"],"sourcesContent":["// El aviso de cookies: un recuadro abajo con el texto, la liga a la política y «Aceptar». Sale hasta que la persona acepta\n// ESA versión del aviso en este navegador; al cambiar la versión vuelve a salir. No tapa la pantalla ni la bloquea: se puede\n// seguir trabajando.\n//\n// La política se abre con su dirección (policyHref, en otra pestaña) o con lo que diga la pantalla (onPolicyClick: un\n// PdfViewerDialog, por ejemplo). El texto, los botones y dónde se recuerda se cambian desde afuera; para uno a su manera está\n// useCookieConsent.\n//\n// Con la barra de pestañas abajo del teléfono, se sube para no quedar encima (FLOATING_BOTTOM_SPACE del marco).\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaCookieNotice con defaultProps y\n// styleOverrides de sus partes: root, text, actions.\n//\n// Genérico del paquete: function (regla de la casa).\nimport Button from '@mui/material/Button';\nimport Link from '@mui/material/Link';\nimport Paper from '@mui/material/Paper';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport {FLOATING_BOTTOM_SPACE_CSS_VARIABLE} from '@/appShell/shellSizes.js';\nimport {DEFAULT_COOKIE_CONSENT_KEY, useCookieConsent} from '@/legal/useCookieConsent.js';\nimport {piecePart, usePieceProps, withPieceSlots} from '@/theme/themePieces.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport {warnUnknownProps} from '@/toolkit/unknownProps.js';\n\n// el nombre de la pieza en el tema y sus partes (theme.components.CalcitaCookieNotice)\nconst THEME_NAME = 'CalcitaCookieNotice';\nconst NoticeRoot = piecePart(THEME_NAME, 'Root', Paper);\nconst NoticeText = piecePart(THEME_NAME, 'Text', Typography);\nconst NoticeActions = piecePart(THEME_NAME, 'Actions', Stack);\n\n// lo ancho del recuadro en escritorio: un párrafo cómodo, no toda la orilla\nconst NOTICE_MAX_WIDTH = 420;\n// por encima de la app, debajo de los diálogos (MUI: modal 1300)\nconst NOTICE_Z_INDEX = 1200;\n\n/**\n * @param {object} props\n * @param {string} [props.version] la del aviso; al cambiarla se vuelve a preguntar (por omisión '1')\n * @param {string} [props.storageKey] dónde se recuerda en este navegador (por omisión 'calcita:cookieConsent')\n * @param {import('react').ReactNode} [props.text] ya traducido; por omisión el del paquete\n * @param {string} [props.policyHref] la dirección de la política (se abre en otra pestaña)\n * @param {() => void} [props.onPolicyClick] en lugar de la dirección: la pantalla la abre a su manera\n * @param {string} [props.policyLabel] ya traducido; por omisión «Política de cookies»\n * @param {string} [props.acceptLabel] ya traducido; por omisión «Aceptar»\n * @param {(acceptance: {version: string, acceptedAt: string}) => void} [props.onAccept] al aceptar (para registrarlo en su API)\n * @param {import('react').ReactNode} [props.actions] botones suyos junto a «Aceptar» («Configurar»)\n * @param {object} [props.sx]\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nfunction CookieNoticeContent(props) {\n const {\n version = '1', storageKey = DEFAULT_COOKIE_CONSENT_KEY, text, policyHref, onPolicyClick, policyLabel, acceptLabel, onAccept, actions, sx,\n texts,\n ...unknownProps\n } = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n const {t} = useToolkitTranslation('common', texts);\n const {hasAccepted, accept} = useCookieConsent({version, storageKey});\n\n // guard clause: ya aceptó esta versión\n if (hasAccepted) {\n return null;\n }\n\n const policyText = policyLabel ?? t('legal.cookies.policy');\n const policyLink = onPolicyClick\n ? <Link component=\"button\" type=\"button\" onClick={onPolicyClick} sx={{verticalAlign: 'baseline'}}>{policyText}</Link>\n : policyHref && <Link href={policyHref} target=\"_blank\" rel=\"noopener noreferrer\">{policyText}</Link>;\n\n return (\n <NoticeRoot\n role=\"region\"\n aria-label={t('legal.cookies.region')}\n elevation={8}\n ownSx={{\n position: 'fixed', zIndex: NOTICE_Z_INDEX, left: {xs: 16, sm: 24}, right: {xs: 16, sm: 'auto'}, maxWidth: {sm: NOTICE_MAX_WIDTH},\n bottom: `calc(16px + env(safe-area-inset-bottom, 0px) + var(${FLOATING_BOTTOM_SPACE_CSS_VARIABLE}, 0px))`,\n p: 2.5, borderRadius: 3,\n }}\n sx={sx}\n >\n <NoticeText variant=\"body2\" ownSx={{mb: 2}}>\n {text ?? t('legal.cookies.text')} {policyLink}\n </NoticeText>\n <NoticeActions direction=\"row\" ownSx={{gap: 1, justifyContent: 'flex-end', flexWrap: 'wrap'}}>\n {actions}\n <Button variant=\"contained\" onClick={() => {\n accept();\n onAccept?.({version, acceptedAt: new Date().toISOString()});\n }}>\n {acceptLabel ?? t('legal.cookies.accept')}\n </Button>\n </NoticeActions>\n </NoticeRoot>\n );\n}\n\n// lo que se exporta: la pieza con slots y slotProps para cambiar sus partes (themePieces.js)\nconst CookieNotice = withPieceSlots(CookieNoticeContent, THEME_NAME);\nexport default CookieNotice;\n"],"names":[],"mappings":";;;;;;;;;;;;AA2BA,MAAM,aAAa;AACnB,MAAM,aAAa,UAAU,YAAY,QAAQ,KAAK;AACtD,MAAM,aAAa,UAAU,YAAY,QAAQ,UAAU;AAC3D,MAAM,gBAAgB,UAAU,YAAY,WAAW,KAAK;AAG5D,MAAM,mBAAmB;AAEzB,MAAM,iBAAiB;AAgBvB,SAAS,oBAAoB,OAAO;AAChC,QAAM;AAAA,IACF,UAAU;AAAA,IAAK,aAAa;AAAA,IAA4B;AAAA,IAAM;AAAA,IAAY;AAAA,IAAe;AAAA,IAAa;AAAA,IAAa;AAAA,IAAU;AAAA,IAAS;AAAA,IACtI;AAAA,IACA,GAAG;AAAA,EAAA,IACH,cAAc,OAAO,UAAU;AACnC,mBAAiB,YAAY,YAAY;AACzC,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AACjD,QAAM,EAAC,aAAa,OAAA,IAAU,iBAAiB,EAAC,SAAS,YAAW;AAGpE,MAAI,aAAa;AACb,WAAO;AAAA,EACX;AAEA,QAAM,aAAa,eAAe,EAAE,sBAAsB;AAC1D,QAAM,aAAa,gBACb,oBAAC,MAAA,EAAK,WAAU,UAAS,MAAK,UAAS,SAAS,eAAe,IAAI,EAAC,eAAe,cAAc,UAAA,WAAA,CAAW,IAC5G,cAAc,oBAAC,MAAA,EAAK,MAAM,YAAY,QAAO,UAAS,KAAI,uBAAuB,UAAA,WAAA,CAAW;AAElG,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,MAAK;AAAA,MACL,cAAY,EAAE,sBAAsB;AAAA,MACpC,WAAW;AAAA,MACX,OAAO;AAAA,QACH,UAAU;AAAA,QAAS,QAAQ;AAAA,QAAgB,MAAM,EAAC,IAAI,IAAI,IAAI,GAAA;AAAA,QAAK,OAAO,EAAC,IAAI,IAAI,IAAI,OAAA;AAAA,QAAS,UAAU,EAAC,IAAI,iBAAA;AAAA,QAC/G,QAAQ,sDAAsD,kCAAkC;AAAA,QAChG,GAAG;AAAA,QAAK,cAAc;AAAA,MAAA;AAAA,MAE1B;AAAA,MAEA,UAAA;AAAA,QAAA,qBAAC,cAAW,SAAQ,SAAQ,OAAO,EAAC,IAAI,KACnC,UAAA;AAAA,UAAA,QAAQ,EAAE,oBAAoB;AAAA,UAAE;AAAA,UAAE;AAAA,QAAA,GACvC;AAAA,QACA,qBAAC,eAAA,EAAc,WAAU,OAAM,OAAO,EAAC,KAAK,GAAG,gBAAgB,YAAY,UAAU,OAAA,GAChF,UAAA;AAAA,UAAA;AAAA,UACD,oBAAC,QAAA,EAAO,SAAQ,aAAY,SAAS,MAAM;AACvC,mBAAA;AACA,uBAAW,EAAC,SAAS,aAAY,oBAAI,QAAO,YAAA,GAAc;AAAA,UAC9D,GACK,UAAA,eAAe,EAAE,sBAAsB,EAAA,CAC5C;AAAA,QAAA,EAAA,CACJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGZ;AAGA,MAAM,eAAe,eAAe,qBAAqB,UAAU;"}
@@ -11,7 +11,7 @@ import DialogTitle from "@mui/material/DialogTitle";
11
11
  import FormControlLabel from "@mui/material/FormControlLabel";
12
12
  import Stack from "@mui/material/Stack";
13
13
  import Typography from "@mui/material/Typography";
14
- import { piecePart, usePieceProps } from "../theme/themePieces.js";
14
+ import { piecePart, withPieceSlots, usePieceProps } from "../theme/themePieces.js";
15
15
  import { useToolkitTranslation } from "../toolkit/useToolkitTranslation.js";
16
16
  import { warnUnknownProps } from "../toolkit/unknownProps.js";
17
17
  const THEME_NAME = "CalcitaTermsAcceptanceDialog";
@@ -20,7 +20,7 @@ const TermsFrame = piecePart(THEME_NAME, "Frame", "iframe");
20
20
  const TermsFooter = piecePart(THEME_NAME, "Footer", Stack);
21
21
  const READ_TO_END_SLACK_PIXELS = 16;
22
22
  const IGNORED_CLOSE_REASONS = /* @__PURE__ */ new Set(["backdropClick", "escapeKeyDown"]);
23
- function TermsAcceptanceDialog(props) {
23
+ function TermsAcceptanceDialogContent(props) {
24
24
  const {
25
25
  open,
26
26
  version,
@@ -123,6 +123,7 @@ function TermsAcceptanceDialog(props) {
123
123
  }
124
124
  );
125
125
  }
126
+ const TermsAcceptanceDialog = withPieceSlots(TermsAcceptanceDialogContent, THEME_NAME);
126
127
  export {
127
128
  TermsAcceptanceDialog as default
128
129
  };
@@ -1 +1 @@
1
- {"version":3,"file":"TermsAcceptanceDialog.js","sources":["../../src/legal/TermsAcceptanceDialog.jsx"],"sourcesContent":["// Aceptar los términos (o el aviso de privacidad) antes de seguir: la ventana enseña el texto de ESA versión, pide leerlo\n// hasta el final, marcar «He leído y acepto» y picar «Acepto»; «No acepto» es la otra salida. No se cierra con Escape ni con\n// un clic afuera: es una decisión, no un aviso.\n//\n// Quién lo registra es la pantalla: onAccept recibe la versión y manda al API quién aceptó qué y cuándo (lo que vale ante\n// un reclamo). Si onAccept regresa una promesa, la ventana espera con el botón ocupado; si truena, enseña el motivo y deja\n// intentar otra vez.\n//\n// El texto va como children (se sabe si ya se leyó hasta el final) o como un PDF (pdfSrc, con el visor del navegador; ahí no\n// se puede saber hasta dónde se leyó y basta la casilla).\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaTermsAcceptanceDialog con defaultProps y\n// styleOverrides de sus partes: content, frame, footer.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useEffect, useId, useState} from 'react';\nimport Alert from '@mui/material/Alert';\nimport Button from '@mui/material/Button';\nimport Checkbox from '@mui/material/Checkbox';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport {piecePart, usePieceProps} from '@/theme/themePieces.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport {warnUnknownProps} from '@/toolkit/unknownProps.js';\n\n// el nombre de la pieza en el tema y sus partes (theme.components.CalcitaTermsAcceptanceDialog)\nconst THEME_NAME = 'CalcitaTermsAcceptanceDialog';\nconst TermsContent = piecePart(THEME_NAME, 'Content', DialogContent);\nconst TermsFrame = piecePart(THEME_NAME, 'Frame', 'iframe');\nconst TermsFooter = piecePart(THEME_NAME, 'Footer', Stack);\n\n// cuánto antes del final ya cuenta como leído (el último renglón medio a la vista)\nconst READ_TO_END_SLACK_PIXELS = 16;\n// los cierres que se ignoran: aceptar o no es una decisión con sus botones\nconst IGNORED_CLOSE_REASONS = new Set(['backdropClick', 'escapeKeyDown']);\n\n/**\n * @param {object} props\n * @param {boolean} props.open\n * @param {string} props.version la de los términos que se enseñan (la que recibe onAccept)\n * @param {(acceptance: {version: string}) => void|Promise<void>} props.onAccept la pantalla lo registra en su API\n * @param {() => void} props.onDecline «No acepto» (salir, por ejemplo)\n * @param {string} [props.title] ya traducido; por omisión «Términos y condiciones»\n * @param {import('react').ReactNode} [props.children] el texto de los términos\n * @param {string} [props.pdfSrc] en lugar del texto: la dirección del PDF\n * @param {boolean} [props.requireReading] pedir que se lea hasta el final antes de poder aceptar (por omisión, sí; con PDF no\n * aplica)\n * @param {string} [props.checkboxLabel] ya traducido; por omisión «He leído y acepto los términos»\n * @param {string} [props.acceptLabel] ya traducido; por omisión «Acepto»\n * @param {string} [props.declineLabel] ya traducido; por omisión «No acepto»\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nexport default function TermsAcceptanceDialog(props) {\n const {\n open, version, onAccept, onDecline, title, children, pdfSrc, requireReading = true, checkboxLabel, acceptLabel, declineLabel, texts,\n ...unknownProps\n } = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n const {t} = useToolkitTranslation('common', texts);\n const titleId = useId();\n // el contenido que se lee: se guarda al aparecer (la ventana lo pinta en un portal, DESPUÉS de este componente)\n const [contentNode, setContentNode] = useState(null);\n const mustRead = requireReading && !pdfSrc;\n const [hasReadToEnd, setHasReadToEnd] = useState(!mustRead);\n const [isChecked, setIsChecked] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n const [saveError, setSaveError] = useState(null);\n\n const checkReadToEnd = () => {\n if (contentNode && contentNode.scrollTop + contentNode.clientHeight >= contentNode.scrollHeight - READ_TO_END_SLACK_PIXELS) {\n setHasReadToEnd(true);\n }\n };\n // un texto que cabe completo ya está leído. OJO: se revisa cuando el contenido aparece y cada vez que cambia de tamaño;\n // revisarlo al abrir no sirve: el portal todavía no lo pinta y, si no hay que deslizar, la casilla se quedaba apagada\n // para siempre\n useEffect(() => {\n if (!contentNode || !mustRead) {\n return undefined;\n }\n checkReadToEnd();\n if (typeof ResizeObserver === 'undefined') {\n return undefined;\n }\n const observer = new ResizeObserver(checkReadToEnd);\n observer.observe(contentNode);\n return () => observer.disconnect();\n }, [contentNode, mustRead]);\n\n const accept = async () => {\n setIsSaving(true);\n setSaveError(null);\n try {\n await onAccept({version});\n } catch (error) {\n setSaveError(error?.message ?? t('legal.terms.saveFailed'));\n } finally {\n setIsSaving(false);\n }\n };\n\n return (\n <Dialog open={open} maxWidth=\"md\" fullWidth aria-labelledby={titleId}\n onClose={(event, reason) => !IGNORED_CLOSE_REASONS.has(reason) && onDecline()}>\n <DialogTitle id={titleId}>\n {title ?? t('legal.terms.title')}\n <Typography component=\"span\" variant=\"body2\" color=\"text.secondary\" sx={{display: 'block'}}>\n {t('legal.terms.version', {version})}\n </Typography>\n </DialogTitle>\n <TermsContent dividers ref={setContentNode} onScroll={mustRead ? checkReadToEnd : undefined} tabIndex={0}\n ownSx={{maxHeight: {xs: '55vh', md: '60vh'}}}>\n {pdfSrc ? (\n <TermsFrame src={pdfSrc} title={title ?? t('legal.terms.title')}\n ownSx={{display: 'block', width: '100%', height: {xs: '50vh', md: '56vh'}, border: 0}} />\n ) : children}\n </TermsContent>\n <TermsFooter ownSx={{px: 3, pt: 2}}>\n {saveError && <Alert severity=\"error\" role=\"alert\" sx={{mb: 1.5}}>{saveError}</Alert>}\n <FormControlLabel\n control={<Checkbox checked={isChecked} onChange={(event) => setIsChecked(event.target.checked)} disabled={!hasReadToEnd || isSaving} />}\n label={checkboxLabel ?? t('legal.terms.checkbox')}\n />\n {!hasReadToEnd && <Typography variant=\"caption\" color=\"text.secondary\">{t('legal.terms.readToEnd')}</Typography>}\n </TermsFooter>\n <DialogActions sx={{px: 3, pb: 2}}>\n <Button onClick={onDecline} disabled={isSaving}>{declineLabel ?? t('legal.terms.decline')}</Button>\n <Button variant=\"contained\" onClick={accept} disabled={!isChecked || isSaving} loading={isSaving}>\n {acceptLabel ?? t('legal.terms.accept')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TermsAcceptanceDialog.js","sources":["../../src/legal/TermsAcceptanceDialog.jsx"],"sourcesContent":["// Aceptar los términos (o el aviso de privacidad) antes de seguir: la ventana enseña el texto de ESA versión, pide leerlo\n// hasta el final, marcar «He leído y acepto» y picar «Acepto»; «No acepto» es la otra salida. No se cierra con Escape ni con\n// un clic afuera: es una decisión, no un aviso.\n//\n// Quién lo registra es la pantalla: onAccept recibe la versión y manda al API quién aceptó qué y cuándo (lo que vale ante\n// un reclamo). Si onAccept regresa una promesa, la ventana espera con el botón ocupado; si truena, enseña el motivo y deja\n// intentar otra vez.\n//\n// El texto va como children (se sabe si ya se leyó hasta el final) o como un PDF (pdfSrc, con el visor del navegador; ahí no\n// se puede saber hasta dónde se leyó y basta la casilla).\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaTermsAcceptanceDialog con defaultProps y\n// styleOverrides de sus partes: content, frame, footer.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useEffect, useId, useState} from 'react';\nimport Alert from '@mui/material/Alert';\nimport Button from '@mui/material/Button';\nimport Checkbox from '@mui/material/Checkbox';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport {piecePart, usePieceProps, withPieceSlots} from '@/theme/themePieces.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport {warnUnknownProps} from '@/toolkit/unknownProps.js';\n\n// el nombre de la pieza en el tema y sus partes (theme.components.CalcitaTermsAcceptanceDialog)\nconst THEME_NAME = 'CalcitaTermsAcceptanceDialog';\nconst TermsContent = piecePart(THEME_NAME, 'Content', DialogContent);\nconst TermsFrame = piecePart(THEME_NAME, 'Frame', 'iframe');\nconst TermsFooter = piecePart(THEME_NAME, 'Footer', Stack);\n\n// cuánto antes del final ya cuenta como leído (el último renglón medio a la vista)\nconst READ_TO_END_SLACK_PIXELS = 16;\n// los cierres que se ignoran: aceptar o no es una decisión con sus botones\nconst IGNORED_CLOSE_REASONS = new Set(['backdropClick', 'escapeKeyDown']);\n\n/**\n * @param {object} props\n * @param {boolean} props.open\n * @param {string} props.version la de los términos que se enseñan (la que recibe onAccept)\n * @param {(acceptance: {version: string}) => void|Promise<void>} props.onAccept la pantalla lo registra en su API\n * @param {() => void} props.onDecline «No acepto» (salir, por ejemplo)\n * @param {string} [props.title] ya traducido; por omisión «Términos y condiciones»\n * @param {import('react').ReactNode} [props.children] el texto de los términos\n * @param {string} [props.pdfSrc] en lugar del texto: la dirección del PDF\n * @param {boolean} [props.requireReading] pedir que se lea hasta el final antes de poder aceptar (por omisión, sí; con PDF no\n * aplica)\n * @param {string} [props.checkboxLabel] ya traducido; por omisión «He leído y acepto los términos»\n * @param {string} [props.acceptLabel] ya traducido; por omisión «Acepto»\n * @param {string} [props.declineLabel] ya traducido; por omisión «No acepto»\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nfunction TermsAcceptanceDialogContent(props) {\n const {\n open, version, onAccept, onDecline, title, children, pdfSrc, requireReading = true, checkboxLabel, acceptLabel, declineLabel, texts,\n ...unknownProps\n } = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n const {t} = useToolkitTranslation('common', texts);\n const titleId = useId();\n // el contenido que se lee: se guarda al aparecer (la ventana lo pinta en un portal, DESPUÉS de este componente)\n const [contentNode, setContentNode] = useState(null);\n const mustRead = requireReading && !pdfSrc;\n const [hasReadToEnd, setHasReadToEnd] = useState(!mustRead);\n const [isChecked, setIsChecked] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n const [saveError, setSaveError] = useState(null);\n\n const checkReadToEnd = () => {\n if (contentNode && contentNode.scrollTop + contentNode.clientHeight >= contentNode.scrollHeight - READ_TO_END_SLACK_PIXELS) {\n setHasReadToEnd(true);\n }\n };\n // un texto que cabe completo ya está leído. OJO: se revisa cuando el contenido aparece y cada vez que cambia de tamaño;\n // revisarlo al abrir no sirve: el portal todavía no lo pinta y, si no hay que deslizar, la casilla se quedaba apagada\n // para siempre\n useEffect(() => {\n if (!contentNode || !mustRead) {\n return undefined;\n }\n checkReadToEnd();\n if (typeof ResizeObserver === 'undefined') {\n return undefined;\n }\n const observer = new ResizeObserver(checkReadToEnd);\n observer.observe(contentNode);\n return () => observer.disconnect();\n }, [contentNode, mustRead]);\n\n const accept = async () => {\n setIsSaving(true);\n setSaveError(null);\n try {\n await onAccept({version});\n } catch (error) {\n setSaveError(error?.message ?? t('legal.terms.saveFailed'));\n } finally {\n setIsSaving(false);\n }\n };\n\n return (\n <Dialog open={open} maxWidth=\"md\" fullWidth aria-labelledby={titleId}\n onClose={(event, reason) => !IGNORED_CLOSE_REASONS.has(reason) && onDecline()}>\n <DialogTitle id={titleId}>\n {title ?? t('legal.terms.title')}\n <Typography component=\"span\" variant=\"body2\" color=\"text.secondary\" sx={{display: 'block'}}>\n {t('legal.terms.version', {version})}\n </Typography>\n </DialogTitle>\n <TermsContent dividers ref={setContentNode} onScroll={mustRead ? checkReadToEnd : undefined} tabIndex={0}\n ownSx={{maxHeight: {xs: '55vh', md: '60vh'}}}>\n {pdfSrc ? (\n <TermsFrame src={pdfSrc} title={title ?? t('legal.terms.title')}\n ownSx={{display: 'block', width: '100%', height: {xs: '50vh', md: '56vh'}, border: 0}} />\n ) : children}\n </TermsContent>\n <TermsFooter ownSx={{px: 3, pt: 2}}>\n {saveError && <Alert severity=\"error\" role=\"alert\" sx={{mb: 1.5}}>{saveError}</Alert>}\n <FormControlLabel\n control={<Checkbox checked={isChecked} onChange={(event) => setIsChecked(event.target.checked)} disabled={!hasReadToEnd || isSaving} />}\n label={checkboxLabel ?? t('legal.terms.checkbox')}\n />\n {!hasReadToEnd && <Typography variant=\"caption\" color=\"text.secondary\">{t('legal.terms.readToEnd')}</Typography>}\n </TermsFooter>\n <DialogActions sx={{px: 3, pb: 2}}>\n <Button onClick={onDecline} disabled={isSaving}>{declineLabel ?? t('legal.terms.decline')}</Button>\n <Button variant=\"contained\" onClick={accept} disabled={!isChecked || isSaving} loading={isSaving}>\n {acceptLabel ?? t('legal.terms.accept')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n\n// lo que se exporta: la pieza con slots y slotProps para cambiar sus partes (themePieces.js)\nconst TermsAcceptanceDialog = withPieceSlots(TermsAcceptanceDialogContent, THEME_NAME);\nexport default TermsAcceptanceDialog;\n"],"names":[],"mappings":"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"}
@@ -62,6 +62,26 @@ const en = Object.freeze({
62
62
  "all": "All",
63
63
  "countAriaLabel": "{{count}} records"
64
64
  },
65
+ "views": {
66
+ "label": "How to see the list",
67
+ "table": "Table",
68
+ "cards": "Cards"
69
+ },
70
+ "cards": {
71
+ "label": "The records as cards",
72
+ "pagination": {
73
+ "page": "Page {{page}}",
74
+ "first": "First page",
75
+ "last": "Last page",
76
+ "next": "Next page",
77
+ "previous": "Previous page",
78
+ "start-ellipsis": "Earlier pages",
79
+ "end-ellipsis": "Later pages"
80
+ }
81
+ },
82
+ "cells": {
83
+ "empty": "—"
84
+ },
65
85
  "detail": {
66
86
  "tooltip": "View details",
67
87
  "ariaLabel": "View the details of this record"
@@ -684,6 +704,10 @@ const en = Object.freeze({
684
704
  "rfc": "The RFC is not written correctly: check its letters, the date and the homoclave.",
685
705
  "curp": "The CURP is not written correctly: check its 18 characters.",
686
706
  "clabe": "The CLABE is not valid: check its 18 digits.",
707
+ "sameAs": "It must match {{other}}.",
708
+ "sameAsUnnamed": "It doesn't match.",
709
+ "percent": "Enter a percentage between {{min}} and {{max}}.",
710
+ "postalCode": "The postal code has 5 digits.",
687
711
  "listDuplicate": "It is already in row {{row}}.",
688
712
  "listOrderBetween": "It must be between {{previous}} (row {{previousRow}}) and {{next}} (row {{nextRow}}).",
689
713
  "listOrderAbovePrevious": "It must be greater than {{previous}} (row {{previousRow}}).",