@micha.bigler/ui-core-micha 3.14.4 → 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 +25 -0
- package/README.md +7 -0
- package/dist/chat/kitSxRegistry.js +9 -0
- 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/pages/AccountPage.js +1 -2
- package/dist/pages/LoginPage.js +1 -2
- package/dist/pages/PasswordChangePage.js +1 -2
- package/dist/pages/PasswordInvitePage.js +1 -2
- package/dist/pages/PasswordResetRequestPage.js +1 -2
- package/dist/pages/SignUpPage.js +1 -2
- package/dist/pages/SignupConfirmPage.js +1 -2
- package/dist/theme/kitSxEntry.js +11 -0
- package/dist/theme/kitSxRegistry.js +2 -15
- package/package.json +32 -7
- package/.github/workflows/ci.yml +0 -35
- package/.github/workflows/publish.yml +0 -126
- package/DESIGN.md +0 -60
- package/WORK_ORDERS.md +0 -150
- 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-CI-1.md +0 -65
- 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
package/work-orders/THEME-9.md
DELETED
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
# THEME-9 — Charts spend more space on furniture than on data
|
|
2
|
-
|
|
3
|
-
## Part A — Envelope
|
|
4
|
-
|
|
5
|
-
**Goal.** Give the chart presets back the space their axis furniture currently reserves and
|
|
6
|
-
does not use, stop broadcasting one axis label onto every axis, keep the axis label out of
|
|
7
|
-
the tick band, and make short, locale-correct tick numbers the default.
|
|
8
|
-
|
|
9
|
-
**Why — measured in a consuming app (hram), not estimated.** One KPI card, "Coverage":
|
|
10
|
-
|
|
11
|
-
| layer | size | owner |
|
|
12
|
-
|---|---|---|
|
|
13
|
-
| card (`Paper`, 16 px padding) | 470 × 372 | app |
|
|
14
|
-
| chart wrapper `Box` | 436 × **300** (`minHeight: 300`) | **this package** — the SVG inside is 270 tall, so **30 px are dead** |
|
|
15
|
-
| SVG | 436 × 270 | this package |
|
|
16
|
-
| **plot area** | **301 × 175** | — |
|
|
17
|
-
|
|
18
|
-
**The plot is 45 % of the SVG and 30 % of the card.** 135 px of width and 95 px of height are
|
|
19
|
-
consumed inside the SVG. Walking the left edge outward: 17 px card padding, then **60 px of
|
|
20
|
-
blank between the SVG edge and the axis label**, then 9 px, then the first tick — 104 px before
|
|
21
|
-
a number appears. Below the chart: 30 px of blank inside the SVG under the axis label, then
|
|
22
|
-
another 32 px to the card edge.
|
|
23
|
-
|
|
24
|
-
Three further findings from the same app, all measured:
|
|
25
|
-
|
|
26
|
-
1. **One label is applied to every axis.** `withAxisDefaults` ends with
|
|
27
|
-
`label: axis.label || label`, so a single `yAxisLabel` lands on *all* axes in the array. In
|
|
28
|
-
hram's dual-axis chart both y-axes therefore carry the identical 43-character string
|
|
29
|
-
`"Treated / Untreated / Saved / Avoid. Deaths"`, each reserving 65 px of a 206 px-wide chart.
|
|
30
|
-
2. **The axis label is drawn inside the tick band.** On hram's Accessibility chart **4 of 4**
|
|
31
|
-
y-tick labels overlap the axis label — the rotated title runs straight through
|
|
32
|
-
`"0.0 min"`, `"50.0 min"`, … The same happens on an x-axis whose tick labels are rotated
|
|
33
|
-
(30+ ward names over the label `"Ward"`). The space reserved for rotated ticks does not
|
|
34
|
-
actually keep the label clear of them.
|
|
35
|
-
3. **Ticks carry units and needless decimals.** `"0.0 min"`, `"50.0 min"` — the unit appears in
|
|
36
|
-
every tick *and* twice in the label (`"Accessibility (minutes) (min)"`). Elsewhere MUI
|
|
37
|
-
truncates ticks it cannot fit, rendering `"0.0…"`, `"50.0…"`. `BarChart` sets no default tick
|
|
38
|
-
formatter at all, while `TimeSeriesChart` already applies one conditionally — so every app
|
|
39
|
-
re-solves this, and where nobody remembered, the numbers are wide and truncated.
|
|
40
|
-
|
|
41
|
-
**Scope.**
|
|
42
|
-
|
|
43
|
-
1. **Shrink the default margins and the axis-size reservation.** MUI X sizes axes itself; the
|
|
44
|
-
generous fixed values here predate that. Target the measured waste: ~60 px of blank left of
|
|
45
|
-
the label and ~30 px below it. Re-measure in a consuming app afterwards — the number to beat
|
|
46
|
-
is "plot area = 45 % of the SVG".
|
|
47
|
-
2. **Stop broadcasting the label.** An axis label is set on the axis that needs it, not on every
|
|
48
|
-
axis in the array. Add a test that pins this: one label must never land on two axes. That is
|
|
49
|
-
the exact defect measured above, and nothing currently prevents it.
|
|
50
|
-
3. **Keep the label out of the tick band.** Whatever space rotated or long tick labels occupy
|
|
51
|
-
must be excluded from where the axis label is placed. Verify with the real case — rotated
|
|
52
|
-
45° ward names, and a y-axis whose ticks are wide.
|
|
53
|
-
4. **A default tick formatter for `BarChart`** (and any preset lacking one): short numbers, no
|
|
54
|
-
decorative decimals, no unit in the tick. **Do not simply switch on `Intl` compact
|
|
55
|
-
notation** — measured across the four locales this package's consumers use:
|
|
56
|
-
|
|
57
|
-
| value | de-CH | en | fr | sw |
|
|
58
|
-
|---|---|---|---|---|
|
|
59
|
-
| 12 500 | **`12'500`** | `12.5K` | `12,5 k` | **`elfu 12.5`** |
|
|
60
|
-
| 998 000 | **`998'000`** | `998K` | `998 k` | **`elfu 998`** |
|
|
61
|
-
| 1 000 000 000 | `1 Mrd.` | `1B` | `1 Md` | `1B` |
|
|
62
|
-
|
|
63
|
-
German does not compact thousands **at all** — exactly the range these charts live in — and
|
|
64
|
-
Swahili puts a word in front of the number, which is wider than the raw value. So compact
|
|
65
|
-
notation alone does not solve the width problem and in one locale makes it worse. A
|
|
66
|
-
per-axis unit chosen once (with the unit named in the axis label) does. Also note: a
|
|
67
|
-
hand-rolled `"B"` suffix would be **wrong in German**, where *Billion* is 10¹² — `Intl` gets
|
|
68
|
-
this right (`Mrd.`), hand-rolled suffixes do not.
|
|
69
|
-
5. **Document the decision rule in `DESIGN.md`**, where a developer will find it at the call
|
|
70
|
-
site:
|
|
71
|
-
- **Categorical axis → no title by default.** The tick values are names; a title only
|
|
72
|
-
restates their type. Exception: ticks that are codes or abbreviations whose kind is not
|
|
73
|
-
self-evident.
|
|
74
|
-
- **Numeric axis → title carries the quantity and the unit.** A bare number is meaningless
|
|
75
|
-
without one. Exception: the ticks already show the unit (`%`, a currency symbol).
|
|
76
|
-
- **The unit belongs in the title once — never in every tick.**
|
|
77
|
-
|
|
78
|
-
**Non-goals / do-not-touch.** No new chart types, no colour or typography changes, no change to
|
|
79
|
-
what any chart plots. **Do not auto-suppress axis labels** — make them opt-in, but leave the
|
|
80
|
-
decision with the caller; silently dropping a label someone deliberately set is a worse failure
|
|
81
|
-
than the redundancy we are removing. Do not fix any of this per-app with `sx` overrides.
|
|
82
|
-
|
|
83
|
-
**Tier 3** — shared-core surface. `reviewer` mandatory, `ui_reviewer` too: the visible result is
|
|
84
|
-
a layout change in every consuming app.
|
|
85
|
-
|
|
86
|
-
**Tests to write.** The one-label-per-axis assertion (scope 2) — it is cheap and it is the
|
|
87
|
-
defect that actually shipped. A formatter test with the four locales above as fixtures, so the
|
|
88
|
-
German and Swahili behaviour is pinned rather than rediscovered. Margins and overlap are carried
|
|
89
|
-
by the rendered check, not by unit tests.
|
|
90
|
-
|
|
91
|
-
**Risks.**
|
|
92
|
-
- **Estate-wide visual change**, in apps nobody is currently working on. Name it in the release
|
|
93
|
-
notes; do not let it arrive as a surprise.
|
|
94
|
-
- **Tighter margins can clip** where they previously over-reserved. The overlap fix (scope 3)
|
|
95
|
-
and the margin cut (scope 1) pull in opposite directions — do them together and measure, or
|
|
96
|
-
the second will re-create the first.
|
|
97
|
-
- The tick formatter changes numbers on screens used for teaching. Rounding that hides a
|
|
98
|
-
meaningful difference is worse than a wide label: keep full precision in tooltips and tables,
|
|
99
|
-
compact only where space is scarce.
|
|
100
|
-
|
|
101
|
-
**Delivery is not done at publish.** Consuming apps need their pin bumped and their charts
|
|
102
|
-
looked at — hram first, where all of this was measured, and where the app-side follow-up is
|
|
103
|
-
tracked as `FIX-13`.
|
|
104
|
-
|
|
105
|
-
## Part B — Implementation map — ADDRESSED TO THE IMPLEMENTER
|
|
106
|
-
|
|
107
|
-
Codex was not dispatched: `.claude/codex-status.md` already carried a same-day (2026-08-14)
|
|
108
|
-
`unavailable` line (recorded earlier during `THEME-8`), so per the known-unavailable shortcut
|
|
109
|
-
the Orchestrator implemented directly, which flips authorship — `reviewer` + `ui_reviewer`
|
|
110
|
-
became mandatory (already required at Tier 3).
|
|
111
|
-
|
|
112
|
-
### What landed, and why (measured, not guessed)
|
|
113
|
-
|
|
114
|
-
- **`withAxisDefaults` label broadcast (scope 2).** Fixed: the single `label` argument now falls
|
|
115
|
-
back only onto `index === 0` of a multi-entry axis array — mirrors MUI's own
|
|
116
|
-
`position: 'left'`-only-on-first-entry default. Test: `chartDefaults.test.js`.
|
|
117
|
-
- **`sizeYAxisForContent`, new (scope 1/3).** MUI's own y-axis width default is a flat 45px+20px
|
|
118
|
-
regardless of tick content (verified against `@mui/x-charts`' `DEFAULT_AXIS_SIZE_WIDTH` /
|
|
119
|
-
`AXIS_LABEL_DEFAULT_HEIGHT` and its `useChartDimensions` selector: margin and axis-size are
|
|
120
|
-
ADDITIVE, not nested — confirmed pixel-for-pixel against a live hram render, see below). This
|
|
121
|
-
sizes a linear y-axis from its own `min`/`max` or the plotted series, mirroring
|
|
122
|
-
`spaceForRotatedTicks`'s existing glyph-width heuristic.
|
|
123
|
-
- **`defaultNumericTickFormatter`, new (scope 4).** Locale-grouped, non-compact by default —
|
|
124
|
-
verified live against `Intl.NumberFormat` output for all four locales (de-CH does not compact
|
|
125
|
-
thousands at all; sw's compact form is WIDER than the raw number).
|
|
126
|
-
- **DESIGN.md #8a, new (scope 5).** The categorical/numeric axis-title rule.
|
|
127
|
-
- **Not originally scoped, added because scope 5 required it:** `BarChart`/`LineChart` used to
|
|
128
|
-
hard-`throw` unless BOTH `xAxisLabel` and `yAxisLabel` were supplied — this made #8a's stated
|
|
129
|
-
"categorical axis gets no title by default" unachievable through either preset (`ui_reviewer`
|
|
130
|
-
finding U1). Both labels are now optional; omitting one renders no title for that axis. This is
|
|
131
|
-
the change FIX-13 needs to actually remove a title.
|
|
132
|
-
|
|
133
|
-
### The Coverage-KPI-card measurement itself was NOT a package-level bug
|
|
134
|
-
|
|
135
|
-
Live DOM measurement in the running hram app (`localhost:8000`, Basic Results → Coverage card)
|
|
136
|
-
traced the Envelope's own "60px blank / 30px dead" numbers to their exact source:
|
|
137
|
-
`drawingArea.left = margin.left + axisSizeLeft` (MUI's own `useChartDimensions` selector) — the
|
|
138
|
-
60px is hram's OWN `margin={{left: 60, ...}}` prop on `TotalMetricsPanel.jsx`, stacking
|
|
139
|
-
ADDITIVELY with MUI's separate ~65px axis-width reservation, not one containing the other. That
|
|
140
|
-
duplication is `FIX-13`'s item 6 to fix (trim the app's own margin now that this package sizes
|
|
141
|
-
the axis itself), not something `THEME-9` could fix by itself — packages can right-size their own
|
|
142
|
-
axis reservation, not an app's separately-chosen margin.
|
|
143
|
-
|
|
144
|
-
### Review findings, fixed before commit
|
|
145
|
-
|
|
146
|
-
- **`reviewer` R1 (P1):** `sizeYAxisForContent`'s series-to-axis matching used
|
|
147
|
-
`(item.yAxisId ?? undefined) === (axis.id ?? undefined)`, which only matches when BOTH sides are
|
|
148
|
-
literally `undefined` — but MUI assigns an unmarked series to the FIRST axis in the array
|
|
149
|
-
(`yAxisIds[0]`), not to "no axis". This made the sizer a silent no-op for the PRIMARY axis of
|
|
150
|
-
exactly the dual-axis case (`TimeSeriesChart`'s `CHART-5` feature) that motivated this WO. Fixed:
|
|
151
|
-
match against `yAxis[0]?.id` as the default, not `undefined`. Regression test added.
|
|
152
|
-
- **`ui_reviewer` U1 (P1):** see "not originally scoped" above — labels made optional.
|
|
153
|
-
- **`ui_reviewer` U3 (P2):** the sizer used the theme-wide tick font size even when a caller
|
|
154
|
-
overrode `tickLabelStyle.fontSize` per-axis. Fixed: reads the axis' own (already-merged)
|
|
155
|
-
`tickLabelStyle.fontSize` first, falling back to the theme default only if absent.
|
|
156
|
-
- **`ui_reviewer` U5 (P3):** the label-thickness term was derived from `theme.typography.body1`,
|
|
157
|
-
which only coincidentally matches MUI's own HARDCODED 14px axis-label font
|
|
158
|
-
(`ChartsYAxisImpl.js` sets `fontSize: 14` after spreading `body1`, so it always wins regardless
|
|
159
|
-
of theme). Fixed: a named `MUI_AXIS_LABEL_FONT_SIZE_PX = 14` constant, decoupled from theme.
|
|
160
|
-
- **`ui_reviewer` U2 (P2, accepted as a documented limitation, not fixed):** the width estimate is
|
|
161
|
-
driven by the axis' own `min`/`max`/series values, not MUI's actual "nice-tick" rounding, which
|
|
162
|
-
can occasionally round a domain's extremes outward to a longer string. The existing 1.1x safety
|
|
163
|
-
factor absorbs small overshoots; a tighter fix would require duplicating MUI's own tick
|
|
164
|
-
algorithm, out of proportion for this WO. The rendered check below is the actual proof either way.
|
|
165
|
-
- **`ui_reviewer` U4:** claimed `TimeSeriesChart.jsx` bypasses `withAxisDefaults`/
|
|
166
|
-
`sizeYAxisForContent` entirely. Verified against source: `TimeSeriesChart` renders through this
|
|
167
|
-
package's own `<BarChart>` (not `MuiLineChart` directly), so its `yAxis` array — including the
|
|
168
|
-
dual-axis case — DOES flow through both functions. Not acted on; recorded here so the claim
|
|
169
|
-
isn't silently dropped.
|
|
170
|
-
|
|
171
|
-
### Target repo
|
|
172
|
-
|
|
173
|
-
`C:\Users\biglmi\Documents\webapps\ui-core-micha`
|
|
174
|
-
|
|
175
|
-
## Part C — Orchestrator only — NOT ADDRESSED TO THE IMPLEMENTER
|
|
176
|
-
|
|
177
|
-
> **If you are the implementer reading this work order as your own specification: STOP at this
|
|
178
|
-
> line.**
|
|
179
|
-
|
|
180
|
-
- **Execution.** Codex known-unavailable today (see Part B) — implemented directly in Claude.
|
|
181
|
-
- **Review routing.** `reviewer` + `ui_reviewer`, concurrent, one background batch — both ran,
|
|
182
|
-
findings above, all in-scope findings fixed before commit.
|
|
183
|
-
- **Verification.** The package's own affected-set suite (`BarChart.test.jsx`, `LineChart.test.jsx`,
|
|
184
|
-
`TimeSeriesChart.test.jsx`, `timeSeriesLegend.test.js`, `chartDefaults.test.js` — 60 tests,
|
|
185
|
-
green). **The rendered check in hram could NOT be completed live in this session** — the Browser
|
|
186
|
-
pane only carries real viewport dimensions for the tab the operator has actually displayed;
|
|
187
|
-
freshly-opened tabs (both a new hram tab and ui-core-micha's own dev harness) measured 0×0 and
|
|
188
|
-
produced negative-width SVG rect errors as a direct consequence, not a code defect. The BEFORE
|
|
189
|
-
numbers (Coverage KPI card) WERE captured live from the properly-displayed hram tab and are
|
|
190
|
-
quoted above; the AFTER re-measurement is deferred to `FIX-13`, which needs it anyway once
|
|
191
|
-
hram's pin is bumped (its own WO already orders re-measurement after the pin bump, so this
|
|
192
|
-
doesn't lose anything — it was always going to happen there).
|
|
193
|
-
- **Register & commit.** Advance the THEME-9 row with the reviewer verdicts. Track the consumer
|
|
194
|
-
pin bumps (hram = `FIX-13`) — this WO is not done at publish.
|