@stackcraftmx/calcita 0.32.2 → 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 (680) hide show
  1. package/README.md +426 -4
  2. package/cli/calcita.js +15 -0
  3. package/cli/checkTexts.js +209 -0
  4. package/cli/packageVersions.js +17 -3
  5. package/cli/projectFiles.js +7 -2
  6. package/cli/templates/module/__Name__Page.test.jsx.tpl +24 -0
  7. package/cli/templates/project/README.md.tpl +35 -2
  8. package/cli/templates/project/eslint.config.js.tpl +27 -0
  9. package/cli/templates/project/src/app/appRouter.jsx.tpl +5 -2
  10. package/cli/templates/project/src/app/appTexts.js.tpl +2 -1
  11. package/cli/templates/project/src/core/accountConnector.js.tpl +4 -2
  12. package/cli/templates/project/src/core/publicPaths.js.tpl +10 -2
  13. package/cli/templates/project/src/modules/auth/SignInPage.test.jsx.tpl +20 -0
  14. package/cli/templates/project/src/modules/home/HomePage.test.jsx.tpl +16 -0
  15. package/cli/templates/project/src/testing/browserGaps.js.tpl +70 -0
  16. package/cli/templates/project/src/testing/openScreen.jsx.tpl +58 -0
  17. package/cli/templates/project/src/testing/setup.js.tpl +25 -0
  18. package/cli/templates/project/vite.config.js.tpl +20 -1
  19. package/dist/DataTable/AuditTrailDialog.js +3 -2
  20. package/dist/DataTable/AuditTrailDialog.js.map +1 -1
  21. package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js +3 -2
  22. package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js.map +1 -1
  23. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js +3 -2
  24. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js.map +1 -1
  25. package/dist/DataTable/ColumnFilters/SortableFilterHeader.js +3 -2
  26. package/dist/DataTable/ColumnFilters/SortableFilterHeader.js.map +1 -1
  27. package/dist/DataTable/EmptyState.js +3 -2
  28. package/dist/DataTable/EmptyState.js.map +1 -1
  29. package/dist/DataTable/FilterChips.js +3 -2
  30. package/dist/DataTable/FilterChips.js.map +1 -1
  31. package/dist/DataTable/GoToPage.js +71 -14
  32. package/dist/DataTable/GoToPage.js.map +1 -1
  33. package/dist/DataTable/ServerTable.js +97 -28
  34. package/dist/DataTable/ServerTable.js.map +1 -1
  35. package/dist/DataTable/ServerTableFilterDrawer.js +57 -0
  36. package/dist/DataTable/ServerTableFilterDrawer.js.map +1 -0
  37. package/dist/DataTable/StackedCell.js +60 -0
  38. package/dist/DataTable/StackedCell.js.map +1 -0
  39. package/dist/DataTable/TableCardsView.js +88 -0
  40. package/dist/DataTable/TableCardsView.js.map +1 -0
  41. package/dist/DataTable/columnWidths.js +30 -0
  42. package/dist/DataTable/columnWidths.js.map +1 -0
  43. package/dist/DataTable/columns.js +47 -1
  44. package/dist/DataTable/columns.js.map +1 -1
  45. package/dist/DataTable/filterContext.js.map +1 -1
  46. package/dist/DataTable/fixedColumns.js +24 -0
  47. package/dist/DataTable/fixedColumns.js.map +1 -0
  48. package/dist/DataTable/goToPageOptions.js +17 -0
  49. package/dist/DataTable/goToPageOptions.js.map +1 -0
  50. package/dist/DataTable/useTableView.js +29 -0
  51. package/dist/DataTable/useTableView.js.map +1 -0
  52. package/dist/access/PermissionMatrix.js +3 -2
  53. package/dist/access/PermissionMatrix.js.map +1 -1
  54. package/dist/account/AccountProvider.js +1 -1
  55. package/dist/account/AccountSecuritySection.js +3 -2
  56. package/dist/account/AccountSecuritySection.js.map +1 -1
  57. package/dist/account/DemoTotpCodeButton.js +3 -2
  58. package/dist/account/DemoTotpCodeButton.js.map +1 -1
  59. package/dist/account/ProfileScreen.js +3 -2
  60. package/dist/account/ProfileScreen.js.map +1 -1
  61. package/dist/account/SignInScreen.js +3 -2
  62. package/dist/account/SignInScreen.js.map +1 -1
  63. package/dist/appShell/AccountMenu.js +3 -2
  64. package/dist/appShell/AccountMenu.js.map +1 -1
  65. package/dist/appShell/AppLayout.js +3 -2
  66. package/dist/appShell/AppLayout.js.map +1 -1
  67. package/dist/appShell/AppearanceSettings.js +3 -2
  68. package/dist/appShell/AppearanceSettings.js.map +1 -1
  69. package/dist/appShell/AuthLayout.js +3 -2
  70. package/dist/appShell/AuthLayout.js.map +1 -1
  71. package/dist/appShell/BarActionButton.js +11 -4
  72. package/dist/appShell/BarActionButton.js.map +1 -1
  73. package/dist/appShell/BarActions.js +3 -2
  74. package/dist/appShell/BarActions.js.map +1 -1
  75. package/dist/appShell/BarCapsule.js +3 -2
  76. package/dist/appShell/BarCapsule.js.map +1 -1
  77. package/dist/appShell/BarSearch.js +3 -2
  78. package/dist/appShell/BarSearch.js.map +1 -1
  79. package/dist/appShell/HeaderTools.js +3 -2
  80. package/dist/appShell/HeaderTools.js.map +1 -1
  81. package/dist/appShell/MobileTabBar.js +3 -2
  82. package/dist/appShell/MobileTabBar.js.map +1 -1
  83. package/dist/appShell/SettingsMenu.js +3 -2
  84. package/dist/appShell/SettingsMenu.js.map +1 -1
  85. package/dist/appShell/SideMenu.js +3 -2
  86. package/dist/appShell/SideMenu.js.map +1 -1
  87. package/dist/appShell/SideMenuEntry.js +3 -2
  88. package/dist/appShell/SideMenuEntry.js.map +1 -1
  89. package/dist/appShell/SubmenuActionsMenu.js +3 -2
  90. package/dist/appShell/SubmenuActionsMenu.js.map +1 -1
  91. package/dist/appShell/TabBarEditor.js +3 -2
  92. package/dist/appShell/TabBarEditor.js.map +1 -1
  93. package/dist/appShell/TopMenu.js +3 -2
  94. package/dist/appShell/TopMenu.js.map +1 -1
  95. package/dist/appShell/Wordmark.js +3 -2
  96. package/dist/appShell/Wordmark.js.map +1 -1
  97. package/dist/auth/PasswordChecklist.js +3 -2
  98. package/dist/auth/PasswordChecklist.js.map +1 -1
  99. package/dist/calendar/EventCalendar.js +3 -2
  100. package/dist/calendar/EventCalendar.js.map +1 -1
  101. package/dist/calendar/EventDetails.js +3 -2
  102. package/dist/calendar/EventDetails.js.map +1 -1
  103. package/dist/date-pickers.js +28 -2
  104. package/dist/date-pickers.js.map +1 -1
  105. package/dist/datePickers/DateInput.js +41 -54
  106. package/dist/datePickers/DateInput.js.map +1 -1
  107. package/dist/datePickers/DateTimeInput.js +81 -0
  108. package/dist/datePickers/DateTimeInput.js.map +1 -0
  109. package/dist/datePickers/FormDateTimeField.js +12 -0
  110. package/dist/datePickers/FormDateTimeField.js.map +1 -0
  111. package/dist/datePickers/FormMonthField.js +12 -0
  112. package/dist/datePickers/FormMonthField.js.map +1 -0
  113. package/dist/datePickers/FormTimeField.js +12 -0
  114. package/dist/datePickers/FormTimeField.js.map +1 -0
  115. package/dist/datePickers/MonthInput.js +64 -0
  116. package/dist/datePickers/MonthInput.js.map +1 -0
  117. package/dist/datePickers/PickerFrame.js +27 -0
  118. package/dist/datePickers/PickerFrame.js.map +1 -0
  119. package/dist/datePickers/TimeInput.js +61 -0
  120. package/dist/datePickers/TimeInput.js.map +1 -0
  121. package/dist/datePickers/dateTimeRules.js +24 -0
  122. package/dist/datePickers/dateTimeRules.js.map +1 -0
  123. package/dist/datePickers/pickerValues.js +106 -0
  124. package/dist/datePickers/pickerValues.js.map +1 -0
  125. package/dist/datePickers/useCurrentMinute.js +28 -0
  126. package/dist/datePickers/useCurrentMinute.js.map +1 -0
  127. package/dist/datePickers/usePickerField.js +23 -0
  128. package/dist/datePickers/usePickerField.js.map +1 -0
  129. package/dist/dictionaries/dictionaries.js +3 -1
  130. package/dist/dictionaries/dictionaries.js.map +1 -1
  131. package/dist/downloads/DownloadManager.js +3 -2
  132. package/dist/downloads/DownloadManager.js.map +1 -1
  133. package/dist/feedback/ConfirmDialog.js +3 -2
  134. package/dist/feedback/ConfirmDialog.js.map +1 -1
  135. package/dist/feedback/ModalWaiting.js +3 -2
  136. package/dist/feedback/ModalWaiting.js.map +1 -1
  137. package/dist/feedback/NewBuildNotice.js +3 -2
  138. package/dist/feedback/NewBuildNotice.js.map +1 -1
  139. package/dist/filepond/FileDropzone.js +3 -2
  140. package/dist/filepond/FileDropzone.js.map +1 -1
  141. package/dist/forms/FormAttachmentsField.js +12 -0
  142. package/dist/forms/FormAttachmentsField.js.map +1 -0
  143. package/dist/forms/FormCheckboxGroupField.js +12 -0
  144. package/dist/forms/FormCheckboxGroupField.js.map +1 -0
  145. package/dist/forms/FormFileField.js +12 -0
  146. package/dist/forms/FormFileField.js.map +1 -0
  147. package/dist/forms/FormFileUploadField.js +12 -0
  148. package/dist/forms/FormFileUploadField.js.map +1 -0
  149. package/dist/forms/FormImageField.js +12 -0
  150. package/dist/forms/FormImageField.js.map +1 -0
  151. package/dist/forms/FormMaskedField.js +12 -0
  152. package/dist/forms/FormMaskedField.js.map +1 -0
  153. package/dist/forms/FormProblemAlert.js +3 -2
  154. package/dist/forms/FormProblemAlert.js.map +1 -1
  155. package/dist/forms/FormRepeatingFields.js +54 -0
  156. package/dist/forms/FormRepeatingFields.js.map +1 -0
  157. package/dist/forms/FormTransferListField.js +12 -0
  158. package/dist/forms/FormTransferListField.js.map +1 -0
  159. package/dist/forms/SubmitButton.js +7 -2
  160. package/dist/forms/SubmitButton.js.map +1 -1
  161. package/dist/forms/applyServerProblem.js +10 -3
  162. package/dist/forms/applyServerProblem.js.map +1 -1
  163. package/dist/forms/auth/SignInForm.js +3 -2
  164. package/dist/forms/auth/SignInForm.js.map +1 -1
  165. package/dist/forms/fieldRules.js +30 -0
  166. package/dist/forms/fieldRules.js.map +1 -0
  167. package/dist/forms/listRules.js +111 -0
  168. package/dist/forms/listRules.js.map +1 -0
  169. package/dist/forms/security/SecondStepForm.js +3 -2
  170. package/dist/forms/security/SecondStepForm.js.map +1 -1
  171. package/dist/forms/security/TwoStepVerificationCard.js +3 -2
  172. package/dist/forms/security/TwoStepVerificationCard.js.map +1 -1
  173. package/dist/forms/serverProblemFields.js +17 -0
  174. package/dist/forms/serverProblemFields.js.map +1 -1
  175. package/dist/forms/useValidationText.js +18 -0
  176. package/dist/forms/useValidationText.js.map +1 -0
  177. package/dist/forms/validation.js +35 -31
  178. package/dist/forms/validation.js.map +1 -1
  179. package/dist/forms/validationMessages.js +64 -7
  180. package/dist/forms/validationMessages.js.map +1 -1
  181. package/dist/forms.js +54 -29
  182. package/dist/forms.js.map +1 -1
  183. package/dist/hookForm/FormAttachmentsField.js +12 -0
  184. package/dist/hookForm/FormAttachmentsField.js.map +1 -0
  185. package/dist/hookForm/FormCheckboxGroupField.js +12 -0
  186. package/dist/hookForm/FormCheckboxGroupField.js.map +1 -0
  187. package/dist/hookForm/FormFileField.js +12 -0
  188. package/dist/hookForm/FormFileField.js.map +1 -0
  189. package/dist/hookForm/FormFileUploadField.js +12 -0
  190. package/dist/hookForm/FormFileUploadField.js.map +1 -0
  191. package/dist/hookForm/FormImageField.js +12 -0
  192. package/dist/hookForm/FormImageField.js.map +1 -0
  193. package/dist/hookForm/FormMaskedField.js +12 -0
  194. package/dist/hookForm/FormMaskedField.js.map +1 -0
  195. package/dist/hookForm/FormProblemAlert.js +3 -2
  196. package/dist/hookForm/FormProblemAlert.js.map +1 -1
  197. package/dist/hookForm/FormRepeatingFields.js +44 -0
  198. package/dist/hookForm/FormRepeatingFields.js.map +1 -0
  199. package/dist/hookForm/FormTransferListField.js +12 -0
  200. package/dist/hookForm/FormTransferListField.js.map +1 -0
  201. package/dist/hookForm/SubmitButton.js +7 -2
  202. package/dist/hookForm/SubmitButton.js.map +1 -1
  203. package/dist/hookForm/applyServerProblem.js +8 -3
  204. package/dist/hookForm/applyServerProblem.js.map +1 -1
  205. package/dist/inbox/InboxLayout.js +3 -2
  206. package/dist/inbox/InboxLayout.js.map +1 -1
  207. package/dist/inbox/MessageList.js +3 -2
  208. package/dist/inbox/MessageList.js.map +1 -1
  209. package/dist/inbox/MessageView.js +3 -2
  210. package/dist/inbox/MessageView.js.map +1 -1
  211. package/dist/index.js +235 -124
  212. package/dist/index.js.map +1 -1
  213. package/dist/inputs/CatalogInput.js +103 -29
  214. package/dist/inputs/CatalogInput.js.map +1 -1
  215. package/dist/inputs/CheckboxGroupInput.js +103 -0
  216. package/dist/inputs/CheckboxGroupInput.js.map +1 -0
  217. package/dist/inputs/ColorInput.js +7 -4
  218. package/dist/inputs/ColorInput.js.map +1 -1
  219. package/dist/inputs/FieldFrame.js +10 -4
  220. package/dist/inputs/FieldFrame.js.map +1 -1
  221. package/dist/inputs/FormSection.js +1 -1
  222. package/dist/inputs/MaskedInput.js +87 -0
  223. package/dist/inputs/MaskedInput.js.map +1 -0
  224. package/dist/inputs/NumberInput.js +41 -25
  225. package/dist/inputs/NumberInput.js.map +1 -1
  226. package/dist/inputs/RepeatingFields.js +180 -0
  227. package/dist/inputs/RepeatingFields.js.map +1 -0
  228. package/dist/inputs/SelectInput.js +50 -9
  229. package/dist/inputs/SelectInput.js.map +1 -1
  230. package/dist/inputs/TextInput.js +5 -3
  231. package/dist/inputs/TextInput.js.map +1 -1
  232. package/dist/inputs/TransferListInput.js +218 -0
  233. package/dist/inputs/TransferListInput.js.map +1 -0
  234. package/dist/inputs/WizardLayout.js +3 -2
  235. package/dist/inputs/WizardLayout.js.map +1 -1
  236. package/dist/inputs/inputMasks.js +84 -0
  237. package/dist/inputs/inputMasks.js.map +1 -0
  238. package/dist/inputs/selectAllState.js +20 -0
  239. package/dist/inputs/selectAllState.js.map +1 -0
  240. package/dist/inputs/useRowKeys.js +26 -0
  241. package/dist/inputs/useRowKeys.js.map +1 -0
  242. package/dist/kanban/KanbanBoard.js +3 -2
  243. package/dist/kanban/KanbanBoard.js.map +1 -1
  244. package/dist/legal/CookieNotice.js +80 -0
  245. package/dist/legal/CookieNotice.js.map +1 -0
  246. package/dist/legal/TermsAcceptanceDialog.js +130 -0
  247. package/dist/legal/TermsAcceptanceDialog.js.map +1 -0
  248. package/dist/legal/consentStorage.js +18 -0
  249. package/dist/legal/consentStorage.js.map +1 -0
  250. package/dist/legal/useCookieConsent.js +17 -0
  251. package/dist/legal/useCookieConsent.js.map +1 -0
  252. package/dist/locales/en.js +257 -1
  253. package/dist/locales/en.js.map +1 -1
  254. package/dist/locales/es.js +257 -1
  255. package/dist/locales/es.js.map +1 -1
  256. package/dist/maps/MapView.js +3 -2
  257. package/dist/maps/MapView.js.map +1 -1
  258. package/dist/mexico/CfdiSummary.js +82 -0
  259. package/dist/mexico/CfdiSummary.js.map +1 -0
  260. package/dist/mexico/EfirmaFields.js +168 -0
  261. package/dist/mexico/EfirmaFields.js.map +1 -0
  262. package/dist/mexico/certificateReader.js +79 -0
  263. package/dist/mexico/certificateReader.js.map +1 -0
  264. package/dist/mexico/cfdiReader.js +81 -0
  265. package/dist/mexico/cfdiReader.js.map +1 -0
  266. package/dist/mexico/derReader.js +81 -0
  267. package/dist/mexico/derReader.js.map +1 -0
  268. package/dist/mexico/efirmaKey.js +51 -0
  269. package/dist/mexico/efirmaKey.js.map +1 -0
  270. package/dist/mexico/mexicoIdentifiers.js +91 -0
  271. package/dist/mexico/mexicoIdentifiers.js.map +1 -0
  272. package/dist/mexico/mexicoRules.js +21 -0
  273. package/dist/mexico/mexicoRules.js.map +1 -0
  274. package/dist/mexico.js +34 -0
  275. package/dist/mexico.js.map +1 -0
  276. package/dist/pwa/InstallAppSetting.js +3 -2
  277. package/dist/pwa/InstallAppSetting.js.map +1 -1
  278. package/dist/pwa/InstallInstructionsDialog.js +3 -2
  279. package/dist/pwa/InstallInstructionsDialog.js.map +1 -1
  280. package/dist/pwa/InstallPromptBanner.js +3 -2
  281. package/dist/pwa/InstallPromptBanner.js.map +1 -1
  282. package/dist/react-hook-form.js +43 -17
  283. package/dist/react-hook-form.js.map +1 -1
  284. package/dist/rich-text.js +19 -0
  285. package/dist/rich-text.js.map +1 -0
  286. package/dist/richText/FormRichTextField.js +12 -0
  287. package/dist/richText/FormRichTextField.js.map +1 -0
  288. package/dist/richText/RichTextEditor.js +111 -0
  289. package/dist/richText/RichTextEditor.js.map +1 -0
  290. package/dist/richText/RichTextLinkPopover.js +57 -0
  291. package/dist/richText/RichTextLinkPopover.js.map +1 -0
  292. package/dist/richText/RichTextToolbar.js +189 -0
  293. package/dist/richText/RichTextToolbar.js.map +1 -0
  294. package/dist/richText/RichTextView.js +27 -0
  295. package/dist/richText/RichTextView.js.map +1 -0
  296. package/dist/richText/richTextContentSx.js +42 -0
  297. package/dist/richText/richTextContentSx.js.map +1 -0
  298. package/dist/richText/richTextExtensions.js +44 -0
  299. package/dist/richText/richTextExtensions.js.map +1 -0
  300. package/dist/richText/richTextRules.js +46 -0
  301. package/dist/richText/richTextRules.js.map +1 -0
  302. package/dist/security/ActivityLog.js +3 -2
  303. package/dist/security/ActivityLog.js.map +1 -1
  304. package/dist/security/RecoveryCodesDialog.js +3 -2
  305. package/dist/security/RecoveryCodesDialog.js.map +1 -1
  306. package/dist/security/SessionsCard.js +3 -2
  307. package/dist/security/SessionsCard.js.map +1 -1
  308. package/dist/table.js +23 -2
  309. package/dist/table.js.map +1 -1
  310. package/dist/theme/components/glassComponents.js +27 -0
  311. package/dist/theme/components/glassComponents.js.map +1 -1
  312. package/dist/theme/components/minimalComponents.js +12 -0
  313. package/dist/theme/components/minimalComponents.js.map +1 -1
  314. package/dist/theme/themePieces.js +70 -4
  315. package/dist/theme/themePieces.js.map +1 -1
  316. package/dist/toolkit/ToolkitProvider.js +8 -1
  317. package/dist/toolkit/ToolkitProvider.js.map +1 -1
  318. package/dist/toolkit/browserNavigation.js +19 -4
  319. package/dist/toolkit/browserNavigation.js.map +1 -1
  320. package/dist/toolkit/combineTexts.js +32 -0
  321. package/dist/toolkit/combineTexts.js.map +1 -0
  322. package/dist/toolkit/hashNavigation.js +17 -3
  323. package/dist/toolkit/hashNavigation.js.map +1 -1
  324. package/dist/toolkit/navigationPaths.js +15 -0
  325. package/dist/toolkit/navigationPaths.js.map +1 -1
  326. package/dist/toolkit/pathIndex.js +66 -0
  327. package/dist/toolkit/pathIndex.js.map +1 -0
  328. package/dist/toolkit/toolkitSettings.js +19 -1
  329. package/dist/toolkit/toolkitSettings.js.map +1 -1
  330. package/dist/types/DataTable/AuditTrailDialog.d.ts +6 -17
  331. package/dist/types/DataTable/ColumnFilters/HeaderFilterPopover.d.ts +6 -5
  332. package/dist/types/DataTable/ColumnFilters/MultiSelectColumnFilter.d.ts +6 -9
  333. package/dist/types/DataTable/ColumnFilters/SortableFilterHeader.d.ts +6 -14
  334. package/dist/types/DataTable/EmptyState.d.ts +6 -9
  335. package/dist/types/DataTable/FilterChips.d.ts +6 -11
  336. package/dist/types/DataTable/GoToPage.d.ts +6 -9
  337. package/dist/types/DataTable/ServerTable.d.ts +16 -80
  338. package/dist/types/DataTable/ServerTableFilterDrawer.d.ts +14 -0
  339. package/dist/types/DataTable/StackedCell.d.ts +12 -0
  340. package/dist/types/DataTable/TableCardsView.d.ts +27 -0
  341. package/dist/types/DataTable/columnWidths.d.ts +21 -0
  342. package/dist/types/DataTable/columns.d.ts +111 -0
  343. package/dist/types/DataTable/filterContext.d.ts +2 -1
  344. package/dist/types/DataTable/fixedColumns.d.ts +29 -0
  345. package/dist/types/DataTable/goToPageOptions.d.ts +15 -0
  346. package/dist/types/DataTable/index.d.ts +7 -1
  347. package/dist/types/DataTable/useTableView.d.ts +22 -0
  348. package/dist/types/access/PermissionMatrix.d.ts +6 -10
  349. package/dist/types/account/AccountSecuritySection.d.ts +6 -7
  350. package/dist/types/account/DemoTotpCodeButton.d.ts +6 -5
  351. package/dist/types/account/ProfileScreen.d.ts +6 -18
  352. package/dist/types/account/SignInScreen.d.ts +6 -13
  353. package/dist/types/appShell/AccountMenu.d.ts +6 -11
  354. package/dist/types/appShell/AppLayout.d.ts +3 -40
  355. package/dist/types/appShell/AppearanceSettings.d.ts +6 -12
  356. package/dist/types/appShell/AuthLayout.d.ts +3 -11
  357. package/dist/types/appShell/BarActionButton.d.ts +6 -10
  358. package/dist/types/appShell/BarActions.d.ts +6 -15
  359. package/dist/types/appShell/BarCapsule.d.ts +6 -9
  360. package/dist/types/appShell/BarSearch.d.ts +6 -15
  361. package/dist/types/appShell/HeaderTools.d.ts +6 -16
  362. package/dist/types/appShell/MobileTabBar.d.ts +6 -13
  363. package/dist/types/appShell/SettingsMenu.d.ts +6 -10
  364. package/dist/types/appShell/SideMenu.d.ts +6 -20
  365. package/dist/types/appShell/SideMenuEntry.d.ts +6 -11
  366. package/dist/types/appShell/SubmenuActionsMenu.d.ts +6 -12
  367. package/dist/types/appShell/TabBarEditor.d.ts +6 -9
  368. package/dist/types/appShell/TopMenu.d.ts +6 -5
  369. package/dist/types/appShell/Wordmark.d.ts +6 -7
  370. package/dist/types/auth/PasswordChecklist.d.ts +6 -9
  371. package/dist/types/calendar/EventCalendar.d.ts +6 -23
  372. package/dist/types/calendar/EventDetails.d.ts +6 -10
  373. package/dist/types/date-pickers.d.ts +10 -1
  374. package/dist/types/datePickers/DateInput.d.ts +10 -23
  375. package/dist/types/datePickers/DateTimeInput.d.ts +30 -0
  376. package/dist/types/datePickers/FormDateTimeField.d.ts +7 -0
  377. package/dist/types/datePickers/FormMonthField.d.ts +7 -0
  378. package/dist/types/datePickers/FormTimeField.d.ts +7 -0
  379. package/dist/types/datePickers/MonthInput.d.ts +25 -0
  380. package/dist/types/datePickers/PickerFrame.d.ts +22 -0
  381. package/dist/types/datePickers/TimeInput.d.ts +24 -0
  382. package/dist/types/datePickers/dateTimeRules.d.ts +31 -0
  383. package/dist/types/datePickers/pickerValues.d.ts +114 -0
  384. package/dist/types/datePickers/useCurrentMinute.d.ts +5 -0
  385. package/dist/types/datePickers/usePickerField.d.ts +28 -0
  386. package/dist/types/dictionaries/dictionaries.d.ts +6 -3
  387. package/dist/types/downloads/DownloadManager.d.ts +6 -6
  388. package/dist/types/feedback/ConfirmDialog.d.ts +6 -18
  389. package/dist/types/feedback/ModalWaiting.d.ts +6 -9
  390. package/dist/types/feedback/NewBuildNotice.d.ts +6 -10
  391. package/dist/types/filepond/FileDropzone.d.ts +6 -29
  392. package/dist/types/forms/FormAttachmentsField.d.ts +7 -0
  393. package/dist/types/forms/FormCheckboxGroupField.d.ts +7 -0
  394. package/dist/types/forms/FormFileField.d.ts +7 -0
  395. package/dist/types/forms/FormFileUploadField.d.ts +7 -0
  396. package/dist/types/forms/FormImageField.d.ts +7 -0
  397. package/dist/types/forms/FormMaskedField.d.ts +7 -0
  398. package/dist/types/forms/FormProblemAlert.d.ts +6 -5
  399. package/dist/types/forms/FormRepeatingFields.d.ts +25 -0
  400. package/dist/types/forms/FormTransferListField.d.ts +7 -0
  401. package/dist/types/forms/SubmitButton.d.ts +6 -6
  402. package/dist/types/forms/auth/SignInForm.d.ts +6 -11
  403. package/dist/types/forms/fieldRules.d.ts +44 -0
  404. package/dist/types/forms/index.d.ts +11 -1
  405. package/dist/types/forms/listRules.d.ts +48 -0
  406. package/dist/types/forms/security/SecondStepForm.d.ts +6 -14
  407. package/dist/types/forms/security/TwoStepVerificationCard.d.ts +6 -21
  408. package/dist/types/forms/serverProblemFields.d.ts +13 -0
  409. package/dist/types/forms/useValidationText.d.ts +12 -0
  410. package/dist/types/forms/validation.d.ts +117 -174
  411. package/dist/types/forms/validationMessages.d.ts +54 -6
  412. package/dist/types/forms.d.ts +1 -1
  413. package/dist/types/hookForm/FormAttachmentsField.d.ts +8 -0
  414. package/dist/types/hookForm/FormCheckboxGroupField.d.ts +8 -0
  415. package/dist/types/hookForm/FormFileField.d.ts +8 -0
  416. package/dist/types/hookForm/FormFileUploadField.d.ts +8 -0
  417. package/dist/types/hookForm/FormImageField.d.ts +8 -0
  418. package/dist/types/hookForm/FormMaskedField.d.ts +9 -0
  419. package/dist/types/hookForm/FormProblemAlert.d.ts +6 -5
  420. package/dist/types/hookForm/FormRepeatingFields.d.ts +27 -0
  421. package/dist/types/hookForm/FormTransferListField.d.ts +8 -0
  422. package/dist/types/hookForm/SubmitButton.d.ts +6 -13
  423. package/dist/types/inbox/InboxLayout.d.ts +6 -17
  424. package/dist/types/inbox/MessageList.d.ts +6 -18
  425. package/dist/types/inbox/MessageView.d.ts +6 -14
  426. package/dist/types/index.d.ts +33 -4
  427. package/dist/types/inputs/CatalogInput.d.ts +10 -21
  428. package/dist/types/inputs/CheckboxGroupInput.d.ts +28 -0
  429. package/dist/types/inputs/ColorInput.d.ts +7 -16
  430. package/dist/types/inputs/FieldFrame.d.ts +6 -10
  431. package/dist/types/inputs/MaskedInput.d.ts +38 -0
  432. package/dist/types/inputs/NumberInput.d.ts +7 -20
  433. package/dist/types/inputs/RepeatingFields.d.ts +31 -0
  434. package/dist/types/inputs/SelectInput.d.ts +10 -18
  435. package/dist/types/inputs/TextInput.d.ts +3 -0
  436. package/dist/types/inputs/TransferListInput.d.ts +30 -0
  437. package/dist/types/inputs/WizardLayout.d.ts +6 -19
  438. package/dist/types/inputs/inputMasks.d.ts +52 -0
  439. package/dist/types/inputs/selectAllState.d.ts +11 -0
  440. package/dist/types/inputs/useRowKeys.d.ts +11 -0
  441. package/dist/types/kanban/KanbanBoard.d.ts +6 -25
  442. package/dist/types/legal/CookieNotice.d.ts +20 -0
  443. package/dist/types/legal/TermsAcceptanceDialog.d.ts +20 -0
  444. package/dist/types/legal/consentStorage.d.ts +16 -0
  445. package/dist/types/legal/useCookieConsent.d.ts +13 -0
  446. package/dist/types/locales/en.d.ts +256 -0
  447. package/dist/types/locales/es.d.ts +256 -0
  448. package/dist/types/maps/MapView.d.ts +6 -17
  449. package/dist/types/mexico/CfdiSummary.d.ts +12 -0
  450. package/dist/types/mexico/EfirmaFields.d.ts +28 -0
  451. package/dist/types/mexico/certificateReader.d.ts +37 -0
  452. package/dist/types/mexico/cfdiReader.d.ts +95 -0
  453. package/dist/types/mexico/derReader.d.ts +54 -0
  454. package/dist/types/mexico/efirmaKey.d.ts +26 -0
  455. package/dist/types/mexico/mexicoIdentifiers.d.ts +68 -0
  456. package/dist/types/mexico/mexicoRules.d.ts +45 -0
  457. package/dist/types/mexico.d.ts +11 -0
  458. package/dist/types/pwa/InstallAppSetting.d.ts +6 -6
  459. package/dist/types/pwa/InstallInstructionsDialog.d.ts +6 -9
  460. package/dist/types/pwa/InstallPromptBanner.d.ts +6 -11
  461. package/dist/types/react-hook-form.d.ts +11 -1
  462. package/dist/types/rich-text.d.ts +5 -0
  463. package/dist/types/richText/FormRichTextField.d.ts +7 -0
  464. package/dist/types/richText/RichTextEditor.d.ts +27 -0
  465. package/dist/types/richText/RichTextLinkPopover.d.ts +17 -0
  466. package/dist/types/richText/RichTextToolbar.d.ts +15 -0
  467. package/dist/types/richText/RichTextView.d.ts +10 -0
  468. package/dist/types/richText/richTextContentSx.d.ts +7 -0
  469. package/dist/types/richText/richTextExtensions.d.ts +15 -0
  470. package/dist/types/richText/richTextRules.d.ts +41 -0
  471. package/dist/types/security/ActivityLog.d.ts +6 -9
  472. package/dist/types/security/RecoveryCodesDialog.d.ts +6 -11
  473. package/dist/types/security/SessionsCard.d.ts +6 -11
  474. package/dist/types/table.d.ts +3 -1
  475. package/dist/types/theme/themePieces.d.ts +55 -3
  476. package/dist/types/toolkit/ToolkitProvider.d.ts +13 -1
  477. package/dist/types/toolkit/browserNavigation.d.ts +7 -3
  478. package/dist/types/toolkit/combineTexts.d.ts +6 -0
  479. package/dist/types/toolkit/hashNavigation.d.ts +4 -2
  480. package/dist/types/toolkit/navigationPaths.d.ts +35 -0
  481. package/dist/types/toolkit/pathIndex.d.ts +27 -0
  482. package/dist/types/toolkit/toolkitSettings.d.ts +7 -4
  483. package/dist/types/ui/actions/ActionsMenu.d.ts +24 -11
  484. package/dist/types/ui/actions/CopyButton.d.ts +8 -11
  485. package/dist/types/ui/actions/DownloadMenu.d.ts +6 -29
  486. package/dist/types/ui/actions/SecretField.d.ts +6 -11
  487. package/dist/types/ui/actions/SelectionActions.d.ts +6 -13
  488. package/dist/types/ui/actions/tableRowText.d.ts +6 -0
  489. package/dist/types/ui/cards/RecordCard.d.ts +40 -0
  490. package/dist/types/ui/cards/RecordCardSkeleton.d.ts +12 -0
  491. package/dist/types/ui/countdown/Countdown.d.ts +22 -0
  492. package/dist/types/ui/countdown/countdownParts.d.ts +39 -0
  493. package/dist/types/ui/countdown/useCountdown.d.ts +14 -0
  494. package/dist/types/ui/documents/PdfViewerDialog.d.ts +14 -0
  495. package/dist/types/ui/filters/DateRangeFilter.d.ts +6 -10
  496. package/dist/types/ui/filters/FilterDrawer.d.ts +23 -0
  497. package/dist/types/ui/filters/PeriodRangeSelector.d.ts +6 -13
  498. package/dist/types/ui/filters/QuickFilters.d.ts +6 -12
  499. package/dist/types/ui/filters/filterDrawerFields.d.ts +139 -0
  500. package/dist/types/ui/help/HelpButton.d.ts +11 -0
  501. package/dist/types/ui/help/HelpCarouselDialog.d.ts +27 -0
  502. package/dist/types/ui/help/useHelpCarousel.d.ts +21 -0
  503. package/dist/types/ui/index.d.ts +10 -0
  504. package/dist/types/ui/labels/IconBadge.d.ts +34 -0
  505. package/dist/types/ui/labels/MarkedText.d.ts +10 -0
  506. package/dist/types/ui/labels/Tag.d.ts +6 -12
  507. package/dist/types/ui/labels/markedTextPieces.d.ts +22 -0
  508. package/dist/types/ui/layout/CollapsibleSection.d.ts +6 -12
  509. package/dist/types/ui/layout/ContentDialog.d.ts +6 -10
  510. package/dist/types/ui/layout/DefinitionList.d.ts +6 -9
  511. package/dist/types/ui/layout/DetailHeader.d.ts +6 -10
  512. package/dist/types/ui/layout/ErrorPage.d.ts +6 -17
  513. package/dist/types/ui/layout/FullPageLoader.d.ts +6 -6
  514. package/dist/types/ui/layout/GlassPanel.d.ts +6 -8
  515. package/dist/types/ui/layout/PageHeader.d.ts +6 -10
  516. package/dist/types/ui/layout/PageHeading.d.ts +6 -11
  517. package/dist/types/ui/layout/ProfileHeader.d.ts +6 -11
  518. package/dist/types/ui/layout/ScrollableRow.d.ts +6 -13
  519. package/dist/types/ui/layout/SectionCard.d.ts +6 -8
  520. package/dist/types/ui/metrics/BarList.d.ts +6 -12
  521. package/dist/types/ui/metrics/CalendarHeatmap.d.ts +6 -19
  522. package/dist/types/ui/metrics/ChartTooltip.d.ts +6 -6
  523. package/dist/types/ui/metrics/ColumnChart.d.ts +6 -25
  524. package/dist/types/ui/metrics/LineChart.d.ts +6 -20
  525. package/dist/types/ui/metrics/MetricCard.d.ts +6 -17
  526. package/dist/types/ui/metrics/TableToggle.d.ts +6 -6
  527. package/dist/types/ui/metrics/chartParts.d.ts +15 -30
  528. package/dist/types/ui/navigation/BackButton.d.ts +6 -9
  529. package/dist/types/ui/navigation/ColorSchemeToggle.d.ts +6 -9
  530. package/dist/types/ui/navigation/FontSizeToggle.d.ts +6 -8
  531. package/dist/types/ui/navigation/LanguageToggle.d.ts +6 -8
  532. package/dist/types/ui/navigation/PageBreadcrumbs.d.ts +6 -7
  533. package/dist/types/ui/navigation/RouteTabs.d.ts +39 -0
  534. package/dist/types/ui/navigation/routeTabMatching.d.ts +27 -0
  535. package/dist/types/ui/timeline/GroupedTimeline.d.ts +6 -23
  536. package/dist/types/upload/AttachmentsInput.d.ts +72 -0
  537. package/dist/types/upload/FileChip.d.ts +18 -0
  538. package/dist/types/upload/FileDropzone.d.ts +7 -19
  539. package/dist/types/upload/FileInput.d.ts +31 -0
  540. package/dist/types/upload/FileUploadInput.d.ts +56 -0
  541. package/dist/types/upload/ImageInput.d.ts +35 -0
  542. package/dist/types/upload/TemplateDownloadButton.d.ts +27 -0
  543. package/dist/types/upload/fileAppearance.d.ts +8 -0
  544. package/dist/types/upload/fileRules.d.ts +38 -0
  545. package/dist/types/upload/transferProgress.d.ts +18 -0
  546. package/dist/types/upload/uploadMachine.d.ts +6 -2
  547. package/dist/types/upload/uploadWithProgress.d.ts +6 -2
  548. package/dist/types/upload/useFilePicker.d.ts +39 -0
  549. package/dist/ui/actions/ActionsMenu.js +109 -17
  550. package/dist/ui/actions/ActionsMenu.js.map +1 -1
  551. package/dist/ui/actions/CopyButton.js +37 -12
  552. package/dist/ui/actions/CopyButton.js.map +1 -1
  553. package/dist/ui/actions/DownloadMenu.js +3 -2
  554. package/dist/ui/actions/DownloadMenu.js.map +1 -1
  555. package/dist/ui/actions/SecretField.js +8 -3
  556. package/dist/ui/actions/SecretField.js.map +1 -1
  557. package/dist/ui/actions/SelectionActions.js +3 -2
  558. package/dist/ui/actions/SelectionActions.js.map +1 -1
  559. package/dist/ui/actions/tableRowText.js +7 -0
  560. package/dist/ui/actions/tableRowText.js.map +1 -0
  561. package/dist/ui/cards/RecordCard.js +146 -0
  562. package/dist/ui/cards/RecordCard.js.map +1 -0
  563. package/dist/ui/cards/RecordCardSkeleton.js +38 -0
  564. package/dist/ui/cards/RecordCardSkeleton.js.map +1 -0
  565. package/dist/ui/countdown/Countdown.js +39 -0
  566. package/dist/ui/countdown/Countdown.js.map +1 -0
  567. package/dist/ui/countdown/countdownParts.js +34 -0
  568. package/dist/ui/countdown/countdownParts.js.map +1 -0
  569. package/dist/ui/countdown/useCountdown.js +35 -0
  570. package/dist/ui/countdown/useCountdown.js.map +1 -0
  571. package/dist/ui/documents/PdfViewerDialog.js +82 -0
  572. package/dist/ui/documents/PdfViewerDialog.js.map +1 -0
  573. package/dist/ui/filters/DateRangeFilter.js +3 -2
  574. package/dist/ui/filters/DateRangeFilter.js.map +1 -1
  575. package/dist/ui/filters/FilterDrawer.js +212 -0
  576. package/dist/ui/filters/FilterDrawer.js.map +1 -0
  577. package/dist/ui/filters/PeriodRangeSelector.js +3 -2
  578. package/dist/ui/filters/PeriodRangeSelector.js.map +1 -1
  579. package/dist/ui/filters/QuickFilters.js +3 -2
  580. package/dist/ui/filters/QuickFilters.js.map +1 -1
  581. package/dist/ui/filters/filterDrawerFields.js +119 -0
  582. package/dist/ui/filters/filterDrawerFields.js.map +1 -0
  583. package/dist/ui/help/HelpButton.js +22 -0
  584. package/dist/ui/help/HelpButton.js.map +1 -0
  585. package/dist/ui/help/HelpCarouselDialog.js +155 -0
  586. package/dist/ui/help/HelpCarouselDialog.js.map +1 -0
  587. package/dist/ui/help/useHelpCarousel.js +25 -0
  588. package/dist/ui/help/useHelpCarousel.js.map +1 -0
  589. package/dist/ui/labels/IconBadge.js +82 -0
  590. package/dist/ui/labels/IconBadge.js.map +1 -0
  591. package/dist/ui/labels/MarkedText.js +31 -0
  592. package/dist/ui/labels/MarkedText.js.map +1 -0
  593. package/dist/ui/labels/Tag.js +3 -2
  594. package/dist/ui/labels/Tag.js.map +1 -1
  595. package/dist/ui/labels/markedTextPieces.js +64 -0
  596. package/dist/ui/labels/markedTextPieces.js.map +1 -0
  597. package/dist/ui/layout/CollapsibleSection.js +3 -2
  598. package/dist/ui/layout/CollapsibleSection.js.map +1 -1
  599. package/dist/ui/layout/ContentDialog.js +3 -2
  600. package/dist/ui/layout/ContentDialog.js.map +1 -1
  601. package/dist/ui/layout/DefinitionList.js +3 -2
  602. package/dist/ui/layout/DefinitionList.js.map +1 -1
  603. package/dist/ui/layout/DetailHeader.js +3 -2
  604. package/dist/ui/layout/DetailHeader.js.map +1 -1
  605. package/dist/ui/layout/ErrorPage.js +3 -2
  606. package/dist/ui/layout/ErrorPage.js.map +1 -1
  607. package/dist/ui/layout/FullPageLoader.js +3 -2
  608. package/dist/ui/layout/FullPageLoader.js.map +1 -1
  609. package/dist/ui/layout/GlassPanel.js +3 -2
  610. package/dist/ui/layout/GlassPanel.js.map +1 -1
  611. package/dist/ui/layout/PageHeader.js +3 -2
  612. package/dist/ui/layout/PageHeader.js.map +1 -1
  613. package/dist/ui/layout/PageHeading.js +3 -2
  614. package/dist/ui/layout/PageHeading.js.map +1 -1
  615. package/dist/ui/layout/ProfileHeader.js +3 -2
  616. package/dist/ui/layout/ProfileHeader.js.map +1 -1
  617. package/dist/ui/layout/ScrollableRow.js +3 -2
  618. package/dist/ui/layout/ScrollableRow.js.map +1 -1
  619. package/dist/ui/layout/SectionCard.js +3 -2
  620. package/dist/ui/layout/SectionCard.js.map +1 -1
  621. package/dist/ui/metrics/BarList.js +3 -2
  622. package/dist/ui/metrics/BarList.js.map +1 -1
  623. package/dist/ui/metrics/CalendarHeatmap.js +3 -2
  624. package/dist/ui/metrics/CalendarHeatmap.js.map +1 -1
  625. package/dist/ui/metrics/ChartTooltip.js +3 -2
  626. package/dist/ui/metrics/ChartTooltip.js.map +1 -1
  627. package/dist/ui/metrics/ColumnChart.js +3 -2
  628. package/dist/ui/metrics/ColumnChart.js.map +1 -1
  629. package/dist/ui/metrics/LineChart.js +3 -2
  630. package/dist/ui/metrics/LineChart.js.map +1 -1
  631. package/dist/ui/metrics/MetricCard.js +3 -2
  632. package/dist/ui/metrics/MetricCard.js.map +1 -1
  633. package/dist/ui/metrics/TableToggle.js +3 -2
  634. package/dist/ui/metrics/TableToggle.js.map +1 -1
  635. package/dist/ui/metrics/chartParts.js +7 -4
  636. package/dist/ui/metrics/chartParts.js.map +1 -1
  637. package/dist/ui/navigation/BackButton.js +7 -2
  638. package/dist/ui/navigation/BackButton.js.map +1 -1
  639. package/dist/ui/navigation/ColorSchemeToggle.js +3 -2
  640. package/dist/ui/navigation/ColorSchemeToggle.js.map +1 -1
  641. package/dist/ui/navigation/FontSizeToggle.js +3 -2
  642. package/dist/ui/navigation/FontSizeToggle.js.map +1 -1
  643. package/dist/ui/navigation/LanguageToggle.js +3 -2
  644. package/dist/ui/navigation/LanguageToggle.js.map +1 -1
  645. package/dist/ui/navigation/PageBreadcrumbs.js +3 -2
  646. package/dist/ui/navigation/PageBreadcrumbs.js.map +1 -1
  647. package/dist/ui/navigation/RouteTabs.js +79 -0
  648. package/dist/ui/navigation/RouteTabs.js.map +1 -0
  649. package/dist/ui/navigation/routeTabMatching.js +23 -0
  650. package/dist/ui/navigation/routeTabMatching.js.map +1 -0
  651. package/dist/ui/timeline/GroupedTimeline.js +3 -2
  652. package/dist/ui/timeline/GroupedTimeline.js.map +1 -1
  653. package/dist/upload/AttachmentsInput.js +130 -0
  654. package/dist/upload/AttachmentsInput.js.map +1 -0
  655. package/dist/upload/FileChip.js +28 -0
  656. package/dist/upload/FileChip.js.map +1 -0
  657. package/dist/upload/FileDropzone.js +23 -87
  658. package/dist/upload/FileDropzone.js.map +1 -1
  659. package/dist/upload/FileInput.js +115 -0
  660. package/dist/upload/FileInput.js.map +1 -0
  661. package/dist/upload/FileUploadInput.js +288 -0
  662. package/dist/upload/FileUploadInput.js.map +1 -0
  663. package/dist/upload/ImageInput.js +128 -0
  664. package/dist/upload/ImageInput.js.map +1 -0
  665. package/dist/upload/TemplateDownloadButton.js +68 -0
  666. package/dist/upload/TemplateDownloadButton.js.map +1 -0
  667. package/dist/upload/fileAppearance.js +21 -0
  668. package/dist/upload/fileAppearance.js.map +1 -0
  669. package/dist/upload/fileRules.js +27 -1
  670. package/dist/upload/fileRules.js.map +1 -1
  671. package/dist/upload/transferProgress.js +23 -0
  672. package/dist/upload/transferProgress.js.map +1 -0
  673. package/dist/upload/uploadMachine.js +8 -8
  674. package/dist/upload/uploadMachine.js.map +1 -1
  675. package/dist/upload/uploadWithProgress.js +1 -1
  676. package/dist/upload/uploadWithProgress.js.map +1 -1
  677. package/dist/upload/useFilePicker.js +101 -0
  678. package/dist/upload/useFilePicker.js.map +1 -0
  679. package/package.json +44 -1
  680. package/cli/templates/project/src/app/combineTexts.js.tpl +0 -31
