@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
@@ -0,0 +1,57 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import Button from "@mui/material/Button";
5
+ import Popover from "@mui/material/Popover";
6
+ import Stack from "@mui/material/Stack";
7
+ import TextInput from "../inputs/TextInput.js";
8
+ import { linkUrlOf } from "./richTextRules.js";
9
+ function RichTextLinkPopover({ anchorElement, initialUrl, onSave, onRemove, onClose, t }) {
10
+ const [typedUrl, setTypedUrl] = useState(initialUrl);
11
+ const [isRejected, setIsRejected] = useState(false);
12
+ const save = () => {
13
+ const url = linkUrlOf(typedUrl);
14
+ if (!url) {
15
+ setIsRejected(true);
16
+ return;
17
+ }
18
+ onSave(url);
19
+ };
20
+ return /* @__PURE__ */ jsx(
21
+ Popover,
22
+ {
23
+ open: Boolean(anchorElement),
24
+ anchorEl: anchorElement,
25
+ onClose,
26
+ anchorOrigin: { vertical: "bottom", horizontal: "left" },
27
+ slotProps: { paper: { sx: { p: 2, width: 340, maxWidth: "calc(100vw - 32px)" } } },
28
+ children: /* @__PURE__ */ jsxs("form", { noValidate: true, onSubmit: (event) => {
29
+ event.preventDefault();
30
+ save();
31
+ }, children: [
32
+ /* @__PURE__ */ jsx(
33
+ TextInput,
34
+ {
35
+ label: t("linkDialog.url"),
36
+ value: typedUrl,
37
+ autoFocus: true,
38
+ placeholder: "https://",
39
+ onChange: (value) => {
40
+ setTypedUrl(value);
41
+ setIsRejected(false);
42
+ },
43
+ error: isRejected ? t("linkDialog.invalid") : void 0
44
+ }
45
+ ),
46
+ /* @__PURE__ */ jsxs(Stack, { direction: "row", sx: { gap: 1, justifyContent: "flex-end" }, children: [
47
+ initialUrl && /* @__PURE__ */ jsx(Button, { color: "error", onClick: onRemove, children: t("linkDialog.remove") }),
48
+ /* @__PURE__ */ jsx(Button, { type: "submit", variant: "contained", children: t("linkDialog.save") })
49
+ ] })
50
+ ] })
51
+ }
52
+ );
53
+ }
54
+ export {
55
+ RichTextLinkPopover as default
56
+ };
57
+ //# sourceMappingURL=RichTextLinkPopover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RichTextLinkPopover.js","sources":["../../src/richText/RichTextLinkPopover.jsx"],"sourcesContent":["// La ventanita para poner o cambiar la liga del texto elegido: la dirección (solo https, http, mailto o tel; un dominio suelto\n// se completa con https://), «Poner la liga» y «Quitar». Una dirección que no se acepta se dice en su campo.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useState} from 'react';\nimport Button from '@mui/material/Button';\nimport Popover from '@mui/material/Popover';\nimport Stack from '@mui/material/Stack';\n\nimport TextInput from '@/inputs/TextInput.jsx';\nimport {linkUrlOf} from '@/richText/richTextRules.js';\n\n/**\n * @param {object} props\n * @param {HTMLElement|null} props.anchorElement el botón de la liga (null: cerrada)\n * @param {string} props.initialUrl la liga que ya tiene el texto ('' si no tiene)\n * @param {(url: string) => void} props.onSave recibe la dirección ya revisada\n * @param {() => void} props.onRemove\n * @param {() => void} props.onClose\n * @param {(key: string) => string} props.t el traductor del editor\n */\nexport default function RichTextLinkPopover({anchorElement, initialUrl, onSave, onRemove, onClose, t}) {\n const [typedUrl, setTypedUrl] = useState(initialUrl);\n const [isRejected, setIsRejected] = useState(false);\n\n const save = () => {\n const url = linkUrlOf(typedUrl);\n if (!url) {\n setIsRejected(true);\n return;\n }\n onSave(url);\n };\n\n return (\n <Popover open={Boolean(anchorElement)} anchorEl={anchorElement} onClose={onClose}\n anchorOrigin={{vertical: 'bottom', horizontal: 'left'}} slotProps={{paper: {sx: {p: 2, width: 340, maxWidth: 'calc(100vw - 32px)'}}}}>\n <form noValidate onSubmit={(event) => {\n event.preventDefault();\n save();\n }}>\n <TextInput label={t('linkDialog.url')} value={typedUrl} autoFocus placeholder=\"https://\"\n onChange={(value) => {\n setTypedUrl(value);\n setIsRejected(false);\n }}\n error={isRejected ? t('linkDialog.invalid') : undefined} />\n <Stack direction=\"row\" sx={{gap: 1, justifyContent: 'flex-end'}}>\n {initialUrl && <Button color=\"error\" onClick={onRemove}>{t('linkDialog.remove')}</Button>}\n <Button type=\"submit\" variant=\"contained\">{t('linkDialog.save')}</Button>\n </Stack>\n </form>\n </Popover>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAqBA,SAAwB,oBAAoB,EAAC,eAAe,YAAY,QAAQ,UAAU,SAAS,KAAI;AACnG,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,UAAU;AACnD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAElD,QAAM,OAAO,MAAM;AACf,UAAM,MAAM,UAAU,QAAQ;AAC9B,QAAI,CAAC,KAAK;AACN,oBAAc,IAAI;AAClB;AAAA,IACJ;AACA,WAAO,GAAG;AAAA,EACd;AAEA,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MAAQ,MAAM,QAAQ,aAAa;AAAA,MAAG,UAAU;AAAA,MAAe;AAAA,MACvD,cAAc,EAAC,UAAU,UAAU,YAAY,OAAA;AAAA,MAAS,WAAW,EAAC,OAAO,EAAC,IAAI,EAAC,GAAG,GAAG,OAAO,KAAK,UAAU,qBAAA,IAAqB;AAAA,MACvI,+BAAC,QAAA,EAAK,YAAU,MAAC,UAAU,CAAC,UAAU;AAClC,cAAM,eAAA;AACN,aAAA;AAAA,MACJ,GACI,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YAAU,OAAO,EAAE,gBAAgB;AAAA,YAAG,OAAO;AAAA,YAAU,WAAS;AAAA,YAAC,aAAY;AAAA,YACnE,UAAU,CAAC,UAAU;AACjB,0BAAY,KAAK;AACjB,4BAAc,KAAK;AAAA,YACvB;AAAA,YACA,OAAO,aAAa,EAAE,oBAAoB,IAAI;AAAA,UAAA;AAAA,QAAA;AAAA,QACzD,qBAAC,OAAA,EAAM,WAAU,OAAM,IAAI,EAAC,KAAK,GAAG,gBAAgB,WAAA,GAC/C,UAAA;AAAA,UAAA,cAAc,oBAAC,UAAO,OAAM,SAAQ,SAAS,UAAW,UAAA,EAAE,mBAAmB,EAAA,CAAE;AAAA,UAChF,oBAAC,UAAO,MAAK,UAAS,SAAQ,aAAa,UAAA,EAAE,iBAAiB,EAAA,CAAE;AAAA,QAAA,EAAA,CACpE;AAAA,MAAA,EAAA,CACJ;AAAA,IAAA;AAAA,EAAA;AAGZ;"}
@@ -0,0 +1,189 @@
1
+ "use client";
2
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
3
+ import { useState, useRef } from "react";
4
+ import { useEditorState } from "@tiptap/react";
5
+ import Divider from "@mui/material/Divider";
6
+ import IconButton from "@mui/material/IconButton";
7
+ import MenuItem from "@mui/material/MenuItem";
8
+ import Select from "@mui/material/Select";
9
+ import Tooltip from "@mui/material/Tooltip";
10
+ import CodeIcon from "@mui/icons-material/Code";
11
+ import FormatAlignCenterIcon from "@mui/icons-material/FormatAlignCenter";
12
+ import FormatAlignLeftIcon from "@mui/icons-material/FormatAlignLeft";
13
+ import FormatAlignRightIcon from "@mui/icons-material/FormatAlignRight";
14
+ import FormatBoldIcon from "@mui/icons-material/FormatBold";
15
+ import FormatClearIcon from "@mui/icons-material/FormatClear";
16
+ import FormatItalicIcon from "@mui/icons-material/FormatItalic";
17
+ import FormatListBulletedIcon from "@mui/icons-material/FormatListBulleted";
18
+ import FormatListNumberedIcon from "@mui/icons-material/FormatListNumbered";
19
+ import FormatQuoteIcon from "@mui/icons-material/FormatQuote";
20
+ import FormatStrikethroughIcon from "@mui/icons-material/FormatStrikethrough";
21
+ import FormatUnderlinedIcon from "@mui/icons-material/FormatUnderlined";
22
+ import InsertLinkIcon from "@mui/icons-material/InsertLink";
23
+ import RedoIcon from "@mui/icons-material/Redo";
24
+ import UndoIcon from "@mui/icons-material/Undo";
25
+ import { RICH_TEXT_HEADING_LEVELS } from "./richTextExtensions.js";
26
+ import RichTextLinkPopover from "./RichTextLinkPopover.js";
27
+ import { RICH_TEXT_FEATURE } from "./richTextRules.js";
28
+ const PARAGRAPH_STYLE = "paragraph";
29
+ const headingStyleOf = (level) => `heading${level}`;
30
+ const TEXT_ALIGNMENTS = Object.freeze([
31
+ { value: "left", Icon: FormatAlignLeftIcon },
32
+ { value: "center", Icon: FormatAlignCenterIcon },
33
+ { value: "right", Icon: FormatAlignRightIcon }
34
+ ]);
35
+ const MARK_BUTTONS = Object.freeze([
36
+ { feature: RICH_TEXT_FEATURE.bold, mark: "bold", Icon: FormatBoldIcon, toggle: (chain) => chain.toggleBold() },
37
+ { feature: RICH_TEXT_FEATURE.italic, mark: "italic", Icon: FormatItalicIcon, toggle: (chain) => chain.toggleItalic() },
38
+ { feature: RICH_TEXT_FEATURE.underline, mark: "underline", Icon: FormatUnderlinedIcon, toggle: (chain) => chain.toggleUnderline() },
39
+ { feature: RICH_TEXT_FEATURE.strike, mark: "strike", Icon: FormatStrikethroughIcon, toggle: (chain) => chain.toggleStrike() }
40
+ ]);
41
+ const BLOCK_BUTTONS = Object.freeze([
42
+ { feature: RICH_TEXT_FEATURE.bulletList, node: "bulletList", Icon: FormatListBulletedIcon, toggle: (chain) => chain.toggleBulletList() },
43
+ { feature: RICH_TEXT_FEATURE.orderedList, node: "orderedList", Icon: FormatListNumberedIcon, toggle: (chain) => chain.toggleOrderedList() },
44
+ { feature: RICH_TEXT_FEATURE.blockquote, node: "blockquote", Icon: FormatQuoteIcon, toggle: (chain) => chain.toggleBlockquote() },
45
+ { feature: RICH_TEXT_FEATURE.codeBlock, node: "codeBlock", Icon: CodeIcon, toggle: (chain) => chain.toggleCodeBlock() }
46
+ ]);
47
+ function ToolbarButton({ label, isActive, disabled, onClick, children }) {
48
+ return /* @__PURE__ */ jsx(Tooltip, { title: label, children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(
49
+ IconButton,
50
+ {
51
+ size: "small",
52
+ "aria-label": label,
53
+ "aria-pressed": isActive ?? void 0,
54
+ disabled,
55
+ color: isActive ? "primary" : "default",
56
+ onMouseDown: (event) => event.preventDefault(),
57
+ onClick,
58
+ sx: isActive ? { bgcolor: "action.selected" } : void 0,
59
+ children
60
+ }
61
+ ) }) });
62
+ }
63
+ function RichTextToolbar({ editor, features, disabled, t, actions }) {
64
+ const [linkAnchor, setLinkAnchor] = useState(null);
65
+ const linkButtonRef = useRef(null);
66
+ const has = (feature) => features.includes(feature);
67
+ const state = useEditorState({
68
+ editor,
69
+ selector: ({ editor: current }) => {
70
+ if (!current) {
71
+ return null;
72
+ }
73
+ const headingLevel = RICH_TEXT_HEADING_LEVELS.find((level) => current.isActive("heading", { level }));
74
+ return {
75
+ marks: Object.fromEntries(MARK_BUTTONS.filter(({ feature }) => has(feature)).map(({ mark }) => [mark, current.isActive(mark)])),
76
+ blocks: Object.fromEntries(BLOCK_BUTTONS.filter(({ feature }) => has(feature)).map(({ node }) => [node, current.isActive(node)])),
77
+ textStyle: headingLevel ? headingStyleOf(headingLevel) : PARAGRAPH_STYLE,
78
+ alignment: TEXT_ALIGNMENTS.find(({ value }) => current.isActive({ textAlign: value }))?.value ?? TEXT_ALIGNMENTS[0].value,
79
+ isLink: has(RICH_TEXT_FEATURE.link) && current.isActive("link"),
80
+ linkHref: has(RICH_TEXT_FEATURE.link) ? current.getAttributes("link").href ?? "" : "",
81
+ canUndo: has(RICH_TEXT_FEATURE.history) && current.can().undo(),
82
+ canRedo: has(RICH_TEXT_FEATURE.history) && current.can().redo()
83
+ };
84
+ }
85
+ });
86
+ if (!editor || !state) {
87
+ return null;
88
+ }
89
+ const chain = () => editor.chain().focus();
90
+ const isDisabled = disabled || !editor.isEditable;
91
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
92
+ has(RICH_TEXT_FEATURE.textStyle) && /* @__PURE__ */ jsxs(
93
+ Select,
94
+ {
95
+ size: "small",
96
+ variant: "standard",
97
+ disableUnderline: true,
98
+ value: state.textStyle,
99
+ disabled: isDisabled,
100
+ inputProps: { "aria-label": t("toolbar.textStyle") },
101
+ sx: { minWidth: 110, mx: 0.5, fontSize: 14 },
102
+ onChange: (event) => {
103
+ const style = event.target.value;
104
+ const level = RICH_TEXT_HEADING_LEVELS.find((candidate) => headingStyleOf(candidate) === style);
105
+ (level ? chain().setHeading({ level }) : chain().setParagraph()).run();
106
+ },
107
+ children: [
108
+ /* @__PURE__ */ jsx(MenuItem, { value: PARAGRAPH_STYLE, children: t("toolbar.paragraph") }),
109
+ RICH_TEXT_HEADING_LEVELS.map((level) => /* @__PURE__ */ jsx(MenuItem, { value: headingStyleOf(level), children: t(`toolbar.${headingStyleOf(level)}`) }, level))
110
+ ]
111
+ }
112
+ ),
113
+ MARK_BUTTONS.filter(({ feature }) => has(feature)).map(({ feature, mark, Icon, toggle }) => /* @__PURE__ */ jsx(
114
+ ToolbarButton,
115
+ {
116
+ label: t(`toolbar.${feature}`),
117
+ isActive: state.marks[mark],
118
+ disabled: isDisabled,
119
+ onClick: () => toggle(chain()).run(),
120
+ children: /* @__PURE__ */ jsx(Icon, { fontSize: "small" })
121
+ },
122
+ feature
123
+ )),
124
+ /* @__PURE__ */ jsx(Divider, { orientation: "vertical", flexItem: true, sx: { mx: 0.5 } }),
125
+ BLOCK_BUTTONS.filter(({ feature }) => has(feature)).map(({ feature, node, Icon, toggle }) => /* @__PURE__ */ jsx(
126
+ ToolbarButton,
127
+ {
128
+ label: t(`toolbar.${feature}`),
129
+ isActive: state.blocks[node],
130
+ disabled: isDisabled,
131
+ onClick: () => toggle(chain()).run(),
132
+ children: /* @__PURE__ */ jsx(Icon, { fontSize: "small" })
133
+ },
134
+ feature
135
+ )),
136
+ has(RICH_TEXT_FEATURE.link) && /* @__PURE__ */ jsx("span", { ref: linkButtonRef, children: /* @__PURE__ */ jsx(
137
+ ToolbarButton,
138
+ {
139
+ label: t("toolbar.link"),
140
+ isActive: state.isLink,
141
+ disabled: isDisabled,
142
+ onClick: () => setLinkAnchor(linkButtonRef.current),
143
+ children: /* @__PURE__ */ jsx(InsertLinkIcon, { fontSize: "small" })
144
+ }
145
+ ) }),
146
+ has(RICH_TEXT_FEATURE.align) && /* @__PURE__ */ jsxs(Fragment, { children: [
147
+ /* @__PURE__ */ jsx(Divider, { orientation: "vertical", flexItem: true, sx: { mx: 0.5 } }),
148
+ TEXT_ALIGNMENTS.map(({ value, Icon }) => /* @__PURE__ */ jsx(
149
+ ToolbarButton,
150
+ {
151
+ label: t(`toolbar.align.${value}`),
152
+ isActive: state.alignment === value,
153
+ disabled: isDisabled,
154
+ onClick: () => chain().setTextAlign(value).run(),
155
+ children: /* @__PURE__ */ jsx(Icon, { fontSize: "small" })
156
+ },
157
+ value
158
+ ))
159
+ ] }),
160
+ has(RICH_TEXT_FEATURE.clear) && /* @__PURE__ */ jsx(ToolbarButton, { label: t("toolbar.clear"), disabled: isDisabled, onClick: () => chain().unsetAllMarks().clearNodes().run(), children: /* @__PURE__ */ jsx(FormatClearIcon, { fontSize: "small" }) }),
161
+ has(RICH_TEXT_FEATURE.history) && /* @__PURE__ */ jsxs(Fragment, { children: [
162
+ /* @__PURE__ */ jsx(Divider, { orientation: "vertical", flexItem: true, sx: { mx: 0.5 } }),
163
+ /* @__PURE__ */ jsx(ToolbarButton, { label: t("toolbar.undo"), disabled: isDisabled || !state.canUndo, onClick: () => chain().undo().run(), children: /* @__PURE__ */ jsx(UndoIcon, { fontSize: "small" }) }),
164
+ /* @__PURE__ */ jsx(ToolbarButton, { label: t("toolbar.redo"), disabled: isDisabled || !state.canRedo, onClick: () => chain().redo().run(), children: /* @__PURE__ */ jsx(RedoIcon, { fontSize: "small" }) })
165
+ ] }),
166
+ actions,
167
+ linkAnchor && /* @__PURE__ */ jsx(
168
+ RichTextLinkPopover,
169
+ {
170
+ anchorElement: linkAnchor,
171
+ initialUrl: state.linkHref,
172
+ t,
173
+ onClose: () => setLinkAnchor(null),
174
+ onSave: (url) => {
175
+ chain().extendMarkRange("link").setLink({ href: url }).run();
176
+ setLinkAnchor(null);
177
+ },
178
+ onRemove: () => {
179
+ chain().extendMarkRange("link").unsetLink().run();
180
+ setLinkAnchor(null);
181
+ }
182
+ }
183
+ )
184
+ ] });
185
+ }
186
+ export {
187
+ RichTextToolbar as default
188
+ };
189
+ //# sourceMappingURL=RichTextToolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RichTextToolbar.js","sources":["../../src/richText/RichTextToolbar.jsx"],"sourcesContent":["// La barra del editor de texto: estilo (texto, título, subtítulo), negrita, cursiva, subrayado y tachado, listas, cita,\n// código, liga, alineación, quitar el formato y deshacer o rehacer. Solo trae los botones que se piden (features) y cada uno\n// dice si está puesto (aria-pressed) y su nombre al pasar el cursor.\n//\n// OJO: los botones no se llevan el foco al picarlos (onMouseDown sin acción): si se lo llevaran, el texto elegido se\n// perdería antes de darle formato.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useRef, useState} from 'react';\nimport {useEditorState} from '@tiptap/react';\nimport Divider from '@mui/material/Divider';\nimport IconButton from '@mui/material/IconButton';\nimport MenuItem from '@mui/material/MenuItem';\nimport Select from '@mui/material/Select';\nimport Tooltip from '@mui/material/Tooltip';\nimport CodeIcon from '@mui/icons-material/Code';\nimport FormatAlignCenterIcon from '@mui/icons-material/FormatAlignCenter';\nimport FormatAlignLeftIcon from '@mui/icons-material/FormatAlignLeft';\nimport FormatAlignRightIcon from '@mui/icons-material/FormatAlignRight';\nimport FormatBoldIcon from '@mui/icons-material/FormatBold';\nimport FormatClearIcon from '@mui/icons-material/FormatClear';\nimport FormatItalicIcon from '@mui/icons-material/FormatItalic';\nimport FormatListBulletedIcon from '@mui/icons-material/FormatListBulleted';\nimport FormatListNumberedIcon from '@mui/icons-material/FormatListNumbered';\nimport FormatQuoteIcon from '@mui/icons-material/FormatQuote';\nimport FormatStrikethroughIcon from '@mui/icons-material/FormatStrikethrough';\nimport FormatUnderlinedIcon from '@mui/icons-material/FormatUnderlined';\nimport InsertLinkIcon from '@mui/icons-material/InsertLink';\nimport RedoIcon from '@mui/icons-material/Redo';\nimport UndoIcon from '@mui/icons-material/Undo';\n\nimport {RICH_TEXT_HEADING_LEVELS} from '@/richText/richTextExtensions.js';\nimport RichTextLinkPopover from '@/richText/RichTextLinkPopover.jsx';\nimport {RICH_TEXT_FEATURE} from '@/richText/richTextRules.js';\n\n// el estilo del renglón: texto normal o uno de los títulos\nconst PARAGRAPH_STYLE = 'paragraph';\nconst headingStyleOf = (level) => `heading${level}`;\nconst TEXT_ALIGNMENTS = Object.freeze([\n {value: 'left', Icon: FormatAlignLeftIcon},\n {value: 'center', Icon: FormatAlignCenterIcon},\n {value: 'right', Icon: FormatAlignRightIcon},\n]);\n// las marcas que se ponen y se quitan con un botón\nconst MARK_BUTTONS = Object.freeze([\n {feature: RICH_TEXT_FEATURE.bold, mark: 'bold', Icon: FormatBoldIcon, toggle: (chain) => chain.toggleBold()},\n {feature: RICH_TEXT_FEATURE.italic, mark: 'italic', Icon: FormatItalicIcon, toggle: (chain) => chain.toggleItalic()},\n {feature: RICH_TEXT_FEATURE.underline, mark: 'underline', Icon: FormatUnderlinedIcon, toggle: (chain) => chain.toggleUnderline()},\n {feature: RICH_TEXT_FEATURE.strike, mark: 'strike', Icon: FormatStrikethroughIcon, toggle: (chain) => chain.toggleStrike()},\n]);\n// los bloques que se ponen y se quitan con un botón\nconst BLOCK_BUTTONS = Object.freeze([\n {feature: RICH_TEXT_FEATURE.bulletList, node: 'bulletList', Icon: FormatListBulletedIcon, toggle: (chain) => chain.toggleBulletList()},\n {feature: RICH_TEXT_FEATURE.orderedList, node: 'orderedList', Icon: FormatListNumberedIcon, toggle: (chain) => chain.toggleOrderedList()},\n {feature: RICH_TEXT_FEATURE.blockquote, node: 'blockquote', Icon: FormatQuoteIcon, toggle: (chain) => chain.toggleBlockquote()},\n {feature: RICH_TEXT_FEATURE.codeBlock, node: 'codeBlock', Icon: CodeIcon, toggle: (chain) => chain.toggleCodeBlock()},\n]);\n\n/**\n * Un botón de la barra: no se lleva el foco, dice si está puesto y su nombre.\n *\n * @param {{label: string, isActive?: boolean, disabled?: boolean, onClick: (event: object) => void, children: import('react').ReactNode}} props\n */\nfunction ToolbarButton({label, isActive, disabled, onClick, children}) {\n return (\n <Tooltip title={label}>\n <span>\n <IconButton size=\"small\" aria-label={label} aria-pressed={isActive ?? undefined} disabled={disabled} color={isActive ? 'primary' : 'default'}\n onMouseDown={(event) => event.preventDefault()} onClick={onClick}\n sx={isActive ? {bgcolor: 'action.selected'} : undefined}>\n {children}\n </IconButton>\n </span>\n </Tooltip>\n );\n}\n\n/**\n * @param {object} props\n * @param {import('@tiptap/react').Editor|null} props.editor\n * @param {string[]} props.features\n * @param {boolean} props.disabled\n * @param {(key: string, values?: object) => string} props.t el traductor del editor (namespace richText)\n * @param {import('react').ReactNode} [props.actions] botones del proyecto al final de la barra\n */\nexport default function RichTextToolbar({editor, features, disabled, t, actions}) {\n const [linkAnchor, setLinkAnchor] = useState(null);\n const linkButtonRef = useRef(null);\n const has = (feature) => features.includes(feature);\n // lo que está puesto donde está el cursor: la barra se pinta otra vez solo cuando eso cambia\n const state = useEditorState({\n editor,\n selector: ({editor: current}) => {\n if (!current) {\n return null;\n }\n const headingLevel = RICH_TEXT_HEADING_LEVELS.find((level) => current.isActive('heading', {level}));\n return {\n marks: Object.fromEntries(MARK_BUTTONS.filter(({feature}) => has(feature)).map(({mark}) => [mark, current.isActive(mark)])),\n blocks: Object.fromEntries(BLOCK_BUTTONS.filter(({feature}) => has(feature)).map(({node}) => [node, current.isActive(node)])),\n textStyle: headingLevel ? headingStyleOf(headingLevel) : PARAGRAPH_STYLE,\n alignment: TEXT_ALIGNMENTS.find(({value}) => current.isActive({textAlign: value}))?.value ?? TEXT_ALIGNMENTS[0].value,\n isLink: has(RICH_TEXT_FEATURE.link) && current.isActive('link'),\n linkHref: has(RICH_TEXT_FEATURE.link) ? current.getAttributes('link').href ?? '' : '',\n canUndo: has(RICH_TEXT_FEATURE.history) && current.can().undo(),\n canRedo: has(RICH_TEXT_FEATURE.history) && current.can().redo(),\n };\n },\n });\n\n if (!editor || !state) {\n return null;\n }\n const chain = () => editor.chain().focus();\n const isDisabled = disabled || !editor.isEditable;\n\n return (\n <>\n {has(RICH_TEXT_FEATURE.textStyle) && (\n <Select size=\"small\" variant=\"standard\" disableUnderline value={state.textStyle} disabled={isDisabled}\n inputProps={{'aria-label': t('toolbar.textStyle')}} sx={{minWidth: 110, mx: 0.5, fontSize: 14}}\n onChange={(event) => {\n const style = event.target.value;\n const level = RICH_TEXT_HEADING_LEVELS.find((candidate) => headingStyleOf(candidate) === style);\n (level ? chain().setHeading({level}) : chain().setParagraph()).run();\n }}>\n <MenuItem value={PARAGRAPH_STYLE}>{t('toolbar.paragraph')}</MenuItem>\n {RICH_TEXT_HEADING_LEVELS.map((level) => (\n <MenuItem key={level} value={headingStyleOf(level)}>{t(`toolbar.${headingStyleOf(level)}`)}</MenuItem>\n ))}\n </Select>\n )}\n {MARK_BUTTONS.filter(({feature}) => has(feature)).map(({feature, mark, Icon, toggle}) => (\n <ToolbarButton key={feature} label={t(`toolbar.${feature}`)} isActive={state.marks[mark]} disabled={isDisabled}\n onClick={() => toggle(chain()).run()}>\n <Icon fontSize=\"small\" />\n </ToolbarButton>\n ))}\n <Divider orientation=\"vertical\" flexItem sx={{mx: 0.5}} />\n {BLOCK_BUTTONS.filter(({feature}) => has(feature)).map(({feature, node, Icon, toggle}) => (\n <ToolbarButton key={feature} label={t(`toolbar.${feature}`)} isActive={state.blocks[node]} disabled={isDisabled}\n onClick={() => toggle(chain()).run()}>\n <Icon fontSize=\"small\" />\n </ToolbarButton>\n ))}\n {has(RICH_TEXT_FEATURE.link) && (\n <span ref={linkButtonRef}>\n <ToolbarButton label={t('toolbar.link')} isActive={state.isLink} disabled={isDisabled}\n onClick={() => setLinkAnchor(linkButtonRef.current)}>\n <InsertLinkIcon fontSize=\"small\" />\n </ToolbarButton>\n </span>\n )}\n {has(RICH_TEXT_FEATURE.align) && (\n <>\n <Divider orientation=\"vertical\" flexItem sx={{mx: 0.5}} />\n {TEXT_ALIGNMENTS.map(({value, Icon}) => (\n <ToolbarButton key={value} label={t(`toolbar.align.${value}`)} isActive={state.alignment === value} disabled={isDisabled}\n onClick={() => chain().setTextAlign(value).run()}>\n <Icon fontSize=\"small\" />\n </ToolbarButton>\n ))}\n </>\n )}\n {has(RICH_TEXT_FEATURE.clear) && (\n <ToolbarButton label={t('toolbar.clear')} disabled={isDisabled} onClick={() => chain().unsetAllMarks().clearNodes().run()}>\n <FormatClearIcon fontSize=\"small\" />\n </ToolbarButton>\n )}\n {has(RICH_TEXT_FEATURE.history) && (\n <>\n <Divider orientation=\"vertical\" flexItem sx={{mx: 0.5}} />\n <ToolbarButton label={t('toolbar.undo')} disabled={isDisabled || !state.canUndo} onClick={() => chain().undo().run()}>\n <UndoIcon fontSize=\"small\" />\n </ToolbarButton>\n <ToolbarButton label={t('toolbar.redo')} disabled={isDisabled || !state.canRedo} onClick={() => chain().redo().run()}>\n <RedoIcon fontSize=\"small\" />\n </ToolbarButton>\n </>\n )}\n {actions}\n {linkAnchor && (\n <RichTextLinkPopover anchorElement={linkAnchor} initialUrl={state.linkHref} t={t}\n onClose={() => setLinkAnchor(null)}\n onSave={(url) => {\n chain().extendMarkRange('link').setLink({href: url}).run();\n setLinkAnchor(null);\n }}\n onRemove={() => {\n chain().extendMarkRange('link').unsetLink().run();\n setLinkAnchor(null);\n }} />\n )}\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,MAAM,kBAAkB;AACxB,MAAM,iBAAiB,CAAC,UAAU,UAAU,KAAK;AACjD,MAAM,kBAAkB,OAAO,OAAO;AAAA,EAClC,EAAC,OAAO,QAAQ,MAAM,oBAAA;AAAA,EACtB,EAAC,OAAO,UAAU,MAAM,sBAAA;AAAA,EACxB,EAAC,OAAO,SAAS,MAAM,qBAAA;AAC3B,CAAC;AAED,MAAM,eAAe,OAAO,OAAO;AAAA,EAC/B,EAAC,SAAS,kBAAkB,MAAM,MAAM,QAAQ,MAAM,gBAAgB,QAAQ,CAAC,UAAU,MAAM,aAAW;AAAA,EAC1G,EAAC,SAAS,kBAAkB,QAAQ,MAAM,UAAU,MAAM,kBAAkB,QAAQ,CAAC,UAAU,MAAM,eAAa;AAAA,EAClH,EAAC,SAAS,kBAAkB,WAAW,MAAM,aAAa,MAAM,sBAAsB,QAAQ,CAAC,UAAU,MAAM,kBAAgB;AAAA,EAC/H,EAAC,SAAS,kBAAkB,QAAQ,MAAM,UAAU,MAAM,yBAAyB,QAAQ,CAAC,UAAU,MAAM,eAAa;AAC7H,CAAC;AAED,MAAM,gBAAgB,OAAO,OAAO;AAAA,EAChC,EAAC,SAAS,kBAAkB,YAAY,MAAM,cAAc,MAAM,wBAAwB,QAAQ,CAAC,UAAU,MAAM,mBAAiB;AAAA,EACpI,EAAC,SAAS,kBAAkB,aAAa,MAAM,eAAe,MAAM,wBAAwB,QAAQ,CAAC,UAAU,MAAM,oBAAkB;AAAA,EACvI,EAAC,SAAS,kBAAkB,YAAY,MAAM,cAAc,MAAM,iBAAiB,QAAQ,CAAC,UAAU,MAAM,mBAAiB;AAAA,EAC7H,EAAC,SAAS,kBAAkB,WAAW,MAAM,aAAa,MAAM,UAAU,QAAQ,CAAC,UAAU,MAAM,kBAAgB;AACvH,CAAC;AAOD,SAAS,cAAc,EAAC,OAAO,UAAU,UAAU,SAAS,YAAW;AACnE,SACI,oBAAC,SAAA,EAAQ,OAAO,OACZ,8BAAC,QAAA,EACG,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MAAW,MAAK;AAAA,MAAQ,cAAY;AAAA,MAAO,gBAAc,YAAY;AAAA,MAAW;AAAA,MAAoB,OAAO,WAAW,YAAY;AAAA,MACvH,aAAa,CAAC,UAAU,MAAM,eAAA;AAAA,MAAkB;AAAA,MAChD,IAAI,WAAW,EAAC,SAAS,sBAAqB;AAAA,MACrD;AAAA,IAAA;AAAA,EAAA,GAET,EAAA,CACJ;AAER;AAUA,SAAwB,gBAAgB,EAAC,QAAQ,UAAU,UAAU,GAAG,WAAU;AAC9E,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,IAAI;AACjD,QAAM,gBAAgB,OAAO,IAAI;AACjC,QAAM,MAAM,CAAC,YAAY,SAAS,SAAS,OAAO;AAElD,QAAM,QAAQ,eAAe;AAAA,IACzB;AAAA,IACA,UAAU,CAAC,EAAC,QAAQ,cAAa;AAC7B,UAAI,CAAC,SAAS;AACV,eAAO;AAAA,MACX;AACA,YAAM,eAAe,yBAAyB,KAAK,CAAC,UAAU,QAAQ,SAAS,WAAW,EAAC,MAAA,CAAM,CAAC;AAClG,aAAO;AAAA,QACH,OAAO,OAAO,YAAY,aAAa,OAAO,CAAC,EAAC,cAAa,IAAI,OAAO,CAAC,EAAE,IAAI,CAAC,EAAC,KAAA,MAAU,CAAC,MAAM,QAAQ,SAAS,IAAI,CAAC,CAAC,CAAC;AAAA,QAC1H,QAAQ,OAAO,YAAY,cAAc,OAAO,CAAC,EAAC,cAAa,IAAI,OAAO,CAAC,EAAE,IAAI,CAAC,EAAC,KAAA,MAAU,CAAC,MAAM,QAAQ,SAAS,IAAI,CAAC,CAAC,CAAC;AAAA,QAC5H,WAAW,eAAe,eAAe,YAAY,IAAI;AAAA,QACzD,WAAW,gBAAgB,KAAK,CAAC,EAAC,MAAA,MAAW,QAAQ,SAAS,EAAC,WAAW,OAAM,CAAC,GAAG,SAAS,gBAAgB,CAAC,EAAE;AAAA,QAChH,QAAQ,IAAI,kBAAkB,IAAI,KAAK,QAAQ,SAAS,MAAM;AAAA,QAC9D,UAAU,IAAI,kBAAkB,IAAI,IAAI,QAAQ,cAAc,MAAM,EAAE,QAAQ,KAAK;AAAA,QACnF,SAAS,IAAI,kBAAkB,OAAO,KAAK,QAAQ,IAAA,EAAM,KAAA;AAAA,QACzD,SAAS,IAAI,kBAAkB,OAAO,KAAK,QAAQ,IAAA,EAAM,KAAA;AAAA,MAAK;AAAA,IAEtE;AAAA,EAAA,CACH;AAED,MAAI,CAAC,UAAU,CAAC,OAAO;AACnB,WAAO;AAAA,EACX;AACA,QAAM,QAAQ,MAAM,OAAO,MAAA,EAAQ,MAAA;AACnC,QAAM,aAAa,YAAY,CAAC,OAAO;AAEvC,SACI,qBAAA,UAAA,EACK,UAAA;AAAA,IAAA,IAAI,kBAAkB,SAAS,KAC5B;AAAA,MAAC;AAAA,MAAA;AAAA,QAAO,MAAK;AAAA,QAAQ,SAAQ;AAAA,QAAW,kBAAgB;AAAA,QAAC,OAAO,MAAM;AAAA,QAAW,UAAU;AAAA,QACnF,YAAY,EAAC,cAAc,EAAE,mBAAmB,EAAA;AAAA,QAAI,IAAI,EAAC,UAAU,KAAK,IAAI,KAAK,UAAU,GAAA;AAAA,QAC3F,UAAU,CAAC,UAAU;AACjB,gBAAM,QAAQ,MAAM,OAAO;AAC3B,gBAAM,QAAQ,yBAAyB,KAAK,CAAC,cAAc,eAAe,SAAS,MAAM,KAAK;AAC9F,WAAC,QAAQ,QAAQ,WAAW,EAAC,OAAM,IAAI,MAAA,EAAQ,aAAA,GAAgB,IAAA;AAAA,QACnE;AAAA,QACJ,UAAA;AAAA,UAAA,oBAAC,UAAA,EAAS,OAAO,iBAAkB,UAAA,EAAE,mBAAmB,GAAE;AAAA,UACzD,yBAAyB,IAAI,CAAC,UAC3B,oBAAC,UAAA,EAAqB,OAAO,eAAe,KAAK,GAAI,UAAA,EAAE,WAAW,eAAe,KAAK,CAAC,EAAE,EAAA,GAA1E,KAA4E,CAC9F;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGR,aAAa,OAAO,CAAC,EAAC,QAAA,MAAa,IAAI,OAAO,CAAC,EAAE,IAAI,CAAC,EAAC,SAAS,MAAM,MAAM,aACzE;AAAA,MAAC;AAAA,MAAA;AAAA,QAA4B,OAAO,EAAE,WAAW,OAAO,EAAE;AAAA,QAAG,UAAU,MAAM,MAAM,IAAI;AAAA,QAAG,UAAU;AAAA,QACrF,SAAS,MAAM,OAAO,MAAA,CAAO,EAAE,IAAA;AAAA,QAC1C,UAAA,oBAAC,MAAA,EAAK,UAAS,QAAA,CAAQ;AAAA,MAAA;AAAA,MAFP;AAAA,IAAA,CAIvB;AAAA,IACD,oBAAC,SAAA,EAAQ,aAAY,YAAW,UAAQ,MAAC,IAAI,EAAC,IAAI,IAAA,EAAG,CAAG;AAAA,IACvD,cAAc,OAAO,CAAC,EAAC,QAAA,MAAa,IAAI,OAAO,CAAC,EAAE,IAAI,CAAC,EAAC,SAAS,MAAM,MAAM,aAC1E;AAAA,MAAC;AAAA,MAAA;AAAA,QAA4B,OAAO,EAAE,WAAW,OAAO,EAAE;AAAA,QAAG,UAAU,MAAM,OAAO,IAAI;AAAA,QAAG,UAAU;AAAA,QACtF,SAAS,MAAM,OAAO,MAAA,CAAO,EAAE,IAAA;AAAA,QAC1C,UAAA,oBAAC,MAAA,EAAK,UAAS,QAAA,CAAQ;AAAA,MAAA;AAAA,MAFP;AAAA,IAAA,CAIvB;AAAA,IACA,IAAI,kBAAkB,IAAI,KACvB,oBAAC,QAAA,EAAK,KAAK,eACP,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QAAc,OAAO,EAAE,cAAc;AAAA,QAAG,UAAU,MAAM;AAAA,QAAQ,UAAU;AAAA,QAC5D,SAAS,MAAM,cAAc,cAAc,OAAO;AAAA,QAC7D,UAAA,oBAAC,gBAAA,EAAe,UAAS,QAAA,CAAQ;AAAA,MAAA;AAAA,IAAA,GAEzC;AAAA,IAEH,IAAI,kBAAkB,KAAK,KACxB,qBAAA,UAAA,EACI,UAAA;AAAA,MAAA,oBAAC,SAAA,EAAQ,aAAY,YAAW,UAAQ,MAAC,IAAI,EAAC,IAAI,IAAA,EAAG,CAAG;AAAA,MACvD,gBAAgB,IAAI,CAAC,EAAC,OAAO,WAC1B;AAAA,QAAC;AAAA,QAAA;AAAA,UAA0B,OAAO,EAAE,iBAAiB,KAAK,EAAE;AAAA,UAAG,UAAU,MAAM,cAAc;AAAA,UAAO,UAAU;AAAA,UAC/F,SAAS,MAAM,MAAA,EAAQ,aAAa,KAAK,EAAE,IAAA;AAAA,UACtD,UAAA,oBAAC,MAAA,EAAK,UAAS,QAAA,CAAQ;AAAA,QAAA;AAAA,QAFP;AAAA,MAAA,CAIvB;AAAA,IAAA,GACL;AAAA,IAEH,IAAI,kBAAkB,KAAK,KACxB,oBAAC,eAAA,EAAc,OAAO,EAAE,eAAe,GAAG,UAAU,YAAY,SAAS,MAAM,MAAA,EAAQ,cAAA,EAAgB,WAAA,EAAa,IAAA,GAChH,UAAA,oBAAC,iBAAA,EAAgB,UAAS,QAAA,CAAQ,EAAA,CACtC;AAAA,IAEH,IAAI,kBAAkB,OAAO,KAC1B,qBAAA,UAAA,EACI,UAAA;AAAA,MAAA,oBAAC,SAAA,EAAQ,aAAY,YAAW,UAAQ,MAAC,IAAI,EAAC,IAAI,IAAA,EAAG,CAAG;AAAA,MACxD,oBAAC,iBAAc,OAAO,EAAE,cAAc,GAAG,UAAU,cAAc,CAAC,MAAM,SAAS,SAAS,MAAM,MAAA,EAAQ,KAAA,EAAO,IAAA,GAC3G,UAAA,oBAAC,UAAA,EAAS,UAAS,QAAA,CAAQ,EAAA,CAC/B;AAAA,MACA,oBAAC,iBAAc,OAAO,EAAE,cAAc,GAAG,UAAU,cAAc,CAAC,MAAM,SAAS,SAAS,MAAM,QAAQ,OAAO,OAC3G,UAAA,oBAAC,UAAA,EAAS,UAAS,QAAA,CAAQ,EAAA,CAC/B;AAAA,IAAA,GACJ;AAAA,IAEH;AAAA,IACA,cACG;AAAA,MAAC;AAAA,MAAA;AAAA,QAAoB,eAAe;AAAA,QAAY,YAAY,MAAM;AAAA,QAAU;AAAA,QACvD,SAAS,MAAM,cAAc,IAAI;AAAA,QACjC,QAAQ,CAAC,QAAQ;AACb,gBAAA,EAAQ,gBAAgB,MAAM,EAAE,QAAQ,EAAC,MAAM,KAAI,EAAE,IAAA;AACrD,wBAAc,IAAI;AAAA,QACtB;AAAA,QACA,UAAU,MAAM;AACZ,gBAAA,EAAQ,gBAAgB,MAAM,EAAE,UAAA,EAAY,IAAA;AAC5C,wBAAc,IAAI;AAAA,QACtB;AAAA,MAAA;AAAA,IAAA;AAAA,EAAG,GAEhC;AAER;"}
@@ -0,0 +1,27 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useEditor, EditorContent } from "@tiptap/react";
4
+ import Box from "@mui/material/Box";
5
+ import { richTextContentSxOf } from "./richTextContentSx.js";
6
+ import { richTextExtensionsOf } from "./richTextExtensions.js";
7
+ import { DEFAULT_RICH_TEXT_FEATURES } from "./richTextRules.js";
8
+ import { piecePart, withPieceSlots, usePieceProps } from "../theme/themePieces.js";
9
+ import { warnUnknownProps } from "../toolkit/unknownProps.js";
10
+ const THEME_NAME = "CalcitaRichTextView";
11
+ const ViewRoot = piecePart(THEME_NAME, "Root", Box);
12
+ function RichTextViewContent(props) {
13
+ const { value, features = DEFAULT_RICH_TEXT_FEATURES, extensions, sx, ...unknownProps } = usePieceProps(props, THEME_NAME);
14
+ warnUnknownProps(THEME_NAME, unknownProps);
15
+ const editor = useEditor({
16
+ extensions: richTextExtensionsOf({ features, extensions }),
17
+ content: value ?? "",
18
+ editable: false,
19
+ immediatelyRender: false
20
+ }, [value, features.join(",")]);
21
+ return /* @__PURE__ */ jsx(ViewRoot, { ownSx: richTextContentSxOf, sx, children: /* @__PURE__ */ jsx(EditorContent, { editor }) });
22
+ }
23
+ const RichTextView = withPieceSlots(RichTextViewContent, THEME_NAME);
24
+ export {
25
+ RichTextView as default
26
+ };
27
+ //# sourceMappingURL=RichTextView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RichTextView.js","sources":["../../src/richText/RichTextView.jsx"],"sourcesContent":["// Enseña el texto con formato que guardó RichTextEditor, sin poder editarlo. Pasa por el mismo esquema del editor: solo entra\n// lo que el editor entiende (párrafos, títulos, listas, ligas seguras…) y lo demás se queda afuera. Un <script>, un\n// onclick o una liga javascript: pegados en el HTML no llegan a la página (XSS), sin otra librería para limpiarlo.\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaRichTextView con defaultProps y\n// styleOverrides de su parte root.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {EditorContent, useEditor} from '@tiptap/react';\nimport Box from '@mui/material/Box';\n\nimport {richTextContentSxOf} from '@/richText/richTextContentSx.js';\nimport {richTextExtensionsOf} from '@/richText/richTextExtensions.js';\nimport {DEFAULT_RICH_TEXT_FEATURES} from '@/richText/richTextRules.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 su parte (theme.components.CalcitaRichTextView)\nconst THEME_NAME = 'CalcitaRichTextView';\nconst ViewRoot = piecePart(THEME_NAME, 'Root', Box);\n\n/**\n * @param {object} props\n * @param {string|null|undefined} props.value el HTML guardado\n * @param {string[]} [props.features] lo que se deja pasar (por omisión, lo de un editor completo)\n * @param {Array<object>} [props.extensions] las extensiones de Tiptap del proyecto (las mismas que tiene su editor)\n * @param {object} [props.sx]\n */\nfunction RichTextViewContent(props) {\n const {value, features = DEFAULT_RICH_TEXT_FEATURES, extensions, sx, ...unknownProps} = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n const editor = useEditor({\n extensions: richTextExtensionsOf({features, extensions}),\n content: value ?? '',\n editable: false,\n immediatelyRender: false,\n }, [value, features.join(',')]);\n\n return (\n <ViewRoot ownSx={richTextContentSxOf} sx={sx}>\n <EditorContent editor={editor} />\n </ViewRoot>\n );\n}\n\n// lo que se exporta: la pieza con slots y slotProps para cambiar sus partes (themePieces.js)\nconst RichTextView = withPieceSlots(RichTextViewContent, THEME_NAME);\nexport default RichTextView;\n"],"names":[],"mappings":";;;;;;;;;AAkBA,MAAM,aAAa;AACnB,MAAM,WAAW,UAAU,YAAY,QAAQ,GAAG;AASlD,SAAS,oBAAoB,OAAO;AAChC,QAAM,EAAC,OAAO,WAAW,4BAA4B,YAAY,IAAI,GAAG,aAAA,IAAgB,cAAc,OAAO,UAAU;AACvH,mBAAiB,YAAY,YAAY;AACzC,QAAM,SAAS,UAAU;AAAA,IACrB,YAAY,qBAAqB,EAAC,UAAU,YAAW;AAAA,IACvD,SAAS,SAAS;AAAA,IAClB,UAAU;AAAA,IACV,mBAAmB;AAAA,EAAA,GACpB,CAAC,OAAO,SAAS,KAAK,GAAG,CAAC,CAAC;AAE9B,SACI,oBAAC,YAAS,OAAO,qBAAqB,IAClC,UAAA,oBAAC,eAAA,EAAc,QAAgB,EAAA,CACnC;AAER;AAGA,MAAM,eAAe,eAAe,qBAAqB,UAAU;"}
@@ -0,0 +1,42 @@
1
+ function richTextContentSxOf(theme) {
2
+ const palette = (theme.vars ?? theme).palette;
3
+ return {
4
+ "& .tiptap": {
5
+ outline: "none",
6
+ ...theme.typography.body1,
7
+ "& > :first-of-type": { mt: 0 },
8
+ "& > :last-child": { mb: 0 },
9
+ "& p": { my: 1 },
10
+ "& h2": { ...theme.typography.h6, mt: 2, mb: 1 },
11
+ "& h3": { ...theme.typography.subtitle1, fontWeight: 600, mt: 1.5, mb: 0.5 },
12
+ "& ul, & ol": { pl: 3, my: 1 },
13
+ "& li > p": { my: 0.25 },
14
+ "& blockquote": { borderLeft: 3, borderColor: "divider", pl: 2, ml: 0, my: 1.5, color: "text.secondary" },
15
+ "& pre": {
16
+ bgcolor: "action.hover",
17
+ borderRadius: 1,
18
+ px: 2,
19
+ py: 1.5,
20
+ my: 1.5,
21
+ overflowX: "auto",
22
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
23
+ fontSize: "0.875em"
24
+ },
25
+ "& code": { fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", fontSize: "0.9em", bgcolor: "action.hover", borderRadius: 0.5, px: 0.5 },
26
+ "& pre code": { bgcolor: "transparent", p: 0 },
27
+ "& a": { color: palette.primary.main, textDecorationThickness: 1 },
28
+ // el texto de ejemplo con el editor vacío (Placeholder de Tiptap)
29
+ "& p.is-editor-empty:first-of-type::before": {
30
+ content: "attr(data-placeholder)",
31
+ color: "text.disabled",
32
+ float: "left",
33
+ height: 0,
34
+ pointerEvents: "none"
35
+ }
36
+ }
37
+ };
38
+ }
39
+ export {
40
+ richTextContentSxOf
41
+ };
42
+ //# sourceMappingURL=richTextContentSx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"richTextContentSx.js","sources":["../../src/richText/richTextContentSx.js"],"sourcesContent":["// Cómo se ve el texto con formato, dentro del editor y en la vista de solo lectura: párrafos, títulos, listas, cita, código y\n// ligas con los colores y la tipografía del tema. Uno solo para los dos: lo que se escribe se ve igual a como se guarda.\n//\n// Genérico del paquete: function (regla de la casa).\n\n/**\n * El sx del contenido (.tiptap es la caja que edita Tiptap; en la vista es la misma, sin editar).\n *\n * @param {object} theme\n * @returns {object}\n */\nexport function richTextContentSxOf(theme) {\n const palette = (theme.vars ?? theme).palette;\n return {\n '& .tiptap': {\n outline: 'none',\n ...theme.typography.body1,\n '& > :first-of-type': {mt: 0},\n '& > :last-child': {mb: 0},\n '& p': {my: 1},\n '& h2': {...theme.typography.h6, mt: 2, mb: 1},\n '& h3': {...theme.typography.subtitle1, fontWeight: 600, mt: 1.5, mb: 0.5},\n '& ul, & ol': {pl: 3, my: 1},\n '& li > p': {my: 0.25},\n '& blockquote': {borderLeft: 3, borderColor: 'divider', pl: 2, ml: 0, my: 1.5, color: 'text.secondary'},\n '& pre': {\n bgcolor: 'action.hover', borderRadius: 1, px: 2, py: 1.5, my: 1.5, overflowX: 'auto',\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace', fontSize: '0.875em',\n },\n '& code': {fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace', fontSize: '0.9em', bgcolor: 'action.hover', borderRadius: 0.5, px: 0.5},\n '& pre code': {bgcolor: 'transparent', p: 0},\n '& a': {color: palette.primary.main, textDecorationThickness: 1},\n // el texto de ejemplo con el editor vacío (Placeholder de Tiptap)\n '& p.is-editor-empty:first-of-type::before': {\n content: 'attr(data-placeholder)', color: 'text.disabled', float: 'left', height: 0, pointerEvents: 'none',\n },\n },\n };\n}\n"],"names":[],"mappings":"AAWO,SAAS,oBAAoB,OAAO;AACvC,QAAM,WAAW,MAAM,QAAQ,OAAO;AACtC,SAAO;AAAA,IACH,aAAa;AAAA,MACT,SAAS;AAAA,MACT,GAAG,MAAM,WAAW;AAAA,MACpB,sBAAsB,EAAC,IAAI,EAAC;AAAA,MAC5B,mBAAmB,EAAC,IAAI,EAAC;AAAA,MACzB,OAAO,EAAC,IAAI,EAAC;AAAA,MACb,QAAQ,EAAC,GAAG,MAAM,WAAW,IAAI,IAAI,GAAG,IAAI,EAAC;AAAA,MAC7C,QAAQ,EAAC,GAAG,MAAM,WAAW,WAAW,YAAY,KAAK,IAAI,KAAK,IAAI,IAAG;AAAA,MACzE,cAAc,EAAC,IAAI,GAAG,IAAI,EAAC;AAAA,MAC3B,YAAY,EAAC,IAAI,KAAI;AAAA,MACrB,gBAAgB,EAAC,YAAY,GAAG,aAAa,WAAW,IAAI,GAAG,IAAI,GAAG,IAAI,KAAK,OAAO,iBAAgB;AAAA,MACtG,SAAS;AAAA,QACL,SAAS;AAAA,QAAgB,cAAc;AAAA,QAAG,IAAI;AAAA,QAAG,IAAI;AAAA,QAAK,IAAI;AAAA,QAAK,WAAW;AAAA,QAC9E,YAAY;AAAA,QAAkD,UAAU;AAAA,MACxF;AAAA,MACY,UAAU,EAAC,YAAY,kDAAkD,UAAU,SAAS,SAAS,gBAAgB,cAAc,KAAK,IAAI,IAAG;AAAA,MAC/I,cAAc,EAAC,SAAS,eAAe,GAAG,EAAC;AAAA,MAC3C,OAAO,EAAC,OAAO,QAAQ,QAAQ,MAAM,yBAAyB,EAAC;AAAA;AAAA,MAE/D,6CAA6C;AAAA,QACzC,SAAS;AAAA,QAA0B,OAAO;AAAA,QAAiB,OAAO;AAAA,QAAQ,QAAQ;AAAA,QAAG,eAAe;AAAA,MACpH;AAAA,IACA;AAAA,EACA;AACA;"}
@@ -0,0 +1,44 @@
1
+ import TextAlign from "@tiptap/extension-text-align";
2
+ import { Placeholder, CharacterCount } from "@tiptap/extensions";
3
+ import StarterKit from "@tiptap/starter-kit";
4
+ import { RICH_TEXT_FEATURE, isSafeLinkUrl } from "./richTextRules.js";
5
+ const RICH_TEXT_HEADING_LEVELS = Object.freeze([2, 3]);
6
+ const ALIGNABLE_NODES = Object.freeze(["heading", "paragraph"]);
7
+ function richTextExtensionsOf({ features, placeholder, maxLength, extensions = [] }) {
8
+ const has = (feature) => features.includes(feature);
9
+ const onlyIf = (feature, options = {}) => has(feature) ? options : false;
10
+ return [
11
+ StarterKit.configure({
12
+ heading: onlyIf(RICH_TEXT_FEATURE.textStyle, { levels: [...RICH_TEXT_HEADING_LEVELS] }),
13
+ bold: onlyIf(RICH_TEXT_FEATURE.bold),
14
+ italic: onlyIf(RICH_TEXT_FEATURE.italic),
15
+ underline: onlyIf(RICH_TEXT_FEATURE.underline),
16
+ strike: onlyIf(RICH_TEXT_FEATURE.strike),
17
+ bulletList: onlyIf(RICH_TEXT_FEATURE.bulletList),
18
+ orderedList: onlyIf(RICH_TEXT_FEATURE.orderedList),
19
+ // sin listas tampoco hay renglones de lista
20
+ listItem: has(RICH_TEXT_FEATURE.bulletList) || has(RICH_TEXT_FEATURE.orderedList) ? {} : false,
21
+ blockquote: onlyIf(RICH_TEXT_FEATURE.blockquote),
22
+ codeBlock: onlyIf(RICH_TEXT_FEATURE.codeBlock),
23
+ // el código dentro de un renglón lo pide solo el bloque de código
24
+ code: onlyIf(RICH_TEXT_FEATURE.codeBlock),
25
+ undoRedo: onlyIf(RICH_TEXT_FEATURE.history),
26
+ link: onlyIf(RICH_TEXT_FEATURE.link, {
27
+ openOnClick: false,
28
+ autolink: true,
29
+ defaultProtocol: "https",
30
+ isAllowedUri: (url) => isSafeLinkUrl(url),
31
+ HTMLAttributes: { rel: "noopener noreferrer nofollow", target: "_blank" }
32
+ })
33
+ }),
34
+ ...has(RICH_TEXT_FEATURE.align) ? [TextAlign.configure({ types: [...ALIGNABLE_NODES] })] : [],
35
+ ...placeholder ? [Placeholder.configure({ placeholder })] : [],
36
+ CharacterCount.configure({ limit: maxLength ?? null }),
37
+ ...extensions
38
+ ];
39
+ }
40
+ export {
41
+ RICH_TEXT_HEADING_LEVELS,
42
+ richTextExtensionsOf
43
+ };
44
+ //# sourceMappingURL=richTextExtensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"richTextExtensions.js","sources":["../../src/richText/richTextExtensions.js"],"sourcesContent":["// Las extensiones de Tiptap del editor de la casa, armadas según los botones que se piden (features). Lo que no se pide se\n// quita también del documento: si la barra no trae código, un bloque de código pegado llega como texto normal.\n//\n// Las ligas solo con protocolos seguros (richTextRules.js) y con rel=\"noopener noreferrer nofollow\": la página que se abre no\n// puede tocar la de la app ni sumar puntos de búsqueda.\n//\n// Genérico del paquete: function (regla de la casa).\nimport TextAlign from '@tiptap/extension-text-align';\nimport {CharacterCount, Placeholder} from '@tiptap/extensions';\nimport StarterKit from '@tiptap/starter-kit';\n\nimport {RICH_TEXT_FEATURE, isSafeLinkUrl} from '@/richText/richTextRules.js';\n\n// los títulos que ofrece la barra: el de la página ya es h1, el texto va de h2 para abajo\nexport const RICH_TEXT_HEADING_LEVELS = Object.freeze([2, 3]);\nconst ALIGNABLE_NODES = Object.freeze(['heading', 'paragraph']);\n\n/**\n * @param {object} options\n * @param {string[]} options.features los botones de la barra (RICH_TEXT_FEATURE)\n * @param {string} [options.placeholder] ya traducido: lo que se ve con el editor vacío\n * @param {number} [options.maxLength] el tope de caracteres; sin él, sin tope\n * @param {Array<object>} [options.extensions] extensiones de Tiptap del proyecto, al final\n * @returns {Array<object>}\n */\nexport function richTextExtensionsOf({features, placeholder, maxLength, extensions = []}) {\n const has = (feature) => features.includes(feature);\n const onlyIf = (feature, options = {}) => (has(feature) ? options : false);\n\n return [\n StarterKit.configure({\n heading: onlyIf(RICH_TEXT_FEATURE.textStyle, {levels: [...RICH_TEXT_HEADING_LEVELS]}),\n bold: onlyIf(RICH_TEXT_FEATURE.bold),\n italic: onlyIf(RICH_TEXT_FEATURE.italic),\n underline: onlyIf(RICH_TEXT_FEATURE.underline),\n strike: onlyIf(RICH_TEXT_FEATURE.strike),\n bulletList: onlyIf(RICH_TEXT_FEATURE.bulletList),\n orderedList: onlyIf(RICH_TEXT_FEATURE.orderedList),\n // sin listas tampoco hay renglones de lista\n listItem: has(RICH_TEXT_FEATURE.bulletList) || has(RICH_TEXT_FEATURE.orderedList) ? {} : false,\n blockquote: onlyIf(RICH_TEXT_FEATURE.blockquote),\n codeBlock: onlyIf(RICH_TEXT_FEATURE.codeBlock),\n // el código dentro de un renglón lo pide solo el bloque de código\n code: onlyIf(RICH_TEXT_FEATURE.codeBlock),\n undoRedo: onlyIf(RICH_TEXT_FEATURE.history),\n link: onlyIf(RICH_TEXT_FEATURE.link, {\n openOnClick: false,\n autolink: true,\n defaultProtocol: 'https',\n isAllowedUri: (url) => isSafeLinkUrl(url),\n HTMLAttributes: {rel: 'noopener noreferrer nofollow', target: '_blank'},\n }),\n }),\n ...(has(RICH_TEXT_FEATURE.align) ? [TextAlign.configure({types: [...ALIGNABLE_NODES]})] : []),\n ...(placeholder ? [Placeholder.configure({placeholder})] : []),\n CharacterCount.configure({limit: maxLength ?? null}),\n ...extensions,\n ];\n}\n"],"names":[],"mappings":";;;;AAcY,MAAC,2BAA2B,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;AAC5D,MAAM,kBAAkB,OAAO,OAAO,CAAC,WAAW,WAAW,CAAC;AAUvD,SAAS,qBAAqB,EAAC,UAAU,aAAa,WAAW,aAAa,CAAA,EAAE,GAAG;AACtF,QAAM,MAAM,CAAC,YAAY,SAAS,SAAS,OAAO;AAClD,QAAM,SAAS,CAAC,SAAS,UAAU,CAAA,MAAQ,IAAI,OAAO,IAAI,UAAU;AAEpE,SAAO;AAAA,IACH,WAAW,UAAU;AAAA,MACjB,SAAS,OAAO,kBAAkB,WAAW,EAAC,QAAQ,CAAC,GAAG,wBAAwB,EAAC,CAAC;AAAA,MACpF,MAAM,OAAO,kBAAkB,IAAI;AAAA,MACnC,QAAQ,OAAO,kBAAkB,MAAM;AAAA,MACvC,WAAW,OAAO,kBAAkB,SAAS;AAAA,MAC7C,QAAQ,OAAO,kBAAkB,MAAM;AAAA,MACvC,YAAY,OAAO,kBAAkB,UAAU;AAAA,MAC/C,aAAa,OAAO,kBAAkB,WAAW;AAAA;AAAA,MAEjD,UAAU,IAAI,kBAAkB,UAAU,KAAK,IAAI,kBAAkB,WAAW,IAAI,CAAA,IAAK;AAAA,MACzF,YAAY,OAAO,kBAAkB,UAAU;AAAA,MAC/C,WAAW,OAAO,kBAAkB,SAAS;AAAA;AAAA,MAE7C,MAAM,OAAO,kBAAkB,SAAS;AAAA,MACxC,UAAU,OAAO,kBAAkB,OAAO;AAAA,MAC1C,MAAM,OAAO,kBAAkB,MAAM;AAAA,QACjC,aAAa;AAAA,QACb,UAAU;AAAA,QACV,iBAAiB;AAAA,QACjB,cAAc,CAAC,QAAQ,cAAc,GAAG;AAAA,QACxC,gBAAgB,EAAC,KAAK,gCAAgC,QAAQ,SAAQ;AAAA,MACtF,CAAa;AAAA,IACb,CAAS;AAAA,IACD,GAAI,IAAI,kBAAkB,KAAK,IAAI,CAAC,UAAU,UAAU,EAAC,OAAO,CAAC,GAAG,eAAe,EAAC,CAAC,CAAC,IAAI,CAAA;AAAA,IAC1F,GAAI,cAAc,CAAC,YAAY,UAAU,EAAC,YAAW,CAAC,CAAC,IAAI;IAC3D,eAAe,UAAU,EAAC,OAAO,aAAa,KAAI,CAAC;AAAA,IACnD,GAAG;AAAA,EACX;AACA;"}
@@ -0,0 +1,46 @@
1
+ const RICH_TEXT_FEATURE = Object.freeze({
2
+ textStyle: "textStyle",
3
+ bold: "bold",
4
+ italic: "italic",
5
+ underline: "underline",
6
+ strike: "strike",
7
+ bulletList: "bulletList",
8
+ orderedList: "orderedList",
9
+ blockquote: "blockquote",
10
+ codeBlock: "codeBlock",
11
+ link: "link",
12
+ align: "align",
13
+ clear: "clear",
14
+ history: "history"
15
+ });
16
+ const DEFAULT_RICH_TEXT_FEATURES = Object.freeze(Object.values(RICH_TEXT_FEATURE));
17
+ const SAFE_LINK_PROTOCOLS = Object.freeze(["https", "http", "mailto", "tel"]);
18
+ const PROTOCOL_PATTERN = /^([a-z][a-z\d+.-]*):/i;
19
+ const BARE_DOMAIN_PATTERN = /^[\w-]+(\.[\w-]+)+(\/\S*)?$/;
20
+ const EMPTY_DOCUMENT_PATTERN = /^\s*(<p>\s*<\/p>\s*)*$/;
21
+ function linkUrlOf(typedUrl) {
22
+ const url = (typedUrl ?? "").trim();
23
+ if (!url) {
24
+ return null;
25
+ }
26
+ const protocol = PROTOCOL_PATTERN.exec(url)?.[1]?.toLowerCase();
27
+ if (protocol) {
28
+ return SAFE_LINK_PROTOCOLS.includes(protocol) ? url : null;
29
+ }
30
+ return BARE_DOMAIN_PATTERN.test(url) ? `https://${url}` : null;
31
+ }
32
+ function isSafeLinkUrl(url) {
33
+ return linkUrlOf(url) !== null;
34
+ }
35
+ function normalizedHtmlOf(html) {
36
+ return !html || EMPTY_DOCUMENT_PATTERN.test(html) ? "" : html;
37
+ }
38
+ export {
39
+ DEFAULT_RICH_TEXT_FEATURES,
40
+ RICH_TEXT_FEATURE,
41
+ SAFE_LINK_PROTOCOLS,
42
+ isSafeLinkUrl,
43
+ linkUrlOf,
44
+ normalizedHtmlOf
45
+ };
46
+ //# sourceMappingURL=richTextRules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"richTextRules.js","sources":["../../src/richText/richTextRules.js"],"sourcesContent":["// Lo que el editor de texto decide sin pantalla: qué botones trae (RICH_TEXT_FEATURE), qué dirección de liga se acepta y\n// cómo queda el texto vacío.\n//\n// Ligas: solo https, http, mailto y tel. Una dirección sin protocolo («calcita.mx») se completa con https://. Lo demás\n// (javascript:, data:, file:) se rechaza: una liga así ejecuta código al picarla (XSS).\n//\n// Vacío: el editor deja «<p></p>» cuando se borra todo; al formulario llega '' para que required() funcione.\n//\n// Puro (sin React): se prueba con node (richTextRules.test.js).\n//\n// Genérico del paquete: function (regla de la casa).\n\n/** Los botones que puede traer la barra del editor. */\nexport const RICH_TEXT_FEATURE = Object.freeze({\n textStyle: 'textStyle',\n bold: 'bold',\n italic: 'italic',\n underline: 'underline',\n strike: 'strike',\n bulletList: 'bulletList',\n orderedList: 'orderedList',\n blockquote: 'blockquote',\n codeBlock: 'codeBlock',\n link: 'link',\n align: 'align',\n clear: 'clear',\n history: 'history',\n});\n\n/** Los de siempre: todos. Un editor más sencillo pasa su lista (features={[RICH_TEXT_FEATURE.bold, …]}). */\nexport const DEFAULT_RICH_TEXT_FEATURES = Object.freeze(Object.values(RICH_TEXT_FEATURE));\n\n/** Los protocolos que puede llevar una liga. */\nexport const SAFE_LINK_PROTOCOLS = Object.freeze(['https', 'http', 'mailto', 'tel']);\n\nconst PROTOCOL_PATTERN = /^([a-z][a-z\\d+.-]*):/i;\n// «calcita.mx», «www.ejemplo.com/ruta»: un dominio sin protocolo\nconst BARE_DOMAIN_PATTERN = /^[\\w-]+(\\.[\\w-]+)+(\\/\\S*)?$/;\nconst EMPTY_DOCUMENT_PATTERN = /^\\s*(<p>\\s*<\\/p>\\s*)*$/;\n\n/**\n * La dirección de una liga lista para guardarse, o null si no se acepta.\n *\n * @param {string|null|undefined} typedUrl lo que escribió la persona\n * @returns {string|null}\n */\nexport function linkUrlOf(typedUrl) {\n const url = (typedUrl ?? '').trim();\n if (!url) {\n return null;\n }\n const protocol = PROTOCOL_PATTERN.exec(url)?.[1]?.toLowerCase();\n if (protocol) {\n return SAFE_LINK_PROTOCOLS.includes(protocol) ? url : null;\n }\n return BARE_DOMAIN_PATTERN.test(url) ? `https://${url}` : null;\n}\n\n/**\n * ¿Se acepta esta dirección como liga? (lo que pide la extensión de ligas del editor)\n *\n * @param {string} url\n * @returns {boolean}\n */\nexport function isSafeLinkUrl(url) {\n return linkUrlOf(url) !== null;\n}\n\n/**\n * El HTML del editor como se guarda: '' si no hay nada escrito.\n *\n * @param {string|null|undefined} html\n * @returns {string}\n */\nexport function normalizedHtmlOf(html) {\n return !html || EMPTY_DOCUMENT_PATTERN.test(html) ? '' : html;\n}\n"],"names":[],"mappings":"AAaY,MAAC,oBAAoB,OAAO,OAAO;AAAA,EAC3C,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AACb,CAAC;AAGW,MAAC,6BAA6B,OAAO,OAAO,OAAO,OAAO,iBAAiB,CAAC;AAG5E,MAAC,sBAAsB,OAAO,OAAO,CAAC,SAAS,QAAQ,UAAU,KAAK,CAAC;AAEnF,MAAM,mBAAmB;AAEzB,MAAM,sBAAsB;AAC5B,MAAM,yBAAyB;AAQxB,SAAS,UAAU,UAAU;AAChC,QAAM,OAAO,YAAY,IAAI,KAAI;AACjC,MAAI,CAAC,KAAK;AACN,WAAO;AAAA,EACX;AACA,QAAM,WAAW,iBAAiB,KAAK,GAAG,IAAI,CAAC,GAAG,YAAW;AAC7D,MAAI,UAAU;AACV,WAAO,oBAAoB,SAAS,QAAQ,IAAI,MAAM;AAAA,EAC1D;AACA,SAAO,oBAAoB,KAAK,GAAG,IAAI,WAAW,GAAG,KAAK;AAC9D;AAQO,SAAS,cAAc,KAAK;AAC/B,SAAO,UAAU,GAAG,MAAM;AAC9B;AAQO,SAAS,iBAAiB,MAAM;AACnC,SAAO,CAAC,QAAQ,uBAAuB,KAAK,IAAI,IAAI,KAAK;AAC7D;"}
@@ -21,7 +21,7 @@ import SyncLockOutlinedIcon from "@mui/icons-material/SyncLockOutlined";
21
21
  import { useFormatters } from "../toolkit/useFormatters.js";
22
22
  import { useToolkitTranslation } from "../toolkit/useToolkitTranslation.js";
23
23
  import SectionCard from "../ui/layout/SectionCard.js";
24
- import { piecePart, usePieceProps } from "../theme/themePieces.js";
24
+ import { piecePart, withPieceSlots, usePieceProps } from "../theme/themePieces.js";
25
25
  import { warnUnknownProps } from "../toolkit/unknownProps.js";
26
26
  const THEME_NAME = "CalcitaActivityLog";
27
27
  const ActivityItemIcon = piecePart(THEME_NAME, "ItemIcon", ListItemIcon);
@@ -53,7 +53,7 @@ const EVENT_LOOK = Object.freeze({
53
53
  });
54
54
  const DEFAULT_LOOK = Object.freeze({ Icon: EventNoteOutlinedIcon });
55
55
  const LOADING_HEIGHT_PIXELS = 160;
56
- function ActivityLog(props) {
56
+ function ActivityLogContent(props) {
57
57
  const { events, error = null, texts, ...unknownProps } = usePieceProps(props, THEME_NAME);
58
58
  warnUnknownProps(THEME_NAME, unknownProps);
59
59
  const { t } = useToolkitTranslation("security", texts);
@@ -79,6 +79,7 @@ function ActivityLog(props) {
79
79
  }) })
