@stackcraftmx/calcita 0.31.0 → 0.32.1

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 (281) hide show
  1. package/README.md +7 -0
  2. package/dist/DataTable/AuditTrailDialog.js +4 -1
  3. package/dist/DataTable/AuditTrailDialog.js.map +1 -1
  4. package/dist/DataTable/AuditTrailTable.js +4 -1
  5. package/dist/DataTable/AuditTrailTable.js.map +1 -1
  6. package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js +3 -1
  7. package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js.map +1 -1
  8. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js +3 -1
  9. package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js.map +1 -1
  10. package/dist/DataTable/ColumnFilters/SortableFilterHeader.js +4 -1
  11. package/dist/DataTable/ColumnFilters/SortableFilterHeader.js.map +1 -1
  12. package/dist/DataTable/ColumnFilters/TextColumnFilter.js +3 -1
  13. package/dist/DataTable/ColumnFilters/TextColumnFilter.js.map +1 -1
  14. package/dist/DataTable/EmptyState.js +3 -1
  15. package/dist/DataTable/EmptyState.js.map +1 -1
  16. package/dist/DataTable/FilterChips.js +3 -1
  17. package/dist/DataTable/FilterChips.js.map +1 -1
  18. package/dist/DataTable/GoToPage.js +3 -1
  19. package/dist/DataTable/GoToPage.js.map +1 -1
  20. package/dist/DataTable/ServerTable.js +4 -1
  21. package/dist/DataTable/ServerTable.js.map +1 -1
  22. package/dist/DataTable/columns.js +3 -1
  23. package/dist/DataTable/columns.js.map +1 -1
  24. package/dist/access/Can.js +3 -1
  25. package/dist/access/Can.js.map +1 -1
  26. package/dist/access/PermissionMatrix.js +3 -1
  27. package/dist/access/PermissionMatrix.js.map +1 -1
  28. package/dist/access/RequireAccess.js +3 -1
  29. package/dist/access/RequireAccess.js.map +1 -1
  30. package/dist/account/AccountProvider.js +3 -1
  31. package/dist/account/AccountProvider.js.map +1 -1
  32. package/dist/account/AccountSecuritySection.js +3 -1
  33. package/dist/account/AccountSecuritySection.js.map +1 -1
  34. package/dist/account/DemoTotpCodeButton.js +3 -1
  35. package/dist/account/DemoTotpCodeButton.js.map +1 -1
  36. package/dist/account/ForgotPasswordScreen.js +3 -1
  37. package/dist/account/ForgotPasswordScreen.js.map +1 -1
  38. package/dist/account/ProfileScreen.js +4 -1
  39. package/dist/account/ProfileScreen.js.map +1 -1
  40. package/dist/account/ResetPasswordScreen.js +4 -1
  41. package/dist/account/ResetPasswordScreen.js.map +1 -1
  42. package/dist/account/SignInScreen.js +3 -1
  43. package/dist/account/SignInScreen.js.map +1 -1
  44. package/dist/appShell/AccountMenu.js +3 -1
  45. package/dist/appShell/AccountMenu.js.map +1 -1
  46. package/dist/appShell/AppLayout.js +4 -1
  47. package/dist/appShell/AppLayout.js.map +1 -1
  48. package/dist/appShell/AppearanceSettings.js +4 -1
  49. package/dist/appShell/AppearanceSettings.js.map +1 -1
  50. package/dist/appShell/AuthLayout.js +3 -1
  51. package/dist/appShell/AuthLayout.js.map +1 -1
  52. package/dist/appShell/BarActions.js +3 -1
  53. package/dist/appShell/BarActions.js.map +1 -1
  54. package/dist/appShell/BarSearch.js +3 -1
  55. package/dist/appShell/BarSearch.js.map +1 -1
  56. package/dist/appShell/HeaderTools.js +4 -1
  57. package/dist/appShell/HeaderTools.js.map +1 -1
  58. package/dist/appShell/MenuLinks.js +3 -1
  59. package/dist/appShell/MenuLinks.js.map +1 -1
  60. package/dist/appShell/MobileTabBar.js +3 -1
  61. package/dist/appShell/MobileTabBar.js.map +1 -1
  62. package/dist/appShell/SettingsMenu.js +3 -1
  63. package/dist/appShell/SettingsMenu.js.map +1 -1
  64. package/dist/appShell/SideMenu.js +4 -1
  65. package/dist/appShell/SideMenu.js.map +1 -1
  66. package/dist/appShell/SideMenuEntry.js +3 -1
  67. package/dist/appShell/SideMenuEntry.js.map +1 -1
  68. package/dist/appShell/SubmenuActionsMenu.js +3 -1
  69. package/dist/appShell/SubmenuActionsMenu.js.map +1 -1
  70. package/dist/appShell/TabBarEditor.js +3 -1
  71. package/dist/appShell/TabBarEditor.js.map +1 -1
  72. package/dist/appShell/TopMenu.js +3 -1
  73. package/dist/appShell/TopMenu.js.map +1 -1
  74. package/dist/appShell/Wordmark.js +3 -1
  75. package/dist/appShell/Wordmark.js.map +1 -1
  76. package/dist/appShell/pageTitle.js +3 -1
  77. package/dist/appShell/pageTitle.js.map +1 -1
  78. package/dist/auth/PasswordChecklist.js +3 -1
  79. package/dist/auth/PasswordChecklist.js.map +1 -1
  80. package/dist/calendar/EventCalendar.js +4 -1
  81. package/dist/calendar/EventCalendar.js.map +1 -1
  82. package/dist/calendar/EventDetails.js +3 -1
  83. package/dist/calendar/EventDetails.js.map +1 -1
  84. package/dist/datePickers/DateInput.js +4 -1
  85. package/dist/datePickers/DateInput.js.map +1 -1
  86. package/dist/downloads/DownloadManager.js +3 -1
  87. package/dist/downloads/DownloadManager.js.map +1 -1
  88. package/dist/feedback/ConfirmDialog.js +4 -1
  89. package/dist/feedback/ConfirmDialog.js.map +1 -1
  90. package/dist/feedback/ModalWaiting.js +3 -1
  91. package/dist/feedback/ModalWaiting.js.map +1 -1
  92. package/dist/feedback/NewBuildNotice.js +3 -1
  93. package/dist/feedback/NewBuildNotice.js.map +1 -1
  94. package/dist/filepond/FileDropzone.js +4 -1
  95. package/dist/filepond/FileDropzone.js.map +1 -1
  96. package/dist/formatting.js +8 -5
  97. package/dist/formatting.js.map +1 -1
  98. package/dist/forms/FormProblemAlert.js +3 -1
  99. package/dist/forms/FormProblemAlert.js.map +1 -1
  100. package/dist/forms/FormServerProblem.js +3 -1
  101. package/dist/forms/FormServerProblem.js.map +1 -1
  102. package/dist/forms/FormWizard.js +3 -1
  103. package/dist/forms/FormWizard.js.map +1 -1
  104. package/dist/forms/auth/ChangePasswordForm.js +3 -1
  105. package/dist/forms/auth/ChangePasswordForm.js.map +1 -1
  106. package/dist/forms/auth/ForgotPasswordForm.js +3 -1
  107. package/dist/forms/auth/ForgotPasswordForm.js.map +1 -1
  108. package/dist/forms/auth/SignInForm.js +3 -1
  109. package/dist/forms/auth/SignInForm.js.map +1 -1
  110. package/dist/forms/security/SecondStepForm.js +3 -1
  111. package/dist/forms/security/SecondStepForm.js.map +1 -1
  112. package/dist/forms/security/TwoStepVerificationCard.js +3 -1
  113. package/dist/forms/security/TwoStepVerificationCard.js.map +1 -1
  114. package/dist/hookForm/FormProblemAlert.js +3 -1
  115. package/dist/hookForm/FormProblemAlert.js.map +1 -1
  116. package/dist/hookForm/FormWizard.js +3 -1
  117. package/dist/hookForm/FormWizard.js.map +1 -1
  118. package/dist/inbox/InboxLayout.js +4 -1
  119. package/dist/inbox/InboxLayout.js.map +1 -1
  120. package/dist/inbox/MessageList.js +4 -1
  121. package/dist/inbox/MessageList.js.map +1 -1
  122. package/dist/inbox/MessageView.js +3 -1
  123. package/dist/inbox/MessageView.js.map +1 -1
  124. package/dist/index.js +3 -1
  125. package/dist/inputs/CatalogInput.js +4 -1
  126. package/dist/inputs/CatalogInput.js.map +1 -1
  127. package/dist/inputs/ColorInput.js +4 -1
  128. package/dist/inputs/ColorInput.js.map +1 -1
  129. package/dist/inputs/FieldFrame.js +3 -1
  130. package/dist/inputs/FieldFrame.js.map +1 -1
  131. package/dist/inputs/FormSection.js +5 -2
  132. package/dist/inputs/FormSection.js.map +1 -1
  133. package/dist/inputs/NumberInput.js +4 -1
  134. package/dist/inputs/NumberInput.js.map +1 -1
  135. package/dist/inputs/SelectInput.js +4 -1
  136. package/dist/inputs/SelectInput.js.map +1 -1
  137. package/dist/inputs/TextInput.js +2 -0
  138. package/dist/inputs/TextInput.js.map +1 -1
  139. package/dist/inputs/WizardLayout.js +4 -1
  140. package/dist/inputs/WizardLayout.js.map +1 -1
  141. package/dist/kanban/KanbanBoard.js +4 -1
  142. package/dist/kanban/KanbanBoard.js.map +1 -1
  143. package/dist/maps/MapView.js +4 -1
  144. package/dist/maps/MapView.js.map +1 -1
  145. package/dist/pwa/InstallAppSetting.js +3 -1
  146. package/dist/pwa/InstallAppSetting.js.map +1 -1
  147. package/dist/pwa/InstallInstructionsDialog.js +3 -1
  148. package/dist/pwa/InstallInstructionsDialog.js.map +1 -1
  149. package/dist/pwa/InstallPromptBanner.js +3 -1
  150. package/dist/pwa/InstallPromptBanner.js.map +1 -1
  151. package/dist/security/ActivityLog.js +3 -1
  152. package/dist/security/ActivityLog.js.map +1 -1
  153. package/dist/security/RecoveryCodesDialog.js +3 -1
  154. package/dist/security/RecoveryCodesDialog.js.map +1 -1
  155. package/dist/security/SessionsCard.js +3 -1
  156. package/dist/security/SessionsCard.js.map +1 -1
  157. package/dist/theme/createToolkitTheme.js +4 -1
  158. package/dist/theme/createToolkitTheme.js.map +1 -1
  159. package/dist/toolkit/ComponentTexts.js +3 -1
  160. package/dist/toolkit/ComponentTexts.js.map +1 -1
  161. package/dist/toolkit/ToolkitProvider.js +24 -3
  162. package/dist/toolkit/ToolkitProvider.js.map +1 -1
  163. package/dist/toolkit/toolkitContext.js.map +1 -1
  164. package/dist/toolkit/toolkitSettings.js +9 -0
  165. package/dist/toolkit/toolkitSettings.js.map +1 -1
  166. package/dist/toolkit/unknownProps.js +33 -0
  167. package/dist/toolkit/unknownProps.js.map +1 -0
  168. package/dist/types/DataTable/AuditTrailTable.d.ts +1 -1
  169. package/dist/types/DataTable/ColumnFilters/TextColumnFilter.d.ts +1 -1
  170. package/dist/types/DataTable/columns.d.ts +3 -1
  171. package/dist/types/access/Can.d.ts +1 -1
  172. package/dist/types/access/RequireAccess.d.ts +1 -1
  173. package/dist/types/account/AccountProvider.d.ts +1 -1
  174. package/dist/types/account/ForgotPasswordScreen.d.ts +1 -1
  175. package/dist/types/account/ResetPasswordScreen.d.ts +1 -1
  176. package/dist/types/appShell/MenuLinks.d.ts +1 -1
  177. package/dist/types/appShell/pageTitle.d.ts +1 -1
  178. package/dist/types/datePickers/DateInput.d.ts +1 -1
  179. package/dist/types/downloads/DownloadManager.d.ts +1 -1
  180. package/dist/types/formatting.d.ts +2 -1
  181. package/dist/types/forms/FormProblemAlert.d.ts +1 -1
  182. package/dist/types/forms/FormServerProblem.d.ts +1 -1
  183. package/dist/types/forms/FormWizard.d.ts +1 -1
  184. package/dist/types/forms/auth/ChangePasswordForm.d.ts +1 -1
  185. package/dist/types/forms/auth/ForgotPasswordForm.d.ts +1 -1
  186. package/dist/types/hookForm/FormProblemAlert.d.ts +1 -1
  187. package/dist/types/hookForm/FormWizard.d.ts +1 -1
  188. package/dist/types/index.d.ts +1 -1
  189. package/dist/types/inputs/CatalogInput.d.ts +1 -1
  190. package/dist/types/inputs/FieldFrame.d.ts +1 -1
  191. package/dist/types/inputs/NumberInput.d.ts +1 -1
  192. package/dist/types/inputs/TextInput.d.ts +2 -1
  193. package/dist/types/pwa/InstallAppSetting.d.ts +1 -1
  194. package/dist/types/theme/createToolkitTheme.d.ts +1 -1
  195. package/dist/types/toolkit/ComponentTexts.d.ts +1 -1
  196. package/dist/types/toolkit/ToolkitProvider.d.ts +4 -1
  197. package/dist/types/toolkit/toolkitContext.d.ts +2 -1
  198. package/dist/types/toolkit/toolkitSettings.d.ts +13 -2
  199. package/dist/types/toolkit/unknownProps.d.ts +23 -0
  200. package/dist/types/ui/actions/CopyButton.d.ts +1 -1
  201. package/dist/types/ui/actions/SecretField.d.ts +1 -1
  202. package/dist/types/ui/labels/DictionaryText.d.ts +1 -1
  203. package/dist/types/ui/layout/FullPageLoader.d.ts +1 -1
  204. package/dist/types/ui/metrics/CalendarHeatmap.d.ts +9 -8
  205. package/dist/types/ui/metrics/chartParts.d.ts +3 -3
  206. package/dist/types/ui/metrics/heatmapScale.d.ts +23 -0
  207. package/dist/types/ui/navigation/DocumentTitle.d.ts +1 -1
  208. package/dist/ui/actions/ActionsMenu.js +3 -1
  209. package/dist/ui/actions/ActionsMenu.js.map +1 -1
  210. package/dist/ui/actions/CopyButton.js +3 -1
  211. package/dist/ui/actions/CopyButton.js.map +1 -1
  212. package/dist/ui/actions/DownloadMenu.js +4 -1
  213. package/dist/ui/actions/DownloadMenu.js.map +1 -1
  214. package/dist/ui/actions/SecretField.js +3 -1
  215. package/dist/ui/actions/SecretField.js.map +1 -1
  216. package/dist/ui/actions/SelectionActions.js +3 -1
  217. package/dist/ui/actions/SelectionActions.js.map +1 -1
  218. package/dist/ui/filters/DateRangeFilter.js +3 -1
  219. package/dist/ui/filters/DateRangeFilter.js.map +1 -1
  220. package/dist/ui/filters/PeriodRangeSelector.js +3 -1
  221. package/dist/ui/filters/PeriodRangeSelector.js.map +1 -1
  222. package/dist/ui/filters/QuickFilters.js +3 -1
  223. package/dist/ui/filters/QuickFilters.js.map +1 -1
  224. package/dist/ui/filters/SegmentedControl.js +3 -1
  225. package/dist/ui/filters/SegmentedControl.js.map +1 -1
  226. package/dist/ui/labels/DictionaryText.js +3 -1
  227. package/dist/ui/labels/DictionaryText.js.map +1 -1
  228. package/dist/ui/labels/StatusChip.js +3 -1
  229. package/dist/ui/labels/StatusChip.js.map +1 -1
  230. package/dist/ui/layout/CollapsibleSection.js +3 -1
  231. package/dist/ui/layout/CollapsibleSection.js.map +1 -1
  232. package/dist/ui/layout/ContentDialog.js +3 -1
  233. package/dist/ui/layout/ContentDialog.js.map +1 -1
  234. package/dist/ui/layout/DefinitionList.js +3 -1
  235. package/dist/ui/layout/DefinitionList.js.map +1 -1
  236. package/dist/ui/layout/DetailHeader.js +3 -1
  237. package/dist/ui/layout/DetailHeader.js.map +1 -1
  238. package/dist/ui/layout/ErrorPage.js +4 -1
  239. package/dist/ui/layout/ErrorPage.js.map +1 -1
  240. package/dist/ui/layout/FullPageLoader.js +3 -1
  241. package/dist/ui/layout/FullPageLoader.js.map +1 -1
  242. package/dist/ui/layout/PageHeader.js +3 -1
  243. package/dist/ui/layout/PageHeader.js.map +1 -1
  244. package/dist/ui/layout/PageHeading.js +3 -1
  245. package/dist/ui/layout/PageHeading.js.map +1 -1
  246. package/dist/ui/layout/ProfileHeader.js +3 -1
  247. package/dist/ui/layout/ProfileHeader.js.map +1 -1
  248. package/dist/ui/layout/SectionCard.js +3 -1
  249. package/dist/ui/layout/SectionCard.js.map +1 -1
  250. package/dist/ui/metrics/BarList.js +3 -1
  251. package/dist/ui/metrics/BarList.js.map +1 -1
  252. package/dist/ui/metrics/CalendarHeatmap.js +13 -4
  253. package/dist/ui/metrics/CalendarHeatmap.js.map +1 -1
  254. package/dist/ui/metrics/ChartTooltip.js.map +1 -1
  255. package/dist/ui/metrics/ColumnChart.js +4 -1
  256. package/dist/ui/metrics/ColumnChart.js.map +1 -1
  257. package/dist/ui/metrics/LineChart.js +4 -1
  258. package/dist/ui/metrics/LineChart.js.map +1 -1
  259. package/dist/ui/metrics/MetricCard.js +4 -1
  260. package/dist/ui/metrics/MetricCard.js.map +1 -1
  261. package/dist/ui/metrics/TableToggle.js +3 -1
  262. package/dist/ui/metrics/TableToggle.js.map +1 -1
  263. package/dist/ui/metrics/chartParts.js +7 -3
  264. package/dist/ui/metrics/chartParts.js.map +1 -1
  265. package/dist/ui/metrics/heatmapScale.js +15 -1
  266. package/dist/ui/metrics/heatmapScale.js.map +1 -1
  267. package/dist/ui/navigation/ColorSchemeToggle.js +3 -1
  268. package/dist/ui/navigation/ColorSchemeToggle.js.map +1 -1
  269. package/dist/ui/navigation/DocumentTitle.js +3 -1
  270. package/dist/ui/navigation/DocumentTitle.js.map +1 -1
  271. package/dist/ui/navigation/FontSizeToggle.js +3 -1
  272. package/dist/ui/navigation/FontSizeToggle.js.map +1 -1
  273. package/dist/ui/navigation/LanguageToggle.js +3 -1
  274. package/dist/ui/navigation/LanguageToggle.js.map +1 -1
  275. package/dist/ui/navigation/PageBreadcrumbs.js +3 -1
  276. package/dist/ui/navigation/PageBreadcrumbs.js.map +1 -1
  277. package/dist/ui/timeline/GroupedTimeline.js +3 -1
  278. package/dist/ui/timeline/GroupedTimeline.js.map +1 -1
  279. package/dist/upload/FileDropzone.js +4 -1
  280. package/dist/upload/FileDropzone.js.map +1 -1
  281. package/package.json +1 -1