@@ -1 +1 @@
1
- {"version":3,"file":"ColumnChart.js","sources":["../../../src/ui/metrics/ColumnChart.jsx"],"sourcesContent":["// Columnas a lo largo del tiempo (p. ej. registros leídos por mes), dibujadas con Recharts: una serie (data con `value`) o\n// varias agrupadas por periodo (`series`, cada una con su llave en data: ventas y devoluciones por mes).\n//\n// Recharts y no SVG a mano: ejes, escalas, rótulos que no se encimen y el tooltip ya los resolvió la librería. Lo que se\n// decide aquí son las reglas de visualización:\n// - una serie → un color (el del tono vía currentColor) y SIN leyenda: el título ya dice qué es; varias → cada una su color\n// y leyenda abajo (chartParts.jsx, lo que comparte con LineChart);\n// - columnas de 28 px como máximo, punta redondeada, base cuadrada;\n// - rejilla horizontal de 1 px, sólida y recesiva; el texto de los ejes en tinta secundaria;\n// - tooltip por columna y VISTA DE TABLA;\n// - una línea de referencia opcional (p. ej. la meta), punteada y en tinta secundaria: se lee sin competir con las\n// columnas, y el eje crece lo necesario para que siempre se vea. Su rótulo va debajo de la gráfica y no sobre la\n// línea, donde se encimaba con la columna del último mes; así también lo lee quien ve la tabla.\n//\n// El valor se escribe con formatValue (por omisión, número con separador de miles): con él una serie puede ir en\n// porcentaje. El eje mide lo que mide su número más largo, para que «2,500,000» no salga cortado.\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaColumnChart con defaultProps y\n// styleOverrides de sus partes: chart.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useState} from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport {Bar, BarChart, CartesianGrid, ReferenceLine, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';\n\nimport {useFormatters} from '@/toolkit/useFormatters.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport ChartTooltip from '@/ui/metrics/ChartTooltip.jsx';\nimport TableToggle, {CHART_VIEW} from '@/ui/metrics/TableToggle.jsx';\nimport {\n ChartLegend, ChartTable, ReferenceCaption, highestValueOf, resolvedSeriesOf, useChartColors, valueAxisWidthOf,\n} from '@/ui/metrics/chartParts.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.CalcitaColumnChart)\nconst THEME_NAME = 'CalcitaColumnChart';\nconst ColumnChartPart = piecePart(THEME_NAME, 'Chart', Box);\n\n// la llave del valor cuando la gráfica es de una sola serie\nconst SINGLE_SERIES_KEY = 'value';\n\n/**\n * @param {object} props\n * @param {Array<Record<string, any>>} props.data un renglón por periodo: {key, label, value, tooltip?} con una serie, o\n * {key, label, [llave de cada serie]: número} con varias\n * @param {string} props.periodLabel encabezado de la primera columna de la tabla («Mes»), ya traducido\n * @param {string} [props.valueLabel] cómo se llama lo que se cuenta, ya traducido (una serie)\n * @param {Array<{key: string, label: string, tone?: 'primary'|'secondary'|'success'|'warning'|'error'|'info'}>} [props.series]\n * varias series agrupadas: la llave de cada una en data, su nombre ya traducido y su color (por omisión, en orden)\n * @param {string} props.ariaLabel\n * @param {string} props.emptyLabel\n * @param {number} [props.height]\n * @param {'primary'|'success'|'warning'|'error'|'info'} [props.tone] el color de una sola serie\n * @param {(item: any, seriesKey: string) => void} [props.onSelect] recibe el renglón de data que se picó y la serie\n * @param {(value: number) => string} [props.formatValue] cómo se escribe un valor (en el eje, en la tabla y en el\n * tooltip)\n * @param {{value: number, label: string}} [props.referenceLine] línea de referencia con su rótulo ya traducido («Meta:\n * 10 %»)\n * @param {(row: any) => import('react').ReactNode} [props.renderTooltip] lo que dice el globo de un periodo; por omisión su\n * nombre y el valor de cada serie\n * @param {'chart'|'table'} [props.defaultView] cómo se ve al abrir (CHART_VIEW); por omisión dibujada\n * @param {(view: 'chart'|'table') => void} [props.onViewChange] la persona cambió a la tabla o a la gráfica\n * @param {object} [props.texts] los textos que cambian, con la forma de `common`: {charts: {viewAsTable, viewAsChart, legend}}\n */\nexport default function ColumnChart(props) {\n // lo que el proyecto puso en su tema (components.CalcitaColumnChart.defaultProps) y encima lo que llega aquí\n const {\n data, periodLabel, valueLabel, series, ariaLabel, emptyLabel, height = 220, tone = 'primary', onSelect, formatValue: formatValueProp,\n referenceLine, renderTooltip, texts, defaultView = CHART_VIEW.chart, onViewChange,\n ...unknownProps\n} = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n const {t} = useToolkitTranslation('common', texts);\n const {formatNumber} = useFormatters();\n const formatValue = formatValueProp ?? formatNumber;\n const [asTable, setAsTable] = useState(defaultView === CHART_VIEW.table);\n const toggleView = () => {\n setAsTable(!asTable);\n onViewChange?.(asTable ? CHART_VIEW.chart : CHART_VIEW.table);\n };\n const isSingleSeries = !series?.length;\n const colors = useChartColors();\n const drawnSeries = resolvedSeriesOf(isSingleSeries ? [{key: SINGLE_SERIES_KEY, label: valueLabel, tone}] : series, colors.palette);\n\n // guard clause: sin datos se dice, no se pinta un eje vacío\n if (!data.length) {\n return <Typography variant=\"body2\" color=\"text.secondary\">{emptyLabel}</Typography>;\n }\n\n // el valor más alto que se dibuja (el de las columnas o el de la línea de referencia) decide el ancho del eje\n const highestValue = highestValueOf(data, drawnSeries, referenceLine);\n const tooltipOf = renderTooltip ?? ((row) => (isSingleSeries\n ? row.tooltip ?? `${row.label}: ${formatValue(row.value)}`\n : (\n <>\n <strong>{row.label}</strong>\n {drawnSeries.map((item) => <Box key={item.key}>{item.label}: {formatValue(row[item.key])}</Box>)}\n </>\n )));\n\n return (\n <Box>\n <TableToggle asTable={asTable} onToggle={toggleView} texts={texts} />\n {asTable ? (\n <ChartTable data={data} series={drawnSeries} periodLabel={periodLabel} formatValue={formatValue} height={height} />\n ) : (\n <ColumnChartPart role=\"img\" aria-label={ariaLabel} ownSx={{height, color: `${tone}.main`}}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart data={data} margin={{top: 8, right: 8, bottom: 0, left: -8}} barCategoryGap={4}>\n <CartesianGrid vertical={false} stroke={colors.grid} />\n <XAxis dataKey=\"label\" tick={colors.axisText} tickLine={false} axisLine={{stroke: colors.grid}}\n interval=\"preserveStartEnd\" minTickGap={12} />\n <YAxis allowDecimals={false} tick={colors.axisText} tickLine={false} axisLine={false}\n width={valueAxisWidthOf(highestValue, formatValue)} tickFormatter={(value) => formatValue(value)} />\n <Tooltip cursor={{fill: colors.hover}} content={<ChartTooltip render={tooltipOf} />} />\n {referenceLine && (\n // extendDomain: si la referencia queda arriba de todas las columnas, el eje crece hasta ella\n <ReferenceLine y={referenceLine.value} ifOverflow=\"extendDomain\" stroke={colors.axis} strokeDasharray=\"4 4\" />\n )}\n {drawnSeries.map((item) => (\n // una serie: currentColor (el tono de la caja); varias: el color de cada una\n <Bar key={item.key} dataKey={item.key} fill={isSingleSeries ? 'currentColor' : item.color} maxBarSize={28}\n radius={[4, 4, 0, 0]} isAnimationActive={false} cursor={onSelect ? 'pointer' : 'default'}\n onClick={onSelect ? (entry) => onSelect(entry.payload, item.key) : undefined} />\n ))}\n </BarChart>\n </ResponsiveContainer>\n </ColumnChartPart>\n )}\n <ChartLegend series={drawnSeries} ariaLabel={t('charts.legend')} />\n <ReferenceCaption referenceLine={referenceLine} />\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AAqCA,MAAM,aAAa;AACnB,MAAM,kBAAkB,UAAU,YAAY,SAAS,GAAG;AAG1D,MAAM,oBAAoB;AAyB1B,SAAwB,YAAY,OAAO;AAEvC,QAAM;AAAA,IACN;AAAA,IAAM;AAAA,IAAa;AAAA,IAAY;AAAA,IAAQ;AAAA,IAAW;AAAA,IAAY,SAAS;AAAA,IAAK,OAAO;AAAA,IAAW;AAAA,IAAU,aAAa;AAAA,IACrH;AAAA,IAAe;AAAA,IAAe;AAAA,IAAO,cAAc,WAAW;AAAA,IAAO;AAAA,IACrE,GAAG;AAAA,EAAA,IACH,cAAc,OAAO,UAAU;AAC/B,mBAAiB,YAAY,YAAY;AACzC,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AACjD,QAAM,EAAC,aAAA,IAAgB,cAAA;AACvB,QAAM,cAAc,mBAAmB;AACvC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,gBAAgB,WAAW,KAAK;AACvE,QAAM,aAAa,MAAM;AACrB,eAAW,CAAC,OAAO;AACnB,mBAAe,UAAU,WAAW,QAAQ,WAAW,KAAK;AAAA,EAChE;AACA,QAAM,iBAAiB,CAAC,QAAQ;AAChC,QAAM,SAAS,eAAA;AACf,QAAM,cAAc,iBAAiB,iBAAiB,CAAC,EAAC,KAAK,mBAAmB,OAAO,YAAY,KAAA,CAAK,IAAI,QAAQ,OAAO,OAAO;AAGlI,MAAI,CAAC,KAAK,QAAQ;AACd,+BAAQ,YAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAkB,UAAA,YAAW;AAAA,EAC1E;AAGA,QAAM,eAAe,eAAe,MAAM,aAAa,aAAa;AACpE,QAAM,YAAY,kBAAkB,CAAC,QAAS,iBACxC,IAAI,WAAW,GAAG,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,CAAC,KAEpD,qBAAA,UAAA,EACI,UAAA;AAAA,IAAA,oBAAC,UAAA,EAAQ,cAAI,MAAA,CAAM;AAAA,IAClB,YAAY,IAAI,CAAC,8BAAU,KAAA,EAAoB,UAAA;AAAA,MAAA,KAAK;AAAA,MAAM;AAAA,MAAG,YAAY,IAAI,KAAK,GAAG,CAAC;AAAA,IAAA,EAAA,GAAlD,KAAK,GAA+C,CAAM;AAAA,EAAA,EAAA,CACnG;AAGR,8BACK,KAAA,EACG,UAAA;AAAA,IAAA,oBAAC,aAAA,EAAY,SAAkB,UAAU,YAAY,OAAc;AAAA,IAClE,8BACI,YAAA,EAAW,MAAY,QAAQ,aAAa,aAA0B,aAA0B,OAAA,CAAgB,wBAEhH,iBAAA,EAAgB,MAAK,OAAM,cAAY,WAAW,OAAO,EAAC,QAAQ,OAAO,GAAG,IAAI,WAC7E,UAAA,oBAAC,uBAAoB,OAAM,QAAO,QAAO,QACrC,UAAA,qBAAC,YAAS,MAAY,QAAQ,EAAC,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAA,GAAK,gBAAgB,GACnF,UAAA;AAAA,MAAA,oBAAC,eAAA,EAAc,UAAU,OAAO,QAAQ,OAAO,MAAM;AAAA,MACrD;AAAA,QAAC;AAAA,QAAA;AAAA,UAAM,SAAQ;AAAA,UAAQ,MAAM,OAAO;AAAA,UAAU,UAAU;AAAA,UAAO,UAAU,EAAC,QAAQ,OAAO,KAAA;AAAA,UAClF,UAAS;AAAA,UAAmB,YAAY;AAAA,QAAA;AAAA,MAAA;AAAA,MAC/C;AAAA,QAAC;AAAA,QAAA;AAAA,UAAM,eAAe;AAAA,UAAO,MAAM,OAAO;AAAA,UAAU,UAAU;AAAA,UAAO,UAAU;AAAA,UACxE,OAAO,iBAAiB,cAAc,WAAW;AAAA,UAAG,eAAe,CAAC,UAAU,YAAY,KAAK;AAAA,QAAA;AAAA,MAAA;AAAA,MACtG,oBAAC,SAAA,EAAQ,QAAQ,EAAC,MAAM,OAAO,MAAA,GAAQ,SAAS,oBAAC,cAAA,EAAa,QAAQ,WAAW,EAAA,CAAI;AAAA,MACpF;AAAA,MAEG,oBAAC,eAAA,EAAc,GAAG,cAAc,OAAO,YAAW,gBAAe,QAAQ,OAAO,MAAM,iBAAgB,MAAA,CAAM;AAAA,MAE/G,YAAY,IAAI,CAAC;AAAA;AAAA,QAEd;AAAA,UAAC;AAAA,UAAA;AAAA,YAAmB,SAAS,KAAK;AAAA,YAAK,MAAM,iBAAiB,iBAAiB,KAAK;AAAA,YAAO,YAAY;AAAA,YAClG,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,YAAG,mBAAmB;AAAA,YAAO,QAAQ,WAAW,YAAY;AAAA,YAC/E,SAAS,WAAW,CAAC,UAAU,SAAS,MAAM,SAAS,KAAK,GAAG,IAAI;AAAA,UAAA;AAAA,UAF9D,KAAK;AAAA,QAAA;AAAA,OAGlB;AAAA,IAAA,EAAA,CACL,GACJ,GACJ;AAAA,wBAEH,aAAA,EAAY,QAAQ,aAAa,WAAW,EAAE,eAAe,GAAG;AAAA,IACjE,oBAAC,oBAAiB,cAAA,CAA8B;AAAA,EAAA,GACpD;AAER;"}
1
+ {"version":3,"file":"ColumnChart.js","sources":["../../../src/ui/metrics/ColumnChart.jsx"],"sourcesContent":["// Columnas a lo largo del tiempo (p. ej. registros leídos por mes), dibujadas con Recharts: una serie (data con `value`) o\n// varias agrupadas por periodo (`series`, cada una con su llave en data: ventas y devoluciones por mes).\n//\n// Recharts y no SVG a mano: ejes, escalas, rótulos que no se encimen y el tooltip ya los resolvió la librería. Lo que se\n// decide aquí son las reglas de visualización:\n// - una serie → un color (el del tono vía currentColor) y SIN leyenda: el título ya dice qué es; varias → cada una su color\n// y leyenda abajo (chartParts.jsx, lo que comparte con LineChart);\n// - columnas de 28 px como máximo, punta redondeada, base cuadrada;\n// - rejilla horizontal de 1 px, sólida y recesiva; el texto de los ejes en tinta secundaria;\n// - tooltip por columna y VISTA DE TABLA;\n// - una línea de referencia opcional (p. ej. la meta), punteada y en tinta secundaria: se lee sin competir con las\n// columnas, y el eje crece lo necesario para que siempre se vea. Su rótulo va debajo de la gráfica y no sobre la\n// línea, donde se encimaba con la columna del último mes; así también lo lee quien ve la tabla.\n//\n// El valor se escribe con formatValue (por omisión, número con separador de miles): con él una serie puede ir en\n// porcentaje. El eje mide lo que mide su número más largo, para que «2,500,000» no salga cortado.\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaColumnChart con defaultProps y\n// styleOverrides de sus partes: chart.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useState} from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport {Bar, BarChart, CartesianGrid, ReferenceLine, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';\n\nimport {useFormatters} from '@/toolkit/useFormatters.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport ChartTooltip from '@/ui/metrics/ChartTooltip.jsx';\nimport TableToggle, {CHART_VIEW} from '@/ui/metrics/TableToggle.jsx';\nimport {\n ChartLegend, ChartTable, ReferenceCaption, highestValueOf, resolvedSeriesOf, useChartColors, valueAxisWidthOf,\n} from '@/ui/metrics/chartParts.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.CalcitaColumnChart)\nconst THEME_NAME = 'CalcitaColumnChart';\nconst ColumnChartPart = piecePart(THEME_NAME, 'Chart', Box);\n\n// la llave del valor cuando la gráfica es de una sola serie\nconst SINGLE_SERIES_KEY = 'value';\n\n/**\n * @param {object} props\n * @param {Array<Record<string, any>>} props.data un renglón por periodo: {key, label, value, tooltip?} con una serie, o\n * {key, label, [llave de cada serie]: número} con varias\n * @param {string} props.periodLabel encabezado de la primera columna de la tabla («Mes»), ya traducido\n * @param {string} [props.valueLabel] cómo se llama lo que se cuenta, ya traducido (una serie)\n * @param {Array<{key: string, label: string, tone?: 'primary'|'secondary'|'success'|'warning'|'error'|'info'}>} [props.series]\n * varias series agrupadas: la llave de cada una en data, su nombre ya traducido y su color (por omisión, en orden)\n * @param {string} props.ariaLabel\n * @param {string} props.emptyLabel\n * @param {number} [props.height]\n * @param {'primary'|'success'|'warning'|'error'|'info'} [props.tone] el color de una sola serie\n * @param {(item: any, seriesKey: string) => void} [props.onSelect] recibe el renglón de data que se picó y la serie\n * @param {(value: number) => string} [props.formatValue] cómo se escribe un valor (en el eje, en la tabla y en el\n * tooltip)\n * @param {{value: number, label: string}} [props.referenceLine] línea de referencia con su rótulo ya traducido («Meta:\n * 10 %»)\n * @param {(row: any) => import('react').ReactNode} [props.renderTooltip] lo que dice el globo de un periodo; por omisión su\n * nombre y el valor de cada serie\n * @param {'chart'|'table'} [props.defaultView] cómo se ve al abrir (CHART_VIEW); por omisión dibujada\n * @param {(view: 'chart'|'table') => void} [props.onViewChange] la persona cambió a la tabla o a la gráfica\n * @param {object} [props.texts] los textos que cambian, con la forma de `common`: {charts: {viewAsTable, viewAsChart, legend}}\n */\nfunction ColumnChartContent(props) {\n // lo que el proyecto puso en su tema (components.CalcitaColumnChart.defaultProps) y encima lo que llega aquí\n const {\n data, periodLabel, valueLabel, series, ariaLabel, emptyLabel, height = 220, tone = 'primary', onSelect, formatValue: formatValueProp,\n referenceLine, renderTooltip, texts, defaultView = CHART_VIEW.chart, onViewChange,\n ...unknownProps\n} = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n const {t} = useToolkitTranslation('common', texts);\n const {formatNumber} = useFormatters();\n const formatValue = formatValueProp ?? formatNumber;\n const [asTable, setAsTable] = useState(defaultView === CHART_VIEW.table);\n const toggleView = () => {\n setAsTable(!asTable);\n onViewChange?.(asTable ? CHART_VIEW.chart : CHART_VIEW.table);\n };\n const isSingleSeries = !series?.length;\n const colors = useChartColors();\n const drawnSeries = resolvedSeriesOf(isSingleSeries ? [{key: SINGLE_SERIES_KEY, label: valueLabel, tone}] : series, colors.palette);\n\n // guard clause: sin datos se dice, no se pinta un eje vacío\n if (!data.length) {\n return <Typography variant=\"body2\" color=\"text.secondary\">{emptyLabel}</Typography>;\n }\n\n // el valor más alto que se dibuja (el de las columnas o el de la línea de referencia) decide el ancho del eje\n const highestValue = highestValueOf(data, drawnSeries, referenceLine);\n const tooltipOf = renderTooltip ?? ((row) => (isSingleSeries\n ? row.tooltip ?? `${row.label}: ${formatValue(row.value)}`\n : (\n <>\n <strong>{row.label}</strong>\n {drawnSeries.map((item) => <Box key={item.key}>{item.label}: {formatValue(row[item.key])}</Box>)}\n </>\n )));\n\n return (\n <Box>\n <TableToggle asTable={asTable} onToggle={toggleView} texts={texts} />\n {asTable ? (\n <ChartTable data={data} series={drawnSeries} periodLabel={periodLabel} formatValue={formatValue} height={height} />\n ) : (\n <ColumnChartPart role=\"img\" aria-label={ariaLabel} ownSx={{height, color: `${tone}.main`}}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart data={data} margin={{top: 8, right: 8, bottom: 0, left: -8}} barCategoryGap={4}>\n <CartesianGrid vertical={false} stroke={colors.grid} />\n <XAxis dataKey=\"label\" tick={colors.axisText} tickLine={false} axisLine={{stroke: colors.grid}}\n interval=\"preserveStartEnd\" minTickGap={12} />\n <YAxis allowDecimals={false} tick={colors.axisText} tickLine={false} axisLine={false}\n width={valueAxisWidthOf(highestValue, formatValue)} tickFormatter={(value) => formatValue(value)} />\n <Tooltip cursor={{fill: colors.hover}} content={<ChartTooltip render={tooltipOf} />} />\n {referenceLine && (\n // extendDomain: si la referencia queda arriba de todas las columnas, el eje crece hasta ella\n <ReferenceLine y={referenceLine.value} ifOverflow=\"extendDomain\" stroke={colors.axis} strokeDasharray=\"4 4\" />\n )}\n {drawnSeries.map((item) => (\n // una serie: currentColor (el tono de la caja); varias: el color de cada una\n <Bar key={item.key} dataKey={item.key} fill={isSingleSeries ? 'currentColor' : item.color} maxBarSize={28}\n radius={[4, 4, 0, 0]} isAnimationActive={false} cursor={onSelect ? 'pointer' : 'default'}\n onClick={onSelect ? (entry) => onSelect(entry.payload, item.key) : undefined} />\n ))}\n </BarChart>\n </ResponsiveContainer>\n </ColumnChartPart>\n )}\n <ChartLegend series={drawnSeries} ariaLabel={t('charts.legend')} />\n <ReferenceCaption referenceLine={referenceLine} />\n </Box>\n );\n}\n\n// lo que se exporta: la pieza con slots y slotProps para cambiar sus partes (themePieces.js)\nconst ColumnChart = withPieceSlots(ColumnChartContent, THEME_NAME);\nexport default ColumnChart;\n"],"names":[],"mappings":"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"}
@@ -9,14 +9,14 @@ import { useToolkitTranslation } from "../../toolkit/useToolkitTranslation.js";
9
9
  import ChartTooltip from "./ChartTooltip.js";
10
10
  import TableToggle, { CHART_VIEW } from "./TableToggle.js";
11
11
  import { useChartColors, resolvedSeriesOf, highestValueOf, ChartTable, valueAxisWidthOf, ChartLegend, ReferenceCaption } from "./chartParts.js";
12
- import { piecePart, usePieceProps } from "../../theme/themePieces.js";
12
+ import { piecePart, withPieceSlots, usePieceProps } from "../../theme/themePieces.js";
13
13
  import { warnUnknownProps } from "../../toolkit/unknownProps.js";
14
14
  const THEME_NAME = "CalcitaLineChart";
15
15
  const LineChartPart = piecePart(THEME_NAME, "Chart", Box);
16
16
  const LINE_WIDTH_PIXELS = 2;
17
17
  const DOT_RADIUS_PIXELS = 3;
18
18
  const ACTIVE_DOT_RADIUS_PIXELS = 5;
19
- function LineChart(props) {
19
+ function LineChartContent(props) {
20
20
  const {
21
21
  data,
22
22
  series,
@@ -118,6 +118,7 @@ function LineChart(props) {
118
118
  /* @__PURE__ */ jsx(ReferenceCaption, { referenceLine })
119
119
  ] });
120
120
  }
121
+ const LineChart = withPieceSlots(LineChartContent, THEME_NAME);
121
122
  export {
122
123
  LineChart as default
123
124
  };
@@ -1 +1 @@
1
- {"version":3,"file":"LineChart.js","sources":["../../../src/ui/metrics/LineChart.jsx"],"sourcesContent":["// Líneas a lo largo del tiempo, de una serie o de varias que se comparan (ventas contra devoluciones, este año contra el\n// pasado), dibujadas con Recharts. Lo que comparte con ColumnChart (ejes, tabla, leyenda, línea de referencia) vive en\n// chartParts.jsx.\n//\n// Las reglas de la guía de Apple (HIG «Charts» y «Charting data»):\n// - líneas para ver la tendencia; columnas (ColumnChart) para comparar periodos sueltos;\n// - cada serie con su color Y su trazo (continuo, rayado, punteado), con su punto en cada periodo: el color no va solo;\n// - una serie sin leyenda (el título ya dice qué es); varias, con leyenda abajo; toda gráfica con su vista de tabla;\n// - el globo de un periodo dice el valor de cada serie.\n//\n// <LineChart data={[{key: '2026-4', label: 'abr', sales: 120, returns: 8}, …]} periodLabel=\"Mes\"\n// series={[{key: 'sales', label: 'Ventas'}, {key: 'returns', label: 'Devoluciones', tone: 'error'}]}\n// ariaLabel=\"Ventas y devoluciones por mes\" emptyLabel=\"Sin datos\" />\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaLineChart con defaultProps y\n// styleOverrides de sus partes: chart.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useState} from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport {CartesianGrid, Line, LineChart as RechartsLineChart, ReferenceLine, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';\n\nimport {useFormatters} from '@/toolkit/useFormatters.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport ChartTooltip from '@/ui/metrics/ChartTooltip.jsx';\nimport TableToggle, {CHART_VIEW} from '@/ui/metrics/TableToggle.jsx';\nimport {\n ChartLegend, ChartTable, ReferenceCaption, highestValueOf, resolvedSeriesOf, useChartColors, valueAxisWidthOf,\n} from '@/ui/metrics/chartParts.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.CalcitaLineChart)\nconst THEME_NAME = 'CalcitaLineChart';\nconst LineChartPart = piecePart(THEME_NAME, 'Chart', Box);\n\n// el grueso de la línea y el tamaño de su punto (px): se ven en el teléfono sin tapar a la vecina\nconst LINE_WIDTH_PIXELS = 2;\nconst DOT_RADIUS_PIXELS = 3;\nconst ACTIVE_DOT_RADIUS_PIXELS = 5;\n\n/**\n * @param {object} props\n * @param {Array<Record<string, any>>} props.data un renglón por periodo: {key, label, [llave de cada serie]: número}\n * @param {Array<{key: string, label: string, tone?: 'primary'|'secondary'|'success'|'warning'|'error'|'info', dash?: string}>} props.series\n * la llave de cada serie en data, su nombre ya traducido, su color y su trazo (por omisión, en orden)\n * @param {string} props.periodLabel encabezado de la primera columna de la tabla («Mes»), ya traducido\n * @param {string} props.ariaLabel\n * @param {string} props.emptyLabel\n * @param {number} [props.height]\n * @param {(value: number) => string} [props.formatValue] cómo se escribe un valor (en el eje, en la tabla y en el globo)\n * @param {{value: number, label: string}} [props.referenceLine] línea de referencia (la meta) con su rótulo ya traducido\n * @param {(row: any) => void} [props.onSelect] recibe el renglón de data del periodo que se picó\n * @param {(row: any) => import('react').ReactNode} [props.renderTooltip] lo que dice el globo de un periodo; por omisión su\n * nombre y el valor de cada serie\n * @param {'chart'|'table'} [props.defaultView] cómo se ve al abrir (CHART_VIEW); por omisión dibujada\n * @param {(view: 'chart'|'table') => void} [props.onViewChange] la persona cambió a la tabla o a la gráfica\n * @param {object} [props.texts] los textos que cambian, con la forma de `common`: {charts: {viewAsTable, viewAsChart, legend}}\n */\nexport default function LineChart(props) {\n // lo que el proyecto puso en su tema (components.CalcitaLineChart.defaultProps) y encima lo que llega aquí\n const {\n data, series, periodLabel, ariaLabel, emptyLabel, height = 220, formatValue: formatValueProp, referenceLine, onSelect, renderTooltip, texts, defaultView = CHART_VIEW.chart, onViewChange,\n ...unknownProps\n} = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n const {t} = useToolkitTranslation('common', texts);\n const {formatNumber} = useFormatters();\n const formatValue = formatValueProp ?? formatNumber;\n const [asTable, setAsTable] = useState(defaultView === CHART_VIEW.table);\n const toggleView = () => {\n setAsTable(!asTable);\n onViewChange?.(asTable ? CHART_VIEW.chart : CHART_VIEW.table);\n };\n const colors = useChartColors();\n const drawnSeries = resolvedSeriesOf(series, colors.palette);\n\n // guard clause: sin datos se dice, no se pinta un eje vacío\n if (!data.length) {\n return <Typography variant=\"body2\" color=\"text.secondary\">{emptyLabel}</Typography>;\n }\n\n const highestValue = highestValueOf(data, drawnSeries, referenceLine);\n // el periodo que se picó: recharts da su posición en data (a veces como texto)\n const selectPeriodAt = (activeIndex) => {\n const row = data[Number(activeIndex)];\n if (row) {\n onSelect(row);\n }\n };\n const tooltipOf = renderTooltip ?? ((row) => (\n <>\n <strong>{row.label}</strong>\n {drawnSeries.map((item) => <Box key={item.key}>{item.label}: {formatValue(row[item.key])}</Box>)}\n </>\n ));\n\n return (\n <Box>\n <TableToggle asTable={asTable} onToggle={toggleView} texts={texts} />\n {asTable ? (\n <ChartTable data={data} series={drawnSeries} periodLabel={periodLabel} formatValue={formatValue} height={height} />\n ) : (\n <LineChartPart role=\"img\" aria-label={ariaLabel} ownSx={{height}}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n {/* OJO: recharts 3 avisa el clic con el índice del periodo (activeIndex), ya no con activePayload (el de\n la versión 2) */}\n <RechartsLineChart data={data} margin={{top: 8, right: 12, bottom: 0, left: -8}}\n onClick={onSelect ? (state) => selectPeriodAt(state?.activeIndex) : undefined}>\n <CartesianGrid vertical={false} stroke={colors.grid} />\n <XAxis dataKey=\"label\" tick={colors.axisText} tickLine={false} axisLine={{stroke: colors.grid}}\n interval=\"preserveStartEnd\" minTickGap={12} />\n <YAxis allowDecimals={false} tick={colors.axisText} tickLine={false} axisLine={false}\n width={valueAxisWidthOf(highestValue, formatValue)} tickFormatter={(value) => formatValue(value)} />\n <Tooltip cursor={{stroke: colors.grid}} content={<ChartTooltip render={tooltipOf} />} />\n {referenceLine && (\n <ReferenceLine y={referenceLine.value} ifOverflow=\"extendDomain\" stroke={colors.axis} strokeDasharray=\"4 4\" />\n )}\n {drawnSeries.map((item) => (\n <Line key={item.key} type=\"monotone\" dataKey={item.key} name={item.label} stroke={item.color}\n strokeWidth={LINE_WIDTH_PIXELS} strokeDasharray={item.dash} isAnimationActive={false}\n dot={{r: DOT_RADIUS_PIXELS, fill: item.color, strokeWidth: 0}}\n activeDot={{r: ACTIVE_DOT_RADIUS_PIXELS, cursor: onSelect ? 'pointer' : 'default'}} />\n ))}\n </RechartsLineChart>\n </ResponsiveContainer>\n </LineChartPart>\n )}\n <ChartLegend series={drawnSeries} showsDash ariaLabel={t('charts.legend')} />\n <ReferenceCaption referenceLine={referenceLine} />\n </Box>\n );\n}\n"],"names":["RechartsLineChart"],"mappings":"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"}
1
+ {"version":3,"file":"LineChart.js","sources":["../../../src/ui/metrics/LineChart.jsx"],"sourcesContent":["// Líneas a lo largo del tiempo, de una serie o de varias que se comparan (ventas contra devoluciones, este año contra el\n// pasado), dibujadas con Recharts. Lo que comparte con ColumnChart (ejes, tabla, leyenda, línea de referencia) vive en\n// chartParts.jsx.\n//\n// Las reglas de la guía de Apple (HIG «Charts» y «Charting data»):\n// - líneas para ver la tendencia; columnas (ColumnChart) para comparar periodos sueltos;\n// - cada serie con su color Y su trazo (continuo, rayado, punteado), con su punto en cada periodo: el color no va solo;\n// - una serie sin leyenda (el título ya dice qué es); varias, con leyenda abajo; toda gráfica con su vista de tabla;\n// - el globo de un periodo dice el valor de cada serie.\n//\n// <LineChart data={[{key: '2026-4', label: 'abr', sales: 120, returns: 8}, …]} periodLabel=\"Mes\"\n// series={[{key: 'sales', label: 'Ventas'}, {key: 'returns', label: 'Devoluciones', tone: 'error'}]}\n// ariaLabel=\"Ventas y devoluciones por mes\" emptyLabel=\"Sin datos\" />\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaLineChart con defaultProps y\n// styleOverrides de sus partes: chart.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useState} from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport {CartesianGrid, Line, LineChart as RechartsLineChart, ReferenceLine, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';\n\nimport {useFormatters} from '@/toolkit/useFormatters.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport ChartTooltip from '@/ui/metrics/ChartTooltip.jsx';\nimport TableToggle, {CHART_VIEW} from '@/ui/metrics/TableToggle.jsx';\nimport {\n ChartLegend, ChartTable, ReferenceCaption, highestValueOf, resolvedSeriesOf, useChartColors, valueAxisWidthOf,\n} from '@/ui/metrics/chartParts.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.CalcitaLineChart)\nconst THEME_NAME = 'CalcitaLineChart';\nconst LineChartPart = piecePart(THEME_NAME, 'Chart', Box);\n\n// el grueso de la línea y el tamaño de su punto (px): se ven en el teléfono sin tapar a la vecina\nconst LINE_WIDTH_PIXELS = 2;\nconst DOT_RADIUS_PIXELS = 3;\nconst ACTIVE_DOT_RADIUS_PIXELS = 5;\n\n/**\n * @param {object} props\n * @param {Array<Record<string, any>>} props.data un renglón por periodo: {key, label, [llave de cada serie]: número}\n * @param {Array<{key: string, label: string, tone?: 'primary'|'secondary'|'success'|'warning'|'error'|'info', dash?: string}>} props.series\n * la llave de cada serie en data, su nombre ya traducido, su color y su trazo (por omisión, en orden)\n * @param {string} props.periodLabel encabezado de la primera columna de la tabla («Mes»), ya traducido\n * @param {string} props.ariaLabel\n * @param {string} props.emptyLabel\n * @param {number} [props.height]\n * @param {(value: number) => string} [props.formatValue] cómo se escribe un valor (en el eje, en la tabla y en el globo)\n * @param {{value: number, label: string}} [props.referenceLine] línea de referencia (la meta) con su rótulo ya traducido\n * @param {(row: any) => void} [props.onSelect] recibe el renglón de data del periodo que se picó\n * @param {(row: any) => import('react').ReactNode} [props.renderTooltip] lo que dice el globo de un periodo; por omisión su\n * nombre y el valor de cada serie\n * @param {'chart'|'table'} [props.defaultView] cómo se ve al abrir (CHART_VIEW); por omisión dibujada\n * @param {(view: 'chart'|'table') => void} [props.onViewChange] la persona cambió a la tabla o a la gráfica\n * @param {object} [props.texts] los textos que cambian, con la forma de `common`: {charts: {viewAsTable, viewAsChart, legend}}\n */\nfunction LineChartContent(props) {\n // lo que el proyecto puso en su tema (components.CalcitaLineChart.defaultProps) y encima lo que llega aquí\n const {\n data, series, periodLabel, ariaLabel, emptyLabel, height = 220, formatValue: formatValueProp, referenceLine, onSelect, renderTooltip, texts, defaultView = CHART_VIEW.chart, onViewChange,\n ...unknownProps\n} = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n const {t} = useToolkitTranslation('common', texts);\n const {formatNumber} = useFormatters();\n const formatValue = formatValueProp ?? formatNumber;\n const [asTable, setAsTable] = useState(defaultView === CHART_VIEW.table);\n const toggleView = () => {\n setAsTable(!asTable);\n onViewChange?.(asTable ? CHART_VIEW.chart : CHART_VIEW.table);\n };\n const colors = useChartColors();\n const drawnSeries = resolvedSeriesOf(series, colors.palette);\n\n // guard clause: sin datos se dice, no se pinta un eje vacío\n if (!data.length) {\n return <Typography variant=\"body2\" color=\"text.secondary\">{emptyLabel}</Typography>;\n }\n\n const highestValue = highestValueOf(data, drawnSeries, referenceLine);\n // el periodo que se picó: recharts da su posición en data (a veces como texto)\n const selectPeriodAt = (activeIndex) => {\n const row = data[Number(activeIndex)];\n if (row) {\n onSelect(row);\n }\n };\n const tooltipOf = renderTooltip ?? ((row) => (\n <>\n <strong>{row.label}</strong>\n {drawnSeries.map((item) => <Box key={item.key}>{item.label}: {formatValue(row[item.key])}</Box>)}\n </>\n ));\n\n return (\n <Box>\n <TableToggle asTable={asTable} onToggle={toggleView} texts={texts} />\n {asTable ? (\n <ChartTable data={data} series={drawnSeries} periodLabel={periodLabel} formatValue={formatValue} height={height} />\n ) : (\n <LineChartPart role=\"img\" aria-label={ariaLabel} ownSx={{height}}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n {/* OJO: recharts 3 avisa el clic con el índice del periodo (activeIndex), ya no con activePayload (el de\n la versión 2) */}\n <RechartsLineChart data={data} margin={{top: 8, right: 12, bottom: 0, left: -8}}\n onClick={onSelect ? (state) => selectPeriodAt(state?.activeIndex) : undefined}>\n <CartesianGrid vertical={false} stroke={colors.grid} />\n <XAxis dataKey=\"label\" tick={colors.axisText} tickLine={false} axisLine={{stroke: colors.grid}}\n interval=\"preserveStartEnd\" minTickGap={12} />\n <YAxis allowDecimals={false} tick={colors.axisText} tickLine={false} axisLine={false}\n width={valueAxisWidthOf(highestValue, formatValue)} tickFormatter={(value) => formatValue(value)} />\n <Tooltip cursor={{stroke: colors.grid}} content={<ChartTooltip render={tooltipOf} />} />\n {referenceLine && (\n <ReferenceLine y={referenceLine.value} ifOverflow=\"extendDomain\" stroke={colors.axis} strokeDasharray=\"4 4\" />\n )}\n {drawnSeries.map((item) => (\n <Line key={item.key} type=\"monotone\" dataKey={item.key} name={item.label} stroke={item.color}\n strokeWidth={LINE_WIDTH_PIXELS} strokeDasharray={item.dash} isAnimationActive={false}\n dot={{r: DOT_RADIUS_PIXELS, fill: item.color, strokeWidth: 0}}\n activeDot={{r: ACTIVE_DOT_RADIUS_PIXELS, cursor: onSelect ? 'pointer' : 'default'}} />\n ))}\n </RechartsLineChart>\n </ResponsiveContainer>\n </LineChartPart>\n )}\n <ChartLegend series={drawnSeries} showsDash ariaLabel={t('charts.legend')} />\n <ReferenceCaption referenceLine={referenceLine} />\n </Box>\n );\n}\n\n// lo que se exporta: la pieza con slots y slotProps para cambiar sus partes (themePieces.js)\nconst LineChart = withPieceSlots(LineChartContent, THEME_NAME);\nexport default LineChart;\n"],"names":["RechartsLineChart"],"mappings":"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"}
@@ -11,7 +11,7 @@ import Stack from "@mui/material/Stack";
11
11
  import Typography from "@mui/material/Typography";
12
12
  import { alpha } from "@mui/material/styles";
13
13
  import ArrowDownwardIcon from "@mui/icons-material/ArrowDownward";
14
- import { piecePart, usePieceProps } from "../../theme/themePieces.js";
14
+ import { piecePart, withPieceSlots, usePieceProps } from "../../theme/themePieces.js";
15
15
  import { lightDarkStylesOf } from "../../theme/lightDarkStyles.js";
16
16
  import ArrowUpwardIcon from "@mui/icons-material/ArrowUpward";
17
17
  import RemoveIcon from "@mui/icons-material/Remove";
@@ -55,7 +55,7 @@ function TrendChip({ trend, texts }) {
55
55
  }
56
56
  );
