@stackcraftmx/calcita 0.30.1 → 0.32.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.
- package/README.md +17 -0
- package/dist/DataTable/AuditTrailDialog.js +4 -1
- package/dist/DataTable/AuditTrailDialog.js.map +1 -1
- package/dist/DataTable/AuditTrailTable.js +4 -1
- package/dist/DataTable/AuditTrailTable.js.map +1 -1
- package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js +3 -1
- package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js.map +1 -1
- package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js +3 -1
- package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js.map +1 -1
- package/dist/DataTable/ColumnFilters/SortableFilterHeader.js +4 -1
- package/dist/DataTable/ColumnFilters/SortableFilterHeader.js.map +1 -1
- package/dist/DataTable/ColumnFilters/TextColumnFilter.js +3 -1
- package/dist/DataTable/ColumnFilters/TextColumnFilter.js.map +1 -1
- package/dist/DataTable/EmptyState.js +3 -1
- package/dist/DataTable/EmptyState.js.map +1 -1
- package/dist/DataTable/FilterChips.js +3 -1
- package/dist/DataTable/FilterChips.js.map +1 -1
- package/dist/DataTable/GoToPage.js +3 -1
- package/dist/DataTable/GoToPage.js.map +1 -1
- package/dist/DataTable/ServerTable.js +4 -1
- package/dist/DataTable/ServerTable.js.map +1 -1
- package/dist/DataTable/columns.js +3 -1
- package/dist/DataTable/columns.js.map +1 -1
- package/dist/access/Can.js +3 -1
- package/dist/access/Can.js.map +1 -1
- package/dist/access/PermissionMatrix.js +3 -1
- package/dist/access/PermissionMatrix.js.map +1 -1
- package/dist/access/RequireAccess.js +3 -1
- package/dist/access/RequireAccess.js.map +1 -1
- package/dist/account/AccountProvider.js +3 -1
- package/dist/account/AccountProvider.js.map +1 -1
- package/dist/account/AccountSecuritySection.js +3 -1
- package/dist/account/AccountSecuritySection.js.map +1 -1
- package/dist/account/DemoTotpCodeButton.js +3 -1
- package/dist/account/DemoTotpCodeButton.js.map +1 -1
- package/dist/account/ForgotPasswordScreen.js +3 -1
- package/dist/account/ForgotPasswordScreen.js.map +1 -1
- package/dist/account/ProfileScreen.js +4 -1
- package/dist/account/ProfileScreen.js.map +1 -1
- package/dist/account/ResetPasswordScreen.js +4 -1
- package/dist/account/ResetPasswordScreen.js.map +1 -1
- package/dist/account/SignInScreen.js +3 -1
- package/dist/account/SignInScreen.js.map +1 -1
- package/dist/appShell/AccountMenu.js +3 -1
- package/dist/appShell/AccountMenu.js.map +1 -1
- package/dist/appShell/AppLayout.js +4 -1
- package/dist/appShell/AppLayout.js.map +1 -1
- package/dist/appShell/AppearanceSettings.js +4 -1
- package/dist/appShell/AppearanceSettings.js.map +1 -1
- package/dist/appShell/AuthLayout.js +3 -1
- package/dist/appShell/AuthLayout.js.map +1 -1
- package/dist/appShell/BarActions.js +3 -1
- package/dist/appShell/BarActions.js.map +1 -1
- package/dist/appShell/BarSearch.js +3 -1
- package/dist/appShell/BarSearch.js.map +1 -1
- package/dist/appShell/HeaderTools.js +4 -1
- package/dist/appShell/HeaderTools.js.map +1 -1
- package/dist/appShell/MenuLinks.js +3 -1
- package/dist/appShell/MenuLinks.js.map +1 -1
- package/dist/appShell/MobileTabBar.js +3 -1
- package/dist/appShell/MobileTabBar.js.map +1 -1
- package/dist/appShell/SettingsMenu.js +3 -1
- package/dist/appShell/SettingsMenu.js.map +1 -1
- package/dist/appShell/SideMenu.js +4 -1
- package/dist/appShell/SideMenu.js.map +1 -1
- package/dist/appShell/SideMenuEntry.js +3 -1
- package/dist/appShell/SideMenuEntry.js.map +1 -1
- package/dist/appShell/SubmenuActionsMenu.js +3 -1
- package/dist/appShell/SubmenuActionsMenu.js.map +1 -1
- package/dist/appShell/TabBarEditor.js +3 -1
- package/dist/appShell/TabBarEditor.js.map +1 -1
- package/dist/appShell/TopMenu.js +3 -1
- package/dist/appShell/TopMenu.js.map +1 -1
- package/dist/appShell/Wordmark.js +3 -1
- package/dist/appShell/Wordmark.js.map +1 -1
- package/dist/appShell/pageTitle.js +3 -1
- package/dist/appShell/pageTitle.js.map +1 -1
- package/dist/appShell/shellSizes.js.map +1 -1
- package/dist/auth/PasswordChecklist.js +3 -1
- package/dist/auth/PasswordChecklist.js.map +1 -1
- package/dist/calendar/EventCalendar.js +4 -1
- package/dist/calendar/EventCalendar.js.map +1 -1
- package/dist/calendar/EventDetails.js +3 -1
- package/dist/calendar/EventDetails.js.map +1 -1
- package/dist/datePickers/DateInput.js +4 -1
- package/dist/datePickers/DateInput.js.map +1 -1
- package/dist/downloads/DownloadManager.js +3 -1
- package/dist/downloads/DownloadManager.js.map +1 -1
- package/dist/feedback/ConfirmDialog.js +4 -1
- package/dist/feedback/ConfirmDialog.js.map +1 -1
- package/dist/feedback/ModalWaiting.js +3 -1
- package/dist/feedback/ModalWaiting.js.map +1 -1
- package/dist/feedback/NewBuildNotice.js +3 -1
- package/dist/feedback/NewBuildNotice.js.map +1 -1
- package/dist/filepond/FileDropzone.js +4 -1
- package/dist/filepond/FileDropzone.js.map +1 -1
- package/dist/formatting.js +8 -5
- package/dist/formatting.js.map +1 -1
- package/dist/forms/FormProblemAlert.js +3 -1
- package/dist/forms/FormProblemAlert.js.map +1 -1
- package/dist/forms/FormServerProblem.js +3 -1
- package/dist/forms/FormServerProblem.js.map +1 -1
- package/dist/forms/FormWizard.js +3 -1
- package/dist/forms/FormWizard.js.map +1 -1
- package/dist/forms/auth/ChangePasswordForm.js +3 -1
- package/dist/forms/auth/ChangePasswordForm.js.map +1 -1
- package/dist/forms/auth/ForgotPasswordForm.js +3 -1
- package/dist/forms/auth/ForgotPasswordForm.js.map +1 -1
- package/dist/forms/auth/SignInForm.js +3 -1
- package/dist/forms/auth/SignInForm.js.map +1 -1
- package/dist/forms/security/SecondStepForm.js +3 -1
- package/dist/forms/security/SecondStepForm.js.map +1 -1
- package/dist/forms/security/TwoStepVerificationCard.js +3 -1
- package/dist/forms/security/TwoStepVerificationCard.js.map +1 -1
- package/dist/hookForm/FormProblemAlert.js +3 -1
- package/dist/hookForm/FormProblemAlert.js.map +1 -1
- package/dist/hookForm/FormWizard.js +3 -1
- package/dist/hookForm/FormWizard.js.map +1 -1
- package/dist/inbox/InboxLayout.js +4 -1
- package/dist/inbox/InboxLayout.js.map +1 -1
- package/dist/inbox/MessageList.js +4 -1
- package/dist/inbox/MessageList.js.map +1 -1
- package/dist/inbox/MessageView.js +3 -1
- package/dist/inbox/MessageView.js.map +1 -1
- package/dist/index.js +6 -2
- package/dist/inputs/CatalogInput.js +4 -1
- package/dist/inputs/CatalogInput.js.map +1 -1
- package/dist/inputs/ColorInput.js +4 -1
- package/dist/inputs/ColorInput.js.map +1 -1
- package/dist/inputs/FieldFrame.js +3 -1
- package/dist/inputs/FieldFrame.js.map +1 -1
- package/dist/inputs/FormSection.js +5 -2
- package/dist/inputs/FormSection.js.map +1 -1
- package/dist/inputs/NumberInput.js +4 -1
- package/dist/inputs/NumberInput.js.map +1 -1
- package/dist/inputs/SelectInput.js +4 -1
- package/dist/inputs/SelectInput.js.map +1 -1
- package/dist/inputs/WizardLayout.js +4 -1
- package/dist/inputs/WizardLayout.js.map +1 -1
- package/dist/kanban/KanbanBoard.js +4 -1
- package/dist/kanban/KanbanBoard.js.map +1 -1
- package/dist/maps/MapView.js +4 -1
- package/dist/maps/MapView.js.map +1 -1
- package/dist/pwa/InstallAppSetting.js +3 -1
- package/dist/pwa/InstallAppSetting.js.map +1 -1
- package/dist/pwa/InstallInstructionsDialog.js +3 -1
- package/dist/pwa/InstallInstructionsDialog.js.map +1 -1
- package/dist/pwa/InstallPromptBanner.js +3 -1
- package/dist/pwa/InstallPromptBanner.js.map +1 -1
- package/dist/security/ActivityLog.js +3 -1
- package/dist/security/ActivityLog.js.map +1 -1
- package/dist/security/RecoveryCodesDialog.js +3 -1
- package/dist/security/RecoveryCodesDialog.js.map +1 -1
- package/dist/security/SessionsCard.js +3 -1
- package/dist/security/SessionsCard.js.map +1 -1
- package/dist/theme/createToolkitTheme.js +4 -1
- package/dist/theme/createToolkitTheme.js.map +1 -1
- package/dist/toolkit/ComponentTexts.js +3 -1
- package/dist/toolkit/ComponentTexts.js.map +1 -1
- package/dist/toolkit/ToolkitProvider.js +24 -3
- package/dist/toolkit/ToolkitProvider.js.map +1 -1
- package/dist/toolkit/toolkitContext.js.map +1 -1
- package/dist/toolkit/toolkitSettings.js +9 -0
- package/dist/toolkit/toolkitSettings.js.map +1 -1
- package/dist/toolkit/unknownProps.js +33 -0
- package/dist/toolkit/unknownProps.js.map +1 -0
- package/dist/types/DataTable/AuditTrailTable.d.ts +1 -1
- package/dist/types/DataTable/ColumnFilters/TextColumnFilter.d.ts +1 -1
- package/dist/types/DataTable/columns.d.ts +3 -1
- package/dist/types/access/Can.d.ts +1 -1
- package/dist/types/access/RequireAccess.d.ts +1 -1
- package/dist/types/account/AccountProvider.d.ts +1 -1
- package/dist/types/account/ForgotPasswordScreen.d.ts +1 -1
- package/dist/types/account/ResetPasswordScreen.d.ts +1 -1
- package/dist/types/appShell/MenuLinks.d.ts +1 -1
- package/dist/types/appShell/pageTitle.d.ts +1 -1
- package/dist/types/appShell/shellSizes.d.ts +3 -1
- package/dist/types/datePickers/DateInput.d.ts +1 -1
- package/dist/types/downloads/DownloadManager.d.ts +1 -1
- package/dist/types/formatting.d.ts +2 -1
- package/dist/types/forms/FormProblemAlert.d.ts +1 -1
- package/dist/types/forms/FormServerProblem.d.ts +1 -1
- package/dist/types/forms/FormWizard.d.ts +1 -1
- package/dist/types/forms/auth/ChangePasswordForm.d.ts +1 -1
- package/dist/types/forms/auth/ForgotPasswordForm.d.ts +1 -1
- package/dist/types/hookForm/FormProblemAlert.d.ts +1 -1
- package/dist/types/hookForm/FormWizard.d.ts +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/inputs/CatalogInput.d.ts +1 -1
- package/dist/types/inputs/FieldFrame.d.ts +1 -1
- package/dist/types/inputs/NumberInput.d.ts +1 -1
- package/dist/types/pwa/InstallAppSetting.d.ts +1 -1
- package/dist/types/theme/createToolkitTheme.d.ts +1 -1
- package/dist/types/toolkit/ComponentTexts.d.ts +1 -1
- package/dist/types/toolkit/ToolkitProvider.d.ts +4 -1
- package/dist/types/toolkit/toolkitContext.d.ts +2 -1
- package/dist/types/toolkit/toolkitSettings.d.ts +13 -2
- package/dist/types/toolkit/unknownProps.d.ts +23 -0
- package/dist/types/ui/actions/CopyButton.d.ts +1 -1
- package/dist/types/ui/actions/SecretField.d.ts +1 -1
- package/dist/types/ui/labels/DictionaryText.d.ts +1 -1
- package/dist/types/ui/layout/FullPageLoader.d.ts +1 -1
- package/dist/types/ui/metrics/CalendarHeatmap.d.ts +9 -8
- package/dist/types/ui/metrics/chartParts.d.ts +3 -3
- package/dist/types/ui/metrics/heatmapScale.d.ts +23 -0
- package/dist/types/ui/navigation/DocumentTitle.d.ts +1 -1
- package/dist/ui/actions/ActionsMenu.js +3 -1
- package/dist/ui/actions/ActionsMenu.js.map +1 -1
- package/dist/ui/actions/CopyButton.js +3 -1
- package/dist/ui/actions/CopyButton.js.map +1 -1
- package/dist/ui/actions/DownloadMenu.js +4 -1
- package/dist/ui/actions/DownloadMenu.js.map +1 -1
- package/dist/ui/actions/SecretField.js +3 -1
- package/dist/ui/actions/SecretField.js.map +1 -1
- package/dist/ui/actions/SelectionActions.js +3 -1
- package/dist/ui/actions/SelectionActions.js.map +1 -1
- package/dist/ui/filters/DateRangeFilter.js +3 -1
- package/dist/ui/filters/DateRangeFilter.js.map +1 -1
- package/dist/ui/filters/PeriodRangeSelector.js +3 -1
- package/dist/ui/filters/PeriodRangeSelector.js.map +1 -1
- package/dist/ui/filters/QuickFilters.js +3 -1
- package/dist/ui/filters/QuickFilters.js.map +1 -1
- package/dist/ui/filters/SegmentedControl.js +3 -1
- package/dist/ui/filters/SegmentedControl.js.map +1 -1
- package/dist/ui/labels/DictionaryText.js +3 -1
- package/dist/ui/labels/DictionaryText.js.map +1 -1
- package/dist/ui/labels/StatusChip.js +3 -1
- package/dist/ui/labels/StatusChip.js.map +1 -1
- package/dist/ui/layout/CollapsibleSection.js +3 -1
- package/dist/ui/layout/CollapsibleSection.js.map +1 -1
- package/dist/ui/layout/ContentDialog.js +3 -1
- package/dist/ui/layout/ContentDialog.js.map +1 -1
- package/dist/ui/layout/DefinitionList.js +3 -1
- package/dist/ui/layout/DefinitionList.js.map +1 -1
- package/dist/ui/layout/DetailHeader.js +3 -1
- package/dist/ui/layout/DetailHeader.js.map +1 -1
- package/dist/ui/layout/ErrorPage.js +4 -1
- package/dist/ui/layout/ErrorPage.js.map +1 -1
- package/dist/ui/layout/FullPageLoader.js +3 -1
- package/dist/ui/layout/FullPageLoader.js.map +1 -1
- package/dist/ui/layout/PageHeader.js +3 -1
- package/dist/ui/layout/PageHeader.js.map +1 -1
- package/dist/ui/layout/PageHeading.js +3 -1
- package/dist/ui/layout/PageHeading.js.map +1 -1
- package/dist/ui/layout/ProfileHeader.js +3 -1
- package/dist/ui/layout/ProfileHeader.js.map +1 -1
- package/dist/ui/layout/SectionCard.js +3 -1
- package/dist/ui/layout/SectionCard.js.map +1 -1
- package/dist/ui/metrics/BarList.js +3 -1
- package/dist/ui/metrics/BarList.js.map +1 -1
- package/dist/ui/metrics/CalendarHeatmap.js +13 -4
- package/dist/ui/metrics/CalendarHeatmap.js.map +1 -1
- package/dist/ui/metrics/ChartTooltip.js.map +1 -1
- package/dist/ui/metrics/ColumnChart.js +4 -1
- package/dist/ui/metrics/ColumnChart.js.map +1 -1
- package/dist/ui/metrics/LineChart.js +4 -1
- package/dist/ui/metrics/LineChart.js.map +1 -1
- package/dist/ui/metrics/MetricCard.js +4 -1
- package/dist/ui/metrics/MetricCard.js.map +1 -1
- package/dist/ui/metrics/TableToggle.js +3 -1
- package/dist/ui/metrics/TableToggle.js.map +1 -1
- package/dist/ui/metrics/chartParts.js +7 -3
- package/dist/ui/metrics/chartParts.js.map +1 -1
- package/dist/ui/metrics/heatmapScale.js +15 -1
- package/dist/ui/metrics/heatmapScale.js.map +1 -1
- package/dist/ui/navigation/ColorSchemeToggle.js +3 -1
- package/dist/ui/navigation/ColorSchemeToggle.js.map +1 -1
- package/dist/ui/navigation/DocumentTitle.js +3 -1
- package/dist/ui/navigation/DocumentTitle.js.map +1 -1
- package/dist/ui/navigation/FontSizeToggle.js +3 -1
- package/dist/ui/navigation/FontSizeToggle.js.map +1 -1
- package/dist/ui/navigation/LanguageToggle.js +3 -1
- package/dist/ui/navigation/LanguageToggle.js.map +1 -1
- package/dist/ui/navigation/PageBreadcrumbs.js +3 -1
- package/dist/ui/navigation/PageBreadcrumbs.js.map +1 -1
- package/dist/ui/timeline/GroupedTimeline.js +3 -1
- package/dist/ui/timeline/GroupedTimeline.js.map +1 -1
- package/dist/upload/FileDropzone.js +4 -1
- package/dist/upload/FileDropzone.js.map +1 -1
- package/package.json +1 -1
|
@@ -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
|
/**
|
|
@@ -14,7 +14,9 @@ export declare const GLASS_PANEL_GAP_PIXELS = 8;
|
|
|
14
14
|
/**
|
|
15
15
|
* Teléfono o escritorio. Teléfono: angosto (menos de 900 px, el «md» de MUI) O bajito (menos de 500 px de alto: un teléfono
|
|
16
16
|
* acostado). Solo con el ancho, un iPhone Pro Max acostado (932 × 430) salía con el marco de escritorio y su menú lateral
|
|
17
|
-
* no cabía (lo reportaron). Van como media queries para usarse en sx: [PHONE_MEDIA_QUERY]: {...}.
|
|
17
|
+
* no cabía (lo reportaron). Van como media queries para usarse en sx: [PHONE_MEDIA_QUERY]: {...}. Se exportan: un proyecto que
|
|
18
|
+
* ajusta una pieza del marco desde su tema (solo en escritorio o solo en el teléfono) usa la misma regla que el marco y no
|
|
19
|
+
* una copia que se le pueda desfasar.
|
|
18
20
|
*/
|
|
19
21
|
export declare const PHONE_MEDIA_QUERY = "@media (max-width: 899.95px), (max-height: 499.95px)";
|
|
20
22
|
export declare const DESKTOP_MEDIA_QUERY = "@media (min-width: 900px) and (min-height: 500px)";
|
|
@@ -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,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;
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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';
|
|
@@ -29,7 +29,7 @@ export { BAR_CAPSULE_HEIGHT_PIXELS, default as BarCapsule } from './appShell/Bar
|
|
|
29
29
|
export { usesMobileTabBar } from './appShell/tabBarRule.js';
|
|
30
30
|
export { SettingSection, default as AppearanceSettings } from './appShell/AppearanceSettings.js';
|
|
31
31
|
export { barMenuPlacementOf } from './appShell/barMenuPlacement.js';
|
|
32
|
-
export { DRAWER_WIDTH_COLLAPSED, DRAWER_WIDTH_EXPANDED, MAIN_CONTENT_ID } from './appShell/shellSizes.js';
|
|
32
|
+
export { DESKTOP_MEDIA_QUERY, DRAWER_WIDTH_COLLAPSED, DRAWER_WIDTH_EXPANDED, MAIN_CONTENT_ID, PHONE_MEDIA_QUERY } from './appShell/shellSizes.js';
|
|
33
33
|
export { useAppMenu } from './appShell/appMenuContext.js';
|
|
34
34
|
export { usePageTitle } from './appShell/pageTitle.js';
|
|
35
35
|
export { initialsOf, menuItemDescriptionOf, menuItemLabelOf, menuItemSectionOf, menuSectionsOf } from './appShell/menuItemText.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;
|
|
@@ -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;
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
export declare const DEFAULT_LANGUAGE = "es";
|
|
2
2
|
export declare const DEFAULT_CURRENCY = "MXN";
|
|
3
|
+
/**
|
|
4
|
+
* 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
|
|
5
|
+
* `hourCycle` de Intl, por eso se ven así.
|
|
6
|
+
*/
|
|
7
|
+
export declare const HOUR_CYCLE: Readonly<{
|
|
8
|
+
twentyFourHours: "h23";
|
|
9
|
+
twelveHours: "h12";
|
|
10
|
+
}>;
|
|
11
|
+
export declare const DEFAULT_HOUR_CYCLE: "h23";
|
|
3
12
|
/**
|
|
4
13
|
* 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
|
|
5
14
|
* lo habla) y cómo se escriben sus números y fechas (Intl). El proyecto agrega los suyos en ToolkitProvider `languages` y pone
|
|
@@ -24,7 +33,7 @@ export declare function browserTimeZone(): string;
|
|
|
24
33
|
* Cambia la configuración que leen las funciones del paquete. La llama ToolkitProvider; un proyecto sin React (o una
|
|
25
34
|
* prueba) la puede llamar directo.
|
|
26
35
|
*
|
|
27
|
-
* @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
|
|
36
|
+
* @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
|
|
28
37
|
* @returns {void}
|
|
29
38
|
*/
|
|
30
39
|
export declare function configureToolkit(settings: {
|
|
@@ -33,6 +42,7 @@ export declare function configureToolkit(settings: {
|
|
|
33
42
|
translate?: Function | null;
|
|
34
43
|
timeZone?: string;
|
|
35
44
|
currency?: string;
|
|
45
|
+
hourCycle?: 'h23' | 'h12';
|
|
36
46
|
appName?: string;
|
|
37
47
|
buildId?: string;
|
|
38
48
|
languages?: Array<{
|
|
@@ -44,7 +54,7 @@ export declare function configureToolkit(settings: {
|
|
|
44
54
|
/**
|
|
45
55
|
* La configuración vigente.
|
|
46
56
|
*
|
|
47
|
-
* @returns {{language: string, texts: object, translate: Function|null, timeZone: string, currency: string, appName: string, buildId: string, languages: Array<{code: string, label: string, locale?: string}>}}
|
|
57
|
+
* @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}>}}
|
|
48
58
|
*/
|
|
49
59
|
export declare function toolkitSettings(): {
|
|
50
60
|
language: string;
|
|
@@ -52,6 +62,7 @@ export declare function toolkitSettings(): {
|
|
|
52
62
|
translate: Function | null;
|
|
53
63
|
timeZone: string;
|
|
54
64
|
currency: string;
|
|
65
|
+
hourCycle: 'h23' | 'h12';
|
|
55
66
|
appName: string;
|
|
56
67
|
buildId: string;
|
|
57
68
|
languages: Array<{
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ¿Se está programando? Los empaquetadores (Vite, Next) cambian process.env.NODE_ENV por su valor al construir la app. Una
|
|
3
|
+
* página sin empaquetador no tiene `process`: se toma como producción y no se avisa.
|
|
4
|
+
*
|
|
5
|
+
* @returns {boolean}
|
|
6
|
+
*/
|
|
7
|
+
export declare function isDevelopmentBuild(): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* El aviso de una opción que la pieza no conoce.
|
|
10
|
+
*
|
|
11
|
+
* @param {string} componentName el nombre de la pieza en el tema («CalcitaServerTable») o el del componente
|
|
12
|
+
* @param {string} propName
|
|
13
|
+
* @returns {string}
|
|
14
|
+
*/
|
|
15
|
+
export declare function unknownPropMessageOf(componentName: string, propName: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Avisa (solo en desarrollo, una vez por pieza y opción) de cada opción que la pieza no leyó.
|
|
18
|
+
*
|
|
19
|
+
* @param {string} componentName el nombre de la pieza en el tema («CalcitaServerTable») o el del componente
|
|
20
|
+
* @param {object} unknownProps lo que quedó después de leer las opciones que la pieza conoce
|
|
21
|
+
* @returns {void}
|
|
22
|
+
*/
|
|
23
|
+
export declare function warnUnknownProps(componentName: string, unknownProps: object): void;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* @param {() => void} [props.onCopied]
|
|
7
7
|
* @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete
|
|
8
8
|
*/
|
|
9
|
-
export default function CopyButton({ value, label, size, onCopied, texts }: {
|
|
9
|
+
export default function CopyButton({ value, label, size, onCopied, texts, ...unknownProps }: {
|
|
10
10
|
value: string;
|
|
11
11
|
label?: string;
|
|
12
12
|
size?: 'small' | 'medium';
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* @param {(isRevealed: boolean) => void} [props.onRevealChange] se destapó o se tapó (para registrar quién vio el secreto)
|
|
8
8
|
* @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete
|
|
9
9
|
*/
|
|
10
|
-
export default function SecretField({ value, label, helperText, onCopied, onRevealChange, texts }: {
|
|
10
|
+
export default function SecretField({ value, label, helperText, onCopied, onRevealChange, texts, ...unknownProps }: {
|
|
11
11
|
value: string;
|
|
12
12
|
label: string;
|
|
13
13
|
helperText?: string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @param {{dictionary: Record<string, object>, value: string|null|undefined}} props
|
|
3
3
|
*/
|
|
4
|
-
export default function DictionaryText({ dictionary, value }: {
|
|
4
|
+
export default function DictionaryText({ dictionary, value, ...unknownProps }: {
|
|
5
5
|
dictionary: Record<string, object>;
|
|
6
6
|
value: string | null | undefined;
|
|
7
7
|
}): string;
|
|
@@ -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 FullPageLoader({ texts }?: {
|
|
5
|
+
export default function FullPageLoader({ texts, ...unknownProps }?: {
|
|
6
6
|
texts?: object;
|
|
7
7
|
}): import("react").JSX.Element;
|