@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,447 +0,0 @@
1
- <title>AI Chat Surface</title>
2
- <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=DM+Sans:opsz,wght@9..40,400;9..40,500;9..40,600;9..40,700&display=swap">
3
- <style>
4
- /* Layout: chat list column + thread column at 1280; list and model picker become sheets at 375.
5
- Tokens: cockpit theme (primary #3D5A99) over the ui-core-micha light baseline, identical to
6
- cockpit/work-orders/assets/CKP-REM-4-prs.html. Cockpit is light-only, so this spec is too. */
7
- :root {
8
- color-scheme: light;
9
- --page: #FAFAFA;
10
- --paper: #FFFFFF;
11
- --subtle: #F4F5F6;
12
- --divider: rgba(33,37,41,.10);
13
- --ink: #212529;
14
- --ink-2: #5B6670;
15
- --ink-3: #6A7178;
16
- --primary: #3D5A99;
17
- --primary-dark: #324a7d;
18
- --accent-tint: #eff2f7;
19
- --ok-text: #35794A; --ok-bg: #E5F4E9;
20
- --warn-text: #976100; --warn-bg: #FBF0DC;
21
- --err-text: #BF3227; --err-bg: #FBEAE8;
22
- --stale-text: #5B6B7D; --stale-bg: #EAEDF1;
23
- --scrim: rgba(33,37,41,.32);
24
- --font: 'DM Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
25
- --mono: ui-monospace, 'SFMono-Regular', Consolas, monospace;
26
- }
27
- * { box-sizing: border-box; }
28
- body { background: var(--page); color: var(--ink); font-family: var(--font); font-size: 13px; margin: 0; padding: 24px 16px 40px; }
29
- .frames { display: flex; gap: 32px; align-items: flex-start; overflow-x: auto; padding-bottom: 8px; }
30
- .frame { flex: 0 0 auto; display: grid; gap: 8px; align-content: start; }
31
- .frame-label { font-size: 12px; color: var(--ink-3); font-variant-numeric: tabular-nums; }
32
- .vp { background: var(--page); border: 1px solid var(--divider); border-radius: 6px; position: relative; overflow: hidden; }
33
- .vp-375 { width: 375px; height: 740px; }
34
- .vp-1280 { width: 1280px; height: 760px; }
35
- .coverage { max-width: 1280px; margin: 0 0 20px; color: var(--ink-2); font-size: 12.5px; line-height: 1.5; display: grid; gap: 4px; }
36
- .coverage b { color: var(--ink); font-weight: 600; }
37
-
38
- /* Workspace */
39
- .ws { display: grid; grid-template-columns: 272px minmax(0, 1fr); height: 100%; }
40
- .vp-375 .ws { grid-template-columns: minmax(0, 1fr); }
41
-
42
- /* Chat list */
43
- .list { background: var(--subtle); border-right: 1px solid var(--divider); display: flex; flex-direction: column; min-height: 0; }
44
- .list-head { display: flex; align-items: center; justify-content: space-between; padding: 14px 12px 10px 16px; }
45
- .list-title { font-size: 14px; font-weight: 600; }
46
- .items { display: grid; gap: 2px; padding: 0 8px; overflow: hidden; }
47
- .item { display: grid; grid-template-columns: minmax(0, 1fr) 28px; align-items: center; gap: 4px; padding: 8px 4px 8px 10px; border-radius: 6px; color: var(--ink); }
48
- .item.active { background: var(--accent-tint); }
49
- .item.active .item-title { color: var(--primary-dark); font-weight: 600; }
50
- .item-title { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
51
- .item-meta { font-size: 11.5px; color: var(--ink-3); font-variant-numeric: tabular-nums; }
52
- .item .icon-btn { opacity: .0; }
53
- .item.active .icon-btn, .item.hover .icon-btn { opacity: 1; }
54
- .list-foot { margin-top: auto; border-top: 1px solid var(--divider); padding: 8px; }
55
- .archived-toggle { display: flex; align-items: center; justify-content: space-between; width: 100%; padding: 8px 10px; border-radius: 6px; color: var(--ink-2); font-weight: 500; }
56
- .count { color: var(--ink-3); font-variant-numeric: tabular-nums; font-weight: 500; }
57
-
58
- /* Menu (row overflow) */
59
- .menu { position: absolute; background: var(--paper); border: 1px solid var(--divider); border-radius: 6px; box-shadow: 0 6px 20px rgba(33,37,41,.14); padding: 4px 0; min-width: 168px; z-index: 3; }
60
- .menu-item { display: flex; align-items: center; gap: 10px; padding: 7px 14px; }
61
- .menu-item.danger { color: var(--err-text); }
62
- .menu-sep { height: 1px; background: var(--divider); margin: 4px 0; }
63
-
64
- /* Thread */
65
- .main { display: flex; flex-direction: column; min-width: 0; min-height: 0; background: var(--paper); }
66
- .bar { display: flex; align-items: center; gap: 8px; padding: 10px 16px; border-bottom: 1px solid var(--divider); min-height: 52px; }
67
- .vp-375 .bar { padding: 8px 8px 8px 4px; }
68
- .bar-title { font-size: 15px; font-weight: 600; min-width: 0; flex: 1 1 auto; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
69
- .picker-btn { display: inline-flex; align-items: center; gap: 6px; height: 32px; padding: 0 10px; border: 1px solid var(--divider); border-radius: 6px; background: var(--paper); color: var(--ink); font-weight: 500; white-space: nowrap; }
70
- .picker-btn .sep { color: var(--ink-3); }
71
- .picker-btn .effort { color: var(--ink-2); }
72
- .vp-375 .picker-btn { padding: 0 8px; }
73
- .icon-btn { width: 32px; height: 32px; display: inline-grid; place-items: center; border-radius: 6px; color: var(--ink-2); flex: 0 0 32px; }
74
- .icon-btn svg, .menu-item svg, .archived-toggle svg, .picker-btn svg, .send svg, .opt svg { width: 18px; height: 18px; fill: currentColor; }
75
-
76
- .thread { flex: 1 1 auto; overflow: hidden; padding: 20px 24px 8px; display: grid; gap: 18px; align-content: start; }
77
- .vp-375 .thread { padding: 14px 12px 8px; gap: 14px; }
78
- .col { width: 100%; max-width: 760px; margin: 0 auto; display: grid; gap: 18px; }
79
- .vp-375 .col { gap: 14px; }
80
- .msg-user { justify-self: end; max-width: 78%; background: var(--accent-tint); border-radius: 10px 10px 2px 10px; padding: 10px 14px; line-height: 1.5; }
81
- .vp-375 .msg-user { max-width: 88%; }
82
- .msg-ai { display: grid; gap: 8px; line-height: 1.55; min-width: 0; }
83
- .md p { margin: 0; }
84
- .md ul { margin: 0; padding-left: 20px; display: grid; gap: 3px; }
85
- .md code { font-family: var(--mono); font-size: 12px; background: var(--subtle); padding: 1px 4px; border-radius: 3px; }
86
- .md table { border-collapse: collapse; font-size: 12.5px; font-variant-numeric: tabular-nums; }
87
- .md th, .md td { text-align: left; padding: 5px 12px 5px 0; border-bottom: 1px solid var(--divider); }
88
- .md th { font-weight: 600; color: var(--ink-2); }
89
- .md .table-wrap { overflow-x: auto; }
90
- .md { display: grid; gap: 8px; }
91
-
92
- .sources { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; }
93
- .src { display: inline-flex; align-items: center; gap: 5px; height: 24px; max-width: 260px; padding: 0 8px; border: 1px solid var(--divider); border-radius: 4px; font-size: 12px; color: var(--ink-2); background: var(--paper); }
94
- .src svg { width: 13px; height: 13px; fill: var(--ink-3); flex: 0 0 13px; }
95
- .src span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
96
- .turn-meta { font-size: 11.5px; color: var(--ink-3); font-variant-numeric: tabular-nums; }
97
- .switch-mark { display: flex; align-items: center; gap: 10px; color: var(--ink-3); font-size: 11.5px; }
98
- .switch-mark::before, .switch-mark::after { content: ""; height: 1px; background: var(--divider); flex: 1 1 auto; }
99
-
100
- .typing { display: inline-flex; gap: 4px; align-items: center; height: 18px; }
101
- .typing i { width: 6px; height: 6px; border-radius: 50%; background: var(--ink-3); opacity: .55; }
102
- .caret { display: inline-block; width: 7px; height: 14px; background: var(--ink-2); vertical-align: -2px; margin-left: 1px; }
103
- .searching { display: inline-flex; align-items: center; gap: 6px; height: 24px; padding: 0 8px; border-radius: 4px; background: var(--subtle); color: var(--ink-2); font-size: 12px; }
104
-
105
- /* Composer */
106
- .composer { border-top: 1px solid var(--divider); padding: 12px 24px 14px; }
107
- .vp-375 .composer { padding: 10px 12px 12px; }
108
- .composer .col { gap: 8px; }
109
- .input { border: 1px solid rgba(33,37,41,.23); border-radius: 8px; min-height: 64px; padding: 10px 12px; color: var(--ink-3); line-height: 1.5; background: var(--paper); }
110
- .input.filled { color: var(--ink); }
111
- .input.focus { border: 2px solid var(--primary); padding: 9px 11px; }
112
- .actions { display: flex; justify-content: flex-end; gap: 8px; align-items: center; }
113
- .btn { display: inline-flex; align-items: center; gap: 6px; height: 34px; padding: 0 14px; border-radius: 6px; font-weight: 600; font-size: 13px; letter-spacing: .02em; }
114
- .btn.contained { background: var(--primary); color: #FFFFFF; }
115
- .btn.contained.disabled { background: rgba(33,37,41,.12); color: rgba(33,37,41,.38); }
116
- .btn.outlined { border: 1px solid rgba(61,90,153,.5); color: var(--primary); }
117
- .btn.text { color: var(--primary); padding: 0 8px; }
118
- .send svg { fill: currentColor; }
119
-
120
- /* Notices */
121
- .notice { display: flex; align-items: flex-start; gap: 10px; padding: 10px 12px; border-radius: 6px; line-height: 1.45; }
122
- .notice.err { background: var(--err-bg); color: var(--err-text); }
123
- .notice.warn { background: var(--warn-bg); color: var(--warn-text); }
124
- .notice .grow { flex: 1 1 auto; min-width: 0; }
125
- .notice .btn { height: 28px; padding: 0 8px; color: inherit; }
126
- .chip { display: inline-flex; align-items: center; gap: 6px; height: 22px; padding: 0 8px; border-radius: 4px; font-size: 11.5px; font-weight: 500; white-space: nowrap; }
127
- .chip.stale { background: var(--stale-bg); color: var(--stale-text); }
128
- .chip.warn { background: var(--warn-bg); color: var(--warn-text); }
129
- .chip .dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; }
130
-
131
- /* Sheets / popover */
132
- .scrim { position: absolute; inset: 0; background: var(--scrim); z-index: 2; }
133
- .drawer { position: absolute; top: 0; bottom: 0; left: 0; width: 300px; background: var(--paper); z-index: 3; display: flex; flex-direction: column; box-shadow: 4px 0 24px rgba(33,37,41,.18); }
134
- .drawer .list { background: var(--paper); border-right: 0; height: 100%; }
135
- .sheet { position: absolute; left: 0; right: 0; bottom: 0; background: var(--paper); z-index: 3; border-radius: 12px 12px 0 0; box-shadow: 0 -6px 24px rgba(33,37,41,.18); padding: 8px 0 12px; }
136
- .grabber { width: 36px; height: 4px; border-radius: 2px; background: var(--divider); margin: 0 auto 8px; }
137
- .popover { position: absolute; top: 50px; right: 56px; width: 340px; background: var(--paper); border: 1px solid var(--divider); border-radius: 8px; box-shadow: 0 8px 28px rgba(33,37,41,.16); z-index: 3; padding: 6px 0 12px; }
138
- .grp { font-size: 11.5px; font-weight: 600; color: var(--ink-3); padding: 10px 16px 4px; }
139
- .opt { display: grid; grid-template-columns: 20px minmax(0, 1fr) auto; gap: 10px; align-items: center; padding: 7px 16px; }
140
- .opt.sel { background: var(--accent-tint); }
141
- .opt .check { color: var(--primary); }
142
- .opt .name { font-weight: 500; }
143
- .opt .cost { font-size: 11.5px; color: var(--ink-3); }
144
- .effort-row { border-top: 1px solid var(--divider); margin-top: 6px; padding: 12px 16px 0; display: grid; gap: 8px; }
145
- .effort-label { font-size: 11.5px; font-weight: 600; color: var(--ink-3); }
146
- .seg { display: grid; grid-template-columns: repeat(4, 1fr); border: 1px solid rgba(61,90,153,.5); border-radius: 6px; overflow: hidden; }
147
- .seg span { text-align: center; padding: 6px 0; font-weight: 500; color: var(--primary); border-left: 1px solid rgba(61,90,153,.5); }
148
- .seg span:first-child { border-left: 0; }
149
- .seg span.on { background: var(--primary); color: #FFFFFF; }
150
- .seg span.off { color: rgba(33,37,41,.38); background: var(--subtle); }
151
-
152
- /* Edge-state gallery */
153
- .states { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; padding: 20px; height: 100%; align-content: start; background: var(--page); }
154
- .state { background: var(--paper); border: 1px solid var(--divider); border-radius: 6px; display: flex; flex-direction: column; min-height: 220px; overflow: hidden; }
155
- .state-label { font-size: 12px; color: var(--ink-3); padding: 8px 12px; border-bottom: 1px solid var(--divider); background: var(--subtle); }
156
- .state-body { padding: 16px; display: grid; gap: 12px; align-content: start; flex: 1 1 auto; }
157
- .empty { display: grid; gap: 6px; justify-items: center; text-align: center; padding: 28px 8px; color: var(--ink-2); }
158
- .empty h3 { margin: 0; font-size: 15px; color: var(--ink); font-weight: 600; }
159
- </style>
160
-
161
- <div class="coverage">
162
- <div><b>Coverage:</b> the shared ui-core-micha chat surface (chat list with archive, thread with Markdown replies and source chips, composer with stop, per-chat model and effort picker, edge states), shown in cockpit's theme as the first consumer. Everything app-specific around it (cockpit navigation, the existing Open WebUI chat page) is outside this prototype and stays untouched.</div>
163
- <div><b>Example content:</b> chat titles, questions, answers and source paths are illustrative, not real knowledge-base data.</div>
164
- </div>
165
-
166
- <svg width="0" height="0" style="position:absolute" aria-hidden="true">
167
- <symbol id="i-more" viewBox="0 0 24 24"><path d="M12 8a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm0 2a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm0 6a2 2 0 1 0 0 4 2 2 0 0 0 0-4z"/></symbol>
168
- <symbol id="i-new" viewBox="0 0 24 24"><path d="M20 2H4a2 2 0 0 0-2 2v18l4-4h14a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2zm0 14H5.17L4 17.17V4h16v12zM11 5h2v3h3v2h-3v3h-2v-3H8V8h3z"/></symbol>
169
- <symbol id="i-menu" viewBox="0 0 24 24"><path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"/></symbol>
170
- <symbol id="i-down" viewBox="0 0 24 24"><path d="M7 10l5 5 5-5z"/></symbol>
171
- <symbol id="i-right" viewBox="0 0 24 24"><path d="M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></symbol>
172
- <symbol id="i-send" viewBox="0 0 24 24"><path d="M2.01 21 23 12 2.01 3 2 10l15 2-15 2z"/></symbol>
173
- <symbol id="i-stop" viewBox="0 0 24 24"><path d="M6 6h12v12H6z"/></symbol>
174
- <symbol id="i-doc" viewBox="0 0 24 24"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6zM6 20V4h7v5h5v11H6z"/></symbol>
175
- <symbol id="i-edit" viewBox="0 0 24 24"><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04a1 1 0 0 0 0-1.41l-2.34-2.34a1 1 0 0 0-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"/></symbol>
176
- <symbol id="i-archive" viewBox="0 0 24 24"><path d="M20.54 5.23 19.15 3.55A1.45 1.45 0 0 0 18 3H6c-.47 0-.88.21-1.16.55L3.46 5.23A1.97 1.97 0 0 0 3 6.5V19a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6.5c0-.48-.17-.93-.46-1.27zM12 17.5 6.5 12H10v-2h4v2h3.5L12 17.5zM5.12 5l.81-1h12l.94 1H5.12z"/></symbol>
177
- <symbol id="i-delete" viewBox="0 0 24 24"><path d="M6 19a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"/></symbol>
178
- <symbol id="i-check" viewBox="0 0 24 24"><path d="M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></symbol>
179
- <symbol id="i-search" viewBox="0 0 24 24"><path d="M15.5 14h-.79l-.28-.27A6.47 6.47 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/></symbol>
180
- </svg>
181
-
182
- <div class="frames">
183
-
184
- <!-- ===================== 1280 · main working state ===================== -->
185
- <div class="frame">
186
- <div class="frame-label">1280 px · chat with a completed answer, a streaming answer and the model picker open</div>
187
- <div class="vp vp-1280">
188
- <div class="ws">
189
- <aside class="list" aria-label="Chats">
190
- <div class="list-head">
191
- <span class="list-title">Chats</span>
192
- <span class="icon-btn" role="button" aria-label="New chat" title="New chat"><svg><use href="#i-new"/></svg></span>
193
- </div>
194
- <div class="items">
195
- <div class="item active"><div><div class="item-title">Steering meeting follow-ups</div><div class="item-meta">Today 09:42</div></div><span class="icon-btn" aria-label="Chat actions" title="Chat actions"><svg><use href="#i-more"/></svg></span></div>
196
- <div class="item hover"><div><div class="item-title">Funding call deadlines Q1 2027</div><div class="item-meta">Yesterday</div></div><span class="icon-btn" aria-label="Chat actions" title="Chat actions"><svg><use href="#i-more"/></svg></span></div>
197
- <div class="item"><div><div class="item-title">Calibration targets for the Kigoma run</div><div class="item-meta">13 Oct</div></div><span class="icon-btn" aria-label="Chat actions"><svg><use href="#i-more"/></svg></span></div>
198
- <div class="item"><div><div class="item-title">What the backup runbook says about restic</div><div class="item-meta">9 Oct</div></div><span class="icon-btn" aria-label="Chat actions"><svg><use href="#i-more"/></svg></span></div>
199
- <div class="item"><div><div class="item-title">Ethics amendment wording</div><div class="item-meta">2 Oct</div></div><span class="icon-btn" aria-label="Chat actions"><svg><use href="#i-more"/></svg></span></div>
200
- </div>
201
- <div class="list-foot">
202
- <div class="archived-toggle" role="button"><span>Archived</span><span class="count">7 <svg style="vertical-align:-4px"><use href="#i-right"/></svg></span></div>
203
- </div>
204
- <!-- row overflow menu, opened on the hovered row -->
205
- <div class="menu" style="top: 118px; left: 214px;">
206
- <div class="menu-item"><svg><use href="#i-edit"/></svg>Rename</div>
207
- <div class="menu-item"><svg><use href="#i-archive"/></svg>Archive</div>
208
- <div class="menu-sep"></div>
209
- <div class="menu-item danger"><svg><use href="#i-delete"/></svg>Delete</div>
210
- </div>
211
- </aside>
212
-
213
- <section class="main" aria-label="Chat">
214
- <div class="bar">
215
- <span class="bar-title">Steering meeting follow-ups</span>
216
- <span class="picker-btn" role="button" aria-haspopup="listbox">Opus 5.5 <span class="sep">·</span> <span class="effort">High</span><svg><use href="#i-down"/></svg></span>
217
- </div>
218
-
219
- <div class="thread">
220
- <div class="col">
221
- <div class="msg-user">Which open points from the October steering meeting are still without an owner?</div>
222
- <div class="msg-ai">
223
- <div class="md">
224
- <p>Three of the eight action items in the minutes have no owner assigned:</p>
225
- <ul>
226
- <li><b>Data-sharing agreement</b> with the regional health office, due before the field phase.</li>
227
- <li><b>Re-run of the calibration</b> with the corrected referral distances (<code>v3.1</code> inputs).</li>
228
- <li><b>Budget reallocation</b> of the travel line to transcription.</li>
229
- </ul>
230
- <div class="table-wrap"><table>
231
- <thead><tr><th>Item</th><th>Due</th><th>Raised by</th></tr></thead>
232
- <tbody>
233
- <tr><td>Data-sharing agreement</td><td>30 Nov</td><td>Supervisor</td></tr>
234
- <tr><td>Calibration re-run</td><td>15 Nov</td><td>Modelling team</td></tr>
235
- <tr><td>Budget reallocation</td><td>31 Dec</td><td>Finance</td></tr>
236
- </tbody>
237
- </table></div>
238
- </div>
239
- <div class="sources" aria-label="Sources">
240
- <span class="src" title="PhD/hram/meetings/2026-10-07 steering minutes.docx"><svg><use href="#i-doc"/></svg><span>2026-10-07 steering minutes.docx</span></span>
241
- <span class="src" title="PhD/hram/planning/field phase plan.xlsx"><svg><use href="#i-doc"/></svg><span>field phase plan.xlsx</span></span>
242
- </div>
243
- <div class="turn-meta">Opus 5.5 · High</div>
244
- </div>
245
-
246
- <div class="msg-user">Draft a short email to the supervisor proposing owners for the first two.</div>
247
- <div class="msg-ai">
248
- <span class="searching"><svg style="width:13px;height:13px;fill:currentColor"><use href="#i-search"/></svg>Searching the knowledge base</span>
249
- <div class="md">
250
- <p>Here is a draft you can adapt:</p>
251
- <p>Dear Grace, following up on the steering meeting of 7 October, I would suggest that I take the calibration re-run, since the corrected referral distances are already in the v3.1 inputs, and that<span class="caret"></span></p>
252
- </div>
253
- </div>
254
- </div>
255
- </div>
256
-
257
- <div class="composer">
258
- <div class="col">
259
- <div class="input">Message</div>
260
- <div class="actions">
261
- <span class="btn outlined"><svg style="width:16px;height:16px;fill:currentColor"><use href="#i-stop"/></svg>Stop</span>
262
- <span class="btn contained disabled send">Send<svg style="width:16px;height:16px"><use href="#i-send"/></svg></span>
263
- </div>
264
- </div>
265
- </div>
266
- </section>
267
- </div>
268
-
269
- <!-- model picker, opened from the bar -->
270
- <div class="popover" role="listbox" aria-label="Model" style="right: 16px;">
271
- <div class="grp">Claude Code subscription</div>
272
- <div class="opt sel"><span class="check"><svg><use href="#i-check"/></svg></span><span class="name">Opus 5.5</span><span></span></div>
273
- <div class="opt"><span></span><span class="name">Sonnet 5.5</span><span></span></div>
274
- <div class="grp">Anthropic API</div>
275
- <div class="opt"><span></span><span class="name">Sonnet 5.5</span><span class="cost">pay per use</span></div>
276
- <div class="opt"><span></span><span class="name">Haiku 5.5</span><span class="cost">pay per use</span></div>
277
- <div class="grp">OpenAI API</div>
278
- <div class="opt"><span></span><span class="name">GPT-6 Luna</span><span class="cost">pay per use</span></div>
279
- <div class="effort-row">
280
- <span class="effort-label">Effort</span>
281
- <div class="seg" role="radiogroup" aria-label="Effort"><span>Low</span><span>Medium</span><span class="on">High</span><span>Max</span></div>
282
- </div>
283
- </div>
284
- </div>
285
- </div>
286
-
287
- <!-- ===================== 375 · thread ===================== -->
288
- <div class="frame">
289
- <div class="frame-label">375 px · thread (list and picker collapse into the bar)</div>
290
- <div class="vp vp-375">
291
- <div class="ws">
292
- <section class="main" aria-label="Chat">
293
- <div class="bar">
294
- <span class="icon-btn" role="button" aria-label="Chats" title="Chats"><svg><use href="#i-menu"/></svg></span>
295
- <span class="bar-title">Steering meeting follow-ups</span>
296
- <span class="picker-btn" role="button">Opus 5.5 <span class="sep">·</span> <span class="effort">High</span></span>
297
- <span class="icon-btn" role="button" aria-label="New chat" title="New chat"><svg><use href="#i-new"/></svg></span>
298
- </div>
299
- <div class="thread">
300
- <div class="col">
301
- <div class="msg-user">Which open points from the October steering meeting are still without an owner?</div>
302
- <div class="msg-ai">
303
- <div class="md">
304
- <p>Three of the eight action items in the minutes have no owner assigned:</p>
305
- <ul>
306
- <li><b>Data-sharing agreement</b> with the regional health office, due before the field phase.</li>
307
- <li><b>Re-run of the calibration</b> with the corrected referral distances (<code>v3.1</code> inputs).</li>
308
- <li><b>Budget reallocation</b> of the travel line to transcription.</li>
309
- </ul>
310
- </div>
311
- <div class="sources" aria-label="Sources">
312
- <span class="src" title="PhD/hram/meetings/2026-10-07 steering minutes.docx"><svg><use href="#i-doc"/></svg><span>2026-10-07 steering minutes.docx</span></span>
313
- <span class="src" title="PhD/hram/planning/field phase plan.xlsx"><svg><use href="#i-doc"/></svg><span>field phase plan.xlsx</span></span>
314
- </div>
315
- <div class="turn-meta">Opus 5.5 · High</div>
316
- </div>
317
- <div class="switch-mark">Sonnet 5.5 · Anthropic API · Medium</div>
318
- <div class="msg-user">Shorter please, three bullets.</div>
319
- <div class="msg-ai">
320
- <div class="typing" aria-label="Answer is being written"><i></i><i></i><i></i></div>
321
- </div>
322
- </div>
323
- </div>
324
- <div class="composer">
325
- <div class="col">
326
- <div class="input">Message</div>
327
- <div class="actions">
328
- <span class="btn outlined"><svg style="width:16px;height:16px;fill:currentColor"><use href="#i-stop"/></svg>Stop</span>
329
- <span class="btn contained disabled send">Send<svg style="width:16px;height:16px"><use href="#i-send"/></svg></span>
330
- </div>
331
- </div>
332
- </div>
333
- </section>
334
- </div>
335
- </div>
336
- </div>
337
-
338
- <!-- ===================== 375 · chat list drawer ===================== -->
339
- <div class="frame">
340
- <div class="frame-label">375 px · chat list as drawer</div>
341
- <div class="vp vp-375">
342
- <div class="ws">
343
- <section class="main"><div class="bar"><span class="icon-btn"><svg><use href="#i-menu"/></svg></span><span class="bar-title">Steering meeting follow-ups</span></div><div class="thread"></div></section>
344
- </div>
345
- <div class="scrim"></div>
346
- <div class="drawer">
347
- <aside class="list" aria-label="Chats">
348
- <div class="list-head">
349
- <span class="list-title">Chats</span>
350
- <span class="icon-btn" role="button" aria-label="New chat" title="New chat"><svg><use href="#i-new"/></svg></span>
351
- </div>
352
- <div class="items">
353
- <div class="item active"><div><div class="item-title">Steering meeting follow-ups</div><div class="item-meta">Today 09:42</div></div><span class="icon-btn" aria-label="Chat actions"><svg><use href="#i-more"/></svg></span></div>
354
- <div class="item"><div><div class="item-title">Funding call deadlines Q1 2027</div><div class="item-meta">Yesterday</div></div><span class="icon-btn" aria-label="Chat actions" style="opacity:1"><svg><use href="#i-more"/></svg></span></div>
355
- <div class="item"><div><div class="item-title">Calibration targets for the Kigoma run</div><div class="item-meta">13 Oct</div></div><span class="icon-btn" aria-label="Chat actions" style="opacity:1"><svg><use href="#i-more"/></svg></span></div>
356
- <div class="item"><div><div class="item-title">What the backup runbook says about restic</div><div class="item-meta">9 Oct</div></div><span class="icon-btn" aria-label="Chat actions" style="opacity:1"><svg><use href="#i-more"/></svg></span></div>
357
- <div class="item"><div><div class="item-title">Ethics amendment wording</div><div class="item-meta">2 Oct</div></div><span class="icon-btn" aria-label="Chat actions" style="opacity:1"><svg><use href="#i-more"/></svg></span></div>
358
- </div>
359
- <div class="list-foot">
360
- <div class="archived-toggle" role="button"><span>Archived</span><span class="count">7 <svg style="vertical-align:-4px"><use href="#i-right"/></svg></span></div>
361
- </div>
362
- </aside>
363
- </div>
364
- </div>
365
- </div>
366
-
367
- <!-- ===================== 375 · model picker sheet ===================== -->
368
- <div class="frame">
369
- <div class="frame-label">375 px · model and effort picker as bottom sheet</div>
370
- <div class="vp vp-375">
371
- <div class="ws">
372
- <section class="main"><div class="bar"><span class="icon-btn"><svg><use href="#i-menu"/></svg></span><span class="bar-title">Steering meeting follow-ups</span><span class="picker-btn">Opus 5.5 <span class="sep">·</span> <span class="effort">High</span></span></div><div class="thread"></div></section>
373
- </div>
374
- <div class="scrim"></div>
375
- <div class="sheet" role="listbox" aria-label="Model">
376
- <div class="grabber"></div>
377
- <div class="grp">Claude Code subscription</div>
378
- <div class="opt sel"><span class="check"><svg><use href="#i-check"/></svg></span><span class="name">Opus 5.5</span><span></span></div>
379
- <div class="opt"><span></span><span class="name">Sonnet 5.5</span><span></span></div>
380
- <div class="grp">Anthropic API</div>
381
- <div class="opt"><span></span><span class="name">Sonnet 5.5</span><span class="cost">pay per use</span></div>
382
- <div class="opt"><span></span><span class="name">Haiku 5.5</span><span class="cost">pay per use</span></div>
383
- <div class="grp">OpenAI API</div>
384
- <div class="opt"><span></span><span class="name">GPT-6 Luna</span><span class="cost">pay per use</span></div>
385
- <div class="effort-row">
386
- <span class="effort-label">Effort</span>
387
- <div class="seg" role="radiogroup" aria-label="Effort"><span>Low</span><span>Medium</span><span class="on">High</span><span class="off" aria-disabled="true">Max</span></div>
388
- </div>
389
- </div>
390
- </div>
391
- </div>
392
-
393
- <!-- ===================== 1280 · edge states ===================== -->
394
- <div class="frame">
395
- <div class="frame-label">1280 px · edge states (each shown inside the thread column)</div>
396
- <div class="vp vp-1280">
397
- <div class="states">
398
- <div class="state">
399
- <div class="state-label">New chat, no messages yet</div>
400
- <div class="state-body">
401
- <div class="empty"><h3>New chat</h3><span>Opus 5.5 · High</span></div>
402
- <div class="input focus">Message</div>
403
- <div class="actions"><span class="btn contained disabled send">Send<svg style="width:16px;height:16px"><use href="#i-send"/></svg></span></div>
404
- </div>
405
- </div>
406
- <div class="state">
407
- <div class="state-label">Usage limit of the selected model reached</div>
408
- <div class="state-body">
409
- <div class="msg-user" style="max-width:90%">Summarise the restic section.</div>
410
- <div class="notice warn"><span class="grow">Usage limit reached for Opus 5.5. Choose another model or try again later.</span><span class="btn text">Change model</span></div>
411
- </div>
412
- </div>
413
- <div class="state">
414
- <div class="state-label">Answer interrupted (provider error, timeout or stop)</div>
415
- <div class="state-body">
416
- <div class="msg-user" style="max-width:90%">List the deadlines in November.</div>
417
- <div class="msg-ai"><div class="md"><p>There are two deadlines in November: the data-sharing agreement</p></div><span class="chip stale"><span class="dot"></span>Interrupted</span></div>
418
- <div class="notice err"><span class="grow">The answer could not be completed.</span><span class="btn text">Retry</span></div>
419
- </div>
420
- </div>
421
- <div class="state">
422
- <div class="state-label">Connection lost</div>
423
- <div class="state-body">
424
- <span class="chip warn"><span class="dot"></span>Reconnecting</span>
425
- <div class="input filled">Which items are due before the field phase?</div>
426
- <div class="actions"><span class="btn contained disabled send">Send<svg style="width:16px;height:16px"><use href="#i-send"/></svg></span></div>
427
- </div>
428
- </div>
429
- <div class="state">
430
- <div class="state-label">No model configured on this server</div>
431
- <div class="state-body">
432
- <div class="empty"><h3>Chat is not available</h3><span>No language model is configured on this server.</span></div>
433
- </div>
434
- </div>
435
- <div class="state">
436
- <div class="state-label">Archived chat opened</div>
437
- <div class="state-body">
438
- <span class="chip stale">Archived</span>
439
- <div class="msg-user" style="max-width:90%">What the backup runbook says about restic</div>
440
- <div class="actions"><span class="btn outlined">Restore</span></div>
441
- </div>
442
- </div>
443
- </div>
444
- </div>
445
- </div>
446
-
447
- </div>