57
57
  }
58
- function MetricCard(props) {
58
+ function MetricCardContent(props) {
59
59
  const {
60
60
  label,
61
61
  value,
@@ -111,6 +111,7 @@ function MetricCard(props) {
111
111
  ...isClickable ? {} : { p: 2.5 }
112
112
  }, children: isClickable ? /* @__PURE__ */ jsx(CardAction, { ...to ? { component: Link, to } : { onClick }, ownSx: { p: 2.5, height: "100%", alignItems: "flex-start", display: "block" }, children: content }) : content });
113
113
  }
114
+ const MetricCard = withPieceSlots(MetricCardContent, THEME_NAME);
114
115
  export {
115
116
  TREND_DIRECTION,
116
117
  MetricCard as default
@@ -1 +1 @@
1
- {"version":3,"file":"MetricCard.js","sources":["../../../src/ui/metrics/MetricCard.jsx"],"sourcesContent":["// Tarjeta de métrica: etiqueta en versalitas, número grande (h5 en seminegritas, con cifras del mismo ancho) y una nota abajo, con un borde superior de\n// color según el tono (p. ej. REGISTROS LEÍDOS / ÍNTEGROS / DESCARTADOS).\n//\n// Con `to` la tarjeta entera es una liga a la pantalla que explica el número, ya filtrada: un KPI que no lleva a\n// ningún lado obliga a buscar a mano de dónde salió.\n//\n// Con `trend` lleva junto al número cuánto cambió contra el periodo anterior («▲ 12 %», como los tableros de MUI). El\n// color dice si es bueno o malo, no si subió: más cancelaciones es subir y es malo (isGood: false). La flecha y el texto\n// oculto dicen la dirección, para quien no distingue el color.\n//\n// Se extiende sin tocar el framework: un ícono junto al título (icon, del color del tono en un cuadro suave, como los\n// resúmenes de Salud de Apple), contenido propio debajo de la nota (children: una barra de avance, un desglose), onClick\n// cuando no lleva a otra pantalla, y texts para los textos de la tendencia.\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaMetricCard con defaultProps y\n// styleOverrides de sus partes: root, action, header, icon, label, value, caption, extra y trend.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useToolkitNavigation} from '@/toolkit/toolkitContext.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport Box from '@mui/material/Box';\nimport CardActionArea from '@mui/material/CardActionArea';\nimport Chip from '@mui/material/Chip';\nimport Paper from '@mui/material/Paper';\nimport Skeleton from '@mui/material/Skeleton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport {alpha} from '@mui/material/styles';\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward';\nimport {piecePart, usePieceProps} from '@/theme/themePieces.js';\nimport {lightDarkStylesOf} from '@/theme/lightDarkStyles.js';\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport RemoveIcon from '@mui/icons-material/Remove';\nimport {warnUnknownProps} from '@/toolkit/unknownProps.js';\n\nconst TONES = ['info', 'success', 'warning', 'error'];\n\n/** Hacia dónde se movió el número. */\nexport const TREND_DIRECTION = Object.freeze({up: 'up', down: 'down', flat: 'flat'});\n\nconst TREND_ICONS = Object.freeze({\n [TREND_DIRECTION.up]: ArrowUpwardIcon,\n [TREND_DIRECTION.down]: ArrowDownwardIcon,\n [TREND_DIRECTION.flat]: RemoveIcon,\n});\n\n// el renglón del título: del alto de la píldora de tendencia, para que las tarjetas con y sin tendencia queden parejas\nconst TITLE_ROW_MIN_HEIGHT_PIXELS = 24;\n// el cuadro del ícono junto al título y el tamaño del ícono adentro (px)\nconst ICON_BOX_PIXELS = 28;\nconst ICON_PIXELS = 18;\n\n// el nombre de la pieza en el tema y sus partes (theme.components.CalcitaMetricCard)\nconst THEME_NAME = 'CalcitaMetricCard';\nconst CardRoot = piecePart(THEME_NAME, 'Root', Paper);\nconst CardAction = piecePart(THEME_NAME, 'Action', CardActionArea);\nconst CardHeader = piecePart(THEME_NAME, 'Header', Stack);\nconst CardIcon = piecePart(THEME_NAME, 'Icon', Box);\nconst CardLabel = piecePart(THEME_NAME, 'Label', Typography);\nconst CardValue = piecePart(THEME_NAME, 'Value', Typography);\nconst CardCaption = piecePart(THEME_NAME, 'Caption', Typography);\nconst CardExtra = piecePart(THEME_NAME, 'Extra', Box);\nconst CardTrend = piecePart(THEME_NAME, 'Trend', Chip);\n\n/**\n * El cambio contra el periodo anterior: verde si es bueno, rojo si es malo, gris si no cambió.\n *\n * @param {{trend: {label: string, direction: string, isGood?: boolean}, texts?: object}} props\n */\nfunction TrendChip({trend, texts}) {\n const {t} = useToolkitTranslation('metricCard', texts);\n const direction = TREND_ICONS[trend.direction] ? trend.direction : TREND_DIRECTION.flat;\n const TrendIcon = TREND_ICONS[direction];\n // por omisión subir es bueno; quien cuente algo malo (cancelaciones, quejas) lo dice con isGood\n const isGood = trend.isGood ?? direction === TREND_DIRECTION.up;\n const color = direction === TREND_DIRECTION.flat ? 'default' : (isGood ? 'success' : 'error');\n return (\n <CardTrend size=\"small\" color={color} variant=\"outlined\" icon={<TrendIcon />} label={trend.label}\n aria-label={`${t(`trend.${direction}`)} ${trend.label}`} ownSx={{fontWeight: 600, '& .MuiChip-icon': {fontSize: 16}}} />\n );\n}\n\n/**\n * @param {object} props\n * @param {string} props.label texto ya traducido\n * @param {import('react').ReactNode} props.value ya formateado (formatNumber)\n * @param {import('react').ReactNode} [props.caption]\n * @param {'info'|'success'|'warning'|'error'} [props.tone]\n * @param {string} [props.valueColor] color del número si no debe ir del tono (p. ej. un total en texto normal)\n * @param {boolean} [props.isLoading]\n * @param {string} [props.to] ruta interna a la que lleva la tarjeta\n * @param {{label: string, direction: 'up'|'down'|'flat', isGood?: boolean}} [props.trend] cuánto cambió (TREND_DIRECTION)\n * @param {import('react').ReactNode} [props.icon] junto al título, del color del tono (<ShoppingBagOutlinedIcon />)\n * @param {import('react').ReactNode} [props.children] contenido propio debajo de la nota (una barra de avance, un desglose)\n * @param {() => void} [props.onClick] la tarjeta entera como botón, cuando no lleva a otra pantalla (to)\n * @param {object} [props.texts] los textos que cambian, con la forma de `metricCard`: {trend: {up: 'subió'}}\n */\nexport default function MetricCard(props) {\n // lo que el proyecto puso en su tema (components.CalcitaMetricCard.defaultProps) y encima lo que llega aquí\n const {\n label, value, caption, tone = 'info', valueColor, isLoading = false, to, trend, icon, children, onClick, texts,\n ...unknownProps\n } = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n // el enlace del router que conectó el proyecto (ToolkitProvider)\n const {Link} = useToolkitNavigation();\n const paletteTone = TONES.includes(tone) ? tone : 'info';\n\n const content = (\n <>\n {/* la tendencia va en el renglón del título, a la derecha: en el mismo lugar en todas las tarjetas aunque la cifra\n sea larga (junto a la cifra, con un importe largo se bajaba a otro renglón y no quedaban parejas; lo reportaron) */}\n <CardHeader direction=\"row\" spacing={1} ownSx={{alignItems: 'center', justifyContent: 'space-between', minHeight: TITLE_ROW_MIN_HEIGHT_PIXELS}}>\n <Stack direction=\"row\" spacing={1} sx={{alignItems: 'center', minWidth: 0}}>\n {icon && (\n <CardIcon aria-hidden=\"true\" ownSx={(theme) => ({\n width: ICON_BOX_PIXELS, height: ICON_BOX_PIXELS, flexShrink: 0, display: 'grid', placeItems: 'center',\n borderRadius: 1.5, color: `${paletteTone}.main`, '& svg': {fontSize: ICON_PIXELS},\n // el tono al 14 %: se distingue del papel sin competir con la cifra\n backgroundColor: theme.vars\n ? `rgba(${theme.vars.palette[paletteTone].mainChannel} / 0.14)`\n : alpha(theme.palette[paletteTone].main, 0.14),\n })}>\n {icon}\n </CardIcon>\n )}\n <CardLabel variant=\"overline\" color=\"text.secondary\" component=\"p\" ownSx={{minWidth: 0}}>{label}</CardLabel>\n </Stack>\n {trend && !isLoading && <TrendChip trend={trend} texts={texts} />}\n </CardHeader>\n {/* la cifra en el tono oscuro de su color en claro y en el claro en oscuro (con el oscuro también en modo oscuro\n casi no se leía); valueColor del proyecto manda en los dos */}\n <CardValue variant=\"h5\" component=\"p\" ownSx={(theme) => ({\n mt: 0.75, fontWeight: 600, fontVariantNumeric: 'tabular-nums',\n ...(valueColor\n ? {color: valueColor}\n : lightDarkStylesOf(theme, {color: (theme.vars ?? theme).palette[paletteTone].dark}, {color: (theme.vars ?? theme).palette[paletteTone].light})),\n })}>\n {isLoading ? <Skeleton width={120} /> : value}\n </CardValue>\n {caption && (\n <CardCaption variant=\"caption\" color=\"text.secondary\" component=\"p\" ownSx={{mt: 0.5}}>\n {isLoading ? <Skeleton width={160} /> : caption}\n </CardCaption>\n )}\n {children && <CardExtra ownSx={{mt: 1.5}}>{children}</CardExtra>}\n </>\n );\n // una liga a la pantalla que explica el número, o un botón (onClick); sin ninguno, solo se lee\n const isClickable = Boolean(to || onClick);\n\n return (\n <CardRoot variant=\"outlined\" ownSx={{\n borderTop: 3,\n borderTopColor: `${paletteTone}.light`,\n height: '100%',\n overflow: 'hidden',\n ...(isClickable ? {} : {p: 2.5}),\n }}>\n {isClickable ? (\n <CardAction {...(to ? {component: Link, to} : {onClick})} ownSx={{p: 2.5, height: '100%', alignItems: 'flex-start', display: 'block'}}>\n {content}\n </CardAction>\n ) : content}\n </CardRoot>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MetricCard.js","sources":["../../../src/ui/metrics/MetricCard.jsx"],"sourcesContent":["// Tarjeta de métrica: etiqueta en versalitas, número grande (h5 en seminegritas, con cifras del mismo ancho) y una nota abajo, con un borde superior de\n// color según el tono (p. ej. REGISTROS LEÍDOS / ÍNTEGROS / DESCARTADOS).\n//\n// Con `to` la tarjeta entera es una liga a la pantalla que explica el número, ya filtrada: un KPI que no lleva a\n// ningún lado obliga a buscar a mano de dónde salió.\n//\n// Con `trend` lleva junto al número cuánto cambió contra el periodo anterior («▲ 12 %», como los tableros de MUI). El\n// color dice si es bueno o malo, no si subió: más cancelaciones es subir y es malo (isGood: false). La flecha y el texto\n// oculto dicen la dirección, para quien no distingue el color.\n//\n// Se extiende sin tocar el framework: un ícono junto al título (icon, del color del tono en un cuadro suave, como los\n// resúmenes de Salud de Apple), contenido propio debajo de la nota (children: una barra de avance, un desglose), onClick\n// cuando no lleva a otra pantalla, y texts para los textos de la tendencia.\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaMetricCard con defaultProps y\n// styleOverrides de sus partes: root, action, header, icon, label, value, caption, extra y trend.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useToolkitNavigation} from '@/toolkit/toolkitContext.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport Box from '@mui/material/Box';\nimport CardActionArea from '@mui/material/CardActionArea';\nimport Chip from '@mui/material/Chip';\nimport Paper from '@mui/material/Paper';\nimport Skeleton from '@mui/material/Skeleton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport {alpha} from '@mui/material/styles';\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward';\nimport {piecePart, usePieceProps, withPieceSlots} from '@/theme/themePieces.js';\nimport {lightDarkStylesOf} from '@/theme/lightDarkStyles.js';\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport RemoveIcon from '@mui/icons-material/Remove';\nimport {warnUnknownProps} from '@/toolkit/unknownProps.js';\n\nconst TONES = ['info', 'success', 'warning', 'error'];\n\n/** Hacia dónde se movió el número. */\nexport const TREND_DIRECTION = Object.freeze({up: 'up', down: 'down', flat: 'flat'});\n\nconst TREND_ICONS = Object.freeze({\n [TREND_DIRECTION.up]: ArrowUpwardIcon,\n [TREND_DIRECTION.down]: ArrowDownwardIcon,\n [TREND_DIRECTION.flat]: RemoveIcon,\n});\n\n// el renglón del título: del alto de la píldora de tendencia, para que las tarjetas con y sin tendencia queden parejas\nconst TITLE_ROW_MIN_HEIGHT_PIXELS = 24;\n// el cuadro del ícono junto al título y el tamaño del ícono adentro (px)\nconst ICON_BOX_PIXELS = 28;\nconst ICON_PIXELS = 18;\n\n// el nombre de la pieza en el tema y sus partes (theme.components.CalcitaMetricCard)\nconst THEME_NAME = 'CalcitaMetricCard';\nconst CardRoot = piecePart(THEME_NAME, 'Root', Paper);\nconst CardAction = piecePart(THEME_NAME, 'Action', CardActionArea);\nconst CardHeader = piecePart(THEME_NAME, 'Header', Stack);\nconst CardIcon = piecePart(THEME_NAME, 'Icon', Box);\nconst CardLabel = piecePart(THEME_NAME, 'Label', Typography);\nconst CardValue = piecePart(THEME_NAME, 'Value', Typography);\nconst CardCaption = piecePart(THEME_NAME, 'Caption', Typography);\nconst CardExtra = piecePart(THEME_NAME, 'Extra', Box);\nconst CardTrend = piecePart(THEME_NAME, 'Trend', Chip);\n\n/**\n * El cambio contra el periodo anterior: verde si es bueno, rojo si es malo, gris si no cambió.\n *\n * @param {{trend: {label: string, direction: string, isGood?: boolean}, texts?: object}} props\n */\nfunction TrendChip({trend, texts}) {\n const {t} = useToolkitTranslation('metricCard', texts);\n const direction = TREND_ICONS[trend.direction] ? trend.direction : TREND_DIRECTION.flat;\n const TrendIcon = TREND_ICONS[direction];\n // por omisión subir es bueno; quien cuente algo malo (cancelaciones, quejas) lo dice con isGood\n const isGood = trend.isGood ?? direction === TREND_DIRECTION.up;\n const color = direction === TREND_DIRECTION.flat ? 'default' : (isGood ? 'success' : 'error');\n return (\n <CardTrend size=\"small\" color={color} variant=\"outlined\" icon={<TrendIcon />} label={trend.label}\n aria-label={`${t(`trend.${direction}`)} ${trend.label}`} ownSx={{fontWeight: 600, '& .MuiChip-icon': {fontSize: 16}}} />\n );\n}\n\n/**\n * @param {object} props\n * @param {string} props.label texto ya traducido\n * @param {import('react').ReactNode} props.value ya formateado (formatNumber)\n * @param {import('react').ReactNode} [props.caption]\n * @param {'info'|'success'|'warning'|'error'} [props.tone]\n * @param {string} [props.valueColor] color del número si no debe ir del tono (p. ej. un total en texto normal)\n * @param {boolean} [props.isLoading]\n * @param {string} [props.to] ruta interna a la que lleva la tarjeta\n * @param {{label: string, direction: 'up'|'down'|'flat', isGood?: boolean}} [props.trend] cuánto cambió (TREND_DIRECTION)\n * @param {import('react').ReactNode} [props.icon] junto al título, del color del tono (<ShoppingBagOutlinedIcon />)\n * @param {import('react').ReactNode} [props.children] contenido propio debajo de la nota (una barra de avance, un desglose)\n * @param {() => void} [props.onClick] la tarjeta entera como botón, cuando no lleva a otra pantalla (to)\n * @param {object} [props.texts] los textos que cambian, con la forma de `metricCard`: {trend: {up: 'subió'}}\n */\nfunction MetricCardContent(props) {\n // lo que el proyecto puso en su tema (components.CalcitaMetricCard.defaultProps) y encima lo que llega aquí\n const {\n label, value, caption, tone = 'info', valueColor, isLoading = false, to, trend, icon, children, onClick, texts,\n ...unknownProps\n } = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n // el enlace del router que conectó el proyecto (ToolkitProvider)\n const {Link} = useToolkitNavigation();\n const paletteTone = TONES.includes(tone) ? tone : 'info';\n\n const content = (\n <>\n {/* la tendencia va en el renglón del título, a la derecha: en el mismo lugar en todas las tarjetas aunque la cifra\n sea larga (junto a la cifra, con un importe largo se bajaba a otro renglón y no quedaban parejas; lo reportaron) */}\n <CardHeader direction=\"row\" spacing={1} ownSx={{alignItems: 'center', justifyContent: 'space-between', minHeight: TITLE_ROW_MIN_HEIGHT_PIXELS}}>\n <Stack direction=\"row\" spacing={1} sx={{alignItems: 'center', minWidth: 0}}>\n {icon && (\n <CardIcon aria-hidden=\"true\" ownSx={(theme) => ({\n width: ICON_BOX_PIXELS, height: ICON_BOX_PIXELS, flexShrink: 0, display: 'grid', placeItems: 'center',\n borderRadius: 1.5, color: `${paletteTone}.main`, '& svg': {fontSize: ICON_PIXELS},\n // el tono al 14 %: se distingue del papel sin competir con la cifra\n backgroundColor: theme.vars\n ? `rgba(${theme.vars.palette[paletteTone].mainChannel} / 0.14)`\n : alpha(theme.palette[paletteTone].main, 0.14),\n })}>\n {icon}\n </CardIcon>\n )}\n <CardLabel variant=\"overline\" color=\"text.secondary\" component=\"p\" ownSx={{minWidth: 0}}>{label}</CardLabel>\n </Stack>\n {trend && !isLoading && <TrendChip trend={trend} texts={texts} />}\n </CardHeader>\n {/* la cifra en el tono oscuro de su color en claro y en el claro en oscuro (con el oscuro también en modo oscuro\n casi no se leía); valueColor del proyecto manda en los dos */}\n <CardValue variant=\"h5\" component=\"p\" ownSx={(theme) => ({\n mt: 0.75, fontWeight: 600, fontVariantNumeric: 'tabular-nums',\n ...(valueColor\n ? {color: valueColor}\n : lightDarkStylesOf(theme, {color: (theme.vars ?? theme).palette[paletteTone].dark}, {color: (theme.vars ?? theme).palette[paletteTone].light})),\n })}>\n {isLoading ? <Skeleton width={120} /> : value}\n </CardValue>\n {caption && (\n <CardCaption variant=\"caption\" color=\"text.secondary\" component=\"p\" ownSx={{mt: 0.5}}>\n {isLoading ? <Skeleton width={160} /> : caption}\n </CardCaption>\n )}\n {children && <CardExtra ownSx={{mt: 1.5}}>{children}</CardExtra>}\n </>\n );\n // una liga a la pantalla que explica el número, o un botón (onClick); sin ninguno, solo se lee\n const isClickable = Boolean(to || onClick);\n\n return (\n <CardRoot variant=\"outlined\" ownSx={{\n borderTop: 3,\n borderTopColor: `${paletteTone}.light`,\n height: '100%',\n overflow: 'hidden',\n ...(isClickable ? {} : {p: 2.5}),\n }}>\n {isClickable ? (\n <CardAction {...(to ? {component: Link, to} : {onClick})} ownSx={{p: 2.5, height: '100%', alignItems: 'flex-start', display: 'block'}}>\n {content}\n </CardAction>\n ) : content}\n </CardRoot>\n );\n}\n\n// lo que se exporta: la pieza con slots y slotProps para cambiar sus partes (themePieces.js)\nconst MetricCard = withPieceSlots(MetricCardContent, THEME_NAME);\nexport default MetricCard;\n"],"names":[],"mappings":"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"}
@@ -3,18 +3,19 @@ import { jsx } from "react/jsx-runtime";
3
3
  import { useToolkitTranslation } from "../../toolkit/useToolkitTranslation.js";
4
4
  import Box from "@mui/material/Box";
5
5
  import Button from "@mui/material/Button";
6
- import { piecePart, usePieceProps } from "../../theme/themePieces.js";
6
+ import { piecePart, withPieceSlots, usePieceProps } from "../../theme/themePieces.js";
7
7
  import { warnUnknownProps } from "../../toolkit/unknownProps.js";
8
8
  const THEME_NAME = "CalcitaTableToggle";
9
9
  const ToggleRoot = piecePart(THEME_NAME, "Root", Box);
10
10
  const ToggleButton = piecePart(THEME_NAME, "Button", Button);
11
11
  const CHART_VIEW = Object.freeze({ chart: "chart", table: "table" });
12
- function TableToggle(props) {
12
+ function TableToggleContent(props) {
13
13
  const { asTable, onToggle, texts, ...unknownProps } = usePieceProps(props, THEME_NAME);
14
14
  warnUnknownProps(THEME_NAME, unknownProps);
15
15
  const { t } = useToolkitTranslation("common", texts);
16
16
  return /* @__PURE__ */ jsx(ToggleRoot, { ownSx: { display: "flex", justifyContent: "flex-end", mb: 1 }, children: /* @__PURE__ */ jsx(ToggleButton, { size: "small", onClick: onToggle, ownSx: { textTransform: "none" }, children: asTable ? t("charts.viewAsChart") : t("charts.viewAsTable") }) });
17
17
  }
18
+ const TableToggle = withPieceSlots(TableToggleContent, THEME_NAME);
18
19
  export {
19
20
  CHART_VIEW,
20
21
  TableToggle as default
@@ -1 +1 @@
1
- {"version":3,"file":"TableToggle.js","sources":["../../../src/ui/metrics/TableToggle.jsx"],"sourcesContent":["// \"Ver como tabla\": toda gráfica tiene su versión en tabla, para quien no distingue el color, usa lector de pantalla o\n// quiere copiar los números.\n//\n// Los textos salen de i18n.\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaTableToggle con defaultProps y\n// styleOverrides de sus partes: root, button.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\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.CalcitaTableToggle)\nconst THEME_NAME = 'CalcitaTableToggle';\nconst ToggleRoot = piecePart(THEME_NAME, 'Root', Box);\nconst ToggleButton = piecePart(THEME_NAME, 'Button', Button);\n\n/** Cómo se ve una gráfica: dibujada o en su tabla (defaultView y onViewChange de BarList, ColumnChart, LineChart y CalendarHeatmap). */\nexport const CHART_VIEW = Object.freeze({chart: 'chart', table: 'table'});\n\n/**\n * @param {{asTable: boolean, onToggle: () => void, texts?: object}} props texts: los textos que cambian, con la forma de\n * `common` ({charts: {viewAsTable, viewAsChart}})\n */\nexport default function TableToggle(props) {\n // lo que el proyecto puso en su tema (components.CalcitaTableToggle.defaultProps) y encima lo que llega aquí\n const {asTable, onToggle, texts, ...unknownProps} = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n const {t} = useToolkitTranslation('common', texts);\n\n return (\n <ToggleRoot ownSx={{display: 'flex', justifyContent: 'flex-end', mb: 1}}>\n <ToggleButton size=\"small\" onClick={onToggle} ownSx={{textTransform: 'none'}}>\n {asTable ? t('charts.viewAsChart') : t('charts.viewAsTable')}\n </ToggleButton>\n </ToggleRoot>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAgBA,MAAM,aAAa;AACnB,MAAM,aAAa,UAAU,YAAY,QAAQ,GAAG;AACpD,MAAM,eAAe,UAAU,YAAY,UAAU,MAAM;AAGpD,MAAM,aAAa,OAAO,OAAO,EAAC,OAAO,SAAS,OAAO,SAAQ;AAMxE,SAAwB,YAAY,OAAO;AAEvC,QAAM,EAAC,SAAS,UAAU,OAAO,GAAG,iBAAgB,cAAc,OAAO,UAAU;AACnF,mBAAiB,YAAY,YAAY;AACzC,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AAEjD,SACI,oBAAC,YAAA,EAAW,OAAO,EAAC,SAAS,QAAQ,gBAAgB,YAAY,IAAI,EAAA,GACjE,UAAA,oBAAC,cAAA,EAAa,MAAK,SAAQ,SAAS,UAAU,OAAO,EAAC,eAAe,OAAA,GAChE,UAAA,UAAU,EAAE,oBAAoB,IAAI,EAAE,oBAAoB,GAC/D,GACJ;AAER;"}
1
+ {"version":3,"file":"TableToggle.js","sources":["../../../src/ui/metrics/TableToggle.jsx"],"sourcesContent":["// \"Ver como tabla\": toda gráfica tiene su versión en tabla, para quien no distingue el color, usa lector de pantalla o\n// quiere copiar los números.\n//\n// Los textos salen de i18n.\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaTableToggle con defaultProps y\n// styleOverrides de sus partes: root, button.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\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.CalcitaTableToggle)\nconst THEME_NAME = 'CalcitaTableToggle';\nconst ToggleRoot = piecePart(THEME_NAME, 'Root', Box);\nconst ToggleButton = piecePart(THEME_NAME, 'Button', Button);\n\n/** Cómo se ve una gráfica: dibujada o en su tabla (defaultView y onViewChange de BarList, ColumnChart, LineChart y CalendarHeatmap). */\nexport const CHART_VIEW = Object.freeze({chart: 'chart', table: 'table'});\n\n/**\n * @param {{asTable: boolean, onToggle: () => void, texts?: object}} props texts: los textos que cambian, con la forma de\n * `common` ({charts: {viewAsTable, viewAsChart}})\n */\nfunction TableToggleContent(props) {\n // lo que el proyecto puso en su tema (components.CalcitaTableToggle.defaultProps) y encima lo que llega aquí\n const {asTable, onToggle, texts, ...unknownProps} = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n const {t} = useToolkitTranslation('common', texts);\n\n return (\n <ToggleRoot ownSx={{display: 'flex', justifyContent: 'flex-end', mb: 1}}>\n <ToggleButton size=\"small\" onClick={onToggle} ownSx={{textTransform: 'none'}}>\n {asTable ? t('charts.viewAsChart') : t('charts.viewAsTable')}\n </ToggleButton>\n </ToggleRoot>\n );\n}\n\n// lo que se exporta: la pieza con slots y slotProps para cambiar sus partes (themePieces.js)\nconst TableToggle = withPieceSlots(TableToggleContent, THEME_NAME);\nexport default TableToggle;\n"],"names":[],"mappings":";;;;;;;AAgBA,MAAM,aAAa;AACnB,MAAM,aAAa,UAAU,YAAY,QAAQ,GAAG;AACpD,MAAM,eAAe,UAAU,YAAY,UAAU,MAAM;AAGpD,MAAM,aAAa,OAAO,OAAO,EAAC,OAAO,SAAS,OAAO,SAAQ;AAMxE,SAAS,mBAAmB,OAAO;AAE/B,QAAM,EAAC,SAAS,UAAU,OAAO,GAAG,iBAAgB,cAAc,OAAO,UAAU;AACnF,mBAAiB,YAAY,YAAY;AACzC,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AAEjD,SACI,oBAAC,YAAA,EAAW,OAAO,EAAC,SAAS,QAAQ,gBAAgB,YAAY,IAAI,EAAA,GACjE,UAAA,oBAAC,cAAA,EAAa,MAAK,SAAQ,SAAS,UAAU,OAAO,EAAC,eAAe,OAAA,GAChE,UAAA,UAAU,EAAE,oBAAoB,IAAI,EAAE,oBAAoB,GAC/D,GACJ;AAER;AAGA,MAAM,cAAc,eAAe,oBAAoB,UAAU;"}
@@ -10,7 +10,7 @@ import TableRow from "@mui/material/TableRow";
10
10
  import Typography from "@mui/material/Typography";
11
11
  import { useTheme } from "@mui/material/styles";
12
12
  import { paletteOf } from "../../theme/components/paletteOf.js";
13
- import { piecePart } from "../../theme/themePieces.js";
13
+ import { piecePart, withPieceSlots } from "../../theme/themePieces.js";
14
14
  import { warnUnknownProps } from "../../toolkit/unknownProps.js";
15
15
  const THEME_NAME = "CalcitaChart";
16
16
  const ChartTableArea = piecePart(THEME_NAME, "TableArea", Box);
@@ -59,7 +59,7 @@ function highestValueOf(data, series, referenceLine) {
59
59
  const values = data.flatMap((row) => series.map((item) => Number(row[item.key]) || 0));
60
60
  return Math.max(0, ...values, referenceLine?.value ?? 0);
61
61
  }
62
- function ChartTable({ data, series, periodLabel, formatValue, height, ...unknownProps }) {
62
+ function ChartTableContent({ data, series, periodLabel, formatValue, height, ...unknownProps }) {
63
63
  warnUnknownProps("ChartTable", unknownProps);
64
64
  return /* @__PURE__ */ jsx(ChartTableArea, { ownSx: { maxHeight: height, overflowY: "auto" }, children: /* @__PURE__ */ jsxs(Table, { size: "small", children: [
65
65
  /* @__PURE__ */ jsx(TableHead, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
@@ -72,7 +72,7 @@ function ChartTable({ data, series, periodLabel, formatValue, height, ...unknown
72
72
  ] }, row.key)) })
73
73
  ] }) });
74
74
  }
75
- function ChartLegend({ series, showsDash = false, ariaLabel, ...unknownProps }) {
75
+ function ChartLegendContent({ series, showsDash = false, ariaLabel, ...unknownProps }) {
76
76
  warnUnknownProps("ChartLegend", unknownProps);
77
77
  if (series.length < 2) {
78
78
  return null;
@@ -82,7 +82,7 @@ function ChartLegend({ series, showsDash = false, ariaLabel, ...unknownProps })
82
82
  /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "text.secondary", children: item.label })
83
83
  ] }, item.key)) });
