@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,156 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useRef, useState, Children, useEffect } from "react";
|
|
4
|
+
import Box from "@mui/material/Box";
|
|
5
|
+
const scrollableRow = {
|
|
6
|
+
display: "flex",
|
|
7
|
+
flexWrap: "nowrap",
|
|
8
|
+
overflowX: "auto",
|
|
9
|
+
overflowY: "hidden",
|
|
10
|
+
scrollbarWidth: "none",
|
|
11
|
+
msOverflowStyle: "none",
|
|
12
|
+
"&::-webkit-scrollbar": { display: "none" }
|
|
13
|
+
};
|
|
14
|
+
const DRAG_THRESHOLD_PIXELS = 5;
|
|
15
|
+
function ScrollableRow({
|
|
16
|
+
children,
|
|
17
|
+
gap = 1,
|
|
18
|
+
py = 0.5,
|
|
19
|
+
sx,
|
|
20
|
+
enableDragScroll = true,
|
|
21
|
+
enableWheelToX = true,
|
|
22
|
+
fadeEdges = true,
|
|
23
|
+
ref,
|
|
24
|
+
...boxProps
|
|
25
|
+
}) {
|
|
26
|
+
const rowElement = useRef(null);
|
|
27
|
+
const [edges, setEdges] = useState({ overflow: false, start: false, end: false });
|
|
28
|
+
const assignRef = (node) => {
|
|
29
|
+
rowElement.current = node;
|
|
30
|
+
if (typeof ref === "function") {
|
|
31
|
+
ref(node);
|
|
32
|
+
} else if (ref && typeof ref === "object") {
|
|
33
|
+
ref.current = node;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const childrenCount = Children.count(children);
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
const element = rowElement.current;
|
|
39
|
+
if (!element) {
|
|
40
|
+
return void 0;
|
|
41
|
+
}
|
|
42
|
+
const measureEdges = () => setEdges({
|
|
43
|
+
overflow: element.scrollWidth > element.clientWidth + 1,
|
|
44
|
+
start: element.scrollLeft > 1,
|
|
45
|
+
end: element.scrollLeft + element.clientWidth < element.scrollWidth - 1
|
|
46
|
+
});
|
|
47
|
+
measureEdges();
|
|
48
|
+
const resizeObserver = new ResizeObserver(measureEdges);
|
|
49
|
+
resizeObserver.observe(element);
|
|
50
|
+
element.addEventListener("scroll", measureEdges, { passive: true });
|
|
51
|
+
return () => {
|
|
52
|
+
resizeObserver.disconnect();
|
|
53
|
+
element.removeEventListener("scroll", measureEdges);
|
|
54
|
+
};
|
|
55
|
+
}, [childrenCount]);
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
const element = rowElement.current;
|
|
58
|
+
if (!element) {
|
|
59
|
+
return void 0;
|
|
60
|
+
}
|
|
61
|
+
let isDragging = false;
|
|
62
|
+
let hasMoved = false;
|
|
63
|
+
let startX = 0;
|
|
64
|
+
let scrollStart = 0;
|
|
65
|
+
const isOverflowing = () => element.scrollWidth > element.clientWidth + 1;
|
|
66
|
+
const handleMouseDown = (event) => {
|
|
67
|
+
if (event.button !== 0 || !isOverflowing()) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (["INPUT", "TEXTAREA"].includes(event.target?.tagName)) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
isDragging = true;
|
|
74
|
+
hasMoved = false;
|
|
75
|
+
startX = event.pageX;
|
|
76
|
+
scrollStart = element.scrollLeft;
|
|
77
|
+
};
|
|
78
|
+
const handleMouseMove = (event) => {
|
|
79
|
+
if (!isDragging) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const distance = event.pageX - startX;
|
|
83
|
+
if (!hasMoved && Math.abs(distance) > DRAG_THRESHOLD_PIXELS) {
|
|
84
|
+
hasMoved = true;
|
|
85
|
+
element.style.cursor = "grabbing";
|
|
86
|
+
}
|
|
87
|
+
if (hasMoved) {
|
|
88
|
+
event.preventDefault();
|
|
89
|
+
element.scrollLeft = scrollStart - distance;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
const stopDragging = () => {
|
|
93
|
+
isDragging = false;
|
|
94
|
+
element.style.cursor = "";
|
|
95
|
+
};
|
|
96
|
+
const handleClickCapture = (event) => {
|
|
97
|
+
if (!hasMoved) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
event.preventDefault();
|
|
101
|
+
event.stopPropagation();
|
|
102
|
+
hasMoved = false;
|
|
103
|
+
};
|
|
104
|
+
const handleWheel = (event) => {
|
|
105
|
+
if (isOverflowing() && Math.abs(event.deltaY) > Math.abs(event.deltaX)) {
|
|
106
|
+
event.preventDefault();
|
|
107
|
+
element.scrollLeft += event.deltaY;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
if (enableDragScroll) {
|
|
111
|
+
element.addEventListener("mousedown", handleMouseDown);
|
|
112
|
+
element.addEventListener("mousemove", handleMouseMove);
|
|
113
|
+
element.addEventListener("mouseup", stopDragging);
|
|
114
|
+
element.addEventListener("mouseleave", stopDragging);
|
|
115
|
+
element.addEventListener("click", handleClickCapture, true);
|
|
116
|
+
}
|
|
117
|
+
if (enableWheelToX) {
|
|
118
|
+
element.addEventListener("wheel", handleWheel, { passive: false });
|
|
119
|
+
}
|
|
120
|
+
return () => {
|
|
121
|
+
element.removeEventListener("mousedown", handleMouseDown);
|
|
122
|
+
element.removeEventListener("mousemove", handleMouseMove);
|
|
123
|
+
element.removeEventListener("mouseup", stopDragging);
|
|
124
|
+
element.removeEventListener("mouseleave", stopDragging);
|
|
125
|
+
element.removeEventListener("click", handleClickCapture, true);
|
|
126
|
+
element.removeEventListener("wheel", handleWheel);
|
|
127
|
+
};
|
|
128
|
+
}, [enableDragScroll, enableWheelToX]);
|
|
129
|
+
const isDragEnabled = enableDragScroll && edges.overflow;
|
|
130
|
+
const fadeMask = fadeEdges && edges.overflow ? `linear-gradient(to right, ${[
|
|
131
|
+
edges.start ? "transparent 0, black 24px" : "black 0",
|
|
132
|
+
edges.end ? "black calc(100% - 24px), transparent 100%" : "black 100%"
|
|
133
|
+
].join(", ")})` : void 0;
|
|
134
|
+
return /* @__PURE__ */ jsx(
|
|
135
|
+
Box,
|
|
136
|
+
{
|
|
137
|
+
ref: assignRef,
|
|
138
|
+
sx: {
|
|
139
|
+
...scrollableRow,
|
|
140
|
+
gap,
|
|
141
|
+
py,
|
|
142
|
+
cursor: isDragEnabled ? "grab" : "auto",
|
|
143
|
+
userSelect: isDragEnabled ? "none" : "auto",
|
|
144
|
+
...fadeMask && { maskImage: fadeMask, WebkitMaskImage: fadeMask },
|
|
145
|
+
...sx
|
|
146
|
+
},
|
|
147
|
+
...boxProps,
|
|
148
|
+
children
|
|
149
|
+
}
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
export {
|
|
153
|
+
ScrollableRow as default,
|
|
154
|
+
scrollableRow
|
|
155
|
+
};
|
|
156
|
+
//# sourceMappingURL=ScrollableRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScrollableRow.js","sources":["../../../src/ui/layout/ScrollableRow.jsx"],"sourcesContent":["// Tira horizontal que se desliza, no que se envuelve (chips de filtros y accesos rápidos).\n//\n// Con muchos filtros puestos los chips se envolvían en varios renglones y empujaban la tabla fuera de la pantalla,\n// justo cuando más falta hace ver el resultado. Encapsula lo que hace falta para que la tira se sienta nativa:\n// - overflow-x sin barra visible en los tres motores;\n// - arrastre con el mouse en escritorio (el deslizamiento táctil ya es gratis);\n// - la rueda vertical se convierte en desplazamiento horizontal;\n// - el borde por el que sigue habiendo contenido se DESVANECE: sin barra ni desvanecido, una tira cortada a la mitad\n// se lee como un chip mal pintado.\n// Todo eso se activa SOLO cuando de verdad hay desbordamiento.\n//\n// OJO: el umbral de 5 px separa el arrastre del clic; mover más cancela el clic que venía detrás, para no borrar un\n// filtro cuando lo que se quería era desplazar la tira.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {Children, useEffect, useRef, useState} from 'react';\nimport Box from '@mui/material/Box';\n\n/** El mixin sin arrastre, para cuando no se puede envolver el elemento. */\nexport const scrollableRow = {\n display: 'flex',\n flexWrap: 'nowrap',\n overflowX: 'auto',\n overflowY: 'hidden',\n scrollbarWidth: 'none',\n msOverflowStyle: 'none',\n '&::-webkit-scrollbar': {display: 'none'},\n};\n\nconst DRAG_THRESHOLD_PIXELS = 5;\n\n/**\n * @param {object} props\n * @param {import('react').ReactNode} props.children\n * @param {number} [props.gap]\n * @param {number} [props.py]\n * @param {object} [props.sx]\n * @param {boolean} [props.enableDragScroll]\n * @param {boolean} [props.enableWheelToX]\n * @param {boolean} [props.fadeEdges]\n * @param {import('react').Ref<HTMLElement>} [props.ref]\n */\nexport default function ScrollableRow({\n children, gap = 1, py = 0.5, sx, enableDragScroll = true, enableWheelToX = true, fadeEdges = true, ref, ...boxProps\n}) {\n const rowElement = useRef(null);\n // por dónde sigue habiendo contenido: decide de qué lado va el desvanecido\n const [edges, setEdges] = useState({overflow: false, start: false, end: false});\n\n const assignRef = (node) => {\n rowElement.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref && typeof ref === 'object') {\n ref.current = node;\n }\n };\n\n // el número de hijos es la señal estable para revisar de nuevo (el padre agrega y quita chips)\n const childrenCount = Children.count(children);\n useEffect(() => {\n const element = rowElement.current;\n if (!element) {\n return undefined;\n }\n // el +1 evita el falso positivo por subpíxel\n const measureEdges = () => setEdges({\n overflow: element.scrollWidth > element.clientWidth + 1,\n start: element.scrollLeft > 1,\n end: element.scrollLeft + element.clientWidth < element.scrollWidth - 1,\n });\n measureEdges();\n\n const resizeObserver = new ResizeObserver(measureEdges);\n resizeObserver.observe(element);\n element.addEventListener('scroll', measureEdges, {passive: true});\n return () => {\n resizeObserver.disconnect();\n element.removeEventListener('scroll', measureEdges);\n };\n }, [childrenCount]);\n\n useEffect(() => {\n const element = rowElement.current;\n if (!element) {\n return undefined;\n }\n\n let isDragging = false;\n let hasMoved = false;\n let startX = 0;\n let scrollStart = 0;\n\n const isOverflowing = () => element.scrollWidth > element.clientWidth + 1;\n\n const handleMouseDown = (event) => {\n if (event.button !== 0 || !isOverflowing()) {\n return;\n }\n // arrastrar dentro de un campo de texto es seleccionar texto, no desplazar la tira\n if (['INPUT', 'TEXTAREA'].includes(event.target?.tagName)) {\n return;\n }\n isDragging = true;\n hasMoved = false;\n startX = event.pageX;\n scrollStart = element.scrollLeft;\n };\n\n const handleMouseMove = (event) => {\n if (!isDragging) {\n return;\n }\n const distance = event.pageX - startX;\n if (!hasMoved && Math.abs(distance) > DRAG_THRESHOLD_PIXELS) {\n hasMoved = true;\n element.style.cursor = 'grabbing';\n }\n if (hasMoved) {\n event.preventDefault();\n element.scrollLeft = scrollStart - distance;\n }\n };\n\n const stopDragging = () => {\n isDragging = false;\n element.style.cursor = '';\n };\n\n const handleClickCapture = (event) => {\n if (!hasMoved) {\n return;\n }\n // se arrastró: el clic que viene detrás NO es un clic\n event.preventDefault();\n event.stopPropagation();\n hasMoved = false;\n };\n\n const handleWheel = (event) => {\n if (isOverflowing() && Math.abs(event.deltaY) > Math.abs(event.deltaX)) {\n event.preventDefault();\n element.scrollLeft += event.deltaY;\n }\n };\n\n if (enableDragScroll) {\n element.addEventListener('mousedown', handleMouseDown);\n element.addEventListener('mousemove', handleMouseMove);\n element.addEventListener('mouseup', stopDragging);\n element.addEventListener('mouseleave', stopDragging);\n element.addEventListener('click', handleClickCapture, true);\n }\n if (enableWheelToX) {\n element.addEventListener('wheel', handleWheel, {passive: false});\n }\n\n return () => {\n element.removeEventListener('mousedown', handleMouseDown);\n element.removeEventListener('mousemove', handleMouseMove);\n element.removeEventListener('mouseup', stopDragging);\n element.removeEventListener('mouseleave', stopDragging);\n element.removeEventListener('click', handleClickCapture, true);\n element.removeEventListener('wheel', handleWheel);\n };\n }, [enableDragScroll, enableWheelToX]);\n\n const isDragEnabled = enableDragScroll && edges.overflow;\n\n // máscara y no degradado encima: funciona sin saber de qué color es el fondo\n const fadeMask = fadeEdges && edges.overflow\n ? `linear-gradient(to right, ${[\n edges.start ? 'transparent 0, black 24px' : 'black 0',\n edges.end ? 'black calc(100% - 24px), transparent 100%' : 'black 100%',\n ].join(', ')})`\n : undefined;\n\n return (\n <Box ref={assignRef}\n sx={{\n ...scrollableRow,\n gap,\n py,\n cursor: isDragEnabled ? 'grab' : 'auto',\n userSelect: isDragEnabled ? 'none' : 'auto',\n ...(fadeMask && {maskImage: fadeMask, WebkitMaskImage: fadeMask}),\n ...sx,\n }}\n {...boxProps}>\n {children}\n </Box>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
3
|
+
import Box from "@mui/material/Box";
|
|
4
|
+
import Paper from "@mui/material/Paper";
|
|
5
|
+
import Typography from "@mui/material/Typography";
|
|
6
|
+
function SectionCard({ title, action, children }) {
|
|
7
|
+
return /* @__PURE__ */ jsxs(Paper, { component: "section", variant: "outlined", sx: { p: { xs: 2, md: 2.5 }, minWidth: 0 }, children: [
|
|
8
|
+
/* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 1, mb: 1.5 }, children: [
|
|
9
|
+
/* @__PURE__ */ jsx(Typography, { variant: "overline", color: "text.secondary", component: "h2", sx: { lineHeight: 1.6 }, children: title }),
|
|
10
|
+
action
|
|
11
|
+
] }),
|
|
12
|
+
children
|
|
13
|
+
] });
|
|
14
|
+
}
|
|
15
|
+
export {
|
|
16
|
+
SectionCard as default
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=SectionCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SectionCard.js","sources":["../../../src/ui/layout/SectionCard.jsx"],"sourcesContent":["// Tarjeta de una sección de una página de detalle: título en versalitas, una acción opcional a la derecha y el contenido.\n//\n// Por qué una tarjeta por sección y no una sola hoja larga con divisiones: en pantalla ancha las secciones se acomodan en\n// columnas (lo principal a la izquierda, los datos de apoyo a la derecha) y cada una se encuentra por su título.\n//\n// Genérico del paquete: function (regla de la casa). No sabe de negocio: el título y el contenido llegan ya traducidos.\nimport Box from '@mui/material/Box';\nimport Paper from '@mui/material/Paper';\nimport Typography from '@mui/material/Typography';\n\n/**\n * @param {object} props\n * @param {string} props.title texto ya traducido\n * @param {import('react').ReactNode} [props.action] botón o liga a la derecha del título\n * @param {import('react').ReactNode} props.children\n */\nexport default function SectionCard({title, action, children}) {\n return (\n <Paper component=\"section\" variant=\"outlined\" sx={{p: {xs: 2, md: 2.5}, minWidth: 0}}>\n <Box sx={{display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 1, mb: 1.5}}>\n <Typography variant=\"overline\" color=\"text.secondary\" component=\"h2\" sx={{lineHeight: 1.6}}>{title}</Typography>\n {action}\n </Box>\n {children}\n </Paper>\n );\n}\n"],"names":[],"mappings":";;;;;AAgBA,SAAwB,YAAY,EAAC,OAAO,QAAQ,YAAW;AAC3D,8BACK,OAAA,EAAM,WAAU,WAAU,SAAQ,YAAW,IAAI,EAAC,GAAG,EAAC,IAAI,GAAG,IAAI,OAAM,UAAU,KAC9E,UAAA;AAAA,IAAA,qBAAC,KAAA,EAAI,IAAI,EAAC,SAAS,QAAQ,YAAY,UAAU,gBAAgB,iBAAiB,KAAK,GAAG,IAAI,OAC1F,UAAA;AAAA,MAAA,oBAAC,YAAA,EAAW,SAAQ,YAAW,OAAM,kBAAiB,WAAU,MAAK,IAAI,EAAC,YAAY,IAAA,GAAO,UAAA,OAAM;AAAA,MAClG;AAAA,IAAA,GACL;AAAA,IACC;AAAA,EAAA,GACL;AAER;"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useRef, useEffect, useLayoutEffect } from "react";
|
|
3
|
+
const APP_BAR_HEIGHT_CSS_VARIABLE = "--app-bar-height";
|
|
4
|
+
const APP_BAR_HEIGHT_WITHOUT_RIBBON_PIXELS = 56;
|
|
5
|
+
const useBrowserLayoutEffect = typeof window === "undefined" ? useEffect : useLayoutEffect;
|
|
6
|
+
const BREATHING_ROOM_BELOW_APP_BAR_PIXELS = 16;
|
|
7
|
+
const APP_BAR_HEIGHT = `var(${APP_BAR_HEIGHT_CSS_VARIABLE}, ${APP_BAR_HEIGHT_WITHOUT_RIBBON_PIXELS}px)`;
|
|
8
|
+
const SCROLL_MARGIN_BELOW_APP_BAR = `calc(${APP_BAR_HEIGHT} + ${BREATHING_ROOM_BELOW_APP_BAR_PIXELS}px)`;
|
|
9
|
+
function useAppBarHeightPublisher() {
|
|
10
|
+
const appBarElement = useRef(null);
|
|
11
|
+
useBrowserLayoutEffect(() => {
|
|
12
|
+
const element = appBarElement.current;
|
|
13
|
+
if (!element || typeof ResizeObserver === "undefined") {
|
|
14
|
+
return void 0;
|
|
15
|
+
}
|
|
16
|
+
const rootStyle = document.documentElement.style;
|
|
17
|
+
const publishHeight = () => {
|
|
18
|
+
const box = element.getBoundingClientRect();
|
|
19
|
+
const isAtBottom = box.top > window.innerHeight / 2;
|
|
20
|
+
const stickyTopPixels = Number.parseFloat(window.getComputedStyle(element).top) || 0;
|
|
21
|
+
const coveredPixels = isAtBottom ? 0 : Math.round(box.height + stickyTopPixels);
|
|
22
|
+
rootStyle.setProperty(APP_BAR_HEIGHT_CSS_VARIABLE, `${coveredPixels}px`);
|
|
23
|
+
};
|
|
24
|
+
publishHeight();
|
|
25
|
+
const resizeObserver = new ResizeObserver(publishHeight);
|
|
26
|
+
resizeObserver.observe(element);
|
|
27
|
+
window.addEventListener("resize", publishHeight);
|
|
28
|
+
return () => {
|
|
29
|
+
resizeObserver.disconnect();
|
|
30
|
+
window.removeEventListener("resize", publishHeight);
|
|
31
|
+
rootStyle.removeProperty(APP_BAR_HEIGHT_CSS_VARIABLE);
|
|
32
|
+
};
|
|
33
|
+
}, []);
|
|
34
|
+
return appBarElement;
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
APP_BAR_HEIGHT,
|
|
38
|
+
APP_BAR_HEIGHT_CSS_VARIABLE,
|
|
39
|
+
SCROLL_MARGIN_BELOW_APP_BAR,
|
|
40
|
+
useAppBarHeightPublisher
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=appBarHeight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appBarHeight.js","sources":["../../../src/ui/layout/appBarHeight.js"],"sourcesContent":["// El alto real de la barra superior, publicado como variable CSS para quien necesite dejarle lugar. Si la barra flota\n// separada de la orilla de arriba (el marco con vidrio), cuenta también esa separación: es lo que tapa.\n//\n// La barra superior se queda fija arriba al deslizar (sticky) y puede llevar adentro un aviso (una franja «Carga en\n// curso»): no siempre mide lo mismo. Quien manda la vista a una sección de su página (scroll-margin-top) necesita el\n// alto que la barra tiene EN ESE MOMENTO; con un número fijo, la barra con el aviso tapaba el título de la sección.\n// El layout de la aplicación mide su barra (useAppBarHeightPublisher) y las páginas solo usan SCROLL_MARGIN_BELOW_APP_BAR.\n//\n// NOTA sobre la CSP (sin 'unsafe-inline'): la variable se pone con style.setProperty, que es el objeto de estilos del\n// elemento y la CSP no lo bloquea; lo que bloquea es un atributo style=\"\" escrito en el HTML.\n//\n// Helpers genéricos del paquete: function (regla de la casa).\nimport {useEffect, useLayoutEffect, useRef} from 'react';\n\n/** Nombre de la variable CSS con el alto de la barra superior, en px. */\nexport const APP_BAR_HEIGHT_CSS_VARIABLE = '--app-bar-height';\n\n// lo que mide la barra sin aviso (el minHeight de su Toolbar): vale mientras nadie ha medido\nconst APP_BAR_HEIGHT_WITHOUT_RIBBON_PIXELS = 56;\n\n// se mide ANTES del primer pintado: el menú lateral empieza debajo de la barra y, con el alto de respaldo, brincaba al\n// medirse. En el servidor useLayoutEffect avisa en consola; ahí no hay nada que medir\nconst useBrowserLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect;\n\n// aire entre la barra y el título de la sección a la que se llega\nconst BREATHING_ROOM_BELOW_APP_BAR_PIXELS = 16;\n\n/** El alto real de la barra, como valor de CSS: para lo que se acomoda justo debajo de ella (el diálogo de contenido). */\nexport const APP_BAR_HEIGHT = `var(${APP_BAR_HEIGHT_CSS_VARIABLE}, ${APP_BAR_HEIGHT_WITHOUT_RIBBON_PIXELS}px)`;\n\n/** Valor de scroll-margin-top para una sección a la que se llega con un ancla: el alto real de la barra más un respiro. */\nexport const SCROLL_MARGIN_BELOW_APP_BAR = `calc(${APP_BAR_HEIGHT} + ${BREATHING_ROOM_BELOW_APP_BAR_PIXELS}px)`;\n\n/**\n * Mide la barra superior y publica su alto en la variable CSS cada vez que cambia (aparece o se cierra un aviso, se\n * gira el teléfono, cambia el ancho de la ventana).\n *\n * @returns {import('react').RefObject<HTMLElement>} la referencia que se le pone a la barra\n */\nexport function useAppBarHeightPublisher() {\n const appBarElement = useRef(null);\n\n useBrowserLayoutEffect(() => {\n const element = appBarElement.current;\n // guard clause: sin elemento o sin ResizeObserver (navegador muy viejo) se queda el alto de respaldo\n if (!element || typeof ResizeObserver === 'undefined') {\n return undefined;\n }\n const rootStyle = document.documentElement.style;\n // el alto más lo que la barra flota separada de la orilla de arriba (con vidrio, 8 px; si no, 0): lo que tapa la barra\n // cuando se queda fija. Al cambiar eso también cambia su ancho (sus márgenes), y el ResizeObserver lo vuelve a medir\n // OJO: en el teléfono con vidrio la barra flota ABAJO (como la de Safari): arriba no tapa nada y se publica 0; si no,\n // lo que se pega arriba al deslizar dejaba un hueco del alto de una barra que ya no está ahí\n const publishHeight = () => {\n const box = element.getBoundingClientRect();\n const isAtBottom = box.top > window.innerHeight / 2;\n const stickyTopPixels = Number.parseFloat(window.getComputedStyle(element).top) || 0;\n const coveredPixels = isAtBottom ? 0 : Math.round(box.height + stickyTopPixels);\n rootStyle.setProperty(APP_BAR_HEIGHT_CSS_VARIABLE, `${coveredPixels}px`);\n };\n\n publishHeight();\n const resizeObserver = new ResizeObserver(publishHeight);\n resizeObserver.observe(element);\n // al cambiar de ancho la barra puede pasar de arriba a abajo sin cambiar de tamaño\n window.addEventListener('resize', publishHeight);\n\n return () => {\n resizeObserver.disconnect();\n window.removeEventListener('resize', publishHeight);\n rootStyle.removeProperty(APP_BAR_HEIGHT_CSS_VARIABLE);\n };\n }, []);\n\n return appBarElement;\n}\n"],"names":[],"mappings":";;AAeY,MAAC,8BAA8B;AAG3C,MAAM,uCAAuC;AAI7C,MAAM,yBAAyB,OAAO,WAAW,cAAc,YAAY;AAG3E,MAAM,sCAAsC;AAGhC,MAAC,iBAAiB,OAAO,2BAA2B,KAAK,oCAAoC;AAG7F,MAAC,8BAA8B,QAAQ,cAAc,MAAM,mCAAmC;AAQnG,SAAS,2BAA2B;AACvC,QAAM,gBAAgB,OAAO,IAAI;AAEjC,yBAAuB,MAAM;AACzB,UAAM,UAAU,cAAc;AAE9B,QAAI,CAAC,WAAW,OAAO,mBAAmB,aAAa;AACnD,aAAO;AAAA,IACX;AACA,UAAM,YAAY,SAAS,gBAAgB;AAK3C,UAAM,gBAAgB,MAAM;AACxB,YAAM,MAAM,QAAQ,sBAAqB;AACzC,YAAM,aAAa,IAAI,MAAM,OAAO,cAAc;AAClD,YAAM,kBAAkB,OAAO,WAAW,OAAO,iBAAiB,OAAO,EAAE,GAAG,KAAK;AACnF,YAAM,gBAAgB,aAAa,IAAI,KAAK,MAAM,IAAI,SAAS,eAAe;AAC9E,gBAAU,YAAY,6BAA6B,GAAG,aAAa,IAAI;AAAA,IAC3E;AAEA,kBAAa;AACb,UAAM,iBAAiB,IAAI,eAAe,aAAa;AACvD,mBAAe,QAAQ,OAAO;AAE9B,WAAO,iBAAiB,UAAU,aAAa;AAE/C,WAAO,MAAM;AACT,qBAAe,WAAU;AACzB,aAAO,oBAAoB,UAAU,aAAa;AAClD,gBAAU,eAAe,2BAA2B;AAAA,IACxD;AAAA,EACJ,GAAG,CAAA,CAAE;AAEL,SAAO;AACX;"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import Box from "@mui/material/Box";
|
|
5
|
+
import Table from "@mui/material/Table";
|
|
6
|
+
import TableBody from "@mui/material/TableBody";
|
|
7
|
+
import TableCell from "@mui/material/TableCell";
|
|
8
|
+
import TableRow from "@mui/material/TableRow";
|
|
9
|
+
import Typography from "@mui/material/Typography";
|
|
10
|
+
import { ResponsiveContainer, BarChart, XAxis, YAxis, Tooltip, Bar, LabelList } from "recharts";
|
|
11
|
+
import { formatNumber } from "../../formatting.js";
|
|
12
|
+
import ChartTooltip from "./ChartTooltip.js";
|
|
13
|
+
import TableToggle from "./TableToggle.js";
|
|
14
|
+
import { BAR_MIN_POINT_SIZE, barLabelValueOf } from "./barListLabels.js";
|
|
15
|
+
const ROW_HEIGHT_PIXELS = 36;
|
|
16
|
+
const TEXT_COLOR = "var(--mui-palette-text-primary)";
|
|
17
|
+
const MUTED_COLOR = "var(--mui-palette-text-secondary)";
|
|
18
|
+
function ValueLabel({ x, y, width, height, value }) {
|
|
19
|
+
return /* @__PURE__ */ jsxs("text", { x: x + width + 8, y: y + height / 2, dominantBaseline: "central", fontSize: 13, children: [
|
|
20
|
+
/* @__PURE__ */ jsx("tspan", { fill: TEXT_COLOR, fontWeight: 600, children: formatNumber(value.value) }),
|
|
21
|
+
value.detail && /* @__PURE__ */ jsx("tspan", { fill: MUTED_COLOR, fontSize: 12, children: ` ${value.detail}` })
|
|
22
|
+
] });
|
|
23
|
+
}
|
|
24
|
+
function BarList({ items, onSelect, emptyLabel, tone = "primary" }) {
|
|
25
|
+
const [asTable, setAsTable] = useState(false);
|
|
26
|
+
if (!items.length) {
|
|
27
|
+
return /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: emptyLabel });
|
|
28
|
+
}
|
|
29
|
+
const labelWidth = Math.min(220, 16 + Math.max(...items.map((item) => String(item.label ?? "").length)) * 7);
|
|
30
|
+
const longestValue = Math.max(...items.map((item) => `${formatNumber(item.value)} ${item.detail ?? ""}`.length));
|
|
31
|
+
return /* @__PURE__ */ jsxs(Box, { children: [
|
|
32
|
+
/* @__PURE__ */ jsx(TableToggle, { asTable, onToggle: () => setAsTable((current) => !current) }),
|
|
33
|
+
asTable ? /* @__PURE__ */ jsx(Table, { size: "small", children: /* @__PURE__ */ jsx(TableBody, { children: items.map((item) => /* @__PURE__ */ jsxs(
|
|
34
|
+
TableRow,
|
|
35
|
+
{
|
|
36
|
+
hover: Boolean(onSelect),
|
|
37
|
+
onClick: onSelect ? () => onSelect(item) : void 0,
|
|
38
|
+
sx: { cursor: onSelect ? "pointer" : "default" },
|
|
39
|
+
children: [
|
|
40
|
+
/* @__PURE__ */ jsx(TableCell, { children: item.label }),
|
|
41
|
+
/* @__PURE__ */ jsxs(TableCell, { align: "right", children: [
|
|
42
|
+
formatNumber(item.value),
|
|
43
|
+
" ",
|
|
44
|
+
item.detail
|
|
45
|
+
] })
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
item.key
|
|
49
|
+
)) }) }) : /* @__PURE__ */ jsx(Box, { sx: { height: items.length * ROW_HEIGHT_PIXELS, color: `${tone}.main` }, children: /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxs(BarChart, { data: items, layout: "vertical", margin: { top: 0, bottom: 0, left: 0, right: 16 + longestValue * 7 }, children: [
|
|
50
|
+
/* @__PURE__ */ jsx(XAxis, { type: "number", hide: true, domain: [0, (dataMax) => Math.max(dataMax, 1)] }),
|
|
51
|
+
/* @__PURE__ */ jsx(
|
|
52
|
+
YAxis,
|
|
53
|
+
{
|
|
54
|
+
type: "category",
|
|
55
|
+
dataKey: "label",
|
|
56
|
+
width: labelWidth,
|
|
57
|
+
tickLine: false,
|
|
58
|
+
axisLine: false,
|
|
59
|
+
tick: { fill: TEXT_COLOR, fontSize: 13 }
|
|
60
|
+
}
|
|
61
|
+
),
|
|
62
|
+
/* @__PURE__ */ jsx(
|
|
63
|
+
Tooltip,
|
|
64
|
+
{
|
|
65
|
+
cursor: { fill: "var(--mui-palette-action-hover)" },
|
|
66
|
+
content: /* @__PURE__ */ jsx(ChartTooltip, { render: (item) => item.tooltip ?? `${item.label}: ${formatNumber(item.value)}` })
|
|
67
|
+
}
|
|
68
|
+
),
|
|
69
|
+
/* @__PURE__ */ jsx(
|
|
70
|
+
Bar,
|
|
71
|
+
{
|
|
72
|
+
dataKey: "value",
|
|
73
|
+
fill: "currentColor",
|
|
74
|
+
maxBarSize: 16,
|
|
75
|
+
radius: [0, 4, 4, 0],
|
|
76
|
+
isAnimationActive: false,
|
|
77
|
+
minPointSize: BAR_MIN_POINT_SIZE,
|
|
78
|
+
cursor: onSelect ? "pointer" : "default",
|
|
79
|
+
onClick: onSelect ? (entry) => onSelect(entry.payload) : void 0,
|
|
80
|
+
children: /* @__PURE__ */ jsx(LabelList, { valueAccessor: barLabelValueOf, content: (labelProps) => /* @__PURE__ */ jsx(ValueLabel, { ...labelProps }) })
|
|
81
|
+
}
|
|
82
|
+
)
|
|
83
|
+
] }) }) })
|
|
84
|
+
] });
|
|
85
|
+
}
|
|
86
|
+
export {
|
|
87
|
+
BarList as default
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=BarList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BarList.js","sources":["../../../src/ui/metrics/BarList.jsx"],"sourcesContent":["// Barras horizontales de UNA serie con su nombre a la izquierda y su valor en la punta (ventas por producto,\n// cuentas por organización), dibujadas con Recharts.\n//\n// Horizontales porque los nombres son largos (\"Empresa / Área de ventas\"): se leen completos sin rotarlos. Una serie → un\n// color (el del tono, vía currentColor: los atributos SVG no leen var(...) pero sí currentColor); el valor va en tinta,\n// nunca del color de la barra; y cada barra puede llevar a la pantalla que la explica.\n//\n// OJO: el número y el detalle de la punta salen del renglón de la barra (barListLabels.js), nunca de items[index]: Recharts\n// descarta las barras de ancho 0 y renumera las etiquetas, y el detalle se corría al renglón de arriba.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useState} from 'react';\nimport Box from '@mui/material/Box';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\nimport TableRow from '@mui/material/TableRow';\nimport Typography from '@mui/material/Typography';\nimport {Bar, BarChart, LabelList, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';\n\nimport {formatNumber} from '@/formatting.js';\nimport ChartTooltip from '@/ui/metrics/ChartTooltip.jsx';\nimport TableToggle from '@/ui/metrics/TableToggle.jsx';\nimport {BAR_MIN_POINT_SIZE, barLabelValueOf} from '@/ui/metrics/barListLabels.js';\n\nconst ROW_HEIGHT_PIXELS = 36;\nconst TEXT_COLOR = 'var(--mui-palette-text-primary)';\nconst MUTED_COLOR = 'var(--mui-palette-text-secondary)';\n\n/** El valor en la punta: el número fuerte y el detalle (\"de 8\") tenue; value es {value, detail} de barLabelValueOf. */\nfunction ValueLabel({x, y, width, height, value}) {\n return (\n <text x={x + width + 8} y={y + height / 2} dominantBaseline=\"central\" fontSize={13}>\n <tspan fill={TEXT_COLOR} fontWeight={600}>{formatNumber(value.value)}</tspan>\n {value.detail && <tspan fill={MUTED_COLOR} fontSize={12}>{` ${value.detail}`}</tspan>}\n </text>\n );\n}\n\n/**\n * @param {object} props\n * @param {Array<{key: string, label: string, value: number, detail?: string, tooltip?: string}>} props.items\n * @param {(item: any) => void} [props.onSelect] recibe el renglón de items que se picó\n * @param {string} props.emptyLabel ya traducido\n * @param {'primary'|'success'|'warning'|'error'|'info'} [props.tone]\n */\nexport default function BarList({items, onSelect, emptyLabel, tone = 'primary'}) {\n const [asTable, setAsTable] = useState(false);\n\n // guard clause: sin datos se dice, no se pinta un eje vacío\n if (!items.length) {\n return <Typography variant=\"body2\" color=\"text.secondary\">{emptyLabel}</Typography>;\n }\n\n // lo más largo de la etiqueta decide el ancho del eje: sin esto el nombre se corta o sobra medio contenedor\n // OJO: String(... ?? '') porque un renglón sin nombre (catálogo dado de baja) tumbaba toda la gráfica\n // OJO: 220 px de tope. Con 160 se cortaban etiquetas largas («Cuenta pendiente de activar») sin puntos suspensivos\n // ni forma de leerlas; el tooltip de la barra sigue mostrando el texto completo\n const labelWidth = Math.min(220, 16 + Math.max(...items.map((item) => String(item.label ?? '').length)) * 7);\n const longestValue = Math.max(...items.map((item) => `${formatNumber(item.value)} ${item.detail ?? ''}`.length));\n\n return (\n <Box>\n <TableToggle asTable={asTable} onToggle={() => setAsTable((current) => !current)} />\n {asTable ? (\n <Table size=\"small\">\n <TableBody>\n {items.map((item) => (\n <TableRow key={item.key} hover={Boolean(onSelect)} onClick={onSelect ? () => onSelect(item) : undefined}\n sx={{cursor: onSelect ? 'pointer' : 'default'}}>\n <TableCell>{item.label}</TableCell>\n <TableCell align=\"right\">{formatNumber(item.value)} {item.detail}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n ) : (\n <Box sx={{height: items.length * ROW_HEIGHT_PIXELS, color: `${tone}.main`}}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart data={items} layout=\"vertical\" margin={{top: 0, bottom: 0, left: 0, right: 16 + longestValue * 7}}>\n {/* OJO: con todo en 0 el dominio [0, 0] manda el 0 a la MITAD del eje (escala degenerada de d3) y la\n barra de 1 px con su «0 de 2» saldría a medio renglón; el tope mínimo de 1 lo deja en el origen */}\n <XAxis type=\"number\" hide domain={[0, (dataMax) => Math.max(dataMax, 1)]} />\n <YAxis type=\"category\" dataKey=\"label\" width={labelWidth} tickLine={false} axisLine={false}\n tick={{fill: TEXT_COLOR, fontSize: 13}} />\n <Tooltip cursor={{fill: 'var(--mui-palette-action-hover)'}}\n content={<ChartTooltip render={(item) => item.tooltip ?? `${item.label}: ${formatNumber(item.value)}`} />} />\n <Bar dataKey=\"value\" fill=\"currentColor\" maxBarSize={16} radius={[0, 4, 4, 0]} isAnimationActive={false}\n minPointSize={BAR_MIN_POINT_SIZE} cursor={onSelect ? 'pointer' : 'default'}\n onClick={onSelect ? (entry) => onSelect(entry.payload) : undefined}>\n {/* OJO: SIN dataKey; con dataKey LabelList ignora valueAccessor y regresa el índice corrido */}\n <LabelList valueAccessor={barLabelValueOf} content={(labelProps) => <ValueLabel {...labelProps} />} />\n </Bar>\n </BarChart>\n </ResponsiveContainer>\n </Box>\n )}\n </Box>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useMemo } from "react";
|
|
4
|
+
import { useToolkitTranslation } from "../../toolkit/useToolkitTranslation.js";
|
|
5
|
+
import Box from "@mui/material/Box";
|
|
6
|
+
import Stack from "@mui/material/Stack";
|
|
7
|
+
import Table from "@mui/material/Table";
|
|
8
|
+
import TableBody from "@mui/material/TableBody";
|
|
9
|
+
import TableCell from "@mui/material/TableCell";
|
|
10
|
+
import TableHead from "@mui/material/TableHead";
|
|
11
|
+
import TableRow from "@mui/material/TableRow";
|
|
12
|
+
import Tooltip from "@mui/material/Tooltip";
|
|
13
|
+
import Typography from "@mui/material/Typography";
|
|
14
|
+
import { formatDate, formatNumber, formatMonthShortName, formatWeekdayShortName } from "../../formatting.js";
|
|
15
|
+
import { calendarWeeksOf, levelOf, HEATMAP_LEVELS } from "./heatmapScale.js";
|
|
16
|
+
import TableToggle from "./TableToggle.js";
|
|
17
|
+
const CELL_PIXELS = { xs: 12, md: 16 };
|
|
18
|
+
const GAP_PIXELS = 3;
|
|
19
|
+
const LABELED_WEEKDAYS = /* @__PURE__ */ new Set([1, 3, 5]);
|
|
20
|
+
const LEVEL_TONE_PERCENT = { 1: 30, 2: 55, 3: 78, 4: 100 };
|
|
21
|
+
function levelFill(theme, tone, level) {
|
|
22
|
+
const { palette } = theme.vars ?? theme;
|
|
23
|
+
if (level === 0) {
|
|
24
|
+
return palette.action.hover;
|
|
25
|
+
}
|
|
26
|
+
return `color-mix(in srgb, ${palette[tone].main} ${LEVEL_TONE_PERCENT[level]}%, transparent)`;
|
|
27
|
+
}
|
|
28
|
+
function CalendarHeatmap({ startsOn, endsOn, days, ariaLabel, valueLabel, describeValue, summary, emptyLabel, tone = "primary" }) {
|
|
29
|
+
const { t } = useToolkitTranslation("common");
|
|
30
|
+
const [asTable, setAsTable] = useState(false);
|
|
31
|
+
const { weeks, monthMarks, thresholds } = useMemo(() => calendarWeeksOf({ startsOn, endsOn, days }), [startsOn, endsOn, days]);
|
|
32
|
+
const activeDays = days.filter((day) => day.value > 0);
|
|
33
|
+
return /* @__PURE__ */ jsxs(Box, { children: [
|
|
34
|
+
/* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 2, sx: { justifyContent: "space-between", alignItems: "center", mb: 1 }, children: [
|
|
35
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: activeDays.length ? summary : emptyLabel }),
|
|
36
|
+
/* @__PURE__ */ jsx(Box, { sx: { flexShrink: 0 }, children: /* @__PURE__ */ jsx(TableToggle, { asTable, onToggle: () => setAsTable((current) => !current) }) })
|
|
37
|
+
] }),
|
|
38
|
+
asTable ? /* @__PURE__ */ jsx(Box, { sx: { maxHeight: 260, overflowY: "auto" }, children: /* @__PURE__ */ jsxs(Table, { size: "small", "aria-label": ariaLabel, children: [
|
|
39
|
+
/* @__PURE__ */ jsx(TableHead, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
|
|
40
|
+
/* @__PURE__ */ jsx(TableCell, { children: t("charts.day") }),
|
|
41
|
+
/* @__PURE__ */ jsx(TableCell, { align: "right", children: valueLabel }),
|
|
42
|
+
/* @__PURE__ */ jsx(TableCell, {})
|
|
43
|
+
] }) }),
|
|
44
|
+
/* @__PURE__ */ jsx(TableBody, { children: [...activeDays].reverse().map((day) => /* @__PURE__ */ jsxs(TableRow, { children: [
|
|
45
|
+
/* @__PURE__ */ jsx(TableCell, { sx: { whiteSpace: "nowrap" }, children: formatDate(day.date) }),
|
|
46
|
+
/* @__PURE__ */ jsx(TableCell, { align: "right", sx: { fontVariantNumeric: "tabular-nums" }, children: formatNumber(day.value) }),
|
|
47
|
+
/* @__PURE__ */ jsx(TableCell, { sx: { color: "text.secondary" }, children: day.detail })
|
|
48
|
+
] }, day.date)) })
|
|
49
|
+
] }) }) : (
|
|
50
|
+
// el calendario no se encoge: en pantallas angostas se desliza y arranca mostrando lo más reciente
|
|
51
|
+
/* @__PURE__ */ jsx(
|
|
52
|
+
Box,
|
|
53
|
+
{
|
|
54
|
+
sx: { overflowX: "auto", pb: 0.5 },
|
|
55
|
+
ref: (node) => {
|
|
56
|
+
if (node) {
|
|
57
|
+
node.scrollLeft = node.scrollWidth;
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
children: /* @__PURE__ */ jsxs(
|
|
61
|
+
Box,
|
|
62
|
+
{
|
|
63
|
+
role: "img",
|
|
64
|
+
"aria-label": ariaLabel,
|
|
65
|
+
sx: {
|
|
66
|
+
display: "inline-grid",
|
|
67
|
+
gridTemplateColumns: {
|
|
68
|
+
xs: `auto repeat(${weeks.length}, ${CELL_PIXELS.xs}px)`,
|
|
69
|
+
md: `auto repeat(${weeks.length}, ${CELL_PIXELS.md}px)`
|
|
70
|
+
},
|
|
71
|
+
columnGap: `${GAP_PIXELS}px`,
|
|
72
|
+
rowGap: `${GAP_PIXELS}px`,
|
|
73
|
+
alignItems: "center"
|
|
74
|
+
},
|
|
75
|
+
children: [
|
|
76
|
+
/* @__PURE__ */ jsx(Box, {}),
|
|
77
|
+
monthMarks.map((month, column) => /* @__PURE__ */ jsx(
|
|
78
|
+
Typography,
|
|
79
|
+
{
|
|
80
|
+
variant: "caption",
|
|
81
|
+
color: "text.secondary",
|
|
82
|
+
sx: { fontSize: 10, lineHeight: 1, whiteSpace: "nowrap", overflow: "visible", width: CELL_PIXELS },
|
|
83
|
+
children: month ? formatMonthShortName(month) : ""
|
|
84
|
+
},
|
|
85
|
+
`month-${column}`
|
|
86
|
+
)),
|
|
87
|
+
[1, 2, 3, 4, 5, 6, 7].map((isoWeekday) => /* @__PURE__ */ jsxs(Box, { sx: { display: "contents" }, children: [
|
|
88
|
+
/* @__PURE__ */ jsx(
|
|
89
|
+
Typography,
|
|
90
|
+
{
|
|
91
|
+
variant: "caption",
|
|
92
|
+
color: "text.secondary",
|
|
93
|
+
sx: { fontSize: 10, lineHeight: { xs: `${CELL_PIXELS.xs}px`, md: `${CELL_PIXELS.md}px` }, pr: 0.75 },
|
|
94
|
+
children: LABELED_WEEKDAYS.has(isoWeekday) ? formatWeekdayShortName(isoWeekday) : ""
|
|
95
|
+
}
|
|
96
|
+
),
|
|
97
|
+
weeks.map((week, column) => {
|
|
98
|
+
const day = week[isoWeekday - 1];
|
|
99
|
+
if (!day) {
|
|
100
|
+
return /* @__PURE__ */ jsx(Box, {}, `outside-${column}-${isoWeekday}`);
|
|
101
|
+
}
|
|
102
|
+
const level = levelOf(day.value, thresholds);
|
|
103
|
+
return /* @__PURE__ */ jsx(
|
|
104
|
+
Tooltip,
|
|
105
|
+
{
|
|
106
|
+
arrow: true,
|
|
107
|
+
disableInteractive: true,
|
|
108
|
+
title: `${formatDate(day.date)}: ${describeValue(day.value)}${day.detail ? ` · ${day.detail}` : ""}`,
|
|
109
|
+
children: /* @__PURE__ */ jsx(Box, { sx: (theme) => ({ width: CELL_PIXELS, height: CELL_PIXELS, borderRadius: "3px", bgcolor: levelFill(theme, tone, level) }) })
|
|
110
|
+
},
|
|
111
|
+
day.date
|
|
112
|
+
);
|
|
113
|
+
})
|
|
114
|
+
] }, `weekday-${isoWeekday}`))
|
|
115
|
+
]
|
|
116
|
+
}
|
|
117
|
+
)
|
|
118
|
+
}
|
|
119
|
+
)
|
|
120
|
+
),
|
|
121
|
+
!asTable && /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 0.5, sx: { alignItems: "center", justifyContent: "flex-end", mt: 1 }, "aria-hidden": "true", children: [
|
|
122
|
+
/* @__PURE__ */ jsx(Typography, { variant: "caption", color: "text.secondary", sx: { mr: 0.5 }, children: t("charts.less") }),
|
|
123
|
+
HEATMAP_LEVELS.map((level) => /* @__PURE__ */ jsx(Box, { sx: (theme) => ({ width: CELL_PIXELS, height: CELL_PIXELS, borderRadius: "3px", bgcolor: levelFill(theme, tone, level) }) }, level)),
|
|
124
|
+
/* @__PURE__ */ jsx(Typography, { variant: "caption", color: "text.secondary", sx: { ml: 0.5 }, children: t("charts.more") })
|
|
125
|
+
] })
|
|
126
|
+
] });
|
|
127
|
+
}
|
|
128
|
+
export {
|
|
129
|
+
CalendarHeatmap as default
|
|
130
|
+
};
|
|
131
|
+
//# sourceMappingURL=CalendarHeatmap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CalendarHeatmap.js","sources":["../../../src/ui/metrics/CalendarHeatmap.jsx"],"sourcesContent":["// Calendario de actividad: un cuadro por día, semanas en columnas (el de GitHub).\n//\n// Sirve para ver RITMO de un vistazo: qué días llegan cargas, si hubo semanas muertas, si la actividad crece. Las\n// reglas de visualización:\n// - es MAGNITUD, así que va un solo tono de claro a oscuro (el del tono que se pida), en cuatro niveles más \"sin\n// actividad\". Nunca un arcoíris. Se arma con color-mix sobre el color del tema (su variable CSS si el tema las usa),\n// sin hexadecimales: en modo oscuro los mismos niveles se ven sobre su propia superficie;\n// - los niveles se cortan por CUARTILES de los días con actividad (heatmapScale.js), no por valores fijos;\n// - leyenda \"Menos → Más\", tooltip por día con el número exacto (el color solo nunca dice cuánto) y VISTA DE TABLA\n// (para lector de pantalla, para quien no distingue el tono y para copiar los números).\n//\n// Sin librería a propósito: el Heatmap de MUI X Charts es de la edición Pro, que pide licencia.\n//\n// Textos por props y del paquete, y fechas con los formatos del paquete.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useMemo, useState} from 'react';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\n\nimport {formatDate, formatMonthShortName, formatNumber, formatWeekdayShortName} from '@/formatting.js';\nimport {HEATMAP_LEVELS, calendarWeeksOf, levelOf} from '@/ui/metrics/heatmapScale.js';\nimport TableToggle from '@/ui/metrics/TableToggle.jsx';\n\n// cuadros de 12 px en teléfono (el calendario se desliza) y de 16 px desde md, donde el panel ocupa todo el ancho\nconst CELL_PIXELS = {xs: 12, md: 16};\nconst GAP_PIXELS = 3;\n// solo lunes, miércoles y viernes llevan rótulo: los siete encimados no se leen a 12 px\nconst LABELED_WEEKDAYS = new Set([1, 3, 5]);\n// porcentaje del tono en cada nivel; el nivel 0 es el gris de \"hover\" del tema\nconst LEVEL_TONE_PERCENT = {1: 30, 2: 55, 3: 78, 4: 100};\n\n/**\n * Relleno de un nivel con los colores del tema.\n *\n * @param {object} theme tema de MUI (con o sin variables CSS)\n * @param {string} tone primary, info, success...\n * @param {number} level 0 a 4\n * @returns {string} color CSS\n */\nfunction levelFill(theme, tone, level) {\n // un tema con variables CSS las trae en theme.vars; el tema por omisión de MUI, solo en theme.palette\n const {palette} = theme.vars ?? theme;\n if (level === 0) {\n return palette.action.hover;\n }\n return `color-mix(in srgb, ${palette[tone].main} ${LEVEL_TONE_PERCENT[level]}%, transparent)`;\n}\n\n/**\n * @param {object} props\n * @param {string} props.startsOn primer día del rango (\"2025-09-16\"), fecha de calendario\n * @param {string} props.endsOn último día del rango (\"2026-09-15\")\n * @param {Array<{date: string, value: number, detail?: string}>} props.days solo los días con actividad; el resto vale\n * 0\n * @param {string} props.ariaLabel qué muestra el calendario, ya traducido\n * @param {string} props.valueLabel encabezado de la columna de valor en la tabla (\"Registros leídos\")\n * @param {(value: number) => string} props.describeValue el valor en palabras para el tooltip (\"120 registros leídos\")\n * @param {import('react').ReactNode} [props.summary] renglón de resumen arriba del calendario\n * @param {string} [props.emptyLabel] qué decir si ningún día tiene actividad\n * @param {'primary'|'info'|'success'|'warning'|'error'} [props.tone]\n */\nexport default function CalendarHeatmap({startsOn, endsOn, days, ariaLabel, valueLabel, describeValue, summary, emptyLabel, tone = 'primary'}) {\n const {t} = useToolkitTranslation('common');\n const [asTable, setAsTable] = useState(false);\n\n const {weeks, monthMarks, thresholds} = useMemo(() => calendarWeeksOf({startsOn, endsOn, days}), [startsOn, endsOn, days]);\n const activeDays = days.filter((day) => day.value > 0);\n\n return (\n <Box>\n <Stack direction=\"row\" spacing={2} sx={{justifyContent: 'space-between', alignItems: 'center', mb: 1}}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {activeDays.length ? summary : emptyLabel}\n </Typography>\n <Box sx={{flexShrink: 0}}>\n <TableToggle asTable={asTable} onToggle={() => setAsTable((current) => !current)} />\n </Box>\n </Stack>\n\n {asTable ? (\n <Box sx={{maxHeight: 260, overflowY: 'auto'}}>\n <Table size=\"small\" aria-label={ariaLabel}>\n <TableHead>\n <TableRow>\n <TableCell>{t('charts.day')}</TableCell>\n <TableCell align=\"right\">{valueLabel}</TableCell>\n <TableCell />\n </TableRow>\n </TableHead>\n <TableBody>\n {[...activeDays].reverse().map((day) => (\n <TableRow key={day.date}>\n <TableCell sx={{whiteSpace: 'nowrap'}}>{formatDate(day.date)}</TableCell>\n <TableCell align=\"right\" sx={{fontVariantNumeric: 'tabular-nums'}}>{formatNumber(day.value)}</TableCell>\n <TableCell sx={{color: 'text.secondary'}}>{day.detail}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </Box>\n ) : (\n // el calendario no se encoge: en pantallas angostas se desliza y arranca mostrando lo más reciente\n <Box sx={{overflowX: 'auto', pb: 0.5}}\n ref={(node) => {\n if (node) {\n node.scrollLeft = node.scrollWidth;\n }\n }}>\n <Box role=\"img\" aria-label={ariaLabel}\n sx={{\n display: 'inline-grid',\n gridTemplateColumns: {\n xs: `auto repeat(${weeks.length}, ${CELL_PIXELS.xs}px)`,\n md: `auto repeat(${weeks.length}, ${CELL_PIXELS.md}px)`,\n },\n columnGap: `${GAP_PIXELS}px`,\n rowGap: `${GAP_PIXELS}px`,\n alignItems: 'center',\n }}>\n <Box />\n {monthMarks.map((month, column) => (\n <Typography key={`month-${column}`} variant=\"caption\" color=\"text.secondary\"\n sx={{fontSize: 10, lineHeight: 1, whiteSpace: 'nowrap', overflow: 'visible', width: CELL_PIXELS}}>\n {month ? formatMonthShortName(month) : ''}\n </Typography>\n ))}\n {[1, 2, 3, 4, 5, 6, 7].map((isoWeekday) => (\n <Box key={`weekday-${isoWeekday}`} sx={{display: 'contents'}}>\n <Typography variant=\"caption\" color=\"text.secondary\"\n sx={{fontSize: 10, lineHeight: {xs: `${CELL_PIXELS.xs}px`, md: `${CELL_PIXELS.md}px`}, pr: 0.75}}>\n {LABELED_WEEKDAYS.has(isoWeekday) ? formatWeekdayShortName(isoWeekday) : ''}\n </Typography>\n {weeks.map((week, column) => {\n const day = week[isoWeekday - 1];\n if (!day) {\n return <Box key={`outside-${column}-${isoWeekday}`} />;\n }\n const level = levelOf(day.value, thresholds);\n return (\n <Tooltip key={day.date} arrow disableInteractive\n title={`${formatDate(day.date)}: ${describeValue(day.value)}${day.detail ? ` · ${day.detail}` : ''}`}>\n <Box sx={(theme) => ({width: CELL_PIXELS, height: CELL_PIXELS, borderRadius: '3px', bgcolor: levelFill(theme, tone, level)})} />\n </Tooltip>\n );\n })}\n </Box>\n ))}\n </Box>\n </Box>\n )}\n\n {!asTable && (\n <Stack direction=\"row\" spacing={0.5} sx={{alignItems: 'center', justifyContent: 'flex-end', mt: 1}} aria-hidden=\"true\">\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{mr: 0.5}}>{t('charts.less')}</Typography>\n {HEATMAP_LEVELS.map((level) => (\n <Box key={level} sx={(theme) => ({width: CELL_PIXELS, height: CELL_PIXELS, borderRadius: '3px', bgcolor: levelFill(theme, tone, level)})} />\n ))}\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ml: 0.5}}>{t('charts.more')}</Typography>\n </Stack>\n )}\n </Box>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import Paper from "@mui/material/Paper";
|
|
4
|
+
import Typography from "@mui/material/Typography";
|
|
5
|
+
import { isGlassTheme, glassStylesOf } from "../../theme/glassSurface.js";
|
|
6
|
+
const CHART_TOOLTIP_OPACITY = 0.92;
|
|
7
|
+
function ChartTooltip({ active, payload, render }) {
|
|
8
|
+
if (!active || !payload?.length) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
return /* @__PURE__ */ jsx(Paper, { elevation: 3, sx: [{ px: 1.5, py: 1, pointerEvents: "none" }, (theme) => isGlassTheme(theme) ? glassStylesOf(theme, { opacity: CHART_TOOLTIP_OPACITY }) : {}], children: /* @__PURE__ */ jsx(Typography, { variant: "body2", children: render(payload[0].payload) }) });
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
ChartTooltip as default
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=ChartTooltip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChartTooltip.js","sources":["../../../src/ui/metrics/ChartTooltip.jsx"],"sourcesContent":["// El tooltip de las gráficas de Recharts con el look de la app.\n//\n// El de Recharts trae su propio estilo (fondo blanco, borde gris); este usa el Paper del tema y habla igual que los\n// tooltips del resto de la app (y se voltea solo cuando llegue el modo oscuro). Con el vidrio del tema\n// (createToolkitTheme({glass: true})) es de vidrio: flota sobre la gráfica.\n//\n// Genérico del paquete: function (regla de la casa).\nimport Paper from '@mui/material/Paper';\nimport Typography from '@mui/material/Typography';\n\nimport {glassStylesOf, isGlassTheme} from '@/theme/glassSurface.js';\n\n/**\n * @param {{active?: boolean, payload?: Array<{payload: any}>, render: (item: any) => import('react').ReactNode}} props\n */\n// el vidrio del cuadrito, casi opaco (el material «grueso»): es para leer una cifra encima de la gráfica; con el vidrio de\n// los controles (60 %) se veía la barra de atrás a través del texto (lo reportaron)\nconst CHART_TOOLTIP_OPACITY = 0.92;\n\nexport default function ChartTooltip({active, payload, render}) {\n // guard clause: Recharts lo monta siempre; solo se pinta sobre una barra\n if (!active || !payload?.length) {\n return null;\n }\n return (\n <Paper elevation={3} sx={[{px: 1.5, py: 1, pointerEvents: 'none'}, (theme) => (isGlassTheme(theme) ? glassStylesOf(theme, {opacity: CHART_TOOLTIP_OPACITY}) : {})]}>\n <Typography variant=\"body2\">{render(payload[0].payload)}</Typography>\n </Paper>\n );\n}\n"],"names":[],"mappings":";;;;;AAiBA,MAAM,wBAAwB;AAE9B,SAAwB,aAAa,EAAC,QAAQ,SAAS,UAAS;AAE5D,MAAI,CAAC,UAAU,CAAC,SAAS,QAAQ;AAC7B,WAAO;AAAA,EACX;AACA,6BACK,OAAA,EAAM,WAAW,GAAG,IAAI,CAAC,EAAC,IAAI,KAAK,IAAI,GAAG,eAAe,OAAA,GAAS,CAAC,UAAW,aAAa,KAAK,IAAI,cAAc,OAAO,EAAC,SAAS,uBAAsB,IAAI,CAAA,CAAG,GAC7J,UAAA,oBAAC,YAAA,EAAW,SAAQ,SAAS,UAAA,OAAO,QAAQ,CAAC,EAAE,OAAO,GAAE,GAC5D;AAER;"}
|