@micha.bigler/ui-core-micha 3.14.3 → 4.0.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/CHANGELOG.md +31 -0
- package/README.md +7 -0
- package/dist/auth/UserMenu.js +1 -1
- package/dist/auth/apiClient.js +7 -6
- package/dist/chat/ChatList.js +1 -1
- package/dist/chat/ChatThread.js +2 -1
- package/dist/chat/ChatWorkspace.js +1 -1
- package/dist/chat/ModelPicker.js +2 -5
- package/dist/chat/kitSxRegistry.js +9 -0
- package/dist/chat/useChatSocket.js +1 -1
- package/dist/components/LoginForm.js +1 -1
- package/dist/components/SecurityComponent.js +1 -1
- package/dist/components/UserListComponent.js +2 -8
- package/dist/components/charts/ChartFrame.js +1 -1
- package/dist/components/charts/ScatterChart.js +2 -1
- package/dist/components/charts/kitSxRegistry.js +6 -0
- package/dist/entries/charts.js +6 -0
- package/dist/entries/chat.js +8 -0
- package/dist/entries/markdown.js +1 -0
- package/dist/index.js +0 -14
- package/dist/layout/SectionNav.js +1 -1
- package/dist/messaging/AttachmentList.js +2 -2
- package/dist/messaging/Composer.js +2 -1
- package/dist/messaging/ConversationLaunchers.js +1 -4
- package/dist/messaging/ConversationList.js +1 -1
- package/dist/messaging/DirectMessageLauncher.js +1 -1
- package/dist/messaging/MessagingProvider.js +0 -0
- package/dist/messaging/PollCard.js +7 -5
- package/dist/messaging/ReadTicks.js +2 -2
- package/dist/messaging/Thread.js +5 -3
- package/dist/notifications/NotificationBell.js +4 -7
- package/dist/notifications/NotificationSettings.js +1 -1
- package/dist/onboarding/OnboardingProvider.js +3 -6
- package/dist/pages/AccountPage.js +1 -2
- package/dist/pages/LoginPage.js +2 -3
- package/dist/pages/PasswordChangePage.js +2 -3
- package/dist/pages/PasswordInvitePage.js +2 -3
- package/dist/pages/PasswordResetRequestPage.js +2 -3
- package/dist/pages/SignUpPage.js +2 -3
- package/dist/pages/SignupConfirmPage.js +2 -3
- package/dist/theme/createAppTheme.js +5 -4
- package/dist/theme/kitSxEntry.js +11 -0
- package/dist/theme/kitSxRegistry.js +2 -15
- package/dist/theme/themeCompleteness.js +3 -12
- package/dist/utils/auth-errors.js +4 -3
- package/package.json +41 -16
- package/.github/workflows/publish.yml +0 -126
- package/DESIGN.md +0 -60
- package/WORK_ORDERS.md +0 -148
- package/dev/entries.jsx +0 -721
- package/dev/fixtures.js +0 -26
- package/dev/main.jsx +0 -75
- package/dev/mockTransport.jsx +0 -128
- package/docs/CHART-LAYOUT.md +0 -157
- package/docs/DARK-TOKENS.md +0 -140
- package/docs/TYPE-SCALE.md +0 -111
- package/docs/messaging-deviations.md +0 -118
- package/index.html +0 -12
- package/renovate.json +0 -10
- package/scripts/chart-api-census.mjs +0 -415
- package/src/auth/AuthContext.jsx +0 -158
- package/src/auth/ReauthModal.jsx +0 -82
- package/src/auth/UserMenu.jsx +0 -121
- package/src/auth/apiClient.jsx +0 -232
- package/src/auth/authApi.jsx +0 -539
- package/src/auth/authConfig.jsx +0 -34
- package/src/auth/reauth.js +0 -47
- package/src/chat/ChatComposer.jsx +0 -36
- package/src/chat/ChatList.jsx +0 -87
- package/src/chat/ChatThread.jsx +0 -128
- package/src/chat/ChatWorkspace.jsx +0 -244
- package/src/chat/MarkdownReply.jsx +0 -22
- package/src/chat/ModelPicker.jsx +0 -85
- package/src/chat/api.js +0 -18
- package/src/chat/useChatSocket.js +0 -32
- package/src/chat/wire.js +0 -7
- package/src/components/AccessCodeManager.jsx +0 -288
- package/src/components/AccessCodeSingleUseToggle.jsx +0 -92
- package/src/components/AllowedEmailDomainsManager.jsx +0 -92
- package/src/components/AuthFactorRequirementCard.jsx +0 -95
- package/src/components/BulkInviteCsvTab.jsx +0 -198
- package/src/components/EmptyState.jsx +0 -38
- package/src/components/LoginForm.jsx +0 -159
- package/src/components/MFAComponent.jsx +0 -350
- package/src/components/MfaLoginComponent.jsx +0 -252
- package/src/components/MobileBottomNav.jsx +0 -82
- package/src/components/PasskeysComponent.jsx +0 -252
- package/src/components/PasswordChangeForm.jsx +0 -87
- package/src/components/PasswordResetRequestForm.jsx +0 -43
- package/src/components/PasswordSetForm.jsx +0 -97
- package/src/components/ProfileComponent.jsx +0 -348
- package/src/components/QrSignupManager.jsx +0 -404
- package/src/components/QrSignupValidityManager.jsx +0 -106
- package/src/components/RegistrationMethodsManager.jsx +0 -150
- package/src/components/SecurityComponent.jsx +0 -141
- package/src/components/SocialLoginButtons.jsx +0 -83
- package/src/components/SoftChip.jsx +0 -93
- package/src/components/StatTile.jsx +0 -39
- package/src/components/SupportRecoveryRequestsTab.jsx +0 -482
- package/src/components/TurnstileWidget.jsx +0 -99
- package/src/components/UserInviteComponent.jsx +0 -76
- package/src/components/UserListComponent.jsx +0 -618
- package/src/components/charts/BarChart.jsx +0 -102
- package/src/components/charts/ChartFrame.jsx +0 -214
- package/src/components/charts/LineChart.jsx +0 -126
- package/src/components/charts/ScatterChart.jsx +0 -299
- package/src/components/charts/TimeSeriesChart.jsx +0 -300
- package/src/components/charts/chartDefaults.js +0 -644
- package/src/components/charts/chartLabels.js +0 -36
- package/src/components/charts/exportChart.js +0 -258
- package/src/components/charts/formatters.js +0 -39
- package/src/components/charts/palette.js +0 -33
- package/src/components/charts/yearTickInterval.js +0 -7
- package/src/i18n/authTranslations.ts +0 -2651
- package/src/i18n/chartsTranslations.ts +0 -91
- package/src/i18n/chatTranslations.ts +0 -55
- package/src/i18n/messagingTranslations.ts +0 -120
- package/src/i18n/notificationsTranslations.ts +0 -32
- package/src/i18n/onboardingTranslations.ts +0 -29
- package/src/i18n/sectionNavTranslations.ts +0 -20
- package/src/i18n/uiCoreTranslations.js +0 -29
- package/src/i18n/userMenuTranslations.ts +0 -5
- package/src/index.js +0 -158
- package/src/layout/PageLayout.jsx +0 -36
- package/src/layout/SectionNav.jsx +0 -320
- package/src/messaging/AttachmentList.jsx +0 -145
- package/src/messaging/Composer.jsx +0 -197
- package/src/messaging/ConversationLaunchers.jsx +0 -51
- package/src/messaging/ConversationList.jsx +0 -109
- package/src/messaging/DirectMessageLauncher.jsx +0 -112
- package/src/messaging/MessageBubble.jsx +0 -183
- package/src/messaging/MessagingProvider.jsx +0 -0
- package/src/messaging/MessagingScopeConfig.jsx +0 -24
- package/src/messaging/PollCard.jsx +0 -163
- package/src/messaging/ReactionBar.jsx +0 -43
- package/src/messaging/ReadTicks.jsx +0 -82
- package/src/messaging/Thread.jsx +0 -195
- package/src/messaging/api.js +0 -48
- package/src/messaging/composerImageCompression.js +0 -35
- package/src/messaging/linkifyText.jsx +0 -37
- package/src/notifications/NotificationBell.jsx +0 -84
- package/src/notifications/NotificationSettings.jsx +0 -330
- package/src/notifications/NotificationsProvider.jsx +0 -224
- package/src/notifications/PopupSurface.jsx +0 -105
- package/src/notifications/api.js +0 -55
- package/src/notifications/feedApi.js +0 -18
- package/src/notifications/realtime.jsx +0 -138
- package/src/notifications/serviceWorker/sw.js +0 -50
- package/src/onboarding/OnboardingProvider.jsx +0 -326
- package/src/onboarding/OnboardingWizard.jsx +0 -61
- package/src/onboarding/WizardDialogShell.jsx +0 -51
- package/src/onboarding/api.js +0 -13
- package/src/onboarding/stepSelection.js +0 -16
- package/src/onboarding/steps/BrowserPushStep.jsx +0 -121
- package/src/onboarding/steps/CompleteNameStep.jsx +0 -46
- package/src/onboarding/steps/CookieConsentStep.jsx +0 -133
- package/src/onboarding/steps/PwaInstallStep.jsx +0 -47
- package/src/pages/AccountPage.jsx +0 -394
- package/src/pages/LoginPage.jsx +0 -343
- package/src/pages/PasswordChangePage.jsx +0 -62
- package/src/pages/PasswordInvitePage.jsx +0 -177
- package/src/pages/PasswordResetRequestPage.jsx +0 -68
- package/src/pages/SignUpPage.jsx +0 -268
- package/src/pages/SignupConfirmPage.jsx +0 -155
- package/src/testing/checkKitIntegration.js +0 -233
- package/src/theme/createAppTheme.js +0 -423
- package/src/theme/fonts.js +0 -3
- package/src/theme/index.js +0 -21
- package/src/theme/kitSxRegistry.js +0 -285
- package/src/theme/themeCompleteness.js +0 -1045
- package/src/theme/tokens.js +0 -478
- package/src/utils/auth-errors.js +0 -76
- package/src/utils/authService.js +0 -223
- package/src/utils/resolveErrorText.js +0 -28
- package/src/utils/webauthn.js +0 -51
- package/tests/AccountPage.profileStatements.test.jsx +0 -162
- package/tests/AccountPage.test.jsx +0 -200
- package/tests/AuthContext.test.jsx +0 -129
- package/tests/BarChart.test.jsx +0 -112
- package/tests/BrowserPushStep.test.jsx +0 -110
- package/tests/ChartFrame.test.jsx +0 -336
- package/tests/ConversationList.test.jsx +0 -144
- package/tests/CookieConsentStep.test.jsx +0 -69
- package/tests/EmptyState.test.jsx +0 -62
- package/tests/LineChart.test.jsx +0 -80
- package/tests/MessagingProvider.test.jsx +0 -50
- package/tests/MobileBottomNav.test.jsx +0 -319
- package/tests/NotificationBell.test.jsx +0 -60
- package/tests/NotificationSettings.test.jsx +0 -276
- package/tests/NotificationsProvider.test.jsx +0 -240
- package/tests/OnboardingProvider.test.jsx +0 -294
- package/tests/OnboardingWizard.test.jsx +0 -143
- package/tests/PasswordChangeForm.test.jsx +0 -70
- package/tests/PasswordInvitePage.test.jsx +0 -142
- package/tests/PasswordSetForm.test.jsx +0 -70
- package/tests/PopupSurface.test.jsx +0 -142
- package/tests/ProfileComponent.refresh.test.jsx +0 -194
- package/tests/QrSignupManager.registrationContext.test.jsx +0 -106
- package/tests/QrSignupManagerInfoBox.test.jsx +0 -49
- package/tests/ScatterChart.test.jsx +0 -270
- package/tests/SectionNav.test.jsx +0 -363
- package/tests/SignUpPage.test.jsx +0 -208
- package/tests/SoftChip.test.jsx +0 -105
- package/tests/StatTile.test.jsx +0 -57
- package/tests/Thread.test.jsx +0 -151
- package/tests/TimeSeriesChart.test.jsx +0 -367
- package/tests/UserListComponent.test.jsx +0 -192
- package/tests/UserMenu.test.jsx +0 -171
- package/tests/apiClientLanguage.test.js +0 -33
- package/tests/apiClientPublicPaths.test.js +0 -178
- package/tests/authApiLogin.test.js +0 -42
- package/tests/authApiRegistration.test.js +0 -31
- package/tests/authErrorCodeRendering.test.jsx +0 -77
- package/tests/authErrors.test.js +0 -74
- package/tests/authTranslations.test.js +0 -74
- package/tests/chart-api-census.test.js +0 -366
- package/tests/chartAxisTickBand.test.jsx +0 -95
- package/tests/chartDefaults.test.js +0 -902
- package/tests/chartLabels.test.js +0 -50
- package/tests/chartsPalette.test.js +0 -99
- package/tests/chatApi.test.js +0 -48
- package/tests/chatDriverNames.test.jsx +0 -71
- package/tests/chatExports.test.js +0 -3
- package/tests/chatList.test.jsx +0 -84
- package/tests/chatPicker.test.jsx +0 -82
- package/tests/chatSocket.test.jsx +0 -26
- package/tests/chatThread.test.jsx +0 -116
- package/tests/chatTranslations.test.js +0 -47
- package/tests/chatWorkspace.test.jsx +0 -234
- package/tests/checkKitIntegration.test.jsx +0 -219
- package/tests/createAppTheme.test.js +0 -132
- package/tests/createAppThemeDark.test.js +0 -127
- package/tests/createAppThemeLightGuard.test.js +0 -40
- package/tests/createAppThemePageContrast.test.js +0 -108
- package/tests/createAppThemeTypography.test.js +0 -53
- package/tests/errorCallSiteGuard.test.js +0 -32
- package/tests/exportChart.test.js +0 -313
- package/tests/feedApi.test.js +0 -46
- package/tests/fixtures/light-theme-baseline.json +0 -2234
- package/tests/i18nAggregate.test.js +0 -120
- package/tests/i18nGermanVariant.test.js +0 -65
- package/tests/loginPageErrorResolution.test.jsx +0 -102
- package/tests/messagingApi.test.js +0 -32
- package/tests/messagingChunk6.test.jsx +0 -116
- package/tests/messagingCompactBubble.test.jsx +0 -64
- package/tests/messagingComposer.test.jsx +0 -136
- package/tests/messagingComposerChunk5.test.jsx +0 -113
- package/tests/messagingContractConformance.test.js +0 -69
- package/tests/messagingDirectMessageLauncher.test.jsx +0 -151
- package/tests/messagingExports.test.js +0 -21
- package/tests/messagingInteractions.test.jsx +0 -136
- package/tests/messagingLastMessagePreview.test.jsx +0 -93
- package/tests/messagingLinkify.test.jsx +0 -51
- package/tests/messagingMessageActions.test.jsx +0 -163
- package/tests/messagingMsg6.test.jsx +0 -105
- package/tests/messagingMsg6f.test.jsx +0 -155
- package/tests/messagingMsg6g.test.jsx +0 -166
- package/tests/messagingMsg6h.test.jsx +0 -136
- package/tests/messagingMsg6i.test.jsx +0 -129
- package/tests/messagingPollRendering.test.jsx +0 -142
- package/tests/messagingReactionMerge.test.jsx +0 -77
- package/tests/messagingReadTicksTooltip.test.jsx +0 -36
- package/tests/messagingThreadReceipts.test.jsx +0 -178
- package/tests/messagingThreadingQuoting.test.jsx +0 -87
- package/tests/messagingUnreadLifecycle.test.jsx +0 -78
- package/tests/notificationsApi.test.js +0 -41
- package/tests/notificationsExports.test.js +0 -34
- package/tests/onboardingDescriptors.test.js +0 -132
- package/tests/packageTreeShaking.test.js +0 -126
- package/tests/realtime.test.jsx +0 -219
- package/tests/resolveErrorText.test.js +0 -72
- package/tests/stepSelection.test.js +0 -53
- package/tests/themeCompleteness.test.js +0 -626
- package/tests/timeSeriesLegend.test.js +0 -99
- package/tests/userScreenTranslations.test.jsx +0 -218
- package/tsconfig.build.json +0 -18
- package/vite.config.mjs +0 -6
- package/work-orders/AUTH-1.md +0 -74
- package/work-orders/AUTH-2.md +0 -74
- package/work-orders/AUTH-4.md +0 -183
- package/work-orders/AUTH-5.md +0 -154
- package/work-orders/AUTH-7.md +0 -181
- package/work-orders/AUTH-8.md +0 -184
- package/work-orders/CHART-1.md +0 -285
- package/work-orders/CHART-2.md +0 -222
- package/work-orders/CHART-3.md +0 -163
- package/work-orders/CHART-4.md +0 -203
- package/work-orders/CHART-5.md +0 -226
- package/work-orders/CHART-6.md +0 -428
- package/work-orders/CHART-7.md +0 -175
- package/work-orders/DX-1.md +0 -169
- package/work-orders/DX-2.md +0 -188
- package/work-orders/DX-3.md +0 -195
- package/work-orders/I18N-1.md +0 -254
- package/work-orders/I18N-3.md +0 -207
- package/work-orders/MSG-3.md +0 -375
- package/work-orders/MSG-3b.md +0 -1002
- package/work-orders/MSG-3c.md +0 -378
- package/work-orders/MSG-3d.md +0 -268
- package/work-orders/MSG-3e.md +0 -164
- package/work-orders/MSG-3f.md +0 -391
- package/work-orders/MSG-6e.md +0 -308
- package/work-orders/MSG-6f.md +0 -214
- package/work-orders/MSG-6g.md +0 -244
- package/work-orders/MSG-6h.md +0 -238
- package/work-orders/MSG-6i.md +0 -271
- package/work-orders/MSG-6j.md +0 -117
- package/work-orders/NOTIF-12.md +0 -214
- package/work-orders/NOTIF-13.md +0 -142
- package/work-orders/NOTIF-14.md +0 -151
- package/work-orders/PRIM-1.md +0 -177
- package/work-orders/SHELL-1.md +0 -255
- package/work-orders/SHELL-2.md +0 -197
- package/work-orders/SHELL-3.md +0 -359
- package/work-orders/SHELL-4.md +0 -351
- package/work-orders/SHELL-5.md +0 -345
- package/work-orders/SHELL-6.md +0 -210
- package/work-orders/THEME-1.md +0 -587
- package/work-orders/THEME-10.md +0 -303
- package/work-orders/THEME-11.md +0 -208
- package/work-orders/THEME-2.md +0 -339
- package/work-orders/THEME-3.md +0 -210
- package/work-orders/THEME-4.md +0 -271
- package/work-orders/THEME-5.md +0 -341
- package/work-orders/THEME-6.md +0 -247
- package/work-orders/THEME-7.md +0 -82
- package/work-orders/THEME-8.md +0 -211
- package/work-orders/THEME-9.md +0 -194
- package/work-orders/UCM-AUTH-10.md +0 -490
- package/work-orders/UCM-AUTH-11.md +0 -185
- package/work-orders/UCM-AUTH-12.md +0 -98
- package/work-orders/UCM-AUTH-13.md +0 -47
- package/work-orders/UCM-AUTH-9.md +0 -207
- package/work-orders/UCM-CHART-10.md +0 -150
- package/work-orders/UCM-CHART-11.md +0 -132
- package/work-orders/UCM-CHART-12.md +0 -348
- package/work-orders/UCM-CHART-13.md +0 -122
- package/work-orders/UCM-CHART-14.md +0 -198
- package/work-orders/UCM-CHART-15.md +0 -187
- package/work-orders/UCM-CHART-16.md +0 -169
- package/work-orders/UCM-CHART-17.md +0 -195
- package/work-orders/UCM-CHART-18.md +0 -200
- package/work-orders/UCM-CHART-8.md +0 -147
- package/work-orders/UCM-CHART-9.md +0 -265
- package/work-orders/UCM-CHAT-1.md +0 -190
- package/work-orders/UCM-CHAT-2.md +0 -75
- package/work-orders/UCM-DEP-1.md +0 -63
- package/work-orders/UCM-I18N-4.md +0 -226
- package/work-orders/UCM-I18N-5.md +0 -211
- package/work-orders/UCM-MSG-20.md +0 -192
- package/work-orders/UCM-PRIM-2.md +0 -114
- package/work-orders/UCM-SHELL-7.md +0 -134
- package/work-orders/UCM-SHELL-8.md +0 -125
- package/work-orders/UCM-TEST-1.md +0 -304
- package/work-orders/UCM-THEME-13.md +0 -69
- package/work-orders/UCM-THEME-14.md +0 -312
- package/work-orders/UCM-THEME-15.md +0 -356
- package/work-orders/UCM-THEME-16.md +0 -80
- package/work-orders/UCM-THEME-17.md +0 -111
- package/work-orders/UCM-THEME-18.md +0 -184
- package/work-orders/assets/AUTH-4-user-list-card.html +0 -407
- package/work-orders/assets/PRIM-1-dashboard-primitives.html +0 -624
- package/work-orders/assets/SHELL-2-account-navigation.html +0 -1159
- package/work-orders/assets/THEME-1-baseline-reference-sheet.html +0 -1352
- package/work-orders/assets/UCM-CHAT-1-ai-chat.html +0 -447
- package/work-orders/assets/UCM-THEME-13-dark-prototype.html +0 -390
- package/work-orders/assets/UCM-THEME-17-type-scale.html +0 -391
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Box } from '@mui/material';
|
|
3
|
-
import { useTheme } from '@mui/material/styles';
|
|
4
|
-
import { useTranslation } from 'react-i18next';
|
|
5
|
-
import { BarChart as MuiBarChart } from '@mui/x-charts/BarChart';
|
|
6
|
-
import { useNeutralChartPalette } from './palette';
|
|
7
|
-
import {
|
|
8
|
-
DEFAULT_LEGEND_POSITION,
|
|
9
|
-
assertRemovedChartProp,
|
|
10
|
-
defaultNumericTickFormatter,
|
|
11
|
-
resolveChartLayout,
|
|
12
|
-
withAxisDefaults,
|
|
13
|
-
withChartSlotDefaults,
|
|
14
|
-
withGridDefaults,
|
|
15
|
-
} from './chartDefaults';
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Responsive MUI X-Charts bar preset. It supplies labelled axes, tooltips,
|
|
19
|
-
* and an automatic multi-series legend. `xAxisLabel`/`yAxisLabel` are
|
|
20
|
-
* optional, per DESIGN.md #8a: a categorical axis (BarChart's default x-axis
|
|
21
|
-
* shape) needs no title by default -- its ticks are names -- and a numeric
|
|
22
|
-
* axis needs one only unless its unit is already visible in the ticks and
|
|
23
|
-
* the panel heading already names the quantity. Omitting one never suppresses
|
|
24
|
-
* a label the caller DID set (`withAxisDefaults` only ever falls back onto
|
|
25
|
-
* an axis without its own `label`).
|
|
26
|
-
*
|
|
27
|
-
* `size` (UCM-CHART-12, UCM-CHART-15): `"compact" | "standard" | "tall" | "extra_tall" |
|
|
28
|
-
* "super_tall"`, resolved through the theme's spacing scale by `resolveChartLayout`. `height`
|
|
29
|
-
* (px) is the documented escape for a justified special case -- prefer `size`.
|
|
30
|
-
* `minHeight`/`aspect`/`margin` are gone (see docs/CHART-LAYOUT.md).
|
|
31
|
-
*/
|
|
32
|
-
export function BarChart({
|
|
33
|
-
series = [],
|
|
34
|
-
xAxisLabel,
|
|
35
|
-
yAxisLabel,
|
|
36
|
-
xAxis,
|
|
37
|
-
yAxis,
|
|
38
|
-
palette,
|
|
39
|
-
size = 'standard',
|
|
40
|
-
height,
|
|
41
|
-
minHeight,
|
|
42
|
-
aspect,
|
|
43
|
-
margin,
|
|
44
|
-
xLabels = 'auto',
|
|
45
|
-
grid,
|
|
46
|
-
hideLegend = series.length <= 1,
|
|
47
|
-
legendPosition = DEFAULT_LEGEND_POSITION,
|
|
48
|
-
slotProps,
|
|
49
|
-
...chartProps
|
|
50
|
-
}) {
|
|
51
|
-
const theme = useTheme();
|
|
52
|
-
const { i18n } = useTranslation();
|
|
53
|
-
const neutralPalette = useNeutralChartPalette();
|
|
54
|
-
|
|
55
|
-
assertRemovedChartProp('BarChart', 'minHeight', minHeight, 'Use size="compact" | "standard" | "tall" | "extra_tall" | "super_tall", or height for the documented escape.');
|
|
56
|
-
assertRemovedChartProp('BarChart', 'aspect', aspect, 'Removed with no replacement -- pick a size token; the chart no longer tracks width.');
|
|
57
|
-
assertRemovedChartProp('BarChart', 'margin', margin, 'Removed -- the layout model owns margins completely.');
|
|
58
|
-
|
|
59
|
-
const labelledXAxis = withAxisDefaults(
|
|
60
|
-
xAxis,
|
|
61
|
-
xAxisLabel,
|
|
62
|
-
{ scaleType: 'band', data: [] },
|
|
63
|
-
theme.typography.caption.fontSize,
|
|
64
|
-
);
|
|
65
|
-
const labelledYAxis = withAxisDefaults(
|
|
66
|
-
yAxis,
|
|
67
|
-
yAxisLabel,
|
|
68
|
-
{ scaleType: 'linear', valueFormatter: defaultNumericTickFormatter(i18n.language) },
|
|
69
|
-
theme.typography.caption.fontSize,
|
|
70
|
-
);
|
|
71
|
-
const layout = resolveChartLayout({
|
|
72
|
-
size,
|
|
73
|
-
height,
|
|
74
|
-
xAxis: labelledXAxis,
|
|
75
|
-
yAxis: labelledYAxis,
|
|
76
|
-
series,
|
|
77
|
-
xLabels,
|
|
78
|
-
hideLegend,
|
|
79
|
-
legendPosition,
|
|
80
|
-
slotProps,
|
|
81
|
-
tickFontSize: theme.typography.caption.fontSize,
|
|
82
|
-
spacing: theme.spacing,
|
|
83
|
-
defaultLineHeight: theme.typography.caption.lineHeight,
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
return (
|
|
87
|
-
<Box data-testid="bar-chart-container" sx={layout.sx}>
|
|
88
|
-
<MuiBarChart
|
|
89
|
-
{...chartProps}
|
|
90
|
-
height={layout.chartHeight}
|
|
91
|
-
series={series}
|
|
92
|
-
xAxis={layout.xAxis}
|
|
93
|
-
yAxis={layout.yAxis}
|
|
94
|
-
colors={palette || neutralPalette.categorical}
|
|
95
|
-
grid={withGridDefaults(grid)}
|
|
96
|
-
hideLegend={hideLegend}
|
|
97
|
-
margin={layout.margin}
|
|
98
|
-
slotProps={withChartSlotDefaults(slotProps, legendPosition)}
|
|
99
|
-
/>
|
|
100
|
-
</Box>
|
|
101
|
-
);
|
|
102
|
-
}
|
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
import React, { useId, useRef, useState } from 'react';
|
|
2
|
-
import {
|
|
3
|
-
Alert,
|
|
4
|
-
Box,
|
|
5
|
-
Button,
|
|
6
|
-
CircularProgress,
|
|
7
|
-
Paper,
|
|
8
|
-
Stack,
|
|
9
|
-
Tooltip,
|
|
10
|
-
Typography,
|
|
11
|
-
} from '@mui/material';
|
|
12
|
-
import { useTranslation } from 'react-i18next';
|
|
13
|
-
import { useTheme } from '@mui/material/styles';
|
|
14
|
-
import { exportChartPng, exportChartSvg } from './exportChart';
|
|
15
|
-
import { assertRemovedChartProp } from './chartDefaults';
|
|
16
|
-
|
|
17
|
-
export const CHART_FRAME_ROOT_SX = { p: 2 };
|
|
18
|
-
export const CHART_FRAME_ALERT_SX = { mt: 2 };
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Chart-type-agnostic chart scaffolding. Children may be an X-Charts primitive or a bespoke SVG.
|
|
22
|
-
*
|
|
23
|
-
* `minHeight` (CHART-9): always just a floor on the content box, which holds a whole card --
|
|
24
|
-
* title, toolbar, chart, legend, footnotes, export links -- not a single chart.
|
|
25
|
-
*
|
|
26
|
-
* UCM-CHART-13: `height` and `aspect` are GONE. `height` was destructured and only ever fed a
|
|
27
|
-
* dev-mode mismatch warning, never applied to the box -- genuinely dead. `aspect` is a DIFFERENT
|
|
28
|
-
* case: it WAS wired to `aspectRatio` on the box at 3.0.1, and worked.
|
|
29
|
-
*
|
|
30
|
-
* UCM-CHART-14 CORRECTION -- left legible on purpose, not deleted: `UCM-CHART-13` shipped claiming
|
|
31
|
-
* "no consumer across the five apps passes [aspect] (measured against 3.0.1)". **That measurement
|
|
32
|
-
* was false.** A parser-based census (`scripts/chart-api-census.mjs`, ground truth over grep) found
|
|
33
|
-
* FOUR live call sites in fitness-monitor (`BodyHistoryPage.jsx:295,444`, `EnvironmentPage.jsx:245,279`)
|
|
34
|
-
* that a `head`-truncated grep had silently missed -- the sixth wrong consumer count in this series
|
|
35
|
-
* (see `UCM-CHART-14`'s own WO for the other five). The REMOVAL itself still stands (`aspect` stays
|
|
36
|
-
* gone, the operator confirmed this is not being reopened) -- only the record of who it affected was
|
|
37
|
-
* wrong, and is corrected here rather than quietly rewritten. Those four sites are `FM-CHART-1`'s
|
|
38
|
-
* scope, not this file's. Passing either prop now throws in dev via the same `assertRemovedChartProp`
|
|
39
|
-
* the four chart presets use (`UCM-CHART-12`), naming `minHeight` (a card floor) or the chart's own
|
|
40
|
-
* `size` prop as the replacement -- `aspect`'s own message states plainly that it WAS applied and
|
|
41
|
-
* this is a real behaviour change (`UCM-CHART-14`, F2: the message previously said the opposite).
|
|
42
|
-
*/
|
|
43
|
-
export function ChartFrame({
|
|
44
|
-
title,
|
|
45
|
-
subtitle,
|
|
46
|
-
toolbar,
|
|
47
|
-
controls,
|
|
48
|
-
loading = false,
|
|
49
|
-
error = false,
|
|
50
|
-
isEmpty = false,
|
|
51
|
-
emptyMessage,
|
|
52
|
-
minHeight,
|
|
53
|
-
exportOptions = false,
|
|
54
|
-
onExportSvg,
|
|
55
|
-
onExportPng,
|
|
56
|
-
meta,
|
|
57
|
-
ariaLabel,
|
|
58
|
-
children,
|
|
59
|
-
variant = 'outlined',
|
|
60
|
-
titleVariant = 'h6',
|
|
61
|
-
sx,
|
|
62
|
-
// UCM-CHART-13: `height`/`aspect` are gone from the signature itself (DoD) -- captured via rest,
|
|
63
|
-
// not named parameters, so they read as "detected leftovers", not "accepted props" a reader might
|
|
64
|
-
// assume are still wired to something.
|
|
65
|
-
...legacyProps
|
|
66
|
-
}) {
|
|
67
|
-
const { t } = useTranslation();
|
|
68
|
-
const theme = useTheme();
|
|
69
|
-
const titleId = useId();
|
|
70
|
-
const chartRef = useRef(null);
|
|
71
|
-
const [exportError, setExportError] = useState(false);
|
|
72
|
-
const options = exportOptions === true ? {} : exportOptions || {};
|
|
73
|
-
const exportsEnabled = Boolean(exportOptions);
|
|
74
|
-
const hasMeta = meta !== undefined && meta !== null && meta !== false && meta !== '';
|
|
75
|
-
const hasCustomAriaLabel = Boolean(ariaLabel);
|
|
76
|
-
const chartLabel = ariaLabel || title;
|
|
77
|
-
const callerSx = Array.isArray(sx) ? sx : [sx];
|
|
78
|
-
|
|
79
|
-
assertRemovedChartProp(
|
|
80
|
-
'ChartFrame', 'height', legacyProps.height,
|
|
81
|
-
'Use minHeight for the card floor, or size on the chart inside the frame if you meant the chart\'s own height.',
|
|
82
|
-
'UCM-CHART-13, v3.1.0',
|
|
83
|
-
);
|
|
84
|
-
assertRemovedChartProp(
|
|
85
|
-
'ChartFrame', 'aspect', legacyProps.aspect,
|
|
86
|
-
'It WAS applied here (aspectRatio on the card box, through 3.0.1) -- this is a real behaviour '
|
|
87
|
-
+ 'change, not a no-op removal. The card\'s height now follows its content, with minHeight as '
|
|
88
|
-
+ 'the floor. If you wanted the chart itself taller or shorter, set size on the chart inside '
|
|
89
|
-
+ 'the frame.',
|
|
90
|
-
'UCM-CHART-14, v3.1.1',
|
|
91
|
-
);
|
|
92
|
-
|
|
93
|
-
const runExport = async (type) => {
|
|
94
|
-
setExportError(false);
|
|
95
|
-
try {
|
|
96
|
-
const filename = options.filename || 'chart';
|
|
97
|
-
const result = type === 'svg'
|
|
98
|
-
? exportChartSvg(chartRef.current, `${filename}.svg`)
|
|
99
|
-
: await exportChartPng(
|
|
100
|
-
chartRef.current,
|
|
101
|
-
`${filename}.png`,
|
|
102
|
-
theme.palette.background.paper,
|
|
103
|
-
);
|
|
104
|
-
const callback = type === 'svg' ? onExportSvg : onExportPng;
|
|
105
|
-
callback?.(result);
|
|
106
|
-
} catch (_error) {
|
|
107
|
-
setExportError(true);
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
// UCM-CHART-17: SVG and PNG now produce genuinely different content (chart-only vector vs. the
|
|
112
|
-
// whole card as shown, legend included) -- the label alone no longer says so, so both buttons
|
|
113
|
-
// carry a tooltip stating the difference plainly, per the Envelope's own requirement.
|
|
114
|
-
const exportButtons = (
|
|
115
|
-
<>
|
|
116
|
-
{options.svg !== false && (
|
|
117
|
-
// `describeChild`: the tooltip DESCRIBES the button, it must not REPLACE its accessible
|
|
118
|
-
// name -- MUI's default (`aria-label` = title) would silently rename "Export SVG" to
|
|
119
|
-
// whatever the tooltip says, breaking both the button's own identity and every existing
|
|
120
|
-
// `getByRole('button', { name: 'Export SVG' })` query.
|
|
121
|
-
<Tooltip title={t('ChartFrame.EXPORT_SVG_TOOLTIP')} describeChild>
|
|
122
|
-
<Button size="small" onClick={() => runExport('svg')}>
|
|
123
|
-
{t('ChartFrame.EXPORT_SVG_LABEL')}
|
|
124
|
-
</Button>
|
|
125
|
-
</Tooltip>
|
|
126
|
-
)}
|
|
127
|
-
{options.png !== false && (
|
|
128
|
-
<Tooltip title={t('ChartFrame.EXPORT_PNG_TOOLTIP')} describeChild>
|
|
129
|
-
<Button size="small" onClick={() => runExport('png')}>
|
|
130
|
-
{t('ChartFrame.EXPORT_PNG_LABEL')}
|
|
131
|
-
</Button>
|
|
132
|
-
</Tooltip>
|
|
133
|
-
)}
|
|
134
|
-
</>
|
|
135
|
-
);
|
|
136
|
-
|
|
137
|
-
let content = children;
|
|
138
|
-
if (loading) {
|
|
139
|
-
content = <CircularProgress aria-label={t('ChartFrame.LOADING')} />;
|
|
140
|
-
} else if (error) {
|
|
141
|
-
content = <Alert severity="error">{typeof error === 'string' ? error : t('ChartFrame.ERROR_DEFAULT')}</Alert>;
|
|
142
|
-
} else if (isEmpty) {
|
|
143
|
-
content = <Alert severity="info">{emptyMessage || t('ChartFrame.EMPTY_DEFAULT')}</Alert>;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
return (
|
|
147
|
-
<Paper variant={variant} sx={[CHART_FRAME_ROOT_SX, ...callerSx]}>
|
|
148
|
-
{/* THEME-11: mb: 2 -> mb: 1 (16 -> 8px) -- one line item in the estate-wide chart-furniture
|
|
149
|
-
trim; the controls row below keeps its own mb: 2, not named in that WO's scope. */}
|
|
150
|
-
<Box sx={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 2, mb: 1 }}>
|
|
151
|
-
<Box>
|
|
152
|
-
<Typography id={titleId} variant={titleVariant}>{title}</Typography>
|
|
153
|
-
{subtitle && <Typography variant="body2" color="text.secondary">{subtitle}</Typography>}
|
|
154
|
-
</Box>
|
|
155
|
-
{toolbar && <Box>{toolbar}</Box>}
|
|
156
|
-
</Box>
|
|
157
|
-
|
|
158
|
-
{/* A full-width control row between the header and the chart. Distinct from `toolbar`
|
|
159
|
-
(which shares the header row with the title, so a wide control set squeezes the title)
|
|
160
|
-
and from `children` (which the loading/error/empty states replace -- controls must stay
|
|
161
|
-
operable in those states, e.g. to switch away from a view that has no data). */}
|
|
162
|
-
{controls && <Box sx={{ mb: 2 }}>{controls}</Box>}
|
|
163
|
-
|
|
164
|
-
<Box
|
|
165
|
-
ref={chartRef}
|
|
166
|
-
role="img"
|
|
167
|
-
aria-label={chartLabel}
|
|
168
|
-
aria-labelledby={hasCustomAriaLabel ? undefined : titleId}
|
|
169
|
-
sx={{
|
|
170
|
-
width: '100%',
|
|
171
|
-
minHeight,
|
|
172
|
-
display: 'flex',
|
|
173
|
-
alignItems: 'center',
|
|
174
|
-
justifyContent: 'center',
|
|
175
|
-
}}
|
|
176
|
-
>
|
|
177
|
-
{content}
|
|
178
|
-
</Box>
|
|
179
|
-
|
|
180
|
-
{exportError && <Alert severity="error" sx={CHART_FRAME_ALERT_SX}>{t('ChartFrame.EXPORT_ERROR')}</Alert>}
|
|
181
|
-
|
|
182
|
-
{/* `meta` opts the card into the single bordered foot row (meta left, exports right).
|
|
183
|
-
Without it the markup below is byte-for-byte the pre-`meta` structure -- a bare Stack,
|
|
184
|
-
no wrapper, `mt: 2` on the Stack itself. 16 other panels render this path, so it must
|
|
185
|
-
not gain or lose a node. */}
|
|
186
|
-
{hasMeta ? (
|
|
187
|
-
<Box
|
|
188
|
-
sx={{
|
|
189
|
-
display: 'flex',
|
|
190
|
-
alignItems: 'center',
|
|
191
|
-
justifyContent: 'space-between',
|
|
192
|
-
flexWrap: 'wrap',
|
|
193
|
-
gap: 1.5,
|
|
194
|
-
mt: 2,
|
|
195
|
-
pt: 1.5,
|
|
196
|
-
borderTop: '1px solid',
|
|
197
|
-
borderColor: 'divider',
|
|
198
|
-
}}
|
|
199
|
-
>
|
|
200
|
-
<Typography variant="caption" color="text.secondary">{meta}</Typography>
|
|
201
|
-
{exportsEnabled && (
|
|
202
|
-
<Stack direction="row" spacing={1} justifyContent="flex-end">
|
|
203
|
-
{exportButtons}
|
|
204
|
-
</Stack>
|
|
205
|
-
)}
|
|
206
|
-
</Box>
|
|
207
|
-
) : exportsEnabled && (
|
|
208
|
-
<Stack direction="row" spacing={1} justifyContent="flex-end" sx={{ mt: 2 }}>
|
|
209
|
-
{exportButtons}
|
|
210
|
-
</Stack>
|
|
211
|
-
)}
|
|
212
|
-
</Paper>
|
|
213
|
-
);
|
|
214
|
-
}
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Box } from '@mui/material';
|
|
3
|
-
import { useTheme } from '@mui/material/styles';
|
|
4
|
-
import { useTranslation } from 'react-i18next';
|
|
5
|
-
import {
|
|
6
|
-
LineChart as MuiLineChart,
|
|
7
|
-
MarkElement as MuiMarkElement,
|
|
8
|
-
} from '@mui/x-charts/LineChart';
|
|
9
|
-
import { useNeutralChartPalette } from './palette';
|
|
10
|
-
import {
|
|
11
|
-
DEFAULT_LEGEND_POSITION,
|
|
12
|
-
assertRemovedChartProp,
|
|
13
|
-
defaultNumericTickFormatter,
|
|
14
|
-
resolveChartLayout,
|
|
15
|
-
withAxisDefaults,
|
|
16
|
-
withChartSlotDefaults,
|
|
17
|
-
withGridDefaults,
|
|
18
|
-
} from './chartDefaults';
|
|
19
|
-
|
|
20
|
-
// Fixes MUI's hollow `background.paper`-filled marker (MarkElement.js's own
|
|
21
|
-
// `styled()` default). CHART-6's WO named a `MuiMarkElement` theme-token
|
|
22
|
-
// override in src/theme/tokens.js as the preferred mechanism, with a
|
|
23
|
-
// per-wrapper slots/sx override as the documented fallback. This uses the
|
|
24
|
-
// fallback deliberately, not because the theme route was infeasible: a
|
|
25
|
-
// wrapper-level fix applies to every consumer immediately on this version
|
|
26
|
-
// bump, including the 14 apps that haven't adopted `createAppTheme` yet
|
|
27
|
-
// (THEME-1 is a separate, optional pin bump) -- a theme-token override would
|
|
28
|
-
// only take effect for apps on the new baseline theme. Composes correctly
|
|
29
|
-
// with a caller's own `slots.mark` (spread after this default, so it wins).
|
|
30
|
-
function FilledMarkElement({ color, style, ...props }) {
|
|
31
|
-
return <MuiMarkElement {...props} color={color} style={{ fill: color, ...style }} />;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Responsive MUI X-Charts line preset. It supplies labelled axes, tooltips,
|
|
36
|
-
* and an automatic multi-series legend. `xAxisLabel`/`yAxisLabel` are
|
|
37
|
-
* optional, per DESIGN.md #8a: a categorical axis needs no title by default
|
|
38
|
-
* -- its ticks are names -- and a numeric axis needs one only unless its
|
|
39
|
-
* unit is already visible in the ticks and the panel heading already names
|
|
40
|
-
* the quantity. Omitting one never suppresses a label the caller DID set
|
|
41
|
-
* (`withAxisDefaults` only ever falls back onto an axis without its own
|
|
42
|
-
* `label`).
|
|
43
|
-
*
|
|
44
|
-
* `size` (UCM-CHART-12, UCM-CHART-15): `"compact" | "standard" | "tall" | "extra_tall" |
|
|
45
|
-
* "super_tall"`, resolved through the theme's spacing scale by `resolveChartLayout`. `height`
|
|
46
|
-
* (px) is the documented escape for a justified special case -- prefer `size`.
|
|
47
|
-
* `minHeight`/`aspect`/`margin` are gone (see docs/CHART-LAYOUT.md).
|
|
48
|
-
*/
|
|
49
|
-
export function LineChart({
|
|
50
|
-
series = [],
|
|
51
|
-
xAxisLabel,
|
|
52
|
-
yAxisLabel,
|
|
53
|
-
xAxis,
|
|
54
|
-
yAxis,
|
|
55
|
-
palette,
|
|
56
|
-
size = 'standard',
|
|
57
|
-
height,
|
|
58
|
-
minHeight,
|
|
59
|
-
aspect,
|
|
60
|
-
margin,
|
|
61
|
-
xLabels = 'auto',
|
|
62
|
-
grid,
|
|
63
|
-
hideLegend = series.length <= 1,
|
|
64
|
-
legendPosition = DEFAULT_LEGEND_POSITION,
|
|
65
|
-
slots,
|
|
66
|
-
slotProps,
|
|
67
|
-
...chartProps
|
|
68
|
-
}) {
|
|
69
|
-
const theme = useTheme();
|
|
70
|
-
const { i18n } = useTranslation();
|
|
71
|
-
const neutralPalette = useNeutralChartPalette();
|
|
72
|
-
|
|
73
|
-
assertRemovedChartProp('LineChart', 'minHeight', minHeight, 'Use size="compact" | "standard" | "tall" | "extra_tall" | "super_tall", or height for the documented escape.');
|
|
74
|
-
assertRemovedChartProp('LineChart', 'aspect', aspect, 'Removed with no replacement -- pick a size token; the chart no longer tracks width.');
|
|
75
|
-
assertRemovedChartProp('LineChart', 'margin', margin, 'Removed -- the layout model owns margins completely.');
|
|
76
|
-
|
|
77
|
-
const labelledXAxis = withAxisDefaults(
|
|
78
|
-
xAxis,
|
|
79
|
-
xAxisLabel,
|
|
80
|
-
{ scaleType: 'point', data: [] },
|
|
81
|
-
theme.typography.caption.fontSize,
|
|
82
|
-
);
|
|
83
|
-
const labelledYAxis = withAxisDefaults(
|
|
84
|
-
yAxis,
|
|
85
|
-
yAxisLabel,
|
|
86
|
-
{ scaleType: 'linear', valueFormatter: defaultNumericTickFormatter(i18n.language) },
|
|
87
|
-
theme.typography.caption.fontSize,
|
|
88
|
-
);
|
|
89
|
-
const defaultedSeries = series.map((item) => ({
|
|
90
|
-
showMark: false,
|
|
91
|
-
labelMarkType: 'square',
|
|
92
|
-
...item,
|
|
93
|
-
}));
|
|
94
|
-
const layout = resolveChartLayout({
|
|
95
|
-
size,
|
|
96
|
-
height,
|
|
97
|
-
xAxis: labelledXAxis,
|
|
98
|
-
yAxis: labelledYAxis,
|
|
99
|
-
series: defaultedSeries,
|
|
100
|
-
xLabels,
|
|
101
|
-
hideLegend,
|
|
102
|
-
legendPosition,
|
|
103
|
-
slotProps,
|
|
104
|
-
tickFontSize: theme.typography.caption.fontSize,
|
|
105
|
-
spacing: theme.spacing,
|
|
106
|
-
defaultLineHeight: theme.typography.caption.lineHeight,
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
return (
|
|
110
|
-
<Box data-testid="line-chart-container" sx={layout.sx}>
|
|
111
|
-
<MuiLineChart
|
|
112
|
-
{...chartProps}
|
|
113
|
-
height={layout.chartHeight}
|
|
114
|
-
series={defaultedSeries}
|
|
115
|
-
xAxis={layout.xAxis}
|
|
116
|
-
yAxis={layout.yAxis}
|
|
117
|
-
colors={palette || neutralPalette.categorical}
|
|
118
|
-
grid={withGridDefaults(grid)}
|
|
119
|
-
hideLegend={hideLegend}
|
|
120
|
-
margin={layout.margin}
|
|
121
|
-
slots={{ mark: FilledMarkElement, ...slots }}
|
|
122
|
-
slotProps={withChartSlotDefaults(slotProps, legendPosition)}
|
|
123
|
-
/>
|
|
124
|
-
</Box>
|
|
125
|
-
);
|
|
126
|
-
}
|