84
84
  }
85
- function ReferenceCaption({ referenceLine, ...unknownProps }) {
85
+ function ReferenceCaptionContent({ referenceLine, ...unknownProps }) {
86
86
  warnUnknownProps("ReferenceCaption", unknownProps);
87
87
  if (!referenceLine) {
88
88
  return null;
@@ -92,6 +92,9 @@ function ReferenceCaption({ referenceLine, ...unknownProps }) {
92
92
  /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "text.secondary", children: referenceLine.label })
93
93
  ] });
94
94
  }
95
+ const ChartTable = withPieceSlots(ChartTableContent, THEME_NAME);
96
+ const ChartLegend = withPieceSlots(ChartLegendContent, THEME_NAME);
97
+ const ReferenceCaption = withPieceSlots(ReferenceCaptionContent, THEME_NAME);
95
98
  export {
96
99
  CHART_LINE_DASHES,
97
100
  CHART_SERIES_TONES,
@@ -1 +1 @@
1
- {"version":3,"file":"chartParts.js","sources":["../../../src/ui/metrics/chartParts.jsx"],"sourcesContent":["// Lo que comparten las gráficas de tiempo de la casa (ColumnChart y LineChart): las medidas del eje de valores, la vista de\n// tabla, la leyenda de las series y el rótulo de la línea de referencia. Un solo lugar: si cambia cómo se lee una tabla o una\n// leyenda, cambia en las dos gráficas.\n//\n// Las reglas de la guía de Apple (HIG «Charts» y «Charting data»):\n// - con una serie, sin leyenda (el título ya dice qué es); con varias, leyenda;\n// - el color no va solo: cada serie de líneas lleva además su trazo (continuo, rayado, punteado) y toda gráfica tiene su\n// vista de tabla;\n// - ejes y rejilla tenues, que den contexto sin competir con los datos.\n//\n// Los colores salen del tema (useChartColors), nunca escritos como var(--mui-…): un proyecto con su propio prefijo de\n// variables (cssVarPrefix) o sin variables CSS se quedaba con ejes y texto sin color.\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaChart con defaultProps y\n// styleOverrides de sus partes: tableArea, legend, legendItem, legendLine, legendSwatch, reference, referenceLine.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useMemo} from 'react';\nimport Box from '@mui/material/Box';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport Typography from '@mui/material/Typography';\nimport {useTheme} from '@mui/material/styles';\n\nimport {paletteOf} from '@/theme/components/paletteOf.js';\nimport {piecePart} 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.CalcitaChart)\nconst THEME_NAME = 'CalcitaChart';\nconst ChartTableArea = piecePart(THEME_NAME, 'TableArea', Box);\nconst ChartLegendPart = piecePart(THEME_NAME, 'Legend', Box);\nconst ChartLegendItem = piecePart(THEME_NAME, 'LegendItem', Box);\nconst ChartLegendLine = piecePart(THEME_NAME, 'LegendLine', Box);\nconst ChartLegendSwatch = piecePart(THEME_NAME, 'LegendSwatch', Box);\nconst ChartReference = piecePart(THEME_NAME, 'Reference', Box);\nconst ChartReferenceLine = piecePart(THEME_NAME, 'ReferenceLine', Box);\n\nconst AXIS_FONT_PIXELS = 12;\n// ancho del eje de valores: nunca menos que esto, más lo que pida su número más largo\nconst AXIS_MINIMUM_WIDTH_PIXELS = 48;\nconst AXIS_PADDING_PIXELS = 16;\n// ancho aproximado de un carácter del eje a 12 px\nconst AXIS_CHARACTER_PIXELS = 7;\n// la marca más alta del eje suele pasar del valor más alto y puede llevar un carácter más (999,999 → 1,000,000)\nconst AXIS_EXTRA_CHARACTERS = 1;\n// largo de la muestra que acompaña al rótulo de la línea de referencia y a cada serie de la leyenda\nconst SWATCH_PIXELS = 20;\n\n/** Los colores de las series, en orden, cuando la pantalla no dice el suyo: los del tema. */\nexport const CHART_SERIES_TONES = Object.freeze(['primary', 'info', 'success', 'warning', 'error', 'secondary']);\n/** El trazo de cada serie de líneas, en orden (continuo, rayado, punteado): así no se distinguen solo por el color. */\nexport const CHART_LINE_DASHES = Object.freeze(['0', '6 4', '2 3']);\n\n/**\n * Los colores de las gráficas, leídos del tema: con variables CSS salen como var(--su-prefijo-palette-…) y sirven en claro y\n * en oscuro sin volver a pintar; sin ellas, el color de la paleta.\n *\n * @returns {{palette: object, axis: string, axisText: {fill: string, fontSize: number}, grid: string, text: string, muted: string, hover: string}}\n */\nexport function useChartColors() {\n const palette = paletteOf(useTheme());\n return useMemo(() => ({\n palette,\n axis: palette.text.secondary,\n axisText: {fill: palette.text.secondary, fontSize: AXIS_FONT_PIXELS},\n grid: palette.divider,\n text: palette.text.primary,\n muted: palette.text.secondary,\n hover: palette.action.hover,\n }), [palette]);\n}\n\n/**\n * Ancho del eje de valores para que quepa su número más largo.\n *\n * @param {number} highestValue el valor más alto que se dibuja\n * @param {(value: number) => string} formatValue cómo se escribe un valor\n * @returns {number} pixeles\n */\nexport function valueAxisWidthOf(highestValue, formatValue) {\n const longestLabel = formatValue(highestValue).length + AXIS_EXTRA_CHARACTERS;\n return Math.max(AXIS_MINIMUM_WIDTH_PIXELS, AXIS_PADDING_PIXELS + longestLabel * AXIS_CHARACTER_PIXELS);\n}\n\n/**\n * Las series con su color y su trazo resueltos (lo que la pantalla no dijo, por su lugar en la lista).\n *\n * @param {Array<{key: string, label: string, tone?: string, dash?: string}>} series\n * @param {object} palette la del tema (useChartColors().palette)\n * @returns {Array<{key: string, label: string, tone: string, color: string, dash: string}>}\n */\nexport function resolvedSeriesOf(series, palette) {\n return series.map((item, index) => {\n const tone = item.tone ?? CHART_SERIES_TONES[index % CHART_SERIES_TONES.length];\n return {\n ...item,\n tone,\n color: (palette[tone] ?? palette.primary).main,\n dash: item.dash ?? CHART_LINE_DASHES[index % CHART_LINE_DASHES.length],\n };\n });\n}\n\n/**\n * El valor más alto de todas las series (y de la línea de referencia), para el ancho del eje.\n *\n * @param {Array<Record<string, any>>} data\n * @param {Array<{key: string}>} series\n * @param {{value: number}|undefined} referenceLine\n * @returns {number}\n */\nexport function highestValueOf(data, series, referenceLine) {\n const values = data.flatMap((row) => series.map((item) => Number(row[item.key]) || 0));\n return Math.max(0, ...values, referenceLine?.value ?? 0);\n}\n\n/**\n * La vista de tabla: un renglón por periodo y una columna por serie.\n *\n * @param {object} props\n * @param {Array<Record<string, any>>} props.data\n * @param {Array<{key: string, label: string}>} props.series\n * @param {string} props.periodLabel\n * @param {(value: number) => string} props.formatValue\n * @param {number} props.height\n */\nexport function ChartTable({data, series, periodLabel, formatValue, height, ...unknownProps}) {\n warnUnknownProps('ChartTable', unknownProps);\n return (\n <ChartTableArea ownSx={{maxHeight: height, overflowY: 'auto'}}>\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>{periodLabel}</TableCell>\n {series.map((item) => <TableCell key={item.key} align=\"right\">{item.label}</TableCell>)}\n </TableRow>\n </TableHead>\n <TableBody>\n {data.map((row) => (\n <TableRow key={row.key}>\n <TableCell>{row.label}</TableCell>\n {series.map((item) => <TableCell key={item.key} align=\"right\">{formatValue(row[item.key])}</TableCell>)}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </ChartTableArea>\n );\n}\n\n/**\n * La leyenda: solo con dos series o más. Cada una con su muestra (su color y, en líneas, su trazo).\n *\n * @param {object} props\n * @param {Array<{key: string, label: string, color: string, dash: string}>} props.series ya resueltas\n * @param {boolean} [props.showsDash] la muestra con el trazo de su línea (LineChart); sin él, un cuadro de color\n * @param {string} props.ariaLabel\n */\nexport function ChartLegend({series, showsDash = false, ariaLabel, ...unknownProps}) {\n warnUnknownProps('ChartLegend', unknownProps);\n if (series.length < 2) {\n return null;\n }\n return (\n <ChartLegendPart component=\"ul\" aria-label={ariaLabel} ownSx={{display: 'flex', flexWrap: 'wrap', gap: 2, listStyle: 'none', p: 0, m: 0, mt: 1}}>\n {series.map((item) => (\n <ChartLegendItem component=\"li\" key={item.key} ownSx={{display: 'flex', alignItems: 'center', gap: 0.75}}>\n {showsDash ? (\n <ChartLegendLine component=\"svg\" aria-hidden=\"true\" width={SWATCH_PIXELS} height={8} ownSx={{color: item.color}}>\n <line x1=\"0\" y1=\"4\" x2={SWATCH_PIXELS} y2=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeDasharray={item.dash} />\n </ChartLegendLine>\n ) : (\n <ChartLegendSwatch aria-hidden=\"true\" ownSx={{width: 10, height: 10, borderRadius: 0.5, bgcolor: item.color}} />\n )}\n <Typography variant=\"caption\" color=\"text.secondary\">{item.label}</Typography>\n </ChartLegendItem>\n ))}\n </ChartLegendPart>\n );\n}\n\n/**\n * El rótulo de la línea de referencia (la meta), debajo de la gráfica: sobre la línea se encimaba con la última columna, y\n * así también lo lee quien ve la tabla.\n *\n * @param {{referenceLine?: {value: number, label: string}}} props\n */\nexport function ReferenceCaption({referenceLine, ...unknownProps}) {\n warnUnknownProps('ReferenceCaption', unknownProps);\n if (!referenceLine) {\n return null;\n }\n return (\n <ChartReference ownSx={{display: 'flex', alignItems: 'center', justifyContent: 'flex-end', gap: 0.75, mt: 0.5}}>\n <ChartReferenceLine aria-hidden=\"true\" ownSx={{width: SWATCH_PIXELS, borderTop: '2px dashed', borderColor: 'text.secondary'}} />\n <Typography variant=\"caption\" color=\"text.secondary\">{referenceLine.label}</Typography>\n </ChartReference>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chartParts.js","sources":["../../../src/ui/metrics/chartParts.jsx"],"sourcesContent":["// Lo que comparten las gráficas de tiempo de la casa (ColumnChart y LineChart): las medidas del eje de valores, la vista de\n// tabla, la leyenda de las series y el rótulo de la línea de referencia. Un solo lugar: si cambia cómo se lee una tabla o una\n// leyenda, cambia en las dos gráficas.\n//\n// Las reglas de la guía de Apple (HIG «Charts» y «Charting data»):\n// - con una serie, sin leyenda (el título ya dice qué es); con varias, leyenda;\n// - el color no va solo: cada serie de líneas lleva además su trazo (continuo, rayado, punteado) y toda gráfica tiene su\n// vista de tabla;\n// - ejes y rejilla tenues, que den contexto sin competir con los datos.\n//\n// Los colores salen del tema (useChartColors), nunca escritos como var(--mui-…): un proyecto con su propio prefijo de\n// variables (cssVarPrefix) o sin variables CSS se quedaba con ejes y texto sin color.\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaChart con defaultProps y\n// styleOverrides de sus partes: tableArea, legend, legendItem, legendLine, legendSwatch, reference, referenceLine.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useMemo} from 'react';\nimport Box from '@mui/material/Box';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport Typography from '@mui/material/Typography';\nimport {useTheme} from '@mui/material/styles';\n\nimport {paletteOf} from '@/theme/components/paletteOf.js';\nimport {piecePart, 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.CalcitaChart)\nconst THEME_NAME = 'CalcitaChart';\nconst ChartTableArea = piecePart(THEME_NAME, 'TableArea', Box);\nconst ChartLegendPart = piecePart(THEME_NAME, 'Legend', Box);\nconst ChartLegendItem = piecePart(THEME_NAME, 'LegendItem', Box);\nconst ChartLegendLine = piecePart(THEME_NAME, 'LegendLine', Box);\nconst ChartLegendSwatch = piecePart(THEME_NAME, 'LegendSwatch', Box);\nconst ChartReference = piecePart(THEME_NAME, 'Reference', Box);\nconst ChartReferenceLine = piecePart(THEME_NAME, 'ReferenceLine', Box);\n\nconst AXIS_FONT_PIXELS = 12;\n// ancho del eje de valores: nunca menos que esto, más lo que pida su número más largo\nconst AXIS_MINIMUM_WIDTH_PIXELS = 48;\nconst AXIS_PADDING_PIXELS = 16;\n// ancho aproximado de un carácter del eje a 12 px\nconst AXIS_CHARACTER_PIXELS = 7;\n// la marca más alta del eje suele pasar del valor más alto y puede llevar un carácter más (999,999 → 1,000,000)\nconst AXIS_EXTRA_CHARACTERS = 1;\n// largo de la muestra que acompaña al rótulo de la línea de referencia y a cada serie de la leyenda\nconst SWATCH_PIXELS = 20;\n\n/** Los colores de las series, en orden, cuando la pantalla no dice el suyo: los del tema. */\nexport const CHART_SERIES_TONES = Object.freeze(['primary', 'info', 'success', 'warning', 'error', 'secondary']);\n/** El trazo de cada serie de líneas, en orden (continuo, rayado, punteado): así no se distinguen solo por el color. */\nexport const CHART_LINE_DASHES = Object.freeze(['0', '6 4', '2 3']);\n\n/**\n * Los colores de las gráficas, leídos del tema: con variables CSS salen como var(--su-prefijo-palette-…) y sirven en claro y\n * en oscuro sin volver a pintar; sin ellas, el color de la paleta.\n *\n * @returns {{palette: object, axis: string, axisText: {fill: string, fontSize: number}, grid: string, text: string, muted: string, hover: string}}\n */\nexport function useChartColors() {\n const palette = paletteOf(useTheme());\n return useMemo(() => ({\n palette,\n axis: palette.text.secondary,\n axisText: {fill: palette.text.secondary, fontSize: AXIS_FONT_PIXELS},\n grid: palette.divider,\n text: palette.text.primary,\n muted: palette.text.secondary,\n hover: palette.action.hover,\n }), [palette]);\n}\n\n/**\n * Ancho del eje de valores para que quepa su número más largo.\n *\n * @param {number} highestValue el valor más alto que se dibuja\n * @param {(value: number) => string} formatValue cómo se escribe un valor\n * @returns {number} pixeles\n */\nexport function valueAxisWidthOf(highestValue, formatValue) {\n const longestLabel = formatValue(highestValue).length + AXIS_EXTRA_CHARACTERS;\n return Math.max(AXIS_MINIMUM_WIDTH_PIXELS, AXIS_PADDING_PIXELS + longestLabel * AXIS_CHARACTER_PIXELS);\n}\n\n/**\n * Las series con su color y su trazo resueltos (lo que la pantalla no dijo, por su lugar en la lista).\n *\n * @param {Array<{key: string, label: string, tone?: string, dash?: string}>} series\n * @param {object} palette la del tema (useChartColors().palette)\n * @returns {Array<{key: string, label: string, tone: string, color: string, dash: string}>}\n */\nexport function resolvedSeriesOf(series, palette) {\n return series.map((item, index) => {\n const tone = item.tone ?? CHART_SERIES_TONES[index % CHART_SERIES_TONES.length];\n return {\n ...item,\n tone,\n color: (palette[tone] ?? palette.primary).main,\n dash: item.dash ?? CHART_LINE_DASHES[index % CHART_LINE_DASHES.length],\n };\n });\n}\n\n/**\n * El valor más alto de todas las series (y de la línea de referencia), para el ancho del eje.\n *\n * @param {Array<Record<string, any>>} data\n * @param {Array<{key: string}>} series\n * @param {{value: number}|undefined} referenceLine\n * @returns {number}\n */\nexport function highestValueOf(data, series, referenceLine) {\n const values = data.flatMap((row) => series.map((item) => Number(row[item.key]) || 0));\n return Math.max(0, ...values, referenceLine?.value ?? 0);\n}\n\n/**\n * La vista de tabla: un renglón por periodo y una columna por serie.\n *\n * @param {object} props\n * @param {Array<Record<string, any>>} props.data\n * @param {Array<{key: string, label: string}>} props.series\n * @param {string} props.periodLabel\n * @param {(value: number) => string} props.formatValue\n * @param {number} props.height\n */\nfunction ChartTableContent({data, series, periodLabel, formatValue, height, ...unknownProps}) {\n warnUnknownProps('ChartTable', unknownProps);\n return (\n <ChartTableArea ownSx={{maxHeight: height, overflowY: 'auto'}}>\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>{periodLabel}</TableCell>\n {series.map((item) => <TableCell key={item.key} align=\"right\">{item.label}</TableCell>)}\n </TableRow>\n </TableHead>\n <TableBody>\n {data.map((row) => (\n <TableRow key={row.key}>\n <TableCell>{row.label}</TableCell>\n {series.map((item) => <TableCell key={item.key} align=\"right\">{formatValue(row[item.key])}</TableCell>)}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </ChartTableArea>\n );\n}\n\n/**\n * La leyenda: solo con dos series o más. Cada una con su muestra (su color y, en líneas, su trazo).\n *\n * @param {object} props\n * @param {Array<{key: string, label: string, color: string, dash: string}>} props.series ya resueltas\n * @param {boolean} [props.showsDash] la muestra con el trazo de su línea (LineChart); sin él, un cuadro de color\n * @param {string} props.ariaLabel\n */\nfunction ChartLegendContent({series, showsDash = false, ariaLabel, ...unknownProps}) {\n warnUnknownProps('ChartLegend', unknownProps);\n if (series.length < 2) {\n return null;\n }\n return (\n <ChartLegendPart component=\"ul\" aria-label={ariaLabel} ownSx={{display: 'flex', flexWrap: 'wrap', gap: 2, listStyle: 'none', p: 0, m: 0, mt: 1}}>\n {series.map((item) => (\n <ChartLegendItem component=\"li\" key={item.key} ownSx={{display: 'flex', alignItems: 'center', gap: 0.75}}>\n {showsDash ? (\n <ChartLegendLine component=\"svg\" aria-hidden=\"true\" width={SWATCH_PIXELS} height={8} ownSx={{color: item.color}}>\n <line x1=\"0\" y1=\"4\" x2={SWATCH_PIXELS} y2=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeDasharray={item.dash} />\n </ChartLegendLine>\n ) : (\n <ChartLegendSwatch aria-hidden=\"true\" ownSx={{width: 10, height: 10, borderRadius: 0.5, bgcolor: item.color}} />\n )}\n <Typography variant=\"caption\" color=\"text.secondary\">{item.label}</Typography>\n </ChartLegendItem>\n ))}\n </ChartLegendPart>\n );\n}\n\n/**\n * El rótulo de la línea de referencia (la meta), debajo de la gráfica: sobre la línea se encimaba con la última columna, y\n * así también lo lee quien ve la tabla.\n *\n * @param {{referenceLine?: {value: number, label: string}}} props\n */\nfunction ReferenceCaptionContent({referenceLine, ...unknownProps}) {\n warnUnknownProps('ReferenceCaption', unknownProps);\n if (!referenceLine) {\n return null;\n }\n return (\n <ChartReference ownSx={{display: 'flex', alignItems: 'center', justifyContent: 'flex-end', gap: 0.75, mt: 0.5}}>\n <ChartReferenceLine aria-hidden=\"true\" ownSx={{width: SWATCH_PIXELS, borderTop: '2px dashed', borderColor: 'text.secondary'}} />\n <Typography variant=\"caption\" color=\"text.secondary\">{referenceLine.label}</Typography>\n </ChartReference>\n );\n}\n\n// las tres con slots desde el tema (theme.components.CalcitaChart.defaultProps.slots): son de adentro de las gráficas\nexport const ChartTable = withPieceSlots(ChartTableContent, THEME_NAME);\nexport const ChartLegend = withPieceSlots(ChartLegendContent, THEME_NAME);\nexport const ReferenceCaption = withPieceSlots(ReferenceCaptionContent, THEME_NAME);\n"],"names":[],"mappings":"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"}
@@ -6,7 +6,11 @@ import Button from "@mui/material/Button";
6
6
  import ArrowBackIcon from "@mui/icons-material/ArrowBack";
7
7
  import { recallListUrl } from "../../lastListUrl.js";
8
8
  import { currentHistoryIndex, pageNameAt } from "../../navigationTrail.js";
9
- function BackButton({ fallbackTo, listKey, label, texts, ...buttonProps }) {
9
+ import { piecePart, withPieceSlots, usePieceProps } from "../../theme/themePieces.js";
10
+ const THEME_NAME = "CalcitaBackButton";
11
+ const BackButtonRoot = piecePart(THEME_NAME, "Root", Button);
12
+ function BackButtonContent(props) {
13
+ const { fallbackTo, listKey, label, texts, ...buttonProps } = usePieceProps(props, THEME_NAME);
10
14
  const { t } = useToolkitTranslation("common", texts);
11
15
  const { useNavigate } = useToolkitNavigation();
12
16
  const navigate = useNavigate();
@@ -20,8 +24,9 @@ function BackButton({ fallbackTo, listKey, label, texts, ...buttonProps }) {
20
24
  }
21
25
  navigate(listKey && recallListUrl(listKey) || fallbackTo);
22
26
  };
23
- return /* @__PURE__ */ jsx(Button, { size: "small", color: "inherit", startIcon: /* @__PURE__ */ jsx(ArrowBackIcon, {}), onClick: goBack, ...buttonProps, children: previousPageName ? t(previousPageName.labelKey, previousPageName.params) : label ?? t("actions.back") });
27
+ return /* @__PURE__ */ jsx(BackButtonRoot, { size: "small", color: "inherit", startIcon: /* @__PURE__ */ jsx(ArrowBackIcon, {}), onClick: goBack, ...buttonProps, children: previousPageName ? t(previousPageName.labelKey, previousPageName.params) : label ?? t("actions.back") });
24
28
  }
29
+ const BackButton = withPieceSlots(BackButtonContent, THEME_NAME);
25
30
  export {
26
31
  BackButton as default
27
32
  };
@@ -1 +1 @@
1
- {"version":3,"file":"BackButton.js","sources":["../../../src/ui/navigation/BackButton.jsx"],"sourcesContent":["// Botón de regreso por el ROUTER, no por un enlace fijo.\n//\n// navigate(-1) regresa a la entrada anterior del historial con sus parámetros intactos: los filtros, el orden, la\n// pestaña y la página que nuqs dejó en la URL de la lista siguen ahí. Un enlace fijo a la lista los perdería.\n//\n// Si alguien llegó directo (pegó el enlace del detalle, abrió en pestaña nueva, recargó después de un login) no hay\n// historial al que volver: se usa la última URL de la lista que se guardó en sessionStorage al salir de ella\n// (useRememberListUrl) y, si tampoco hay, fallbackTo.\n//\n// El TEXTO dice a dónde regresa: si la página anterior anotó su nombre de regreso (usePageName de navigationTrail.js),\n// se pinta ese («Regresar al detalle del pedido 15»); si no, o si no hay historial, el label que le pasen.\n//\n// Navega con la navegación del proveedor (ToolkitProvider), no con un router en particular.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useToolkitNavigation} from '@/toolkit/toolkitContext.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport Button from '@mui/material/Button';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\n\nimport {recallListUrl} from '@/lastListUrl.js';\nimport {currentHistoryIndex, pageNameAt} from '@/navigationTrail.js';\n\n/**\n * @param {object} props\n * @param {string} props.fallbackTo ruta de la lista sin filtros (último respaldo)\n * @param {string} [props.listKey] la misma llave que usa useRememberListUrl en la lista\n * @param {string} [props.label] ya traducido; se usa cuando la página anterior no anotó su nombre o no hay historial\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nexport default function BackButton({fallbackTo, listKey, label, texts, ...buttonProps}) {\n const {t} = useToolkitTranslation('common', texts);\n const {useNavigate} = useToolkitNavigation();\n const navigate = useNavigate();\n\n // react-router guarda en history.state un índice: 0 = primera entrada de esta pestaña en la app. Otro router no lo\n // guarda: entonces se toma como si no hubiera historial y se regresa a la última lista o a fallbackTo\n const historyIndex = currentHistoryIndex();\n const hasHistory = historyIndex > 0;\n const previousPageName = hasHistory ? pageNameAt(historyIndex - 1) : null;\n\n const goBack = () => {\n if (hasHistory) {\n navigate(-1);\n return;\n }\n navigate((listKey && recallListUrl(listKey)) || fallbackTo);\n };\n\n return (\n <Button size=\"small\" color=\"inherit\" startIcon={<ArrowBackIcon />} onClick={goBack} {...buttonProps}>\n {previousPageName ? t(previousPageName.labelKey, previousPageName.params) : (label ?? t('actions.back'))}\n </Button>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AA8BA,SAAwB,WAAW,EAAC,YAAY,SAAS,OAAO,OAAO,GAAG,eAAc;AACpF,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AACjD,QAAM,EAAC,YAAA,IAAe,qBAAA;AACtB,QAAM,WAAW,YAAA;AAIjB,QAAM,eAAe,oBAAA;AACrB,QAAM,aAAa,eAAe;AAClC,QAAM,mBAAmB,aAAa,WAAW,eAAe,CAAC,IAAI;AAErE,QAAM,SAAS,MAAM;AACjB,QAAI,YAAY;AACZ,eAAS,EAAE;AACX;AAAA,IACJ;AACA,aAAU,WAAW,cAAc,OAAO,KAAM,UAAU;AAAA,EAC9D;AAEA,SACI,oBAAC,QAAA,EAAO,MAAK,SAAQ,OAAM,WAAU,WAAW,oBAAC,eAAA,CAAA,CAAc,GAAI,SAAS,QAAS,GAAG,aACnF,UAAA,mBAAmB,EAAE,iBAAiB,UAAU,iBAAiB,MAAM,IAAK,SAAS,EAAE,cAAc,EAAA,CAC1G;AAER;"}
1
+ {"version":3,"file":"BackButton.js","sources":["../../../src/ui/navigation/BackButton.jsx"],"sourcesContent":["// Botón de regreso por el ROUTER, no por un enlace fijo.\n//\n// navigate(-1) regresa a la entrada anterior del historial con sus parámetros intactos: los filtros, el orden, la\n// pestaña y la página que nuqs dejó en la URL de la lista siguen ahí. Un enlace fijo a la lista los perdería.\n//\n// Si alguien llegó directo (pegó el enlace del detalle, abrió en pestaña nueva, recargó después de un login) no hay\n// historial al que volver: se usa la última URL de la lista que se guardó en sessionStorage al salir de ella\n// (useRememberListUrl) y, si tampoco hay, fallbackTo.\n//\n// El TEXTO dice a dónde regresa: si la página anterior anotó su nombre de regreso (usePageName de navigationTrail.js),\n// se pinta ese («Regresar al detalle del pedido 15»); si no, o si no hay historial, el label que le pasen.\n//\n// Navega con la navegación del proveedor (ToolkitProvider), no con un router en particular.\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaBackButton con defaultProps, styleOverrides de\n// sus partes (root) y slots/slotProps para cambiarlas.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useToolkitNavigation} from '@/toolkit/toolkitContext.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport Button from '@mui/material/Button';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\n\nimport {recallListUrl} from '@/lastListUrl.js';\nimport {currentHistoryIndex, pageNameAt} from '@/navigationTrail.js';\nimport {piecePart, usePieceProps, withPieceSlots} from '@/theme/themePieces.js';\n\n// el nombre de la pieza en el tema y sus partes (theme.components.CalcitaBackButton)\nconst THEME_NAME = 'CalcitaBackButton';\nconst BackButtonRoot = piecePart(THEME_NAME, 'Root', Button);\n\n/**\n * @param {object} props\n * @param {string} props.fallbackTo ruta de la lista sin filtros (último respaldo)\n * @param {string} [props.listKey] la misma llave que usa useRememberListUrl en la lista\n * @param {string} [props.label] ya traducido; se usa cuando la página anterior no anotó su nombre o no hay historial\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nfunction BackButtonContent(props) {\n const {fallbackTo, listKey, label, texts, ...buttonProps} = usePieceProps(props, THEME_NAME);\n const {t} = useToolkitTranslation('common', texts);\n const {useNavigate} = useToolkitNavigation();\n const navigate = useNavigate();\n\n // react-router guarda en history.state un índice: 0 = primera entrada de esta pestaña en la app. Otro router no lo\n // guarda: entonces se toma como si no hubiera historial y se regresa a la última lista o a fallbackTo\n const historyIndex = currentHistoryIndex();\n const hasHistory = historyIndex > 0;\n const previousPageName = hasHistory ? pageNameAt(historyIndex - 1) : null;\n\n const goBack = () => {\n if (hasHistory) {\n navigate(-1);\n return;\n }\n navigate((listKey && recallListUrl(listKey)) || fallbackTo);\n };\n\n return (\n <BackButtonRoot size=\"small\" color=\"inherit\" startIcon={<ArrowBackIcon />} onClick={goBack} {...buttonProps}>\n {previousPageName ? t(previousPageName.labelKey, previousPageName.params) : (label ?? t('actions.back'))}\n </BackButtonRoot>\n );\n}\n\n// lo que se exporta: la pieza con slots y slotProps para cambiar sus partes (themePieces.js)\nconst BackButton = withPieceSlots(BackButtonContent, THEME_NAME);\nexport default BackButton;\n"],"names":[],"mappings":";;;;;;;;;AA4BA,MAAM,aAAa;AACnB,MAAM,iBAAiB,UAAU,YAAY,QAAQ,MAAM;AAS3D,SAAS,kBAAkB,OAAO;AAC9B,QAAM,EAAC,YAAY,SAAS,OAAO,OAAO,GAAG,gBAAe,cAAc,OAAO,UAAU;AAC3F,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AACjD,QAAM,EAAC,YAAA,IAAe,qBAAA;AACtB,QAAM,WAAW,YAAA;AAIjB,QAAM,eAAe,oBAAA;AACrB,QAAM,aAAa,eAAe;AAClC,QAAM,mBAAmB,aAAa,WAAW,eAAe,CAAC,IAAI;AAErE,QAAM,SAAS,MAAM;AACjB,QAAI,YAAY;AACZ,eAAS,EAAE;AACX;AAAA,IACJ;AACA,aAAU,WAAW,cAAc,OAAO,KAAM,UAAU;AAAA,EAC9D;AAEA,SACI,oBAAC,gBAAA,EAAe,MAAK,SAAQ,OAAM,WAAU,WAAW,oBAAC,eAAA,CAAA,CAAc,GAAI,SAAS,QAAS,GAAG,aAC3F,UAAA,mBAAmB,EAAE,iBAAiB,UAAU,iBAAiB,MAAM,IAAK,SAAS,EAAE,cAAc,EAAA,CAC1G;AAER;AAGA,MAAM,aAAa,eAAe,mBAAmB,UAAU;"}
@@ -8,11 +8,11 @@ import { useColorScheme } from "@mui/material/styles";
8
8
  import DarkModeIcon from "@mui/icons-material/DarkModeOutlined";
9
9
  import LightModeIcon from "@mui/icons-material/LightModeOutlined";
10
10
  import { nextColorModeOf } from "./colorMode.js";
11
- import { piecePart, usePieceProps } from "../../theme/themePieces.js";
11
+ import { piecePart, withPieceSlots, usePieceProps } from "../../theme/themePieces.js";
12
12
  import { warnUnknownProps } from "../../toolkit/unknownProps.js";
13
13
  const THEME_NAME = "CalcitaColorSchemeToggle";
14
14
  const SchemeButton = piecePart(THEME_NAME, "Button", IconButton);
15
- function ColorSchemeToggle(props) {
15
+ function ColorSchemeToggleContent(props) {
16
16
  const { size = "small", inverted = false, onChange, texts, ...unknownProps } = usePieceProps(props, THEME_NAME);
17
17
  warnUnknownProps(THEME_NAME, unknownProps);
18
18
  const { t } = useToolkitTranslation("common", texts);
@@ -40,6 +40,7 @@ function ColorSchemeToggle(props) {
40
40
  }
41
41
  ) });
42
42
  }
43
+ const ColorSchemeToggle = withPieceSlots(ColorSchemeToggleContent, THEME_NAME);
43
44
  export {
44
45
  ColorSchemeToggle as default
45
46
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ColorSchemeToggle.js","sources":["../../../src/ui/navigation/ColorSchemeToggle.jsx"],"sourcesContent":["// Interruptor de modo claro / oscuro.\n//\n// Dos estados visibles, no tres: el primer clic fija una preferencia explícita que ya se recuerda; para volver a seguir\n// al equipo está «Automático» en Apariencia (AppearanceSettings, en el menú de la cuenta). Recordar lo hace MUI:\n// setMode escribe en localStorage (con las llaves que el proyecto puso en su ThemeProvider) y un script\n// en el HTML la puede leer antes del primer pintado.\n//\n// Va en la cinta de escritorio, en el cajón del teléfono y en el inicio de sesión.\n//\n// El tooltip sale de i18n.\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaColorSchemeToggle con defaultProps y\n// styleOverrides de sus partes: button.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useEffect, useState} from 'react';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport {useColorScheme} from '@mui/material/styles';\nimport DarkModeIcon from '@mui/icons-material/DarkModeOutlined';\nimport LightModeIcon from '@mui/icons-material/LightModeOutlined';\n\nimport {nextColorModeOf} from '@/ui/navigation/colorMode.js';\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.CalcitaColorSchemeToggle)\nconst THEME_NAME = 'CalcitaColorSchemeToggle';\nconst SchemeButton = piecePart(THEME_NAME, 'Button', IconButton);\n\n/**\n * @param {object} [props]\n * @param {'small'|'medium'} [props.size]\n * @param {boolean} [props.inverted] ícono blanco para fondos oscuros\n * @param {(mode: 'light'|'dark'|'system') => void} [props.onChange] la persona cambió el modo (para guardarlo en su servidor)\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nexport default function ColorSchemeToggle(props) {\n // lo que el proyecto puso en su tema (components.CalcitaColorSchemeToggle.defaultProps) y encima lo que llega aquí\n const {size = 'small', inverted = false, onChange, texts, ...unknownProps} = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n const {t} = useToolkitTranslation('common', texts);\n const {mode, systemMode, setMode} = useColorScheme();\n\n // antes de montar en el cliente mode viene undefined: reservamos el lugar para que la barra no brinque\n const [isMounted, setIsMounted] = useState(false);\n useEffect(() => {\n setIsMounted(true);\n }, []);\n if (!isMounted || !mode) {\n return <SchemeButton size={size} disabled aria-hidden=\"true\" ownSx={{width: 34, height: 34}} />;\n }\n\n const nextMode = nextColorModeOf(mode, systemMode);\n const label = t(`colorScheme.switchTo.${nextMode}`);\n\n return (\n <Tooltip title={label}>\n <SchemeButton size={size} aria-label={label} onClick={() => {\n setMode(nextMode);\n onChange?.(nextMode);\n }}\n ownSx={{color: inverted ? 'common.white' : 'text.secondary'}}>\n {nextMode === 'light' ? <LightModeIcon fontSize=\"small\" /> : <DarkModeIcon fontSize=\"small\" />}\n </SchemeButton>\n </Tooltip>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AA4BA,MAAM,aAAa;AACnB,MAAM,eAAe,UAAU,YAAY,UAAU,UAAU;AAS/D,SAAwB,kBAAkB,OAAO;AAE7C,QAAM,EAAC,OAAO,SAAS,WAAW,OAAO,UAAU,OAAO,GAAG,aAAA,IAAgB,cAAc,OAAO,UAAU;AAC5G,mBAAiB,YAAY,YAAY;AACzC,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AACjD,QAAM,EAAC,MAAM,YAAY,QAAA,IAAW,eAAA;AAGpC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,YAAU,MAAM;AACZ,iBAAa,IAAI;AAAA,EACrB,GAAG,CAAA,CAAE;AACL,MAAI,CAAC,aAAa,CAAC,MAAM;AACrB,WAAO,oBAAC,cAAA,EAAa,MAAY,UAAQ,MAAC,eAAY,QAAO,OAAO,EAAC,OAAO,IAAI,QAAQ,KAAE,CAAG;AAAA,EACjG;AAEA,QAAM,WAAW,gBAAgB,MAAM,UAAU;AACjD,QAAM,QAAQ,EAAE,wBAAwB,QAAQ,EAAE;AAElD,SACI,oBAAC,SAAA,EAAQ,OAAO,OACZ,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MAAa;AAAA,MAAY,cAAY;AAAA,MAAO,SAAS,MAAM;AAC5C,gBAAQ,QAAQ;AAChB,mBAAW,QAAQ;AAAA,MACvB;AAAA,MACA,OAAO,EAAC,OAAO,WAAW,iBAAiB,iBAAA;AAAA,MAClD,UAAA,aAAa,UAAU,oBAAC,eAAA,EAAc,UAAS,SAAQ,IAAK,oBAAC,cAAA,EAAa,UAAS,QAAA,CAAQ;AAAA,IAAA;AAAA,EAAA,GAEpG;AAER;"}
1
+ {"version":3,"file":"ColorSchemeToggle.js","sources":["../../../src/ui/navigation/ColorSchemeToggle.jsx"],"sourcesContent":["// Interruptor de modo claro / oscuro.\n//\n// Dos estados visibles, no tres: el primer clic fija una preferencia explícita que ya se recuerda; para volver a seguir\n// al equipo está «Automático» en Apariencia (AppearanceSettings, en el menú de la cuenta). Recordar lo hace MUI:\n// setMode escribe en localStorage (con las llaves que el proyecto puso en su ThemeProvider) y un script\n// en el HTML la puede leer antes del primer pintado.\n//\n// Va en la cinta de escritorio, en el cajón del teléfono y en el inicio de sesión.\n//\n// El tooltip sale de i18n.\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaColorSchemeToggle con defaultProps y\n// styleOverrides de sus partes: button.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useEffect, useState} from 'react';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport {useColorScheme} from '@mui/material/styles';\nimport DarkModeIcon from '@mui/icons-material/DarkModeOutlined';\nimport LightModeIcon from '@mui/icons-material/LightModeOutlined';\n\nimport {nextColorModeOf} from '@/ui/navigation/colorMode.js';\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.CalcitaColorSchemeToggle)\nconst THEME_NAME = 'CalcitaColorSchemeToggle';\nconst SchemeButton = piecePart(THEME_NAME, 'Button', IconButton);\n\n/**\n * @param {object} [props]\n * @param {'small'|'medium'} [props.size]\n * @param {boolean} [props.inverted] ícono blanco para fondos oscuros\n * @param {(mode: 'light'|'dark'|'system') => void} [props.onChange] la persona cambió el modo (para guardarlo en su servidor)\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nfunction ColorSchemeToggleContent(props) {\n // lo que el proyecto puso en su tema (components.CalcitaColorSchemeToggle.defaultProps) y encima lo que llega aquí\n const {size = 'small', inverted = false, onChange, texts, ...unknownProps} = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n const {t} = useToolkitTranslation('common', texts);\n const {mode, systemMode, setMode} = useColorScheme();\n\n // antes de montar en el cliente mode viene undefined: reservamos el lugar para que la barra no brinque\n const [isMounted, setIsMounted] = useState(false);\n useEffect(() => {\n setIsMounted(true);\n }, []);\n if (!isMounted || !mode) {\n return <SchemeButton size={size} disabled aria-hidden=\"true\" ownSx={{width: 34, height: 34}} />;\n }\n\n const nextMode = nextColorModeOf(mode, systemMode);\n const label = t(`colorScheme.switchTo.${nextMode}`);\n\n return (\n <Tooltip title={label}>\n <SchemeButton size={size} aria-label={label} onClick={() => {\n setMode(nextMode);\n onChange?.(nextMode);\n }}\n ownSx={{color: inverted ? 'common.white' : 'text.secondary'}}>\n {nextMode === 'light' ? <LightModeIcon fontSize=\"small\" /> : <DarkModeIcon fontSize=\"small\" />}\n </SchemeButton>\n </Tooltip>\n );\n}\n\n// lo que se exporta: la pieza con slots y slotProps para cambiar sus partes (themePieces.js)\nconst ColorSchemeToggle = withPieceSlots(ColorSchemeToggleContent, THEME_NAME);\nexport default ColorSchemeToggle;\n"],"names":[],"mappings":";;;;;;;;;;;;AA4BA,MAAM,aAAa;AACnB,MAAM,eAAe,UAAU,YAAY,UAAU,UAAU;AAS/D,SAAS,yBAAyB,OAAO;AAErC,QAAM,EAAC,OAAO,SAAS,WAAW,OAAO,UAAU,OAAO,GAAG,aAAA,IAAgB,cAAc,OAAO,UAAU;AAC5G,mBAAiB,YAAY,YAAY;AACzC,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AACjD,QAAM,EAAC,MAAM,YAAY,QAAA,IAAW,eAAA;AAGpC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,YAAU,MAAM;AACZ,iBAAa,IAAI;AAAA,EACrB,GAAG,CAAA,CAAE;AACL,MAAI,CAAC,aAAa,CAAC,MAAM;AACrB,WAAO,oBAAC,cAAA,EAAa,MAAY,UAAQ,MAAC,eAAY,QAAO,OAAO,EAAC,OAAO,IAAI,QAAQ,KAAE,CAAG;AAAA,EACjG;AAEA,QAAM,WAAW,gBAAgB,MAAM,UAAU;AACjD,QAAM,QAAQ,EAAE,wBAAwB,QAAQ,EAAE;AAElD,SACI,oBAAC,SAAA,EAAQ,OAAO,OACZ,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MAAa;AAAA,MAAY,cAAY;AAAA,MAAO,SAAS,MAAM;AAC5C,gBAAQ,QAAQ;AAChB,mBAAW,QAAQ;AAAA,MACvB;AAAA,MACA,OAAO,EAAC,OAAO,WAAW,iBAAiB,iBAAA;AAAA,MAClD,UAAA,aAAa,UAAU,oBAAC,eAAA,EAAc,UAAS,SAAQ,IAAK,oBAAC,cAAA,EAAa,UAAS,QAAA,CAAQ;AAAA,IAAA;AAAA,EAAA,GAEpG;AAER;AAGA,MAAM,oBAAoB,eAAe,0BAA0B,UAAU;"}
@@ -9,11 +9,11 @@ import MenuItem from "@mui/material/MenuItem";
9
9
  import Tooltip from "@mui/material/Tooltip";
10
10
  import FormatSizeIcon from "@mui/icons-material/FormatSize";
11
11
  import { useFontSize } from "./useFontSize.js";
12
- import { piecePart, usePieceProps } from "../../theme/themePieces.js";
12
+ import { piecePart, withPieceSlots, usePieceProps } from "../../theme/themePieces.js";
13
13
  import { warnUnknownProps } from "../../toolkit/unknownProps.js";
14
14
  const THEME_NAME = "CalcitaFontSizeToggle";
15
15
  const FontSizeButton = piecePart(THEME_NAME, "Button", IconButton);
16
- function FontSizeToggle(props) {
16
+ function FontSizeToggleContent(props) {
17
17
  const { size = "small", onChange, texts, ...unknownProps } = usePieceProps(props, THEME_NAME);
18
18
  warnUnknownProps(THEME_NAME, unknownProps);
19
19
  const { t } = useToolkitTranslation("layout", texts);
@@ -41,6 +41,7 @@ function FontSizeToggle(props) {
41
41
  )
42
42
  ] });
43
43
  }