80
80
  ] }) });
81
81
  }
82
+ const ActivityLog = withPieceSlots(ActivityLogContent, THEME_NAME);
82
83
  export {
83
84
  ACCOUNT_EVENT_KIND,
84
85
  ActivityLog as default
@@ -1 +1 @@
1
- {"version":3,"file":"ActivityLog.js","sources":["../../src/security/ActivityLog.jsx"],"sourcesContent":["// La bitácora de la cuenta: lo último que pasó (entró, contraseña equivocada, cambió su contraseña, activó la verificación,\n// agregó una llave…), con la hora, el equipo y la red a medias. Para que la persona reconozca lo que no fue ella.\n//\n// Cada evento llega con su tipo (kind) y el texto sale de los textos del paquete (security:activity.kinds.<kind>); un tipo\n// propio del proyecto trae su texto en description.\n//\n// <ActivityLog events={events} />\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaActivityLog con defaultProps y\n// styleOverrides de sus partes: itemIcon.\n//\n// Genérico del paquete: function (regla de la casa).\nimport Alert from '@mui/material/Alert';\nimport List from '@mui/material/List';\nimport ListItem from '@mui/material/ListItem';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Skeleton from '@mui/material/Skeleton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport CancelOutlinedIcon from '@mui/icons-material/CancelOutlined';\nimport EventNoteOutlinedIcon from '@mui/icons-material/EventNoteOutlined';\nimport FingerprintOutlinedIcon from '@mui/icons-material/FingerprintOutlined';\nimport KeyOutlinedIcon from '@mui/icons-material/KeyOutlined';\nimport LoginOutlinedIcon from '@mui/icons-material/LoginOutlined';\nimport LogoutOutlinedIcon from '@mui/icons-material/LogoutOutlined';\nimport PasswordOutlinedIcon from '@mui/icons-material/PasswordOutlined';\nimport PhonelinkLockOutlinedIcon from '@mui/icons-material/PhonelinkLockOutlined';\nimport PhonelinkEraseOutlinedIcon from '@mui/icons-material/PhonelinkEraseOutlined';\nimport SyncLockOutlinedIcon from '@mui/icons-material/SyncLockOutlined';\n\nimport {useFormatters} from '@/toolkit/useFormatters.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport SectionCard from '@/ui/layout/SectionCard.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.CalcitaActivityLog)\nconst THEME_NAME = 'CalcitaActivityLog';\nconst ActivityItemIcon = piecePart(THEME_NAME, 'ItemIcon', ListItemIcon);\n\n/** Los tipos de evento que el paquete conoce, con su texto en security:activity.kinds. */\nexport const ACCOUNT_EVENT_KIND = Object.freeze({\n signedIn: 'signedIn',\n signInFailed: 'signInFailed',\n signedOut: 'signedOut',\n passwordChanged: 'passwordChanged',\n twoStepEnabled: 'twoStepEnabled',\n twoStepDisabled: 'twoStepDisabled',\n passkeyAdded: 'passkeyAdded',\n passkeyRemoved: 'passkeyRemoved',\n recoveryCodesGenerated: 'recoveryCodesGenerated',\n recoveryCodeUsed: 'recoveryCodeUsed',\n sessionsClosed: 'sessionsClosed',\n});\n\n// el ícono de cada tipo, y en rojo lo que pide atención (un intento con contraseña equivocada, quitar protección)\nconst EVENT_LOOK = Object.freeze({\n [ACCOUNT_EVENT_KIND.signedIn]: {Icon: LoginOutlinedIcon},\n [ACCOUNT_EVENT_KIND.signInFailed]: {Icon: CancelOutlinedIcon, color: 'error'},\n [ACCOUNT_EVENT_KIND.signedOut]: {Icon: LogoutOutlinedIcon},\n [ACCOUNT_EVENT_KIND.passwordChanged]: {Icon: PasswordOutlinedIcon},\n [ACCOUNT_EVENT_KIND.twoStepEnabled]: {Icon: PhonelinkLockOutlinedIcon, color: 'success'},\n [ACCOUNT_EVENT_KIND.twoStepDisabled]: {Icon: PhonelinkEraseOutlinedIcon, color: 'warning'},\n [ACCOUNT_EVENT_KIND.passkeyAdded]: {Icon: FingerprintOutlinedIcon, color: 'success'},\n [ACCOUNT_EVENT_KIND.passkeyRemoved]: {Icon: FingerprintOutlinedIcon, color: 'warning'},\n [ACCOUNT_EVENT_KIND.recoveryCodesGenerated]: {Icon: KeyOutlinedIcon},\n [ACCOUNT_EVENT_KIND.recoveryCodeUsed]: {Icon: KeyOutlinedIcon, color: 'warning'},\n [ACCOUNT_EVENT_KIND.sessionsClosed]: {Icon: SyncLockOutlinedIcon},\n});\nconst DEFAULT_LOOK = Object.freeze({Icon: EventNoteOutlinedIcon});\nconst LOADING_HEIGHT_PIXELS = 160;\n\n/**\n * @param {object} props\n * @param {Array<{id: string, kind: string, occurredAt: string, device?: string|null, network?: string|null, description?: string}>|null} props.events\n * del más nuevo al más viejo; null mientras llegan\n * @param {string|null} [props.error] ya traducido si no se pudieron traer\n * @param {object} [props.texts] los textos que cambian, con la forma de `security` en los textos del paquete\n */\nexport default function ActivityLog(props) {\n // lo que el proyecto puso en su tema (components.CalcitaActivityLog.defaultProps) y encima lo que llega aquí\n const {events, error = null, texts, ...unknownProps} = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n const {t} = useToolkitTranslation('security', texts);\n const {formatDateTime} = useFormatters();\n\n return (\n <SectionCard title={t('activity.title')}>\n <Stack spacing={2}>\n <Typography variant=\"body2\" color=\"text.secondary\">{t('activity.description')}</Typography>\n {error && <Alert severity=\"error\">{error}</Alert>}\n {!events && !error && <Skeleton variant=\"rounded\" height={LOADING_HEIGHT_PIXELS} />}\n {events?.length === 0 && <Typography variant=\"body2\" color=\"text.secondary\">{t('activity.empty')}</Typography>}\n {events?.length > 0 && (\n <List dense disablePadding>\n {events.map((event) => {\n const look = EVENT_LOOK[event.kind] ?? DEFAULT_LOOK;\n const where = event.device && event.network ? ` · ${t('activity.from', {device: event.device, network: event.network})}` : '';\n return (\n <ListItem key={event.id} disableGutters>\n <ActivityItemIcon ownSx={{minWidth: 36}}><look.Icon fontSize=\"small\" color={look.color ?? 'action'} /></ActivityItemIcon>\n <ListItemText primary={event.description ?? t(`activity.kinds.${event.kind}`)}\n secondary={`${formatDateTime(event.occurredAt)}${where}`} />\n </ListItem>\n );\n })}\n </List>\n )}\n </Stack>\n </SectionCard>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ActivityLog.js","sources":["../../src/security/ActivityLog.jsx"],"sourcesContent":["// La bitácora de la cuenta: lo último que pasó (entró, contraseña equivocada, cambió su contraseña, activó la verificación,\n// agregó una llave…), con la hora, el equipo y la red a medias. Para que la persona reconozca lo que no fue ella.\n//\n// Cada evento llega con su tipo (kind) y el texto sale de los textos del paquete (security:activity.kinds.<kind>); un tipo\n// propio del proyecto trae su texto en description.\n//\n// <ActivityLog events={events} />\n//\n// Se cambia desde el tema del proyecto, como las piezas de MUI: components.CalcitaActivityLog con defaultProps y\n// styleOverrides de sus partes: itemIcon.\n//\n// Genérico del paquete: function (regla de la casa).\nimport Alert from '@mui/material/Alert';\nimport List from '@mui/material/List';\nimport ListItem from '@mui/material/ListItem';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Skeleton from '@mui/material/Skeleton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport CancelOutlinedIcon from '@mui/icons-material/CancelOutlined';\nimport EventNoteOutlinedIcon from '@mui/icons-material/EventNoteOutlined';\nimport FingerprintOutlinedIcon from '@mui/icons-material/FingerprintOutlined';\nimport KeyOutlinedIcon from '@mui/icons-material/KeyOutlined';\nimport LoginOutlinedIcon from '@mui/icons-material/LoginOutlined';\nimport LogoutOutlinedIcon from '@mui/icons-material/LogoutOutlined';\nimport PasswordOutlinedIcon from '@mui/icons-material/PasswordOutlined';\nimport PhonelinkLockOutlinedIcon from '@mui/icons-material/PhonelinkLockOutlined';\nimport PhonelinkEraseOutlinedIcon from '@mui/icons-material/PhonelinkEraseOutlined';\nimport SyncLockOutlinedIcon from '@mui/icons-material/SyncLockOutlined';\n\nimport {useFormatters} from '@/toolkit/useFormatters.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport SectionCard from '@/ui/layout/SectionCard.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.CalcitaActivityLog)\nconst THEME_NAME = 'CalcitaActivityLog';\nconst ActivityItemIcon = piecePart(THEME_NAME, 'ItemIcon', ListItemIcon);\n\n/** Los tipos de evento que el paquete conoce, con su texto en security:activity.kinds. */\nexport const ACCOUNT_EVENT_KIND = Object.freeze({\n signedIn: 'signedIn',\n signInFailed: 'signInFailed',\n signedOut: 'signedOut',\n passwordChanged: 'passwordChanged',\n twoStepEnabled: 'twoStepEnabled',\n twoStepDisabled: 'twoStepDisabled',\n passkeyAdded: 'passkeyAdded',\n passkeyRemoved: 'passkeyRemoved',\n recoveryCodesGenerated: 'recoveryCodesGenerated',\n recoveryCodeUsed: 'recoveryCodeUsed',\n sessionsClosed: 'sessionsClosed',\n});\n\n// el ícono de cada tipo, y en rojo lo que pide atención (un intento con contraseña equivocada, quitar protección)\nconst EVENT_LOOK = Object.freeze({\n [ACCOUNT_EVENT_KIND.signedIn]: {Icon: LoginOutlinedIcon},\n [ACCOUNT_EVENT_KIND.signInFailed]: {Icon: CancelOutlinedIcon, color: 'error'},\n [ACCOUNT_EVENT_KIND.signedOut]: {Icon: LogoutOutlinedIcon},\n [ACCOUNT_EVENT_KIND.passwordChanged]: {Icon: PasswordOutlinedIcon},\n [ACCOUNT_EVENT_KIND.twoStepEnabled]: {Icon: PhonelinkLockOutlinedIcon, color: 'success'},\n [ACCOUNT_EVENT_KIND.twoStepDisabled]: {Icon: PhonelinkEraseOutlinedIcon, color: 'warning'},\n [ACCOUNT_EVENT_KIND.passkeyAdded]: {Icon: FingerprintOutlinedIcon, color: 'success'},\n [ACCOUNT_EVENT_KIND.passkeyRemoved]: {Icon: FingerprintOutlinedIcon, color: 'warning'},\n [ACCOUNT_EVENT_KIND.recoveryCodesGenerated]: {Icon: KeyOutlinedIcon},\n [ACCOUNT_EVENT_KIND.recoveryCodeUsed]: {Icon: KeyOutlinedIcon, color: 'warning'},\n [ACCOUNT_EVENT_KIND.sessionsClosed]: {Icon: SyncLockOutlinedIcon},\n});\nconst DEFAULT_LOOK = Object.freeze({Icon: EventNoteOutlinedIcon});\nconst LOADING_HEIGHT_PIXELS = 160;\n\n/**\n * @param {object} props\n * @param {Array<{id: string, kind: string, occurredAt: string, device?: string|null, network?: string|null, description?: string}>|null} props.events\n * del más nuevo al más viejo; null mientras llegan\n * @param {string|null} [props.error] ya traducido si no se pudieron traer\n * @param {object} [props.texts] los textos que cambian, con la forma de `security` en los textos del paquete\n */\nfunction ActivityLogContent(props) {\n // lo que el proyecto puso en su tema (components.CalcitaActivityLog.defaultProps) y encima lo que llega aquí\n const {events, error = null, texts, ...unknownProps} = usePieceProps(props, THEME_NAME);\n warnUnknownProps(THEME_NAME, unknownProps);\n const {t} = useToolkitTranslation('security', texts);\n const {formatDateTime} = useFormatters();\n\n return (\n <SectionCard title={t('activity.title')}>\n <Stack spacing={2}>\n <Typography variant=\"body2\" color=\"text.secondary\">{t('activity.description')}</Typography>\n {error && <Alert severity=\"error\">{error}</Alert>}\n {!events && !error && <Skeleton variant=\"rounded\" height={LOADING_HEIGHT_PIXELS} />}\n {events?.length === 0 && <Typography variant=\"body2\" color=\"text.secondary\">{t('activity.empty')}</Typography>}\n {events?.length > 0 && (\n <List dense disablePadding>\n {events.map((event) => {\n const look = EVENT_LOOK[event.kind] ?? DEFAULT_LOOK;\n const where = event.device && event.network ? ` · ${t('activity.from', {device: event.device, network: event.network})}` : '';\n return (\n <ListItem key={event.id} disableGutters>\n <ActivityItemIcon ownSx={{minWidth: 36}}><look.Icon fontSize=\"small\" color={look.color ?? 'action'} /></ActivityItemIcon>\n <ListItemText primary={event.description ?? t(`activity.kinds.${event.kind}`)}\n secondary={`${formatDateTime(event.occurredAt)}${where}`} />\n </ListItem>\n );\n })}\n </List>\n )}\n </Stack>\n </SectionCard>\n );\n}\n\n// lo que se exporta: la pieza con slots y slotProps para cambiar sus partes (themePieces.js)\nconst ActivityLog = withPieceSlots(ActivityLogContent, THEME_NAME);\nexport default ActivityLog;\n"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ import { saveBlob } from "../files.js";
16
16
  import { useToolkitSettings } from "../toolkit/toolkitContext.js";
17
17
  import { useToolkitTranslation } from "../toolkit/useToolkitTranslation.js";
18
18
  import CopyButton from "../ui/actions/CopyButton.js";
19
- import { piecePart, usePieceProps } from "../theme/themePieces.js";
19
+ import { piecePart, withPieceSlots, usePieceProps } from "../theme/themePieces.js";
20
20
  import { warnUnknownProps } from "../toolkit/unknownProps.js";
21
21
  const THEME_NAME = "CalcitaRecoveryCodesDialog";
22
22
  const RecoveryCodes = piecePart(THEME_NAME, "Codes", Box);
@@ -25,7 +25,7 @@ const CODE_FONT = "ui-monospace, SFMono-Regular, Menlo, monospace";
25
25
  function todayText() {
26
26
  return (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
27
27
  }
28
- function RecoveryCodesDialog(props) {
28
+ function RecoveryCodesDialogContent(props) {
29
29
  const { codes, account = "", onClose, onCodesSaved, texts, ...unknownProps } = usePieceProps(props, THEME_NAME);
30
30
  warnUnknownProps(THEME_NAME, unknownProps);
31
31
  const { t } = useToolkitTranslation("security", texts);
@@ -86,6 +86,7 @@ function RecoveryCodesDialog(props) {
86
86
  ] })
87
87
  );
88
88
  }
89
+ const RecoveryCodesDialog = withPieceSlots(RecoveryCodesDialogContent, THEME_NAME);
89
90
  export {
90
91
  RecoveryCodesDialog as default
91
92
  };