@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.
Files changed (367) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +7 -0
  3. package/dist/auth/UserMenu.js +1 -1
  4. package/dist/auth/apiClient.js +7 -6
  5. package/dist/chat/ChatList.js +1 -1
  6. package/dist/chat/ChatThread.js +2 -1
  7. package/dist/chat/ChatWorkspace.js +1 -1
  8. package/dist/chat/ModelPicker.js +2 -5
  9. package/dist/chat/kitSxRegistry.js +9 -0
  10. package/dist/chat/useChatSocket.js +1 -1
  11. package/dist/components/LoginForm.js +1 -1
  12. package/dist/components/SecurityComponent.js +1 -1
  13. package/dist/components/UserListComponent.js +2 -8
  14. package/dist/components/charts/ChartFrame.js +1 -1
  15. package/dist/components/charts/ScatterChart.js +2 -1
  16. package/dist/components/charts/kitSxRegistry.js +6 -0
  17. package/dist/entries/charts.js +6 -0
  18. package/dist/entries/chat.js +8 -0
  19. package/dist/entries/markdown.js +1 -0
  20. package/dist/index.js +0 -14
  21. package/dist/layout/SectionNav.js +1 -1
  22. package/dist/messaging/AttachmentList.js +2 -2
  23. package/dist/messaging/Composer.js +2 -1
  24. package/dist/messaging/ConversationLaunchers.js +1 -4
  25. package/dist/messaging/ConversationList.js +1 -1
  26. package/dist/messaging/DirectMessageLauncher.js +1 -1
  27. package/dist/messaging/MessagingProvider.js +0 -0
  28. package/dist/messaging/PollCard.js +7 -5
  29. package/dist/messaging/ReadTicks.js +2 -2
  30. package/dist/messaging/Thread.js +5 -3
  31. package/dist/notifications/NotificationBell.js +4 -7
  32. package/dist/notifications/NotificationSettings.js +1 -1
  33. package/dist/onboarding/OnboardingProvider.js +3 -6
  34. package/dist/pages/AccountPage.js +1 -2
  35. package/dist/pages/LoginPage.js +2 -3
  36. package/dist/pages/PasswordChangePage.js +2 -3
  37. package/dist/pages/PasswordInvitePage.js +2 -3
  38. package/dist/pages/PasswordResetRequestPage.js +2 -3
  39. package/dist/pages/SignUpPage.js +2 -3
  40. package/dist/pages/SignupConfirmPage.js +2 -3
  41. package/dist/theme/createAppTheme.js +5 -4
  42. package/dist/theme/kitSxEntry.js +11 -0
  43. package/dist/theme/kitSxRegistry.js +2 -15
  44. package/dist/theme/themeCompleteness.js +3 -12
  45. package/dist/utils/auth-errors.js +4 -3
  46. package/package.json +41 -16
  47. package/.github/workflows/publish.yml +0 -126
  48. package/DESIGN.md +0 -60
  49. package/WORK_ORDERS.md +0 -148
  50. package/dev/entries.jsx +0 -721
  51. package/dev/fixtures.js +0 -26
  52. package/dev/main.jsx +0 -75
  53. package/dev/mockTransport.jsx +0 -128
  54. package/docs/CHART-LAYOUT.md +0 -157
  55. package/docs/DARK-TOKENS.md +0 -140
  56. package/docs/TYPE-SCALE.md +0 -111
  57. package/docs/messaging-deviations.md +0 -118
  58. package/index.html +0 -12
  59. package/renovate.json +0 -10
  60. package/scripts/chart-api-census.mjs +0 -415
  61. package/src/auth/AuthContext.jsx +0 -158
  62. package/src/auth/ReauthModal.jsx +0 -82
  63. package/src/auth/UserMenu.jsx +0 -121
  64. package/src/auth/apiClient.jsx +0 -232
  65. package/src/auth/authApi.jsx +0 -539
  66. package/src/auth/authConfig.jsx +0 -34
  67. package/src/auth/reauth.js +0 -47
  68. package/src/chat/ChatComposer.jsx +0 -36
  69. package/src/chat/ChatList.jsx +0 -87
  70. package/src/chat/ChatThread.jsx +0 -128
  71. package/src/chat/ChatWorkspace.jsx +0 -244
  72. package/src/chat/MarkdownReply.jsx +0 -22
  73. package/src/chat/ModelPicker.jsx +0 -85
  74. package/src/chat/api.js +0 -18
  75. package/src/chat/useChatSocket.js +0 -32
  76. package/src/chat/wire.js +0 -7
  77. package/src/components/AccessCodeManager.jsx +0 -288
  78. package/src/components/AccessCodeSingleUseToggle.jsx +0 -92
  79. package/src/components/AllowedEmailDomainsManager.jsx +0 -92
  80. package/src/components/AuthFactorRequirementCard.jsx +0 -95
  81. package/src/components/BulkInviteCsvTab.jsx +0 -198
  82. package/src/components/EmptyState.jsx +0 -38
  83. package/src/components/LoginForm.jsx +0 -159
  84. package/src/components/MFAComponent.jsx +0 -350
  85. package/src/components/MfaLoginComponent.jsx +0 -252
  86. package/src/components/MobileBottomNav.jsx +0 -82
  87. package/src/components/PasskeysComponent.jsx +0 -252
  88. package/src/components/PasswordChangeForm.jsx +0 -87
  89. package/src/components/PasswordResetRequestForm.jsx +0 -43
  90. package/src/components/PasswordSetForm.jsx +0 -97
  91. package/src/components/ProfileComponent.jsx +0 -348
  92. package/src/components/QrSignupManager.jsx +0 -404
  93. package/src/components/QrSignupValidityManager.jsx +0 -106
  94. package/src/components/RegistrationMethodsManager.jsx +0 -150
  95. package/src/components/SecurityComponent.jsx +0 -141
  96. package/src/components/SocialLoginButtons.jsx +0 -83
  97. package/src/components/SoftChip.jsx +0 -93
  98. package/src/components/StatTile.jsx +0 -39
  99. package/src/components/SupportRecoveryRequestsTab.jsx +0 -482
  100. package/src/components/TurnstileWidget.jsx +0 -99
  101. package/src/components/UserInviteComponent.jsx +0 -76
  102. package/src/components/UserListComponent.jsx +0 -618
  103. package/src/components/charts/BarChart.jsx +0 -102
  104. package/src/components/charts/ChartFrame.jsx +0 -214
  105. package/src/components/charts/LineChart.jsx +0 -126
  106. package/src/components/charts/ScatterChart.jsx +0 -299
  107. package/src/components/charts/TimeSeriesChart.jsx +0 -300
  108. package/src/components/charts/chartDefaults.js +0 -644
  109. package/src/components/charts/chartLabels.js +0 -36
  110. package/src/components/charts/exportChart.js +0 -258
  111. package/src/components/charts/formatters.js +0 -39
  112. package/src/components/charts/palette.js +0 -33
  113. package/src/components/charts/yearTickInterval.js +0 -7
  114. package/src/i18n/authTranslations.ts +0 -2651
  115. package/src/i18n/chartsTranslations.ts +0 -91
  116. package/src/i18n/chatTranslations.ts +0 -55
  117. package/src/i18n/messagingTranslations.ts +0 -120
  118. package/src/i18n/notificationsTranslations.ts +0 -32
  119. package/src/i18n/onboardingTranslations.ts +0 -29
  120. package/src/i18n/sectionNavTranslations.ts +0 -20
  121. package/src/i18n/uiCoreTranslations.js +0 -29
  122. package/src/i18n/userMenuTranslations.ts +0 -5
  123. package/src/index.js +0 -158
  124. package/src/layout/PageLayout.jsx +0 -36
  125. package/src/layout/SectionNav.jsx +0 -320
  126. package/src/messaging/AttachmentList.jsx +0 -145
  127. package/src/messaging/Composer.jsx +0 -197
  128. package/src/messaging/ConversationLaunchers.jsx +0 -51
  129. package/src/messaging/ConversationList.jsx +0 -109
  130. package/src/messaging/DirectMessageLauncher.jsx +0 -112
  131. package/src/messaging/MessageBubble.jsx +0 -183
  132. package/src/messaging/MessagingProvider.jsx +0 -0
  133. package/src/messaging/MessagingScopeConfig.jsx +0 -24
  134. package/src/messaging/PollCard.jsx +0 -163
  135. package/src/messaging/ReactionBar.jsx +0 -43
  136. package/src/messaging/ReadTicks.jsx +0 -82
  137. package/src/messaging/Thread.jsx +0 -195
  138. package/src/messaging/api.js +0 -48
  139. package/src/messaging/composerImageCompression.js +0 -35
  140. package/src/messaging/linkifyText.jsx +0 -37
  141. package/src/notifications/NotificationBell.jsx +0 -84
  142. package/src/notifications/NotificationSettings.jsx +0 -330
  143. package/src/notifications/NotificationsProvider.jsx +0 -224
  144. package/src/notifications/PopupSurface.jsx +0 -105
  145. package/src/notifications/api.js +0 -55
  146. package/src/notifications/feedApi.js +0 -18
  147. package/src/notifications/realtime.jsx +0 -138
  148. package/src/notifications/serviceWorker/sw.js +0 -50
  149. package/src/onboarding/OnboardingProvider.jsx +0 -326
  150. package/src/onboarding/OnboardingWizard.jsx +0 -61
  151. package/src/onboarding/WizardDialogShell.jsx +0 -51
  152. package/src/onboarding/api.js +0 -13
  153. package/src/onboarding/stepSelection.js +0 -16
  154. package/src/onboarding/steps/BrowserPushStep.jsx +0 -121
  155. package/src/onboarding/steps/CompleteNameStep.jsx +0 -46
  156. package/src/onboarding/steps/CookieConsentStep.jsx +0 -133
  157. package/src/onboarding/steps/PwaInstallStep.jsx +0 -47
  158. package/src/pages/AccountPage.jsx +0 -394
  159. package/src/pages/LoginPage.jsx +0 -343
  160. package/src/pages/PasswordChangePage.jsx +0 -62
  161. package/src/pages/PasswordInvitePage.jsx +0 -177
  162. package/src/pages/PasswordResetRequestPage.jsx +0 -68
  163. package/src/pages/SignUpPage.jsx +0 -268
  164. package/src/pages/SignupConfirmPage.jsx +0 -155
  165. package/src/testing/checkKitIntegration.js +0 -233
  166. package/src/theme/createAppTheme.js +0 -423
  167. package/src/theme/fonts.js +0 -3
  168. package/src/theme/index.js +0 -21
  169. package/src/theme/kitSxRegistry.js +0 -285
  170. package/src/theme/themeCompleteness.js +0 -1045
  171. package/src/theme/tokens.js +0 -478
  172. package/src/utils/auth-errors.js +0 -76
  173. package/src/utils/authService.js +0 -223
  174. package/src/utils/resolveErrorText.js +0 -28
  175. package/src/utils/webauthn.js +0 -51
  176. package/tests/AccountPage.profileStatements.test.jsx +0 -162
  177. package/tests/AccountPage.test.jsx +0 -200
  178. package/tests/AuthContext.test.jsx +0 -129
  179. package/tests/BarChart.test.jsx +0 -112
  180. package/tests/BrowserPushStep.test.jsx +0 -110
  181. package/tests/ChartFrame.test.jsx +0 -336
  182. package/tests/ConversationList.test.jsx +0 -144
  183. package/tests/CookieConsentStep.test.jsx +0 -69
  184. package/tests/EmptyState.test.jsx +0 -62
  185. package/tests/LineChart.test.jsx +0 -80
  186. package/tests/MessagingProvider.test.jsx +0 -50
  187. package/tests/MobileBottomNav.test.jsx +0 -319
  188. package/tests/NotificationBell.test.jsx +0 -60
  189. package/tests/NotificationSettings.test.jsx +0 -276
  190. package/tests/NotificationsProvider.test.jsx +0 -240
  191. package/tests/OnboardingProvider.test.jsx +0 -294
  192. package/tests/OnboardingWizard.test.jsx +0 -143
  193. package/tests/PasswordChangeForm.test.jsx +0 -70
  194. package/tests/PasswordInvitePage.test.jsx +0 -142
  195. package/tests/PasswordSetForm.test.jsx +0 -70
  196. package/tests/PopupSurface.test.jsx +0 -142
  197. package/tests/ProfileComponent.refresh.test.jsx +0 -194
  198. package/tests/QrSignupManager.registrationContext.test.jsx +0 -106
  199. package/tests/QrSignupManagerInfoBox.test.jsx +0 -49
  200. package/tests/ScatterChart.test.jsx +0 -270
  201. package/tests/SectionNav.test.jsx +0 -363
  202. package/tests/SignUpPage.test.jsx +0 -208
  203. package/tests/SoftChip.test.jsx +0 -105
  204. package/tests/StatTile.test.jsx +0 -57
  205. package/tests/Thread.test.jsx +0 -151
  206. package/tests/TimeSeriesChart.test.jsx +0 -367
  207. package/tests/UserListComponent.test.jsx +0 -192
  208. package/tests/UserMenu.test.jsx +0 -171
  209. package/tests/apiClientLanguage.test.js +0 -33
  210. package/tests/apiClientPublicPaths.test.js +0 -178
  211. package/tests/authApiLogin.test.js +0 -42
  212. package/tests/authApiRegistration.test.js +0 -31
  213. package/tests/authErrorCodeRendering.test.jsx +0 -77
  214. package/tests/authErrors.test.js +0 -74
  215. package/tests/authTranslations.test.js +0 -74
  216. package/tests/chart-api-census.test.js +0 -366
  217. package/tests/chartAxisTickBand.test.jsx +0 -95
  218. package/tests/chartDefaults.test.js +0 -902
  219. package/tests/chartLabels.test.js +0 -50
  220. package/tests/chartsPalette.test.js +0 -99
  221. package/tests/chatApi.test.js +0 -48
  222. package/tests/chatDriverNames.test.jsx +0 -71
  223. package/tests/chatExports.test.js +0 -3
  224. package/tests/chatList.test.jsx +0 -84
  225. package/tests/chatPicker.test.jsx +0 -82
  226. package/tests/chatSocket.test.jsx +0 -26
  227. package/tests/chatThread.test.jsx +0 -116
  228. package/tests/chatTranslations.test.js +0 -47
  229. package/tests/chatWorkspace.test.jsx +0 -234
  230. package/tests/checkKitIntegration.test.jsx +0 -219
  231. package/tests/createAppTheme.test.js +0 -132
  232. package/tests/createAppThemeDark.test.js +0 -127
  233. package/tests/createAppThemeLightGuard.test.js +0 -40
  234. package/tests/createAppThemePageContrast.test.js +0 -108
  235. package/tests/createAppThemeTypography.test.js +0 -53
  236. package/tests/errorCallSiteGuard.test.js +0 -32
  237. package/tests/exportChart.test.js +0 -313
  238. package/tests/feedApi.test.js +0 -46
  239. package/tests/fixtures/light-theme-baseline.json +0 -2234
  240. package/tests/i18nAggregate.test.js +0 -120
  241. package/tests/i18nGermanVariant.test.js +0 -65
  242. package/tests/loginPageErrorResolution.test.jsx +0 -102
  243. package/tests/messagingApi.test.js +0 -32
  244. package/tests/messagingChunk6.test.jsx +0 -116
  245. package/tests/messagingCompactBubble.test.jsx +0 -64
  246. package/tests/messagingComposer.test.jsx +0 -136
  247. package/tests/messagingComposerChunk5.test.jsx +0 -113
  248. package/tests/messagingContractConformance.test.js +0 -69
  249. package/tests/messagingDirectMessageLauncher.test.jsx +0 -151
  250. package/tests/messagingExports.test.js +0 -21
  251. package/tests/messagingInteractions.test.jsx +0 -136
  252. package/tests/messagingLastMessagePreview.test.jsx +0 -93
  253. package/tests/messagingLinkify.test.jsx +0 -51
  254. package/tests/messagingMessageActions.test.jsx +0 -163
  255. package/tests/messagingMsg6.test.jsx +0 -105
  256. package/tests/messagingMsg6f.test.jsx +0 -155
  257. package/tests/messagingMsg6g.test.jsx +0 -166
  258. package/tests/messagingMsg6h.test.jsx +0 -136
  259. package/tests/messagingMsg6i.test.jsx +0 -129
  260. package/tests/messagingPollRendering.test.jsx +0 -142
  261. package/tests/messagingReactionMerge.test.jsx +0 -77
  262. package/tests/messagingReadTicksTooltip.test.jsx +0 -36
  263. package/tests/messagingThreadReceipts.test.jsx +0 -178
  264. package/tests/messagingThreadingQuoting.test.jsx +0 -87
  265. package/tests/messagingUnreadLifecycle.test.jsx +0 -78
  266. package/tests/notificationsApi.test.js +0 -41
  267. package/tests/notificationsExports.test.js +0 -34
  268. package/tests/onboardingDescriptors.test.js +0 -132
  269. package/tests/packageTreeShaking.test.js +0 -126
  270. package/tests/realtime.test.jsx +0 -219
  271. package/tests/resolveErrorText.test.js +0 -72
  272. package/tests/stepSelection.test.js +0 -53
  273. package/tests/themeCompleteness.test.js +0 -626
  274. package/tests/timeSeriesLegend.test.js +0 -99
  275. package/tests/userScreenTranslations.test.jsx +0 -218
  276. package/tsconfig.build.json +0 -18
  277. package/vite.config.mjs +0 -6
  278. package/work-orders/AUTH-1.md +0 -74
  279. package/work-orders/AUTH-2.md +0 -74
  280. package/work-orders/AUTH-4.md +0 -183
  281. package/work-orders/AUTH-5.md +0 -154
  282. package/work-orders/AUTH-7.md +0 -181
  283. package/work-orders/AUTH-8.md +0 -184
  284. package/work-orders/CHART-1.md +0 -285
  285. package/work-orders/CHART-2.md +0 -222
  286. package/work-orders/CHART-3.md +0 -163
  287. package/work-orders/CHART-4.md +0 -203
  288. package/work-orders/CHART-5.md +0 -226
  289. package/work-orders/CHART-6.md +0 -428
  290. package/work-orders/CHART-7.md +0 -175
  291. package/work-orders/DX-1.md +0 -169
  292. package/work-orders/DX-2.md +0 -188
  293. package/work-orders/DX-3.md +0 -195
  294. package/work-orders/I18N-1.md +0 -254
  295. package/work-orders/I18N-3.md +0 -207
  296. package/work-orders/MSG-3.md +0 -375
  297. package/work-orders/MSG-3b.md +0 -1002
  298. package/work-orders/MSG-3c.md +0 -378
  299. package/work-orders/MSG-3d.md +0 -268
  300. package/work-orders/MSG-3e.md +0 -164
  301. package/work-orders/MSG-3f.md +0 -391
  302. package/work-orders/MSG-6e.md +0 -308
  303. package/work-orders/MSG-6f.md +0 -214
  304. package/work-orders/MSG-6g.md +0 -244
  305. package/work-orders/MSG-6h.md +0 -238
  306. package/work-orders/MSG-6i.md +0 -271
  307. package/work-orders/MSG-6j.md +0 -117
  308. package/work-orders/NOTIF-12.md +0 -214
  309. package/work-orders/NOTIF-13.md +0 -142
  310. package/work-orders/NOTIF-14.md +0 -151
  311. package/work-orders/PRIM-1.md +0 -177
  312. package/work-orders/SHELL-1.md +0 -255
  313. package/work-orders/SHELL-2.md +0 -197
  314. package/work-orders/SHELL-3.md +0 -359
  315. package/work-orders/SHELL-4.md +0 -351
  316. package/work-orders/SHELL-5.md +0 -345
  317. package/work-orders/SHELL-6.md +0 -210
  318. package/work-orders/THEME-1.md +0 -587
  319. package/work-orders/THEME-10.md +0 -303
  320. package/work-orders/THEME-11.md +0 -208
  321. package/work-orders/THEME-2.md +0 -339
  322. package/work-orders/THEME-3.md +0 -210
  323. package/work-orders/THEME-4.md +0 -271
  324. package/work-orders/THEME-5.md +0 -341
  325. package/work-orders/THEME-6.md +0 -247
  326. package/work-orders/THEME-7.md +0 -82
  327. package/work-orders/THEME-8.md +0 -211
  328. package/work-orders/THEME-9.md +0 -194
  329. package/work-orders/UCM-AUTH-10.md +0 -490
  330. package/work-orders/UCM-AUTH-11.md +0 -185
  331. package/work-orders/UCM-AUTH-12.md +0 -98
  332. package/work-orders/UCM-AUTH-13.md +0 -47
  333. package/work-orders/UCM-AUTH-9.md +0 -207
  334. package/work-orders/UCM-CHART-10.md +0 -150
  335. package/work-orders/UCM-CHART-11.md +0 -132
  336. package/work-orders/UCM-CHART-12.md +0 -348
  337. package/work-orders/UCM-CHART-13.md +0 -122
  338. package/work-orders/UCM-CHART-14.md +0 -198
  339. package/work-orders/UCM-CHART-15.md +0 -187
  340. package/work-orders/UCM-CHART-16.md +0 -169
  341. package/work-orders/UCM-CHART-17.md +0 -195
  342. package/work-orders/UCM-CHART-18.md +0 -200
  343. package/work-orders/UCM-CHART-8.md +0 -147
  344. package/work-orders/UCM-CHART-9.md +0 -265
  345. package/work-orders/UCM-CHAT-1.md +0 -190
  346. package/work-orders/UCM-CHAT-2.md +0 -75
  347. package/work-orders/UCM-DEP-1.md +0 -63
  348. package/work-orders/UCM-I18N-4.md +0 -226
  349. package/work-orders/UCM-I18N-5.md +0 -211
  350. package/work-orders/UCM-MSG-20.md +0 -192
  351. package/work-orders/UCM-PRIM-2.md +0 -114
  352. package/work-orders/UCM-SHELL-7.md +0 -134
  353. package/work-orders/UCM-SHELL-8.md +0 -125
  354. package/work-orders/UCM-TEST-1.md +0 -304
  355. package/work-orders/UCM-THEME-13.md +0 -69
  356. package/work-orders/UCM-THEME-14.md +0 -312
  357. package/work-orders/UCM-THEME-15.md +0 -356
  358. package/work-orders/UCM-THEME-16.md +0 -80
  359. package/work-orders/UCM-THEME-17.md +0 -111
  360. package/work-orders/UCM-THEME-18.md +0 -184
  361. package/work-orders/assets/AUTH-4-user-list-card.html +0 -407
  362. package/work-orders/assets/PRIM-1-dashboard-primitives.html +0 -624
  363. package/work-orders/assets/SHELL-2-account-navigation.html +0 -1159
  364. package/work-orders/assets/THEME-1-baseline-reference-sheet.html +0 -1352
  365. package/work-orders/assets/UCM-CHAT-1-ai-chat.html +0 -447
  366. package/work-orders/assets/UCM-THEME-13-dark-prototype.html +0 -390
  367. package/work-orders/assets/UCM-THEME-17-type-scale.html +0 -391
@@ -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.