@stackcraftmx/calcita 0.0.0-stage → 0.23.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/LICENSE +110 -0
- package/README.md +611 -2
- package/cli/askQuestions.js +63 -0
- package/cli/calcita.js +150 -0
- package/cli/makeComponent.js +50 -0
- package/cli/makeForm.js +68 -0
- package/cli/makeModule.js +78 -0
- package/cli/makePage.js +62 -0
- package/cli/names.js +64 -0
- package/cli/newProject.js +103 -0
- package/cli/packageVersions.js +38 -0
- package/cli/projectAnswers.js +145 -0
- package/cli/projectConfig.js +38 -0
- package/cli/projectFiles.js +126 -0
- package/cli/screenLabels.js +41 -0
- package/cli/templateFiles.js +186 -0
- package/cli/templates/component/core/__ComponentName__.jsx.tpl +23 -0
- package/cli/templates/component/module/__ComponentName__.jsx.tpl +21 -0
- package/cli/templates/form/formik/__FormName__.jsx.tpl +50 -0
- package/cli/templates/form/hookForm/__FormName__.jsx.tpl +53 -0
- package/cli/templates/form/shared/__formName__Schema.js.tpl +20 -0
- package/cli/templates/form/shared/__formName__Texts.js.tpl +6 -0
- package/cli/templates/module/__Name__Page.jsx.tpl +75 -0
- package/cli/templates/module/__name__Api.js.tpl +39 -0
- package/cli/templates/module/__name__Texts.js.tpl +27 -0
- package/cli/templates/module/menu.js.tpl +21 -0
- package/cli/templates/module/routes.js.tpl +7 -0
- package/cli/templates/moduleServer/__name__Server.js.tpl +68 -0
- package/cli/templates/page/__PageName__Page.jsx.tpl +22 -0
- package/cli/templates/page/__pageName__PageTexts.js.tpl +23 -0
- package/cli/templates/project/README.md.tpl +55 -0
- package/cli/templates/project/dot-gitignore.tpl +11 -0
- package/cli/templates/project/index.html.tpl +20 -0
- package/cli/templates/project/jsconfig.json.tpl +16 -0
- package/cli/templates/project/pnpm-workspace.yaml.tpl +5 -0
- package/cli/templates/project/public/favicon.svg +1 -0
- package/cli/templates/project/public/icons/apple-touch-icon.png +0 -0
- package/cli/templates/project/public/icons/icon-192.png +0 -0
- package/cli/templates/project/public/icons/icon-512-maskable.png +0 -0
- package/cli/templates/project/public/icons/icon-512.png +0 -0
- package/cli/templates/project/public/manifest.webmanifest.tpl +17 -0
- package/cli/templates/project/src/app/AppProviders.jsx.tpl +102 -0
- package/cli/templates/project/src/app/AppShell.jsx.tpl +87 -0
- package/cli/templates/project/src/app/appRouter.jsx.tpl +49 -0
- package/cli/templates/project/src/app/appSettings.js.tpl +13 -0
- package/cli/templates/project/src/app/appTexts.js.tpl +15 -0
- package/cli/templates/project/src/app/combineTexts.js.tpl +31 -0
- package/cli/templates/project/src/app/i18n.js.tpl +19 -0
- package/cli/templates/project/src/app/shellTexts.js.tpl +16 -0
- package/cli/templates/project/src/core/AppLogo.jsx.tpl +12 -0
- package/cli/templates/project/src/core/accountConnector.js.tpl +36 -0
- package/cli/templates/project/src/core/apiClient.js.tpl +15 -0
- package/cli/templates/project/src/core/appPaths.js.tpl +11 -0
- package/cli/templates/project/src/core/index.js.tpl +8 -0
- package/cli/templates/project/src/fakeServer/networkDelay.js.tpl +40 -0
- package/cli/templates/project/src/fakeServer/serverText.js.tpl +20 -0
- package/cli/templates/project/src/main.jsx.tpl +24 -0
- package/cli/templates/project/src/modules/auth/ForgotPasswordPage.jsx.tpl +14 -0
- package/cli/templates/project/src/modules/auth/ResetPasswordPage.jsx.tpl +15 -0
- package/cli/templates/project/src/modules/auth/SignInPage.jsx.tpl +29 -0
- package/cli/templates/project/src/modules/auth/authTexts.js.tpl +6 -0
- package/cli/templates/project/src/modules/auth/routes.js.tpl +11 -0
- package/cli/templates/project/src/modules/home/HomePage.jsx.tpl +38 -0
- package/cli/templates/project/src/modules/home/homeTexts.js.tpl +29 -0
- package/cli/templates/project/src/modules/home/menu.js.tpl +17 -0
- package/cli/templates/project/src/modules/home/routes.js.tpl +4 -0
- package/cli/templates/project/src/modules/profile/ProfilePage.jsx.tpl +13 -0
- package/cli/templates/project/src/modules/profile/routes.js.tpl +6 -0
- package/cli/templates/project/vite.config.js.tpl +27 -0
- package/dist/DataTable/AuditTrailDialog.js +40 -0
- package/dist/DataTable/AuditTrailDialog.js.map +1 -0
- package/dist/DataTable/AuditTrailTable.js +87 -0
- package/dist/DataTable/AuditTrailTable.js.map +1 -0
- package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js +71 -0
- package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js.map +1 -0
- package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js +50 -0
- package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js.map +1 -0
- package/dist/DataTable/ColumnFilters/SortableFilterHeader.js +54 -0
- package/dist/DataTable/ColumnFilters/SortableFilterHeader.js.map +1 -0
- package/dist/DataTable/ColumnFilters/TextColumnFilter.js +24 -0
- package/dist/DataTable/ColumnFilters/TextColumnFilter.js.map +1 -0
- package/dist/DataTable/EmptyState.js +22 -0
- package/dist/DataTable/EmptyState.js.map +1 -0
- package/dist/DataTable/FilterChips.js +39 -0
- package/dist/DataTable/FilterChips.js.map +1 -0
- package/dist/DataTable/GoToPage.js +62 -0
- package/dist/DataTable/GoToPage.js.map +1 -0
- package/dist/DataTable/ServerTable.js +407 -0
- package/dist/DataTable/ServerTable.js.map +1 -0
- package/dist/DataTable/buildChipConfig.js +27 -0
- package/dist/DataTable/buildChipConfig.js.map +1 -0
- package/dist/DataTable/columns.js +122 -0
- package/dist/DataTable/columns.js.map +1 -0
- package/dist/DataTable/filterContext.js +15 -0
- package/dist/DataTable/filterContext.js.map +1 -0
- package/dist/DataTable/serverTableParams.js +19 -0
- package/dist/DataTable/serverTableParams.js.map +1 -0
- package/dist/DataTable/tableMachine.js +87 -0
- package/dist/DataTable/tableMachine.js.map +1 -0
- package/dist/DataTable/useDebouncedFilter.js +29 -0
- package/dist/DataTable/useDebouncedFilter.js.map +1 -0
- package/dist/DataTable/useTableState.js +132 -0
- package/dist/DataTable/useTableState.js.map +1 -0
- package/dist/access/Can.js +9 -0
- package/dist/access/Can.js.map +1 -0
- package/dist/access/PermissionMatrix.js +83 -0
- package/dist/access/PermissionMatrix.js.map +1 -0
- package/dist/access/RequireAccess.js +14 -0
- package/dist/access/RequireAccess.js.map +1 -0
- package/dist/access/accessRules.js +49 -0
- package/dist/access/accessRules.js.map +1 -0
- package/dist/access/permissionGroups.js +43 -0
- package/dist/access/permissionGroups.js.map +1 -0
- package/dist/access/useCan.js +12 -0
- package/dist/access/useCan.js.map +1 -0
- package/dist/account/AccountProvider.js +58 -0
- package/dist/account/AccountProvider.js.map +1 -0
- package/dist/account/AccountSecuritySection.js +81 -0
- package/dist/account/AccountSecuritySection.js.map +1 -0
- package/dist/account/DemoTotpCodeButton.js +26 -0
- package/dist/account/DemoTotpCodeButton.js.map +1 -0
- package/dist/account/ForgotPasswordScreen.js +26 -0
- package/dist/account/ForgotPasswordScreen.js.map +1 -0
- package/dist/account/ProfileScreen.js +108 -0
- package/dist/account/ProfileScreen.js.map +1 -0
- package/dist/account/ResetPasswordScreen.js +57 -0
- package/dist/account/ResetPasswordScreen.js.map +1 -0
- package/dist/account/SignInScreen.js +101 -0
- package/dist/account/SignInScreen.js.map +1 -0
- package/dist/account/accountConnector.js +31 -0
- package/dist/account/accountConnector.js.map +1 -0
- package/dist/account/demo/createDemoAccountConnector.js +368 -0
- package/dist/account/demo/createDemoAccountConnector.js.map +1 -0
- package/dist/account/demo/totp.js +61 -0
- package/dist/account/demo/totp.js.map +1 -0
- package/dist/account/restAccountConnector.js +117 -0
- package/dist/account/restAccountConnector.js.map +1 -0
- package/dist/account-demo.js +12 -0
- package/dist/account-demo.js.map +1 -0
- package/dist/account.js +25 -0
- package/dist/account.js.map +1 -0
- package/dist/adapters/i18next.js +7 -0
- package/dist/adapters/i18next.js.map +1 -0
- package/dist/adapters/nextNavigation.js +36 -0
- package/dist/adapters/nextNavigation.js.map +1 -0
- package/dist/adapters/reactRouter.js +7 -0
- package/dist/adapters/reactRouter.js.map +1 -0
- package/dist/adapters/reactRouterRoutes.js +48 -0
- package/dist/adapters/reactRouterRoutes.js.map +1 -0
- package/dist/api/ApiError.js +58 -0
- package/dist/api/ApiError.js.map +1 -0
- package/dist/api/createApiClient.js +226 -0
- package/dist/api/createApiClient.js.map +1 -0
- package/dist/api/staleChunks.js +47 -0
- package/dist/api/staleChunks.js.map +1 -0
- package/dist/appShell/AccountMenu.js +86 -0
- package/dist/appShell/AccountMenu.js.map +1 -0
- package/dist/appShell/AppLayout.js +493 -0
- package/dist/appShell/AppLayout.js.map +1 -0
- package/dist/appShell/AppearanceSettings.js +93 -0
- package/dist/appShell/AppearanceSettings.js.map +1 -0
- package/dist/appShell/AuthLayout.js +44 -0
- package/dist/appShell/AuthLayout.js.map +1 -0
- package/dist/appShell/BarActionButton.js +31 -0
- package/dist/appShell/BarActionButton.js.map +1 -0
- package/dist/appShell/BarActions.js +94 -0
- package/dist/appShell/BarActions.js.map +1 -0
- package/dist/appShell/BarCapsule.js +35 -0
- package/dist/appShell/BarCapsule.js.map +1 -0
- package/dist/appShell/HeaderTools.js +53 -0
- package/dist/appShell/HeaderTools.js.map +1 -0
- package/dist/appShell/MobileTabBar.js +346 -0
- package/dist/appShell/MobileTabBar.js.map +1 -0
- package/dist/appShell/SettingsMenu.js +41 -0
- package/dist/appShell/SettingsMenu.js.map +1 -0
- package/dist/appShell/SideMenu.js +217 -0
- package/dist/appShell/SideMenu.js.map +1 -0
- package/dist/appShell/SideMenuEntry.js +140 -0
- package/dist/appShell/SideMenuEntry.js.map +1 -0
- package/dist/appShell/SubmenuActionsMenu.js +71 -0
- package/dist/appShell/SubmenuActionsMenu.js.map +1 -0
- package/dist/appShell/TabBarEditor.js +55 -0
- package/dist/appShell/TabBarEditor.js.map +1 -0
- package/dist/appShell/TopMenu.js +80 -0
- package/dist/appShell/TopMenu.js.map +1 -0
- package/dist/appShell/appMenuContext.js +11 -0
- package/dist/appShell/appMenuContext.js.map +1 -0
- package/dist/appShell/barActionsSlot.js +26 -0
- package/dist/appShell/barActionsSlot.js.map +1 -0
- package/dist/appShell/barMenuPlacement.js +33 -0
- package/dist/appShell/barMenuPlacement.js.map +1 -0
- package/dist/appShell/menuItemText.js +33 -0
- package/dist/appShell/menuItemText.js.map +1 -0
- package/dist/appShell/pageTitle.js +45 -0
- package/dist/appShell/pageTitle.js.map +1 -0
- package/dist/appShell/shellSizes.js +38 -0
- package/dist/appShell/shellSizes.js.map +1 -0
- package/dist/appShell/tabBarRule.js +12 -0
- package/dist/appShell/tabBarRule.js.map +1 -0
- package/dist/appShell/tabBarScroll.js +23 -0
- package/dist/appShell/tabBarScroll.js.map +1 -0
- package/dist/appShell/useDrawerCollapsed.js +29 -0
- package/dist/appShell/useDrawerCollapsed.js.map +1 -0
- package/dist/appShell/useFittingActionCount.js +45 -0
- package/dist/appShell/useFittingActionCount.js.map +1 -0
- package/dist/appShell/usePinnedMobileTabs.js +32 -0
- package/dist/appShell/usePinnedMobileTabs.js.map +1 -0
- package/dist/appShell/useTabBarMinimized.js +33 -0
- package/dist/appShell/useTabBarMinimized.js.map +1 -0
- package/dist/auth/PasswordChecklist.js +44 -0
- package/dist/auth/PasswordChecklist.js.map +1 -0
- package/dist/auth/passwordRules.js +43 -0
- package/dist/auth/passwordRules.js.map +1 -0
- package/dist/calendar/EventCalendar.js +138 -0
- package/dist/calendar/EventCalendar.js.map +1 -0
- package/dist/calendar.js +6 -0
- package/dist/calendar.js.map +1 -0
- package/dist/charts.js +7 -0
- package/dist/charts.js.map +1 -0
- package/dist/date-pickers.js +8 -0
- package/dist/date-pickers.js.map +1 -0
- package/dist/datePickers/DateInput.js +75 -0
- package/dist/datePickers/DateInput.js.map +1 -0
- package/dist/datePickers/FormDateField.js +12 -0
- package/dist/datePickers/FormDateField.js.map +1 -0
- package/dist/dates.js +25 -0
- package/dist/dates.js.map +1 -0
- package/dist/dictionaries/dictionaries.js +48 -0
- package/dist/dictionaries/dictionaries.js.map +1 -0
- package/dist/downloads/DownloadManager.js +201 -0
- package/dist/downloads/DownloadManager.js.map +1 -0
- package/dist/downloads/downloadQueue.js +54 -0
- package/dist/downloads/downloadQueue.js.map +1 -0
- package/dist/downloads/downloadsMachine.js +77 -0
- package/dist/downloads/downloadsMachine.js.map +1 -0
- package/dist/excel/reportWorkbook.js +299 -0
- package/dist/excel/reportWorkbook.js.map +1 -0
- package/dist/excel.js +13 -0
- package/dist/excel.js.map +1 -0
- package/dist/feedback/ConfirmDialog.js +72 -0
- package/dist/feedback/ConfirmDialog.js.map +1 -0
- package/dist/feedback/ModalWaiting.js +23 -0
- package/dist/feedback/ModalWaiting.js.map +1 -0
- package/dist/feedback/NewBuildNotice.js +79 -0
- package/dist/feedback/NewBuildNotice.js.map +1 -0
- package/dist/feedback/StaleBuildBoundary.js +36 -0
- package/dist/feedback/StaleBuildBoundary.js.map +1 -0
- package/dist/feedback/Toaster.js +20 -0
- package/dist/feedback/Toaster.js.map +1 -0
- package/dist/feedback/confirmActionMachine.js +67 -0
- package/dist/feedback/confirmActionMachine.js.map +1 -0
- package/dist/feedback/toast.js +88 -0
- package/dist/feedback/toast.js.map +1 -0
- package/dist/feedback/useConfirmAction.js +40 -0
- package/dist/feedback/useConfirmAction.js.map +1 -0
- package/dist/filepond/FileDropzone.js +254 -0
- package/dist/filepond/FileDropzone.js.map +1 -0
- package/dist/filepond/pondServer.js +48 -0
- package/dist/filepond/pondServer.js.map +1 -0
- package/dist/filepond.js +10 -0
- package/dist/filepond.js.map +1 -0
- package/dist/files.js +43 -0
- package/dist/files.js.map +1 -0
- package/dist/formatting.js +177 -0
- package/dist/formatting.js.map +1 -0
- package/dist/forms/FormCatalogField.js +12 -0
- package/dist/forms/FormCatalogField.js.map +1 -0
- package/dist/forms/FormColorField.js +12 -0
- package/dist/forms/FormColorField.js.map +1 -0
- package/dist/forms/FormNumberField.js +12 -0
- package/dist/forms/FormNumberField.js.map +1 -0
- package/dist/forms/FormProblemAlert.js +15 -0
- package/dist/forms/FormProblemAlert.js.map +1 -0
- package/dist/forms/FormSelectField.js +12 -0
- package/dist/forms/FormSelectField.js.map +1 -0
- package/dist/forms/FormServerProblem.js +23 -0
- package/dist/forms/FormServerProblem.js.map +1 -0
- package/dist/forms/FormTextField.js +12 -0
- package/dist/forms/FormTextField.js.map +1 -0
- package/dist/forms/FormWizard.js +90 -0
- package/dist/forms/FormWizard.js.map +1 -0
- package/dist/forms/SubmitButton.js +14 -0
- package/dist/forms/SubmitButton.js.map +1 -0
- package/dist/forms/applyServerProblem.js +15 -0
- package/dist/forms/applyServerProblem.js.map +1 -0
- package/dist/forms/auth/ChangePasswordForm.js +46 -0
- package/dist/forms/auth/ChangePasswordForm.js.map +1 -0
- package/dist/forms/auth/ForgotPasswordForm.js +50 -0
- package/dist/forms/auth/ForgotPasswordForm.js.map +1 -0
- package/dist/forms/auth/SignInForm.js +48 -0
- package/dist/forms/auth/SignInForm.js.map +1 -0
- package/dist/forms/security/SecondStepForm.js +122 -0
- package/dist/forms/security/SecondStepForm.js.map +1 -0
- package/dist/forms/security/TwoStepVerificationCard.js +336 -0
- package/dist/forms/security/TwoStepVerificationCard.js.map +1 -0
- package/dist/forms/security/securityRules.js +28 -0
- package/dist/forms/security/securityRules.js.map +1 -0
- package/dist/forms/serverProblemFields.js +25 -0
- package/dist/forms/serverProblemFields.js.map +1 -0
- package/dist/forms/useFormikField.js +16 -0
- package/dist/forms/useFormikField.js.map +1 -0
- package/dist/forms/validation.js +55 -0
- package/dist/forms/validation.js.map +1 -0
- package/dist/forms/validationMessages.js +16 -0
- package/dist/forms/validationMessages.js.map +1 -0
- package/dist/forms.js +57 -0
- package/dist/forms.js.map +1 -0
- package/dist/hookForm/FormCatalogField.js +12 -0
- package/dist/hookForm/FormCatalogField.js.map +1 -0
- package/dist/hookForm/FormColorField.js +12 -0
- package/dist/hookForm/FormColorField.js.map +1 -0
- package/dist/hookForm/FormNumberField.js +12 -0
- package/dist/hookForm/FormNumberField.js.map +1 -0
- package/dist/hookForm/FormProblemAlert.js +17 -0
- package/dist/hookForm/FormProblemAlert.js.map +1 -0
- package/dist/hookForm/FormSelectField.js +12 -0
- package/dist/hookForm/FormSelectField.js.map +1 -0
- package/dist/hookForm/FormTextField.js +12 -0
- package/dist/hookForm/FormTextField.js.map +1 -0
- package/dist/hookForm/SubmitButton.js +15 -0
- package/dist/hookForm/SubmitButton.js.map +1 -0
- package/dist/hookForm/applyServerProblem.js +21 -0
- package/dist/hookForm/applyServerProblem.js.map +1 -0
- package/dist/hookForm/useHookFormField.js +19 -0
- package/dist/hookForm/useHookFormField.js.map +1 -0
- package/dist/i18next.js +5 -0
- package/dist/i18next.js.map +1 -0
- package/dist/identifiers.js +8 -0
- package/dist/identifiers.js.map +1 -0
- package/dist/inbox/InboxLayout.js +68 -0
- package/dist/inbox/InboxLayout.js.map +1 -0
- package/dist/inbox/MessageList.js +64 -0
- package/dist/inbox/MessageList.js.map +1 -0
- package/dist/inbox/MessageView.js +53 -0
- package/dist/inbox/MessageView.js.map +1 -0
- package/dist/inbox/inboxDates.js +8 -0
- package/dist/inbox/inboxDates.js.map +1 -0
- package/dist/index.js +383 -0
- package/dist/index.js.map +1 -0
- package/dist/inputs/CatalogInput.js +62 -0
- package/dist/inputs/CatalogInput.js.map +1 -0
- package/dist/inputs/ColorInput.js +108 -0
- package/dist/inputs/ColorInput.js.map +1 -0
- package/dist/inputs/FieldFrame.js +20 -0
- package/dist/inputs/FieldFrame.js.map +1 -0
- package/dist/inputs/FormSection.js +105 -0
- package/dist/inputs/FormSection.js.map +1 -0
- package/dist/inputs/NumberInput.js +69 -0
- package/dist/inputs/NumberInput.js.map +1 -0
- package/dist/inputs/SelectInput.js +66 -0
- package/dist/inputs/SelectInput.js.map +1 -0
- package/dist/inputs/TextInput.js +97 -0
- package/dist/inputs/TextInput.js.map +1 -0
- package/dist/inputs/colorContrast.js +46 -0
- package/dist/inputs/colorContrast.js.map +1 -0
- package/dist/inputs/formLayoutContext.js +9 -0
- package/dist/inputs/formLayoutContext.js.map +1 -0
- package/dist/inputs/numberText.js +48 -0
- package/dist/inputs/numberText.js.map +1 -0
- package/dist/kanban/KanbanBoard.js +113 -0
- package/dist/kanban/KanbanBoard.js.map +1 -0
- package/dist/kanban/kanbanMoves.js +29 -0
- package/dist/kanban/kanbanMoves.js.map +1 -0
- package/dist/kanban.js +9 -0
- package/dist/kanban.js.map +1 -0
- package/dist/laravel/csrfRetry.js +18 -0
- package/dist/laravel/csrfRetry.js.map +1 -0
- package/dist/laravel.js +6 -0
- package/dist/laravel.js.map +1 -0
- package/dist/lastListUrl.js +35 -0
- package/dist/lastListUrl.js.map +1 -0
- package/dist/locales/en.js +714 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/locales/es.js +714 -0
- package/dist/locales/es.js.map +1 -0
- package/dist/maps/MapView.js +96 -0
- package/dist/maps/MapView.js.map +1 -0
- package/dist/maps/mapMarkers.js +19 -0
- package/dist/maps/mapMarkers.js.map +1 -0
- package/dist/maps.js +10 -0
- package/dist/maps.js.map +1 -0
- package/dist/money/money.js +380 -0
- package/dist/money/money.js.map +1 -0
- package/dist/money.js +6 -0
- package/dist/money.js.map +1 -0
- package/dist/navigation/appMenu.js +93 -0
- package/dist/navigation/appMenu.js.map +1 -0
- package/dist/navigation/useMenuBadges.js +45 -0
- package/dist/navigation/useMenuBadges.js.map +1 -0
- package/dist/navigation.js +30 -0
- package/dist/navigation.js.map +1 -0
- package/dist/navigationTrail.js +82 -0
- package/dist/navigationTrail.js.map +1 -0
- package/dist/next.js +5 -0
- package/dist/next.js.map +1 -0
- package/dist/observability/buildWatch.js +19 -0
- package/dist/observability/buildWatch.js.map +1 -0
- package/dist/observability/logger.js +43 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/publishedBuild.js +39 -0
- package/dist/observability/publishedBuild.js.map +1 -0
- package/dist/observability/usePublishedBuildWatch.js +76 -0
- package/dist/observability/usePublishedBuildWatch.js.map +1 -0
- package/dist/passkeys.js +7 -0
- package/dist/passkeys.js.map +1 -0
- package/dist/periodRanges.js +33 -0
- package/dist/periodRanges.js.map +1 -0
- package/dist/problems.js +51 -0
- package/dist/problems.js.map +1 -0
- package/dist/pwa/InstallAppSetting.js +33 -0
- package/dist/pwa/InstallAppSetting.js.map +1 -0
- package/dist/pwa/InstallInstructionsDialog.js +35 -0
- package/dist/pwa/InstallInstructionsDialog.js.map +1 -0
- package/dist/pwa/InstallPromptBanner.js +64 -0
- package/dist/pwa/InstallPromptBanner.js.map +1 -0
- package/dist/pwa/installInstructions.js +60 -0
- package/dist/pwa/installInstructions.js.map +1 -0
- package/dist/pwa/useInstallPrompt.js +70 -0
- package/dist/pwa/useInstallPrompt.js.map +1 -0
- package/dist/react-hook-form.js +30 -0
- package/dist/react-hook-form.js.map +1 -0
- package/dist/react-router.js +10 -0
- package/dist/react-router.js.map +1 -0
- package/dist/security/ActivityLog.js +79 -0
- package/dist/security/ActivityLog.js.map +1 -0
- package/dist/security/RecoveryCodesDialog.js +84 -0
- package/dist/security/RecoveryCodesDialog.js.map +1 -0
- package/dist/security/SessionsCard.js +81 -0
- package/dist/security/SessionsCard.js.map +1 -0
- package/dist/security/passkeys.js +39 -0
- package/dist/security/passkeys.js.map +1 -0
- package/dist/table.js +35 -0
- package/dist/table.js.map +1 -0
- package/dist/theme/androidDevice.js +16 -0
- package/dist/theme/androidDevice.js.map +1 -0
- package/dist/theme/appleTracking.js +34 -0
- package/dist/theme/appleTracking.js.map +1 -0
- package/dist/theme/components/MuiAppBar.js +27 -0
- package/dist/theme/components/MuiAppBar.js.map +1 -0
- package/dist/theme/components/MuiBackdrop.js +13 -0
- package/dist/theme/components/MuiBackdrop.js.map +1 -0
- package/dist/theme/components/MuiButton.js +25 -0
- package/dist/theme/components/MuiButton.js.map +1 -0
- package/dist/theme/components/MuiButtonBase.js +16 -0
- package/dist/theme/components/MuiButtonBase.js.map +1 -0
- package/dist/theme/components/MuiChip.js +30 -0
- package/dist/theme/components/MuiChip.js.map +1 -0
- package/dist/theme/components/MuiDataGrid.js +30 -0
- package/dist/theme/components/MuiDataGrid.js.map +1 -0
- package/dist/theme/components/MuiDrawer.js +18 -0
- package/dist/theme/components/MuiDrawer.js.map +1 -0
- package/dist/theme/components/MuiMenuItem.js +17 -0
- package/dist/theme/components/MuiMenuItem.js.map +1 -0
- package/dist/theme/components/MuiTypography.js +22 -0
- package/dist/theme/components/MuiTypography.js.map +1 -0
- package/dist/theme/components/glassComponents.js +885 -0
- package/dist/theme/components/glassComponents.js.map +1 -0
- package/dist/theme/components/minimalComponents.js +146 -0
- package/dist/theme/components/minimalComponents.js.map +1 -0
- package/dist/theme/components/paletteOf.js +7 -0
- package/dist/theme/components/paletteOf.js.map +1 -0
- package/dist/theme/createToolkitTheme.js +100 -0
- package/dist/theme/createToolkitTheme.js.map +1 -0
- package/dist/theme/glassSurface.js +328 -0
- package/dist/theme/glassSurface.js.map +1 -0
- package/dist/theme/glassToasterStyles.js +50 -0
- package/dist/theme/glassToasterStyles.js.map +1 -0
- package/dist/theme/mergeComponents.js +42 -0
- package/dist/theme/mergeComponents.js.map +1 -0
- package/dist/theme/stackcraftPalette.js +59 -0
- package/dist/theme/stackcraftPalette.js.map +1 -0
- package/dist/theme/toolkitComponents.js +26 -0
- package/dist/theme/toolkitComponents.js.map +1 -0
- package/dist/timeline.js +8 -0
- package/dist/timeline.js.map +1 -0
- package/dist/toolkit/ToolkitProvider.js +49 -0
- package/dist/toolkit/ToolkitProvider.js.map +1 -0
- package/dist/toolkit/browserNavigation.js +34 -0
- package/dist/toolkit/browserNavigation.js.map +1 -0
- package/dist/toolkit/toolkitContext.js +19 -0
- package/dist/toolkit/toolkitContext.js.map +1 -0
- package/dist/toolkit/toolkitSettings.js +87 -0
- package/dist/toolkit/toolkitSettings.js.map +1 -0
- package/dist/toolkit/useToolkitTranslation.js +18 -0
- package/dist/toolkit/useToolkitTranslation.js.map +1 -0
- package/dist/types/DataTable/AuditTrailDialog.d.ts +32 -0
- package/dist/types/DataTable/AuditTrailTable.d.ts +28 -0
- package/dist/types/DataTable/ColumnFilters/HeaderFilterPopover.d.ts +8 -0
- package/dist/types/DataTable/ColumnFilters/MultiSelectColumnFilter.d.ts +16 -0
- package/dist/types/DataTable/ColumnFilters/SortableFilterHeader.d.ts +26 -0
- package/dist/types/DataTable/ColumnFilters/TextColumnFilter.d.ts +8 -0
- package/dist/types/DataTable/ColumnFilters/index.d.ts +4 -0
- package/dist/types/DataTable/EmptyState.d.ts +8 -0
- package/dist/types/DataTable/FilterChips.d.ts +15 -0
- package/dist/types/DataTable/GoToPage.d.ts +8 -0
- package/dist/types/DataTable/ServerTable.d.ts +110 -0
- package/dist/types/DataTable/buildChipConfig.d.ts +22 -0
- package/dist/types/DataTable/columns.d.ts +93 -0
- package/dist/types/DataTable/filterContext.d.ts +13 -0
- package/dist/types/DataTable/index.d.ts +13 -0
- package/dist/types/DataTable/serverTableParams.d.ts +16 -0
- package/dist/types/DataTable/tableMachine.d.ts +41 -0
- package/dist/types/DataTable/useDebouncedFilter.d.ts +8 -0
- package/dist/types/DataTable/useTableState.d.ts +93 -0
- package/dist/types/access/Can.d.ts +11 -0
- package/dist/types/access/PermissionMatrix.d.ts +21 -0
- package/dist/types/access/RequireAccess.d.ts +11 -0
- package/dist/types/access/accessRules.d.ts +24 -0
- package/dist/types/access/permissionGroups.d.ts +56 -0
- package/dist/types/access/useCan.d.ts +11 -0
- package/dist/types/account/AccountProvider.d.ts +27 -0
- package/dist/types/account/AccountSecuritySection.d.ts +7 -0
- package/dist/types/account/DemoTotpCodeButton.d.ts +6 -0
- package/dist/types/account/ForgotPasswordScreen.d.ts +15 -0
- package/dist/types/account/ProfileScreen.d.ts +13 -0
- package/dist/types/account/ResetPasswordScreen.d.ts +19 -0
- package/dist/types/account/SignInScreen.d.ts +25 -0
- package/dist/types/account/accountConnector.d.ts +263 -0
- package/dist/types/account/demo/createDemoAccountConnector.d.ts +30 -0
- package/dist/types/account/demo/totp.d.ts +45 -0
- package/dist/types/account/restAccountConnector.d.ts +49 -0
- package/dist/types/account-demo.d.ts +2 -0
- package/dist/types/account.d.ts +16 -0
- package/dist/types/adapters/i18next.d.ts +11 -0
- package/dist/types/adapters/nextNavigation.d.ts +33 -0
- package/dist/types/adapters/reactRouter.d.ts +6 -0
- package/dist/types/adapters/reactRouterRoutes.d.ts +30 -0
- package/dist/types/api/ApiError.d.ts +42 -0
- package/dist/types/api/createApiClient.d.ts +146 -0
- package/dist/types/api/staleChunks.d.ts +15 -0
- package/dist/types/appShell/AccountMenu.d.ts +28 -0
- package/dist/types/appShell/AppLayout.d.ts +66 -0
- package/dist/types/appShell/AppearanceSettings.d.ts +34 -0
- package/dist/types/appShell/AuthLayout.d.ts +21 -0
- package/dist/types/appShell/BarActionButton.d.ts +15 -0
- package/dist/types/appShell/BarActions.d.ts +18 -0
- package/dist/types/appShell/BarCapsule.d.ts +12 -0
- package/dist/types/appShell/HeaderTools.d.ts +27 -0
- package/dist/types/appShell/MobileTabBar.d.ts +17 -0
- package/dist/types/appShell/SettingsMenu.d.ts +13 -0
- package/dist/types/appShell/SideMenu.d.ts +31 -0
- package/dist/types/appShell/SideMenuEntry.d.ts +17 -0
- package/dist/types/appShell/SubmenuActionsMenu.d.ts +24 -0
- package/dist/types/appShell/TabBarEditor.d.ts +13 -0
- package/dist/types/appShell/TopMenu.d.ts +7 -0
- package/dist/types/appShell/appMenuContext.d.ts +9 -0
- package/dist/types/appShell/barActionsSlot.d.ts +35 -0
- package/dist/types/appShell/barMenuPlacement.d.ts +9 -0
- package/dist/types/appShell/menuItemText.d.ts +55 -0
- package/dist/types/appShell/pageTitle.d.ts +26 -0
- package/dist/types/appShell/shellSizes.d.ts +45 -0
- package/dist/types/appShell/tabBarRule.d.ts +5 -0
- package/dist/types/appShell/tabBarScroll.d.ts +26 -0
- package/dist/types/appShell/useDrawerCollapsed.d.ts +8 -0
- package/dist/types/appShell/useFittingActionCount.d.ts +7 -0
- package/dist/types/appShell/usePinnedMobileTabs.d.ts +7 -0
- package/dist/types/appShell/useTabBarMinimized.d.ts +8 -0
- package/dist/types/auth/PasswordChecklist.d.ts +11 -0
- package/dist/types/auth/passwordRules.d.ts +34 -0
- package/dist/types/calendar/EventCalendar.d.ts +46 -0
- package/dist/types/calendar.d.ts +1 -0
- package/dist/types/charts.d.ts +2 -0
- package/dist/types/date-pickers.d.ts +2 -0
- package/dist/types/datePickers/DateInput.d.ts +39 -0
- package/dist/types/datePickers/FormDateField.d.ts +7 -0
- package/dist/types/dates.d.ts +18 -0
- package/dist/types/dictionaries/dictionaries.d.ts +54 -0
- package/dist/types/downloads/DownloadManager.d.ts +1 -0
- package/dist/types/downloads/downloadQueue.d.ts +45 -0
- package/dist/types/downloads/downloadsMachine.d.ts +10 -0
- package/dist/types/downloads/index.d.ts +3 -0
- package/dist/types/excel/reportWorkbook.d.ts +157 -0
- package/dist/types/excel.d.ts +1 -0
- package/dist/types/feedback/ConfirmDialog.d.ts +29 -0
- package/dist/types/feedback/ModalWaiting.d.ts +8 -0
- package/dist/types/feedback/NewBuildNotice.d.ts +18 -0
- package/dist/types/feedback/StaleBuildBoundary.d.ts +21 -0
- package/dist/types/feedback/Toaster.d.ts +1 -0
- package/dist/types/feedback/confirmActionMachine.d.ts +19 -0
- package/dist/types/feedback/index.d.ts +8 -0
- package/dist/types/feedback/toast.d.ts +100 -0
- package/dist/types/feedback/useConfirmAction.d.ts +33 -0
- package/dist/types/filepond/FileDropzone.d.ts +59 -0
- package/dist/types/filepond/pondServer.d.ts +17 -0
- package/dist/types/filepond.d.ts +3 -0
- package/dist/types/files.d.ts +29 -0
- package/dist/types/formatting.d.ts +106 -0
- package/dist/types/forms/FormCatalogField.d.ts +6 -0
- package/dist/types/forms/FormColorField.d.ts +6 -0
- package/dist/types/forms/FormNumberField.d.ts +6 -0
- package/dist/types/forms/FormProblemAlert.d.ts +6 -0
- package/dist/types/forms/FormSelectField.d.ts +6 -0
- package/dist/types/forms/FormServerProblem.d.ts +8 -0
- package/dist/types/forms/FormTextField.d.ts +6 -0
- package/dist/types/forms/FormWizard.d.ts +20 -0
- package/dist/types/forms/SubmitButton.d.ts +9 -0
- package/dist/types/forms/applyServerProblem.d.ts +9 -0
- package/dist/types/forms/auth/ChangePasswordForm.d.ts +15 -0
- package/dist/types/forms/auth/ForgotPasswordForm.d.ts +12 -0
- package/dist/types/forms/auth/SignInForm.d.ts +18 -0
- package/dist/types/forms/index.d.ts +19 -0
- package/dist/types/forms/security/SecondStepForm.d.ts +28 -0
- package/dist/types/forms/security/TwoStepVerificationCard.d.ts +81 -0
- package/dist/types/forms/security/securityRules.d.ts +24 -0
- package/dist/types/forms/serverProblemFields.d.ts +19 -0
- package/dist/types/forms/useFormikField.d.ts +11 -0
- package/dist/types/forms/validation.d.ts +251 -0
- package/dist/types/forms/validationMessages.d.ts +12 -0
- package/dist/types/forms.d.ts +2 -0
- package/dist/types/hookForm/FormCatalogField.d.ts +8 -0
- package/dist/types/hookForm/FormColorField.d.ts +8 -0
- package/dist/types/hookForm/FormNumberField.d.ts +8 -0
- package/dist/types/hookForm/FormProblemAlert.d.ts +7 -0
- package/dist/types/hookForm/FormSelectField.d.ts +8 -0
- package/dist/types/hookForm/FormTextField.d.ts +8 -0
- package/dist/types/hookForm/SubmitButton.d.ts +21 -0
- package/dist/types/hookForm/applyServerProblem.d.ts +10 -0
- package/dist/types/hookForm/useHookFormField.d.ts +13 -0
- package/dist/types/i18next.d.ts +1 -0
- package/dist/types/identifiers.d.ts +2 -0
- package/dist/types/inbox/InboxLayout.d.ts +26 -0
- package/dist/types/inbox/MessageList.d.ts +27 -0
- package/dist/types/inbox/MessageView.d.ts +23 -0
- package/dist/types/inbox/inboxDates.d.ts +6 -0
- package/dist/types/index.d.ts +84 -0
- package/dist/types/inputs/CatalogInput.d.ts +41 -0
- package/dist/types/inputs/ColorInput.d.ts +28 -0
- package/dist/types/inputs/FieldFrame.d.ts +14 -0
- package/dist/types/inputs/FormSection.d.ts +29 -0
- package/dist/types/inputs/NumberInput.d.ts +36 -0
- package/dist/types/inputs/SelectInput.d.ts +34 -0
- package/dist/types/inputs/TextInput.d.ts +60 -0
- package/dist/types/inputs/colorContrast.d.ts +18 -0
- package/dist/types/inputs/formLayoutContext.d.ts +3 -0
- package/dist/types/inputs/numberText.d.ts +25 -0
- package/dist/types/kanban/KanbanBoard.d.ts +33 -0
- package/dist/types/kanban/kanbanMoves.d.ts +38 -0
- package/dist/types/kanban.d.ts +2 -0
- package/dist/types/laravel/csrfRetry.d.ts +21 -0
- package/dist/types/laravel.d.ts +1 -0
- package/dist/types/lastListUrl.d.ts +20 -0
- package/dist/types/locales/en.d.ts +711 -0
- package/dist/types/locales/es.d.ts +711 -0
- package/dist/types/maps/MapView.d.ts +32 -0
- package/dist/types/maps/mapMarkers.d.ts +23 -0
- package/dist/types/maps.d.ts +2 -0
- package/dist/types/money/money.d.ts +203 -0
- package/dist/types/money.d.ts +1 -0
- package/dist/types/navigation/appMenu.d.ts +92 -0
- package/dist/types/navigation/useMenuBadges.d.ts +16 -0
- package/dist/types/navigation.d.ts +22 -0
- package/dist/types/navigationTrail.d.ts +49 -0
- package/dist/types/next.d.ts +1 -0
- package/dist/types/observability/buildWatch.d.ts +28 -0
- package/dist/types/observability/logger.d.ts +19 -0
- package/dist/types/observability/publishedBuild.d.ts +35 -0
- package/dist/types/observability/usePublishedBuildWatch.d.ts +16 -0
- package/dist/types/passkeys.d.ts +1 -0
- package/dist/types/periodRanges.d.ts +32 -0
- package/dist/types/problems.d.ts +31 -0
- package/dist/types/pwa/InstallAppSetting.d.ts +1 -0
- package/dist/types/pwa/InstallInstructionsDialog.d.ts +18 -0
- package/dist/types/pwa/InstallPromptBanner.d.ts +7 -0
- package/dist/types/pwa/installInstructions.d.ts +52 -0
- package/dist/types/pwa/useInstallPrompt.d.ts +12 -0
- package/dist/types/react-hook-form.d.ts +11 -0
- package/dist/types/react-router.d.ts +2 -0
- package/dist/types/security/ActivityLog.d.ts +31 -0
- package/dist/types/security/RecoveryCodesDialog.d.ts +11 -0
- package/dist/types/security/SessionsCard.d.ts +22 -0
- package/dist/types/security/passkeys.d.ts +18 -0
- package/dist/types/table.d.ts +1 -0
- package/dist/types/theme/androidDevice.d.ts +11 -0
- package/dist/types/theme/appleTracking.d.ts +17 -0
- package/dist/types/theme/components/MuiAppBar.d.ts +13 -0
- package/dist/types/theme/components/MuiBackdrop.d.ts +11 -0
- package/dist/types/theme/components/MuiButton.d.ts +27 -0
- package/dist/types/theme/components/MuiButtonBase.d.ts +14 -0
- package/dist/types/theme/components/MuiChip.d.ts +29 -0
- package/dist/types/theme/components/MuiDataGrid.d.ts +45 -0
- package/dist/types/theme/components/MuiDrawer.d.ts +13 -0
- package/dist/types/theme/components/MuiMenuItem.d.ts +17 -0
- package/dist/types/theme/components/MuiTypography.d.ts +20 -0
- package/dist/types/theme/components/glassComponents.d.ts +8 -0
- package/dist/types/theme/components/minimalComponents.d.ts +22 -0
- package/dist/types/theme/components/paletteOf.d.ts +5 -0
- package/dist/types/theme/createToolkitTheme.d.ts +48 -0
- package/dist/types/theme/glassSurface.d.ts +247 -0
- package/dist/types/theme/glassToasterStyles.d.ts +7 -0
- package/dist/types/theme/mergeComponents.d.ts +15 -0
- package/dist/types/theme/stackcraftPalette.d.ts +142 -0
- package/dist/types/theme/toolkitComponents.d.ts +4 -0
- package/dist/types/timeline.d.ts +2 -0
- package/dist/types/toolkit/ToolkitProvider.d.ts +31 -0
- package/dist/types/toolkit/browserNavigation.d.ts +32 -0
- package/dist/types/toolkit/toolkitContext.d.ts +28 -0
- package/dist/types/toolkit/toolkitSettings.d.ts +68 -0
- package/dist/types/toolkit/useToolkitTranslation.d.ts +10 -0
- package/dist/types/ui/actions/CopyButton.d.ts +13 -0
- package/dist/types/ui/actions/DownloadMenu.d.ts +50 -0
- package/dist/types/ui/actions/SecretField.d.ts +13 -0
- package/dist/types/ui/filters/DateRangeFilter.d.ts +16 -0
- package/dist/types/ui/filters/PeriodRangeSelector.d.ts +28 -0
- package/dist/types/ui/filters/QuickFilters.d.ts +21 -0
- package/dist/types/ui/filters/SegmentedControl.d.ts +44 -0
- package/dist/types/ui/index.d.ts +33 -0
- package/dist/types/ui/labels/DictionaryText.d.ts +7 -0
- package/dist/types/ui/labels/StatusChip.d.ts +21 -0
- package/dist/types/ui/labels/Tag.d.ts +19 -0
- package/dist/types/ui/layout/CollapsibleSection.d.ts +15 -0
- package/dist/types/ui/layout/ContentDialog.d.ts +13 -0
- package/dist/types/ui/layout/DefinitionList.d.ts +15 -0
- package/dist/types/ui/layout/DetailHeader.d.ts +15 -0
- package/dist/types/ui/layout/ErrorPage.d.ts +22 -0
- package/dist/types/ui/layout/FullPageLoader.d.ts +1 -0
- package/dist/types/ui/layout/GlassLensFilter.d.ts +1 -0
- package/dist/types/ui/layout/GlassPanel.d.ts +11 -0
- package/dist/types/ui/layout/PageHeader.d.ts +15 -0
- package/dist/types/ui/layout/PageHeading.d.ts +18 -0
- package/dist/types/ui/layout/ProfileHeader.d.ts +17 -0
- package/dist/types/ui/layout/ScrollableRow.d.ts +33 -0
- package/dist/types/ui/layout/SectionCard.d.ts +11 -0
- package/dist/types/ui/layout/appBarHeight.d.ts +13 -0
- package/dist/types/ui/metrics/BarList.d.ts +19 -0
- package/dist/types/ui/metrics/CalendarHeatmap.d.ts +28 -0
- package/dist/types/ui/metrics/ChartTooltip.d.ts +5 -0
- package/dist/types/ui/metrics/ColumnChart.d.ts +35 -0
- package/dist/types/ui/metrics/MetricCard.d.ts +31 -0
- package/dist/types/ui/metrics/TableToggle.d.ts +7 -0
- package/dist/types/ui/metrics/barListLabels.d.ts +17 -0
- package/dist/types/ui/metrics/heatmapScale.d.ts +45 -0
- package/dist/types/ui/navigation/BackButton.d.ts +11 -0
- package/dist/types/ui/navigation/ColorSchemeToggle.d.ts +7 -0
- package/dist/types/ui/navigation/DocumentTitle.d.ts +6 -0
- package/dist/types/ui/navigation/FontSizeToggle.d.ts +6 -0
- package/dist/types/ui/navigation/LanguageToggle.d.ts +8 -0
- package/dist/types/ui/navigation/PageBreadcrumbs.d.ts +9 -0
- package/dist/types/ui/navigation/colorMode.d.ts +18 -0
- package/dist/types/ui/navigation/fontSizeLevels.d.ts +25 -0
- package/dist/types/ui/navigation/useFontSize.d.ts +10 -0
- package/dist/types/ui/timeline/GroupedTimeline.d.ts +38 -0
- package/dist/types/ui/timeline/timelineDot.d.ts +19 -0
- package/dist/types/upload/FileDropzone.d.ts +34 -0
- package/dist/types/upload/fileRules.d.ts +51 -0
- package/dist/types/upload/uploadMachine.d.ts +23 -0
- package/dist/types/upload/uploadWithProgress.d.ts +16 -0
- package/dist/ui/actions/CopyButton.js +28 -0
- package/dist/ui/actions/CopyButton.js.map +1 -0
- package/dist/ui/actions/DownloadMenu.js +163 -0
- package/dist/ui/actions/DownloadMenu.js.map +1 -0
- package/dist/ui/actions/SecretField.js +57 -0
- package/dist/ui/actions/SecretField.js.map +1 -0
- package/dist/ui/filters/DateRangeFilter.js +86 -0
- package/dist/ui/filters/DateRangeFilter.js.map +1 -0
- package/dist/ui/filters/PeriodRangeSelector.js +56 -0
- package/dist/ui/filters/PeriodRangeSelector.js.map +1 -0
- package/dist/ui/filters/QuickFilters.js +91 -0
- package/dist/ui/filters/QuickFilters.js.map +1 -0
- package/dist/ui/filters/SegmentedControl.js +80 -0
- package/dist/ui/filters/SegmentedControl.js.map +1 -0
- package/dist/ui/labels/DictionaryText.js +11 -0
- package/dist/ui/labels/DictionaryText.js.map +1 -0
- package/dist/ui/labels/StatusChip.js +52 -0
- package/dist/ui/labels/StatusChip.js.map +1 -0
- package/dist/ui/labels/Tag.js +26 -0
- package/dist/ui/labels/Tag.js.map +1 -0
- package/dist/ui/layout/CollapsibleSection.js +48 -0
- package/dist/ui/layout/CollapsibleSection.js.map +1 -0
- package/dist/ui/layout/ContentDialog.js +97 -0
- package/dist/ui/layout/ContentDialog.js.map +1 -0
- package/dist/ui/layout/DefinitionList.js +30 -0
- package/dist/ui/layout/DefinitionList.js.map +1 -0
- package/dist/ui/layout/DetailHeader.js +27 -0
- package/dist/ui/layout/DetailHeader.js.map +1 -0
- package/dist/ui/layout/ErrorPage.js +40 -0
- package/dist/ui/layout/ErrorPage.js.map +1 -0
- package/dist/ui/layout/FullPageLoader.js +13 -0
- package/dist/ui/layout/FullPageLoader.js.map +1 -0
- package/dist/ui/layout/GlassLensFilter.js +53 -0
- package/dist/ui/layout/GlassLensFilter.js.map +1 -0
- package/dist/ui/layout/GlassPanel.js +18 -0
- package/dist/ui/layout/GlassPanel.js.map +1 -0
- package/dist/ui/layout/PageHeader.js +23 -0
- package/dist/ui/layout/PageHeader.js.map +1 -0
- package/dist/ui/layout/PageHeading.js +51 -0
- package/dist/ui/layout/PageHeading.js.map +1 -0
- package/dist/ui/layout/ProfileHeader.js +64 -0
- package/dist/ui/layout/ProfileHeader.js.map +1 -0
- package/dist/ui/layout/ScrollableRow.js +156 -0
- package/dist/ui/layout/ScrollableRow.js.map +1 -0
- package/dist/ui/layout/SectionCard.js +18 -0
- package/dist/ui/layout/SectionCard.js.map +1 -0
- package/dist/ui/layout/appBarHeight.js +42 -0
- package/dist/ui/layout/appBarHeight.js.map +1 -0
- package/dist/ui/metrics/BarList.js +89 -0
- package/dist/ui/metrics/BarList.js.map +1 -0
- package/dist/ui/metrics/CalendarHeatmap.js +131 -0
- package/dist/ui/metrics/CalendarHeatmap.js.map +1 -0
- package/dist/ui/metrics/ChartTooltip.js +16 -0
- package/dist/ui/metrics/ChartTooltip.js.map +1 -0
- package/dist/ui/metrics/ColumnChart.js +110 -0
- package/dist/ui/metrics/ColumnChart.js.map +1 -0
- package/dist/ui/metrics/MetricCard.js +64 -0
- package/dist/ui/metrics/MetricCard.js.map +1 -0
- package/dist/ui/metrics/TableToggle.js +13 -0
- package/dist/ui/metrics/TableToggle.js.map +1 -0
- package/dist/ui/metrics/barListLabels.js +9 -0
- package/dist/ui/metrics/barListLabels.js.map +1 -0
- package/dist/ui/metrics/heatmapScale.js +67 -0
- package/dist/ui/metrics/heatmapScale.js.map +1 -0
- package/dist/ui/navigation/BackButton.js +28 -0
- package/dist/ui/navigation/BackButton.js.map +1 -0
- package/dist/ui/navigation/ColorSchemeToggle.js +37 -0
- package/dist/ui/navigation/ColorSchemeToggle.js.map +1 -0
- package/dist/ui/navigation/DocumentTitle.js +11 -0
- package/dist/ui/navigation/DocumentTitle.js.map +1 -0
- package/dist/ui/navigation/FontSizeToggle.js +40 -0
- package/dist/ui/navigation/FontSizeToggle.js.map +1 -0
- package/dist/ui/navigation/LanguageToggle.js +27 -0
- package/dist/ui/navigation/LanguageToggle.js.map +1 -0
- package/dist/ui/navigation/PageBreadcrumbs.js +51 -0
- package/dist/ui/navigation/PageBreadcrumbs.js.map +1 -0
- package/dist/ui/navigation/colorMode.js +13 -0
- package/dist/ui/navigation/colorMode.js.map +1 -0
- package/dist/ui/navigation/fontSizeLevels.js +24 -0
- package/dist/ui/navigation/fontSizeLevels.js.map +1 -0
- package/dist/ui/navigation/useFontSize.js +44 -0
- package/dist/ui/navigation/useFontSize.js.map +1 -0
- package/dist/ui/timeline/GroupedTimeline.js +104 -0
- package/dist/ui/timeline/GroupedTimeline.js.map +1 -0
- package/dist/ui/timeline/timelineDot.js +20 -0
- package/dist/ui/timeline/timelineDot.js.map +1 -0
- package/dist/upload/FileDropzone.js +143 -0
- package/dist/upload/FileDropzone.js.map +1 -0
- package/dist/upload/fileRules.js +62 -0
- package/dist/upload/fileRules.js.map +1 -0
- package/dist/upload/uploadMachine.js +73 -0
- package/dist/upload/uploadMachine.js.map +1 -0
- package/dist/upload/uploadWithProgress.js +45 -0
- package/dist/upload/uploadWithProgress.js.map +1 -0
- package/package.json +303 -5
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { Formik, Form } from "formik";
|
|
5
|
+
import Alert from "@mui/material/Alert";
|
|
6
|
+
import Box from "@mui/material/Box";
|
|
7
|
+
import Button from "@mui/material/Button";
|
|
8
|
+
import Dialog from "@mui/material/Dialog";
|
|
9
|
+
import DialogActions from "@mui/material/DialogActions";
|
|
10
|
+
import DialogContent from "@mui/material/DialogContent";
|
|
11
|
+
import DialogContentText from "@mui/material/DialogContentText";
|
|
12
|
+
import DialogTitle from "@mui/material/DialogTitle";
|
|
13
|
+
import Divider from "@mui/material/Divider";
|
|
14
|
+
import IconButton from "@mui/material/IconButton";
|
|
15
|
+
import List from "@mui/material/List";
|
|
16
|
+
import ListItem from "@mui/material/ListItem";
|
|
17
|
+
import ListItemIcon from "@mui/material/ListItemIcon";
|
|
18
|
+
import ListItemText from "@mui/material/ListItemText";
|
|
19
|
+
import Stack from "@mui/material/Stack";
|
|
20
|
+
import Tooltip from "@mui/material/Tooltip";
|
|
21
|
+
import Typography from "@mui/material/Typography";
|
|
22
|
+
import DeleteOutlineOutlinedIcon from "@mui/icons-material/DeleteOutlineOutlined";
|
|
23
|
+
import FingerprintOutlinedIcon from "@mui/icons-material/FingerprintOutlined";
|
|
24
|
+
import PhonelinkLockOutlinedIcon from "@mui/icons-material/PhonelinkLockOutlined";
|
|
25
|
+
import VpnKeyOutlinedIcon from "@mui/icons-material/VpnKeyOutlined";
|
|
26
|
+
import { toastSuccess } from "../../feedback/toast.js";
|
|
27
|
+
import FormProblemAlert from "../FormProblemAlert.js";
|
|
28
|
+
import FormTextField from "../FormTextField.js";
|
|
29
|
+
import SubmitButton from "../SubmitButton.js";
|
|
30
|
+
import { applyServerProblem } from "../applyServerProblem.js";
|
|
31
|
+
import * as Yup from "yup";
|
|
32
|
+
import { PASSKEY_NAME_MAX_LENGTH, TOTP_CODE_MIN_LENGTH, TOTP_CODE_MAX_LENGTH, TOTP_CODE_PATTERN, normalizeTotpCode, CURRENT_PASSWORD_MAX_LENGTH } from "./securityRules.js";
|
|
33
|
+
import { formatDateTime } from "../../formatting.js";
|
|
34
|
+
import RecoveryCodesDialog from "../../security/RecoveryCodesDialog.js";
|
|
35
|
+
import { useToolkitTranslation } from "../../toolkit/useToolkitTranslation.js";
|
|
36
|
+
import CopyButton from "../../ui/actions/CopyButton.js";
|
|
37
|
+
import Tag from "../../ui/labels/Tag.js";
|
|
38
|
+
import SectionCard from "../../ui/layout/SectionCard.js";
|
|
39
|
+
const FEW_CODES_LEFT = 2;
|
|
40
|
+
const QR_SIZE_PIXELS = 200;
|
|
41
|
+
const CODE_FONT = "ui-monospace, SFMono-Regular, Menlo, monospace";
|
|
42
|
+
function showFormError(error, formikHelpers, values) {
|
|
43
|
+
if (error?.cancelled) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (error?.status === void 0) {
|
|
47
|
+
formikHelpers.setStatus(error?.message);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
applyServerProblem(error, { ...formikHelpers, values });
|
|
51
|
+
}
|
|
52
|
+
function PasswordDialog({ open, title, description, confirmLabel, onConfirm, onClose }) {
|
|
53
|
+
const { t } = useToolkitTranslation("security");
|
|
54
|
+
const passwordSchema = Yup.object({ password: Yup.string().max(CURRENT_PASSWORD_MAX_LENGTH).required(t("twoStep.passwordRequired")) });
|
|
55
|
+
return /* @__PURE__ */ jsx(Dialog, { open, onClose, maxWidth: "xs", fullWidth: true, children: /* @__PURE__ */ jsx(
|
|
56
|
+
Formik,
|
|
57
|
+
{
|
|
58
|
+
initialValues: { password: "" },
|
|
59
|
+
validationSchema: passwordSchema,
|
|
60
|
+
enableReinitialize: true,
|
|
61
|
+
onSubmit: async (values, helpers) => {
|
|
62
|
+
try {
|
|
63
|
+
await onConfirm(values.password);
|
|
64
|
+
} catch (error) {
|
|
65
|
+
showFormError(error, helpers, values);
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
children: () => /* @__PURE__ */ jsxs(Form, { noValidate: true, children: [
|
|
69
|
+
/* @__PURE__ */ jsx(DialogTitle, { children: title }),
|
|
70
|
+
/* @__PURE__ */ jsx(DialogContent, { children: /* @__PURE__ */ jsxs(Stack, { spacing: 2, children: [
|
|
71
|
+
/* @__PURE__ */ jsx(DialogContentText, { children: description }),
|
|
72
|
+
/* @__PURE__ */ jsx(FormProblemAlert, {}),
|
|
73
|
+
/* @__PURE__ */ jsx(FormTextField, { name: "password", label: t("twoStep.passwordLabel"), type: "password", autoComplete: "current-password", autoFocus: true })
|
|
74
|
+
] }) }),
|
|
75
|
+
/* @__PURE__ */ jsxs(DialogActions, { children: [
|
|
76
|
+
/* @__PURE__ */ jsx(Button, { onClick: onClose, children: t("common:actions.cancel") }),
|
|
77
|
+
/* @__PURE__ */ jsx(SubmitButton, { size: "medium", color: "error", children: confirmLabel })
|
|
78
|
+
] })
|
|
79
|
+
] })
|
|
80
|
+
}
|
|
81
|
+
) });
|
|
82
|
+
}
|
|
83
|
+
function TotpDialog({ setup, onConfirm, onClose }) {
|
|
84
|
+
const { t } = useToolkitTranslation("security");
|
|
85
|
+
const codeSchema = Yup.object({
|
|
86
|
+
code: Yup.string().trim().required(t("twoStep.codeRequired")).min(TOTP_CODE_MIN_LENGTH).max(TOTP_CODE_MAX_LENGTH).matches(TOTP_CODE_PATTERN, t("twoStep.codeFormat"))
|
|
87
|
+
});
|
|
88
|
+
return /* @__PURE__ */ jsx(Dialog, { open: Boolean(setup), onClose, maxWidth: "xs", fullWidth: true, children: /* @__PURE__ */ jsx(
|
|
89
|
+
Formik,
|
|
90
|
+
{
|
|
91
|
+
initialValues: { code: "" },
|
|
92
|
+
validationSchema: codeSchema,
|
|
93
|
+
onSubmit: async (values, helpers) => {
|
|
94
|
+
try {
|
|
95
|
+
await onConfirm(normalizeTotpCode(values.code));
|
|
96
|
+
} catch (error) {
|
|
97
|
+
showFormError(error, helpers, values);
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
children: () => /* @__PURE__ */ jsxs(Form, { noValidate: true, children: [
|
|
101
|
+
/* @__PURE__ */ jsx(DialogTitle, { children: t("twoStep.totpDialogTitle") }),
|
|
102
|
+
/* @__PURE__ */ jsx(DialogContent, { children: /* @__PURE__ */ jsxs(Stack, { spacing: 2, children: [
|
|
103
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", children: t("twoStep.totpStep1") }),
|
|
104
|
+
setup?.qrImageUrl && /* @__PURE__ */ jsx(
|
|
105
|
+
Box,
|
|
106
|
+
{
|
|
107
|
+
component: "img",
|
|
108
|
+
src: setup.qrImageUrl,
|
|
109
|
+
alt: t("twoStep.totpQrAlt"),
|
|
110
|
+
sx: { width: QR_SIZE_PIXELS, height: QR_SIZE_PIXELS, alignSelf: "center", borderRadius: 1, bgcolor: "common.white" }
|
|
111
|
+
}
|
|
112
|
+
),
|
|
113
|
+
/* @__PURE__ */ jsx(Typography, { variant: "caption", color: "text.secondary", children: t("twoStep.totpCantScan") }),
|
|
114
|
+
/* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, sx: { alignItems: "center" }, children: [
|
|
115
|
+
/* @__PURE__ */ jsx(Box, { component: "code", sx: { fontFamily: CODE_FONT, fontSize: 13, wordBreak: "break-all" }, children: setup?.secret }),
|
|
116
|
+
/* @__PURE__ */ jsx(CopyButton, { value: setup?.secret ?? "" })
|
|
117
|
+
] }),
|
|
118
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", children: t("twoStep.totpStep2") }),
|
|
119
|
+
/* @__PURE__ */ jsx(FormProblemAlert, {}),
|
|
120
|
+
/* @__PURE__ */ jsx(
|
|
121
|
+
FormTextField,
|
|
122
|
+
{
|
|
123
|
+
name: "code",
|
|
124
|
+
label: t("twoStep.codeLabel"),
|
|
125
|
+
autoComplete: "one-time-code",
|
|
126
|
+
clearable: false,
|
|
127
|
+
slotProps: { htmlInput: { inputMode: "numeric", maxLength: TOTP_CODE_MAX_LENGTH } }
|
|
128
|
+
}
|
|
129
|
+
),
|
|
130
|
+
setup?.extra
|
|
131
|
+
] }) }),
|
|
132
|
+
/* @__PURE__ */ jsxs(DialogActions, { children: [
|
|
133
|
+
/* @__PURE__ */ jsx(Button, { onClick: onClose, children: t("common:actions.cancel") }),
|
|
134
|
+
/* @__PURE__ */ jsx(SubmitButton, { size: "medium", children: t("twoStep.activate") })
|
|
135
|
+
] })
|
|
136
|
+
] })
|
|
137
|
+
}
|
|
138
|
+
) });
|
|
139
|
+
}
|
|
140
|
+
function PasskeyDialog({ open, onAdd, onClose, notice }) {
|
|
141
|
+
const { t } = useToolkitTranslation("security");
|
|
142
|
+
const nameSchema = Yup.object({ name: Yup.string().trim().max(PASSKEY_NAME_MAX_LENGTH) });
|
|
143
|
+
return /* @__PURE__ */ jsx(Dialog, { open, onClose, maxWidth: "xs", fullWidth: true, children: /* @__PURE__ */ jsx(
|
|
144
|
+
Formik,
|
|
145
|
+
{
|
|
146
|
+
initialValues: { name: "" },
|
|
147
|
+
validationSchema: nameSchema,
|
|
148
|
+
onSubmit: async (values, helpers) => {
|
|
149
|
+
try {
|
|
150
|
+
await onAdd(values.name.trim());
|
|
151
|
+
} catch (error) {
|
|
152
|
+
showFormError(error, helpers, values);
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
children: () => /* @__PURE__ */ jsxs(Form, { noValidate: true, children: [
|
|
156
|
+
/* @__PURE__ */ jsx(DialogTitle, { children: t("twoStep.passkeyDialogTitle") }),
|
|
157
|
+
/* @__PURE__ */ jsx(DialogContent, { children: /* @__PURE__ */ jsxs(Stack, { spacing: 2, children: [
|
|
158
|
+
/* @__PURE__ */ jsx(DialogContentText, { children: t("twoStep.passkeyDialogText") }),
|
|
159
|
+
notice && /* @__PURE__ */ jsx(Alert, { severity: "info", children: notice }),
|
|
160
|
+
/* @__PURE__ */ jsx(FormProblemAlert, {}),
|
|
161
|
+
/* @__PURE__ */ jsx(
|
|
162
|
+
FormTextField,
|
|
163
|
+
{
|
|
164
|
+
name: "name",
|
|
165
|
+
label: t("twoStep.passkeyName"),
|
|
166
|
+
placeholder: t("twoStep.passkeyNamePlaceholder"),
|
|
167
|
+
autoFocus: true,
|
|
168
|
+
slotProps: { htmlInput: { maxLength: PASSKEY_NAME_MAX_LENGTH } }
|
|
169
|
+
}
|
|
170
|
+
)
|
|
171
|
+
] }) }),
|
|
172
|
+
/* @__PURE__ */ jsxs(DialogActions, { children: [
|
|
173
|
+
/* @__PURE__ */ jsx(Button, { onClick: onClose, children: t("common:actions.cancel") }),
|
|
174
|
+
/* @__PURE__ */ jsx(SubmitButton, { size: "medium", startIcon: /* @__PURE__ */ jsx(FingerprintOutlinedIcon, {}), children: t("twoStep.createPasskey") })
|
|
175
|
+
] })
|
|
176
|
+
] })
|
|
177
|
+
}
|
|
178
|
+
) });
|
|
179
|
+
}
|
|
180
|
+
function SettingRow({ Icon, title, caption, captionColor = "text.secondary", action }) {
|
|
181
|
+
return /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, sx: { alignItems: "center", justifyContent: "space-between" }, children: [
|
|
182
|
+
/* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1.5, sx: { alignItems: "center", minWidth: 0 }, children: [
|
|
183
|
+
/* @__PURE__ */ jsx(Icon, { color: "action" }),
|
|
184
|
+
/* @__PURE__ */ jsxs(Box, { sx: { minWidth: 0 }, children: [
|
|
185
|
+
/* @__PURE__ */ jsx(Typography, { variant: "subtitle2", children: title }),
|
|
186
|
+
caption && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: captionColor, component: "p", children: caption })
|
|
187
|
+
] })
|
|
188
|
+
] }),
|
|
189
|
+
action
|
|
190
|
+
] });
|
|
191
|
+
}
|
|
192
|
+
function TwoStepVerificationCard({ security, onSecurityChange, actions, canUsePasskeys = false, account, passkeyNotice }) {
|
|
193
|
+
const { t } = useToolkitTranslation("security");
|
|
194
|
+
const [dialog, setDialog] = useState(null);
|
|
195
|
+
const [totpSetup, setTotpSetup] = useState(null);
|
|
196
|
+
const [recoveryCodes, setRecoveryCodes] = useState(null);
|
|
197
|
+
const [error, setError] = useState(null);
|
|
198
|
+
const close = () => setDialog(null);
|
|
199
|
+
const apply = (result, message) => {
|
|
200
|
+
onSecurityChange(result.security);
|
|
201
|
+
if (result.recoveryCodes?.length) {
|
|
202
|
+
setRecoveryCodes(result.recoveryCodes);
|
|
203
|
+
}
|
|
204
|
+
if (message) {
|
|
205
|
+
toastSuccess(message);
|
|
206
|
+
}
|
|
207
|
+
close();
|
|
208
|
+
};
|
|
209
|
+
const startTotp = async () => {
|
|
210
|
+
setError(null);
|
|
211
|
+
try {
|
|
212
|
+
setTotpSetup(await actions.startTotp());
|
|
213
|
+
} catch (caught) {
|
|
214
|
+
setError(caught.message);
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
const passkeyBeingRemoved = dialog?.passkey;
|
|
218
|
+
const codesLeft = security.recoveryCodesRemaining;
|
|
219
|
+
return /* @__PURE__ */ jsxs(SectionCard, { title: t("twoStep.title"), children: [
|
|
220
|
+
/* @__PURE__ */ jsxs(Stack, { spacing: 2, children: [
|
|
221
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: t("twoStep.description") }),
|
|
222
|
+
/* @__PURE__ */ jsx(Box, { children: security.isEnabled ? /* @__PURE__ */ jsx(Tag, { label: t("twoStep.active"), color: "success", tooltip: t("twoStep.activeSince", { date: formatDateTime(security.enabledAt) }) }) : /* @__PURE__ */ jsx(Tag, { label: t("twoStep.inactive"), color: "warning", tooltip: t("twoStep.inactiveTooltip") }) }),
|
|
223
|
+
error && /* @__PURE__ */ jsx(Alert, { severity: "error", onClose: () => setError(null), children: error }),
|
|
224
|
+
/* @__PURE__ */ jsx(Divider, {}),
|
|
225
|
+
/* @__PURE__ */ jsx(
|
|
226
|
+
SettingRow,
|
|
227
|
+
{
|
|
228
|
+
Icon: FingerprintOutlinedIcon,
|
|
229
|
+
title: t("twoStep.passkeysTitle"),
|
|
230
|
+
caption: security.passkeys.length === 0 ? canUsePasskeys ? t("twoStep.passkeysEmpty") : t("passkeys.unsupported") : null,
|
|
231
|
+
action: canUsePasskeys && /* @__PURE__ */ jsx(Button, { size: "small", onClick: () => setDialog({ kind: "passkey" }), children: t("twoStep.add") })
|
|
232
|
+
}
|
|
233
|
+
),
|
|
234
|
+
security.passkeys.length > 0 && /* @__PURE__ */ jsx(List, { dense: true, disablePadding: true, children: security.passkeys.map((passkey) => /* @__PURE__ */ jsxs(ListItem, { disableGutters: true, secondaryAction: /* @__PURE__ */ jsx(Tooltip, { title: t("twoStep.removePasskeyTooltip"), children: /* @__PURE__ */ jsx(
|
|
235
|
+
IconButton,
|
|
236
|
+
{
|
|
237
|
+
edge: "end",
|
|
238
|
+
"aria-label": t("twoStep.removePasskey", { name: passkey.name }),
|
|
239
|
+
onClick: () => setDialog({ kind: "removePasskey", passkey }),
|
|
240
|
+
children: /* @__PURE__ */ jsx(DeleteOutlineOutlinedIcon, { fontSize: "small" })
|
|
241
|
+
}
|
|
242
|
+
) }), children: [
|
|
243
|
+
/* @__PURE__ */ jsx(ListItemIcon, { sx: { minWidth: 32 }, children: /* @__PURE__ */ jsx(VpnKeyOutlinedIcon, { fontSize: "small" }) }),
|
|
244
|
+
/* @__PURE__ */ jsx(
|
|
245
|
+
ListItemText,
|
|
246
|
+
{
|
|
247
|
+
primary: passkey.name,
|
|
248
|
+
secondary: passkey.lastUsedAt ? t("twoStep.passkeyUsed", { date: formatDateTime(passkey.lastUsedAt) }) : t("twoStep.passkeyCreated", { date: formatDateTime(passkey.createdAt) })
|
|
249
|
+
}
|
|
250
|
+
)
|
|
251
|
+
] }, passkey.id)) }),
|
|
252
|
+
/* @__PURE__ */ jsx(Divider, {}),
|
|
253
|
+
/* @__PURE__ */ jsx(
|
|
254
|
+
SettingRow,
|
|
255
|
+
{
|
|
256
|
+
Icon: PhonelinkLockOutlinedIcon,
|
|
257
|
+
title: t("twoStep.appTitle"),
|
|
258
|
+
caption: security.totp.isEnabled ? t("twoStep.appActiveSince", { date: formatDateTime(security.totp.enabledAt) }) : t("twoStep.appDescription"),
|
|
259
|
+
action: security.totp.isEnabled ? /* @__PURE__ */ jsx(Button, { size: "small", color: "error", onClick: () => setDialog({ kind: "disableTotp" }), children: t("twoStep.deactivate") }) : /* @__PURE__ */ jsx(Button, { size: "small", onClick: startTotp, children: t("twoStep.activate") })
|
|
260
|
+
}
|
|
261
|
+
),
|
|
262
|
+
security.isEnabled && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
263
|
+
/* @__PURE__ */ jsx(Divider, {}),
|
|
264
|
+
/* @__PURE__ */ jsx(
|
|
265
|
+
SettingRow,
|
|
266
|
+
{
|
|
267
|
+
Icon: VpnKeyOutlinedIcon,
|
|
268
|
+
title: t("twoStep.codesTitle"),
|
|
269
|
+
caption: codesLeft ? t("twoStep.codesRemaining", { count: codesLeft }) : t("twoStep.codesNone"),
|
|
270
|
+
captionColor: codesLeft <= FEW_CODES_LEFT ? "warning.main" : "text.secondary",
|
|
271
|
+
action: /* @__PURE__ */ jsx(Button, { size: "small", onClick: () => setDialog({ kind: "regenerateCodes" }), children: t("twoStep.regenerate") })
|
|
272
|
+
}
|
|
273
|
+
)
|
|
274
|
+
] })
|
|
275
|
+
] }),
|
|
276
|
+
/* @__PURE__ */ jsx(
|
|
277
|
+
PasskeyDialog,
|
|
278
|
+
{
|
|
279
|
+
open: dialog?.kind === "passkey",
|
|
280
|
+
onClose: close,
|
|
281
|
+
notice: passkeyNotice,
|
|
282
|
+
onAdd: async (name) => apply(await actions.addPasskey(name), t("twoStep.passkeyAdded"))
|
|
283
|
+
}
|
|
284
|
+
),
|
|
285
|
+
/* @__PURE__ */ jsx(
|
|
286
|
+
TotpDialog,
|
|
287
|
+
{
|
|
288
|
+
setup: totpSetup,
|
|
289
|
+
onClose: () => setTotpSetup(null),
|
|
290
|
+
onConfirm: async (code) => {
|
|
291
|
+
const result = await actions.confirmTotp(code);
|
|
292
|
+
setTotpSetup(null);
|
|
293
|
+
apply(result, t("twoStep.appActivated"));
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
),
|
|
297
|
+
/* @__PURE__ */ jsx(
|
|
298
|
+
PasswordDialog,
|
|
299
|
+
{
|
|
300
|
+
open: dialog?.kind === "disableTotp",
|
|
301
|
+
onClose: close,
|
|
302
|
+
title: t("twoStep.disableTitle"),
|
|
303
|
+
description: t("twoStep.disableText"),
|
|
304
|
+
confirmLabel: t("twoStep.deactivate"),
|
|
305
|
+
onConfirm: async (password) => apply(await actions.disableTotp(password), t("twoStep.appDeactivated"))
|
|
306
|
+
}
|
|
307
|
+
),
|
|
308
|
+
/* @__PURE__ */ jsx(
|
|
309
|
+
PasswordDialog,
|
|
310
|
+
{
|
|
311
|
+
open: dialog?.kind === "removePasskey",
|
|
312
|
+
onClose: close,
|
|
313
|
+
title: t("twoStep.removeTitle", { name: passkeyBeingRemoved?.name ?? "" }),
|
|
314
|
+
description: t("twoStep.removeText"),
|
|
315
|
+
confirmLabel: t("twoStep.remove"),
|
|
316
|
+
onConfirm: async (password) => apply(await actions.removePasskey(passkeyBeingRemoved, password), t("twoStep.passkeyRemoved"))
|
|
317
|
+
}
|
|
318
|
+
),
|
|
319
|
+
/* @__PURE__ */ jsx(
|
|
320
|
+
PasswordDialog,
|
|
321
|
+
{
|
|
322
|
+
open: dialog?.kind === "regenerateCodes",
|
|
323
|
+
onClose: close,
|
|
324
|
+
title: t("twoStep.regenerateTitle"),
|
|
325
|
+
description: t("twoStep.regenerateText"),
|
|
326
|
+
confirmLabel: t("twoStep.generate"),
|
|
327
|
+
onConfirm: async (password) => apply(await actions.regenerateRecoveryCodes(password))
|
|
328
|
+
}
|
|
329
|
+
),
|
|
330
|
+
/* @__PURE__ */ jsx(RecoveryCodesDialog, { codes: recoveryCodes, account, onClose: () => setRecoveryCodes(null) })
|
|
331
|
+
] });
|
|
332
|
+
}
|
|
333
|
+
export {
|
|
334
|
+
TwoStepVerificationCard as default
|
|
335
|
+
};
|
|
336
|
+
//# sourceMappingURL=TwoStepVerificationCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TwoStepVerificationCard.js","sources":["../../../src/forms/security/TwoStepVerificationCard.jsx"],"sourcesContent":["// «Verificación en dos pasos» de «Mi perfil»: las llaves de acceso, la app autenticadora y los códigos de recuperación.\n//\n// Lo que QUITA protección (desactivar la app, quitar una llave, generar códigos nuevos) pide la contraseña: una sesión que\n// alguien dejó abierta no debe bastar para desarmar la cuenta. Activar no la pide.\n//\n// La tarjeta no sabe del servidor: el proyecto le pasa el estado (security) y qué hacer en cada caso (actions); cada\n// acción regresa {security, recoveryCodes?} y la tarjeta avisa el estado nuevo con onSecurityChange. Las llaves de acceso\n// las crea el proyecto con createPasskey (@stackcraftmx/calcita/passkeys) dentro de actions.addPasskey: así esta puerta no\n// carga la librería de llaves.\n//\n// <TwoStepVerificationCard security={security} onSecurityChange={setSecurity} account={session.email}\n// canUsePasskeys={passkeysSupported()} actions={securityActions} />\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useState} from 'react';\nimport {Form, Formik} from 'formik';\nimport Alert from '@mui/material/Alert';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogContentText from '@mui/material/DialogContentText';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport Divider from '@mui/material/Divider';\nimport IconButton from '@mui/material/IconButton';\nimport List from '@mui/material/List';\nimport ListItem from '@mui/material/ListItem';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Stack from '@mui/material/Stack';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport DeleteOutlineOutlinedIcon from '@mui/icons-material/DeleteOutlineOutlined';\nimport FingerprintOutlinedIcon from '@mui/icons-material/FingerprintOutlined';\nimport PhonelinkLockOutlinedIcon from '@mui/icons-material/PhonelinkLockOutlined';\nimport VpnKeyOutlinedIcon from '@mui/icons-material/VpnKeyOutlined';\n\nimport {toastSuccess} from '@/feedback/toast.jsx';\nimport FormProblemAlert from '@/forms/FormProblemAlert.jsx';\nimport FormTextField from '@/forms/FormTextField.jsx';\nimport SubmitButton from '@/forms/SubmitButton.jsx';\nimport {applyServerProblem} from '@/forms/applyServerProblem.js';\nimport {Yup} from '@/forms/validation.js';\nimport {\n CURRENT_PASSWORD_MAX_LENGTH, PASSKEY_NAME_MAX_LENGTH, TOTP_CODE_MAX_LENGTH, TOTP_CODE_MIN_LENGTH, TOTP_CODE_PATTERN, normalizeTotpCode,\n} from '@/forms/security/securityRules.js';\nimport {formatDateTime} from '@/formatting.js';\nimport RecoveryCodesDialog from '@/security/RecoveryCodesDialog.jsx';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport CopyButton from '@/ui/actions/CopyButton.jsx';\nimport Tag from '@/ui/labels/Tag.jsx';\nimport SectionCard from '@/ui/layout/SectionCard.jsx';\n\n// los códigos que quedan desde donde se avisa en ámbar que ya son pocos\nconst FEW_CODES_LEFT = 2;\nconst QR_SIZE_PIXELS = 200;\nconst CODE_FONT = 'ui-monospace, SFMono-Regular, Menlo, monospace';\n\n/**\n * Lo que hace un formulario de la tarjeta con un error: un ApiError va a su campo o arriba (applyServerProblem); un\n * error del navegador (la llave de acceso) va arriba; si la persona solo canceló, nada.\n *\n * @param {Error & {cancelled?: boolean, status?: number}} error\n * @param {object} formikHelpers\n * @param {object} values\n */\nfunction showFormError(error, formikHelpers, values) {\n if (error?.cancelled) {\n return;\n }\n if (error?.status === undefined) {\n formikHelpers.setStatus(error?.message);\n return;\n }\n applyServerProblem(error, {...formikHelpers, values});\n}\n\n/** Confirmar con la contraseña antes de quitar protección. */\nfunction PasswordDialog({open, title, description, confirmLabel, onConfirm, onClose}) {\n const {t} = useToolkitTranslation('security');\n const passwordSchema = Yup.object({password: Yup.string().max(CURRENT_PASSWORD_MAX_LENGTH).required(t('twoStep.passwordRequired'))});\n\n return (\n <Dialog open={open} onClose={onClose} maxWidth=\"xs\" fullWidth>\n <Formik initialValues={{password: ''}} validationSchema={passwordSchema} enableReinitialize\n onSubmit={async (values, helpers) => {\n try {\n await onConfirm(values.password);\n } catch (error) {\n showFormError(error, helpers, values);\n }\n }}>\n {() => (\n <Form noValidate>\n <DialogTitle>{title}</DialogTitle>\n <DialogContent>\n <Stack spacing={2}>\n <DialogContentText>{description}</DialogContentText>\n <FormProblemAlert />\n <FormTextField name=\"password\" label={t('twoStep.passwordLabel')} type=\"password\" autoComplete=\"current-password\" autoFocus />\n </Stack>\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose}>{t('common:actions.cancel')}</Button>\n <SubmitButton size=\"medium\" color=\"error\">{confirmLabel}</SubmitButton>\n </DialogActions>\n </Form>\n )}\n </Formik>\n </Dialog>\n );\n}\n\n/** Activar la app: escanear el QR (o teclear la clave) y confirmar con un código. */\nfunction TotpDialog({setup, onConfirm, onClose}) {\n const {t} = useToolkitTranslation('security');\n const codeSchema = Yup.object({\n code: Yup.string().trim().required(t('twoStep.codeRequired')).min(TOTP_CODE_MIN_LENGTH).max(TOTP_CODE_MAX_LENGTH)\n .matches(TOTP_CODE_PATTERN, t('twoStep.codeFormat')),\n });\n\n return (\n <Dialog open={Boolean(setup)} onClose={onClose} maxWidth=\"xs\" fullWidth>\n <Formik initialValues={{code: ''}} validationSchema={codeSchema}\n onSubmit={async (values, helpers) => {\n try {\n await onConfirm(normalizeTotpCode(values.code));\n } catch (error) {\n showFormError(error, helpers, values);\n }\n }}>\n {() => (\n <Form noValidate>\n <DialogTitle>{t('twoStep.totpDialogTitle')}</DialogTitle>\n <DialogContent>\n <Stack spacing={2}>\n <Typography variant=\"body2\">{t('twoStep.totpStep1')}</Typography>\n {setup?.qrImageUrl && (\n <Box component=\"img\" src={setup.qrImageUrl} alt={t('twoStep.totpQrAlt')}\n sx={{width: QR_SIZE_PIXELS, height: QR_SIZE_PIXELS, alignSelf: 'center', borderRadius: 1, bgcolor: 'common.white'}} />\n )}\n <Typography variant=\"caption\" color=\"text.secondary\">{t('twoStep.totpCantScan')}</Typography>\n <Stack direction=\"row\" spacing={1} sx={{alignItems: 'center'}}>\n <Box component=\"code\" sx={{fontFamily: CODE_FONT, fontSize: 13, wordBreak: 'break-all'}}>{setup?.secret}</Box>\n <CopyButton value={setup?.secret ?? ''} />\n </Stack>\n <Typography variant=\"body2\">{t('twoStep.totpStep2')}</Typography>\n <FormProblemAlert />\n <FormTextField name=\"code\" label={t('twoStep.codeLabel')} autoComplete=\"one-time-code\" clearable={false}\n slotProps={{htmlInput: {inputMode: 'numeric', maxLength: TOTP_CODE_MAX_LENGTH}}} />\n {setup?.extra}\n </Stack>\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose}>{t('common:actions.cancel')}</Button>\n <SubmitButton size=\"medium\">{t('twoStep.activate')}</SubmitButton>\n </DialogActions>\n </Form>\n )}\n </Formik>\n </Dialog>\n );\n}\n\n/** Nombrar y crear una llave nueva (el navegador pide la huella, el rostro o el PIN); notice va arriba del nombre. */\nfunction PasskeyDialog({open, onAdd, onClose, notice}) {\n const {t} = useToolkitTranslation('security');\n const nameSchema = Yup.object({name: Yup.string().trim().max(PASSKEY_NAME_MAX_LENGTH)});\n\n return (\n <Dialog open={open} onClose={onClose} maxWidth=\"xs\" fullWidth>\n <Formik initialValues={{name: ''}} validationSchema={nameSchema}\n onSubmit={async (values, helpers) => {\n try {\n await onAdd(values.name.trim());\n } catch (error) {\n showFormError(error, helpers, values);\n }\n }}>\n {() => (\n <Form noValidate>\n <DialogTitle>{t('twoStep.passkeyDialogTitle')}</DialogTitle>\n <DialogContent>\n <Stack spacing={2}>\n <DialogContentText>{t('twoStep.passkeyDialogText')}</DialogContentText>\n {notice && <Alert severity=\"info\">{notice}</Alert>}\n <FormProblemAlert />\n <FormTextField name=\"name\" label={t('twoStep.passkeyName')} placeholder={t('twoStep.passkeyNamePlaceholder')} autoFocus\n slotProps={{htmlInput: {maxLength: PASSKEY_NAME_MAX_LENGTH}}} />\n </Stack>\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose}>{t('common:actions.cancel')}</Button>\n <SubmitButton size=\"medium\" startIcon={<FingerprintOutlinedIcon />}>{t('twoStep.createPasskey')}</SubmitButton>\n </DialogActions>\n </Form>\n )}\n </Formik>\n </Dialog>\n );\n}\n\n/**\n * Un renglón de la tarjeta: ícono, nombre, explicación chica y su botón a la derecha.\n *\n * @param {{Icon: import('react').ElementType, title: string, caption?: import('react').ReactNode, captionColor?: string, action?: import('react').ReactNode}} props\n */\nfunction SettingRow({Icon, title, caption, captionColor = 'text.secondary', action}) {\n return (\n <Stack direction=\"row\" spacing={1} sx={{alignItems: 'center', justifyContent: 'space-between'}}>\n <Stack direction=\"row\" spacing={1.5} sx={{alignItems: 'center', minWidth: 0}}>\n <Icon color=\"action\" />\n <Box sx={{minWidth: 0}}>\n <Typography variant=\"subtitle2\">{title}</Typography>\n {caption && <Typography variant=\"caption\" color={captionColor} component=\"p\">{caption}</Typography>}\n </Box>\n </Stack>\n {action}\n </Stack>\n );\n}\n\n/**\n * @param {object} props\n * @param {{isEnabled: boolean, enabledAt?: string|null, passkeys: Array<{id: string, name: string, createdAt: string, lastUsedAt?: string|null}>, totp: {isEnabled: boolean, enabledAt?: string|null}, recoveryCodesRemaining: number}} props.security\n * @param {(security: {isEnabled: boolean, enabledAt?: string|null, passkeys: Array<{id: string, name: string, createdAt: string, lastUsedAt?: string|null}>, totp: {isEnabled: boolean, enabledAt?: string|null}, recoveryCodesRemaining: number}) => void} props.onSecurityChange\n * @param {object} props.actions lo que hace el proyecto en cada caso; cada una regresa {security, recoveryCodes?}\n * @param {(name: string) => Promise<{security: object, recoveryCodes?: string[]}>} props.actions.addPasskey crea la llave\n * (createPasskey) y la guarda en el servidor\n * @param {(passkey: {id: string, name: string}, password: string) => Promise<{security: object}>} props.actions.removePasskey\n * @param {() => Promise<{secret: string, qrImageUrl: string, extra?: import('react').ReactNode}>} props.actions.startTotp\n * la clave y su QR; extra va abajo del campo (p. ej. un atajo de los ejemplos)\n * @param {(code: string) => Promise<{security: object, recoveryCodes?: string[]}>} props.actions.confirmTotp\n * @param {(password: string) => Promise<{security: object}>} props.actions.disableTotp\n * @param {(password: string) => Promise<{security: object, recoveryCodes: string[]}>} props.actions.regenerateRecoveryCodes\n * @param {boolean} [props.canUsePasskeys] passkeysSupported() de /passkeys; sin él no se ofrece agregar llaves\n * @param {string} [props.account] la cuenta (el correo), para el archivo de los códigos\n * @param {import('react').ReactNode} [props.passkeyNotice] un aviso en el diálogo de crear la llave, antes de que el\n * navegador la guarde (p. ej. el de la demostración: la llave queda de verdad en el llavero de la persona)\n */\nexport default function TwoStepVerificationCard({security, onSecurityChange, actions, canUsePasskeys = false, account, passkeyNotice}) {\n const {t} = useToolkitTranslation('security');\n // qué diálogo está abierto: uno a la vez\n const [dialog, setDialog] = useState(null);\n const [totpSetup, setTotpSetup] = useState(null);\n const [recoveryCodes, setRecoveryCodes] = useState(null);\n const [error, setError] = useState(null);\n\n const close = () => setDialog(null);\n // lo que regresa cada acción: el estado nuevo, los códigos si hubo, el aviso y cerrar el diálogo\n const apply = (result, message) => {\n onSecurityChange(result.security);\n if (result.recoveryCodes?.length) {\n setRecoveryCodes(result.recoveryCodes);\n }\n if (message) {\n toastSuccess(message);\n }\n close();\n };\n\n const startTotp = async () => {\n setError(null);\n try {\n setTotpSetup(await actions.startTotp());\n } catch (caught) {\n setError(caught.message);\n }\n };\n\n const passkeyBeingRemoved = dialog?.passkey;\n const codesLeft = security.recoveryCodesRemaining;\n\n return (\n <SectionCard title={t('twoStep.title')}>\n <Stack spacing={2}>\n <Typography variant=\"body2\" color=\"text.secondary\">{t('twoStep.description')}</Typography>\n <Box>\n {security.isEnabled\n ? <Tag label={t('twoStep.active')} color=\"success\" tooltip={t('twoStep.activeSince', {date: formatDateTime(security.enabledAt)})} />\n : <Tag label={t('twoStep.inactive')} color=\"warning\" tooltip={t('twoStep.inactiveTooltip')} />}\n </Box>\n {error && <Alert severity=\"error\" onClose={() => setError(null)}>{error}</Alert>}\n\n <Divider />\n <SettingRow Icon={FingerprintOutlinedIcon} title={t('twoStep.passkeysTitle')}\n caption={security.passkeys.length === 0 ? (canUsePasskeys ? t('twoStep.passkeysEmpty') : t('passkeys.unsupported')) : null}\n action={canUsePasskeys && <Button size=\"small\" onClick={() => setDialog({kind: 'passkey'})}>{t('twoStep.add')}</Button>} />\n {security.passkeys.length > 0 && (\n <List dense disablePadding>\n {security.passkeys.map((passkey) => (\n <ListItem key={passkey.id} disableGutters secondaryAction={(\n <Tooltip title={t('twoStep.removePasskeyTooltip')}>\n <IconButton edge=\"end\" aria-label={t('twoStep.removePasskey', {name: passkey.name})}\n onClick={() => setDialog({kind: 'removePasskey', passkey})}>\n <DeleteOutlineOutlinedIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}>\n <ListItemIcon sx={{minWidth: 32}}><VpnKeyOutlinedIcon fontSize=\"small\" /></ListItemIcon>\n <ListItemText primary={passkey.name}\n secondary={passkey.lastUsedAt\n ? t('twoStep.passkeyUsed', {date: formatDateTime(passkey.lastUsedAt)})\n : t('twoStep.passkeyCreated', {date: formatDateTime(passkey.createdAt)})} />\n </ListItem>\n ))}\n </List>\n )}\n\n <Divider />\n <SettingRow Icon={PhonelinkLockOutlinedIcon} title={t('twoStep.appTitle')}\n caption={security.totp.isEnabled ? t('twoStep.appActiveSince', {date: formatDateTime(security.totp.enabledAt)}) : t('twoStep.appDescription')}\n action={security.totp.isEnabled\n ? <Button size=\"small\" color=\"error\" onClick={() => setDialog({kind: 'disableTotp'})}>{t('twoStep.deactivate')}</Button>\n : <Button size=\"small\" onClick={startTotp}>{t('twoStep.activate')}</Button>} />\n\n {/* los códigos de recuperación solo existen con la verificación activa */}\n {security.isEnabled && (\n <>\n <Divider />\n <SettingRow Icon={VpnKeyOutlinedIcon} title={t('twoStep.codesTitle')}\n caption={codesLeft ? t('twoStep.codesRemaining', {count: codesLeft}) : t('twoStep.codesNone')}\n captionColor={codesLeft <= FEW_CODES_LEFT ? 'warning.main' : 'text.secondary'}\n action={<Button size=\"small\" onClick={() => setDialog({kind: 'regenerateCodes'})}>{t('twoStep.regenerate')}</Button>} />\n </>\n )}\n </Stack>\n\n <PasskeyDialog open={dialog?.kind === 'passkey'} onClose={close} notice={passkeyNotice}\n onAdd={async (name) => apply(await actions.addPasskey(name), t('twoStep.passkeyAdded'))} />\n <TotpDialog setup={totpSetup} onClose={() => setTotpSetup(null)}\n onConfirm={async (code) => {\n const result = await actions.confirmTotp(code);\n setTotpSetup(null);\n apply(result, t('twoStep.appActivated'));\n }} />\n <PasswordDialog open={dialog?.kind === 'disableTotp'} onClose={close} title={t('twoStep.disableTitle')}\n description={t('twoStep.disableText')} confirmLabel={t('twoStep.deactivate')}\n onConfirm={async (password) => apply(await actions.disableTotp(password), t('twoStep.appDeactivated'))} />\n <PasswordDialog open={dialog?.kind === 'removePasskey'} onClose={close}\n title={t('twoStep.removeTitle', {name: passkeyBeingRemoved?.name ?? ''})} description={t('twoStep.removeText')}\n confirmLabel={t('twoStep.remove')}\n onConfirm={async (password) => apply(await actions.removePasskey(passkeyBeingRemoved, password), t('twoStep.passkeyRemoved'))} />\n <PasswordDialog open={dialog?.kind === 'regenerateCodes'} onClose={close} title={t('twoStep.regenerateTitle')}\n description={t('twoStep.regenerateText')} confirmLabel={t('twoStep.generate')}\n onConfirm={async (password) => apply(await actions.regenerateRecoveryCodes(password))} />\n <RecoveryCodesDialog codes={recoveryCodes} account={account} onClose={() => setRecoveryCodes(null)} />\n </SectionCard>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const TOTP_CODE_MIN_LENGTH = 6;
|
|
2
|
+
const TOTP_CODE_MAX_LENGTH = 7;
|
|
3
|
+
const RECOVERY_CODE_MIN_LENGTH = 10;
|
|
4
|
+
const RECOVERY_CODE_MAX_LENGTH = 11;
|
|
5
|
+
const PASSKEY_NAME_MAX_LENGTH = 60;
|
|
6
|
+
const CURRENT_PASSWORD_MAX_LENGTH = 128;
|
|
7
|
+
const TOTP_CODE_PATTERN = /^\d{3}\s?\d{3}$/;
|
|
8
|
+
const RECOVERY_CODE_PATTERN = /^[A-Za-z0-9]{5}-?[A-Za-z0-9]{5}$/;
|
|
9
|
+
function normalizeTotpCode(code) {
|
|
10
|
+
return String(code ?? "").replace(/\s/g, "");
|
|
11
|
+
}
|
|
12
|
+
function normalizeRecoveryCode(code) {
|
|
13
|
+
const compact = String(code ?? "").replace(/[\s-]/g, "").toUpperCase();
|
|
14
|
+
return compact.length === RECOVERY_CODE_MIN_LENGTH ? `${compact.slice(0, 5)}-${compact.slice(5)}` : compact;
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
CURRENT_PASSWORD_MAX_LENGTH,
|
|
18
|
+
PASSKEY_NAME_MAX_LENGTH,
|
|
19
|
+
RECOVERY_CODE_MAX_LENGTH,
|
|
20
|
+
RECOVERY_CODE_MIN_LENGTH,
|
|
21
|
+
RECOVERY_CODE_PATTERN,
|
|
22
|
+
TOTP_CODE_MAX_LENGTH,
|
|
23
|
+
TOTP_CODE_MIN_LENGTH,
|
|
24
|
+
TOTP_CODE_PATTERN,
|
|
25
|
+
normalizeRecoveryCode,
|
|
26
|
+
normalizeTotpCode
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=securityRules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"securityRules.js","sources":["../../../src/forms/security/securityRules.js"],"sourcesContent":["// Las reglas de los códigos y la contraseña de la verificación en dos pasos, aparte para probarlas sin navegador.\n//\n// Los topes son la forma del código con su separador: «123 456» son 7 y «ABCDE-FGHJK» son 11. Antes de mandarlo al\n// servidor se le quitan los espacios (el de la app) y se deja en mayúsculas (el de recuperación).\n//\n// Funciones puras, no renderizan: function (regla de la casa).\n\nexport const TOTP_CODE_MIN_LENGTH = 6;\nexport const TOTP_CODE_MAX_LENGTH = 7;\nexport const RECOVERY_CODE_MIN_LENGTH = 10;\nexport const RECOVERY_CODE_MAX_LENGTH = 11;\nexport const PASSKEY_NAME_MAX_LENGTH = 60;\n// la contraseña actual no lleva mínimo: es la que ya tiene; solo el tope para no mandar textos enormes\nexport const CURRENT_PASSWORD_MAX_LENGTH = 128;\n\n/** «123456» o «123 456». */\nexport const TOTP_CODE_PATTERN = /^\\d{3}\\s?\\d{3}$/;\n/** «ABCDE-FGHJK» o «ABCDEFGHJK». */\nexport const RECOVERY_CODE_PATTERN = /^[A-Za-z0-9]{5}-?[A-Za-z0-9]{5}$/;\n\n/**\n * El código de la app como lo espera el servidor: los 6 dígitos sin espacios.\n *\n * @param {string} code\n * @returns {string}\n */\nexport function normalizeTotpCode(code) {\n return String(code ?? '').replace(/\\s/g, '');\n}\n\n/**\n * El código de recuperación como lo espera el servidor: en mayúsculas y con su guion (ABCDE-FGHJK).\n *\n * @param {string} code\n * @returns {string}\n */\nexport function normalizeRecoveryCode(code) {\n const compact = String(code ?? '').replace(/[\\s-]/g, '').toUpperCase();\n return compact.length === RECOVERY_CODE_MIN_LENGTH ? `${compact.slice(0, 5)}-${compact.slice(5)}` : compact;\n}\n"],"names":[],"mappings":"AAOY,MAAC,uBAAuB;AACxB,MAAC,uBAAuB;AACxB,MAAC,2BAA2B;AAC5B,MAAC,2BAA2B;AAC5B,MAAC,0BAA0B;AAE3B,MAAC,8BAA8B;AAG/B,MAAC,oBAAoB;AAErB,MAAC,wBAAwB;AAQ9B,SAAS,kBAAkB,MAAM;AACpC,SAAO,OAAO,QAAQ,EAAE,EAAE,QAAQ,OAAO,EAAE;AAC/C;AAQO,SAAS,sBAAsB,MAAM;AACxC,QAAM,UAAU,OAAO,QAAQ,EAAE,EAAE,QAAQ,UAAU,EAAE,EAAE,YAAW;AACpE,SAAO,QAAQ,WAAW,2BAA2B,GAAG,QAAQ,MAAM,GAAG,CAAC,CAAC,IAAI,QAAQ,MAAM,CAAC,CAAC,KAAK;AACxG;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
function splitServerFieldErrors(errorsByField, formFieldNames) {
|
|
2
|
+
const fieldErrors = {};
|
|
3
|
+
const unassignedMessages = [];
|
|
4
|
+
for (const [fieldName, messages] of Object.entries(errorsByField ?? {})) {
|
|
5
|
+
if (formFieldNames.includes(fieldName)) {
|
|
6
|
+
fieldErrors[fieldName] = messages.join(" ");
|
|
7
|
+
} else {
|
|
8
|
+
unassignedMessages.push(...messages);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return { fieldErrors, unassignedMessages };
|
|
12
|
+
}
|
|
13
|
+
function formLevelMessageOf(errorsByField, formFieldNames, generalMessage) {
|
|
14
|
+
const { unassignedMessages } = splitServerFieldErrors(errorsByField, formFieldNames);
|
|
15
|
+
if (unassignedMessages.length > 0) {
|
|
16
|
+
return unassignedMessages.join(" ");
|
|
17
|
+
}
|
|
18
|
+
const hasFieldErrors = Object.keys(errorsByField ?? {}).length > 0;
|
|
19
|
+
return hasFieldErrors ? null : generalMessage || null;
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
formLevelMessageOf,
|
|
23
|
+
splitServerFieldErrors
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=serverProblemFields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverProblemFields.js","sources":["../../src/forms/serverProblemFields.js"],"sourcesContent":["// Reparte los errores por campo de un 422 entre los campos que EXISTEN en el formulario y los que no.\n//\n// Lo que no tiene campo no se pierde: va al aviso de arriba del formulario. Un error invisible es peor que uno mal\n// colocado.\n//\n// Función pura sin imports (se prueba con node --test en serverProblemFields.test.js); la usan applyServerProblem y\n// las pantallas que pintan el aviso desde su máquina de estados.\n\n/**\n * @param {Record<string, string[]>} errorsByField lo que regresa fieldErrorsOf(problem)\n * @param {string[]} formFieldNames campos del formulario (Object.keys de sus valores iniciales)\n * @returns {{fieldErrors: Record<string, string>, unassignedMessages: string[]}}\n */\nexport function splitServerFieldErrors(errorsByField, formFieldNames) {\n const fieldErrors = {};\n const unassignedMessages = [];\n\n for (const [fieldName, messages] of Object.entries(errorsByField ?? {})) {\n if (formFieldNames.includes(fieldName)) {\n fieldErrors[fieldName] = messages.join(' ');\n } else {\n unassignedMessages.push(...messages);\n }\n }\n\n return {fieldErrors, unassignedMessages};\n}\n\n/**\n * Mensaje del aviso de arriba: lo que quedó sin campo, o el mensaje general si el error no trae errores por campo.\n * Si todo cayó en sus campos, no se repite arriba (null).\n *\n * @param {Record<string, string[]>} errorsByField\n * @param {string[]} formFieldNames\n * @param {string|null|undefined} generalMessage el message del ApiError (ya traducido)\n * @returns {string|null}\n */\nexport function formLevelMessageOf(errorsByField, formFieldNames, generalMessage) {\n const {unassignedMessages} = splitServerFieldErrors(errorsByField, formFieldNames);\n if (unassignedMessages.length > 0) {\n return unassignedMessages.join(' ');\n }\n const hasFieldErrors = Object.keys(errorsByField ?? {}).length > 0;\n return hasFieldErrors ? null : (generalMessage || null);\n}\n"],"names":[],"mappings":"AAaO,SAAS,uBAAuB,eAAe,gBAAgB;AAClE,QAAM,cAAc,CAAA;AACpB,QAAM,qBAAqB,CAAA;AAE3B,aAAW,CAAC,WAAW,QAAQ,KAAK,OAAO,QAAQ,iBAAiB,CAAA,CAAE,GAAG;AACrE,QAAI,eAAe,SAAS,SAAS,GAAG;AACpC,kBAAY,SAAS,IAAI,SAAS,KAAK,GAAG;AAAA,IAC9C,OAAO;AACH,yBAAmB,KAAK,GAAG,QAAQ;AAAA,IACvC;AAAA,EACJ;AAEA,SAAO,EAAC,aAAa,mBAAkB;AAC3C;AAWO,SAAS,mBAAmB,eAAe,gBAAgB,gBAAgB;AAC9E,QAAM,EAAC,mBAAkB,IAAI,uBAAuB,eAAe,cAAc;AACjF,MAAI,mBAAmB,SAAS,GAAG;AAC/B,WAAO,mBAAmB,KAAK,GAAG;AAAA,EACtC;AACA,QAAM,iBAAiB,OAAO,KAAK,iBAAiB,CAAA,CAAE,EAAE,SAAS;AACjE,SAAO,iBAAiB,OAAQ,kBAAkB;AACtD;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useField } from "formik";
|
|
3
|
+
function useFormikField(name) {
|
|
4
|
+
const [field, meta, helpers] = useField(name);
|
|
5
|
+
return {
|
|
6
|
+
name,
|
|
7
|
+
value: field.value,
|
|
8
|
+
onChange: (value) => helpers.setValue(value),
|
|
9
|
+
onBlur: () => helpers.setTouched(true),
|
|
10
|
+
error: meta.touched ? meta.error : void 0
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
useFormikField
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=useFormikField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFormikField.js","sources":["../../src/forms/useFormikField.js"],"sourcesContent":["// La conexión de un campo suelto (inputs/) con formik: lo que la vista necesita, sacado del campo de formik.\n//\n// Una sola regla vive aquí: el error se enseña cuando el campo ya se tocó (o ya se intentó enviar, que formik marca como\n// tocados todos). Marcar en rojo lo que nadie ha llenado regaña a alguien por no adivinar.\n//\n// Hook genérico del paquete: function (regla de la casa).\nimport {useField} from 'formik';\n\n/**\n * @param {string} name el campo del formulario\n * @returns {{name: string, value: unknown, onChange: (value: unknown) => void, onBlur: () => void, error: unknown}}\n */\nexport function useFormikField(name) {\n const [field, meta, helpers] = useField(name);\n\n return {\n name,\n value: field.value,\n onChange: (value) => helpers.setValue(value),\n onBlur: () => helpers.setTouched(true),\n error: meta.touched ? meta.error : undefined,\n };\n}\n"],"names":[],"mappings":";;AAYO,SAAS,eAAe,MAAM;AACjC,QAAM,CAAC,OAAO,MAAM,OAAO,IAAI,SAAS,IAAI;AAE5C,SAAO;AAAA,IACH;AAAA,IACA,OAAO,MAAM;AAAA,IACb,UAAU,CAAC,UAAU,QAAQ,SAAS,KAAK;AAAA,IAC3C,QAAQ,MAAM,QAAQ,WAAW,IAAI;AAAA,IACrC,OAAO,KAAK,UAAU,KAAK,QAAQ;AAAA,EAC3C;AACA;"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import * as Yup from "yup";
|
|
2
|
+
const NAMESPACE = "validation";
|
|
3
|
+
function messageKey(name, values) {
|
|
4
|
+
return values === void 0 ? { key: `${NAMESPACE}:${name}` } : { key: `${NAMESPACE}:${name}`, values };
|
|
5
|
+
}
|
|
6
|
+
const YUP_LOCALE = Object.freeze({
|
|
7
|
+
mixed: {
|
|
8
|
+
default: messageKey("default"),
|
|
9
|
+
required: messageKey("required"),
|
|
10
|
+
defined: messageKey("required"),
|
|
11
|
+
notNull: messageKey("required"),
|
|
12
|
+
notType: messageKey("notType"),
|
|
13
|
+
oneOf: ({ values }) => messageKey("oneOf", { values: String(values) }),
|
|
14
|
+
notOneOf: ({ values }) => messageKey("notOneOf", { values: String(values) })
|
|
15
|
+
},
|
|
16
|
+
string: {
|
|
17
|
+
length: ({ length }) => messageKey("stringLength", { count: length }),
|
|
18
|
+
min: ({ min }) => messageKey("stringMin", { count: min }),
|
|
19
|
+
max: ({ max }) => messageKey("stringMax", { count: max }),
|
|
20
|
+
matches: messageKey("matches"),
|
|
21
|
+
email: messageKey("email"),
|
|
22
|
+
url: messageKey("url"),
|
|
23
|
+
uuid: messageKey("uuid"),
|
|
24
|
+
trim: messageKey("trim"),
|
|
25
|
+
lowercase: messageKey("lowercase"),
|
|
26
|
+
uppercase: messageKey("uppercase")
|
|
27
|
+
},
|
|
28
|
+
number: {
|
|
29
|
+
min: ({ min }) => messageKey("numberMin", { min }),
|
|
30
|
+
max: ({ max }) => messageKey("numberMax", { max }),
|
|
31
|
+
lessThan: ({ less }) => messageKey("lessThan", { less }),
|
|
32
|
+
moreThan: ({ more }) => messageKey("moreThan", { more }),
|
|
33
|
+
positive: messageKey("positive"),
|
|
34
|
+
negative: messageKey("negative"),
|
|
35
|
+
integer: messageKey("integer")
|
|
36
|
+
},
|
|
37
|
+
date: {
|
|
38
|
+
min: ({ min }) => messageKey("dateMin", { min: String(min) }),
|
|
39
|
+
max: ({ max }) => messageKey("dateMax", { max: String(max) })
|
|
40
|
+
},
|
|
41
|
+
array: {
|
|
42
|
+
min: ({ min }) => messageKey("arrayMin", { count: min }),
|
|
43
|
+
max: ({ max }) => messageKey("arrayMax", { count: max }),
|
|
44
|
+
length: ({ length }) => messageKey("arrayLength", { count: length })
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
function buildYupLocale() {
|
|
48
|
+
Yup.setLocale(YUP_LOCALE);
|
|
49
|
+
}
|
|
50
|
+
export {
|
|
51
|
+
YUP_LOCALE,
|
|
52
|
+
Yup,
|
|
53
|
+
buildYupLocale
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sources":["../../src/forms/validation.js"],"sourcesContent":["// Mensajes por defecto de yup como LLAVES de i18n y no como texto.\n//\n// Por qué llaves: setLocale es global y se llama una sola vez. Con el texto en español, al cambiar a inglés los\n// errores seguirían en español hasta recargar. Con {key, values} el esquema no cambia y el texto se traduce al\n// PINTARLO (translateValidationMessage, lo usa FormTextField) en el idioma que esté activo en ese momento.\n//\n// Uso en un esquema: Yup.string().required().email() → sin textos pegados.\n// Mensaje propio de un campo: .required({key: 'auth:login.emailRequired'}) o .test('x', {key: 'modulo:llave'}, fn).\n//\n// IMPORTANTE: toda llave de aquí existe en los textos del paquete, namespace validation de locales/{es,en}.js (lo revisa\n// validation.test.js). La validación de aquí es para no gastar un viaje al servidor en lo obvio; la que protege es la\n// del backend.\n//\n// buildYupLocale() se llama UNA vez en la entrada de la aplicación, antes del primer esquema.\n//\n// Funciones puras, no renderizan: function (regla de la casa). Solo importa yup (se prueba con node --test).\nimport * as Yup from 'yup';\n\nconst NAMESPACE = 'validation';\n\n/** {key: 'validation:<nombre>', values} */\nfunction messageKey(name, values) {\n return values === undefined ? {key: `${NAMESPACE}:${name}`} : {key: `${NAMESPACE}:${name}`, values};\n}\n\n/** El locale de yup: cada mensaje por defecto es una llave del namespace validation. */\nexport const YUP_LOCALE = Object.freeze({\n mixed: {\n default: messageKey('default'),\n required: messageKey('required'),\n defined: messageKey('required'),\n notNull: messageKey('required'),\n notType: messageKey('notType'),\n oneOf: ({values}) => messageKey('oneOf', {values: String(values)}),\n notOneOf: ({values}) => messageKey('notOneOf', {values: String(values)}),\n },\n string: {\n length: ({length}) => messageKey('stringLength', {count: length}),\n min: ({min}) => messageKey('stringMin', {count: min}),\n max: ({max}) => messageKey('stringMax', {count: max}),\n matches: messageKey('matches'),\n email: messageKey('email'),\n url: messageKey('url'),\n uuid: messageKey('uuid'),\n trim: messageKey('trim'),\n lowercase: messageKey('lowercase'),\n uppercase: messageKey('uppercase'),\n },\n number: {\n min: ({min}) => messageKey('numberMin', {min}),\n max: ({max}) => messageKey('numberMax', {max}),\n lessThan: ({less}) => messageKey('lessThan', {less}),\n moreThan: ({more}) => messageKey('moreThan', {more}),\n positive: messageKey('positive'),\n negative: messageKey('negative'),\n integer: messageKey('integer'),\n },\n date: {\n min: ({min}) => messageKey('dateMin', {min: String(min)}),\n max: ({max}) => messageKey('dateMax', {max: String(max)}),\n },\n array: {\n min: ({min}) => messageKey('arrayMin', {count: min}),\n max: ({max}) => messageKey('arrayMax', {count: max}),\n length: ({length}) => messageKey('arrayLength', {count: length}),\n },\n});\n\n/**\n * Instala el locale de llaves en yup. Se llama una vez en la entrada de la aplicación, antes del primer esquema.\n */\nexport function buildYupLocale() {\n Yup.setLocale(YUP_LOCALE);\n}\n\nexport {Yup};\n\n// el texto de un error en el idioma activo vive aparte (sin yup) para los campos sueltos; aquí se re-exporta\nexport {translateValidationMessage} from '@/forms/validationMessages.js';\n"],"names":[],"mappings":";AAkBA,MAAM,YAAY;AAGlB,SAAS,WAAW,MAAM,QAAQ;AAC9B,SAAO,WAAW,SAAY,EAAC,KAAK,GAAG,SAAS,IAAI,IAAI,GAAE,IAAI,EAAC,KAAK,GAAG,SAAS,IAAI,IAAI,IAAI,OAAM;AACtG;AAGY,MAAC,aAAa,OAAO,OAAO;AAAA,EACpC,OAAO;AAAA,IACH,SAAS,WAAW,SAAS;AAAA,IAC7B,UAAU,WAAW,UAAU;AAAA,IAC/B,SAAS,WAAW,UAAU;AAAA,IAC9B,SAAS,WAAW,UAAU;AAAA,IAC9B,SAAS,WAAW,SAAS;AAAA,IAC7B,OAAO,CAAC,EAAC,OAAM,MAAM,WAAW,SAAS,EAAC,QAAQ,OAAO,MAAM,EAAC,CAAC;AAAA,IACjE,UAAU,CAAC,EAAC,OAAM,MAAM,WAAW,YAAY,EAAC,QAAQ,OAAO,MAAM,EAAC,CAAC;AAAA,EAC/E;AAAA,EACI,QAAQ;AAAA,IACJ,QAAQ,CAAC,EAAC,OAAM,MAAM,WAAW,gBAAgB,EAAC,OAAO,OAAM,CAAC;AAAA,IAChE,KAAK,CAAC,EAAC,IAAG,MAAM,WAAW,aAAa,EAAC,OAAO,IAAG,CAAC;AAAA,IACpD,KAAK,CAAC,EAAC,IAAG,MAAM,WAAW,aAAa,EAAC,OAAO,IAAG,CAAC;AAAA,IACpD,SAAS,WAAW,SAAS;AAAA,IAC7B,OAAO,WAAW,OAAO;AAAA,IACzB,KAAK,WAAW,KAAK;AAAA,IACrB,MAAM,WAAW,MAAM;AAAA,IACvB,MAAM,WAAW,MAAM;AAAA,IACvB,WAAW,WAAW,WAAW;AAAA,IACjC,WAAW,WAAW,WAAW;AAAA,EACzC;AAAA,EACI,QAAQ;AAAA,IACJ,KAAK,CAAC,EAAC,IAAG,MAAM,WAAW,aAAa,EAAC,IAAG,CAAC;AAAA,IAC7C,KAAK,CAAC,EAAC,IAAG,MAAM,WAAW,aAAa,EAAC,IAAG,CAAC;AAAA,IAC7C,UAAU,CAAC,EAAC,KAAI,MAAM,WAAW,YAAY,EAAC,KAAI,CAAC;AAAA,IACnD,UAAU,CAAC,EAAC,KAAI,MAAM,WAAW,YAAY,EAAC,KAAI,CAAC;AAAA,IACnD,UAAU,WAAW,UAAU;AAAA,IAC/B,UAAU,WAAW,UAAU;AAAA,IAC/B,SAAS,WAAW,SAAS;AAAA,EACrC;AAAA,EACI,MAAM;AAAA,IACF,KAAK,CAAC,EAAC,IAAG,MAAM,WAAW,WAAW,EAAC,KAAK,OAAO,GAAG,EAAC,CAAC;AAAA,IACxD,KAAK,CAAC,EAAC,IAAG,MAAM,WAAW,WAAW,EAAC,KAAK,OAAO,GAAG,EAAC,CAAC;AAAA,EAChE;AAAA,EACI,OAAO;AAAA,IACH,KAAK,CAAC,EAAC,IAAG,MAAM,WAAW,YAAY,EAAC,OAAO,IAAG,CAAC;AAAA,IACnD,KAAK,CAAC,EAAC,IAAG,MAAM,WAAW,YAAY,EAAC,OAAO,IAAG,CAAC;AAAA,IACnD,QAAQ,CAAC,EAAC,OAAM,MAAM,WAAW,eAAe,EAAC,OAAO,OAAM,CAAC;AAAA,EACvE;AACA,CAAC;AAKM,SAAS,iBAAiB;AAC7B,MAAI,UAAU,UAAU;AAC5B;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
function translateValidationMessage(translate, error) {
|
|
2
|
+
if (!error) {
|
|
3
|
+
return void 0;
|
|
4
|
+
}
|
|
5
|
+
if (typeof error === "string") {
|
|
6
|
+
return error;
|
|
7
|
+
}
|
|
8
|
+
if (typeof error === "object" && error.key) {
|
|
9
|
+
return translate(error.key, error.values);
|
|
10
|
+
}
|
|
11
|
+
return String(error);
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
translateValidationMessage
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=validationMessages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validationMessages.js","sources":["../../src/forms/validationMessages.js"],"sourcesContent":["// El texto de un error de validación en el idioma activo. Aparte de validation.js a propósito: no importa yup, así lo usan\n// los campos sueltos de la puerta principal (inputs/) sin cargar yup en un proyecto que no valida con él.\n//\n// Función pura, no renderiza: function (regla de la casa).\n\n/**\n * Texto de un error de validación en el idioma activo.\n * Acepta las dos formas que llegan: {key, values} de yup (buildYupLocale), o un texto ya traducido (los del backend).\n *\n * @param {(key: string, values?: object) => string} translate el t de useToolkitTranslation\n * @param {string|{key: string, values?: object}|undefined|null} error\n * @returns {string|undefined}\n */\nexport function translateValidationMessage(translate, error) {\n if (!error) {\n return undefined;\n }\n if (typeof error === 'string') {\n return error;\n }\n if (typeof error === 'object' && error.key) {\n return translate(error.key, error.values);\n }\n return String(error);\n}\n"],"names":[],"mappings":"AAaO,SAAS,2BAA2B,WAAW,OAAO;AACzD,MAAI,CAAC,OAAO;AACR,WAAO;AAAA,EACX;AACA,MAAI,OAAO,UAAU,UAAU;AAC3B,WAAO;AAAA,EACX;AACA,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK;AACxC,WAAO,UAAU,MAAM,KAAK,MAAM,MAAM;AAAA,EAC5C;AACA,SAAO,OAAO,KAAK;AACvB;"}
|