@stackcraftmx/calcita 0.47.0 → 0.52.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 +192 -13
- package/cli/calcita.js +17 -0
- package/cli/checkTexts.js +266 -0
- package/cli/packageVersions.js +6 -1
- package/cli/projectFiles.js +4 -2
- package/cli/templates/project/README.md.tpl +21 -1
- package/cli/templates/project/eslint.config.js.tpl +27 -0
- package/cli/templates/project/src/app/appTexts.js.tpl +2 -1
- package/cli/templates/project/src/core/publicPaths.js.tpl +10 -2
- package/cli/templates/project/vite.config.js.tpl +8 -1
- package/dist/DataTable/AuditTrailDialog.js +3 -2
- package/dist/DataTable/AuditTrailDialog.js.map +1 -1
- package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js +3 -2
- package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js.map +1 -1
- package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js +3 -2
- package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js.map +1 -1
- package/dist/DataTable/ColumnFilters/SortableFilterHeader.js +3 -2
- package/dist/DataTable/ColumnFilters/SortableFilterHeader.js.map +1 -1
- package/dist/DataTable/EmptyState.js +3 -2
- package/dist/DataTable/EmptyState.js.map +1 -1
- package/dist/DataTable/FilterChips.js +3 -2
- package/dist/DataTable/FilterChips.js.map +1 -1
- package/dist/DataTable/GoToPage.js +3 -2
- package/dist/DataTable/GoToPage.js.map +1 -1
- package/dist/DataTable/ServerTable.js +95 -28
- package/dist/DataTable/ServerTable.js.map +1 -1
- package/dist/DataTable/ServerTableFilterDrawer.js +8 -3
- package/dist/DataTable/ServerTableFilterDrawer.js.map +1 -1
- package/dist/DataTable/StackedCell.js +60 -0
- package/dist/DataTable/StackedCell.js.map +1 -0
- package/dist/DataTable/TableCardsView.js +88 -0
- package/dist/DataTable/TableCardsView.js.map +1 -0
- package/dist/DataTable/columnWidths.js +30 -0
- package/dist/DataTable/columnWidths.js.map +1 -0
- package/dist/DataTable/columns.js +47 -1
- package/dist/DataTable/columns.js.map +1 -1
- package/dist/DataTable/fixedColumns.js +24 -0
- package/dist/DataTable/fixedColumns.js.map +1 -0
- package/dist/DataTable/useTableView.js +29 -0
- package/dist/DataTable/useTableView.js.map +1 -0
- package/dist/access/PermissionMatrix.js +3 -2
- package/dist/access/PermissionMatrix.js.map +1 -1
- package/dist/account/AccountProvider.js +1 -1
- package/dist/account/AccountSecuritySection.js +3 -2
- package/dist/account/AccountSecuritySection.js.map +1 -1
- package/dist/account/DemoTotpCodeButton.js +3 -2
- package/dist/account/DemoTotpCodeButton.js.map +1 -1
- package/dist/account/ProfileScreen.js +3 -2
- package/dist/account/ProfileScreen.js.map +1 -1
- package/dist/account/SignInScreen.js +3 -2
- package/dist/account/SignInScreen.js.map +1 -1
- package/dist/appShell/AccountMenu.js +3 -2
- package/dist/appShell/AccountMenu.js.map +1 -1
- package/dist/appShell/AppLayout.js +3 -2
- package/dist/appShell/AppLayout.js.map +1 -1
- package/dist/appShell/AppearanceSettings.js +3 -2
- package/dist/appShell/AppearanceSettings.js.map +1 -1
- package/dist/appShell/AuthLayout.js +3 -2
- package/dist/appShell/AuthLayout.js.map +1 -1
- package/dist/appShell/BarActionButton.js +11 -4
- package/dist/appShell/BarActionButton.js.map +1 -1
- package/dist/appShell/BarActions.js +3 -2
- package/dist/appShell/BarActions.js.map +1 -1
- package/dist/appShell/BarCapsule.js +3 -2
- package/dist/appShell/BarCapsule.js.map +1 -1
- package/dist/appShell/BarSearch.js +3 -2
- package/dist/appShell/BarSearch.js.map +1 -1
- package/dist/appShell/HeaderTools.js +3 -2
- package/dist/appShell/HeaderTools.js.map +1 -1
- package/dist/appShell/MobileTabBar.js +3 -2
- package/dist/appShell/MobileTabBar.js.map +1 -1
- package/dist/appShell/SettingsMenu.js +3 -2
- package/dist/appShell/SettingsMenu.js.map +1 -1
- package/dist/appShell/SideMenu.js +3 -2
- package/dist/appShell/SideMenu.js.map +1 -1
- package/dist/appShell/SideMenuEntry.js +3 -2
- package/dist/appShell/SideMenuEntry.js.map +1 -1
- package/dist/appShell/SubmenuActionsMenu.js +3 -2
- package/dist/appShell/SubmenuActionsMenu.js.map +1 -1
- package/dist/appShell/TabBarEditor.js +3 -2
- package/dist/appShell/TabBarEditor.js.map +1 -1
- package/dist/appShell/TopMenu.js +3 -2
- package/dist/appShell/TopMenu.js.map +1 -1
- package/dist/appShell/Wordmark.js +3 -2
- package/dist/appShell/Wordmark.js.map +1 -1
- package/dist/auth/PasswordChecklist.js +3 -2
- package/dist/auth/PasswordChecklist.js.map +1 -1
- package/dist/calendar/EventCalendar.js +3 -2
- package/dist/calendar/EventCalendar.js.map +1 -1
- package/dist/calendar/EventDetails.js +3 -2
- package/dist/calendar/EventDetails.js.map +1 -1
- package/dist/datePickers/DateInput.js +28 -22
- package/dist/datePickers/DateInput.js.map +1 -1
- package/dist/datePickers/DateTimeInput.js +33 -27
- package/dist/datePickers/DateTimeInput.js.map +1 -1
- package/dist/datePickers/MonthInput.js +27 -21
- package/dist/datePickers/MonthInput.js.map +1 -1
- package/dist/datePickers/TimeInput.js +26 -20
- package/dist/datePickers/TimeInput.js.map +1 -1
- package/dist/datePickers/usePickerField.js +5 -4
- package/dist/datePickers/usePickerField.js.map +1 -1
- package/dist/downloads/DownloadManager.js +3 -2
- package/dist/downloads/DownloadManager.js.map +1 -1
- package/dist/feedback/ConfirmDialog.js +3 -2
- package/dist/feedback/ConfirmDialog.js.map +1 -1
- package/dist/feedback/ModalWaiting.js +3 -2
- package/dist/feedback/ModalWaiting.js.map +1 -1
- package/dist/feedback/NewBuildNotice.js +3 -2
- package/dist/feedback/NewBuildNotice.js.map +1 -1
- package/dist/filepond/FileDropzone.js +3 -2
- package/dist/filepond/FileDropzone.js.map +1 -1
- package/dist/forms/FormProblemAlert.js +3 -2
- package/dist/forms/FormProblemAlert.js.map +1 -1
- package/dist/forms/FormWizard.js +21 -6
- package/dist/forms/FormWizard.js.map +1 -1
- package/dist/forms/SubmitButton.js +7 -2
- package/dist/forms/SubmitButton.js.map +1 -1
- package/dist/forms/auth/SignInForm.js +3 -2
- package/dist/forms/auth/SignInForm.js.map +1 -1
- package/dist/forms/fieldRules.js +30 -0
- package/dist/forms/fieldRules.js.map +1 -0
- package/dist/forms/security/SecondStepForm.js +3 -2
- package/dist/forms/security/SecondStepForm.js.map +1 -1
- package/dist/forms/security/TwoStepVerificationCard.js +3 -2
- package/dist/forms/security/TwoStepVerificationCard.js.map +1 -1
- package/dist/forms/useValidationText.js +18 -0
- package/dist/forms/useValidationText.js.map +1 -0
- package/dist/forms/validation.js +35 -31
- package/dist/forms/validation.js.map +1 -1
- package/dist/forms/validationMessages.js +64 -7
- package/dist/forms/validationMessages.js.map +1 -1
- package/dist/forms.js +3 -0
- package/dist/forms.js.map +1 -1
- package/dist/hookForm/FormProblemAlert.js +3 -2
- package/dist/hookForm/FormProblemAlert.js.map +1 -1
- package/dist/hookForm/FormWizard.js +19 -5
- package/dist/hookForm/FormWizard.js.map +1 -1
- package/dist/hookForm/SubmitButton.js +7 -2
- package/dist/hookForm/SubmitButton.js.map +1 -1
- package/dist/inbox/InboxLayout.js +3 -2
- package/dist/inbox/InboxLayout.js.map +1 -1
- package/dist/inbox/MessageList.js +3 -2
- package/dist/inbox/MessageList.js.map +1 -1
- package/dist/inbox/MessageView.js +3 -2
- package/dist/inbox/MessageView.js.map +1 -1
- package/dist/index.js +193 -163
- package/dist/index.js.map +1 -1
- package/dist/inputs/CatalogInput.js +32 -25
- package/dist/inputs/CatalogInput.js.map +1 -1
- package/dist/inputs/CheckboxGroupInput.js +8 -5
- package/dist/inputs/CheckboxGroupInput.js.map +1 -1
- package/dist/inputs/ColorInput.js +7 -4
- package/dist/inputs/ColorInput.js.map +1 -1
- package/dist/inputs/FieldFrame.js +10 -4
- package/dist/inputs/FieldFrame.js.map +1 -1
- package/dist/inputs/FormSection.js +1 -1
- package/dist/inputs/MaskedInput.js +1 -0
- package/dist/inputs/MaskedInput.js.map +1 -1
- package/dist/inputs/NumberInput.js +29 -24
- package/dist/inputs/NumberInput.js.map +1 -1
- package/dist/inputs/RepeatingFields.js +8 -5
- package/dist/inputs/RepeatingFields.js.map +1 -1
- package/dist/inputs/SelectInput.js +8 -5
- package/dist/inputs/SelectInput.js.map +1 -1
- package/dist/inputs/TextInput.js +5 -3
- package/dist/inputs/TextInput.js.map +1 -1
- package/dist/inputs/TransferListInput.js +8 -5
- package/dist/inputs/TransferListInput.js.map +1 -1
- package/dist/inputs/WizardLayout.js +48 -19
- package/dist/inputs/WizardLayout.js.map +1 -1
- package/dist/inputs/useWizardSteps.js +36 -0
- package/dist/inputs/useWizardSteps.js.map +1 -0
- package/dist/inputs/wizardSteps.js +32 -0
- package/dist/inputs/wizardSteps.js.map +1 -0
- package/dist/kanban/KanbanBoard.js +3 -2
- package/dist/kanban/KanbanBoard.js.map +1 -1
- package/dist/legal/CookieNotice.js +3 -2
- package/dist/legal/CookieNotice.js.map +1 -1
- package/dist/legal/TermsAcceptanceDialog.js +3 -2
- package/dist/legal/TermsAcceptanceDialog.js.map +1 -1
- package/dist/locales/en.js +24 -0
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es.js +24 -0
- package/dist/locales/es.js.map +1 -1
- package/dist/maps/MapView.js +3 -2
- package/dist/maps/MapView.js.map +1 -1
- package/dist/mexico/CfdiSummary.js +3 -2
- package/dist/mexico/CfdiSummary.js.map +1 -1
- package/dist/mexico/EfirmaFields.js +3 -2
- package/dist/mexico/EfirmaFields.js.map +1 -1
- package/dist/mexico/mexicoIdentifiers.js +5 -0
- package/dist/mexico/mexicoIdentifiers.js.map +1 -1
- package/dist/mexico/mexicoRules.js +9 -4
- package/dist/mexico/mexicoRules.js.map +1 -1
- package/dist/mexico.js +4 -2
- package/dist/pwa/InstallAppSetting.js +3 -2
- package/dist/pwa/InstallAppSetting.js.map +1 -1
- package/dist/pwa/InstallInstructionsDialog.js +3 -2
- package/dist/pwa/InstallInstructionsDialog.js.map +1 -1
- package/dist/pwa/InstallPromptBanner.js +3 -2
- package/dist/pwa/InstallPromptBanner.js.map +1 -1
- package/dist/react-hook-form.js +3 -0
- package/dist/react-hook-form.js.map +1 -1
- package/dist/richText/RichTextEditor.js +7 -4
- package/dist/richText/RichTextEditor.js.map +1 -1
- package/dist/richText/RichTextView.js +3 -2
- package/dist/richText/RichTextView.js.map +1 -1
- package/dist/security/ActivityLog.js +3 -2
- package/dist/security/ActivityLog.js.map +1 -1
- package/dist/security/RecoveryCodesDialog.js +3 -2
- package/dist/security/RecoveryCodesDialog.js.map +1 -1
- package/dist/security/SessionsCard.js +3 -2
- package/dist/security/SessionsCard.js.map +1 -1
- package/dist/table.js +21 -2
- package/dist/table.js.map +1 -1
- package/dist/theme/themePieces.js +70 -4
- package/dist/theme/themePieces.js.map +1 -1
- package/dist/toolkit/ToolkitProvider.js +8 -1
- package/dist/toolkit/ToolkitProvider.js.map +1 -1
- package/dist/toolkit/browserNavigation.js +19 -4
- package/dist/toolkit/browserNavigation.js.map +1 -1
- package/dist/toolkit/combineTexts.js +32 -0
- package/dist/toolkit/combineTexts.js.map +1 -0
- package/dist/toolkit/hashNavigation.js +17 -3
- package/dist/toolkit/hashNavigation.js.map +1 -1
- package/dist/toolkit/navigationPaths.js +15 -0
- package/dist/toolkit/navigationPaths.js.map +1 -1
- package/dist/toolkit/pathIndex.js +66 -0
- package/dist/toolkit/pathIndex.js.map +1 -0
- package/dist/toolkit/toolkitSettings.js +19 -1
- package/dist/toolkit/toolkitSettings.js.map +1 -1
- package/dist/types/DataTable/AuditTrailDialog.d.ts +6 -17
- package/dist/types/DataTable/ColumnFilters/HeaderFilterPopover.d.ts +6 -5
- package/dist/types/DataTable/ColumnFilters/MultiSelectColumnFilter.d.ts +6 -9
- package/dist/types/DataTable/ColumnFilters/SortableFilterHeader.d.ts +6 -14
- package/dist/types/DataTable/EmptyState.d.ts +6 -9
- package/dist/types/DataTable/FilterChips.d.ts +6 -11
- package/dist/types/DataTable/GoToPage.d.ts +6 -9
- package/dist/types/DataTable/ServerTable.d.ts +16 -80
- package/dist/types/DataTable/ServerTableFilterDrawer.d.ts +6 -13
- package/dist/types/DataTable/StackedCell.d.ts +12 -0
- package/dist/types/DataTable/TableCardsView.d.ts +27 -0
- package/dist/types/DataTable/columnWidths.d.ts +21 -0
- package/dist/types/DataTable/columns.d.ts +111 -0
- package/dist/types/DataTable/fixedColumns.d.ts +29 -0
- package/dist/types/DataTable/index.d.ts +6 -1
- package/dist/types/DataTable/useTableView.d.ts +22 -0
- package/dist/types/access/PermissionMatrix.d.ts +6 -10
- package/dist/types/account/AccountSecuritySection.d.ts +6 -7
- package/dist/types/account/DemoTotpCodeButton.d.ts +6 -5
- package/dist/types/account/ProfileScreen.d.ts +6 -18
- package/dist/types/account/SignInScreen.d.ts +6 -13
- package/dist/types/appShell/AccountMenu.d.ts +6 -11
- package/dist/types/appShell/AppLayout.d.ts +3 -40
- package/dist/types/appShell/AppearanceSettings.d.ts +6 -12
- package/dist/types/appShell/AuthLayout.d.ts +3 -11
- package/dist/types/appShell/BarActionButton.d.ts +7 -10
- package/dist/types/appShell/BarActions.d.ts +6 -15
- package/dist/types/appShell/BarCapsule.d.ts +6 -9
- package/dist/types/appShell/BarSearch.d.ts +6 -15
- package/dist/types/appShell/HeaderTools.d.ts +6 -16
- package/dist/types/appShell/MobileTabBar.d.ts +6 -13
- package/dist/types/appShell/SettingsMenu.d.ts +6 -10
- package/dist/types/appShell/SideMenu.d.ts +6 -20
- package/dist/types/appShell/SideMenuEntry.d.ts +6 -11
- package/dist/types/appShell/SubmenuActionsMenu.d.ts +6 -12
- package/dist/types/appShell/TabBarEditor.d.ts +6 -9
- package/dist/types/appShell/TopMenu.d.ts +6 -5
- package/dist/types/appShell/Wordmark.d.ts +6 -7
- package/dist/types/auth/PasswordChecklist.d.ts +6 -9
- package/dist/types/calendar/EventCalendar.d.ts +6 -23
- package/dist/types/calendar/EventDetails.d.ts +6 -10
- package/dist/types/datePickers/DateInput.d.ts +7 -22
- package/dist/types/datePickers/DateTimeInput.d.ts +7 -27
- package/dist/types/datePickers/MonthInput.d.ts +7 -21
- package/dist/types/datePickers/TimeInput.d.ts +7 -21
- package/dist/types/datePickers/usePickerField.d.ts +5 -1
- package/dist/types/downloads/DownloadManager.d.ts +6 -6
- package/dist/types/feedback/ConfirmDialog.d.ts +6 -18
- package/dist/types/feedback/ModalWaiting.d.ts +6 -9
- package/dist/types/feedback/NewBuildNotice.d.ts +6 -10
- package/dist/types/filepond/FileDropzone.d.ts +6 -29
- package/dist/types/forms/FormProblemAlert.d.ts +6 -5
- package/dist/types/forms/FormWizard.d.ts +12 -1
- package/dist/types/forms/SubmitButton.d.ts +6 -6
- package/dist/types/forms/auth/SignInForm.d.ts +6 -11
- package/dist/types/forms/fieldRules.d.ts +44 -0
- package/dist/types/forms/index.d.ts +1 -0
- package/dist/types/forms/security/SecondStepForm.d.ts +6 -14
- package/dist/types/forms/security/TwoStepVerificationCard.d.ts +6 -21
- package/dist/types/forms/useValidationText.d.ts +12 -0
- package/dist/types/forms/validation.d.ts +117 -174
- package/dist/types/forms/validationMessages.d.ts +54 -6
- package/dist/types/forms.d.ts +1 -1
- package/dist/types/hookForm/FormProblemAlert.d.ts +6 -5
- package/dist/types/hookForm/FormWizard.d.ts +12 -1
- package/dist/types/hookForm/SubmitButton.d.ts +6 -13
- package/dist/types/inbox/InboxLayout.d.ts +6 -17
- package/dist/types/inbox/MessageList.d.ts +6 -18
- package/dist/types/inbox/MessageView.d.ts +6 -14
- package/dist/types/index.d.ts +10 -2
- package/dist/types/inputs/CatalogInput.d.ts +7 -24
- package/dist/types/inputs/CheckboxGroupInput.d.ts +7 -18
- package/dist/types/inputs/ColorInput.d.ts +7 -16
- package/dist/types/inputs/FieldFrame.d.ts +6 -10
- package/dist/types/inputs/MaskedInput.d.ts +3 -0
- package/dist/types/inputs/NumberInput.d.ts +7 -20
- package/dist/types/inputs/RepeatingFields.d.ts +7 -28
- package/dist/types/inputs/SelectInput.d.ts +7 -20
- package/dist/types/inputs/TextInput.d.ts +3 -0
- package/dist/types/inputs/TransferListInput.d.ts +7 -20
- package/dist/types/inputs/WizardLayout.d.ts +11 -21
- package/dist/types/inputs/useWizardSteps.d.ts +23 -0
- package/dist/types/inputs/wizardSteps.d.ts +65 -0
- package/dist/types/kanban/KanbanBoard.d.ts +6 -25
- package/dist/types/legal/CookieNotice.d.ts +6 -16
- package/dist/types/legal/TermsAcceptanceDialog.d.ts +6 -18
- package/dist/types/locales/en.d.ts +24 -0
- package/dist/types/locales/es.d.ts +24 -0
- package/dist/types/maps/MapView.d.ts +6 -17
- package/dist/types/mexico/CfdiSummary.d.ts +6 -11
- package/dist/types/mexico/EfirmaFields.d.ts +6 -16
- package/dist/types/mexico/mexicoIdentifiers.d.ts +7 -0
- package/dist/types/mexico/mexicoRules.d.ts +19 -3
- package/dist/types/mexico.d.ts +2 -2
- package/dist/types/pwa/InstallAppSetting.d.ts +6 -6
- package/dist/types/pwa/InstallInstructionsDialog.d.ts +6 -9
- package/dist/types/pwa/InstallPromptBanner.d.ts +6 -11
- package/dist/types/react-hook-form.d.ts +1 -0
- package/dist/types/richText/RichTextEditor.d.ts +7 -22
- package/dist/types/richText/RichTextView.d.ts +6 -9
- package/dist/types/security/ActivityLog.d.ts +6 -9
- package/dist/types/security/RecoveryCodesDialog.d.ts +6 -11
- package/dist/types/security/SessionsCard.d.ts +6 -11
- package/dist/types/table.d.ts +3 -1
- package/dist/types/theme/themePieces.d.ts +55 -3
- package/dist/types/toolkit/ToolkitProvider.d.ts +13 -1
- package/dist/types/toolkit/browserNavigation.d.ts +7 -3
- package/dist/types/toolkit/combineTexts.d.ts +6 -0
- package/dist/types/toolkit/hashNavigation.d.ts +4 -2
- package/dist/types/toolkit/navigationPaths.d.ts +35 -0
- package/dist/types/toolkit/pathIndex.d.ts +27 -0
- package/dist/types/toolkit/toolkitSettings.d.ts +7 -4
- package/dist/types/ui/actions/ActionsMenu.d.ts +9 -11
- package/dist/types/ui/actions/CopyButton.d.ts +6 -12
- package/dist/types/ui/actions/DownloadMenu.d.ts +6 -29
- package/dist/types/ui/actions/SecretField.d.ts +6 -11
- package/dist/types/ui/actions/SelectionActions.d.ts +6 -13
- package/dist/types/ui/cards/RecordCard.d.ts +16 -29
- package/dist/types/ui/cards/RecordCardSkeleton.d.ts +6 -11
- package/dist/types/ui/countdown/Countdown.d.ts +6 -15
- package/dist/types/ui/documents/PdfViewerDialog.d.ts +6 -13
- package/dist/types/ui/filters/DateRangeFilter.d.ts +6 -10
- package/dist/types/ui/filters/FilterDrawer.d.ts +6 -17
- package/dist/types/ui/filters/PeriodRangeSelector.d.ts +6 -13
- package/dist/types/ui/filters/QuickFilters.d.ts +6 -12
- package/dist/types/ui/help/HelpButton.d.ts +6 -10
- package/dist/types/ui/help/HelpCarouselDialog.d.ts +6 -14
- package/dist/types/ui/index.d.ts +1 -1
- package/dist/types/ui/labels/MarkedText.d.ts +10 -0
- package/dist/types/ui/labels/Tag.d.ts +6 -12
- package/dist/types/ui/labels/markedTextPieces.d.ts +22 -0
- package/dist/types/ui/layout/CollapsibleSection.d.ts +6 -12
- package/dist/types/ui/layout/ContentDialog.d.ts +6 -10
- package/dist/types/ui/layout/DefinitionList.d.ts +6 -9
- package/dist/types/ui/layout/DetailHeader.d.ts +6 -10
- package/dist/types/ui/layout/ErrorPage.d.ts +6 -17
- package/dist/types/ui/layout/FullPageLoader.d.ts +6 -6
- package/dist/types/ui/layout/GlassPanel.d.ts +6 -8
- package/dist/types/ui/layout/PageHeader.d.ts +6 -10
- package/dist/types/ui/layout/PageHeading.d.ts +6 -11
- package/dist/types/ui/layout/ProfileHeader.d.ts +6 -11
- package/dist/types/ui/layout/ScrollableRow.d.ts +6 -13
- package/dist/types/ui/layout/SectionCard.d.ts +6 -8
- package/dist/types/ui/metrics/BarList.d.ts +6 -12
- package/dist/types/ui/metrics/CalendarHeatmap.d.ts +6 -19
- package/dist/types/ui/metrics/ChartTooltip.d.ts +6 -6
- package/dist/types/ui/metrics/ColumnChart.d.ts +6 -25
- package/dist/types/ui/metrics/LineChart.d.ts +6 -20
- package/dist/types/ui/metrics/MetricCard.d.ts +6 -17
- package/dist/types/ui/metrics/TableToggle.d.ts +6 -6
- package/dist/types/ui/metrics/chartParts.d.ts +15 -30
- package/dist/types/ui/navigation/BackButton.d.ts +7 -9
- package/dist/types/ui/navigation/ColorSchemeToggle.d.ts +6 -9
- package/dist/types/ui/navigation/FontSizeToggle.d.ts +6 -8
- package/dist/types/ui/navigation/LanguageToggle.d.ts +6 -8
- package/dist/types/ui/navigation/PageBreadcrumbs.d.ts +6 -7
- package/dist/types/ui/navigation/RouteTabs.d.ts +7 -12
- package/dist/types/ui/timeline/GroupedTimeline.d.ts +6 -23
- package/dist/types/upload/AttachmentsInput.d.ts +11 -1
- package/dist/types/upload/FileDropzone.d.ts +6 -21
- package/dist/types/upload/FileInput.d.ts +7 -24
- package/dist/types/upload/FileUploadInput.d.ts +7 -31
- package/dist/types/upload/ImageInput.d.ts +7 -25
- package/dist/types/upload/TemplateDownloadButton.d.ts +6 -18
- package/dist/ui/actions/ActionsMenu.js +14 -5
- package/dist/ui/actions/ActionsMenu.js.map +1 -1
- package/dist/ui/actions/CopyButton.js +8 -3
- package/dist/ui/actions/CopyButton.js.map +1 -1
- package/dist/ui/actions/DownloadMenu.js +3 -2
- package/dist/ui/actions/DownloadMenu.js.map +1 -1
- package/dist/ui/actions/SecretField.js +8 -3
- package/dist/ui/actions/SecretField.js.map +1 -1
- package/dist/ui/actions/SelectionActions.js +3 -2
- package/dist/ui/actions/SelectionActions.js.map +1 -1
- package/dist/ui/cards/RecordCard.js +10 -5
- package/dist/ui/cards/RecordCard.js.map +1 -1
- package/dist/ui/cards/RecordCardSkeleton.js +8 -3
- package/dist/ui/cards/RecordCardSkeleton.js.map +1 -1
- package/dist/ui/countdown/Countdown.js +3 -2
- package/dist/ui/countdown/Countdown.js.map +1 -1
- package/dist/ui/documents/PdfViewerDialog.js +3 -2
- package/dist/ui/documents/PdfViewerDialog.js.map +1 -1
- package/dist/ui/filters/DateRangeFilter.js +3 -2
- package/dist/ui/filters/DateRangeFilter.js.map +1 -1
- package/dist/ui/filters/FilterDrawer.js +3 -2
- package/dist/ui/filters/FilterDrawer.js.map +1 -1
- package/dist/ui/filters/PeriodRangeSelector.js +3 -2
- package/dist/ui/filters/PeriodRangeSelector.js.map +1 -1
- package/dist/ui/filters/QuickFilters.js +3 -2
- package/dist/ui/filters/QuickFilters.js.map +1 -1
- package/dist/ui/help/HelpButton.js +8 -3
- package/dist/ui/help/HelpButton.js.map +1 -1
- package/dist/ui/help/HelpCarouselDialog.js +3 -2
- package/dist/ui/help/HelpCarouselDialog.js.map +1 -1
- package/dist/ui/labels/MarkedText.js +31 -0
- package/dist/ui/labels/MarkedText.js.map +1 -0
- package/dist/ui/labels/Tag.js +3 -2
- package/dist/ui/labels/Tag.js.map +1 -1
- package/dist/ui/labels/markedTextPieces.js +64 -0
- package/dist/ui/labels/markedTextPieces.js.map +1 -0
- package/dist/ui/layout/CollapsibleSection.js +3 -2
- package/dist/ui/layout/CollapsibleSection.js.map +1 -1
- package/dist/ui/layout/ContentDialog.js +3 -2
- package/dist/ui/layout/ContentDialog.js.map +1 -1
- package/dist/ui/layout/DefinitionList.js +3 -2
- package/dist/ui/layout/DefinitionList.js.map +1 -1
- package/dist/ui/layout/DetailHeader.js +3 -2
- package/dist/ui/layout/DetailHeader.js.map +1 -1
- package/dist/ui/layout/ErrorPage.js +3 -2
- package/dist/ui/layout/ErrorPage.js.map +1 -1
- package/dist/ui/layout/FullPageLoader.js +3 -2
- package/dist/ui/layout/FullPageLoader.js.map +1 -1
- package/dist/ui/layout/GlassPanel.js +3 -2
- package/dist/ui/layout/GlassPanel.js.map +1 -1
- package/dist/ui/layout/PageHeader.js +3 -2
- package/dist/ui/layout/PageHeader.js.map +1 -1
- package/dist/ui/layout/PageHeading.js +3 -2
- package/dist/ui/layout/PageHeading.js.map +1 -1
- package/dist/ui/layout/ProfileHeader.js +3 -2
- package/dist/ui/layout/ProfileHeader.js.map +1 -1
- package/dist/ui/layout/ScrollableRow.js +3 -2
- package/dist/ui/layout/ScrollableRow.js.map +1 -1
- package/dist/ui/layout/SectionCard.js +3 -2
- package/dist/ui/layout/SectionCard.js.map +1 -1
- package/dist/ui/metrics/BarList.js +3 -2
- package/dist/ui/metrics/BarList.js.map +1 -1
- package/dist/ui/metrics/CalendarHeatmap.js +3 -2
- package/dist/ui/metrics/CalendarHeatmap.js.map +1 -1
- package/dist/ui/metrics/ChartTooltip.js +3 -2
- package/dist/ui/metrics/ChartTooltip.js.map +1 -1
- package/dist/ui/metrics/ColumnChart.js +3 -2
- package/dist/ui/metrics/ColumnChart.js.map +1 -1
- package/dist/ui/metrics/LineChart.js +3 -2
- package/dist/ui/metrics/LineChart.js.map +1 -1
- package/dist/ui/metrics/MetricCard.js +3 -2
- package/dist/ui/metrics/MetricCard.js.map +1 -1
- package/dist/ui/metrics/TableToggle.js +3 -2
- package/dist/ui/metrics/TableToggle.js.map +1 -1
- package/dist/ui/metrics/chartParts.js +7 -4
- package/dist/ui/metrics/chartParts.js.map +1 -1
- package/dist/ui/navigation/BackButton.js +7 -2
- package/dist/ui/navigation/BackButton.js.map +1 -1
- package/dist/ui/navigation/ColorSchemeToggle.js +3 -2
- package/dist/ui/navigation/ColorSchemeToggle.js.map +1 -1
- package/dist/ui/navigation/FontSizeToggle.js +3 -2
- package/dist/ui/navigation/FontSizeToggle.js.map +1 -1
- package/dist/ui/navigation/LanguageToggle.js +3 -2
- package/dist/ui/navigation/LanguageToggle.js.map +1 -1
- package/dist/ui/navigation/PageBreadcrumbs.js +3 -2
- package/dist/ui/navigation/PageBreadcrumbs.js.map +1 -1
- package/dist/ui/navigation/RouteTabs.js +8 -4
- package/dist/ui/navigation/RouteTabs.js.map +1 -1
- package/dist/ui/timeline/GroupedTimeline.js +3 -2
- package/dist/ui/timeline/GroupedTimeline.js.map +1 -1
- package/dist/upload/AttachmentsInput.js +9 -6
- package/dist/upload/AttachmentsInput.js.map +1 -1
- package/dist/upload/FileChip.js +2 -1
- package/dist/upload/FileChip.js.map +1 -1
- package/dist/upload/FileDropzone.js +5 -4
- package/dist/upload/FileDropzone.js.map +1 -1
- package/dist/upload/FileInput.js +9 -6
- package/dist/upload/FileInput.js.map +1 -1
- package/dist/upload/FileUploadInput.js +9 -6
- package/dist/upload/FileUploadInput.js.map +1 -1
- package/dist/upload/ImageInput.js +8 -5
- package/dist/upload/ImageInput.js.map +1 -1
- package/dist/upload/TemplateDownloadButton.js +3 -2
- package/dist/upload/TemplateDownloadButton.js.map +1 -1
- package/package.json +1 -1
- package/cli/templates/project/src/app/combineTexts.js.tpl +0 -31
package/README.md
CHANGED
|
@@ -53,6 +53,14 @@ El proyecto trae pruebas de pantalla (`pnpm test`, Vitest con jsdom y Testing Li
|
|
|
53
53
|
dirección con el servidor de mentira (`openScreen` en `src/testing`) y pica como una persona. Vienen las del inicio, la de
|
|
54
54
|
entrar y las del módulo de ejemplo, y `make:module` arma la de cada módulo nuevo.
|
|
55
55
|
|
|
56
|
+
Y dos revisiones para antes de subir: `pnpm lint` (ESLint: una variable que no existe, «t is not defined», se caza al
|
|
57
|
+
escribir) y `pnpm check:texts` (`calcita check:texts`: que cada `t('llave')` escrita tal cual exista en todos los idiomas y
|
|
58
|
+
que los idiomas tengan las mismas llaves). Sirve también en un proyecto que no salió del CLI: lee `src/**/*Texts.js` y
|
|
59
|
+
`src/**/texts.js`; con el código en otra carpeta, `calcita check:texts --source resources/js` (un Laravel). Un archivo de
|
|
60
|
+
textos puede reexportar otro con ruta relativa o con `@/` (aquí apunta a la carpeta del código, como en Vite; pide Node 22.15
|
|
61
|
+
o más). Nunca da un verde falso: sin la carpeta, sin ningún archivo de textos o con uno
|
|
62
|
+
que no se pudo leer, sale con problema y no compara llaves.
|
|
63
|
+
|
|
56
64
|
## Arrancar en un proyecto que ya existe
|
|
57
65
|
|
|
58
66
|
```bash
|
|
@@ -97,12 +105,42 @@ Sin nada más, todo sale en español, con la zona horaria del navegador, montos
|
|
|
97
105
|
| `canAccess` | quién ve qué (menú, rutas, botones): la regla del proyecto, normalmente `createAccessChecker(...)` | solo lo que no tiene regla |
|
|
98
106
|
| `buildId` | la compilación del front que corre en la pestaña, para el aviso de versión nueva | ninguna (sin aviso) |
|
|
99
107
|
| `fileTypes` | tipos de archivo propios para las descargas (su ícono y su color), además de Excel, CSV y PDF | los de la casa |
|
|
108
|
+
| `onMissingText` | a quién avisarle de un texto que no existe (la pantalla enseña la llave): mandarlo a Sentry, tronar una prueba | un aviso en la consola, una vez por idioma y llave |
|
|
109
|
+
| `readValidationMessage` | cómo leer los mensajes de validación de un sistema que ya existe (ver «Mensajes de error propios») | `{key}`, `{msg}`, `{message}` y texto |
|
|
100
110
|
|
|
101
111
|
Un `ToolkitProvider` dentro de otro (una parte de la app en otro idioma, una vista previa) toma del de afuera lo que no le
|
|
102
112
|
digan, y lo de adentro usa el suyo: el más cercano. No le cambia nada al resto de la app. Dentro de un componente,
|
|
103
113
|
`useFormatters()` da los formatos (`formatDate`, `formatCurrency`…) con el idioma, la zona y la moneda del proveedor más
|
|
104
114
|
cercano; los sueltos usan los del proveedor de la raíz.
|
|
105
115
|
|
|
116
|
+
**Fuera de un componente** (una función que arma columnas, un diccionario, un aviso): `translateToolkit(namespace, llave,
|
|
117
|
+
valores)` y los formatos sueltos (`formatDate`, `formatCurrency`, `formatNumber`…) usan el idioma, la zona y la moneda del
|
|
118
|
+
proveedor de la raíz, ya actualizados en la misma pintada en que cambian. Así una función auxiliar no tiene que recibir `t`
|
|
119
|
+
ni los formatos por parámetro:
|
|
120
|
+
|
|
121
|
+
```js
|
|
122
|
+
import {formatDate, translateToolkit} from '@stackcraftmx/calcita';
|
|
123
|
+
|
|
124
|
+
export const columnsOf = () => [
|
|
125
|
+
textColumn({field: 'registered_at', label: translateToolkit('clients', 'columns.registered'), valueFormatter: (value) => formatDate(value)}),
|
|
126
|
+
];
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Dos cuidados: con dos proveedores (dos islas en otro idioma) los sueltos usan el de la raíz; y si la pantalla guarda el
|
|
130
|
+
resultado (`useMemo(() => columnsOf(), [])`), ponga el idioma en las dependencias o se queda en el de antes.
|
|
131
|
+
|
|
132
|
+
Un texto que no existe se pinta con su llave (`clients:columns.registered`) y Calcita lo avisa en la consola una vez; con
|
|
133
|
+
`onMissingText` se le avisa al proyecto. Un texto opcional se pide con `defaultValue` (`t('tips.extra', {defaultValue: ''})`)
|
|
134
|
+
y no avisa.
|
|
135
|
+
|
|
136
|
+
Para un texto con una palabra resaltada, una sola llave con marcas y `MarkedText` (como `<Trans>` de react-i18next, sin
|
|
137
|
+
i18next). No pinta HTML: solo las marcas que se nombran; lo demás sale como texto.
|
|
138
|
+
|
|
139
|
+
```jsx
|
|
140
|
+
// es: {home: {headline: 'Optimiza tu negocio con <highlight>financiamiento</highlight> inteligente'}}
|
|
141
|
+
<MarkedText text={t('home.headline')} marks={{highlight: <Box component="strong" sx={{color: 'primary.main'}} />}} />
|
|
142
|
+
```
|
|
143
|
+
|
|
106
144
|
Con react-router y i18next:
|
|
107
145
|
|
|
108
146
|
```jsx
|
|
@@ -310,6 +348,23 @@ tema del proyecto y al final el `sx` que pase la pantalla. Los números se leen
|
|
|
310
348
|
Sirve con `createToolkitTheme` y con cualquier tema de MUI (el que ya tenía un sistema, tal cual): así un sistema puede
|
|
311
349
|
dejar Calcita con su propia cara, parte por parte.
|
|
312
350
|
|
|
351
|
+
Además, como en MUI, cada parte con nombre se puede **cambiar por otro componente** (`slots`) o **recibir props de más**
|
|
352
|
+
(`slotProps`), con el nombre de la parte de la tabla de abajo; desde la pantalla o para toda la app desde el tema:
|
|
353
|
+
|
|
354
|
+
```jsx
|
|
355
|
+
<RecordCard slots={{avatar: StoreAvatar}} slotProps={{titles: {component: 'header'}}} … />
|
|
356
|
+
createTheme({components: {CalcitaRecordCard: {defaultProps: {slotProps: {root: {elevation: 3}}}}}});
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
`className`, `style` y `sx` de `slotProps` se suman a los de Calcita; una pieza dentro de otra igual no toma los `slots` de la
|
|
360
|
+
de afuera. `TextInput` es la excepción: su `slotProps` es el del `TextField` de MUI (`input`, `htmlInput`…). Una pieza propia
|
|
361
|
+
del proyecto se arma con lo mismo: `piecePart`, `usePieceProps` y `withPieceSlots`.
|
|
362
|
+
|
|
363
|
+
El `sx` de la pantalla se **combina regla por regla** con el de la pieza, no la reemplaza: en la tabla,
|
|
364
|
+
`gridSx={{'& .MuiDataGrid-cell': {alignItems: 'flex-start'}}}` cambia solo la alineación y la celda conserva lo demás.
|
|
365
|
+
Para hacer lo mismo en un componente propio: `sx={[{p: 2}, ...sxListOf(sx)]}` (una lista de sx, como pide MUI; nunca
|
|
366
|
+
`{p: 2, ...sx}`, que pierde la llave entera cuando las dos traen la misma).
|
|
367
|
+
|
|
313
368
|
<details>
|
|
314
369
|
<summary>Las piezas, con su nombre en el tema y sus partes</summary>
|
|
315
370
|
|
|
@@ -324,11 +379,14 @@ dejar Calcita con su propia cara, parte por parte.
|
|
|
324
379
|
| `CalcitaAttachmentsInput` | `root`, `actions`, `button`, `list`, `fileChip`, `limits` |
|
|
325
380
|
| `CalcitaAuditTrailDialog` | `description` |
|
|
326
381
|
| `CalcitaAuthLayout` | `root`, `tools`, `body`, `brand`, `logo`, `brandName`, `card`, `description`, `content`, `footer` |
|
|
382
|
+
| `CalcitaBackButton` | `root` |
|
|
383
|
+
| `CalcitaBarActionButton` | `button`, `iconButton`, `menuItem` |
|
|
327
384
|
| `CalcitaBarActions` | `group` |
|
|
328
385
|
| `CalcitaBarCapsule` | `root` |
|
|
329
386
|
| `CalcitaBarList` | `row`, `chart` |
|
|
330
387
|
| `CalcitaBarSearch` | `field` |
|
|
331
388
|
| `CalcitaCalendarHeatmap` | `header`, `toggle`, `tableArea`, `dateCell`, `valueCell`, `descriptionCell`, `gridArea`, `grid`, `monthLabel`, `week`, `dayLabel`, `cell`, `legend`, `legendLess`, `legendCell`, `legendMore` |
|
|
389
|
+
| `CalcitaCatalogInput` | `field` |
|
|
332
390
|
| `CalcitaCfdiSummary` | `root`, `header`, `amounts`, `concepts` |
|
|
333
391
|
| `CalcitaChart` | `tableArea`, `legend`, `legendItem`, `legendLine`, `legendSwatch`, `reference`, `referenceLine` |
|
|
334
392
|
| `CalcitaChartTooltip` | `root` |
|
|
@@ -340,23 +398,27 @@ dejar Calcita con su propia cara, parte por parte.
|
|
|
340
398
|
| `CalcitaConfirmDialog` | `problem`, `actions` |
|
|
341
399
|
| `CalcitaContentDialog` | `header`, `title`, `closeButton`, `body` |
|
|
342
400
|
| `CalcitaCookieNotice` | `root`, `text`, `actions` |
|
|
401
|
+
| `CalcitaCopyButton` | `button` |
|
|
343
402
|
| `CalcitaCountdown` | `root` |
|
|
403
|
+
| `CalcitaDateInput` | `picker` |
|
|
344
404
|
| `CalcitaDateRangeFilter` | `chip`, `panel`, `actions` |
|
|
405
|
+
| `CalcitaDateTimeInput` | `picker` |
|
|
345
406
|
| `CalcitaDefinitionList` | `root`, `entry`, `label`, `value` |
|
|
346
407
|
| `CalcitaDemoTotpCode` | `root`, `code` |
|
|
347
408
|
| `CalcitaDetailHeader` | `root`, `titleArea`, `title`, `badges`, `actions` |
|
|
348
409
|
| `CalcitaDownloadManager` | `doneIcon`, `failedIcon`, `canceledIcon`, `cancelButton`, `progress`, `cancelIcon`, `item`, `itemText`, `itemStatus`, `itemActions`, `panel`, `header`, `title`, `list` |
|
|
349
410
|
| `CalcitaDownloadMenu` | `button` |
|
|
350
|
-
| `CalcitaEmptyState` | `root`, `icon` |
|
|
351
411
|
| `CalcitaEfirmaFields` | `root`, `certificate`, `verify` |
|
|
412
|
+
| `CalcitaEmptyState` | `root`, `icon` |
|
|
352
413
|
| `CalcitaErrorPage` | `root`, `actions` |
|
|
353
414
|
| `CalcitaEventCalendar` | `toolbar`, `navigation`, `title`, `calendar` |
|
|
354
415
|
| `CalcitaEventDetails` | `row`, `rowContent`, `titleRow`, `toneDot`, `linkRow`, `link`, `guestsTitle`, `guest`, `guestAvatar`, `guestName`, `notes`, `actions` |
|
|
416
|
+
| `CalcitaFieldFrame` | `root`, `label` |
|
|
355
417
|
| `CalcitaFileDropzone` | `root`, `fileArea`, `fileChip`, `hint`, `actions`, `limits`, `extra` |
|
|
356
418
|
| `CalcitaFileInput` | `root`, `button`, `fileChip`, `empty` |
|
|
357
419
|
| `CalcitaFileUploadInput` | `root`, `fileName`, `status`, `button`, `helper` |
|
|
358
420
|
| `CalcitaFilterChips` | `root`, `header`, `clearButton` |
|
|
359
|
-
| `CalcitaFilterDrawer` | `header`, `body`, `footer`
|
|
421
|
+
| `CalcitaFilterDrawer` | `header`, `body`, `footer` |
|
|
360
422
|
| `CalcitaFontSizeToggle` | `button` |
|
|
361
423
|
| `CalcitaFormProblemAlert` | `root` |
|
|
362
424
|
| `CalcitaFormRow` | `root`, `label`, `control` |
|
|
@@ -367,6 +429,7 @@ dejar Calcita con su propia cara, parte por parte.
|
|
|
367
429
|
| `CalcitaGroupedTimeline` | `group`, `groupHeader`, `groupButton`, `groupTitle`, `expandIcon`, `timeline`, `opposite`, `connector`, `content`, `entryTitle` |
|
|
368
430
|
| `CalcitaHeaderFilter` | `button`, `badge`, `panel` |
|
|
369
431
|
| `CalcitaHeaderTools` | `divider`, `root` |
|
|
432
|
+
| `CalcitaHelpButton` | `root` |
|
|
370
433
|
| `CalcitaHelpCarouselDialog` | `media`, `content`, `dots`, `actions` |
|
|
371
434
|
| `CalcitaIconBadge` | `root`, `icon`, `label` |
|
|
372
435
|
| `CalcitaImageInput` | `root`, `preview`, `image`, `placeholder`, `actions` |
|
|
@@ -383,32 +446,37 @@ dejar Calcita con su propia cara, parte por parte.
|
|
|
383
446
|
| `CalcitaMetricCard` | `root`, `action`, `header`, `icon`, `label`, `value`, `caption`, `extra`, `trend` |
|
|
384
447
|
| `CalcitaMobileTabBar` | `tab`, `tabIconPlaceholder`, `tabLabel`, `root`, `bar`, `minimized`, `account`, `sheetHeader` |
|
|
385
448
|
| `CalcitaModalWaiting` | `root`, `title`, `body`, `text` |
|
|
449
|
+
| `CalcitaMonthInput` | `picker` |
|
|
386
450
|
| `CalcitaMultiSelectFilter` | `list`, `option` |
|
|
387
451
|
| `CalcitaNewBuildNotice` | `floating`, `icon`, `message`, `reloadButton`, `banner` |
|
|
452
|
+
| `CalcitaNumberInput` | `field` |
|
|
388
453
|
| `CalcitaPageBreadcrumbs` | `root`, `link`, `current` |
|
|
389
454
|
| `CalcitaPageHeader` | `root`, `subtitle`, `action` |
|
|
390
455
|
| `CalcitaPageHeading` | `root`, `breadcrumbs`, `titleRow`, `title`, `actions`, `description` |
|
|
391
456
|
| `CalcitaPasswordChecklist` | `title`, `list`, `item`, `hidden` |
|
|
457
|
+
| `CalcitaPdfViewerDialog` | `actions`, `frame` |
|
|
392
458
|
| `CalcitaPeriodRangeSelector` | `field`, `select`, `root` |
|
|
393
459
|
| `CalcitaPermissionMatrix` | `permission`, `checkbox`, `group`, `groupHeader`, `groupTitle`, `grid` |
|
|
394
460
|
| `CalcitaPondDropzone` | `root`, `summary`, `limits`, `actions`, `extra` |
|
|
395
461
|
| `CalcitaProfileHeader` | `root`, `cover`, `body`, `avatar`, `text`, `name`, `chips`, `actions` |
|
|
396
462
|
| `CalcitaProfileScreen` | `sectionTitle`, `form`, `preferences` |
|
|
397
463
|
| `CalcitaQuickFilters` | `root`, `caption`, `chip`, `chipLabel`, `chipCount` |
|
|
398
|
-
| `CalcitaPdfViewerDialog` | `actions`, `frame` |
|
|
399
464
|
| `CalcitaRecordCard` | `root`, `header`, `avatar`, `titles`, `status`, `body`, `group`, `fact`, `highlight`, `footer`, `details` |
|
|
465
|
+
| `CalcitaRecordCardSkeleton` | `root` |
|
|
400
466
|
| `CalcitaRecoveryCodesDialog` | `codes`, `actions` |
|
|
401
|
-
| `CalcitaRouteTabs` | `root`, `tab`, `badge` |
|
|
402
|
-
| `CalcitaScrollableRow` | `root` |
|
|
403
467
|
| `CalcitaRepeatingFields` | `root`, `row`, `rowHeader`, `rowContent`, `addButton`, `helper` |
|
|
404
468
|
| `CalcitaRichTextEditor` | `root`, `toolbar`, `content`, `footer` |
|
|
405
469
|
| `CalcitaRichTextView` | `root` |
|
|
470
|
+
| `CalcitaRouteTabs` | `root`, `tab`, `badge` |
|
|
471
|
+
| `CalcitaScrollableRow` | `root` |
|
|
406
472
|
| `CalcitaSecondStepForm` | `actions` |
|
|
473
|
+
| `CalcitaSecretField` | `field` |
|
|
407
474
|
| `CalcitaSectionCard` | `root`, `header`, `title` |
|
|
408
475
|
| `CalcitaSegmentedControl` | `root` |
|
|
409
476
|
| `CalcitaSelectInput` | `option`, `optionText` |
|
|
410
477
|
| `CalcitaSelectionActions` | `bar`, `count`, `clear`, `phoneCount`, `phoneActions` |
|
|
411
|
-
| `CalcitaServerTable` | `toolbar`, `summary`, `customHeader`, `count`, `countRow`, `selectionNotice`, `error`, `card`, `grid`, `pagination` |
|
|
478
|
+
| `CalcitaServerTable` | `cards`, `cardsPagination`, `viewToggle`, `toolbar`, `summary`, `customHeader`, `count`, `countRow`, `selectionNotice`, `error`, `card`, `grid`, `pagination` |
|
|
479
|
+
| `CalcitaServerTableFilterDrawer` | `button` |
|
|
412
480
|
| `CalcitaSessionsCard` | `item`, `itemIcon`, `itemHeader`, `actions` |
|
|
413
481
|
| `CalcitaSettingsMenu` | `divider` |
|
|
414
482
|
| `CalcitaSideMenu` | `scrollArrow`, `root`, `brand`, `brandLogo`, `brandText`, `brandName`, `brandCaption`, `railTop`, `listArea`, `list`, `section`, `sectionTitle`, `sectionTitleText`, `footer`, `railBottom` |
|
|
@@ -416,19 +484,22 @@ dejar Calcita con su propia cara, parte por parte.
|
|
|
416
484
|
| `CalcitaSignInForm` | `footer` |
|
|
417
485
|
| `CalcitaSignInScreen` | `alert` |
|
|
418
486
|
| `CalcitaSortableFilterHeader` | `title`, `root`, `sortButton`, `sortIndicator`, `clearButton` |
|
|
487
|
+
| `CalcitaStackedCell` | `root`, `line`, `label`, `valueRow`, `primary`, `secondary`, `note` |
|
|
419
488
|
| `CalcitaStatusChip` | `root`, `dot`, `label`, `chip` |
|
|
420
489
|
| `CalcitaSubmenuActionsMenu` | `badge` |
|
|
490
|
+
| `CalcitaSubmitButton` | `root` |
|
|
421
491
|
| `CalcitaTabBarEditor` | `root`, `header`, `title`, `list`, `itemIcon`, `footer` |
|
|
422
492
|
| `CalcitaTableToggle` | `root`, `button` |
|
|
423
493
|
| `CalcitaTag` | `root` |
|
|
424
494
|
| `CalcitaTemplateDownloadButton` | `root` |
|
|
425
495
|
| `CalcitaTermsAcceptanceDialog` | `content`, `frame`, `footer` |
|
|
426
496
|
| `CalcitaTextInput` | `field` |
|
|
497
|
+
| `CalcitaTimeInput` | `picker` |
|
|
427
498
|
| `CalcitaTopMenu` | `link`, `root` |
|
|
428
499
|
| `CalcitaTransferListInput` | `root`, `list`, `actions` |
|
|
429
500
|
| `CalcitaTwoStepVerification` | `qr`, `secret`, `secretCode`, `header`, `headerTitle`, `headerText`, `menuIcon` |
|
|
430
501
|
| `CalcitaWizardLayout` | `stepper`, `phoneSteps`, `actions` |
|
|
431
|
-
| `CalcitaWordmark` | `root` |
|
|
502
|
+
| `CalcitaWordmark` | `root`, `mode` |
|
|
432
503
|
|
|
433
504
|
</details>
|
|
434
505
|
|
|
@@ -529,14 +600,20 @@ el servidor del proyecto); `HelpButton` es el «?» que la vuelve a abrir.
|
|
|
529
600
|
|
|
530
601
|
Para listas donde una tabla se queda corta, `RecordCard`: arriba quién es (avatar con iniciales, folio, nombre) con su
|
|
531
602
|
estatus, insignias, botón para abrirlo y menú «⋯»; en el cuerpo sus datos en grupos (`groups`, o `content` libre) y el dato
|
|
532
|
-
principal grande; abajo lo que va a todo lo ancho y «Ver detalle», que despliega más
|
|
603
|
+
principal grande; abajo lo que va a todo lo ancho y «Ver detalle», que despliega más (`footerAlign` los junta a la
|
|
604
|
+
izquierda o a la derecha; por omisión «Ver detalle» va en la otra orilla). El orden es el que se da y nada se
|
|
533
605
|
reacomoda solo: para un orden obligatorio, `trailing` pone el estatus al final y `columns` fija el ancho de cada columna.
|
|
534
606
|
`RecordCardSkeleton` es su esqueleto. El menú «⋯» (`ActionsMenu`) acepta secciones, separadores, ligas, renglones propios y
|
|
535
|
-
submenús (`children`), que se abren dentro del mismo menú con «Regresar».
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
607
|
+
submenús (`children`), que se abren dentro del mismo menú con «Regresar». Un renglón con `to` es una pantalla de la app: va
|
|
608
|
+
con la navegación del proyecto, así el clic normal no recarga la app y Cmd/Ctrl+clic o el botón de en medio la abren en otra
|
|
609
|
+
pestaña (`href` es para lo de afuera). `onClick` recibe el evento del clic.
|
|
610
|
+
|
|
611
|
+
Para las secciones de un registro, `RouteTabs`: pestañas donde cada una es una dirección (se comparte la liga a una
|
|
612
|
+
pestaña); por ruta (cada pestaña su página, y «atrás» regresa a la anterior) o en la consulta (`mode="query"`, `?tab=pagos`,
|
|
613
|
+
con `useActiveRouteTab` para pintar el panel), con ícono, conteo y permiso por pestaña. Las de la consulta son vistas de la
|
|
614
|
+
misma ficha: por omisión reemplazan la entrada del historial, así «atrás» y el `BackButton` salen de la ficha en vez de pasear
|
|
615
|
+
por sus pestañas (`replace={false}` lo apaga; en las de ruta, `replace` lo prende). Las tres navegaciones de Calcita (la del
|
|
616
|
+
navegador, la de `#` y la de Next) y react-router saben reemplazar. Junto al título de un registro van su
|
|
540
617
|
estatus (`StatusChip`) y sus insignias (`IconBadge`): un ícono y un texto corto con el
|
|
541
618
|
color de lo que significan («Envío asegurado», «Pago con tarjeta»), con borde, tenue o sin caja. Mejor desde un diccionario:
|
|
542
619
|
la entrada trae su ícono (`dictionaryEntryOf(value, keyPrefix, color, {icon})`) y la insignia saca de ahí texto,
|
|
@@ -554,6 +631,42 @@ El marco avisa cuando la persona encoge el menú (`onMenuCollapse`), abre el men
|
|
|
554
631
|
sus pestañas (`onMobileTabsChange`), para guardar esas preferencias en el servidor del proyecto si se quiere; sus textos se
|
|
555
632
|
cambian con `texts`.
|
|
556
633
|
|
|
634
|
+
## La tabla de servidor (`/table`)
|
|
635
|
+
|
|
636
|
+
`ServerTable` pagina, filtra y ordena en el servidor (`fetchPage` recibe `{filters, sortOrders, page, pageSize}` y regresa
|
|
637
|
+
`{rows, total, facets}`); con `prefix` su estado va en la dirección. Lo que piden casi todas las listas de administración
|
|
638
|
+
viene listo:
|
|
639
|
+
|
|
640
|
+
```jsx
|
|
641
|
+
import {ACTIONS_COLUMN_FIELD, ServerTable, actionsColumn, stackedColumn, statusColumn} from '@stackcraftmx/calcita/table';
|
|
642
|
+
|
|
643
|
+
const columns = [
|
|
644
|
+
actionsColumn({label: 'Acciones', actionsOf: (row) => [{key: 'open', label: 'Abrir', to: `/clientes/${row.id}`}]}),
|
|
645
|
+
stackedColumn({field: 'business_name', label: 'Empresa', entries: (row) => [row.business_name, row.rfc, row.regime]}),
|
|
646
|
+
stackedColumn({field: 'created_at', label: 'Fechas', entries: (row) => [ // con etiqueta
|
|
647
|
+
{label: 'Alta', value: formatDate(row.created_at)}, {label: 'Último cambio', value: formatDate(row.updated_at)},
|
|
648
|
+
]}),
|
|
649
|
+
statusColumn({field: 'status', label: 'Estado', dictionary: REGISTRATION_STATUS, t}), // el ancho, medido
|
|
650
|
+
];
|
|
651
|
+
|
|
652
|
+
<ServerTable prefix="clientes" fetchPage={fetchClients} columns={columns} ariaLabel="Clientes"
|
|
653
|
+
fixedColumn={[ACTIONS_COLUMN_FIELD, 'business_name']} // fijas al deslizar
|
|
654
|
+
renderCard={(row) => <RecordCard title={row.business_name} … />} /> // también en tarjetas
|
|
655
|
+
```
|
|
656
|
+
|
|
657
|
+
- `stackedColumn`: los datos que se leen de corrido en una celda, uno debajo del otro, los que hagan falta (el primero en
|
|
658
|
+
negritas, los demás en gris). Cada dato va solo, si el encabezado ya dice qué son, o con su etiqueta arriba
|
|
659
|
+
(`{label, value, note}`) si el encabezado nombra al grupo. Un dato vacío no se pinta, salvo el principal o uno con
|
|
660
|
+
etiqueta, que enseñan «—» (`texts={{cells: {empty: '- - -'}}}` lo cambia). Los renglones toman su alto solos;
|
|
661
|
+
`getRowHeight` también acepta `'auto'`. `StackedCell` es la misma celda para un `renderCell` propio.
|
|
662
|
+
- `statusColumn`: el estatus desde su diccionario, con filtro de facetas y, con `t`, el ancho de su etiqueta más larga.
|
|
663
|
+
- `actionsColumn`: el «⋯» de cada renglón en su columna, de ancho fijo.
|
|
664
|
+
- `fixedColumn` acepta una lista: cada una se pega donde termina la anterior (las que no son la última llevan `width`).
|
|
665
|
+
- `renderCard`: la misma lista en tarjetas, con la misma búsqueda, filtros, orden y páginas; un botón cambia de vista y con
|
|
666
|
+
`prefix` la vista va en la dirección (`?clientes_view=cards`). `view`, `defaultView`, `onViewChange` y `showViewToggle`
|
|
667
|
+
para decidirlo desde la pantalla.
|
|
668
|
+
- `gridSx` se combina con los estilos de la tabla regla por regla; `gridProps` pasa lo demás al DataGrid.
|
|
669
|
+
|
|
557
670
|
## Eventos y textos de cada componente
|
|
558
671
|
|
|
559
672
|
Cada componente de la casa avisa hacia afuera todo lo que pasa adentro (`onSelect`, `onChange`, `onViewChange`,
|
|
@@ -644,6 +757,29 @@ location /ventas/ {
|
|
|
644
757
|
}
|
|
645
758
|
```
|
|
646
759
|
|
|
760
|
+
Si el prefijo lo decide el servidor al servir la página (Laravel con `config('app.url')`, un proxy con su ruta), se construye
|
|
761
|
+
UNA vez con archivos relativos (`ASSET_URL=./`) y la página trae `<base href="/ventas/">`: `documentBasePath()` lo lee al
|
|
762
|
+
abrirla (`null` si no hay `<base>`) y el proyecto de `calcita new` ya lo usa para el router y `publicUrlOf`.
|
|
763
|
+
|
|
764
|
+
## Direcciones con nombre y textos que se juntan solos
|
|
765
|
+
|
|
766
|
+
Cuando una pantalla lleva a la de otro módulo (el detalle de un cliente regresa a la lista de donde salió), cada módulo
|
|
767
|
+
publica sus direcciones en su archivo y un índice las junta; se piden por nombre, sin importar el otro módulo:
|
|
768
|
+
|
|
769
|
+
```js
|
|
770
|
+
// src/app/appPaths.js — el glob tiene que ser un texto literal: Vite lo resuelve al compilar
|
|
771
|
+
export const {pathOf} = createPathIndex(import.meta.glob('@/modules/**/paths.js', {eager: true}));
|
|
772
|
+
|
|
773
|
+
pathOf('admin:profile:detail', {groupId: 2, userId: 7675, tab: 'documentos'}) // '/admin/user/detail/2/7675?tab=documentos'
|
|
774
|
+
```
|
|
775
|
+
|
|
776
|
+
Lo que la ruta pide (`:userId`) se sustituye y lo que sobra va como consulta; un nombre que no existe o una parte que falta
|
|
777
|
+
truena y dice qué sí hay. Las direcciones del API de cada módulo, igual: `createPathIndex(glob, {exportName: 'uris'})`.
|
|
778
|
+
`fillPath(ruta, partes)` llena una suelta.
|
|
779
|
+
|
|
780
|
+
Los textos de cada módulo se juntan con `combineTexts`: por idioma y namespace, los objetos de adentro se suman
|
|
781
|
+
(`validation.fields` de dos módulos) y un texto repetido entre módulos truena en vez de pisarse.
|
|
782
|
+
|
|
647
783
|
## La petición de la casa
|
|
648
784
|
|
|
649
785
|
Todo lo que habla con el servidor pasa por un cliente, armado una vez por proyecto con `fetch` del navegador (sin axios):
|
|
@@ -854,6 +990,20 @@ formik y yup los instala el proyecto (`pnpm add formik yup`); `Formik`, `Form` y
|
|
|
854
990
|
`@stackcraftmx/calcita/forms`, que es la misma copia. `FormWizard` parte un formulario en pasos, con pasos opcionales (hay
|
|
855
991
|
uno para formik y otro para react-hook-form); los ejemplos traen los dos.
|
|
856
992
|
|
|
993
|
+
Para editar un registro de varios pasos (se entra a corregir un dato suelto, no a recorrer todo), el mismo `FormWizard`:
|
|
994
|
+
|
|
995
|
+
```jsx
|
|
996
|
+
<FormWizard steps={steps} submitLabel="Guardar cambios"
|
|
997
|
+
initialStepKey={review.stepKey} // abre en el paso que dice el servidor
|
|
998
|
+
orientation={WIZARD_ORIENTATION.vertical} // un paso debajo del otro, con sus campos adentro
|
|
999
|
+
stepSelection={WIZARD_STEP_SELECTION.free} // los títulos se pulsan: salta directo (o .checked: solo sin errores)
|
|
1000
|
+
onStepChange={(stepKey) => setSearchParams({step: stepKey})} />
|
|
1001
|
+
```
|
|
1002
|
+
|
|
1003
|
+
Con los títulos que se pulsan, la palomita de un paso la pone la pantalla (`steps[].completed`): «antes» ya no quiere decir
|
|
1004
|
+
«hecho». Al enviar, el formulario regresa al primer paso con error, como siempre. Sin estas opciones se porta igual que
|
|
1005
|
+
antes. `WizardLayout` suelto acepta lo mismo (`orientation`, `onStepSelect`); `skippedKeys` y `onSkip` ya no son obligatorios.
|
|
1006
|
+
|
|
857
1007
|
Para que el formulario se vea como los de Apple (Ajustes, la hoja «Nuevo evento» de Calendario), los campos van dentro de
|
|
858
1008
|
una `FormSection`: cada uno se vuelve un renglón, con la etiqueta a la izquierda y el valor a la derecha, sin la caja de
|
|
859
1009
|
MUI. Son los mismos campos, sin cambiarles nada; las listas llevan su ⌃⌄ y la fecha va en una cápsula. `FormRow` es el
|
|
@@ -872,6 +1022,35 @@ import {FormRow, FormSection} from '@stackcraftmx/calcita';
|
|
|
872
1022
|
Los campos van directo dentro de la `FormSection` (sin Grid ni Stack en medio): la línea entre renglones se dibuja entre
|
|
873
1023
|
hermanos.
|
|
874
1024
|
|
|
1025
|
+
### Mensajes de error propios (sin tocar el esquema)
|
|
1026
|
+
|
|
1027
|
+
Los mensajes de `buildYupLocale()` son llaves que se traducen al pintarse, y cada uno lleva **su regla y su campo**. Cuando
|
|
1028
|
+
el negocio pide un mensaje muy específico no hace falta tocar el esquema ni los mensajes de Calcita. El primero que exista
|
|
1029
|
+
gana:
|
|
1030
|
+
|
|
1031
|
+
1. el de la pantalla, en el campo: `<FormTextField name="rfc" messages={{matches: 'El RFC lleva 12 o 13 caracteres'}} />`;
|
|
1032
|
+
2. el de los textos del proyecto para ese campo y esa regla, en todas las pantallas:
|
|
1033
|
+
`{es: {validation: {fields: {rfc: {matches: 'El RFC lleva 12 o 13 caracteres'}}}}}` (dentro de una lista,
|
|
1034
|
+
`contacts[2].email` busca `contacts.email`);
|
|
1035
|
+
3. el general de Calcita (o el del esquema: `.required({key: 'clientes:rfcObligatorio'})`).
|
|
1036
|
+
|
|
1037
|
+
Los textos pueden decir el nombre del campo: `{{label}}` (el de `.label('RFC')` del esquema o, si no, la etiqueta del campo).
|
|
1038
|
+
|
|
1039
|
+
**Un sistema que ya existe** con su propio `setLocale` de yup: Calcita entiende sola `{key, values}`, `{msg, values}` (la de
|
|
1040
|
+
muchos sistemas con i18next), `{message: 'texto'}`, el error entero de react-hook-form y un texto ya escrito. Para otra
|
|
1041
|
+
forma, una función en el proveedor; los esquemas viejos entran sin reescribirse:
|
|
1042
|
+
|
|
1043
|
+
```jsx
|
|
1044
|
+
<ToolkitProvider readValidationMessage={(error) => (error?.codigo ? {key: `legado:${error.codigo}`, values: error.datos} : undefined)}>
|
|
1045
|
+
```
|
|
1046
|
+
|
|
1047
|
+
Una forma que no entiende no se pinta como «[object Object]»: sale el mensaje general y se avisa en la consola. Un campo
|
|
1048
|
+
propio del proyecto usa lo mismo con `useValidationText({label, messages})`.
|
|
1049
|
+
|
|
1050
|
+
Reglas listas, con su mensaje en el idioma activo: `sameAsFieldRule('password', {otherLabel: 'la contraseña'})` (confirmar
|
|
1051
|
+
una contraseña, una CLABE o un correo), `percentRule({max: 30})` y, en `/mexico`, `postalCodeRule()` junto a `rfcRule()`,
|
|
1052
|
+
`curpRule()` y `clabeRule()`.
|
|
1053
|
+
|
|
875
1054
|
### Campos con máscara
|
|
876
1055
|
|
|
877
1056
|
`MaskedInput` (y `FormMaskedField` en `/forms` y `/react-hook-form`) es el campo de texto de la casa con una máscara: mientras
|
package/cli/calcita.js
CHANGED
|
@@ -14,6 +14,7 @@ import {argv, cwd, exit, stdin, stdout} from 'node:process';
|
|
|
14
14
|
import {parseArgs} from 'node:util';
|
|
15
15
|
|
|
16
16
|
import {askQuestions} from './askQuestions.js';
|
|
17
|
+
import {checkTexts} from './checkTexts.js';
|
|
17
18
|
import {makeComponent} from './makeComponent.js';
|
|
18
19
|
import {makeForm} from './makeForm.js';
|
|
19
20
|
import {makeModule} from './makeModule.js';
|
|
@@ -33,6 +34,9 @@ const HELP = `Calcita: proyectos y esqueletos con la forma de los ejemplos.
|
|
|
33
34
|
calcita make:form <módulo> <Formulario> un formulario con sus reglas y sus textos
|
|
34
35
|
calcita make:component <Componente> un componente en src/core (lo usan varios módulos)
|
|
35
36
|
--module <módulo> … o solo de un módulo
|
|
37
|
+
calcita check:texts revisa que cada t('llave') exista en todos los idiomas, y que los idiomas tengan
|
|
38
|
+
las mismas llaves (lo que si no se descubre en la pantalla)
|
|
39
|
+
--source <carpeta> … con el código en otra carpeta (por omisión src; en Laravel, resources/js)
|
|
36
40
|
|
|
37
41
|
Opciones:
|
|
38
42
|
-y, --yes sin preguntas: lo recomendado, más lo que diga cada opción
|
|
@@ -51,6 +55,7 @@ const {values: options, positionals} = parseArgs({
|
|
|
51
55
|
'yes': {type: 'boolean', short: 'y'},
|
|
52
56
|
'help': {type: 'boolean', short: 'h'},
|
|
53
57
|
'module': {type: 'string'},
|
|
58
|
+
'source': {type: 'string'},
|
|
54
59
|
'label-es': {type: 'string'},
|
|
55
60
|
'label-en': {type: 'string'},
|
|
56
61
|
...ANSWER_OPTIONS,
|
|
@@ -125,6 +130,17 @@ async function runMakeComponent(componentName) {
|
|
|
125
130
|
stdout.write('\nListo.\n');
|
|
126
131
|
}
|
|
127
132
|
|
|
133
|
+
async function runCheckTexts() {
|
|
134
|
+
const {problems, checkedKeys, textFiles, languages, sourceFolder} = await checkTexts({projectRoot: cwd(), sourceFolder: options.source});
|
|
135
|
+
stdout.write(`Revisé ${checkedKeys} llaves escritas en el código de ${sourceFolder}/ contra ${textFiles.length} archivos de textos (${languages.join(', ') || 'sin idiomas'}).\n`);
|
|
136
|
+
if (problems.length === 0) {
|
|
137
|
+
stdout.write('Todo en su lugar.\n');
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
stdout.write(`\n${problems.map((problem) => ` ✗ ${problem}`).join('\n')}\n`);
|
|
141
|
+
throw new CliError(`${problems.length} problema(s) con los textos.`);
|
|
142
|
+
}
|
|
143
|
+
|
|
128
144
|
const COMMANDS = Object.freeze({
|
|
129
145
|
'new': runNew,
|
|
130
146
|
'init': () => runNew('.'),
|
|
@@ -132,6 +148,7 @@ const COMMANDS = Object.freeze({
|
|
|
132
148
|
'make:page': runMakePage,
|
|
133
149
|
'make:form': runMakeForm,
|
|
134
150
|
'make:component': runMakeComponent,
|
|
151
|
+
'check:texts': runCheckTexts,
|
|
135
152
|
});
|
|
136
153
|
|
|
137
154
|
try {
|