@stackcraftmx/calcita 0.0.0-stage → 0.25.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 +700 -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 +128 -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 +83 -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 +107 -0
- package/cli/templates/project/src/app/AppShell.jsx.tpl +87 -0
- package/cli/templates/project/src/app/appRouter.jsx.tpl +51 -0
- package/cli/templates/project/src/app/appSettings.js.tpl +27 -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 +14 -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 +9 -0
- package/cli/templates/project/src/core/publicPaths.js.tpl +24 -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 +53 -0
- package/dist/DataTable/AuditTrailDialog.js +40 -0
- package/dist/DataTable/AuditTrailDialog.js.map +1 -0
- package/dist/DataTable/AuditTrailTable.js +89 -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 +51 -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 +63 -0
- package/dist/DataTable/GoToPage.js.map +1 -0
- package/dist/DataTable/ServerTable.js +477 -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/rowSelection.js +61 -0
- package/dist/DataTable/rowSelection.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 +84 -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 +27 -0
- package/dist/account/ForgotPasswordScreen.js.map +1 -0
- package/dist/account/ProfileScreen.js +134 -0
- package/dist/account/ProfileScreen.js.map +1 -0
- package/dist/account/ResetPasswordScreen.js +58 -0
- package/dist/account/ResetPasswordScreen.js.map +1 -0
- package/dist/account/SignInScreen.js +102 -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 +118 -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 +49 -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 +256 -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 +513 -0
- package/dist/appShell/AppLayout.js.map +1 -0
- package/dist/appShell/AppearanceSettings.js +116 -0
- package/dist/appShell/AppearanceSettings.js.map +1 -0
- package/dist/appShell/AuthLayout.js +46 -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 +105 -0
- package/dist/appShell/BarActions.js.map +1 -0
- package/dist/appShell/BarCapsule.js +50 -0
- package/dist/appShell/BarCapsule.js.map +1 -0
- package/dist/appShell/BarSearch.js +92 -0
- package/dist/appShell/BarSearch.js.map +1 -0
- package/dist/appShell/HeaderTools.js +53 -0
- package/dist/appShell/HeaderTools.js.map +1 -0
- package/dist/appShell/MobileTabBar.js +348 -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 +40 -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 +149 -0
- package/dist/calendar/EventCalendar.js.map +1 -0
- package/dist/calendar/EventDetails.js +74 -0
- package/dist/calendar/EventDetails.js.map +1 -0
- package/dist/calendar/calendarEvents.js +31 -0
- package/dist/calendar/calendarEvents.js.map +1 -0
- package/dist/calendar.js +13 -0
- package/dist/calendar.js.map +1 -0
- package/dist/charts.js +16 -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 +76 -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 +195 -0
- package/dist/downloads/DownloadManager.js.map +1 -0
- package/dist/downloads/downloadQueue.js +56 -0
- package/dist/downloads/downloadQueue.js.map +1 -0
- package/dist/downloads/downloadsMachine.js +80 -0
- package/dist/downloads/downloadsMachine.js.map +1 -0
- package/dist/downloads/fileTypes.js +22 -0
- package/dist/downloads/fileTypes.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 +73 -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 +256 -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 +205 -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 +63 -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 +47 -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 +338 -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/FormWizard.js +59 -0
- package/dist/hookForm/FormWizard.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 +104 -0
- package/dist/inbox/InboxLayout.js.map +1 -0
- package/dist/inbox/MessageList.js +114 -0
- package/dist/inbox/MessageList.js.map +1 -0
- package/dist/inbox/MessageView.js +104 -0
- package/dist/inbox/MessageView.js.map +1 -0
- package/dist/inbox/inboxDates.js +9 -0
- package/dist/inbox/inboxDates.js.map +1 -0
- package/dist/index.js +407 -0
- package/dist/index.js.map +1 -0
- package/dist/inputs/CatalogInput.js +66 -0
- package/dist/inputs/CatalogInput.js.map +1 -0
- package/dist/inputs/ColorInput.js +109 -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 +70 -0
- package/dist/inputs/NumberInput.js.map +1 -0
- package/dist/inputs/SelectInput.js +84 -0
- package/dist/inputs/SelectInput.js.map +1 -0
- package/dist/inputs/TextInput.js +101 -0
- package/dist/inputs/TextInput.js.map +1 -0
- package/dist/inputs/WizardLayout.js +54 -0
- package/dist/inputs/WizardLayout.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 +338 -0
- package/dist/kanban/KanbanBoard.js.map +1 -0
- package/dist/kanban/kanbanCards.js +19 -0
- package/dist/kanban/kanbanCards.js.map +1 -0
- package/dist/kanban/kanbanMoves.js +29 -0
- package/dist/kanban/kanbanMoves.js.map +1 -0
- package/dist/kanban.js +15 -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 +787 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/locales/es.js +787 -0
- package/dist/locales/es.js.map +1 -0
- package/dist/maps/MapView.js +116 -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 +77 -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 +34 -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 +70 -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 +71 -0
- package/dist/pwa/useInstallPrompt.js.map +1 -0
- package/dist/react-hook-form.js +32 -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 +80 -0
- package/dist/security/ActivityLog.js.map +1 -0
- package/dist/security/RecoveryCodesDialog.js +85 -0
- package/dist/security/RecoveryCodesDialog.js.map +1 -0
- package/dist/security/SessionsCard.js +83 -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 +37 -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/MuiDialog.js +13 -0
- package/dist/theme/components/MuiDialog.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 +28 -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/ComponentTexts.js +13 -0
- package/dist/toolkit/ComponentTexts.js.map +1 -0
- package/dist/toolkit/ToolkitProvider.js +57 -0
- package/dist/toolkit/ToolkitProvider.js.map +1 -0
- package/dist/toolkit/browserNavigation.js +33 -0
- package/dist/toolkit/browserNavigation.js.map +1 -0
- package/dist/toolkit/componentTextsContext.js +15 -0
- package/dist/toolkit/componentTextsContext.js.map +1 -0
- package/dist/toolkit/hashNavigation.js +40 -0
- package/dist/toolkit/hashNavigation.js.map +1 -0
- package/dist/toolkit/navigationPaths.js +49 -0
- package/dist/toolkit/navigationPaths.js.map +1 -0
- package/dist/toolkit/toolkitContext.js +19 -0
- package/dist/toolkit/toolkitContext.js.map +1 -0
- package/dist/toolkit/toolkitSettings.js +107 -0
- package/dist/toolkit/toolkitSettings.js.map +1 -0
- package/dist/toolkit/useFormatters.js +12 -0
- package/dist/toolkit/useFormatters.js.map +1 -0
- package/dist/toolkit/useToolkitTranslation.js +22 -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 +30 -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 +13 -0
- package/dist/types/DataTable/FilterChips.d.ts +17 -0
- package/dist/types/DataTable/GoToPage.d.ts +13 -0
- package/dist/types/DataTable/SelectionBar.d.ts +32 -0
- package/dist/types/DataTable/ServerTable.d.ts +171 -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/rowSelection.d.ts +113 -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 +23 -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 +9 -0
- package/dist/types/account/DemoTotpCodeButton.d.ts +6 -0
- package/dist/types/account/ForgotPasswordScreen.d.ts +17 -0
- package/dist/types/account/ProfileScreen.d.ts +43 -0
- package/dist/types/account/ResetPasswordScreen.d.ts +21 -0
- package/dist/types/account/SignInScreen.d.ts +27 -0
- package/dist/types/account/accountConnector.d.ts +268 -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 +42 -0
- package/dist/types/api/ApiError.d.ts +42 -0
- package/dist/types/api/createApiClient.d.ts +174 -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 +76 -0
- package/dist/types/appShell/AppearanceSettings.d.ts +41 -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 +23 -0
- package/dist/types/appShell/BarCapsule.d.ts +20 -0
- package/dist/types/appShell/BarSearch.d.ts +24 -0
- package/dist/types/appShell/HeaderTools.d.ts +27 -0
- package/dist/types/appShell/MobileTabBar.d.ts +20 -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 +46 -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 +13 -0
- package/dist/types/auth/passwordRules.d.ts +34 -0
- package/dist/types/calendar/EventCalendar.d.ts +63 -0
- package/dist/types/calendar/EventDetails.d.ts +36 -0
- package/dist/types/calendar/calendarEvents.d.ts +27 -0
- package/dist/types/calendar.d.ts +3 -0
- package/dist/types/charts.d.ts +6 -0
- package/dist/types/date-pickers.d.ts +2 -0
- package/dist/types/datePickers/DateInput.d.ts +41 -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 +7 -0
- package/dist/types/downloads/downloadQueue.d.ts +50 -0
- package/dist/types/downloads/downloadsMachine.d.ts +10 -0
- package/dist/types/downloads/fileTypes.d.ts +39 -0
- package/dist/types/downloads/index.d.ts +4 -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 +31 -0
- package/dist/types/feedback/ModalWaiting.d.ts +13 -0
- package/dist/types/feedback/NewBuildNotice.d.ts +20 -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 +61 -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 +61 -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 +22 -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 +17 -0
- package/dist/types/forms/auth/ForgotPasswordForm.d.ts +14 -0
- package/dist/types/forms/auth/SignInForm.d.ts +20 -0
- package/dist/types/forms/index.d.ts +19 -0
- package/dist/types/forms/security/SecondStepForm.d.ts +30 -0
- package/dist/types/forms/security/TwoStepVerificationCard.d.ts +83 -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/FormWizard.d.ts +22 -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 +38 -0
- package/dist/types/inbox/MessageList.d.ts +52 -0
- package/dist/types/inbox/MessageView.d.ts +55 -0
- package/dist/types/inbox/inboxDates.d.ts +11 -0
- package/dist/types/index.d.ts +91 -0
- package/dist/types/inputs/CatalogInput.d.ts +45 -0
- package/dist/types/inputs/ColorInput.d.ts +30 -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 +38 -0
- package/dist/types/inputs/SelectInput.d.ts +38 -0
- package/dist/types/inputs/TextInput.d.ts +62 -0
- package/dist/types/inputs/WizardLayout.d.ts +34 -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 +88 -0
- package/dist/types/kanban/kanbanCards.d.ts +22 -0
- package/dist/types/kanban/kanbanMoves.d.ts +38 -0
- package/dist/types/kanban.d.ts +3 -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 +788 -0
- package/dist/types/locales/es.d.ts +788 -0
- package/dist/types/maps/MapView.d.ts +41 -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 +18 -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 +7 -0
- package/dist/types/pwa/InstallInstructionsDialog.d.ts +20 -0
- package/dist/types/pwa/InstallPromptBanner.d.ts +16 -0
- package/dist/types/pwa/installInstructions.d.ts +52 -0
- package/dist/types/pwa/useInstallPrompt.d.ts +13 -0
- package/dist/types/react-hook-form.d.ts +12 -0
- package/dist/types/react-router.d.ts +2 -0
- package/dist/types/security/ActivityLog.d.ts +33 -0
- package/dist/types/security/RecoveryCodesDialog.d.ts +16 -0
- package/dist/types/security/SessionsCard.d.ts +24 -0
- package/dist/types/security/passkeys.d.ts +18 -0
- package/dist/types/table.d.ts +3 -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/MuiDialog.d.ts +9 -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/ComponentTexts.d.ts +11 -0
- package/dist/types/toolkit/ToolkitProvider.d.ts +47 -0
- package/dist/types/toolkit/browserNavigation.d.ts +27 -0
- package/dist/types/toolkit/componentTextsContext.d.ts +20 -0
- package/dist/types/toolkit/hashNavigation.d.ts +12 -0
- package/dist/types/toolkit/navigationPaths.d.ts +43 -0
- package/dist/types/toolkit/toolkitContext.d.ts +28 -0
- package/dist/types/toolkit/toolkitSettings.d.ts +113 -0
- package/dist/types/toolkit/useFormatters.d.ts +6 -0
- package/dist/types/toolkit/useToolkitTranslation.d.ts +11 -0
- package/dist/types/ui/actions/ActionsMenu.d.ts +20 -0
- package/dist/types/ui/actions/CopyButton.d.ts +15 -0
- package/dist/types/ui/actions/DownloadMenu.d.ts +55 -0
- package/dist/types/ui/actions/SecretField.d.ts +17 -0
- package/dist/types/ui/actions/SelectionActions.d.ts +39 -0
- package/dist/types/ui/filters/DateRangeFilter.d.ts +18 -0
- package/dist/types/ui/filters/PeriodRangeSelector.d.ts +28 -0
- package/dist/types/ui/filters/QuickFilters.d.ts +23 -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/labels/tagOf.d.ts +13 -0
- package/dist/types/ui/layout/CollapsibleSection.d.ts +18 -0
- package/dist/types/ui/layout/ContentDialog.d.ts +15 -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 +35 -0
- package/dist/types/ui/layout/FullPageLoader.d.ts +7 -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 +20 -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 +25 -0
- package/dist/types/ui/metrics/CalendarHeatmap.d.ts +34 -0
- package/dist/types/ui/metrics/ChartTooltip.d.ts +11 -0
- package/dist/types/ui/metrics/ColumnChart.d.ts +47 -0
- package/dist/types/ui/metrics/LineChart.d.ts +41 -0
- package/dist/types/ui/metrics/MetricCard.d.ts +39 -0
- package/dist/types/ui/metrics/TableToggle.d.ts +14 -0
- package/dist/types/ui/metrics/barListLabels.d.ts +17 -0
- package/dist/types/ui/metrics/chartParts.d.ts +112 -0
- package/dist/types/ui/metrics/heatmapScale.d.ts +45 -0
- package/dist/types/ui/navigation/BackButton.d.ts +13 -0
- package/dist/types/ui/navigation/ColorSchemeToggle.d.ts +13 -0
- package/dist/types/ui/navigation/DocumentTitle.d.ts +6 -0
- package/dist/types/ui/navigation/FontSizeToggle.d.ts +11 -0
- package/dist/types/ui/navigation/LanguageToggle.d.ts +13 -0
- package/dist/types/ui/navigation/PageBreadcrumbs.d.ts +12 -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 +41 -0
- package/dist/types/ui/timeline/timelineDot.d.ts +19 -0
- package/dist/types/upload/FileDropzone.d.ts +36 -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/ActionsMenu.js +51 -0
- package/dist/ui/actions/ActionsMenu.js.map +1 -0
- package/dist/ui/actions/CopyButton.js +28 -0
- package/dist/ui/actions/CopyButton.js.map +1 -0
- package/dist/ui/actions/DownloadMenu.js +162 -0
- package/dist/ui/actions/DownloadMenu.js.map +1 -0
- package/dist/ui/actions/SecretField.js +61 -0
- package/dist/ui/actions/SecretField.js.map +1 -0
- package/dist/ui/actions/SelectionActions.js +142 -0
- package/dist/ui/actions/SelectionActions.js.map +1 -0
- package/dist/ui/filters/DateRangeFilter.js +87 -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/labels/tagOf.js +7 -0
- package/dist/ui/labels/tagOf.js.map +1 -0
- package/dist/ui/layout/CollapsibleSection.js +52 -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 +54 -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 +94 -0
- package/dist/ui/metrics/BarList.js.map +1 -0
- package/dist/ui/metrics/CalendarHeatmap.js +136 -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 +106 -0
- package/dist/ui/metrics/ColumnChart.js.map +1 -0
- package/dist/ui/metrics/LineChart.js +117 -0
- package/dist/ui/metrics/LineChart.js.map +1 -0
- package/dist/ui/metrics/MetricCard.js +97 -0
- package/dist/ui/metrics/MetricCard.js.map +1 -0
- package/dist/ui/metrics/TableToggle.js +15 -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/chartParts.js +93 -0
- package/dist/ui/metrics/chartParts.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 +40 -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 +41 -0
- package/dist/ui/navigation/FontSizeToggle.js.map +1 -0
- package/dist/ui/navigation/LanguageToggle.js +48 -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 +106 -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 +145 -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 +311 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chartParts.js","sources":["../../../src/ui/metrics/chartParts.jsx"],"sourcesContent":["// Lo que comparten las gráficas de tiempo de la casa (ColumnChart y LineChart): las medidas del eje de valores, la vista de\n// tabla, la leyenda de las series y el rótulo de la línea de referencia. Un solo lugar: si cambia cómo se lee una tabla o una\n// leyenda, cambia en las dos gráficas.\n//\n// Las reglas de la guía de Apple (HIG «Charts» y «Charting data»):\n// - con una serie, sin leyenda (el título ya dice qué es); con varias, leyenda;\n// - el color no va solo: cada serie de líneas lleva además su trazo (continuo, rayado, punteado) y toda gráfica tiene su\n// vista de tabla;\n// - ejes y rejilla tenues, que den contexto sin competir con los datos.\n//\n// Los colores salen del tema (useChartColors), nunca escritos como var(--mui-…): un proyecto con su propio prefijo de\n// variables (cssVarPrefix) o sin variables CSS se quedaba con ejes y texto sin color.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useMemo} 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 TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport Typography from '@mui/material/Typography';\nimport {useTheme} from '@mui/material/styles';\n\nimport {paletteOf} from '@/theme/components/paletteOf.js';\n\nconst AXIS_FONT_PIXELS = 12;\n// ancho del eje de valores: nunca menos que esto, más lo que pida su número más largo\nconst AXIS_MINIMUM_WIDTH_PIXELS = 48;\nconst AXIS_PADDING_PIXELS = 16;\n// ancho aproximado de un carácter del eje a 12 px\nconst AXIS_CHARACTER_PIXELS = 7;\n// la marca más alta del eje suele pasar del valor más alto y puede llevar un carácter más (999,999 → 1,000,000)\nconst AXIS_EXTRA_CHARACTERS = 1;\n// largo de la muestra que acompaña al rótulo de la línea de referencia y a cada serie de la leyenda\nconst SWATCH_PIXELS = 20;\n\n/** Los colores de las series, en orden, cuando la pantalla no dice el suyo: los del tema. */\nexport const CHART_SERIES_TONES = Object.freeze(['primary', 'info', 'success', 'warning', 'error', 'secondary']);\n/** El trazo de cada serie de líneas, en orden (continuo, rayado, punteado): así no se distinguen solo por el color. */\nexport const CHART_LINE_DASHES = Object.freeze(['0', '6 4', '2 3']);\n\n/**\n * Los colores de las gráficas, leídos del tema: con variables CSS salen como var(--su-prefijo-palette-…) y sirven en claro y\n * en oscuro sin volver a pintar; sin ellas, el color de la paleta.\n *\n * @returns {{palette: object, axis: string, axisText: {fill: string, fontSize: number}, grid: string, text: string, muted: string, hover: string}}\n */\nexport function useChartColors() {\n const palette = paletteOf(useTheme());\n return useMemo(() => ({\n palette,\n axis: palette.text.secondary,\n axisText: {fill: palette.text.secondary, fontSize: AXIS_FONT_PIXELS},\n grid: palette.divider,\n text: palette.text.primary,\n muted: palette.text.secondary,\n hover: palette.action.hover,\n }), [palette]);\n}\n\n/**\n * Ancho del eje de valores para que quepa su número más largo.\n *\n * @param {number} highestValue el valor más alto que se dibuja\n * @param {(value: number) => string} formatValue cómo se escribe un valor\n * @returns {number} pixeles\n */\nexport function valueAxisWidthOf(highestValue, formatValue) {\n const longestLabel = formatValue(highestValue).length + AXIS_EXTRA_CHARACTERS;\n return Math.max(AXIS_MINIMUM_WIDTH_PIXELS, AXIS_PADDING_PIXELS + longestLabel * AXIS_CHARACTER_PIXELS);\n}\n\n/**\n * Las series con su color y su trazo resueltos (lo que la pantalla no dijo, por su lugar en la lista).\n *\n * @param {Array<{key: string, label: string, tone?: string, dash?: string}>} series\n * @param {object} palette la del tema (useChartColors().palette)\n * @returns {Array<{key: string, label: string, tone: string, color: string, dash: string}>}\n */\nexport function resolvedSeriesOf(series, palette) {\n return series.map((item, index) => {\n const tone = item.tone ?? CHART_SERIES_TONES[index % CHART_SERIES_TONES.length];\n return {\n ...item,\n tone,\n color: (palette[tone] ?? palette.primary).main,\n dash: item.dash ?? CHART_LINE_DASHES[index % CHART_LINE_DASHES.length],\n };\n });\n}\n\n/**\n * El valor más alto de todas las series (y de la línea de referencia), para el ancho del eje.\n *\n * @param {Array<Record<string, any>>} data\n * @param {Array<{key: string}>} series\n * @param {{value: number}|undefined} referenceLine\n * @returns {number}\n */\nexport function highestValueOf(data, series, referenceLine) {\n const values = data.flatMap((row) => series.map((item) => Number(row[item.key]) || 0));\n return Math.max(0, ...values, referenceLine?.value ?? 0);\n}\n\n/**\n * La vista de tabla: un renglón por periodo y una columna por serie.\n *\n * @param {object} props\n * @param {Array<Record<string, any>>} props.data\n * @param {Array<{key: string, label: string}>} props.series\n * @param {string} props.periodLabel\n * @param {(value: number) => string} props.formatValue\n * @param {number} props.height\n */\nexport function ChartTable({data, series, periodLabel, formatValue, height}) {\n return (\n <Box sx={{maxHeight: height, overflowY: 'auto'}}>\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>{periodLabel}</TableCell>\n {series.map((item) => <TableCell key={item.key} align=\"right\">{item.label}</TableCell>)}\n </TableRow>\n </TableHead>\n <TableBody>\n {data.map((row) => (\n <TableRow key={row.key}>\n <TableCell>{row.label}</TableCell>\n {series.map((item) => <TableCell key={item.key} align=\"right\">{formatValue(row[item.key])}</TableCell>)}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </Box>\n );\n}\n\n/**\n * La leyenda: solo con dos series o más. Cada una con su muestra (su color y, en líneas, su trazo).\n *\n * @param {object} props\n * @param {Array<{key: string, label: string, color: string, dash: string}>} props.series ya resueltas\n * @param {boolean} [props.showsDash] la muestra con el trazo de su línea (LineChart); sin él, un cuadro de color\n * @param {string} props.ariaLabel\n */\nexport function ChartLegend({series, showsDash = false, ariaLabel}) {\n if (series.length < 2) {\n return null;\n }\n return (\n <Box component=\"ul\" aria-label={ariaLabel} sx={{display: 'flex', flexWrap: 'wrap', gap: 2, listStyle: 'none', p: 0, m: 0, mt: 1}}>\n {series.map((item) => (\n <Box component=\"li\" key={item.key} sx={{display: 'flex', alignItems: 'center', gap: 0.75}}>\n {showsDash ? (\n <Box component=\"svg\" aria-hidden=\"true\" width={SWATCH_PIXELS} height={8} sx={{color: item.color}}>\n <line x1=\"0\" y1=\"4\" x2={SWATCH_PIXELS} y2=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeDasharray={item.dash} />\n </Box>\n ) : (\n <Box aria-hidden=\"true\" sx={{width: 10, height: 10, borderRadius: 0.5, bgcolor: item.color}} />\n )}\n <Typography variant=\"caption\" color=\"text.secondary\">{item.label}</Typography>\n </Box>\n ))}\n </Box>\n );\n}\n\n/**\n * El rótulo de la línea de referencia (la meta), debajo de la gráfica: sobre la línea se encimaba con la última columna, y\n * así también lo lee quien ve la tabla.\n *\n * @param {{referenceLine?: {value: number, label: string}}} props\n */\nexport function ReferenceCaption({referenceLine}) {\n if (!referenceLine) {\n return null;\n }\n return (\n <Box sx={{display: 'flex', alignItems: 'center', justifyContent: 'flex-end', gap: 0.75, mt: 0.5}}>\n <Box aria-hidden=\"true\" sx={{width: SWATCH_PIXELS, borderTop: '2px dashed', borderColor: 'text.secondary'}} />\n <Typography variant=\"caption\" color=\"text.secondary\">{referenceLine.label}</Typography>\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AA0BA,MAAM,mBAAmB;AAEzB,MAAM,4BAA4B;AAClC,MAAM,sBAAsB;AAE5B,MAAM,wBAAwB;AAE9B,MAAM,wBAAwB;AAE9B,MAAM,gBAAgB;AAGf,MAAM,qBAAqB,OAAO,OAAO,CAAC,WAAW,QAAQ,WAAW,WAAW,SAAS,WAAW,CAAC;AAExG,MAAM,oBAAoB,OAAO,OAAO,CAAC,KAAK,OAAO,KAAK,CAAC;AAQ3D,SAAS,iBAAiB;AAC7B,QAAM,UAAU,UAAU,UAAU;AACpC,SAAO,QAAQ,OAAO;AAAA,IAClB;AAAA,IACA,MAAM,QAAQ,KAAK;AAAA,IACnB,UAAU,EAAC,MAAM,QAAQ,KAAK,WAAW,UAAU,iBAAA;AAAA,IACnD,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ,KAAK;AAAA,IACnB,OAAO,QAAQ,KAAK;AAAA,IACpB,OAAO,QAAQ,OAAO;AAAA,EAAA,IACtB,CAAC,OAAO,CAAC;AACjB;AASO,SAAS,iBAAiB,cAAc,aAAa;AACxD,QAAM,eAAe,YAAY,YAAY,EAAE,SAAS;AACxD,SAAO,KAAK,IAAI,2BAA2B,sBAAsB,eAAe,qBAAqB;AACzG;AASO,SAAS,iBAAiB,QAAQ,SAAS;AAC9C,SAAO,OAAO,IAAI,CAAC,MAAM,UAAU;AAC/B,UAAM,OAAO,KAAK,QAAQ,mBAAmB,QAAQ,mBAAmB,MAAM;AAC9E,WAAO;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA,QAAQ,QAAQ,IAAI,KAAK,QAAQ,SAAS;AAAA,MAC1C,MAAM,KAAK,QAAQ,kBAAkB,QAAQ,kBAAkB,MAAM;AAAA,IAAA;AAAA,EAE7E,CAAC;AACL;AAUO,SAAS,eAAe,MAAM,QAAQ,eAAe;AACxD,QAAM,SAAS,KAAK,QAAQ,CAAC,QAAQ,OAAO,IAAI,CAAC,SAAS,OAAO,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;AACrF,SAAO,KAAK,IAAI,GAAG,GAAG,QAAQ,eAAe,SAAS,CAAC;AAC3D;AAYO,SAAS,WAAW,EAAC,MAAM,QAAQ,aAAa,aAAa,UAAS;AACzE,SACI,oBAAC,KAAA,EAAI,IAAI,EAAC,WAAW,QAAQ,WAAW,OAAA,GACpC,UAAA,qBAAC,OAAA,EAAM,MAAK,SACR,UAAA;AAAA,IAAA,oBAAC,WAAA,EACG,+BAAC,UAAA,EACG,UAAA;AAAA,MAAA,oBAAC,aAAW,UAAA,YAAA,CAAY;AAAA,MACvB,OAAO,IAAI,CAAC,SAAS,oBAAC,WAAA,EAAyB,OAAM,SAAS,UAAA,KAAK,MAAA,GAA9B,KAAK,GAA+B,CAAY;AAAA,IAAA,EAAA,CAC1F,EAAA,CACJ;AAAA,wBACC,WAAA,EACI,UAAA,KAAK,IAAI,CAAC,6BACN,UAAA,EACG,UAAA;AAAA,MAAA,oBAAC,WAAA,EAAW,cAAI,MAAA,CAAM;AAAA,MACrB,OAAO,IAAI,CAAC,SAAS,oBAAC,aAAyB,OAAM,SAAS,UAAA,YAAY,IAAI,KAAK,GAAG,CAAC,EAAA,GAAlD,KAAK,GAA+C,CAAY;AAAA,IAAA,KAF3F,IAAI,GAGnB,CACH,EAAA,CACL;AAAA,EAAA,EAAA,CACJ,EAAA,CACJ;AAER;AAUO,SAAS,YAAY,EAAC,QAAQ,YAAY,OAAO,aAAY;AAChE,MAAI,OAAO,SAAS,GAAG;AACnB,WAAO;AAAA,EACX;AACA,6BACK,KAAA,EAAI,WAAU,MAAK,cAAY,WAAW,IAAI,EAAC,SAAS,QAAQ,UAAU,QAAQ,KAAK,GAAG,WAAW,QAAQ,GAAG,GAAG,GAAG,GAAG,IAAI,KACzH,UAAA,OAAO,IAAI,CAAC,8BACR,KAAA,EAAI,WAAU,MAAoB,IAAI,EAAC,SAAS,QAAQ,YAAY,UAAU,KAAK,QAC/E,UAAA;AAAA,IAAA,YACG,oBAAC,OAAI,WAAU,OAAM,eAAY,QAAO,OAAO,eAAe,QAAQ,GAAG,IAAI,EAAC,OAAO,KAAK,SACtF,UAAA,oBAAC,QAAA,EAAK,IAAG,KAAI,IAAG,KAAI,IAAI,eAAe,IAAG,KAAI,QAAO,gBAAe,aAAY,KAAI,iBAAiB,KAAK,KAAA,CAAM,EAAA,CACpH,IAEA,oBAAC,KAAA,EAAI,eAAY,QAAO,IAAI,EAAC,OAAO,IAAI,QAAQ,IAAI,cAAc,KAAK,SAAS,KAAK,MAAA,EAAK,CAAG;AAAA,wBAEhG,YAAA,EAAW,SAAQ,WAAU,OAAM,kBAAkB,eAAK,MAAA,CAAM;AAAA,EAAA,EAAA,GAR5C,KAAK,GAS9B,CACH,GACL;AAER;AAQO,SAAS,iBAAiB,EAAC,iBAAgB;AAC9C,MAAI,CAAC,eAAe;AAChB,WAAO;AAAA,EACX;AACA,SACI,qBAAC,KAAA,EAAI,IAAI,EAAC,SAAS,QAAQ,YAAY,UAAU,gBAAgB,YAAY,KAAK,MAAM,IAAI,OACxF,UAAA;AAAA,IAAA,oBAAC,KAAA,EAAI,eAAY,QAAO,IAAI,EAAC,OAAO,eAAe,WAAW,cAAc,aAAa,iBAAA,EAAgB,CAAG;AAAA,wBAC3G,YAAA,EAAW,SAAQ,WAAU,OAAM,kBAAkB,wBAAc,MAAA,CAAM;AAAA,EAAA,GAC9E;AAER;"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
const DAY_MILLISECONDS = 24 * 60 * 60 * 1e3;
|
|
2
|
+
const DAYS_PER_WEEK = 7;
|
|
3
|
+
const HEATMAP_LEVELS = [0, 1, 2, 3, 4];
|
|
4
|
+
function quantileThresholds(values) {
|
|
5
|
+
const activeValues = values.filter((value) => value > 0).sort((first, second) => first - second);
|
|
6
|
+
if (!activeValues.length) {
|
|
7
|
+
return [1, 1, 1];
|
|
8
|
+
}
|
|
9
|
+
const valueAt = (fraction) => activeValues[Math.min(activeValues.length - 1, Math.floor(fraction * activeValues.length))];
|
|
10
|
+
return [valueAt(0.25), valueAt(0.5), valueAt(0.75)];
|
|
11
|
+
}
|
|
12
|
+
function levelOf(value, [firstQuartile, median, thirdQuartile]) {
|
|
13
|
+
if (!value) {
|
|
14
|
+
return 0;
|
|
15
|
+
}
|
|
16
|
+
if (value < firstQuartile) {
|
|
17
|
+
return 1;
|
|
18
|
+
}
|
|
19
|
+
if (value < median) {
|
|
20
|
+
return 2;
|
|
21
|
+
}
|
|
22
|
+
if (value < thirdQuartile) {
|
|
23
|
+
return 3;
|
|
24
|
+
}
|
|
25
|
+
return 4;
|
|
26
|
+
}
|
|
27
|
+
function utcDayOf(plainDate) {
|
|
28
|
+
const [year, month, day] = plainDate.split("-").map(Number);
|
|
29
|
+
return Date.UTC(year, month - 1, day);
|
|
30
|
+
}
|
|
31
|
+
function plainDateOf(utcMilliseconds) {
|
|
32
|
+
return new Date(utcMilliseconds).toISOString().slice(0, 10);
|
|
33
|
+
}
|
|
34
|
+
function calendarWeeksOf({ startsOn, endsOn, days }) {
|
|
35
|
+
const dayByDate = new Map(days.map((day) => [day.date, day]));
|
|
36
|
+
const firstDay = utcDayOf(startsOn);
|
|
37
|
+
const lastDay = utcDayOf(endsOn);
|
|
38
|
+
const mondayOffset = (new Date(firstDay).getUTCDay() + 6) % DAYS_PER_WEEK;
|
|
39
|
+
const weeks = [];
|
|
40
|
+
const monthMarks = [];
|
|
41
|
+
for (let weekStart = firstDay - mondayOffset * DAY_MILLISECONDS; weekStart <= lastDay; weekStart += DAYS_PER_WEEK * DAY_MILLISECONDS) {
|
|
42
|
+
const week = [];
|
|
43
|
+
let monthMark = null;
|
|
44
|
+
for (let weekday = 0; weekday < DAYS_PER_WEEK; weekday++) {
|
|
45
|
+
const dayMilliseconds = weekStart + weekday * DAY_MILLISECONDS;
|
|
46
|
+
if (dayMilliseconds < firstDay || dayMilliseconds > lastDay) {
|
|
47
|
+
week.push(null);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const date = plainDateOf(dayMilliseconds);
|
|
51
|
+
if (date.endsWith("-01")) {
|
|
52
|
+
monthMark = Number(date.slice(5, 7));
|
|
53
|
+
}
|
|
54
|
+
week.push({ date, value: dayByDate.get(date)?.value ?? 0, detail: dayByDate.get(date)?.detail });
|
|
55
|
+
}
|
|
56
|
+
weeks.push(week);
|
|
57
|
+
monthMarks.push(monthMark);
|
|
58
|
+
}
|
|
59
|
+
return { weeks, monthMarks, thresholds: quantileThresholds(days.map((day) => day.value)) };
|
|
60
|
+
}
|
|
61
|
+
export {
|
|
62
|
+
HEATMAP_LEVELS,
|
|
63
|
+
calendarWeeksOf,
|
|
64
|
+
levelOf,
|
|
65
|
+
quantileThresholds
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=heatmapScale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heatmapScale.js","sources":["../../../src/ui/metrics/heatmapScale.js"],"sourcesContent":["// Cuentas del calendario de actividad (CalendarHeatmap): niveles de color y semanas en columnas.\n//\n// Separadas del componente para probarlas con node --test sin navegador ni MUI.\n//\n// Reglas:\n// - es MAGNITUD: cuatro niveles de un solo tono más \"sin actividad\";\n// - los niveles se cortan por CUARTILES de los días con actividad, no por valores fijos: con 120 registros al día o\n// con 12 000 el calendario se lee igual de bien;\n// - las semanas empiezan en LUNES y el mes se rotula en la semana donde cae su día 1.\n//\n// Fechas de calendario (\"2026-08-16\") con aritmética en UTC: una fecha sin hora no tiene zona y así no se corre de día.\n//\n// Funciones puras, no renderizan: function (regla de la casa).\n\nconst DAY_MILLISECONDS = 24 * 60 * 60 * 1000;\nconst DAYS_PER_WEEK = 7;\n\n/** Nivel 0 = sin actividad; 1 a 4 = el tono cada vez más lleno. */\nexport const HEATMAP_LEVELS = [0, 1, 2, 3, 4];\n\n/**\n * Cortes de los cuartiles de los valores con actividad.\n *\n * @param {number[]} values un valor por día (los ceros no cuentan)\n * @returns {[number, number, number]} q1, q2 y q3\n */\nexport function quantileThresholds(values) {\n const activeValues = values.filter((value) => value > 0).sort((first, second) => first - second);\n // guard clause: sin actividad cualquier valor positivo sería el nivel más alto; da igual, no hay ninguno\n if (!activeValues.length) {\n return [1, 1, 1];\n }\n const valueAt = (fraction) => activeValues[Math.min(activeValues.length - 1, Math.floor(fraction * activeValues.length))];\n return [valueAt(0.25), valueAt(0.5), valueAt(0.75)];\n}\n\n/**\n * Nivel de color de un valor.\n *\n * @param {number} value\n * @param {[number, number, number]} thresholds lo que regresa quantileThresholds\n * @returns {0|1|2|3|4}\n */\nexport function levelOf(value, [firstQuartile, median, thirdQuartile]) {\n if (!value) {\n return 0;\n }\n // OJO: intervalos abiertos por arriba ([q1, q2) es el nivel 2). Con «<=» el valor más repetido, que suele ser\n // la carga completa de cada corte, caía en el nivel 1 y el calendario entero se veía deslavado\n if (value < firstQuartile) {\n return 1;\n }\n if (value < median) {\n return 2;\n }\n if (value < thirdQuartile) {\n return 3;\n }\n return 4;\n}\n\n/** \"2026-08-16\" → milisegundos UTC de ese día a las 00:00. */\nfunction utcDayOf(plainDate) {\n const [year, month, day] = plainDate.split('-').map(Number);\n return Date.UTC(year, month - 1, day);\n}\n\n/** milisegundos UTC → \"2026-08-16\". */\nfunction plainDateOf(utcMilliseconds) {\n return new Date(utcMilliseconds).toISOString().slice(0, 10);\n}\n\n/**\n * Semanas del calendario: columnas de lunes a domingo desde la semana de startsOn hasta la de endsOn.\n *\n * Los días fuera del rango (antes de startsOn en la primera semana o después de endsOn en la última) van en null para\n * que la rejilla deje su hueco sin pintarlos como \"sin actividad\".\n *\n * @param {{startsOn: string, endsOn: string, days: Array<{date: string, value: number, detail?: string}>}} calendar\n * days solo trae los días con actividad (el resto vale 0)\n * @returns {{weeks: Array<Array<{date: string, value: number, detail?: string}|null>>, monthMarks: Array<number|null>, thresholds: [number, number, number]}}\n * monthMarks: el mes (1 a 12) que empieza en cada semana, o null\n */\nexport function calendarWeeksOf({startsOn, endsOn, days}) {\n const dayByDate = new Map(days.map((day) => [day.date, day]));\n const firstDay = utcDayOf(startsOn);\n const lastDay = utcDayOf(endsOn);\n // getUTCDay: 0 = domingo; lo pasamos a 0 = lunes\n const mondayOffset = (new Date(firstDay).getUTCDay() + 6) % DAYS_PER_WEEK;\n const weeks = [];\n const monthMarks = [];\n\n for (let weekStart = firstDay - mondayOffset * DAY_MILLISECONDS; weekStart <= lastDay; weekStart += DAYS_PER_WEEK * DAY_MILLISECONDS) {\n const week = [];\n let monthMark = null;\n for (let weekday = 0; weekday < DAYS_PER_WEEK; weekday++) {\n const dayMilliseconds = weekStart + weekday * DAY_MILLISECONDS;\n if (dayMilliseconds < firstDay || dayMilliseconds > lastDay) {\n week.push(null);\n continue;\n }\n const date = plainDateOf(dayMilliseconds);\n if (date.endsWith('-01')) {\n monthMark = Number(date.slice(5, 7));\n }\n week.push({date, value: dayByDate.get(date)?.value ?? 0, detail: dayByDate.get(date)?.detail});\n }\n weeks.push(week);\n monthMarks.push(monthMark);\n }\n\n return {weeks, monthMarks, thresholds: quantileThresholds(days.map((day) => day.value))};\n}\n"],"names":[],"mappings":"AAcA,MAAM,mBAAmB,KAAK,KAAK,KAAK;AACxC,MAAM,gBAAgB;AAGV,MAAC,iBAAiB,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;AAQrC,SAAS,mBAAmB,QAAQ;AACvC,QAAM,eAAe,OAAO,OAAO,CAAC,UAAU,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,WAAW,QAAQ,MAAM;AAE/F,MAAI,CAAC,aAAa,QAAQ;AACtB,WAAO,CAAC,GAAG,GAAG,CAAC;AAAA,EACnB;AACA,QAAM,UAAU,CAAC,aAAa,aAAa,KAAK,IAAI,aAAa,SAAS,GAAG,KAAK,MAAM,WAAW,aAAa,MAAM,CAAC,CAAC;AACxH,SAAO,CAAC,QAAQ,IAAI,GAAG,QAAQ,GAAG,GAAG,QAAQ,IAAI,CAAC;AACtD;AASO,SAAS,QAAQ,OAAO,CAAC,eAAe,QAAQ,aAAa,GAAG;AACnE,MAAI,CAAC,OAAO;AACR,WAAO;AAAA,EACX;AAGA,MAAI,QAAQ,eAAe;AACvB,WAAO;AAAA,EACX;AACA,MAAI,QAAQ,QAAQ;AAChB,WAAO;AAAA,EACX;AACA,MAAI,QAAQ,eAAe;AACvB,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAGA,SAAS,SAAS,WAAW;AACzB,QAAM,CAAC,MAAM,OAAO,GAAG,IAAI,UAAU,MAAM,GAAG,EAAE,IAAI,MAAM;AAC1D,SAAO,KAAK,IAAI,MAAM,QAAQ,GAAG,GAAG;AACxC;AAGA,SAAS,YAAY,iBAAiB;AAClC,SAAO,IAAI,KAAK,eAAe,EAAE,YAAW,EAAG,MAAM,GAAG,EAAE;AAC9D;AAaO,SAAS,gBAAgB,EAAC,UAAU,QAAQ,KAAI,GAAG;AACtD,QAAM,YAAY,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;AAC5D,QAAM,WAAW,SAAS,QAAQ;AAClC,QAAM,UAAU,SAAS,MAAM;AAE/B,QAAM,gBAAgB,IAAI,KAAK,QAAQ,EAAE,UAAS,IAAK,KAAK;AAC5D,QAAM,QAAQ,CAAA;AACd,QAAM,aAAa,CAAA;AAEnB,WAAS,YAAY,WAAW,eAAe,kBAAkB,aAAa,SAAS,aAAa,gBAAgB,kBAAkB;AAClI,UAAM,OAAO,CAAA;AACb,QAAI,YAAY;AAChB,aAAS,UAAU,GAAG,UAAU,eAAe,WAAW;AACtD,YAAM,kBAAkB,YAAY,UAAU;AAC9C,UAAI,kBAAkB,YAAY,kBAAkB,SAAS;AACzD,aAAK,KAAK,IAAI;AACd;AAAA,MACJ;AACA,YAAM,OAAO,YAAY,eAAe;AACxC,UAAI,KAAK,SAAS,KAAK,GAAG;AACtB,oBAAY,OAAO,KAAK,MAAM,GAAG,CAAC,CAAC;AAAA,MACvC;AACA,WAAK,KAAK,EAAC,MAAM,OAAO,UAAU,IAAI,IAAI,GAAG,SAAS,GAAG,QAAQ,UAAU,IAAI,IAAI,GAAG,OAAM,CAAC;AAAA,IACjG;AACA,UAAM,KAAK,IAAI;AACf,eAAW,KAAK,SAAS;AAAA,EAC7B;AAEA,SAAO,EAAC,OAAO,YAAY,YAAY,mBAAmB,KAAK,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAC;AAC3F;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useToolkitNavigation } from "../../toolkit/toolkitContext.js";
|
|
4
|
+
import { useToolkitTranslation } from "../../toolkit/useToolkitTranslation.js";
|
|
5
|
+
import Button from "@mui/material/Button";
|
|
6
|
+
import ArrowBackIcon from "@mui/icons-material/ArrowBack";
|
|
7
|
+
import { recallListUrl } from "../../lastListUrl.js";
|
|
8
|
+
import { currentHistoryIndex, pageNameAt } from "../../navigationTrail.js";
|
|
9
|
+
function BackButton({ fallbackTo, listKey, label, texts, ...buttonProps }) {
|
|
10
|
+
const { t } = useToolkitTranslation("common", texts);
|
|
11
|
+
const { useNavigate } = useToolkitNavigation();
|
|
12
|
+
const navigate = useNavigate();
|
|
13
|
+
const historyIndex = currentHistoryIndex();
|
|
14
|
+
const hasHistory = historyIndex > 0;
|
|
15
|
+
const previousPageName = hasHistory ? pageNameAt(historyIndex - 1) : null;
|
|
16
|
+
const goBack = () => {
|
|
17
|
+
if (hasHistory) {
|
|
18
|
+
navigate(-1);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
navigate(listKey && recallListUrl(listKey) || fallbackTo);
|
|
22
|
+
};
|
|
23
|
+
return /* @__PURE__ */ jsx(Button, { size: "small", color: "inherit", startIcon: /* @__PURE__ */ jsx(ArrowBackIcon, {}), onClick: goBack, ...buttonProps, children: previousPageName ? t(previousPageName.labelKey, previousPageName.params) : label ?? t("actions.back") });
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
BackButton as default
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=BackButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BackButton.js","sources":["../../../src/ui/navigation/BackButton.jsx"],"sourcesContent":["// Botón de regreso por el ROUTER, no por un enlace fijo.\n//\n// navigate(-1) regresa a la entrada anterior del historial con sus parámetros intactos: los filtros, el orden, la\n// pestaña y la página que nuqs dejó en la URL de la lista siguen ahí. Un enlace fijo a la lista los perdería.\n//\n// Si alguien llegó directo (pegó el enlace del detalle, abrió en pestaña nueva, recargó después de un login) no hay\n// historial al que volver: se usa la última URL de la lista que se guardó en sessionStorage al salir de ella\n// (useRememberListUrl) y, si tampoco hay, fallbackTo.\n//\n// El TEXTO dice a dónde regresa: si la página anterior anotó su nombre de regreso (usePageName de navigationTrail.js),\n// se pinta ese («Regresar al detalle del pedido 15»); si no, o si no hay historial, el label que le pasen.\n//\n// Navega con la navegación del proveedor (ToolkitProvider), no con un router en particular.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useToolkitNavigation} from '@/toolkit/toolkitContext.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport Button from '@mui/material/Button';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\n\nimport {recallListUrl} from '@/lastListUrl.js';\nimport {currentHistoryIndex, pageNameAt} from '@/navigationTrail.js';\n\n/**\n * @param {object} props\n * @param {string} props.fallbackTo ruta de la lista sin filtros (último respaldo)\n * @param {string} [props.listKey] la misma llave que usa useRememberListUrl en la lista\n * @param {string} [props.label] ya traducido; se usa cuando la página anterior no anotó su nombre o no hay historial\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nexport default function BackButton({fallbackTo, listKey, label, texts, ...buttonProps}) {\n const {t} = useToolkitTranslation('common', texts);\n const {useNavigate} = useToolkitNavigation();\n const navigate = useNavigate();\n\n // react-router guarda en history.state un índice: 0 = primera entrada de esta pestaña en la app. Otro router no lo\n // guarda: entonces se toma como si no hubiera historial y se regresa a la última lista o a fallbackTo\n const historyIndex = currentHistoryIndex();\n const hasHistory = historyIndex > 0;\n const previousPageName = hasHistory ? pageNameAt(historyIndex - 1) : null;\n\n const goBack = () => {\n if (hasHistory) {\n navigate(-1);\n return;\n }\n navigate((listKey && recallListUrl(listKey)) || fallbackTo);\n };\n\n return (\n <Button size=\"small\" color=\"inherit\" startIcon={<ArrowBackIcon />} onClick={goBack} {...buttonProps}>\n {previousPageName ? t(previousPageName.labelKey, previousPageName.params) : (label ?? t('actions.back'))}\n </Button>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AA8BA,SAAwB,WAAW,EAAC,YAAY,SAAS,OAAO,OAAO,GAAG,eAAc;AACpF,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AACjD,QAAM,EAAC,YAAA,IAAe,qBAAA;AACtB,QAAM,WAAW,YAAA;AAIjB,QAAM,eAAe,oBAAA;AACrB,QAAM,aAAa,eAAe;AAClC,QAAM,mBAAmB,aAAa,WAAW,eAAe,CAAC,IAAI;AAErE,QAAM,SAAS,MAAM;AACjB,QAAI,YAAY;AACZ,eAAS,EAAE;AACX;AAAA,IACJ;AACA,aAAU,WAAW,cAAc,OAAO,KAAM,UAAU;AAAA,EAC9D;AAEA,SACI,oBAAC,QAAA,EAAO,MAAK,SAAQ,OAAM,WAAU,WAAW,oBAAC,eAAA,CAAA,CAAc,GAAI,SAAS,QAAS,GAAG,aACnF,UAAA,mBAAmB,EAAE,iBAAiB,UAAU,iBAAiB,MAAM,IAAK,SAAS,EAAE,cAAc,EAAA,CAC1G;AAER;"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useEffect } from "react";
|
|
4
|
+
import { useToolkitTranslation } from "../../toolkit/useToolkitTranslation.js";
|
|
5
|
+
import IconButton from "@mui/material/IconButton";
|
|
6
|
+
import Tooltip from "@mui/material/Tooltip";
|
|
7
|
+
import { useColorScheme } from "@mui/material/styles";
|
|
8
|
+
import DarkModeIcon from "@mui/icons-material/DarkModeOutlined";
|
|
9
|
+
import LightModeIcon from "@mui/icons-material/LightModeOutlined";
|
|
10
|
+
import { nextColorModeOf } from "./colorMode.js";
|
|
11
|
+
function ColorSchemeToggle({ size = "small", inverted = false, onChange, texts }) {
|
|
12
|
+
const { t } = useToolkitTranslation("common", texts);
|
|
13
|
+
const { mode, systemMode, setMode } = useColorScheme();
|
|
14
|
+
const [isMounted, setIsMounted] = useState(false);
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
setIsMounted(true);
|
|
17
|
+
}, []);
|
|
18
|
+
if (!isMounted || !mode) {
|
|
19
|
+
return /* @__PURE__ */ jsx(IconButton, { size, disabled: true, "aria-hidden": "true", sx: { width: 34, height: 34 } });
|
|
20
|
+
}
|
|
21
|
+
const nextMode = nextColorModeOf(mode, systemMode);
|
|
22
|
+
const label = t(`colorScheme.switchTo.${nextMode}`);
|
|
23
|
+
return /* @__PURE__ */ jsx(Tooltip, { title: label, children: /* @__PURE__ */ jsx(
|
|
24
|
+
IconButton,
|
|
25
|
+
{
|
|
26
|
+
size,
|
|
27
|
+
"aria-label": label,
|
|
28
|
+
onClick: () => {
|
|
29
|
+
setMode(nextMode);
|
|
30
|
+
onChange?.(nextMode);
|
|
31
|
+
},
|
|
32
|
+
sx: { color: inverted ? "common.white" : "text.secondary" },
|
|
33
|
+
children: nextMode === "light" ? /* @__PURE__ */ jsx(LightModeIcon, { fontSize: "small" }) : /* @__PURE__ */ jsx(DarkModeIcon, { fontSize: "small" })
|
|
34
|
+
}
|
|
35
|
+
) });
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
ColorSchemeToggle as default
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=ColorSchemeToggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColorSchemeToggle.js","sources":["../../../src/ui/navigation/ColorSchemeToggle.jsx"],"sourcesContent":["// Interruptor de modo claro / oscuro.\n//\n// Dos estados visibles, no tres: el primer clic fija una preferencia explícita que ya se recuerda; para volver a seguir\n// al equipo está «Automático» en Apariencia (AppearanceSettings, en el menú de la cuenta). Recordar lo hace MUI:\n// setMode escribe en localStorage (con las llaves que el proyecto puso en su ThemeProvider) y un script\n// en el HTML la puede leer antes del primer pintado.\n//\n// Va en la cinta de escritorio, en el cajón del teléfono y en el inicio de sesión.\n//\n// El tooltip sale de i18n.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useEffect, useState} from 'react';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport {useColorScheme} from '@mui/material/styles';\nimport DarkModeIcon from '@mui/icons-material/DarkModeOutlined';\nimport LightModeIcon from '@mui/icons-material/LightModeOutlined';\n\nimport {nextColorModeOf} from '@/ui/navigation/colorMode.js';\n\n/**\n * @param {object} [props]\n * @param {'small'|'medium'} [props.size]\n * @param {boolean} [props.inverted] ícono blanco para fondos oscuros\n * @param {(mode: 'light'|'dark'|'system') => void} [props.onChange] la persona cambió el modo (para guardarlo en su servidor)\n * @param {object} [props.texts] los textos que cambian, con la forma de `common` en los textos del paquete\n */\nexport default function ColorSchemeToggle({size = 'small', inverted = false, onChange, texts}) {\n const {t} = useToolkitTranslation('common', texts);\n const {mode, systemMode, setMode} = useColorScheme();\n\n // antes de montar en el cliente mode viene undefined: reservamos el lugar para que la barra no brinque\n const [isMounted, setIsMounted] = useState(false);\n useEffect(() => {\n setIsMounted(true);\n }, []);\n if (!isMounted || !mode) {\n return <IconButton size={size} disabled aria-hidden=\"true\" sx={{width: 34, height: 34}} />;\n }\n\n const nextMode = nextColorModeOf(mode, systemMode);\n const label = t(`colorScheme.switchTo.${nextMode}`);\n\n return (\n <Tooltip title={label}>\n <IconButton size={size} aria-label={label} onClick={() => {\n setMode(nextMode);\n onChange?.(nextMode);\n }}\n sx={{color: inverted ? 'common.white' : 'text.secondary'}}>\n {nextMode === 'light' ? <LightModeIcon fontSize=\"small\" /> : <DarkModeIcon fontSize=\"small\" />}\n </IconButton>\n </Tooltip>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AA6BA,SAAwB,kBAAkB,EAAC,OAAO,SAAS,WAAW,OAAO,UAAU,SAAQ;AAC3F,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AACjD,QAAM,EAAC,MAAM,YAAY,QAAA,IAAW,eAAA;AAGpC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,YAAU,MAAM;AACZ,iBAAa,IAAI;AAAA,EACrB,GAAG,CAAA,CAAE;AACL,MAAI,CAAC,aAAa,CAAC,MAAM;AACrB,WAAO,oBAAC,YAAA,EAAW,MAAY,UAAQ,MAAC,eAAY,QAAO,IAAI,EAAC,OAAO,IAAI,QAAQ,KAAE,CAAG;AAAA,EAC5F;AAEA,QAAM,WAAW,gBAAgB,MAAM,UAAU;AACjD,QAAM,QAAQ,EAAE,wBAAwB,QAAQ,EAAE;AAElD,SACI,oBAAC,SAAA,EAAQ,OAAO,OACZ,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MAAW;AAAA,MAAY,cAAY;AAAA,MAAO,SAAS,MAAM;AAC1C,gBAAQ,QAAQ;AAChB,mBAAW,QAAQ;AAAA,MACvB;AAAA,MACA,IAAI,EAAC,OAAO,WAAW,iBAAiB,iBAAA;AAAA,MAC/C,UAAA,aAAa,UAAU,oBAAC,eAAA,EAAc,UAAS,SAAQ,IAAK,oBAAC,cAAA,EAAa,UAAS,QAAA,CAAQ;AAAA,IAAA;AAAA,EAAA,GAEpG;AAER;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useToolkitSettings } from "../../toolkit/toolkitContext.js";
|
|
4
|
+
function DocumentTitle({ title }) {
|
|
5
|
+
const { appName } = useToolkitSettings();
|
|
6
|
+
return /* @__PURE__ */ jsx("title", { children: appName ? `${title} | ${appName}` : title });
|
|
7
|
+
}
|
|
8
|
+
export {
|
|
9
|
+
DocumentTitle as default
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=DocumentTitle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocumentTitle.js","sources":["../../../src/ui/navigation/DocumentTitle.jsx"],"sourcesContent":["// Título de la pestaña: \"<pantalla> | <aplicación>\", con el nombre de la aplicación del proveedor (appName de\n// ToolkitProvider); sin nombre, solo la pantalla. React 19 sube <title> al <head> solo; no hace falta react-helmet.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useToolkitSettings} from '@/toolkit/toolkitContext.js';\n\n/**\n * @param {{title: string}} props texto ya traducido\n */\nexport default function DocumentTitle({title}) {\n const {appName} = useToolkitSettings();\n\n return <title>{appName ? `${title} | ${appName}` : title}</title>;\n}\n"],"names":[],"mappings":";;;AASA,SAAwB,cAAc,EAAC,SAAQ;AAC3C,QAAM,EAAC,QAAA,IAAW,mBAAA;AAElB,SAAO,oBAAC,WAAO,UAAA,UAAU,GAAG,KAAK,MAAM,OAAO,KAAK,MAAA,CAAM;AAC7D;"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { useToolkitTranslation } from "../../toolkit/useToolkitTranslation.js";
|
|
5
|
+
import IconButton from "@mui/material/IconButton";
|
|
6
|
+
import ListItemText from "@mui/material/ListItemText";
|
|
7
|
+
import Menu from "@mui/material/Menu";
|
|
8
|
+
import MenuItem from "@mui/material/MenuItem";
|
|
9
|
+
import Tooltip from "@mui/material/Tooltip";
|
|
10
|
+
import FormatSizeIcon from "@mui/icons-material/FormatSize";
|
|
11
|
+
import { useFontSize } from "./useFontSize.js";
|
|
12
|
+
function FontSizeToggle({ size = "small", onChange, texts }) {
|
|
13
|
+
const { t } = useToolkitTranslation("layout", texts);
|
|
14
|
+
const { level, setLevel, isMounted, levels } = useFontSize();
|
|
15
|
+
const [anchorElement, setAnchorElement] = useState(null);
|
|
16
|
+
if (!isMounted) {
|
|
17
|
+
return /* @__PURE__ */ jsx(IconButton, { size, disabled: true, "aria-hidden": "true", sx: { width: 34, height: 34 } });
|
|
18
|
+
}
|
|
19
|
+
const chooseLevel = (levelKey) => {
|
|
20
|
+
setLevel(levelKey);
|
|
21
|
+
setAnchorElement(null);
|
|
22
|
+
onChange?.(levelKey);
|
|
23
|
+
};
|
|
24
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
25
|
+
/* @__PURE__ */ jsx(Tooltip, { title: t("fontSize.label"), children: /* @__PURE__ */ jsx(IconButton, { size, "aria-label": t("fontSize.label"), "aria-haspopup": "menu", onClick: (event) => setAnchorElement(event.currentTarget), children: /* @__PURE__ */ jsx(FormatSizeIcon, { fontSize: "small" }) }) }),
|
|
26
|
+
/* @__PURE__ */ jsx(
|
|
27
|
+
Menu,
|
|
28
|
+
{
|
|
29
|
+
anchorEl: anchorElement,
|
|
30
|
+
open: Boolean(anchorElement),
|
|
31
|
+
onClose: () => setAnchorElement(null),
|
|
32
|
+
slotProps: { paper: { sx: { minWidth: 200 } } },
|
|
33
|
+
children: levels.map((option) => /* @__PURE__ */ jsx(MenuItem, { selected: option.key === level, onClick: () => chooseLevel(option.key), children: /* @__PURE__ */ jsx(ListItemText, { primary: t(option.labelKey), slotProps: { primary: { sx: { fontWeight: option.key === level ? 600 : 400 } } } }) }, option.key))
|
|
34
|
+
}
|
|
35
|
+
)
|
|
36
|
+
] });
|
|
37
|
+
}
|
|
38
|
+
export {
|
|
39
|
+
FontSizeToggle as default
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=FontSizeToggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FontSizeToggle.js","sources":["../../../src/ui/navigation/FontSizeToggle.jsx"],"sourcesContent":["// El botón del tamaño de letra (normal, grande, muy grande), del tema de walk-ot: para quien lee con lentes o en una\n// pantalla chica. Va en la barra de escritorio; en el teléfono vive en el menú de ajustes.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useState} from 'react';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport IconButton from '@mui/material/IconButton';\nimport ListItemText from '@mui/material/ListItemText';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport Tooltip from '@mui/material/Tooltip';\nimport FormatSizeIcon from '@mui/icons-material/FormatSize';\n\nimport {useFontSize} from '@/ui/navigation/useFontSize.js';\n\n/**\n * @param {object} [props]\n * @param {'small'|'medium'} [props.size]\n * @param {(level: string) => void} [props.onChange] la persona eligió otro tamaño (FONT_SIZE_LEVELS; para guardarlo en su servidor)\n * @param {object} [props.texts] los textos que cambian, con la forma de `layout` en los textos del paquete\n */\nexport default function FontSizeToggle({size = 'small', onChange, texts}) {\n const {t} = useToolkitTranslation('layout', texts);\n const {level, setLevel, isMounted, levels} = useFontSize();\n const [anchorElement, setAnchorElement] = useState(null);\n\n // antes de montar no se sabe el nivel guardado: se reserva el lugar para que la barra no brinque\n if (!isMounted) {\n return <IconButton size={size} disabled aria-hidden=\"true\" sx={{width: 34, height: 34}} />;\n }\n\n const chooseLevel = (levelKey) => {\n setLevel(levelKey);\n setAnchorElement(null);\n onChange?.(levelKey);\n };\n\n return (\n <>\n <Tooltip title={t('fontSize.label')}>\n <IconButton size={size} aria-label={t('fontSize.label')} aria-haspopup=\"menu\" onClick={(event) => setAnchorElement(event.currentTarget)}>\n <FormatSizeIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n <Menu anchorEl={anchorElement} open={Boolean(anchorElement)} onClose={() => setAnchorElement(null)}\n slotProps={{paper: {sx: {minWidth: 200}}}}>\n {levels.map((option) => (\n <MenuItem key={option.key} selected={option.key === level} onClick={() => chooseLevel(option.key)}>\n <ListItemText primary={t(option.labelKey)} slotProps={{primary: {sx: {fontWeight: option.key === level ? 600 : 400}}}} />\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAqBA,SAAwB,eAAe,EAAC,OAAO,SAAS,UAAU,SAAQ;AACtE,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AACjD,QAAM,EAAC,OAAO,UAAU,WAAW,OAAA,IAAU,YAAA;AAC7C,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,IAAI;AAGvD,MAAI,CAAC,WAAW;AACZ,WAAO,oBAAC,YAAA,EAAW,MAAY,UAAQ,MAAC,eAAY,QAAO,IAAI,EAAC,OAAO,IAAI,QAAQ,KAAE,CAAG;AAAA,EAC5F;AAEA,QAAM,cAAc,CAAC,aAAa;AAC9B,aAAS,QAAQ;AACjB,qBAAiB,IAAI;AACrB,eAAW,QAAQ;AAAA,EACvB;AAEA,SACI,qBAAA,UAAA,EACI,UAAA;AAAA,IAAA,oBAAC,SAAA,EAAQ,OAAO,EAAE,gBAAgB,GAC9B,UAAA,oBAAC,YAAA,EAAW,MAAY,cAAY,EAAE,gBAAgB,GAAG,iBAAc,QAAO,SAAS,CAAC,UAAU,iBAAiB,MAAM,aAAa,GAClI,UAAA,oBAAC,gBAAA,EAAe,UAAS,QAAA,CAAQ,EAAA,CACrC,EAAA,CACJ;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QAAK,UAAU;AAAA,QAAe,MAAM,QAAQ,aAAa;AAAA,QAAG,SAAS,MAAM,iBAAiB,IAAI;AAAA,QAC3F,WAAW,EAAC,OAAO,EAAC,IAAI,EAAC,UAAU,IAAA,IAAI;AAAA,QACxC,iBAAO,IAAI,CAAC,WACT,oBAAC,UAAA,EAA0B,UAAU,OAAO,QAAQ,OAAO,SAAS,MAAM,YAAY,OAAO,GAAG,GAC5F,UAAA,oBAAC,gBAAa,SAAS,EAAE,OAAO,QAAQ,GAAG,WAAW,EAAC,SAAS,EAAC,IAAI,EAAC,YAAY,OAAO,QAAQ,QAAQ,MAAM,MAAG,EAAC,GAAI,EAAA,GAD5G,OAAO,GAEtB,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EACL,GACJ;AAER;"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import Button from "@mui/material/Button";
|
|
5
|
+
import Menu from "@mui/material/Menu";
|
|
6
|
+
import MenuItem from "@mui/material/MenuItem";
|
|
7
|
+
import { useToolkitSettings } from "../../toolkit/toolkitContext.js";
|
|
8
|
+
import { DEFAULT_LANGUAGES } from "../../toolkit/toolkitSettings.js";
|
|
9
|
+
import { useToolkitTranslation } from "../../toolkit/useToolkitTranslation.js";
|
|
10
|
+
const LANGUAGES = Object.freeze(DEFAULT_LANGUAGES.map((entry) => entry.code));
|
|
11
|
+
function LanguageToggle({ inverted = false, onChange, texts }) {
|
|
12
|
+
const { t, language, changeLanguage } = useToolkitTranslation("common", texts);
|
|
13
|
+
const { languages = DEFAULT_LANGUAGES } = useToolkitSettings();
|
|
14
|
+
const [menuAnchor, setMenuAnchor] = useState(null);
|
|
15
|
+
const current = languages.find((entry) => entry.code === language) ?? languages[0];
|
|
16
|
+
const buttonSx = { minWidth: 0, fontWeight: 700, letterSpacing: "0.08em", color: inverted ? "common.white" : "text.secondary" };
|
|
17
|
+
const choose = (code) => {
|
|
18
|
+
setMenuAnchor(null);
|
|
19
|
+
changeLanguage(code);
|
|
20
|
+
onChange?.(code);
|
|
21
|
+
};
|
|
22
|
+
if (languages.length <= 2) {
|
|
23
|
+
const next = languages.find((entry) => entry.code !== current.code) ?? current;
|
|
24
|
+
const ariaLabel = t(`language.switchTo.${next.code}`, { defaultValue: t("language.switchToNamed", { name: next.label }) });
|
|
25
|
+
return /* @__PURE__ */ jsx(Button, { size: "small", variant: "text", onClick: () => choose(next.code), lang: next.code, "aria-label": ariaLabel, sx: buttonSx, children: next.code.toUpperCase() });
|
|
26
|
+
}
|
|
27
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
28
|
+
/* @__PURE__ */ jsx(
|
|
29
|
+
Button,
|
|
30
|
+
{
|
|
31
|
+
size: "small",
|
|
32
|
+
variant: "text",
|
|
33
|
+
onClick: (event) => setMenuAnchor(event.currentTarget),
|
|
34
|
+
"aria-haspopup": "menu",
|
|
35
|
+
"aria-expanded": Boolean(menuAnchor),
|
|
36
|
+
"aria-label": t("language.choose", { name: current.label }),
|
|
37
|
+
sx: buttonSx,
|
|
38
|
+
children: current.code.toUpperCase()
|
|
39
|
+
}
|
|
40
|
+
),
|
|
41
|
+
/* @__PURE__ */ jsx(Menu, { anchorEl: menuAnchor, open: Boolean(menuAnchor), onClose: () => setMenuAnchor(null), children: languages.map((entry) => /* @__PURE__ */ jsx(MenuItem, { lang: entry.code, selected: entry.code === current.code, onClick: () => choose(entry.code), children: entry.label }, entry.code)) })
|
|
42
|
+
] });
|
|
43
|
+
}
|
|
44
|
+
export {
|
|
45
|
+
LANGUAGES,
|
|
46
|
+
LanguageToggle as default
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=LanguageToggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LanguageToggle.js","sources":["../../../src/ui/navigation/LanguageToggle.jsx"],"sourcesContent":["// El botón de idioma de la barra y de las pantallas de entrada.\n//\n// Los idiomas son los que ofrece la app (ToolkitProvider `languages`; por omisión español e inglés):\n// - con dos, un botón que cambia al otro (dice su código: «EN»);\n// - con tres o más, el botón dice el de ahora y abre un menú con cada uno en su propio idioma («Português»), como lo busca\n// quien lo habla; el elegido con su palomita.\n//\n// Solo avisa el idioma nuevo (onLanguageChange de ToolkitProvider). Lo demás lo hace el proyecto: su i18n, el header\n// Accept-Language de las peticiones y volver a pedir los datos del servidor, que traen textos traducidos. Las traducciones de\n// un idioma que agregue el proyecto van en `texts` de ToolkitProvider: el paquete solo trae español e inglés.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useState} from 'react';\nimport Button from '@mui/material/Button';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\n\nimport {useToolkitSettings} from '@/toolkit/toolkitContext.js';\nimport {DEFAULT_LANGUAGES} from '@/toolkit/toolkitSettings.js';\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\n\n/** Los idiomas que traen los textos del paquete. */\nexport const LANGUAGES = Object.freeze(DEFAULT_LANGUAGES.map((entry) => entry.code));\n\n/**\n * @param {object} [props]\n * @param {boolean} [props.inverted] texto blanco para fondos oscuros\n * @param {(language: string) => void} [props.onChange] además de avisar a ToolkitProvider, cada que se elige un idioma\n * @param {object} [props.texts] los textos que cambian, con la forma de `common`: {language: {switchToNamed, choose}}\n */\nexport default function LanguageToggle({inverted = false, onChange, texts}) {\n const {t, language, changeLanguage} = useToolkitTranslation('common', texts);\n const {languages = DEFAULT_LANGUAGES} = useToolkitSettings();\n const [menuAnchor, setMenuAnchor] = useState(null);\n const current = languages.find((entry) => entry.code === language) ?? languages[0];\n const buttonSx = {minWidth: 0, fontWeight: 700, letterSpacing: '0.08em', color: inverted ? 'common.white' : 'text.secondary'};\n\n const choose = (code) => {\n setMenuAnchor(null);\n changeLanguage(code);\n onChange?.(code);\n };\n\n // con dos: un botón que cambia al otro\n if (languages.length <= 2) {\n const next = languages.find((entry) => entry.code !== current.code) ?? current;\n // el aviso de siempre para español e inglés; para otro idioma, con su nombre\n const ariaLabel = t(`language.switchTo.${next.code}`, {defaultValue: t('language.switchToNamed', {name: next.label})});\n return (\n <Button size=\"small\" variant=\"text\" onClick={() => choose(next.code)} lang={next.code} aria-label={ariaLabel} sx={buttonSx}>\n {next.code.toUpperCase()}\n </Button>\n );\n }\n\n // con tres o más: el de ahora y un menú con todos\n return (\n <>\n <Button size=\"small\" variant=\"text\" onClick={(event) => setMenuAnchor(event.currentTarget)} aria-haspopup=\"menu\"\n aria-expanded={Boolean(menuAnchor)} aria-label={t('language.choose', {name: current.label})} sx={buttonSx}>\n {current.code.toUpperCase()}\n </Button>\n <Menu anchorEl={menuAnchor} open={Boolean(menuAnchor)} onClose={() => setMenuAnchor(null)}>\n {languages.map((entry) => (\n <MenuItem key={entry.code} lang={entry.code} selected={entry.code === current.code} onClick={() => choose(entry.code)}>\n {entry.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;AAsBO,MAAM,YAAY,OAAO,OAAO,kBAAkB,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AAQnF,SAAwB,eAAe,EAAC,WAAW,OAAO,UAAU,SAAQ;AACxE,QAAM,EAAC,GAAG,UAAU,mBAAkB,sBAAsB,UAAU,KAAK;AAC3E,QAAM,EAAC,YAAY,kBAAA,IAAqB,mBAAA;AACxC,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,IAAI;AACjD,QAAM,UAAU,UAAU,KAAK,CAAC,UAAU,MAAM,SAAS,QAAQ,KAAK,UAAU,CAAC;AACjF,QAAM,WAAW,EAAC,UAAU,GAAG,YAAY,KAAK,eAAe,UAAU,OAAO,WAAW,iBAAiB,iBAAA;AAE5G,QAAM,SAAS,CAAC,SAAS;AACrB,kBAAc,IAAI;AAClB,mBAAe,IAAI;AACnB,eAAW,IAAI;AAAA,EACnB;AAGA,MAAI,UAAU,UAAU,GAAG;AACvB,UAAM,OAAO,UAAU,KAAK,CAAC,UAAU,MAAM,SAAS,QAAQ,IAAI,KAAK;AAEvE,UAAM,YAAY,EAAE,qBAAqB,KAAK,IAAI,IAAI,EAAC,cAAc,EAAE,0BAA0B,EAAC,MAAM,KAAK,MAAA,CAAM,GAAE;AACrH,WACI,oBAAC,UAAO,MAAK,SAAQ,SAAQ,QAAO,SAAS,MAAM,OAAO,KAAK,IAAI,GAAG,MAAM,KAAK,MAAM,cAAY,WAAW,IAAI,UAC7G,UAAA,KAAK,KAAK,YAAA,EAAY,CAC3B;AAAA,EAER;AAGA,SACI,qBAAA,UAAA,EACI,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QAAO,MAAK;AAAA,QAAQ,SAAQ;AAAA,QAAO,SAAS,CAAC,UAAU,cAAc,MAAM,aAAa;AAAA,QAAG,iBAAc;AAAA,QAClG,iBAAe,QAAQ,UAAU;AAAA,QAAG,cAAY,EAAE,mBAAmB,EAAC,MAAM,QAAQ,OAAM;AAAA,QAAG,IAAI;AAAA,QACpG,UAAA,QAAQ,KAAK,YAAA;AAAA,MAAY;AAAA,IAAA;AAAA,wBAE7B,MAAA,EAAK,UAAU,YAAY,MAAM,QAAQ,UAAU,GAAG,SAAS,MAAM,cAAc,IAAI,GACnF,oBAAU,IAAI,CAAC,UACZ,oBAAC,UAAA,EAA0B,MAAM,MAAM,MAAM,UAAU,MAAM,SAAS,QAAQ,MAAM,SAAS,MAAM,OAAO,MAAM,IAAI,GAC/G,UAAA,MAAM,SADI,MAAM,IAErB,CACH,EAAA,CACL;AAAA,EAAA,GACJ;AAER;"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useToolkitTranslation } from "../../toolkit/useToolkitTranslation.js";
|
|
4
|
+
import { useToolkitNavigation } from "../../toolkit/toolkitContext.js";
|
|
5
|
+
import Breadcrumbs from "@mui/material/Breadcrumbs";
|
|
6
|
+
import Link from "@mui/material/Link";
|
|
7
|
+
import Typography from "@mui/material/Typography";
|
|
8
|
+
import { textSizeOf } from "../../theme/appleTracking.js";
|
|
9
|
+
import ScrollableRow from "../layout/ScrollableRow.js";
|
|
10
|
+
import NavigateNextIcon from "@mui/icons-material/NavigateNext";
|
|
11
|
+
function PageBreadcrumbs({ items, texts }) {
|
|
12
|
+
const { t } = useToolkitTranslation("layout", texts);
|
|
13
|
+
const { Link: RouterLink } = useToolkitNavigation();
|
|
14
|
+
if (items.length === 0) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
return /* @__PURE__ */ jsx(ScrollableRow, { py: 0, children: /* @__PURE__ */ jsx(
|
|
18
|
+
Breadcrumbs,
|
|
19
|
+
{
|
|
20
|
+
"aria-label": t("breadcrumbs"),
|
|
21
|
+
separator: /* @__PURE__ */ jsx(NavigateNextIcon, { fontSize: "small" }),
|
|
22
|
+
sx: {
|
|
23
|
+
...textSizeOf(13),
|
|
24
|
+
color: "text.secondary",
|
|
25
|
+
flex: "0 0 auto",
|
|
26
|
+
"& .MuiBreadcrumbs-ol": { flexWrap: "nowrap" },
|
|
27
|
+
"& .MuiBreadcrumbs-li": { flex: "0 0 auto" }
|
|
28
|
+
},
|
|
29
|
+
children: items.map((item, index) => {
|
|
30
|
+
const isLast = index === items.length - 1;
|
|
31
|
+
if (!isLast && item.to) {
|
|
32
|
+
return /* @__PURE__ */ jsx(Link, { component: RouterLink, to: item.to, underline: "hover", color: "inherit", sx: { fontSize: "inherit" }, children: item.label }, `${item.to}-${index}`);
|
|
33
|
+
}
|
|
34
|
+
return /* @__PURE__ */ jsx(
|
|
35
|
+
Typography,
|
|
36
|
+
{
|
|
37
|
+
component: "span",
|
|
38
|
+
"aria-current": isLast ? "page" : void 0,
|
|
39
|
+
sx: { fontSize: "inherit", fontWeight: isLast ? 500 : 400, color: isLast ? "text.primary" : "text.secondary" },
|
|
40
|
+
children: item.label
|
|
41
|
+
},
|
|
42
|
+
`${item.label}-${index}`
|
|
43
|
+
);
|
|
44
|
+
})
|
|
45
|
+
}
|
|
46
|
+
) });
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
PageBreadcrumbs as default
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=PageBreadcrumbs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageBreadcrumbs.js","sources":["../../../src/ui/navigation/PageBreadcrumbs.jsx"],"sourcesContent":["// Las migas de una pantalla (Inicio › Catálogos › Productos): cada una lleva a su pantalla menos la última, que es donde\n// ya está la persona. En el teléfono no se parten en dos renglones: se deslizan de lado en la misma tira que los filtros\n// rápidos (ScrollableRow: sin barra de desplazamiento, la orilla donde hay más se desvanece y se arrastra con el mouse).\n// Antes deslizaba la lista de MUI y salía la barra gris del navegador debajo de las migas.\n//\n// Genérico del paquete: function (regla de la casa).\nimport {useToolkitTranslation} from '@/toolkit/useToolkitTranslation.js';\nimport {useToolkitNavigation} from '@/toolkit/toolkitContext.js';\nimport Breadcrumbs from '@mui/material/Breadcrumbs';\nimport Link from '@mui/material/Link';\nimport Typography from '@mui/material/Typography';\nimport {textSizeOf} from '@/theme/appleTracking.js';\nimport ScrollableRow from '@/ui/layout/ScrollableRow.jsx';\nimport NavigateNextIcon from '@mui/icons-material/NavigateNext';\n\n/**\n * @param {object} props\n * @param {Array<{label: string, to?: string}>} props.items textos ya traducidos\n * @param {object} [props.texts] los textos que cambian, con la forma de `layout` en los textos del paquete\n */\nexport default function PageBreadcrumbs({items, texts}) {\n const {t} = useToolkitTranslation('layout', texts);\n const {Link: RouterLink} = useToolkitNavigation();\n if (items.length === 0) {\n return null;\n }\n return (\n <ScrollableRow py={0}>\n <Breadcrumbs aria-label={t('breadcrumbs')} separator={<NavigateNextIcon fontSize=\"small\" />}\n sx={{...textSizeOf(13), color: 'text.secondary', flex: '0 0 auto', '& .MuiBreadcrumbs-ol': {flexWrap: 'nowrap'},\n '& .MuiBreadcrumbs-li': {flex: '0 0 auto'}}}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n if (!isLast && item.to) {\n return (\n <Link key={`${item.to}-${index}`} component={RouterLink} to={item.to} underline=\"hover\" color=\"inherit\" sx={{fontSize: 'inherit'}}>\n {item.label}\n </Link>\n );\n }\n return (\n <Typography key={`${item.label}-${index}`} component=\"span\" aria-current={isLast ? 'page' : undefined}\n sx={{fontSize: 'inherit', fontWeight: isLast ? 500 : 400, color: isLast ? 'text.primary' : 'text.secondary'}}>\n {item.label}\n </Typography>\n );\n })}\n </Breadcrumbs>\n </ScrollableRow>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AAoBA,SAAwB,gBAAgB,EAAC,OAAO,SAAQ;AACpD,QAAM,EAAC,EAAA,IAAK,sBAAsB,UAAU,KAAK;AACjD,QAAM,EAAC,MAAM,WAAA,IAAc,qBAAA;AAC3B,MAAI,MAAM,WAAW,GAAG;AACpB,WAAO;AAAA,EACX;AACA,SACI,oBAAC,eAAA,EAAc,IAAI,GACf,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MAAY,cAAY,EAAE,aAAa;AAAA,MAAG,WAAW,oBAAC,kBAAA,EAAiB,UAAS,QAAA,CAAQ;AAAA,MAC5E,IAAI;AAAA,QAAC,GAAG,WAAW,EAAE;AAAA,QAAG,OAAO;AAAA,QAAkB,MAAM;AAAA,QAAY,wBAAwB,EAAC,UAAU,SAAA;AAAA,QACjG,wBAAwB,EAAC,MAAM,WAAA;AAAA,MAAU;AAAA,MACtD,UAAA,MAAM,IAAI,CAAC,MAAM,UAAU;AACxB,cAAM,SAAS,UAAU,MAAM,SAAS;AACxC,YAAI,CAAC,UAAU,KAAK,IAAI;AACpB,iBACI,oBAAC,QAAiC,WAAW,YAAY,IAAI,KAAK,IAAI,WAAU,SAAQ,OAAM,WAAU,IAAI,EAAC,UAAU,UAAA,GAClH,UAAA,KAAK,MAAA,GADC,GAAG,KAAK,EAAE,IAAI,KAAK,EAE9B;AAAA,QAER;AACA,eACI;AAAA,UAAC;AAAA,UAAA;AAAA,YAA0C,WAAU;AAAA,YAAO,gBAAc,SAAS,SAAS;AAAA,YAChF,IAAI,EAAC,UAAU,WAAW,YAAY,SAAS,MAAM,KAAK,OAAO,SAAS,iBAAiB,iBAAA;AAAA,YAClG,UAAA,KAAK;AAAA,UAAA;AAAA,UAFO,GAAG,KAAK,KAAK,IAAI,KAAK;AAAA,QAAA;AAAA,MAK/C,CAAC;AAAA,IAAA;AAAA,EAAA,GAET;AAER;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const COLOR_MODES = ["light", "dark"];
|
|
2
|
+
function resolvedColorModeOf(mode, systemMode) {
|
|
3
|
+
const visibleMode = mode === "system" ? systemMode : mode;
|
|
4
|
+
return COLOR_MODES.includes(visibleMode) ? visibleMode : "light";
|
|
5
|
+
}
|
|
6
|
+
function nextColorModeOf(mode, systemMode) {
|
|
7
|
+
return resolvedColorModeOf(mode, systemMode) === "dark" ? "light" : "dark";
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
nextColorModeOf,
|
|
11
|
+
resolvedColorModeOf
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=colorMode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colorMode.js","sources":["../../../src/ui/navigation/colorMode.js"],"sourcesContent":["// A qué modo lleva el interruptor de claro / oscuro (ui/navigation/ColorSchemeToggle.jsx) y en qué modo pintar lo\n// que no es de MUI (el Toaster de sonner).\n//\n// Aparte del componente para probarlo sin navegador (colorMode.test.js).\n//\n// Funciones puras, no renderizan: function (regla de la casa).\n\nconst COLOR_MODES = ['light', 'dark'];\n\n/**\n * El modo que SE ESTÁ viendo. Con mode 'system' manda lo que diga el sistema operativo; antes de montar en el cliente\n * MUI todavía no sabe el modo y regresa undefined.\n *\n * @param {string|undefined} mode 'light' | 'dark' | 'system' (useColorScheme de MUI)\n * @param {string|undefined} systemMode 'light' | 'dark' (lo que dice el sistema operativo)\n * @returns {'light'|'dark'} el modo visible; 'light' si todavía no se sabe\n */\nexport function resolvedColorModeOf(mode, systemMode) {\n const visibleMode = mode === 'system' ? systemMode : mode;\n return COLOR_MODES.includes(visibleMode) ? visibleMode : 'light';\n}\n\n/**\n * El modo al que lleva el interruptor: siempre el contrario del que se ve. Dos estados y no tres: un «Sistema» en la\n * barra le agrega una decisión al usuario sin resolverle nada.\n *\n * @param {string|undefined} mode 'light' | 'dark' | 'system'\n * @param {string|undefined} systemMode 'light' | 'dark'\n * @returns {'light'|'dark'}\n */\nexport function nextColorModeOf(mode, systemMode) {\n return resolvedColorModeOf(mode, systemMode) === 'dark' ? 'light' : 'dark';\n}\n"],"names":[],"mappings":"AAOA,MAAM,cAAc,CAAC,SAAS,MAAM;AAU7B,SAAS,oBAAoB,MAAM,YAAY;AAClD,QAAM,cAAc,SAAS,WAAW,aAAa;AACrD,SAAO,YAAY,SAAS,WAAW,IAAI,cAAc;AAC7D;AAUO,SAAS,gBAAgB,MAAM,YAAY;AAC9C,SAAO,oBAAoB,MAAM,UAAU,MAAM,SAAS,UAAU;AACxE;"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const ROOT_FONT_SIZE_PIXELS = 16;
|
|
2
|
+
const FONT_SIZE_STORAGE_KEY = "calcita:fontSize";
|
|
3
|
+
const FONT_SIZE_LEVELS = Object.freeze([
|
|
4
|
+
{ key: "normal", multiplier: 1, labelKey: "layout:fontSize.normal" },
|
|
5
|
+
{ key: "large", multiplier: 1.15, labelKey: "layout:fontSize.large" },
|
|
6
|
+
{ key: "xLarge", multiplier: 1.3, labelKey: "layout:fontSize.xLarge" }
|
|
7
|
+
]);
|
|
8
|
+
const DEFAULT_FONT_SIZE_LEVEL = "normal";
|
|
9
|
+
function rootFontSizeOf(levelKey) {
|
|
10
|
+
const level = FONT_SIZE_LEVELS.find((candidate) => candidate.key === levelKey);
|
|
11
|
+
return `${ROOT_FONT_SIZE_PIXELS * (level?.multiplier ?? 1)}px`;
|
|
12
|
+
}
|
|
13
|
+
function isFontSizeLevel(levelKey) {
|
|
14
|
+
return FONT_SIZE_LEVELS.some((level) => level.key === levelKey);
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
DEFAULT_FONT_SIZE_LEVEL,
|
|
18
|
+
FONT_SIZE_LEVELS,
|
|
19
|
+
FONT_SIZE_STORAGE_KEY,
|
|
20
|
+
ROOT_FONT_SIZE_PIXELS,
|
|
21
|
+
isFontSizeLevel,
|
|
22
|
+
rootFontSizeOf
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=fontSizeLevels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fontSizeLevels.js","sources":["../../../src/ui/navigation/fontSizeLevels.js"],"sourcesContent":["// Los tamaños de letra que la persona puede elegir (del tema de walk-ot). Todo el tema está en rem, así que basta con\n// cambiar la letra de la raíz (<html>) para que crezca toda la pantalla, también las tablas y los diálogos.\n//\n// Funciones puras, sin React: function (regla de la casa).\n\n/** La letra de la raíz del navegador: la base de los rem. Con menos de 16 px el iPhone hace zoom al entrar a un campo. */\nexport const ROOT_FONT_SIZE_PIXELS = 16;\n\n/** Dónde se recuerda la elección en este navegador. */\nexport const FONT_SIZE_STORAGE_KEY = 'calcita:fontSize';\n\n/** Los niveles: su llave, cuánto crece la letra y su texto. */\nexport const FONT_SIZE_LEVELS = Object.freeze([\n {key: 'normal', multiplier: 1, labelKey: 'layout:fontSize.normal'},\n {key: 'large', multiplier: 1.15, labelKey: 'layout:fontSize.large'},\n {key: 'xLarge', multiplier: 1.3, labelKey: 'layout:fontSize.xLarge'},\n]);\n\nexport const DEFAULT_FONT_SIZE_LEVEL = 'normal';\n\n/**\n * La letra de la raíz para un nivel; con una llave que no existe, la normal.\n *\n * @param {string} levelKey\n * @returns {string} p. ej. '18.4px'\n */\nexport function rootFontSizeOf(levelKey) {\n const level = FONT_SIZE_LEVELS.find((candidate) => candidate.key === levelKey);\n return `${ROOT_FONT_SIZE_PIXELS * (level?.multiplier ?? 1)}px`;\n}\n\n/**\n * ¿Es un nivel que existe? (lo guardado en el navegador puede venir de otra versión).\n *\n * @param {unknown} levelKey\n * @returns {boolean}\n */\nexport function isFontSizeLevel(levelKey) {\n return FONT_SIZE_LEVELS.some((level) => level.key === levelKey);\n}\n"],"names":[],"mappings":"AAMY,MAAC,wBAAwB;AAGzB,MAAC,wBAAwB;AAGzB,MAAC,mBAAmB,OAAO,OAAO;AAAA,EAC1C,EAAC,KAAK,UAAU,YAAY,GAAG,UAAU,yBAAwB;AAAA,EACjE,EAAC,KAAK,SAAS,YAAY,MAAM,UAAU,wBAAuB;AAAA,EAClE,EAAC,KAAK,UAAU,YAAY,KAAK,UAAU,yBAAwB;AACvE,CAAC;AAEW,MAAC,0BAA0B;AAQhC,SAAS,eAAe,UAAU;AACrC,QAAM,QAAQ,iBAAiB,KAAK,CAAC,cAAc,UAAU,QAAQ,QAAQ;AAC7E,SAAO,GAAG,yBAAyB,OAAO,cAAc,EAAE;AAC9D;AAQO,SAAS,gBAAgB,UAAU;AACtC,SAAO,iBAAiB,KAAK,CAAC,UAAU,MAAM,QAAQ,QAAQ;AAClE;"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useState, useEffect, useCallback } from "react";
|
|
3
|
+
import { DEFAULT_FONT_SIZE_LEVEL, FONT_SIZE_STORAGE_KEY, isFontSizeLevel, rootFontSizeOf, FONT_SIZE_LEVELS } from "./fontSizeLevels.js";
|
|
4
|
+
const FONT_SIZE_CHANGE_EVENT = "calcita:font-size";
|
|
5
|
+
function useFontSize() {
|
|
6
|
+
const [level, setLevelState] = useState(DEFAULT_FONT_SIZE_LEVEL);
|
|
7
|
+
const [isMounted, setIsMounted] = useState(false);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
try {
|
|
10
|
+
const storedLevel = window.localStorage.getItem(FONT_SIZE_STORAGE_KEY);
|
|
11
|
+
if (isFontSizeLevel(storedLevel)) {
|
|
12
|
+
setLevelState(storedLevel);
|
|
13
|
+
}
|
|
14
|
+
} catch {
|
|
15
|
+
}
|
|
16
|
+
setIsMounted(true);
|
|
17
|
+
}, []);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
const followOtherCopies = (event) => setLevelState(event.detail);
|
|
20
|
+
window.addEventListener(FONT_SIZE_CHANGE_EVENT, followOtherCopies);
|
|
21
|
+
return () => window.removeEventListener(FONT_SIZE_CHANGE_EVENT, followOtherCopies);
|
|
22
|
+
}, []);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (isMounted) {
|
|
25
|
+
document.documentElement.style.fontSize = rootFontSizeOf(level);
|
|
26
|
+
}
|
|
27
|
+
}, [level, isMounted]);
|
|
28
|
+
const setLevel = useCallback((levelKey) => {
|
|
29
|
+
if (!isFontSizeLevel(levelKey)) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
setLevelState(levelKey);
|
|
33
|
+
try {
|
|
34
|
+
window.localStorage.setItem(FONT_SIZE_STORAGE_KEY, levelKey);
|
|
35
|
+
} catch {
|
|
36
|
+
}
|
|
37
|
+
window.dispatchEvent(new CustomEvent(FONT_SIZE_CHANGE_EVENT, { detail: levelKey }));
|
|
38
|
+
}, []);
|
|
39
|
+
return { level, setLevel, isMounted, levels: FONT_SIZE_LEVELS };
|
|
40
|
+
}
|
|
41
|
+
export {
|
|
42
|
+
useFontSize
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=useFontSize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFontSize.js","sources":["../../../src/ui/navigation/useFontSize.js"],"sourcesContent":["// El tamaño de letra elegido, recordado en este navegador (del tema de walk-ot).\n//\n// - Se lee al montar en el cliente: en el servidor no hay almacenamiento y la primera pintura es la normal.\n// - Sin almacenamiento (ventana privada estricta) funciona igual; solo no se recuerda.\n//\n// Hook genérico del paquete: function (regla de la casa).\nimport {useCallback, useEffect, useState} from 'react';\n\nimport {\n DEFAULT_FONT_SIZE_LEVEL, FONT_SIZE_LEVELS, FONT_SIZE_STORAGE_KEY, isFontSizeLevel, rootFontSizeOf,\n} from '@/ui/navigation/fontSizeLevels.js';\n\n// el aviso entre copias del gancho cuando la persona cambia el tamaño\nconst FONT_SIZE_CHANGE_EVENT = 'calcita:font-size';\n\n/**\n * @returns {{level: string, setLevel: (levelKey: string) => void, isMounted: boolean, levels: typeof FONT_SIZE_LEVELS}}\n */\nexport function useFontSize() {\n const [level, setLevelState] = useState(DEFAULT_FONT_SIZE_LEVEL);\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n try {\n const storedLevel = window.localStorage.getItem(FONT_SIZE_STORAGE_KEY);\n if (isFontSizeLevel(storedLevel)) {\n setLevelState(storedLevel);\n }\n } catch {\n // almacenamiento bloqueado: se queda la normal\n }\n setIsMounted(true);\n }, []);\n\n // otra copia del gancho (el menú de la cuenta, «Mi perfil») cambió el tamaño: esta también se entera\n useEffect(() => {\n const followOtherCopies = (event) => setLevelState(event.detail);\n window.addEventListener(FONT_SIZE_CHANGE_EVENT, followOtherCopies);\n return () => window.removeEventListener(FONT_SIZE_CHANGE_EVENT, followOtherCopies);\n }, []);\n\n useEffect(() => {\n if (isMounted) {\n document.documentElement.style.fontSize = rootFontSizeOf(level);\n }\n }, [level, isMounted]);\n\n const setLevel = useCallback((levelKey) => {\n if (!isFontSizeLevel(levelKey)) {\n return;\n }\n setLevelState(levelKey);\n try {\n window.localStorage.setItem(FONT_SIZE_STORAGE_KEY, levelKey);\n } catch {\n // almacenamiento bloqueado: cambia igual, solo no se recuerda\n }\n window.dispatchEvent(new CustomEvent(FONT_SIZE_CHANGE_EVENT, {detail: levelKey}));\n }, []);\n\n return {level, setLevel, isMounted, levels: FONT_SIZE_LEVELS};\n}\n"],"names":[],"mappings":";;;AAaA,MAAM,yBAAyB;AAKxB,SAAS,cAAc;AAC1B,QAAM,CAAC,OAAO,aAAa,IAAI,SAAS,uBAAuB;AAC/D,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAEhD,YAAU,MAAM;AACZ,QAAI;AACA,YAAM,cAAc,OAAO,aAAa,QAAQ,qBAAqB;AACrE,UAAI,gBAAgB,WAAW,GAAG;AAC9B,sBAAc,WAAW;AAAA,MAC7B;AAAA,IACJ,QAAQ;AAAA,IAER;AACA,iBAAa,IAAI;AAAA,EACrB,GAAG,CAAA,CAAE;AAGL,YAAU,MAAM;AACZ,UAAM,oBAAoB,CAAC,UAAU,cAAc,MAAM,MAAM;AAC/D,WAAO,iBAAiB,wBAAwB,iBAAiB;AACjE,WAAO,MAAM,OAAO,oBAAoB,wBAAwB,iBAAiB;AAAA,EACrF,GAAG,CAAA,CAAE;AAEL,YAAU,MAAM;AACZ,QAAI,WAAW;AACX,eAAS,gBAAgB,MAAM,WAAW,eAAe,KAAK;AAAA,IAClE;AAAA,EACJ,GAAG,CAAC,OAAO,SAAS,CAAC;AAErB,QAAM,WAAW,YAAY,CAAC,aAAa;AACvC,QAAI,CAAC,gBAAgB,QAAQ,GAAG;AAC5B;AAAA,IACJ;AACA,kBAAc,QAAQ;AACtB,QAAI;AACA,aAAO,aAAa,QAAQ,uBAAuB,QAAQ;AAAA,IAC/D,QAAQ;AAAA,IAER;AACA,WAAO,cAAc,IAAI,YAAY,wBAAwB,EAAC,QAAQ,SAAQ,CAAC,CAAC;AAAA,EACpF,GAAG,CAAA,CAAE;AAEL,SAAO,EAAC,OAAO,UAAU,WAAW,QAAQ,iBAAgB;AAChE;"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import Timeline from "@mui/lab/Timeline";
|
|
5
|
+
import TimelineConnector from "@mui/lab/TimelineConnector";
|
|
6
|
+
import TimelineContent from "@mui/lab/TimelineContent";
|
|
7
|
+
import TimelineDot from "@mui/lab/TimelineDot";
|
|
8
|
+
import TimelineItem, { timelineItemClasses } from "@mui/lab/TimelineItem";
|
|
9
|
+
import TimelineOppositeContent from "@mui/lab/TimelineOppositeContent";
|
|
10
|
+
import TimelineSeparator from "@mui/lab/TimelineSeparator";
|
|
11
|
+
import Box from "@mui/material/Box";
|
|
12
|
+
import ButtonBase from "@mui/material/ButtonBase";
|
|
13
|
+
import Chip from "@mui/material/Chip";
|
|
14
|
+
import Collapse from "@mui/material/Collapse";
|
|
15
|
+
import Stack from "@mui/material/Stack";
|
|
16
|
+
import Typography from "@mui/material/Typography";
|
|
17
|
+
import useMediaQuery from "@mui/material/useMediaQuery";
|
|
18
|
+
import { useTheme } from "@mui/material/styles";
|
|
19
|
+
import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
|
|
20
|
+
import { paletteOf } from "../../theme/components/paletteOf.js";
|
|
21
|
+
import { TIMELINE_EMPHASIS, timelineDotOf } from "./timelineDot.js";
|
|
22
|
+
const HIGHLIGHT_TINT_PERCENT = 8;
|
|
23
|
+
const LEFT_ALIGNED_TIMELINE = { m: 0, px: 0, py: 0.5, [`& .${timelineItemClasses.root}::before`]: { flex: 0, p: 0 } };
|
|
24
|
+
const ALTERNATE_TIMELINE = { m: 0, px: 0, py: 0.5 };
|
|
25
|
+
function GroupedTimeline({ groups, onGroupToggle }) {
|
|
26
|
+
const theme = useTheme();
|
|
27
|
+
const isWide = useMediaQuery(theme.breakpoints.up("md"));
|
|
28
|
+
const [expandedKeys, setExpandedKeys] = useState(() => new Set(
|
|
29
|
+
groups.filter((timelineGroup) => timelineGroup.defaultExpanded !== false).map((timelineGroup) => timelineGroup.key)
|
|
30
|
+
));
|
|
31
|
+
const toggleGroup = (groupKey) => {
|
|
32
|
+
const isOpening = !expandedKeys.has(groupKey);
|
|
33
|
+
const nextKeys = new Set(expandedKeys);
|
|
34
|
+
if (isOpening) {
|
|
35
|
+
nextKeys.add(groupKey);
|
|
36
|
+
} else {
|
|
37
|
+
nextKeys.delete(groupKey);
|
|
38
|
+
}
|
|
39
|
+
setExpandedKeys(nextKeys);
|
|
40
|
+
onGroupToggle?.(groupKey, isOpening);
|
|
41
|
+
};
|
|
42
|
+
return /* @__PURE__ */ jsx(Stack, { spacing: 1.5, children: groups.map((timelineGroup) => {
|
|
43
|
+
const emphasis = timelineGroup.emphasis ?? TIMELINE_EMPHASIS.normal;
|
|
44
|
+
const isHighlighted = emphasis === TIMELINE_EMPHASIS.highlighted;
|
|
45
|
+
const isMuted = emphasis === TIMELINE_EMPHASIS.muted;
|
|
46
|
+
const isCollapsible = Boolean(timelineGroup.isCollapsible && timelineGroup.title);
|
|
47
|
+
const isExpanded = !isCollapsible || expandedKeys.has(timelineGroup.key);
|
|
48
|
+
return (
|
|
49
|
+
// el borde transparente en los demás grupos mantiene todo alineado con el grupo resaltado
|
|
50
|
+
/* @__PURE__ */ jsxs(Box, { sx: {
|
|
51
|
+
border: 1,
|
|
52
|
+
borderRadius: 1.5,
|
|
53
|
+
px: 1.5,
|
|
54
|
+
pt: 1.25,
|
|
55
|
+
pb: isExpanded ? 0 : 1.25,
|
|
56
|
+
borderColor: isHighlighted ? "primary.main" : "transparent",
|
|
57
|
+
// un tinte del color principal: primary.lighter no existe en el tema de MUI y el grupo se quedaba sin fondo
|
|
58
|
+
bgcolor: (theme2) => isHighlighted ? `color-mix(in srgb, ${paletteOf(theme2).primary.main} ${HIGHLIGHT_TINT_PERCENT}%, transparent)` : "transparent"
|
|
59
|
+
}, children: [
|
|
60
|
+
timelineGroup.title && /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, sx: { alignItems: "center", justifyContent: isWide ? "center" : "flex-start" }, children: [
|
|
61
|
+
/* @__PURE__ */ jsxs(
|
|
62
|
+
ButtonBase,
|
|
63
|
+
{
|
|
64
|
+
disabled: !isCollapsible,
|
|
65
|
+
onClick: () => toggleGroup(timelineGroup.key),
|
|
66
|
+
"aria-expanded": isCollapsible ? isExpanded : void 0,
|
|
67
|
+
sx: { gap: 1, px: 1, py: 0.25, borderRadius: 1, "&.Mui-disabled": { pointerEvents: "none" } },
|
|
68
|
+
children: [
|
|
69
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", component: "h3", sx: { fontWeight: 700, color: isMuted ? "text.secondary" : "text.primary" }, children: timelineGroup.title }),
|
|
70
|
+
isCollapsible && timelineGroup.summary && /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", component: "span", children: timelineGroup.summary }),
|
|
71
|
+
isCollapsible && /* @__PURE__ */ jsx(ExpandMoreIcon, { fontSize: "small", sx: {
|
|
72
|
+
color: "text.secondary",
|
|
73
|
+
transition: theme.transitions.create("transform"),
|
|
74
|
+
transform: isExpanded ? "rotate(180deg)" : "none"
|
|
75
|
+
} })
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
),
|
|
79
|
+
timelineGroup.badge && /* @__PURE__ */ jsx(Chip, { size: "small", color: "primary", label: timelineGroup.badge })
|
|
80
|
+
] }),
|
|
81
|
+
/* @__PURE__ */ jsx(Collapse, { in: isExpanded, unmountOnExit: true, children: /* @__PURE__ */ jsx(Timeline, { position: isWide ? "alternate" : "right", sx: isWide ? ALTERNATE_TIMELINE : LEFT_ALIGNED_TIMELINE, children: timelineGroup.items.map((timelineEntry, entryPosition) => {
|
|
82
|
+
const EntryIcon = timelineEntry.icon;
|
|
83
|
+
const isFirstEntry = entryPosition === 0;
|
|
84
|
+
const isLastEntry = entryPosition === timelineGroup.items.length - 1;
|
|
85
|
+
return /* @__PURE__ */ jsxs(TimelineItem, { children: [
|
|
86
|
+
isWide && /* @__PURE__ */ jsx(TimelineOppositeContent, { variant: "body2", color: "text.secondary", sx: { m: "auto 0" }, children: timelineEntry.timestamp }),
|
|
87
|
+
/* @__PURE__ */ jsxs(TimelineSeparator, { children: [
|
|
88
|
+
/* @__PURE__ */ jsx(TimelineConnector, { sx: { visibility: isFirstEntry ? "hidden" : "visible" } }),
|
|
89
|
+
/* @__PURE__ */ jsx(TimelineDot, { ...timelineDotOf({ emphasis, tone: timelineEntry.tone }), children: EntryIcon && /* @__PURE__ */ jsx(EntryIcon, { fontSize: "small" }) }),
|
|
90
|
+
/* @__PURE__ */ jsx(TimelineConnector, { sx: { visibility: isLastEntry ? "hidden" : "visible" } })
|
|
91
|
+
] }),
|
|
92
|
+
/* @__PURE__ */ jsxs(TimelineContent, { sx: { py: 1.5, px: 2, minWidth: 0 }, children: [
|
|
93
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", component: "p", sx: { fontWeight: 600, color: isMuted ? "text.secondary" : "text.primary" }, children: timelineEntry.title }),
|
|
94
|
+
!isWide && timelineEntry.timestamp && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "text.secondary", component: "p", children: timelineEntry.timestamp }),
|
|
95
|
+
timelineEntry.details
|
|
96
|
+
] })
|
|
97
|
+
] }, timelineEntry.key);
|
|
98
|
+
}) }) })
|
|
99
|
+
] }, timelineGroup.key)
|
|
100
|
+
);
|
|
101
|
+
}) });
|
|
102
|
+
}
|
|
103
|
+
export {
|
|
104
|
+
GroupedTimeline as default
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=GroupedTimeline.js.map
|