@@ -5,7 +5,8 @@ import { allowOnlyUnrestricted } from "../access/accessRules.js";
5
5
  import { browserNavigation } from "./browserNavigation.js";
6
6
  import { ToolkitContext } from "./toolkitContext.js";
7
7
  import { useFontSize } from "../ui/navigation/useFontSize.js";
8
- import { DEFAULT_CURRENCY, DEFAULT_LANGUAGES, DEFAULT_LANGUAGE, browserTimeZone, configureToolkit } from "./toolkitSettings.js";
8
+ import { DEFAULT_HOUR_CYCLE, DEFAULT_CURRENCY, DEFAULT_LANGUAGES, DEFAULT_LANGUAGE, browserTimeZone, configureToolkit } from "./toolkitSettings.js";
9
+ import { warnUnknownProps } from "./unknownProps.js";
9
10
  const ToolkitProvider = ({
10
11
  language,
11
12
  languages,
@@ -14,13 +15,16 @@ const ToolkitProvider = ({
14
15
  translate,
15
16
  timeZone,
16
17
  currency,
18
+ hourCycle,
17
19
  appName,
18
20
  navigation,
19
21
  buildId,
20
22
  canAccess,
21
23
  fileTypes,
22
- children
24
+ children,
25
+ ...unknownProps
23
26
  }) => {
27
+ warnUnknownProps("ToolkitProvider", unknownProps);
24
28
  const parent = useContext(ToolkitContext);
25
29
  const settings = useMemo(() => ({
26
30
  language: language ?? parent?.language ?? DEFAULT_LANGUAGE,
@@ -30,12 +34,28 @@ const ToolkitProvider = ({
30
34
  translate: translate ?? parent?.translate ?? null,
31
35
  timeZone: timeZone ?? parent?.timeZone ?? browserTimeZone(),
32
36
  currency: currency ?? parent?.currency ?? DEFAULT_CURRENCY,
37
+ hourCycle: hourCycle ?? parent?.hourCycle ?? DEFAULT_HOUR_CYCLE,
33
38
  appName: appName ?? parent?.appName ?? "",
34
39
  navigation: navigation ?? parent?.navigation ?? browserNavigation,
35
40
  buildId: buildId ?? parent?.buildId ?? "",
36
41
  canAccess: canAccess ?? parent?.canAccess ?? allowOnlyUnrestricted,
37
42
  fileTypes: fileTypes ?? parent?.fileTypes ?? null
38
- }), [parent, language, languages, onLanguageChange, texts, translate, timeZone, currency, appName, navigation, buildId, canAccess, fileTypes]);
43
+ }), [
44
+ parent,
45
+ language,
46
+ languages,
47
+ onLanguageChange,
48
+ texts,
49
+ translate,
50
+ timeZone,
51
+ currency,
52
+ hourCycle,
53
+ appName,
54
+ navigation,
55
+ buildId,
56
+ canAccess,
57
+ fileTypes
58
+ ]);
39
59
  if (!parent) {
40
60
  configureToolkit({
41
61
  language: settings.language,
@@ -43,6 +63,7 @@ const ToolkitProvider = ({
43
63
  translate: settings.translate,
44
64
  timeZone: settings.timeZone,
45
65
  currency: settings.currency,
66
+ hourCycle: settings.hourCycle,
46
67
  appName: settings.appName,
47
68
  buildId: settings.buildId,
48
69
  languages: settings.languages
@@ -1 +1 @@
1
- {"version":3,"file":"ToolkitProvider.js","sources":["../../src/toolkit/ToolkitProvider.jsx"],"sourcesContent":["// El proveedor del paquete: el único lugar donde cada aplicación conecta su idioma, sus textos, su zona horaria y su\n// router. Va por encima de la aplicación, dentro del ThemeProvider de MUI (el tema lo arma cada proyecto; sin tema,\n// los componentes usan los colores por omisión de MUI).\n//\n// <ToolkitProvider language=\"es\" navigation={reactRouterNavigation} texts={{es: {common: {actions: {back: 'Volver'}}}}}>\n//\n// Sin proveedor todo funciona en español, con la zona del navegador y la navegación del navegador.\n//\n// Un proveedor dentro de otro (una parte de la app en otro idioma, una vista previa) toma del de afuera lo que no le digan, y\n// sus componentes leen el suyo: el más cercano. Solo el de la raíz pone la configuración que leen las funciones sueltas\n// (avisos, errores, formatos sueltos): antes el de adentro se la cambiaba a toda la app. Dos islas de React en una página\n// vieja son dos raíces: cada isla pinta con la suya, y las funciones sueltas usan la última que se pintó (en ese caso los\n// componentes de la casa ya formatean con su proveedor; para un aviso, mándelo con el texto ya traducido).\n//\n// Lo renderiza la app: arrow (regla de la casa).\nimport {useContext, useMemo} from 'react';\nimport {allowOnlyUnrestricted} from '@/access/accessRules.js';\nimport {browserNavigation} from '@/toolkit/browserNavigation.js';\nimport {ToolkitContext} from '@/toolkit/toolkitContext.js';\nimport {useFontSize} from '@/ui/navigation/useFontSize.js';\nimport {DEFAULT_CURRENCY, DEFAULT_LANGUAGE, DEFAULT_LANGUAGES, browserTimeZone, configureToolkit} from '@/toolkit/toolkitSettings.js';\n\n/**\n * @param {object} props\n * @param {string} [props.language] idioma activo, uno de `languages` (por omisión es)\n * @param {Array<{code: string, label: string, locale?: string}>} [props.languages] los idiomas que ofrece la app: su código,\n * su nombre en su propio idioma («Português») y su locale de Intl ('pt-BR'). Por omisión español e inglés\n * (DEFAULT_LANGUAGES). Sus traducciones van en `texts`\n * @param {Record<string, {Icon: import('react').ElementType, color?: string, label?: string, hint?: string}>} [props.fileTypes]\n * tipos de archivo del proyecto para las descargas, además de Excel, CSV y PDF (downloads/fileTypes.js)\n * @param {(language: string) => void} [props.onLanguageChange] lo llama LanguageToggle; el proyecto cambia su idioma\n * @param {object} [props.texts] textos propios por idioma, con la forma de locales/ ({es: {table: {...}}})\n * @param {(namespace: string, key: string, values?: object) => string|undefined} [props.translate] traductor del\n * proyecto (por ejemplo i18next); undefined deja el texto del paquete\n * @param {string} [props.timeZone] zona de las fechas (por omisión la del navegador)\n * @param {string} [props.currency] moneda de los montos, código ISO 4217 (por omisión MXN)\n * @param {string} [props.appName] nombre de la aplicación para el título de la pestaña\n * @param {object} [props.navigation] {useNavigate, useLocation, Link}; por omisión la del navegador\n * @param {string} [props.buildId] la compilación del front que corre en esta pestaña; con ella NewBuildNotice sabe si el\n * servidor ya publicó otra (reportPublishedBuild). Vacía (en desarrollo) nunca avisa\n * @param {(access: object|undefined|null) => boolean} [props.canAccess] quién ve qué (menú, rutas, botones): la regla del\n * proyecto, normalmente createAccessChecker({abilities, roles, policies, context}). Sin ella solo se ve lo que no\n * tiene regla\n * @param {import('react').ReactNode} props.children\n */\nexport const ToolkitProvider = ({\n language, languages, onLanguageChange, texts, translate, timeZone, currency, appName, navigation, buildId, canAccess, fileTypes, children,\n}) => {\n // el proveedor de afuera, si este va dentro de otro: de él sale lo que este no diga\n const parent = useContext(ToolkitContext);\n const settings = useMemo(() => ({\n language: language ?? parent?.language ?? DEFAULT_LANGUAGE,\n languages: languages ?? parent?.languages ?? DEFAULT_LANGUAGES,\n onLanguageChange: onLanguageChange ?? parent?.onLanguageChange ?? null,\n texts: texts ?? parent?.texts ?? {},\n translate: translate ?? parent?.translate ?? null,\n timeZone: timeZone ?? parent?.timeZone ?? browserTimeZone(),\n currency: currency ?? parent?.currency ?? DEFAULT_CURRENCY,\n appName: appName ?? parent?.appName ?? '',\n navigation: navigation ?? parent?.navigation ?? browserNavigation,\n buildId: buildId ?? parent?.buildId ?? '',\n canAccess: canAccess ?? parent?.canAccess ?? allowOnlyUnrestricted,\n fileTypes: fileTypes ?? parent?.fileTypes ?? null,\n }), [parent, language, languages, onLanguageChange, texts, translate, timeZone, currency, appName, navigation, buildId, canAccess, fileTypes]);\n\n // solo el de la raíz: un proveedor de adentro le cambiaba el idioma y la zona a las funciones sueltas de toda la app.\n // OJO: se configura durante el render (no en un efecto) para que los formatos y avisos que se llaman en este mismo\n // render ya vean el idioma y la zona nuevos\n if (!parent) {\n configureToolkit({\n language: settings.language, texts: settings.texts, translate: settings.translate, timeZone: settings.timeZone, currency: settings.currency,\n appName: settings.appName, buildId: settings.buildId, languages: settings.languages,\n });\n }\n\n // el tamaño de letra que la persona guardó: se aplica aquí, que siempre está montado. Antes lo aplicaba su botón en la\n // barra; al pasar los ajustes al menú de la cuenta, al recargar se perdía hasta abrir el menú (error pagado)\n useFontSize();\n\n return <ToolkitContext.Provider value={settings}>{children}</ToolkitContext.Provider>;\n};\n"],"names":[],"mappings":";;;;;;;;AA6CO,MAAM,kBAAkB,CAAC;AAAA,EAC5B;AAAA,EAAU;AAAA,EAAW;AAAA,EAAkB;AAAA,EAAO;AAAA,EAAW;AAAA,EAAU;AAAA,EAAU;AAAA,EAAS;AAAA,EAAY;AAAA,EAAS;AAAA,EAAW;AAAA,EAAW;AACrI,MAAM;AAEF,QAAM,SAAS,WAAW,cAAc;AACxC,QAAM,WAAW,QAAQ,OAAO;AAAA,IAC5B,UAAU,YAAY,QAAQ,YAAY;AAAA,IAC1C,WAAW,aAAa,QAAQ,aAAa;AAAA,IAC7C,kBAAkB,oBAAoB,QAAQ,oBAAoB;AAAA,IAClE,OAAO,SAAS,QAAQ,SAAS,CAAA;AAAA,IACjC,WAAW,aAAa,QAAQ,aAAa;AAAA,IAC7C,UAAU,YAAY,QAAQ,YAAY,gBAAA;AAAA,IAC1C,UAAU,YAAY,QAAQ,YAAY;AAAA,IAC1C,SAAS,WAAW,QAAQ,WAAW;AAAA,IACvC,YAAY,cAAc,QAAQ,cAAc;AAAA,IAChD,SAAS,WAAW,QAAQ,WAAW;AAAA,IACvC,WAAW,aAAa,QAAQ,aAAa;AAAA,IAC7C,WAAW,aAAa,QAAQ,aAAa;AAAA,EAAA,IAC7C,CAAC,QAAQ,UAAU,WAAW,kBAAkB,OAAO,WAAW,UAAU,UAAU,SAAS,YAAY,SAAS,WAAW,SAAS,CAAC;AAK7I,MAAI,CAAC,QAAQ;AACT,qBAAiB;AAAA,MACb,UAAU,SAAS;AAAA,MAAU,OAAO,SAAS;AAAA,MAAO,WAAW,SAAS;AAAA,MAAW,UAAU,SAAS;AAAA,MAAU,UAAU,SAAS;AAAA,MACnI,SAAS,SAAS;AAAA,MAAS,SAAS,SAAS;AAAA,MAAS,WAAW,SAAS;AAAA,IAAA,CAC7E;AAAA,EACL;AAIA,cAAA;AAEA,6BAAQ,eAAe,UAAf,EAAwB,OAAO,UAAW,UAAS;AAC/D;"}
1
+ {"version":3,"file":"ToolkitProvider.js","sources":["../../src/toolkit/ToolkitProvider.jsx"],"sourcesContent":["// El proveedor del paquete: el único lugar donde cada aplicación conecta su idioma, sus textos, su zona horaria y su\n// router. Va por encima de la aplicación, dentro del ThemeProvider de MUI (el tema lo arma cada proyecto; sin tema,\n// los componentes usan los colores por omisión de MUI).\n//\n// <ToolkitProvider language=\"es\" navigation={reactRouterNavigation} texts={{es: {common: {actions: {back: 'Volver'}}}}}>\n//\n// Sin proveedor todo funciona en español, con la zona del navegador y la navegación del navegador.\n//\n// Un proveedor dentro de otro (una parte de la app en otro idioma, una vista previa) toma del de afuera lo que no le digan, y\n// sus componentes leen el suyo: el más cercano. Solo el de la raíz pone la configuración que leen las funciones sueltas\n// (avisos, errores, formatos sueltos): antes el de adentro se la cambiaba a toda la app. Dos islas de React en una página\n// vieja son dos raíces: cada isla pinta con la suya, y las funciones sueltas usan la última que se pintó (en ese caso los\n// componentes de la casa ya formatean con su proveedor; para un aviso, mándelo con el texto ya traducido).\n//\n// Lo renderiza la app: arrow (regla de la casa).\nimport {useContext, useMemo} from 'react';\nimport {allowOnlyUnrestricted} from '@/access/accessRules.js';\nimport {browserNavigation} from '@/toolkit/browserNavigation.js';\nimport {ToolkitContext} from '@/toolkit/toolkitContext.js';\nimport {useFontSize} from '@/ui/navigation/useFontSize.js';\nimport {DEFAULT_CURRENCY, DEFAULT_HOUR_CYCLE, DEFAULT_LANGUAGE, DEFAULT_LANGUAGES, browserTimeZone, configureToolkit} from '@/toolkit/toolkitSettings.js';\nimport {warnUnknownProps} from '@/toolkit/unknownProps.js';\n\n/**\n * @param {object} props\n * @param {string} [props.language] idioma activo, uno de `languages` (por omisión es)\n * @param {Array<{code: string, label: string, locale?: string}>} [props.languages] los idiomas que ofrece la app: su código,\n * su nombre en su propio idioma («Português») y su locale de Intl ('pt-BR'). Por omisión español e inglés\n * (DEFAULT_LANGUAGES). Sus traducciones van en `texts`\n * @param {Record<string, {Icon: import('react').ElementType, color?: string, label?: string, hint?: string}>} [props.fileTypes]\n * tipos de archivo del proyecto para las descargas, además de Excel, CSV y PDF (downloads/fileTypes.js)\n * @param {(language: string) => void} [props.onLanguageChange] lo llama LanguageToggle; el proyecto cambia su idioma\n * @param {object} [props.texts] textos propios por idioma, con la forma de locales/ ({es: {table: {...}}})\n * @param {(namespace: string, key: string, values?: object) => string|undefined} [props.translate] traductor del\n * proyecto (por ejemplo i18next); undefined deja el texto del paquete\n * @param {string} [props.timeZone] zona de las fechas (por omisión la del navegador)\n * @param {string} [props.currency] moneda de los montos, código ISO 4217 (por omisión MXN)\n * @param {'h23'|'h12'} [props.hourCycle] la hora de 24 horas («15:10», por omisión) o de 12 con a.m. y p.m. («3:10 p.m.»):\n * HOUR_CYCLE.twentyFourHours o HOUR_CYCLE.twelveHours\n * @param {string} [props.appName] nombre de la aplicación para el título de la pestaña\n * @param {object} [props.navigation] {useNavigate, useLocation, Link}; por omisión la del navegador\n * @param {string} [props.buildId] la compilación del front que corre en esta pestaña; con ella NewBuildNotice sabe si el\n * servidor ya publicó otra (reportPublishedBuild). Vacía (en desarrollo) nunca avisa\n * @param {(access: object|undefined|null) => boolean} [props.canAccess] quién ve qué (menú, rutas, botones): la regla del\n * proyecto, normalmente createAccessChecker({abilities, roles, policies, context}). Sin ella solo se ve lo que no\n * tiene regla\n * @param {import('react').ReactNode} props.children\n */\nexport const ToolkitProvider = ({\n language, languages, onLanguageChange, texts, translate, timeZone, currency, hourCycle, appName, navigation, buildId, canAccess, fileTypes,\n children,\n ...unknownProps\n}) => {\n warnUnknownProps('ToolkitProvider', unknownProps);\n // el proveedor de afuera, si este va dentro de otro: de él sale lo que este no diga\n const parent = useContext(ToolkitContext);\n const settings = useMemo(() => ({\n language: language ?? parent?.language ?? DEFAULT_LANGUAGE,\n languages: languages ?? parent?.languages ?? DEFAULT_LANGUAGES,\n onLanguageChange: onLanguageChange ?? parent?.onLanguageChange ?? null,\n texts: texts ?? parent?.texts ?? {},\n translate: translate ?? parent?.translate ?? null,\n timeZone: timeZone ?? parent?.timeZone ?? browserTimeZone(),\n currency: currency ?? parent?.currency ?? DEFAULT_CURRENCY,\n hourCycle: hourCycle ?? parent?.hourCycle ?? DEFAULT_HOUR_CYCLE,\n appName: appName ?? parent?.appName ?? '',\n navigation: navigation ?? parent?.navigation ?? browserNavigation,\n buildId: buildId ?? parent?.buildId ?? '',\n canAccess: canAccess ?? parent?.canAccess ?? allowOnlyUnrestricted,\n fileTypes: fileTypes ?? parent?.fileTypes ?? null,\n }), [parent, language, languages, onLanguageChange, texts, translate, timeZone, currency, hourCycle, appName, navigation, buildId, canAccess,\n fileTypes]);\n\n // solo el de la raíz: un proveedor de adentro le cambiaba el idioma y la zona a las funciones sueltas de toda la app.\n // OJO: se configura durante el render (no en un efecto) para que los formatos y avisos que se llaman en este mismo\n // render ya vean el idioma y la zona nuevos\n if (!parent) {\n configureToolkit({\n language: settings.language, texts: settings.texts, translate: settings.translate, timeZone: settings.timeZone, currency: settings.currency,\n hourCycle: settings.hourCycle, appName: settings.appName, buildId: settings.buildId, languages: settings.languages,\n });\n }\n\n // el tamaño de letra que la persona guardó: se aplica aquí, que siempre está montado. Antes lo aplicaba su botón en la\n // barra; al pasar los ajustes al menú de la cuenta, al recargar se perdía hasta abrir el menú (error pagado)\n useFontSize();\n\n return <ToolkitContext.Provider value={settings}>{children}</ToolkitContext.Provider>;\n};\n"],"names":[],"mappings":";;;;;;;;;AAgDO,MAAM,kBAAkB,CAAC;AAAA,EAC5B;AAAA,EAAU;AAAA,EAAW;AAAA,EAAkB;AAAA,EAAO;AAAA,EAAW;AAAA,EAAU;AAAA,EAAU;AAAA,EAAW;AAAA,EAAS;AAAA,EAAY;AAAA,EAAS;AAAA,EAAW;AAAA,EACjI;AAAA,EACA,GAAG;AACP,MAAM;AACF,mBAAiB,mBAAmB,YAAY;AAEhD,QAAM,SAAS,WAAW,cAAc;AACxC,QAAM,WAAW,QAAQ,OAAO;AAAA,IAC5B,UAAU,YAAY,QAAQ,YAAY;AAAA,IAC1C,WAAW,aAAa,QAAQ,aAAa;AAAA,IAC7C,kBAAkB,oBAAoB,QAAQ,oBAAoB;AAAA,IAClE,OAAO,SAAS,QAAQ,SAAS,CAAA;AAAA,IACjC,WAAW,aAAa,QAAQ,aAAa;AAAA,IAC7C,UAAU,YAAY,QAAQ,YAAY,gBAAA;AAAA,IAC1C,UAAU,YAAY,QAAQ,YAAY;AAAA,IAC1C,WAAW,aAAa,QAAQ,aAAa;AAAA,IAC7C,SAAS,WAAW,QAAQ,WAAW;AAAA,IACvC,YAAY,cAAc,QAAQ,cAAc;AAAA,IAChD,SAAS,WAAW,QAAQ,WAAW;AAAA,IACvC,WAAW,aAAa,QAAQ,aAAa;AAAA,IAC7C,WAAW,aAAa,QAAQ,aAAa;AAAA,EAAA,IAC7C;AAAA,IAAC;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAW;AAAA,IAAkB;AAAA,IAAO;AAAA,IAAW;AAAA,IAAU;AAAA,IAAU;AAAA,IAAW;AAAA,IAAS;AAAA,IAAY;AAAA,IAAS;AAAA,IAC/H;AAAA,EAAA,CAAU;AAKd,MAAI,CAAC,QAAQ;AACT,qBAAiB;AAAA,MACb,UAAU,SAAS;AAAA,MAAU,OAAO,SAAS;AAAA,MAAO,WAAW,SAAS;AAAA,MAAW,UAAU,SAAS;AAAA,MAAU,UAAU,SAAS;AAAA,MACnI,WAAW,SAAS;AAAA,MAAW,SAAS,SAAS;AAAA,MAAS,SAAS,SAAS;AAAA,MAAS,WAAW,SAAS;AAAA,IAAA,CAC5G;AAAA,EACL;AAIA,cAAA;AAEA,6BAAQ,eAAe,UAAf,EAAwB,OAAO,UAAW,UAAS;AAC/D;"}
@@ -1 +1 @@
1
- {"version":3,"file":"toolkitContext.js","sources":["../../src/toolkit/toolkitContext.js"],"sourcesContent":["// El contexto de ToolkitProvider y los hooks que lo leen. Vive aparte del proveedor (que es .jsx) para que los hooks se\n// importen desde archivos .js sin arrastrar JSX.\n//\n// Hooks genéricos: function (regla de la casa).\nimport {createContext, useContext} from 'react';\nimport {allowOnlyUnrestricted} from '@/access/accessRules.js';\nimport {browserNavigation} from '@/toolkit/browserNavigation.js';\nimport {toolkitSettings} from '@/toolkit/toolkitSettings.js';\n\nexport const ToolkitContext = createContext(null);\n\n/**\n * La configuración del proveedor; sin proveedor, la vigente con la navegación del navegador.\n *\n * @returns {{language: string, onLanguageChange: Function|null, texts: object, translate: Function|null, timeZone: string, currency: string, appName: string, buildId: string, navigation: object, canAccess: Function}}\n */\nexport function useToolkitSettings() {\n const settings = useContext(ToolkitContext);\n\n return settings ?? {...toolkitSettings(), onLanguageChange: null, navigation: browserNavigation, canAccess: allowOnlyUnrestricted};\n}\n\n/**\n * La navegación que conectó el proyecto: {useNavigate, useLocation, Link}.\n *\n * @returns {{useNavigate: Function, useLocation: Function, Link: import('react').ElementType}}\n */\nexport function useToolkitNavigation() {\n return useToolkitSettings().navigation;\n}\n"],"names":[],"mappings":";;;;;AASY,MAAC,iBAAiB,cAAc,IAAI;AAOzC,SAAS,qBAAqB;AACjC,QAAM,WAAW,WAAW,cAAc;AAE1C,SAAO,YAAY,EAAC,GAAG,mBAAmB,kBAAkB,MAAM,YAAY,mBAAmB,WAAW,sBAAqB;AACrI;AAOO,SAAS,uBAAuB;AACnC,SAAO,mBAAkB,EAAG;AAChC;"}
1
+ {"version":3,"file":"toolkitContext.js","sources":["../../src/toolkit/toolkitContext.js"],"sourcesContent":["// El contexto de ToolkitProvider y los hooks que lo leen. Vive aparte del proveedor (que es .jsx) para que los hooks se\n// importen desde archivos .js sin arrastrar JSX.\n//\n// Hooks genéricos: function (regla de la casa).\nimport {createContext, useContext} from 'react';\nimport {allowOnlyUnrestricted} from '@/access/accessRules.js';\nimport {browserNavigation} from '@/toolkit/browserNavigation.js';\nimport {toolkitSettings} from '@/toolkit/toolkitSettings.js';\n\nexport const ToolkitContext = createContext(null);\n\n/**\n * La configuración del proveedor; sin proveedor, la vigente con la navegación del navegador.\n *\n * @returns {{language: string, onLanguageChange: Function|null, texts: object, translate: Function|null, timeZone: string, currency: string, hourCycle: 'h23'|'h12', appName: string, buildId: string, navigation: object, canAccess: Function}}\n */\nexport function useToolkitSettings() {\n const settings = useContext(ToolkitContext);\n\n return settings ?? {...toolkitSettings(), onLanguageChange: null, navigation: browserNavigation, canAccess: allowOnlyUnrestricted};\n}\n\n/**\n * La navegación que conectó el proyecto: {useNavigate, useLocation, Link}.\n *\n * @returns {{useNavigate: Function, useLocation: Function, Link: import('react').ElementType}}\n */\nexport function useToolkitNavigation() {\n return useToolkitSettings().navigation;\n}\n"],"names":[],"mappings":";;;;;AASY,MAAC,iBAAiB,cAAc,IAAI;AAOzC,SAAS,qBAAqB;AACjC,QAAM,WAAW,WAAW,cAAc;AAE1C,SAAO,YAAY,EAAC,GAAG,mBAAmB,kBAAkB,MAAM,YAAY,mBAAmB,WAAW,sBAAqB;AACrI;AAOO,SAAS,uBAAuB;AACnC,SAAO,mBAAkB,EAAG;AAChC;"}
@@ -2,6 +2,11 @@ import es from "../locales/es.js";
2
2
  import en from "../locales/en.js";
3
3
  const DEFAULT_LANGUAGE = "es";
4
4
  const DEFAULT_CURRENCY = "MXN";
5
+ const HOUR_CYCLE = Object.freeze({
6
+ twentyFourHours: "h23",
7
+ twelveHours: "h12"
8
+ });
9
+ const DEFAULT_HOUR_CYCLE = HOUR_CYCLE.twentyFourHours;
5
10
  const PACKAGE_TEXTS_BY_LANGUAGE = Object.freeze({ es, en });
6
11
  const DEFAULT_LANGUAGES = Object.freeze([
7
12
  Object.freeze({ code: "es", label: "Español", locale: "es-MX" }),
@@ -21,6 +26,8 @@ let currentSettings = Object.freeze({
21
26
  translate: null,
22
27
  timeZone: browserTimeZone(),
23
28
  currency: DEFAULT_CURRENCY,
29
+ // la hora de 24 o de 12 horas (HOUR_CYCLE)
30
+ hourCycle: DEFAULT_HOUR_CYCLE,
24
31
  appName: "",
25
32
  // la compilación del front que corre en esta pestaña ('' en desarrollo): con ella se sabe si hay una versión nueva
26
33
  buildId: "",
@@ -94,8 +101,10 @@ function translateToolkit(defaultNamespace, key, values) {
94
101
  }
95
102
  export {
96
103
  DEFAULT_CURRENCY,
104
+ DEFAULT_HOUR_CYCLE,
97
105
  DEFAULT_LANGUAGE,
98
106
  DEFAULT_LANGUAGES,
107
+ HOUR_CYCLE,
99
108
  browserTimeZone,
100
109
  componentTextOf,
101
110
  configureToolkit,
@@ -1 +1 @@
1
- {"version":3,"file":"toolkitSettings.js","sources":["../../src/toolkit/toolkitSettings.js"],"sourcesContent":["// La configuración del paquete: idioma, textos, zona horaria, moneda, nombre de la aplicación y navegación.\n//\n// La pone ToolkitProvider en cada render y la leen también las funciones que no son componentes (formatos de fecha y\n// número, avisos, errores del servidor). Sin proveedor valen los de omisión: español, la zona del navegador y la\n// navegación del navegador.\n//\n// Los textos se resuelven en este orden, para que cada proyecto cambie solo lo que necesite:\n// 1. translate del proyecto (por ejemplo el t de i18next), si regresa un texto;\n// 2. los textos que el proyecto pasó en `texts`, del idioma activo;\n// 3. los textos del paquete (locales/), del idioma activo y, si no está, en español.\n// Las llaves usan la forma de i18next: «namespace:llave.anidada», {{variable}} y plurales con _one / _other.\n//\n// Funciones puras, no renderizan: function (regla de la casa).\nimport es from '@/locales/es.js';\nimport en from '@/locales/en.js';\n\nexport const DEFAULT_LANGUAGE = 'es';\n// la moneda de los montos (código ISO 4217) cuando el proyecto no dice otra\nexport const DEFAULT_CURRENCY = 'MXN';\n\nconst PACKAGE_TEXTS_BY_LANGUAGE = Object.freeze({es, en});\n\n/**\n * Los idiomas que ofrece la app cuando el proyecto no dice otros: su código, su nombre en su propio idioma (así lo busca quien\n * lo habla) y cómo se escriben sus números y fechas (Intl). El proyecto agrega los suyos en ToolkitProvider `languages` y pone\n * sus traducciones en `texts` (lo que no traduzca sale en español); los textos del paquete solo vienen en español e inglés.\n */\nexport const DEFAULT_LANGUAGES = Object.freeze([\n Object.freeze({code: 'es', label: 'Español', locale: 'es-MX'}),\n Object.freeze({code: 'en', label: 'English', locale: 'en-US'}),\n]);\n\nconst NAMESPACE_SEPARATOR = ':';\nconst KEY_SEPARATOR = '.';\nconst PLURAL_SEPARATOR = '_';\nconst PLURAL_OTHER = 'other';\nconst INTERPOLATION = /\\{\\{\\s*(\\w+)\\s*\\}\\}/g;\n\n/**\n * La zona horaria del navegador; si el navegador no la sabe, la de la Ciudad de México.\n *\n * @returns {string}\n */\nexport function browserTimeZone() {\n return Intl.DateTimeFormat().resolvedOptions().timeZone ?? 'America/Mexico_City';\n}\n\nlet currentSettings = Object.freeze({\n language: DEFAULT_LANGUAGE,\n texts: {},\n translate: null,\n timeZone: browserTimeZone(),\n currency: DEFAULT_CURRENCY,\n appName: '',\n // la compilación del front que corre en esta pestaña ('' en desarrollo): con ella se sabe si hay una versión nueva\n buildId: '',\n // los idiomas que ofrece la app (DEFAULT_LANGUAGES)\n languages: DEFAULT_LANGUAGES,\n});\n\n/**\n * Cambia la configuración que leen las funciones del paquete. La llama ToolkitProvider; un proyecto sin React (o una\n * prueba) la puede llamar directo.\n *\n * @param {{language?: string, texts?: object, translate?: Function|null, timeZone?: string, currency?: string, appName?: string, buildId?: string, languages?: Array<{code: string, label: string, locale?: string}>}} settings\n * @returns {void}\n */\nexport function configureToolkit(settings) {\n currentSettings = Object.freeze({...currentSettings, ...settings});\n}\n\n/**\n * La configuración vigente.\n *\n * @returns {{language: string, texts: object, translate: Function|null, timeZone: string, currency: string, appName: string, buildId: string, languages: Array<{code: string, label: string, locale?: string}>}}\n */\nexport function toolkitSettings() {\n return currentSettings;\n}\n\n/**\n * El locale de Intl del idioma: el que dice su lista de idiomas (es → es-MX, pt → pt-BR) o, si no dice, el código mismo\n * (Intl entiende «pt»). OJO: antes un idioma que no fuera es ni en salía con los números y las fechas de México.\n *\n * @param {string} language\n * @param {Array<{code: string, locale?: string}>} [languages] por omisión los de la configuración vigente\n * @returns {string}\n */\nexport function intlLocaleOf(language, languages = currentSettings.languages) {\n const known = languages?.find((entry) => entry.code === language) ?? DEFAULT_LANGUAGES.find((entry) => entry.code === language);\n return known?.locale ?? language ?? DEFAULT_LANGUAGES[0].locale;\n}\n\n/**\n * Lo que hay en una ruta de llaves («toast.error») dentro de un objeto de textos.\n *\n * @param {object|undefined} texts\n * @param {string} path\n * @returns {unknown}\n */\nfunction valueAtPath(texts, path) {\n let value = texts;\n for (const part of path.split(KEY_SEPARATOR)) {\n if (value === null || typeof value !== 'object') {\n return undefined;\n }\n value = value[part];\n }\n\n return value;\n}\n\n/**\n * El texto de una llave en un objeto de textos, con su plural si trae count (como i18next: llave_one, llave_other).\n *\n * @param {object|undefined} texts los textos de un idioma, por namespace\n * @param {string} namespace\n * @param {string} key\n * @param {object|undefined} values\n * @param {string} language\n * @returns {string|undefined}\n */\nfunction textOf(texts, namespace, key, values, language) {\n const namespaceTexts = texts?.[namespace];\n if (typeof values?.count === 'number') {\n const pluralCategory = new Intl.PluralRules(intlLocaleOf(language)).select(values.count);\n const pluralText = valueAtPath(namespaceTexts, `${key}${PLURAL_SEPARATOR}${pluralCategory}`)\n ?? valueAtPath(namespaceTexts, `${key}${PLURAL_SEPARATOR}${PLURAL_OTHER}`);\n if (typeof pluralText === 'string') {\n return pluralText;\n }\n }\n\n const text = valueAtPath(namespaceTexts, key);\n\n return typeof text === 'string' ? text : undefined;\n}\n\n/**\n * Pone los valores en las {{variables}} del texto; una variable sin valor se queda como está.\n *\n * @param {string} text\n * @param {object|undefined} values\n * @returns {string}\n */\nfunction interpolate(text, values) {\n return text.replace(INTERPOLATION, (placeholder, name) => (values?.[name] === undefined ? placeholder : String(values[name])));\n}\n\n/**\n * El texto de una llave en los textos propios de los componentes (la prop `texts` de un componente y los de ComponentTexts\n * de afuera), si alguno la trae. Cada capa es {namespace, texts} con la misma forma que ese namespace en los textos del\n * paquete (es.js): plurales con _one/_other y {{variables}}. La primera capa que trae la llave gana.\n *\n * @param {Array<{namespace: string, texts: object|undefined}>} layers de la más cercana a la más lejana\n * @param {string} namespace el de la llave\n * @param {string} key la llave sin namespace\n * @param {object|undefined} values\n * @param {string} language para elegir el plural\n * @returns {string|undefined} el texto ya con sus variables, o undefined si ninguna capa lo trae\n */\nexport function componentTextOf(layers, namespace, key, values, language) {\n for (const layer of layers) {\n if (layer.namespace !== namespace || !layer.texts) {\n continue;\n }\n const text = textOf({[namespace]: layer.texts}, namespace, key, values, language);\n if (text !== undefined) {\n return interpolate(text, values);\n }\n }\n\n return undefined;\n}\n\n/**\n * El texto de una llave con una configuración dada (la del proveedor o la vigente).\n *\n * @param {{language: string, texts: object, translate: Function|null}} settings\n * @param {string} defaultNamespace el namespace cuando la llave no trae uno («table», «common», «problems»...)\n * @param {string} key «llave» o «namespace:llave»\n * @param {object} [values] las variables del texto y, para el plural, count\n * @returns {string} la llave misma si no hay texto, para que se note qué falta\n */\nexport function translateWith(settings, defaultNamespace, key, values) {\n const [namespace, plainKey] = key.includes(NAMESPACE_SEPARATOR) ? key.split(NAMESPACE_SEPARATOR, 2) : [defaultNamespace, key];\n const projectText = settings.translate?.(namespace, plainKey, values);\n if (typeof projectText === 'string') {\n return projectText;\n }\n\n const text = textOf(settings.texts?.[settings.language], namespace, plainKey, values, settings.language)\n ?? textOf(PACKAGE_TEXTS_BY_LANGUAGE[settings.language], namespace, plainKey, values, settings.language)\n ?? textOf(PACKAGE_TEXTS_BY_LANGUAGE[DEFAULT_LANGUAGE], namespace, plainKey, values, DEFAULT_LANGUAGE);\n\n if (text !== undefined) {\n return interpolate(text, values);\n }\n // como en i18next: sin la llave en ningún lado, el texto por omisión que pidió quien llama (un globo opcional pasa ''\n // y no se pinta); sin él, la llave tal cual, para que se note qué falta\n if (typeof values?.defaultValue === 'string') {\n return interpolate(values.defaultValue, values);\n }\n return `${namespace}${NAMESPACE_SEPARATOR}${plainKey}`;\n}\n\n/**\n * El texto de una llave con la configuración vigente, para lo que no es componente (avisos, errores del servidor).\n *\n * @param {string} defaultNamespace\n * @param {string} key\n * @param {object} [values]\n * @returns {string}\n */\nexport function translateToolkit(defaultNamespace, key, values) {\n return translateWith(currentSettings, defaultNamespace, key, values);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"toolkitSettings.js","sources":["../../src/toolkit/toolkitSettings.js"],"sourcesContent":["// La configuración del paquete: idioma, textos, zona horaria, moneda, nombre de la aplicación y navegación.\n//\n// La pone ToolkitProvider en cada render y la leen también las funciones que no son componentes (formatos de fecha y\n// número, avisos, errores del servidor). Sin proveedor valen los de omisión: español, la zona del navegador y la\n// navegación del navegador.\n//\n// Los textos se resuelven en este orden, para que cada proyecto cambie solo lo que necesite:\n// 1. translate del proyecto (por ejemplo el t de i18next), si regresa un texto;\n// 2. los textos que el proyecto pasó en `texts`, del idioma activo;\n// 3. los textos del paquete (locales/), del idioma activo y, si no está, en español.\n// Las llaves usan la forma de i18next: «namespace:llave.anidada», {{variable}} y plurales con _one / _other.\n//\n// Funciones puras, no renderizan: function (regla de la casa).\nimport es from '@/locales/es.js';\nimport en from '@/locales/en.js';\n\nexport const DEFAULT_LANGUAGE = 'es';\n// la moneda de los montos (código ISO 4217) cuando el proyecto no dice otra\nexport const DEFAULT_CURRENCY = 'MXN';\n\n/**\n * Cómo se escribe la hora: de 24 horas («15:10», la de omisión) o de 12 con a.m. y p.m. («3:10 p.m.»). Son los valores de\n * `hourCycle` de Intl, por eso se ven así.\n */\nexport const HOUR_CYCLE = Object.freeze({\n twentyFourHours: 'h23',\n twelveHours: 'h12',\n});\nexport const DEFAULT_HOUR_CYCLE = HOUR_CYCLE.twentyFourHours;\n\nconst PACKAGE_TEXTS_BY_LANGUAGE = Object.freeze({es, en});\n\n/**\n * Los idiomas que ofrece la app cuando el proyecto no dice otros: su código, su nombre en su propio idioma (así lo busca quien\n * lo habla) y cómo se escriben sus números y fechas (Intl). El proyecto agrega los suyos en ToolkitProvider `languages` y pone\n * sus traducciones en `texts` (lo que no traduzca sale en español); los textos del paquete solo vienen en español e inglés.\n */\nexport const DEFAULT_LANGUAGES = Object.freeze([\n Object.freeze({code: 'es', label: 'Español', locale: 'es-MX'}),\n Object.freeze({code: 'en', label: 'English', locale: 'en-US'}),\n]);\n\nconst NAMESPACE_SEPARATOR = ':';\nconst KEY_SEPARATOR = '.';\nconst PLURAL_SEPARATOR = '_';\nconst PLURAL_OTHER = 'other';\nconst INTERPOLATION = /\\{\\{\\s*(\\w+)\\s*\\}\\}/g;\n\n/**\n * La zona horaria del navegador; si el navegador no la sabe, la de la Ciudad de México.\n *\n * @returns {string}\n */\nexport function browserTimeZone() {\n return Intl.DateTimeFormat().resolvedOptions().timeZone ?? 'America/Mexico_City';\n}\n\nlet currentSettings = Object.freeze({\n language: DEFAULT_LANGUAGE,\n texts: {},\n translate: null,\n timeZone: browserTimeZone(),\n currency: DEFAULT_CURRENCY,\n // la hora de 24 o de 12 horas (HOUR_CYCLE)\n hourCycle: DEFAULT_HOUR_CYCLE,\n appName: '',\n // la compilación del front que corre en esta pestaña ('' en desarrollo): con ella se sabe si hay una versión nueva\n buildId: '',\n // los idiomas que ofrece la app (DEFAULT_LANGUAGES)\n languages: DEFAULT_LANGUAGES,\n});\n\n/**\n * Cambia la configuración que leen las funciones del paquete. La llama ToolkitProvider; un proyecto sin React (o una\n * prueba) la puede llamar directo.\n *\n * @param {{language?: string, texts?: object, translate?: Function|null, timeZone?: string, currency?: string, hourCycle?: 'h23'|'h12', appName?: string, buildId?: string, languages?: Array<{code: string, label: string, locale?: string}>}} settings\n * @returns {void}\n */\nexport function configureToolkit(settings) {\n currentSettings = Object.freeze({...currentSettings, ...settings});\n}\n\n/**\n * La configuración vigente.\n *\n * @returns {{language: string, texts: object, translate: Function|null, timeZone: string, currency: string, hourCycle: 'h23'|'h12', appName: string, buildId: string, languages: Array<{code: string, label: string, locale?: string}>}}\n */\nexport function toolkitSettings() {\n return currentSettings;\n}\n\n/**\n * El locale de Intl del idioma: el que dice su lista de idiomas (es → es-MX, pt → pt-BR) o, si no dice, el código mismo\n * (Intl entiende «pt»). OJO: antes un idioma que no fuera es ni en salía con los números y las fechas de México.\n *\n * @param {string} language\n * @param {Array<{code: string, locale?: string}>} [languages] por omisión los de la configuración vigente\n * @returns {string}\n */\nexport function intlLocaleOf(language, languages = currentSettings.languages) {\n const known = languages?.find((entry) => entry.code === language) ?? DEFAULT_LANGUAGES.find((entry) => entry.code === language);\n return known?.locale ?? language ?? DEFAULT_LANGUAGES[0].locale;\n}\n\n/**\n * Lo que hay en una ruta de llaves («toast.error») dentro de un objeto de textos.\n *\n * @param {object|undefined} texts\n * @param {string} path\n * @returns {unknown}\n */\nfunction valueAtPath(texts, path) {\n let value = texts;\n for (const part of path.split(KEY_SEPARATOR)) {\n if (value === null || typeof value !== 'object') {\n return undefined;\n }\n value = value[part];\n }\n\n return value;\n}\n\n/**\n * El texto de una llave en un objeto de textos, con su plural si trae count (como i18next: llave_one, llave_other).\n *\n * @param {object|undefined} texts los textos de un idioma, por namespace\n * @param {string} namespace\n * @param {string} key\n * @param {object|undefined} values\n * @param {string} language\n * @returns {string|undefined}\n */\nfunction textOf(texts, namespace, key, values, language) {\n const namespaceTexts = texts?.[namespace];\n if (typeof values?.count === 'number') {\n const pluralCategory = new Intl.PluralRules(intlLocaleOf(language)).select(values.count);\n const pluralText = valueAtPath(namespaceTexts, `${key}${PLURAL_SEPARATOR}${pluralCategory}`)\n ?? valueAtPath(namespaceTexts, `${key}${PLURAL_SEPARATOR}${PLURAL_OTHER}`);\n if (typeof pluralText === 'string') {\n return pluralText;\n }\n }\n\n const text = valueAtPath(namespaceTexts, key);\n\n return typeof text === 'string' ? text : undefined;\n}\n\n/**\n * Pone los valores en las {{variables}} del texto; una variable sin valor se queda como está.\n *\n * @param {string} text\n * @param {object|undefined} values\n * @returns {string}\n */\nfunction interpolate(text, values) {\n return text.replace(INTERPOLATION, (placeholder, name) => (values?.[name] === undefined ? placeholder : String(values[name])));\n}\n\n/**\n * El texto de una llave en los textos propios de los componentes (la prop `texts` de un componente y los de ComponentTexts\n * de afuera), si alguno la trae. Cada capa es {namespace, texts} con la misma forma que ese namespace en los textos del\n * paquete (es.js): plurales con _one/_other y {{variables}}. La primera capa que trae la llave gana.\n *\n * @param {Array<{namespace: string, texts: object|undefined}>} layers de la más cercana a la más lejana\n * @param {string} namespace el de la llave\n * @param {string} key la llave sin namespace\n * @param {object|undefined} values\n * @param {string} language para elegir el plural\n * @returns {string|undefined} el texto ya con sus variables, o undefined si ninguna capa lo trae\n */\nexport function componentTextOf(layers, namespace, key, values, language) {\n for (const layer of layers) {\n if (layer.namespace !== namespace || !layer.texts) {\n continue;\n }\n const text = textOf({[namespace]: layer.texts}, namespace, key, values, language);\n if (text !== undefined) {\n return interpolate(text, values);\n }\n }\n\n return undefined;\n}\n\n/**\n * El texto de una llave con una configuración dada (la del proveedor o la vigente).\n *\n * @param {{language: string, texts: object, translate: Function|null}} settings\n * @param {string} defaultNamespace el namespace cuando la llave no trae uno («table», «common», «problems»...)\n * @param {string} key «llave» o «namespace:llave»\n * @param {object} [values] las variables del texto y, para el plural, count\n * @returns {string} la llave misma si no hay texto, para que se note qué falta\n */\nexport function translateWith(settings, defaultNamespace, key, values) {\n const [namespace, plainKey] = key.includes(NAMESPACE_SEPARATOR) ? key.split(NAMESPACE_SEPARATOR, 2) : [defaultNamespace, key];\n const projectText = settings.translate?.(namespace, plainKey, values);\n if (typeof projectText === 'string') {\n return projectText;\n }\n\n const text = textOf(settings.texts?.[settings.language], namespace, plainKey, values, settings.language)\n ?? textOf(PACKAGE_TEXTS_BY_LANGUAGE[settings.language], namespace, plainKey, values, settings.language)\n ?? textOf(PACKAGE_TEXTS_BY_LANGUAGE[DEFAULT_LANGUAGE], namespace, plainKey, values, DEFAULT_LANGUAGE);\n\n if (text !== undefined) {\n return interpolate(text, values);\n }\n // como en i18next: sin la llave en ningún lado, el texto por omisión que pidió quien llama (un globo opcional pasa ''\n // y no se pinta); sin él, la llave tal cual, para que se note qué falta\n if (typeof values?.defaultValue === 'string') {\n return interpolate(values.defaultValue, values);\n }\n return `${namespace}${NAMESPACE_SEPARATOR}${plainKey}`;\n}\n\n/**\n * El texto de una llave con la configuración vigente, para lo que no es componente (avisos, errores del servidor).\n *\n * @param {string} defaultNamespace\n * @param {string} key\n * @param {object} [values]\n * @returns {string}\n */\nexport function translateToolkit(defaultNamespace, key, values) {\n return translateWith(currentSettings, defaultNamespace, key, values);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ const THEME_NAME_PREFIX = "Calcita";
2
+ const REACT_OWN_PROPS = /* @__PURE__ */ new Set(["ref"]);
3
+ const warnedProps = /* @__PURE__ */ new Set();
4
+ function isDevelopmentBuild() {
5
+ try {
6
+ return process.env.NODE_ENV !== "production";
7
+ } catch {
8
+ return false;
9
+ }
10
+ }
11
+ function unknownPropMessageOf(componentName, propName) {
12
+ const name = componentName.startsWith(THEME_NAME_PREFIX) ? componentName.slice(THEME_NAME_PREFIX.length) : componentName;
13
+ return `Calcita · ${name} no conoce la opción «${propName}» y no la usa. Revise el nombre en el README o en «Hecho en Calcita».`;
14
+ }
15
+ function warnUnknownProps(componentName, unknownProps) {
16
+ if (!isDevelopmentBuild()) {
17
+ return;
18
+ }
19
+ for (const propName of Object.keys(unknownProps)) {
20
+ const warnedKey = `${componentName}.${propName}`;
21
+ if (REACT_OWN_PROPS.has(propName) || warnedProps.has(warnedKey)) {
22
+ continue;
23
+ }
24
+ warnedProps.add(warnedKey);
25
+ console.warn(unknownPropMessageOf(componentName, propName));
26
+ }
27
+ }
28
+ export {
29
+ isDevelopmentBuild,
30
+ unknownPropMessageOf,
31
+ warnUnknownProps
32
+ };
33
+ //# sourceMappingURL=unknownProps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unknownProps.js","sources":["../../src/toolkit/unknownProps.js"],"sourcesContent":["// Avisa en la consola, mientras se programa, cuando una pieza de la casa recibe una opción que no conoce.\n//\n// Por qué existe: React descarta sin decir nada lo que un componente no lee. Al pasar a Calcita las pantallas de un sistema que\n// ya existía, las opciones con otro nombre (countNoun en lugar de countLabel, label en lugar de ariaLabelOf) se perdieron en\n// silencio: la pantalla abría bien, pero sin esos textos, y solo las encontró una comparación de textos de punta a punta.\n//\n// Cómo se usa: cada pieza junta lo que no conoce con «...unknownProps» al leer sus props y se lo pasa a warnUnknownProps:\n//\n// const {columns, fetchPage, ...unknownProps} = usePieceProps(props, THEME_NAME);\n// warnUnknownProps(THEME_NAME, unknownProps);\n//\n// Solo avisa en desarrollo (en producción no hace nada) y una vez por pieza y opción, no en cada render.\n//\n// Funciones puras, no renderizan: function (regla de la casa).\n\n// el prefijo de los nombres de las piezas en el tema (CalcitaServerTable): el aviso dice solo el del componente\nconst THEME_NAME_PREFIX = 'Calcita';\n// React 19 manda `ref` como un prop más: no es una opción de la pieza\nconst REACT_OWN_PROPS = new Set(['ref']);\n// las que ya se avisaron («ServerTable.countNoun»): el aviso sale una vez, no en cada render\nconst warnedProps = new Set();\n\n/**\n * ¿Se está programando? Los empaquetadores (Vite, Next) cambian process.env.NODE_ENV por su valor al construir la app. Una\n * página sin empaquetador no tiene `process`: se toma como producción y no se avisa.\n *\n * @returns {boolean}\n */\nexport function isDevelopmentBuild() {\n try {\n return process.env.NODE_ENV !== 'production';\n } catch {\n return false;\n }\n}\n\n/**\n * El aviso de una opción que la pieza no conoce.\n *\n * @param {string} componentName el nombre de la pieza en el tema («CalcitaServerTable») o el del componente\n * @param {string} propName\n * @returns {string}\n */\nexport function unknownPropMessageOf(componentName, propName) {\n const name = componentName.startsWith(THEME_NAME_PREFIX) ? componentName.slice(THEME_NAME_PREFIX.length) : componentName;\n return `Calcita · ${name} no conoce la opción «${propName}» y no la usa. Revise el nombre en el README o en «Hecho en Calcita».`;\n}\n\n/**\n * Avisa (solo en desarrollo, una vez por pieza y opción) de cada opción que la pieza no leyó.\n *\n * @param {string} componentName el nombre de la pieza en el tema («CalcitaServerTable») o el del componente\n * @param {object} unknownProps lo que quedó después de leer las opciones que la pieza conoce\n * @returns {void}\n */\nexport function warnUnknownProps(componentName, unknownProps) {\n if (!isDevelopmentBuild()) {\n return;\n }\n for (const propName of Object.keys(unknownProps)) {\n const warnedKey = `${componentName}.${propName}`;\n if (REACT_OWN_PROPS.has(propName) || warnedProps.has(warnedKey)) {\n continue;\n }\n warnedProps.add(warnedKey);\n console.warn(unknownPropMessageOf(componentName, propName));\n }\n}\n"],"names":[],"mappings":"AAgBA,MAAM,oBAAoB;AAE1B,MAAM,kBAAkB,oBAAI,IAAI,CAAC,KAAK,CAAC;AAEvC,MAAM,cAAc,oBAAI,IAAG;AAQpB,SAAS,qBAAqB;AACjC,MAAI;AACA,WAAO,QAAQ,IAAI,aAAa;AAAA,EACpC,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AASO,SAAS,qBAAqB,eAAe,UAAU;AAC1D,QAAM,OAAO,cAAc,WAAW,iBAAiB,IAAI,cAAc,MAAM,kBAAkB,MAAM,IAAI;AAC3G,SAAO,aAAa,IAAI,yBAAyB,QAAQ;AAC7D;AASO,SAAS,iBAAiB,eAAe,cAAc;AAC1D,MAAI,CAAC,mBAAkB,GAAI;AACvB;AAAA,EACJ;AACA,aAAW,YAAY,OAAO,KAAK,YAAY,GAAG;AAC9C,UAAM,YAAY,GAAG,aAAa,IAAI,QAAQ;AAC9C,QAAI,gBAAgB,IAAI,QAAQ,KAAK,YAAY,IAAI,SAAS,GAAG;AAC7D;AAAA,IACJ;AACA,gBAAY,IAAI,SAAS;AACzB,YAAQ,KAAK,qBAAqB,eAAe,QAAQ,CAAC;AAAA,EAC9D;AACJ;"}
@@ -12,7 +12,7 @@
12
12
  * @param {unknown} [props.refreshToken] cambia para volver a consultar (después de una acción sobre el mismo renglón)
13
13
  * @param {object} [props.texts] los textos que cambian, con la forma de `table` en los textos del paquete
14
14
  */
15
- export default function AuditTrailTable({ subjectKey, fetchPage, eventDictionary, resultDictionary, extraColumns, ariaLabel, maxGridHeight, refreshToken, eventSuffixOf, texts, }: {
15
+ export default function AuditTrailTable({ subjectKey, fetchPage, eventDictionary, resultDictionary, extraColumns, ariaLabel, maxGridHeight, refreshToken, eventSuffixOf, texts, ...unknownProps }: {
16
16
  subjectKey: string;
17
17
  fetchPage: (tableRequest: object, signal: AbortSignal) => Promise<{
18
18
  rows: any[];
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @param {{value: string, onChange: (value: string) => void, label?: string}} props label ya traducido
3
3
  */
4
- export default function TextColumnFilter({ value, onChange, label }: {
4
+ export default function TextColumnFilter({ value, onChange, label, ...unknownProps }: {
5
5
  value: string;
6
6
  onChange: (value: string) => void;
7
7
  label?: string;
@@ -74,9 +74,11 @@ export declare function facetColumn({ field, label, facetKey, renderOption, sort
74
74
  * Columna de acción al final de la fila: un icono que abre el detalle (la ruta propia del renglón). Un icono y no la
75
75
  * fila entera a propósito: la fila como botón se dispara al seleccionar texto y no se ve que se puede abrir.
76
76
  *
77
+ * El globo del icono se cambia con los textos de la tabla (ServerTable texts={{detail: {tooltip: '…'}}}), no aquí.
78
+ *
77
79
  * @param {{onOpen: (row: any) => void, ariaLabelOf?: (row: any) => string}} declaration ariaLabelOf ya traducido
78
80
  */
79
- export declare function detailColumn({ onOpen, ariaLabelOf }: {
81
+ export declare function detailColumn({ onOpen, ariaLabelOf, ...unknownOptions }: {
80
82
  onOpen: (row: any) => void;
81
83
  ariaLabelOf?: (row: any) => string;
82
84
  }): {
@@ -4,7 +4,7 @@
4
4
  * @param {import('react').ReactNode} props.children
5
5
  * @param {import('react').ReactNode} [props.fallback] lo que se pinta si no puede; por omisión nada
6
6
  */
7
- export default function Can({ access, children, fallback }: {
7
+ export default function Can({ access, children, fallback, ...unknownProps }: {
8
8
  access: object;
9
9
  children: import('react').ReactNode;
10
10
  fallback?: import('react').ReactNode;
@@ -4,7 +4,7 @@
4
4
  * @param {import('react').ReactNode} props.children
5
5
  * @param {import('react').ReactNode} [props.fallback] lo que se ve sin permiso; por omisión la página de 403
6
6
  */
7
- export default function RequireAccess({ access, children, fallback }: {
7
+ export default function RequireAccess({ access, children, fallback, ...unknownProps }: {
8
8
  access?: object;
9
9
  children: import('react').ReactNode;
10
10
  fallback?: import('react').ReactNode;
@@ -8,7 +8,7 @@
8
8
  * @param {(canAccess: (access: object|null|undefined) => boolean) => import('react').ReactNode} props.children recibe la
9
9
  * regla de permisos de la sesión
10
10
  */
11
- export default function AccountProvider({ connector, refreshKey, initialSession, children }: {
11
+ export default function AccountProvider({ connector, refreshKey, initialSession, children, ...unknownProps }: {
12
12
  connector: import('./accountConnector.js').AccountConnector;
13
13
  refreshKey?: unknown;
14
14
  initialSession?: import('./accountConnector.js').AccountSession | null;
@@ -7,7 +7,7 @@
7
7
  * @param {boolean} [props.showColorSchemeToggle]
8
8
  * @param {object} [props.texts] los textos que cambian, con la forma de `auth` en los textos del paquete
9
9
  */
10
- export default function ForgotPasswordScreen({ signInPath, logo, brandName, showLanguageToggle, showColorSchemeToggle, texts }: {
10
+ export default function ForgotPasswordScreen({ signInPath, logo, brandName, showLanguageToggle, showColorSchemeToggle, texts, ...unknownProps }: {
11
11
  signInPath?: string;
12
12
  logo?: import('react').ReactNode;
13
13
  brandName?: string;
@@ -9,7 +9,7 @@
9
9
  * @param {boolean} [props.showColorSchemeToggle]
10
10
  * @param {object} [props.texts] los textos que cambian, con la forma de `account` en los textos del paquete
11
11
  */
12
- export default function ResetPasswordScreen({ signInPath, forgotPasswordPath, tokenParam, logo, brandName, showLanguageToggle, showColorSchemeToggle, texts, }: {
12
+ export default function ResetPasswordScreen({ signInPath, forgotPasswordPath, tokenParam, logo, brandName, showLanguageToggle, showColorSchemeToggle, texts, ...unknownProps }: {
13
13
  signInPath: string;
14
14
  forgotPasswordPath?: string;
15
15
  tokenParam?: string;
@@ -3,7 +3,7 @@
3
3
  * @param {Array<{to?: string, href?: string, onClick?: Function, label?: string, labelKey?: string, Icon?: import('react').ElementType, icon?: import('react').ReactNode}>} props.links
4
4
  * @param {() => void} props.onClose cierra el menú al elegir
5
5
  */
6
- export default function MenuLinks({ links, onClose }: {
6
+ export default function MenuLinks({ links, onClose, ...unknownProps }: {
7
7
  links: Array<{
8
8
  to?: string;
9
9
  href?: string;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @param {{children: import('react').ReactNode}} props
3
3
  */
4
- export declare function PageTitleProvider({ children }: {
4
+ export declare function PageTitleProvider({ children, ...unknownProps }: {
5
5
  children: import('react').ReactNode;
6
6
  }): import("react").JSX.Element;
7
7
  /**
@@ -19,7 +19,7 @@ export declare const CALENDAR_DATE_FORMAT = "YYYY-MM-DD";
19
19
  * @param {import('react').Ref<HTMLInputElement>} [props.inputRef]
20
20
  * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete
21
21
  */
22
- export default function DateInput({ name, label, value, onChange, onBlur, error, helperText, minDate, maxDate, disableFuture, disablePast, openTo, disabled, inputRef, texts, }: {
22
+ export default function DateInput({ name, label, value, onChange, onBlur, error, helperText, minDate, maxDate, disableFuture, disablePast, openTo, disabled, inputRef, texts, ...unknownProps }: {
23
23
  name?: string;
24
24
  label: string;
25
25
  value: string | null | undefined;
@@ -2,6 +2,6 @@
2
2
  * @param {object} [props]
3
3
  * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete
4
4
  */
5
- export default function DownloadManager({ texts }?: {
5
+ export default function DownloadManager({ texts, ...unknownProps }?: {
6
6
  texts?: object;
7
7
  }): import("react").JSX.Element;
@@ -2,7 +2,7 @@
2
2
  * Los formatos con la configuración que da settingsOf (se lee en cada llamada: si cambia el idioma, el siguiente formato ya
3
3
  * sale en el nuevo).
4
4
  *
5
- * @param {() => {language: string, languages?: Array<{code: string, locale?: string}>, timeZone: string, currency: string}} settingsOf
5
+ * @param {() => {language: string, languages?: Array<{code: string, locale?: string}>, timeZone: string, currency: string, hourCycle?: 'h23'|'h12'}} settingsOf
6
6
  */
7
7
  export declare function formattersOf(settingsOf: () => {
8
8
  language: string;
@@ -12,6 +12,7 @@ export declare function formattersOf(settingsOf: () => {
12
12
  }>;
13
13
  timeZone: string;
14
14
  currency: string;
15
+ hourCycle?: 'h23' | 'h12';
15
16
  }): Readonly<{
16
17
  formatNumber: (value: number | string | null | undefined, fallback?: string) => string;
17
18
  formatList: (items: string[]) => string;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @param {{sx?: object}} props
3
3
  */
4
- export default function FormProblemAlert({ sx }: {
4
+ export default function FormProblemAlert({ sx, ...unknownProps }: {
5
5
  sx?: object;
6
6
  }): import("react").JSX.Element | null;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @param {{error: (Error & {problem?: object})|null}} props el error del contexto de la máquina (null = sin error)
3
3
  */
4
- export default function FormServerProblem({ error }: {
4
+ export default function FormServerProblem({ error, ...unknownProps }: {
5
5
  error: (Error & {
6
6
  problem?: object;
7
7
  }) | null;
@@ -9,7 +9,7 @@
9
9
  * @param {string} props.submitLabel ya traducido: el botón del último paso
10
10
  * @param {object} [props.texts] los textos que cambian, con la forma de `common`: {wizard: {next, back, skip, optional, skipped, stepOf}}
11
11
  */
12
- export default function FormWizard({ steps, submitLabel, texts }: {
12
+ export default function FormWizard({ steps, submitLabel, texts, ...unknownProps }: {
13
13
  steps: {
14
14
  key: string;
15
15
  label: string;
@@ -6,7 +6,7 @@
6
6
  * @param {object} [props.policy] las reglas de la nueva; por omisión DEFAULT_PASSWORD_POLICY
7
7
  * @param {object} [props.texts] los textos que cambian, con la forma de `auth` en los textos del paquete
8
8
  */
9
- export default function ChangePasswordForm({ onSubmit, requireCurrentPassword, policy, texts }: {
9
+ export default function ChangePasswordForm({ onSubmit, requireCurrentPassword, policy, texts, ...unknownProps }: {
10
10
  onSubmit: (values: {
11
11
  currentPassword?: string;
12
12
  newPassword: string;
@@ -5,7 +5,7 @@
5
5
  * @param {string} [props.signInPath] la liga para regresar a iniciar sesión
6
6
  * @param {object} [props.texts] los textos que cambian, con la forma de `auth` en los textos del paquete
7
7
  */
8
- export default function ForgotPasswordForm({ onSubmit, signInPath, texts }: {
8
+ export default function ForgotPasswordForm({ onSubmit, signInPath, texts, ...unknownProps }: {
9
9
  onSubmit: (values: {
10
10
  email: string;
11
11
  }) => Promise<unknown>;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @param {{control?: object, sx?: object}} props control: el de useForm, si la pantalla no usa FormProvider
3
3
  */
4
- export default function FormProblemAlert({ control, sx }: {
4
+ export default function FormProblemAlert({ control, sx, ...unknownProps }: {
5
5
  control?: object;
6
6
  sx?: object;
7
7
  }): import("react").JSX.Element | null;
@@ -9,7 +9,7 @@
9
9
  * @param {string} props.submitLabel ya traducido: el botón del último paso
10
10
  * @param {object} [props.texts] los textos que cambian, con la forma de `common`: {wizard: {next, back, skip, optional, skipped, stepOf}}
11
11
  */
12
- export default function FormWizard({ steps, submitLabel, texts }: {
12
+ export default function FormWizard({ steps, submitLabel, texts, ...unknownProps }: {
13
13
  steps: {
14
14
  key: string;
15
15
  label: string;
@@ -2,7 +2,7 @@ export { ToolkitProvider } from './toolkit/ToolkitProvider.js';
2
2
  export { useToolkitNavigation, useToolkitSettings } from './toolkit/toolkitContext.js';
3
3
  export { useToolkitTranslation } from './toolkit/useToolkitTranslation.js';
4
4
  export { default as ComponentTexts } from './toolkit/ComponentTexts.js';
5
- export { DEFAULT_CURRENCY, DEFAULT_LANGUAGE, DEFAULT_LANGUAGES, configureToolkit, toolkitSettings, translateToolkit } from './toolkit/toolkitSettings.js';
5
+ export { DEFAULT_CURRENCY, DEFAULT_HOUR_CYCLE, DEFAULT_LANGUAGE, DEFAULT_LANGUAGES, HOUR_CYCLE, configureToolkit, toolkitSettings, translateToolkit, } from './toolkit/toolkitSettings.js';
6
6
  export { browserNavigation, createBrowserNavigation } from './toolkit/browserNavigation.js';
7
7
  export { createHashNavigation } from './toolkit/hashNavigation.js';
8
8
  export { default as toolkitTextsEs } from './locales/es.js';
@@ -17,7 +17,7 @@
17
17
  * @param {boolean} [props.multiple] elegir varias claves
18
18
  * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete
19
19
  */
20
- export default function CatalogInput({ name, label, value, onChange, onBlur, options, formatLabel, error, helperText, loading, disabled, inputRef, placeholder, multiple, texts, }: {
20
+ export default function CatalogInput({ name, label, value, onChange, onBlur, options, formatLabel, error, helperText, loading, disabled, inputRef, placeholder, multiple, texts, ...unknownProps }: {
21
21
  name?: string;
22
22
  label: string;
23
23
  value: string | string[] | null | undefined;
@@ -6,7 +6,7 @@
6
6
  * @param {import('react').ReactNode} props.label ya traducida
7
7
  * @param {import('react').ReactNode} props.children el campo
8
8
  */
9
- export default function FieldFrame({ inputId, labelId, label, children }: {
9
+ export default function FieldFrame({ inputId, labelId, label, children, ...unknownProps }: {
10
10
  inputId: string;
11
11
  labelId?: string;
12
12
  label: import('react').ReactNode;
@@ -16,7 +16,7 @@
16
16
  * @param {import('react').Ref<HTMLInputElement>} [props.inputRef]
17
17
  * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete
18
18
  */
19
- export default function NumberInput({ name, label, value, onChange, onBlur, error, helperText, decimals, allowNegative, prefix, suffix, maxDigits, disabled, inputRef, texts, }: {
19
+ export default function NumberInput({ name, label, value, onChange, onBlur, error, helperText, decimals, allowNegative, prefix, suffix, maxDigits, disabled, inputRef, texts, ...unknownProps }: {
20
20
  name?: string;
21
21
  label: string;
22
22
  value: string | number | null | undefined;
@@ -7,7 +7,8 @@
7
7
  * @param {() => void} [props.onBlur]
8
8
  * @param {string|{key: string, values?: object}} [props.error] el error a enseñar (undefined = sin error)
9
9
  * @param {string} [props.type] 'password' agrega el ojo
10
- * @param {string} [props.helperText] ayuda fija; el error la reemplaza
10
+ * @param {string} [props.helperText] ayuda fija; el error la reemplaza. Por omisión el campo deja su renglón vacío para que
11
+ * no brinque al salir un error; con helperText="" no lo deja (un campo con botones al lado en el mismo renglón)
11
12
  * @param {string} [props.placeholder] ya traducido; el ejemplo de qué escribir (se va al escribir)
12
13
  * @param {import('react').ReactNode} [props.startAdornment]
13
14
  * @param {import('react').ReactNode} [props.endAdornment] adorno al final (en contraseñas manda el ojo)
@@ -2,6 +2,6 @@
2
2
  * @param {object} [props]
3
3
  * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete
4
4
  */
5
- export default function InstallAppSetting({ texts }?: {
5
+ export default function InstallAppSetting({ texts, ...unknownProps }?: {
6
6
  texts?: object;
7
7
  }): import("react").JSX.Element | null;
@@ -46,7 +46,7 @@ export declare const TOP_BAR: Readonly<{
46
46
  * @param {object} [options.overrides] cualquier otra cosa de createTheme (breakpoints, spacing…)
47
47
  * @returns {object} el tema de MUI
48
48
  */
49
- export declare function createToolkitTheme({ colorSchemes, colorSchemeSelector, fontFamily, glass, look, bar, minimalTones, fields, cssTokens, components, overrides, }?: {
49
+ export declare function createToolkitTheme({ colorSchemes, colorSchemeSelector, fontFamily, glass, look, bar, minimalTones, fields, cssTokens, components, overrides, ...unknownOptions }?: {
50
50
  colorSchemes?: {
51
51
  light?: object | boolean;
52
52
  dark?: object | boolean;
@@ -4,7 +4,7 @@
4
4
  * @param {object} [props.texts] los textos que cambian, con la forma de ese namespace
5
5
  * @param {import('react').ReactNode} props.children
6
6
  */
7
- export default function ComponentTexts({ namespace, texts, children }: {
7
+ export default function ComponentTexts({ namespace, texts, children, ...unknownProps }: {
8
8
  namespace: string;
9
9
  texts?: object;
10
10
  children: import('react').ReactNode;
@@ -12,6 +12,8 @@
12
12
  * proyecto (por ejemplo i18next); undefined deja el texto del paquete
13
13
  * @param {string} [props.timeZone] zona de las fechas (por omisión la del navegador)
14
14
  * @param {string} [props.currency] moneda de los montos, código ISO 4217 (por omisión MXN)
15
+ * @param {'h23'|'h12'} [props.hourCycle] la hora de 24 horas («15:10», por omisión) o de 12 con a.m. y p.m. («3:10 p.m.»):
16
+ * HOUR_CYCLE.twentyFourHours o HOUR_CYCLE.twelveHours
15
17
  * @param {string} [props.appName] nombre de la aplicación para el título de la pestaña
16
18
  * @param {object} [props.navigation] {useNavigate, useLocation, Link}; por omisión la del navegador
17
19
  * @param {string} [props.buildId] la compilación del front que corre en esta pestaña; con ella NewBuildNotice sabe si el
@@ -21,7 +23,7 @@
21
23
  * tiene regla
22
24
  * @param {import('react').ReactNode} props.children
23
25
  */
24
- export declare const ToolkitProvider: ({ language, languages, onLanguageChange, texts, translate, timeZone, currency, appName, navigation, buildId, canAccess, fileTypes, children, }: {
26
+ export declare const ToolkitProvider: ({ language, languages, onLanguageChange, texts, translate, timeZone, currency, hourCycle, appName, navigation, buildId, canAccess, fileTypes, children, ...unknownProps }: {
25
27
  language?: string;
26
28
  languages?: Array<{
27
29
  code: string;
@@ -39,6 +41,7 @@ export declare const ToolkitProvider: ({ language, languages, onLanguageChange,
39
41
  translate?: (namespace: string, key: string, values?: object) => string | undefined;
40
42
  timeZone?: string;
41
43
  currency?: string;
44
+ hourCycle?: 'h23' | 'h12';
42
45
  appName?: string;
43
46
  navigation?: object;
44
47
  buildId?: string;
@@ -2,7 +2,7 @@ export declare const ToolkitContext: import("react").Context<null>;
2
2
  /**
3
3
  * La configuración del proveedor; sin proveedor, la vigente con la navegación del navegador.
4
4
  *
5
- * @returns {{language: string, onLanguageChange: Function|null, texts: object, translate: Function|null, timeZone: string, currency: string, appName: string, buildId: string, navigation: object, canAccess: Function}}
5
+ * @returns {{language: string, onLanguageChange: Function|null, texts: object, translate: Function|null, timeZone: string, currency: string, hourCycle: 'h23'|'h12', appName: string, buildId: string, navigation: object, canAccess: Function}}
6
6
  */
7
7
  export declare function useToolkitSettings(): {
8
8
  language: string;
@@ -11,6 +11,7 @@ export declare function useToolkitSettings(): {
11
11
  translate: Function | null;
12
12
  timeZone: string;
13
13
  currency: string;
14
+ hourCycle: 'h23' | 'h12';
14
15
  appName: string;
15
16
  buildId: string;
16
17
  navigation: object;