44
+ const FontSizeToggle = withPieceSlots(FontSizeToggleContent, THEME_NAME);
44
45
  export {
45
46
  FontSizeToggle as default
46
47
  };
@@ -1 +1 @@
1
- {"version":3,"file":"FontSizeToggle.js","sources":["../../../src/ui/navigation/FontSizeToggle.jsx"],"sourcesContent":["// El botón del tamaño de letra (normal, grande, muy grande), del tema de walk-ot: para quien lee con lentes o en una\n// pantalla chica. Va en la barra de escritorio; en el teléfono vive en el menú de ajustes.\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaFontSizeToggle con defaultProps y\n// styleOverrides de sus partes: button.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useState} from 'react';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport IconButton from '@mui/material/IconButton';\nimport ListItemText from '@mui/material/ListItemText';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport Tooltip from '@mui/material/Tooltip';\nimport FormatSizeIcon from '@mui/icons-material/FormatSize';\n\nimport {useFontSize} from '@/ui/navigation/useFontSize.js';\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.CalcitaFontSizeToggle)\nconst THEME_NAME = 'CalcitaFontSizeToggle';\nconst FontSizeButton = piecePart(THEME_NAME, 'Button', IconButton);\n\n/**\n * @param {object} [props]\n * @param {'small'|'medium'} [props.size]\n * @param {(level: string) => void} [props.onChange] la persona eligió otro tamaño (FONT_SIZE_LEVELS; para guardarlo en su servidor)\n * @param {object} [props.texts] los textos que cambian, con la forma de `layout` en los textos del paquete\n */\nexport default function FontSizeToggle(props) {\n // lo que el proyecto puso en su tema (components.CalcitaFontSizeToggle.defaultProps) y encima lo que llega aquí\n const {size = 'small', onChange, texts, ...unknownProps} = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n const {t} = useToolkitTranslation('layout', texts);\n const {level, setLevel, isMounted, levels} = useFontSize();\n const [anchorElement, setAnchorElement] = useState(null);\n\n // antes de montar no se sabe el nivel guardado: se reserva el lugar para que la barra no brinque\n if (!isMounted) {\n return <FontSizeButton size={size} disabled aria-hidden=\"true\" ownSx={{width: 34, height: 34}} />;\n }\n\n const chooseLevel = (levelKey) => {\n setLevel(levelKey);\n setAnchorElement(null);\n onChange?.(levelKey);\n };\n\n return (\n <>\n <Tooltip title={t('fontSize.label')}>\n <IconButton size={size} aria-label={t('fontSize.label')} aria-haspopup=\"menu\" onClick={(event) => setAnchorElement(event.currentTarget)}>\n <FormatSizeIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n <Menu anchorEl={anchorElement} open={Boolean(anchorElement)} onClose={() => setAnchorElement(null)}\n slotProps={{paper: {sx: {minWidth: 200}}}}>\n {levels.map((option) => (\n <MenuItem key={option.key} selected={option.key === level} onClick={() => chooseLevel(option.key)}>\n <ListItemText primary={t(option.labelKey)} slotProps={{primary: {sx: {fontWeight: option.key === level ? 600 : 400}}}} />\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AAqBA,MAAM,aAAa;AACnB,MAAM,iBAAiB,UAAU,YAAY,UAAU,UAAU;AAQjE,SAAwB,eAAe,OAAO;AAE1C,QAAM,EAAC,OAAO,SAAS,UAAU,OAAO,GAAG,iBAAgB,cAAc,OAAO,UAAU;AAC1F,mBAAiB,YAAY,YAAY;AACzC,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AACjD,QAAM,EAAC,OAAO,UAAU,WAAW,OAAA,IAAU,YAAA;AAC7C,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,IAAI;AAGvD,MAAI,CAAC,WAAW;AACZ,WAAO,oBAAC,gBAAA,EAAe,MAAY,UAAQ,MAAC,eAAY,QAAO,OAAO,EAAC,OAAO,IAAI,QAAQ,KAAE,CAAG;AAAA,EACnG;AAEA,QAAM,cAAc,CAAC,aAAa;AAC9B,aAAS,QAAQ;AACjB,qBAAiB,IAAI;AACrB,eAAW,QAAQ;AAAA,EACvB;AAEA,SACI,qBAAA,UAAA,EACI,UAAA;AAAA,IAAA,oBAAC,SAAA,EAAQ,OAAO,EAAE,gBAAgB,GAC9B,UAAA,oBAAC,YAAA,EAAW,MAAY,cAAY,EAAE,gBAAgB,GAAG,iBAAc,QAAO,SAAS,CAAC,UAAU,iBAAiB,MAAM,aAAa,GAClI,UAAA,oBAAC,gBAAA,EAAe,UAAS,QAAA,CAAQ,EAAA,CACrC,EAAA,CACJ;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QAAK,UAAU;AAAA,QAAe,MAAM,QAAQ,aAAa;AAAA,QAAG,SAAS,MAAM,iBAAiB,IAAI;AAAA,QAC3F,WAAW,EAAC,OAAO,EAAC,IAAI,EAAC,UAAU,IAAA,IAAI;AAAA,QACxC,iBAAO,IAAI,CAAC,WACT,oBAAC,UAAA,EAA0B,UAAU,OAAO,QAAQ,OAAO,SAAS,MAAM,YAAY,OAAO,GAAG,GAC5F,UAAA,oBAAC,gBAAa,SAAS,EAAE,OAAO,QAAQ,GAAG,WAAW,EAAC,SAAS,EAAC,IAAI,EAAC,YAAY,OAAO,QAAQ,QAAQ,MAAM,MAAG,EAAC,GAAI,EAAA,GAD5G,OAAO,GAEtB,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EACL,GACJ;AAER;"}
1
+ {"version":3,"file":"FontSizeToggle.js","sources":["../../../src/ui/navigation/FontSizeToggle.jsx"],"sourcesContent":["// El botón del tamaño de letra (normal, grande, muy grande), del tema de walk-ot: para quien lee con lentes o en una\n// pantalla chica. Va en la barra de escritorio; en el teléfono vive en el menú de ajustes.\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaFontSizeToggle con defaultProps y\n// styleOverrides de sus partes: button.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useState} from 'react';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport IconButton from '@mui/material/IconButton';\nimport ListItemText from '@mui/material/ListItemText';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport Tooltip from '@mui/material/Tooltip';\nimport FormatSizeIcon from '@mui/icons-material/FormatSize';\n\nimport {useFontSize} from '@/ui/navigation/useFontSize.js';\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.CalcitaFontSizeToggle)\nconst THEME_NAME = 'CalcitaFontSizeToggle';\nconst FontSizeButton = piecePart(THEME_NAME, 'Button', IconButton);\n\n/**\n * @param {object} [props]\n * @param {'small'|'medium'} [props.size]\n * @param {(level: string) => void} [props.onChange] la persona eligió otro tamaño (FONT_SIZE_LEVELS; para guardarlo en su servidor)\n * @param {object} [props.texts] los textos que cambian, con la forma de `layout` en los textos del paquete\n */\nfunction FontSizeToggleContent(props) {\n // lo que el proyecto puso en su tema (components.CalcitaFontSizeToggle.defaultProps) y encima lo que llega aquí\n const {size = 'small', onChange, texts, ...unknownProps} = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n const {t} = useToolkitTranslation('layout', texts);\n const {level, setLevel, isMounted, levels} = useFontSize();\n const [anchorElement, setAnchorElement] = useState(null);\n\n // antes de montar no se sabe el nivel guardado: se reserva el lugar para que la barra no brinque\n if (!isMounted) {\n return <FontSizeButton size={size} disabled aria-hidden=\"true\" ownSx={{width: 34, height: 34}} />;\n }\n\n const chooseLevel = (levelKey) => {\n setLevel(levelKey);\n setAnchorElement(null);\n onChange?.(levelKey);\n };\n\n return (\n <>\n <Tooltip title={t('fontSize.label')}>\n <IconButton size={size} aria-label={t('fontSize.label')} aria-haspopup=\"menu\" onClick={(event) => setAnchorElement(event.currentTarget)}>\n <FormatSizeIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n <Menu anchorEl={anchorElement} open={Boolean(anchorElement)} onClose={() => setAnchorElement(null)}\n slotProps={{paper: {sx: {minWidth: 200}}}}>\n {levels.map((option) => (\n <MenuItem key={option.key} selected={option.key === level} onClick={() => chooseLevel(option.key)}>\n <ListItemText primary={t(option.labelKey)} slotProps={{primary: {sx: {fontWeight: option.key === level ? 600 : 400}}}} />\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n}\n\n// lo que se exporta: la pieza con slots y slotProps para cambiar sus partes (themePieces.js)\nconst FontSizeToggle = withPieceSlots(FontSizeToggleContent, THEME_NAME);\nexport default FontSizeToggle;\n"],"names":[],"mappings":";;;;;;;;;;;;;AAqBA,MAAM,aAAa;AACnB,MAAM,iBAAiB,UAAU,YAAY,UAAU,UAAU;AAQjE,SAAS,sBAAsB,OAAO;AAElC,QAAM,EAAC,OAAO,SAAS,UAAU,OAAO,GAAG,iBAAgB,cAAc,OAAO,UAAU;AAC1F,mBAAiB,YAAY,YAAY;AACzC,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AACjD,QAAM,EAAC,OAAO,UAAU,WAAW,OAAA,IAAU,YAAA;AAC7C,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,IAAI;AAGvD,MAAI,CAAC,WAAW;AACZ,WAAO,oBAAC,gBAAA,EAAe,MAAY,UAAQ,MAAC,eAAY,QAAO,OAAO,EAAC,OAAO,IAAI,QAAQ,KAAE,CAAG;AAAA,EACnG;AAEA,QAAM,cAAc,CAAC,aAAa;AAC9B,aAAS,QAAQ;AACjB,qBAAiB,IAAI;AACrB,eAAW,QAAQ;AAAA,EACvB;AAEA,SACI,qBAAA,UAAA,EACI,UAAA;AAAA,IAAA,oBAAC,SAAA,EAAQ,OAAO,EAAE,gBAAgB,GAC9B,UAAA,oBAAC,YAAA,EAAW,MAAY,cAAY,EAAE,gBAAgB,GAAG,iBAAc,QAAO,SAAS,CAAC,UAAU,iBAAiB,MAAM,aAAa,GAClI,UAAA,oBAAC,gBAAA,EAAe,UAAS,QAAA,CAAQ,EAAA,CACrC,EAAA,CACJ;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QAAK,UAAU;AAAA,QAAe,MAAM,QAAQ,aAAa;AAAA,QAAG,SAAS,MAAM,iBAAiB,IAAI;AAAA,QAC3F,WAAW,EAAC,OAAO,EAAC,IAAI,EAAC,UAAU,IAAA,IAAI;AAAA,QACxC,iBAAO,IAAI,CAAC,WACT,oBAAC,UAAA,EAA0B,UAAU,OAAO,QAAQ,OAAO,SAAS,MAAM,YAAY,OAAO,GAAG,GAC5F,UAAA,oBAAC,gBAAa,SAAS,EAAE,OAAO,QAAQ,GAAG,WAAW,EAAC,SAAS,EAAC,IAAI,EAAC,YAAY,OAAO,QAAQ,QAAQ,MAAM,MAAG,EAAC,GAAI,EAAA,GAD5G,OAAO,GAEtB,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EACL,GACJ;AAER;AAGA,MAAM,iBAAiB,eAAe,uBAAuB,UAAU;"}
@@ -7,12 +7,12 @@ import MenuItem from "@mui/material/MenuItem";
7
7
  import { useToolkitSettings } from "../../toolkit/toolkitContext.js";
8
8
  import { DEFAULT_LANGUAGES } from "../../toolkit/toolkitSettings.js";
9
9
  import { useToolkitTranslation } from "../../toolkit/useToolkitTranslation.js";
10
- import { piecePart, usePieceProps } from "../../theme/themePieces.js";
10
+ import { piecePart, withPieceSlots, usePieceProps } from "../../theme/themePieces.js";
11
11
  import { warnUnknownProps } from "../../toolkit/unknownProps.js";
12
12
  const THEME_NAME = "CalcitaLanguageToggle";
13
13
  const LanguageButton = piecePart(THEME_NAME, "Button", Button);
14
14
  const LANGUAGES = Object.freeze(DEFAULT_LANGUAGES.map((entry) => entry.code));
15
- function LanguageToggle(props) {
15
+ function LanguageToggleContent(props) {
16
16
  const { inverted = false, onChange, texts, ...unknownProps } = usePieceProps(props, THEME_NAME);
17
17
  warnUnknownProps(THEME_NAME, unknownProps);
18
18
  const { t, language, changeLanguage } = useToolkitTranslation("common", texts);
@@ -47,6 +47,7 @@ function LanguageToggle(props) {
47
47
  /* @__PURE__ */ jsx(Menu, { anchorEl: menuAnchor, open: Boolean(menuAnchor), onClose: () => setMenuAnchor(null), children: languages.map((entry) => /* @__PURE__ */ jsx(MenuItem, { lang: entry.code, selected: entry.code === current.code, onClick: () => choose(entry.code), children: entry.label }, entry.code)) })
48
48
  ] });
49
49
  }
50
+ const LanguageToggle = withPieceSlots(LanguageToggleContent, THEME_NAME);
50
51
  export {
51
52
  LANGUAGES,
52
53
  LanguageToggle as default