@data-club/ai-hub 0.0.1

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 (344) hide show
  1. package/dist/auth/passwordPolicy.d.ts +55 -0
  2. package/dist/auth/passwordPolicy.d.ts.map +1 -0
  3. package/dist/auth/passwordPolicy.js +63 -0
  4. package/dist/auth/passwordPolicy.js.map +1 -0
  5. package/dist/auth/texts.d.ts +815 -0
  6. package/dist/auth/texts.d.ts.map +1 -0
  7. package/dist/auth/texts.js +429 -0
  8. package/dist/auth/texts.js.map +1 -0
  9. package/dist/client/AIHubClient.d.ts +1058 -0
  10. package/dist/client/AIHubClient.d.ts.map +1 -0
  11. package/dist/client/AIHubClient.js +950 -0
  12. package/dist/client/AIHubClient.js.map +1 -0
  13. package/dist/client/index.d.ts +11 -0
  14. package/dist/client/index.d.ts.map +1 -0
  15. package/dist/client/index.js +9 -0
  16. package/dist/client/index.js.map +1 -0
  17. package/dist/client/sseParser.d.ts +41 -0
  18. package/dist/client/sseParser.d.ts.map +1 -0
  19. package/dist/client/sseParser.js +153 -0
  20. package/dist/client/sseParser.js.map +1 -0
  21. package/dist/client/tokenStorage.d.ts +56 -0
  22. package/dist/client/tokenStorage.d.ts.map +1 -0
  23. package/dist/client/tokenStorage.js +116 -0
  24. package/dist/client/tokenStorage.js.map +1 -0
  25. package/dist/components/AgentsPicker/index.d.ts +70 -0
  26. package/dist/components/AgentsPicker/index.d.ts.map +1 -0
  27. package/dist/components/AgentsPicker/index.js +63 -0
  28. package/dist/components/AgentsPicker/index.js.map +1 -0
  29. package/dist/components/AuthGate/index.d.ts +79 -0
  30. package/dist/components/AuthGate/index.d.ts.map +1 -0
  31. package/dist/components/AuthGate/index.js +61 -0
  32. package/dist/components/AuthGate/index.js.map +1 -0
  33. package/dist/components/CacheBadge/index.d.ts +88 -0
  34. package/dist/components/CacheBadge/index.d.ts.map +1 -0
  35. package/dist/components/CacheBadge/index.js +127 -0
  36. package/dist/components/CacheBadge/index.js.map +1 -0
  37. package/dist/components/ChangePassword/index.d.ts +109 -0
  38. package/dist/components/ChangePassword/index.d.ts.map +1 -0
  39. package/dist/components/ChangePassword/index.js +142 -0
  40. package/dist/components/ChangePassword/index.js.map +1 -0
  41. package/dist/components/ChatShell/ShellHeader.d.ts +44 -0
  42. package/dist/components/ChatShell/ShellHeader.d.ts.map +1 -0
  43. package/dist/components/ChatShell/ShellHeader.js +14 -0
  44. package/dist/components/ChatShell/ShellHeader.js.map +1 -0
  45. package/dist/components/ChatShell/UserMenu.d.ts +48 -0
  46. package/dist/components/ChatShell/UserMenu.d.ts.map +1 -0
  47. package/dist/components/ChatShell/UserMenu.js +86 -0
  48. package/dist/components/ChatShell/UserMenu.js.map +1 -0
  49. package/dist/components/ChatShell/index.d.ts +98 -0
  50. package/dist/components/ChatShell/index.d.ts.map +1 -0
  51. package/dist/components/ChatShell/index.js +124 -0
  52. package/dist/components/ChatShell/index.js.map +1 -0
  53. package/dist/components/DataClubAIHub/index.d.ts +132 -0
  54. package/dist/components/DataClubAIHub/index.d.ts.map +1 -0
  55. package/dist/components/DataClubAIHub/index.js +124 -0
  56. package/dist/components/DataClubAIHub/index.js.map +1 -0
  57. package/dist/components/DataClubAIHubAdmin/AgentEditorModal.d.ts +89 -0
  58. package/dist/components/DataClubAIHubAdmin/AgentEditorModal.d.ts.map +1 -0
  59. package/dist/components/DataClubAIHubAdmin/AgentEditorModal.js +199 -0
  60. package/dist/components/DataClubAIHubAdmin/AgentEditorModal.js.map +1 -0
  61. package/dist/components/DataClubAIHubAdmin/AgentsPage.d.ts +33 -0
  62. package/dist/components/DataClubAIHubAdmin/AgentsPage.d.ts.map +1 -0
  63. package/dist/components/DataClubAIHubAdmin/AgentsPage.js +137 -0
  64. package/dist/components/DataClubAIHubAdmin/AgentsPage.js.map +1 -0
  65. package/dist/components/DataClubAIHubAdmin/CreateUserModal.d.ts +50 -0
  66. package/dist/components/DataClubAIHubAdmin/CreateUserModal.d.ts.map +1 -0
  67. package/dist/components/DataClubAIHubAdmin/CreateUserModal.js +93 -0
  68. package/dist/components/DataClubAIHubAdmin/CreateUserModal.js.map +1 -0
  69. package/dist/components/DataClubAIHubAdmin/PasswordRevealModal.d.ts +49 -0
  70. package/dist/components/DataClubAIHubAdmin/PasswordRevealModal.d.ts.map +1 -0
  71. package/dist/components/DataClubAIHubAdmin/PasswordRevealModal.js +94 -0
  72. package/dist/components/DataClubAIHubAdmin/PasswordRevealModal.js.map +1 -0
  73. package/dist/components/DataClubAIHubAdmin/ResetPasswordModal.d.ts +37 -0
  74. package/dist/components/DataClubAIHubAdmin/ResetPasswordModal.d.ts.map +1 -0
  75. package/dist/components/DataClubAIHubAdmin/ResetPasswordModal.js +44 -0
  76. package/dist/components/DataClubAIHubAdmin/ResetPasswordModal.js.map +1 -0
  77. package/dist/components/DataClubAIHubAdmin/RotatingMessageEditorModal.d.ts +56 -0
  78. package/dist/components/DataClubAIHubAdmin/RotatingMessageEditorModal.d.ts.map +1 -0
  79. package/dist/components/DataClubAIHubAdmin/RotatingMessageEditorModal.js +158 -0
  80. package/dist/components/DataClubAIHubAdmin/RotatingMessageEditorModal.js.map +1 -0
  81. package/dist/components/DataClubAIHubAdmin/RotatingMessagesPage.d.ts +29 -0
  82. package/dist/components/DataClubAIHubAdmin/RotatingMessagesPage.d.ts.map +1 -0
  83. package/dist/components/DataClubAIHubAdmin/RotatingMessagesPage.js +183 -0
  84. package/dist/components/DataClubAIHubAdmin/RotatingMessagesPage.js.map +1 -0
  85. package/dist/components/DataClubAIHubAdmin/SessionsOverviewPage.d.ts +38 -0
  86. package/dist/components/DataClubAIHubAdmin/SessionsOverviewPage.d.ts.map +1 -0
  87. package/dist/components/DataClubAIHubAdmin/SessionsOverviewPage.js +294 -0
  88. package/dist/components/DataClubAIHubAdmin/SessionsOverviewPage.js.map +1 -0
  89. package/dist/components/DataClubAIHubAdmin/SettingsPage.d.ts +36 -0
  90. package/dist/components/DataClubAIHubAdmin/SettingsPage.d.ts.map +1 -0
  91. package/dist/components/DataClubAIHubAdmin/SettingsPage.js +373 -0
  92. package/dist/components/DataClubAIHubAdmin/SettingsPage.js.map +1 -0
  93. package/dist/components/DataClubAIHubAdmin/UsersPage.d.ts +47 -0
  94. package/dist/components/DataClubAIHubAdmin/UsersPage.d.ts.map +1 -0
  95. package/dist/components/DataClubAIHubAdmin/UsersPage.js +233 -0
  96. package/dist/components/DataClubAIHubAdmin/UsersPage.js.map +1 -0
  97. package/dist/components/DataClubAIHubAdmin/index.d.ts +87 -0
  98. package/dist/components/DataClubAIHubAdmin/index.d.ts.map +1 -0
  99. package/dist/components/DataClubAIHubAdmin/index.js +137 -0
  100. package/dist/components/DataClubAIHubAdmin/index.js.map +1 -0
  101. package/dist/components/DataClubAIHubLogin/index.d.ts +113 -0
  102. package/dist/components/DataClubAIHubLogin/index.d.ts.map +1 -0
  103. package/dist/components/DataClubAIHubLogin/index.js +123 -0
  104. package/dist/components/DataClubAIHubLogin/index.js.map +1 -0
  105. package/dist/components/EffortControl/index.d.ts +57 -0
  106. package/dist/components/EffortControl/index.d.ts.map +1 -0
  107. package/dist/components/EffortControl/index.js +84 -0
  108. package/dist/components/EffortControl/index.js.map +1 -0
  109. package/dist/components/Layout/index.d.ts +63 -0
  110. package/dist/components/Layout/index.d.ts.map +1 -0
  111. package/dist/components/Layout/index.js +45 -0
  112. package/dist/components/Layout/index.js.map +1 -0
  113. package/dist/components/MainColumn/index.d.ts +69 -0
  114. package/dist/components/MainColumn/index.d.ts.map +1 -0
  115. package/dist/components/MainColumn/index.js +47 -0
  116. package/dist/components/MainColumn/index.js.map +1 -0
  117. package/dist/components/MarkdownRenderer/index.d.ts +66 -0
  118. package/dist/components/MarkdownRenderer/index.d.ts.map +1 -0
  119. package/dist/components/MarkdownRenderer/index.js +153 -0
  120. package/dist/components/MarkdownRenderer/index.js.map +1 -0
  121. package/dist/components/MessageInput/index.d.ts +85 -0
  122. package/dist/components/MessageInput/index.d.ts.map +1 -0
  123. package/dist/components/MessageInput/index.js +139 -0
  124. package/dist/components/MessageInput/index.js.map +1 -0
  125. package/dist/components/MessageList/index.d.ts +156 -0
  126. package/dist/components/MessageList/index.d.ts.map +1 -0
  127. package/dist/components/MessageList/index.js +352 -0
  128. package/dist/components/MessageList/index.js.map +1 -0
  129. package/dist/components/ReasoningSelector/index.d.ts +77 -0
  130. package/dist/components/ReasoningSelector/index.d.ts.map +1 -0
  131. package/dist/components/ReasoningSelector/index.js +156 -0
  132. package/dist/components/ReasoningSelector/index.js.map +1 -0
  133. package/dist/components/ReasoningView/index.d.ts +94 -0
  134. package/dist/components/ReasoningView/index.d.ts.map +1 -0
  135. package/dist/components/ReasoningView/index.js +83 -0
  136. package/dist/components/ReasoningView/index.js.map +1 -0
  137. package/dist/components/ScrollToPresentButton/index.d.ts +54 -0
  138. package/dist/components/ScrollToPresentButton/index.d.ts.map +1 -0
  139. package/dist/components/ScrollToPresentButton/index.js +44 -0
  140. package/dist/components/ScrollToPresentButton/index.js.map +1 -0
  141. package/dist/components/SessionsPanel/SessionTitleModal.d.ts +79 -0
  142. package/dist/components/SessionsPanel/SessionTitleModal.d.ts.map +1 -0
  143. package/dist/components/SessionsPanel/SessionTitleModal.js +102 -0
  144. package/dist/components/SessionsPanel/SessionTitleModal.js.map +1 -0
  145. package/dist/components/SessionsPanel/index.d.ts +100 -0
  146. package/dist/components/SessionsPanel/index.d.ts.map +1 -0
  147. package/dist/components/SessionsPanel/index.js +176 -0
  148. package/dist/components/SessionsPanel/index.js.map +1 -0
  149. package/dist/components/SystemNotice/index.d.ts +66 -0
  150. package/dist/components/SystemNotice/index.d.ts.map +1 -0
  151. package/dist/components/SystemNotice/index.js +81 -0
  152. package/dist/components/SystemNotice/index.js.map +1 -0
  153. package/dist/components/ThemeSwitcher/index.d.ts +66 -0
  154. package/dist/components/ThemeSwitcher/index.d.ts.map +1 -0
  155. package/dist/components/ThemeSwitcher/index.js +73 -0
  156. package/dist/components/ThemeSwitcher/index.js.map +1 -0
  157. package/dist/components/ToolCallView/formatContent.d.ts +36 -0
  158. package/dist/components/ToolCallView/formatContent.d.ts.map +1 -0
  159. package/dist/components/ToolCallView/formatContent.js +53 -0
  160. package/dist/components/ToolCallView/formatContent.js.map +1 -0
  161. package/dist/components/ToolCallView/index.d.ts +120 -0
  162. package/dist/components/ToolCallView/index.d.ts.map +1 -0
  163. package/dist/components/ToolCallView/index.js +104 -0
  164. package/dist/components/ToolCallView/index.js.map +1 -0
  165. package/dist/components/TpmBanner/index.d.ts +53 -0
  166. package/dist/components/TpmBanner/index.d.ts.map +1 -0
  167. package/dist/components/TpmBanner/index.js +116 -0
  168. package/dist/components/TpmBanner/index.js.map +1 -0
  169. package/dist/components/TurnStatusIndicator/index.d.ts +77 -0
  170. package/dist/components/TurnStatusIndicator/index.d.ts.map +1 -0
  171. package/dist/components/TurnStatusIndicator/index.js +122 -0
  172. package/dist/components/TurnStatusIndicator/index.js.map +1 -0
  173. package/dist/components/internal/PasswordInput.d.ts +62 -0
  174. package/dist/components/internal/PasswordInput.d.ts.map +1 -0
  175. package/dist/components/internal/PasswordInput.js +42 -0
  176. package/dist/components/internal/PasswordInput.js.map +1 -0
  177. package/dist/context/AIHubContext.d.ts +220 -0
  178. package/dist/context/AIHubContext.d.ts.map +1 -0
  179. package/dist/context/AIHubContext.js +19 -0
  180. package/dist/context/AIHubContext.js.map +1 -0
  181. package/dist/context/AIHubProvider.d.ts +75 -0
  182. package/dist/context/AIHubProvider.d.ts.map +1 -0
  183. package/dist/context/AIHubProvider.js +954 -0
  184. package/dist/context/AIHubProvider.js.map +1 -0
  185. package/dist/context/index.d.ts +9 -0
  186. package/dist/context/index.d.ts.map +1 -0
  187. package/dist/context/index.js +9 -0
  188. package/dist/context/index.js.map +1 -0
  189. package/dist/context/theme.d.ts +43 -0
  190. package/dist/context/theme.d.ts.map +1 -0
  191. package/dist/context/theme.js +70 -0
  192. package/dist/context/theme.js.map +1 -0
  193. package/dist/context/useAIHub.d.ts +104 -0
  194. package/dist/context/useAIHub.d.ts.map +1 -0
  195. package/dist/context/useAIHub.js +63 -0
  196. package/dist/context/useAIHub.js.map +1 -0
  197. package/dist/context/useAIHubAuth.d.ts +44 -0
  198. package/dist/context/useAIHubAuth.d.ts.map +1 -0
  199. package/dist/context/useAIHubAuth.js +35 -0
  200. package/dist/context/useAIHubAuth.js.map +1 -0
  201. package/dist/index.d.ts +76 -0
  202. package/dist/index.d.ts.map +1 -0
  203. package/dist/index.js +57 -0
  204. package/dist/index.js.map +1 -0
  205. package/dist/primitives/index.d.ts +99 -0
  206. package/dist/primitives/index.d.ts.map +1 -0
  207. package/dist/primitives/index.js +97 -0
  208. package/dist/primitives/index.js.map +1 -0
  209. package/dist/state/affordances.d.ts +182 -0
  210. package/dist/state/affordances.d.ts.map +1 -0
  211. package/dist/state/affordances.js +189 -0
  212. package/dist/state/affordances.js.map +1 -0
  213. package/dist/state/stateReducer.d.ts +72 -0
  214. package/dist/state/stateReducer.d.ts.map +1 -0
  215. package/dist/state/stateReducer.js +122 -0
  216. package/dist/state/stateReducer.js.map +1 -0
  217. package/dist/stories/EffortControl.stories.d.ts +14 -0
  218. package/dist/stories/EffortControl.stories.d.ts.map +1 -0
  219. package/dist/stories/EffortControl.stories.js +43 -0
  220. package/dist/stories/EffortControl.stories.js.map +1 -0
  221. package/dist/stories/MarkdownRenderer.stories.d.ts +25 -0
  222. package/dist/stories/MarkdownRenderer.stories.d.ts.map +1 -0
  223. package/dist/stories/MarkdownRenderer.stories.js +178 -0
  224. package/dist/stories/MarkdownRenderer.stories.js.map +1 -0
  225. package/dist/stories/MessageBubble.stories.d.ts +21 -0
  226. package/dist/stories/MessageBubble.stories.d.ts.map +1 -0
  227. package/dist/stories/MessageBubble.stories.js +59 -0
  228. package/dist/stories/MessageBubble.stories.js.map +1 -0
  229. package/dist/stories/ReasoningView.stories.d.ts +18 -0
  230. package/dist/stories/ReasoningView.stories.d.ts.map +1 -0
  231. package/dist/stories/ReasoningView.stories.js +62 -0
  232. package/dist/stories/ReasoningView.stories.js.map +1 -0
  233. package/dist/stories/ScrollToPresentButton.stories.d.ts +18 -0
  234. package/dist/stories/ScrollToPresentButton.stories.d.ts.map +1 -0
  235. package/dist/stories/ScrollToPresentButton.stories.js +34 -0
  236. package/dist/stories/ScrollToPresentButton.stories.js.map +1 -0
  237. package/dist/stories/SystemNotice.stories.d.ts +17 -0
  238. package/dist/stories/SystemNotice.stories.d.ts.map +1 -0
  239. package/dist/stories/SystemNotice.stories.js +42 -0
  240. package/dist/stories/SystemNotice.stories.js.map +1 -0
  241. package/dist/stories/ThemeSwitcher.stories.d.ts +15 -0
  242. package/dist/stories/ThemeSwitcher.stories.d.ts.map +1 -0
  243. package/dist/stories/ThemeSwitcher.stories.js +35 -0
  244. package/dist/stories/ThemeSwitcher.stories.js.map +1 -0
  245. package/dist/stories/ToolCallView.stories.d.ts +20 -0
  246. package/dist/stories/ToolCallView.stories.d.ts.map +1 -0
  247. package/dist/stories/ToolCallView.stories.js +65 -0
  248. package/dist/stories/ToolCallView.stories.js.map +1 -0
  249. package/dist/stories/TpmBanner.stories.d.ts +24 -0
  250. package/dist/stories/TpmBanner.stories.d.ts.map +1 -0
  251. package/dist/stories/TpmBanner.stories.js +63 -0
  252. package/dist/stories/TpmBanner.stories.js.map +1 -0
  253. package/dist/stories/TurnStatusIndicator.stories.d.ts +25 -0
  254. package/dist/stories/TurnStatusIndicator.stories.d.ts.map +1 -0
  255. package/dist/stories/TurnStatusIndicator.stories.js +56 -0
  256. package/dist/stories/TurnStatusIndicator.stories.js.map +1 -0
  257. package/dist/stories/_mockProvider.d.ts +44 -0
  258. package/dist/stories/_mockProvider.d.ts.map +1 -0
  259. package/dist/stories/_mockProvider.js +84 -0
  260. package/dist/stories/_mockProvider.js.map +1 -0
  261. package/dist/types.d.ts +787 -0
  262. package/dist/types.d.ts.map +1 -0
  263. package/dist/types.js +19 -0
  264. package/dist/types.js.map +1 -0
  265. package/dist/webcomponent/defineWebComponent.d.ts +106 -0
  266. package/dist/webcomponent/defineWebComponent.d.ts.map +1 -0
  267. package/dist/webcomponent/defineWebComponent.js +126 -0
  268. package/dist/webcomponent/defineWebComponent.js.map +1 -0
  269. package/dist/webcomponent/index.d.ts +7 -0
  270. package/dist/webcomponent/index.d.ts.map +1 -0
  271. package/dist/webcomponent/index.js +7 -0
  272. package/dist/webcomponent/index.js.map +1 -0
  273. package/package.json +63 -0
  274. package/src/__lint-canary__/step1-lint-canary.ts.disabled +28 -0
  275. package/src/auth/passwordPolicy.ts +75 -0
  276. package/src/auth/texts.ts +1294 -0
  277. package/src/client/AIHubClient.ts +1718 -0
  278. package/src/client/index.ts +30 -0
  279. package/src/client/sseParser.ts +168 -0
  280. package/src/client/tokenStorage.ts +131 -0
  281. package/src/components/AgentsPicker/index.tsx +147 -0
  282. package/src/components/AuthGate/index.tsx +132 -0
  283. package/src/components/CacheBadge/index.tsx +245 -0
  284. package/src/components/ChangePassword/index.tsx +375 -0
  285. package/src/components/ChatShell/ShellHeader.tsx +80 -0
  286. package/src/components/ChatShell/UserMenu.tsx +196 -0
  287. package/src/components/ChatShell/index.tsx +307 -0
  288. package/src/components/DataClubAIHub/index.tsx +300 -0
  289. package/src/components/DataClubAIHubAdmin/AgentEditorModal.tsx +505 -0
  290. package/src/components/DataClubAIHubAdmin/AgentsPage.tsx +342 -0
  291. package/src/components/DataClubAIHubAdmin/CreateUserModal.tsx +214 -0
  292. package/src/components/DataClubAIHubAdmin/PasswordRevealModal.tsx +204 -0
  293. package/src/components/DataClubAIHubAdmin/ResetPasswordModal.tsx +122 -0
  294. package/src/components/DataClubAIHubAdmin/RotatingMessageEditorModal.tsx +408 -0
  295. package/src/components/DataClubAIHubAdmin/RotatingMessagesPage.tsx +373 -0
  296. package/src/components/DataClubAIHubAdmin/SessionsOverviewPage.tsx +639 -0
  297. package/src/components/DataClubAIHubAdmin/SettingsPage.tsx +979 -0
  298. package/src/components/DataClubAIHubAdmin/UsersPage.tsx +495 -0
  299. package/src/components/DataClubAIHubAdmin/index.tsx +277 -0
  300. package/src/components/DataClubAIHubLogin/index.tsx +282 -0
  301. package/src/components/EffortControl/index.tsx +138 -0
  302. package/src/components/Layout/index.tsx +92 -0
  303. package/src/components/MainColumn/index.tsx +131 -0
  304. package/src/components/MarkdownRenderer/index.tsx +256 -0
  305. package/src/components/MessageInput/index.tsx +283 -0
  306. package/src/components/MessageList/index.tsx +753 -0
  307. package/src/components/ReasoningSelector/index.tsx +268 -0
  308. package/src/components/ReasoningView/index.tsx +183 -0
  309. package/src/components/ScrollToPresentButton/index.tsx +85 -0
  310. package/src/components/SessionsPanel/SessionTitleModal.tsx +256 -0
  311. package/src/components/SessionsPanel/index.tsx +406 -0
  312. package/src/components/SystemNotice/index.tsx +151 -0
  313. package/src/components/ThemeSwitcher/index.tsx +136 -0
  314. package/src/components/ToolCallView/formatContent.ts +50 -0
  315. package/src/components/ToolCallView/index.tsx +274 -0
  316. package/src/components/TpmBanner/index.tsx +172 -0
  317. package/src/components/TurnStatusIndicator/index.tsx +203 -0
  318. package/src/components/internal/PasswordInput.tsx +145 -0
  319. package/src/context/AIHubContext.ts +249 -0
  320. package/src/context/AIHubProvider.tsx +1084 -0
  321. package/src/context/index.ts +9 -0
  322. package/src/context/theme.ts +76 -0
  323. package/src/context/useAIHub.ts +151 -0
  324. package/src/context/useAIHubAuth.ts +65 -0
  325. package/src/index.ts +275 -0
  326. package/src/primitives/index.ts +101 -0
  327. package/src/state/affordances.ts +321 -0
  328. package/src/state/stateReducer.ts +131 -0
  329. package/src/stories/EffortControl.stories.tsx +63 -0
  330. package/src/stories/MarkdownRenderer.stories.tsx +201 -0
  331. package/src/stories/MessageBubble.stories.tsx +101 -0
  332. package/src/stories/ReasoningView.stories.tsx +81 -0
  333. package/src/stories/ScrollToPresentButton.stories.tsx +52 -0
  334. package/src/stories/SystemNotice.stories.tsx +59 -0
  335. package/src/stories/ThemeSwitcher.stories.tsx +55 -0
  336. package/src/stories/ToolCallView.stories.tsx +95 -0
  337. package/src/stories/TpmBanner.stories.tsx +93 -0
  338. package/src/stories/TurnStatusIndicator.stories.tsx +86 -0
  339. package/src/stories/_mockProvider.tsx +116 -0
  340. package/src/styles/CLASSES.md +356 -0
  341. package/src/styles/default.css +2937 -0
  342. package/src/types.ts +867 -0
  343. package/src/webcomponent/defineWebComponent.tsx +193 -0
  344. package/src/webcomponent/index.ts +11 -0
@@ -0,0 +1,2937 @@
1
+ /**
2
+ * @data-club/ai-hub — default stylesheet.
3
+ *
4
+ * The library ships plain CSS (§7.6). Components scope their classes under
5
+ * `.data-club-ai-hub` and `.data-club-ai-hub-admin`. Themes are selected
6
+ * via the `data-theme` attribute on the component root, which the
7
+ * <AIHubProvider> sets based on the resolved theme per §7.6.
8
+ *
9
+ * Per-customer wrappers override individual custom properties to brand
10
+ * the UI; they don't fork this file. Examples:
11
+ *
12
+ * bankxyz-chat::part(root),
13
+ * .data-club-ai-hub {
14
+ * --dc-aih-accent: #0066cc;
15
+ * --dc-aih-radius-md: 12px;
16
+ * }
17
+ *
18
+ * See CLASSES.md for the full BEM contract.
19
+ */
20
+
21
+ /* ────────────────────────────────────────────────────────────────────── */
22
+ /* Tokens — defaults (light theme is the implicit fallback) */
23
+ /* ────────────────────────────────────────────────────────────────────── */
24
+
25
+ .data-club-ai-hub,
26
+ .data-club-ai-hub-admin {
27
+ /* The root wrapper fills its host container (Web Component, dev
28
+ harness `#root`, embedding `<div>`, …) so the chat shell inside
29
+ can use `height: 100%` and the messages_area becomes the only
30
+ scrollable region. Without this, the wrapper collapsed to
31
+ `height: auto` and the shell pinned its `height: 100%` to zero. */
32
+ display: flex;
33
+ flex-direction: column;
34
+ height: 100%;
35
+ min-height: 0;
36
+
37
+ /* Surface colors */
38
+ --dc-aih-bg: #ffffff;
39
+ --dc-aih-bg-elevated: #f8f9fb;
40
+ --dc-aih-bg-overlay: rgba(255, 255, 255, 0.92);
41
+ --dc-aih-border: #e2e5ec;
42
+ --dc-aih-border-strong: #c8ccd6;
43
+
44
+ /* Text */
45
+ --dc-aih-fg: #1a1d24;
46
+ --dc-aih-fg-muted: #5c6473;
47
+ --dc-aih-fg-subtle: #8a909c;
48
+ --dc-aih-fg-inverse: #ffffff;
49
+
50
+ /* Accent (per-customer wrappers override this) */
51
+ --dc-aih-accent: #4a6cf7;
52
+ --dc-aih-accent-hover: #3b58d8;
53
+ --dc-aih-accent-fg: #ffffff;
54
+
55
+ /* State */
56
+ --dc-aih-success: #2f9e44;
57
+ --dc-aih-warning: #d97706;
58
+ --dc-aih-danger: #d92d20;
59
+ --dc-aih-focus-ring: rgba(74, 108, 247, 0.4);
60
+
61
+ /* Scrollbar — themable per-customer via these custom properties.
62
+ `--dc-aih-scrollbar-thumb` (and the hover variant) is the visible
63
+ bar; `--dc-aih-scrollbar-track` is the gutter behind it. Wrappers
64
+ override these on `.data-club-ai-hub` to match brand chrome. */
65
+ --dc-aih-scrollbar-thumb: #c8ccd6;
66
+ --dc-aih-scrollbar-thumb-hover: #a1a7b3;
67
+ --dc-aih-scrollbar-track: transparent;
68
+
69
+ /* Sizing */
70
+ --dc-aih-radius-sm: 4px;
71
+ --dc-aih-radius-md: 8px;
72
+ --dc-aih-radius-lg: 12px;
73
+ --dc-aih-space-xs: 4px;
74
+ --dc-aih-space-sm: 8px;
75
+ --dc-aih-space-md: 16px;
76
+ --dc-aih-space-lg: 24px;
77
+ --dc-aih-space-xl: 32px;
78
+
79
+ /* Type */
80
+ --dc-aih-font-sans: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
81
+ --dc-aih-font-mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
82
+ --dc-aih-font-size-sm: 0.875rem;
83
+ --dc-aih-font-size-md: 1rem;
84
+ --dc-aih-font-size-lg: 1.125rem;
85
+
86
+ /* Motion */
87
+ --dc-aih-transition: 150ms ease-in-out;
88
+
89
+ font-family: var(--dc-aih-font-sans);
90
+ color: var(--dc-aih-fg);
91
+ background-color: var(--dc-aih-bg);
92
+ }
93
+
94
+ /* ────────────────────────────────────────────────────────────────────── */
95
+ /* Dark theme overrides */
96
+ /* ────────────────────────────────────────────────────────────────────── */
97
+
98
+ .data-club-ai-hub[data-theme="dark"],
99
+ .data-club-ai-hub-admin[data-theme="dark"] {
100
+ --dc-aih-bg: #0f1117;
101
+ --dc-aih-bg-elevated: #181b23;
102
+ --dc-aih-bg-overlay: rgba(15, 17, 23, 0.9);
103
+ --dc-aih-border: #2a2e38;
104
+ --dc-aih-border-strong: #3c4250;
105
+
106
+ --dc-aih-fg: #e8eaef;
107
+ --dc-aih-fg-muted: #a1a7b3;
108
+ --dc-aih-fg-subtle: #6c727e;
109
+ --dc-aih-fg-inverse: #0f1117;
110
+
111
+ --dc-aih-accent: #7a96ff;
112
+ --dc-aih-accent-hover: #95acff;
113
+ --dc-aih-accent-fg: #0f1117;
114
+
115
+ --dc-aih-success: #51cf66;
116
+ --dc-aih-warning: #f59f00;
117
+ --dc-aih-danger: #ff6b6b;
118
+ --dc-aih-focus-ring: rgba(122, 150, 255, 0.4);
119
+
120
+ --dc-aih-scrollbar-thumb: #3c4250;
121
+ --dc-aih-scrollbar-thumb-hover: #4a5160;
122
+ --dc-aih-scrollbar-track: transparent;
123
+ }
124
+
125
+ /* ────────────────────────────────────────────────────────────────────── */
126
+ /* Base elements + reset */
127
+ /* ────────────────────────────────────────────────────────────────────── */
128
+
129
+ .data-club-ai-hub *,
130
+ .data-club-ai-hub *::before,
131
+ .data-club-ai-hub *::after,
132
+ .data-club-ai-hub-admin *,
133
+ .data-club-ai-hub-admin *::before,
134
+ .data-club-ai-hub-admin *::after {
135
+ box-sizing: border-box;
136
+ }
137
+
138
+ .data-club-ai-hub button,
139
+ .data-club-ai-hub-admin button {
140
+ font: inherit;
141
+ cursor: pointer;
142
+ }
143
+
144
+ /* Themable scrollbars — Firefox + WebKit. Applied to every scrollable
145
+ region inside the chat / admin scope so the chat doesn't get a stark
146
+ white system scrollbar on dark themes. Customers override the colors
147
+ via the `--dc-aih-scrollbar-*` custom properties. */
148
+ .data-club-ai-hub *,
149
+ .data-club-ai-hub-admin * {
150
+ scrollbar-width: thin;
151
+ scrollbar-color: var(--dc-aih-scrollbar-thumb) var(--dc-aih-scrollbar-track);
152
+ }
153
+
154
+ .data-club-ai-hub *::-webkit-scrollbar,
155
+ .data-club-ai-hub-admin *::-webkit-scrollbar {
156
+ width: 10px;
157
+ height: 10px;
158
+ }
159
+
160
+ .data-club-ai-hub *::-webkit-scrollbar-track,
161
+ .data-club-ai-hub-admin *::-webkit-scrollbar-track {
162
+ background: var(--dc-aih-scrollbar-track);
163
+ }
164
+
165
+ .data-club-ai-hub *::-webkit-scrollbar-thumb,
166
+ .data-club-ai-hub-admin *::-webkit-scrollbar-thumb {
167
+ background-color: var(--dc-aih-scrollbar-thumb);
168
+ border-radius: 999px;
169
+ border: 2px solid var(--dc-aih-bg);
170
+ }
171
+
172
+ .data-club-ai-hub *::-webkit-scrollbar-thumb:hover,
173
+ .data-club-ai-hub-admin *::-webkit-scrollbar-thumb:hover {
174
+ background-color: var(--dc-aih-scrollbar-thumb-hover);
175
+ }
176
+
177
+ .data-club-ai-hub *::-webkit-scrollbar-corner,
178
+ .data-club-ai-hub-admin *::-webkit-scrollbar-corner {
179
+ background: var(--dc-aih-scrollbar-track);
180
+ }
181
+
182
+ @media (prefers-reduced-motion: reduce) {
183
+ .data-club-ai-hub *,
184
+ .data-club-ai-hub-admin * {
185
+ transition-duration: 0.01ms !important;
186
+ animation-duration: 0.01ms !important;
187
+ }
188
+ }
189
+
190
+ /* ────────────────────────────────────────────────────────────────────── */
191
+ /* Shared spinner glyph (used by submit buttons across screens) */
192
+ /* ────────────────────────────────────────────────────────────────────── */
193
+
194
+ .data-club-ai-hub__spinner {
195
+ display: inline-block;
196
+ width: 14px;
197
+ height: 14px;
198
+ margin-right: var(--dc-aih-space-sm);
199
+ border: 2px solid currentColor;
200
+ border-right-color: transparent;
201
+ border-radius: 50%;
202
+ vertical-align: middle;
203
+ animation: data-club-ai-hub-spin 0.7s linear infinite;
204
+ }
205
+
206
+ @keyframes data-club-ai-hub-spin {
207
+ to {
208
+ transform: rotate(360deg);
209
+ }
210
+ }
211
+
212
+ /* ────────────────────────────────────────────────────────────────────── */
213
+ /* Login screen — Step 8 */
214
+ /* ui-sketches/01-login.md */
215
+ /* ────────────────────────────────────────────────────────────────────── */
216
+
217
+ .data-club-ai-hub__login,
218
+ .data-club-ai-hub__change-password {
219
+ display: flex;
220
+ align-items: center;
221
+ justify-content: center;
222
+ min-height: 100vh;
223
+ padding: var(--dc-aih-space-lg);
224
+ }
225
+
226
+ .data-club-ai-hub__login-card,
227
+ .data-club-ai-hub__change-password-card {
228
+ width: 100%;
229
+ max-width: 400px;
230
+ padding: var(--dc-aih-space-xl);
231
+ background-color: var(--dc-aih-bg-elevated);
232
+ border: 1px solid var(--dc-aih-border);
233
+ border-radius: var(--dc-aih-radius-lg);
234
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.06);
235
+ }
236
+
237
+ .data-club-ai-hub[data-theme="dark"] .data-club-ai-hub__login-card,
238
+ .data-club-ai-hub[data-theme="dark"] .data-club-ai-hub__change-password-card {
239
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
240
+ }
241
+
242
+ .data-club-ai-hub__login-card__title,
243
+ .data-club-ai-hub__change-password-card__title {
244
+ margin: 0 0 var(--dc-aih-space-lg) 0;
245
+ font-size: 1.75rem;
246
+ font-weight: 700;
247
+ text-align: center;
248
+ /* "Gradient title" per the sketch — uses the accent color so per-customer
249
+ wrappers can override --dc-aih-accent and get a branded title for free. */
250
+ background: linear-gradient(
251
+ 90deg,
252
+ var(--dc-aih-accent) 0%,
253
+ var(--dc-aih-accent-hover) 100%
254
+ );
255
+ -webkit-background-clip: text;
256
+ background-clip: text;
257
+ color: transparent;
258
+ /* Fallback for browsers that don't support background-clip:text — the
259
+ accent color on the text body is still on-brand. */
260
+ -webkit-text-fill-color: transparent;
261
+ }
262
+
263
+ .data-club-ai-hub__login-card__error,
264
+ .data-club-ai-hub__change-password-card__error {
265
+ margin: 0 0 var(--dc-aih-space-md) 0;
266
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
267
+ font-size: var(--dc-aih-font-size-sm);
268
+ color: var(--dc-aih-danger);
269
+ background-color: color-mix(in srgb, var(--dc-aih-danger) 8%, transparent);
270
+ border: 1px solid color-mix(in srgb, var(--dc-aih-danger) 35%, transparent);
271
+ border-radius: var(--dc-aih-radius-md);
272
+ }
273
+
274
+ .data-club-ai-hub__login-card__form,
275
+ .data-club-ai-hub__change-password-card__form {
276
+ display: flex;
277
+ flex-direction: column;
278
+ gap: var(--dc-aih-space-md);
279
+ }
280
+
281
+ .data-club-ai-hub__login-card__field,
282
+ .data-club-ai-hub__change-password-card__field {
283
+ display: flex;
284
+ flex-direction: column;
285
+ gap: var(--dc-aih-space-xs);
286
+ }
287
+
288
+ .data-club-ai-hub__login-card__label,
289
+ .data-club-ai-hub__change-password-card__label {
290
+ font-size: var(--dc-aih-font-size-sm);
291
+ font-weight: 500;
292
+ color: var(--dc-aih-fg-muted);
293
+ }
294
+
295
+ .data-club-ai-hub__login-card__input,
296
+ .data-club-ai-hub__change-password-card__input {
297
+ width: 100%;
298
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
299
+ font: inherit;
300
+ font-size: var(--dc-aih-font-size-md);
301
+ color: var(--dc-aih-fg);
302
+ background-color: var(--dc-aih-bg);
303
+ border: 1px solid var(--dc-aih-border-strong);
304
+ border-radius: var(--dc-aih-radius-md);
305
+ transition: border-color var(--dc-aih-transition),
306
+ box-shadow var(--dc-aih-transition);
307
+ }
308
+
309
+ .data-club-ai-hub__login-card__input:focus-visible,
310
+ .data-club-ai-hub__change-password-card__input:focus-visible {
311
+ outline: none;
312
+ border-color: var(--dc-aih-accent);
313
+ box-shadow: 0 0 0 3px var(--dc-aih-focus-ring);
314
+ }
315
+
316
+ .data-club-ai-hub__login-card__input:disabled,
317
+ .data-club-ai-hub__change-password-card__input:disabled {
318
+ background-color: var(--dc-aih-bg-elevated);
319
+ color: var(--dc-aih-fg-muted);
320
+ cursor: not-allowed;
321
+ }
322
+
323
+ /* Password input wrapper holds the input + show toggle side-by-side. The
324
+ toggle is absolutely positioned over the input's right edge so the
325
+ show/hide eye sits inside the input visually without the input having
326
+ to know about it. */
327
+ .data-club-ai-hub__login-card__password,
328
+ .data-club-ai-hub__change-password-card__password {
329
+ position: relative;
330
+ }
331
+
332
+ .data-club-ai-hub__login-card__input--password,
333
+ .data-club-ai-hub__change-password-card__input--password {
334
+ /* Reserve space for the toggle button on the right. */
335
+ padding-right: calc(var(--dc-aih-space-xl) + var(--dc-aih-space-sm));
336
+ }
337
+
338
+ .data-club-ai-hub__login-card__toggle,
339
+ .data-club-ai-hub__change-password-card__toggle {
340
+ position: absolute;
341
+ top: 50%;
342
+ right: var(--dc-aih-space-sm);
343
+ display: inline-flex;
344
+ align-items: center;
345
+ justify-content: center;
346
+ width: 32px;
347
+ height: 32px;
348
+ padding: 0;
349
+ background: transparent;
350
+ border: none;
351
+ border-radius: var(--dc-aih-radius-sm);
352
+ color: var(--dc-aih-fg-muted);
353
+ transform: translateY(-50%);
354
+ transition: color var(--dc-aih-transition),
355
+ background-color var(--dc-aih-transition);
356
+ }
357
+
358
+ .data-club-ai-hub__login-card__toggle:hover,
359
+ .data-club-ai-hub__change-password-card__toggle:hover {
360
+ color: var(--dc-aih-fg);
361
+ background-color: color-mix(in srgb, var(--dc-aih-fg) 6%, transparent);
362
+ }
363
+
364
+ .data-club-ai-hub__login-card__toggle:focus-visible,
365
+ .data-club-ai-hub__change-password-card__toggle:focus-visible {
366
+ outline: none;
367
+ box-shadow: 0 0 0 3px var(--dc-aih-focus-ring);
368
+ }
369
+
370
+ .data-club-ai-hub__login-card__submit,
371
+ .data-club-ai-hub__change-password-card__submit {
372
+ display: inline-flex;
373
+ align-items: center;
374
+ justify-content: center;
375
+ width: 100%;
376
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
377
+ font: inherit;
378
+ font-size: var(--dc-aih-font-size-md);
379
+ font-weight: 600;
380
+ color: var(--dc-aih-accent-fg);
381
+ background-color: var(--dc-aih-accent);
382
+ border: none;
383
+ border-radius: var(--dc-aih-radius-md);
384
+ transition: background-color var(--dc-aih-transition);
385
+ }
386
+
387
+ .data-club-ai-hub__login-card__submit:hover:not(:disabled),
388
+ .data-club-ai-hub__change-password-card__submit:hover:not(:disabled) {
389
+ background-color: var(--dc-aih-accent-hover);
390
+ }
391
+
392
+ .data-club-ai-hub__login-card__submit:focus-visible,
393
+ .data-club-ai-hub__change-password-card__submit:focus-visible {
394
+ outline: none;
395
+ box-shadow: 0 0 0 3px var(--dc-aih-focus-ring);
396
+ }
397
+
398
+ .data-club-ai-hub__login-card__submit:disabled,
399
+ .data-club-ai-hub__change-password-card__submit:disabled {
400
+ opacity: 0.6;
401
+ cursor: not-allowed;
402
+ }
403
+
404
+ .data-club-ai-hub__login-card__forgot {
405
+ margin: var(--dc-aih-space-lg) 0 0 0;
406
+ padding-top: var(--dc-aih-space-md);
407
+ border-top: 1px solid var(--dc-aih-border);
408
+ font-size: var(--dc-aih-font-size-sm);
409
+ color: var(--dc-aih-fg-muted);
410
+ text-align: center;
411
+ }
412
+
413
+ /* ────────────────────────────────────────────────────────────────────── */
414
+ /* Change-password screen — Step 8 */
415
+ /* ui-sketches/02-change-password.md */
416
+ /* ────────────────────────────────────────────────────────────────────── */
417
+
418
+ .data-club-ai-hub__change-password-card__intro {
419
+ margin: 0 0 var(--dc-aih-space-lg) 0;
420
+ font-size: var(--dc-aih-font-size-sm);
421
+ color: var(--dc-aih-fg-muted);
422
+ text-align: center;
423
+ }
424
+
425
+ .data-club-ai-hub__change-password-card__field-error {
426
+ margin-top: var(--dc-aih-space-xs);
427
+ font-size: var(--dc-aih-font-size-sm);
428
+ color: var(--dc-aih-danger);
429
+ }
430
+
431
+ .data-club-ai-hub__change-password-card__cancel {
432
+ display: inline-flex;
433
+ align-items: center;
434
+ justify-content: center;
435
+ width: 100%;
436
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
437
+ font: inherit;
438
+ font-size: var(--dc-aih-font-size-md);
439
+ font-weight: 500;
440
+ color: var(--dc-aih-fg-muted);
441
+ background-color: transparent;
442
+ border: 1px solid var(--dc-aih-border-strong);
443
+ border-radius: var(--dc-aih-radius-md);
444
+ transition: color var(--dc-aih-transition),
445
+ border-color var(--dc-aih-transition);
446
+ }
447
+
448
+ .data-club-ai-hub__change-password-card__cancel:hover:not(:disabled) {
449
+ color: var(--dc-aih-fg);
450
+ border-color: var(--dc-aih-fg);
451
+ }
452
+
453
+ .data-club-ai-hub__change-password-card__cancel:focus-visible {
454
+ outline: none;
455
+ box-shadow: 0 0 0 3px var(--dc-aih-focus-ring);
456
+ }
457
+
458
+ .data-club-ai-hub__change-password-card__cancel:disabled {
459
+ opacity: 0.6;
460
+ cursor: not-allowed;
461
+ }
462
+
463
+ /* ────────────────────────────────────────────────────────────────────── */
464
+ /* Chat-placeholder (Step 8) — replaced by the real chat in Step 9 */
465
+ /* ────────────────────────────────────────────────────────────────────── */
466
+
467
+ .data-club-ai-hub__chat-placeholder {
468
+ display: flex;
469
+ align-items: center;
470
+ justify-content: center;
471
+ min-height: 50vh;
472
+ padding: var(--dc-aih-space-xl);
473
+ }
474
+
475
+ .data-club-ai-hub__chat-placeholder__body {
476
+ max-width: 480px;
477
+ padding: var(--dc-aih-space-xl);
478
+ font-size: var(--dc-aih-font-size-md);
479
+ color: var(--dc-aih-fg-muted);
480
+ text-align: center;
481
+ background-color: var(--dc-aih-bg-elevated);
482
+ border: 1px dashed var(--dc-aih-border-strong);
483
+ border-radius: var(--dc-aih-radius-md);
484
+ }
485
+
486
+ /* ────────────────────────────────────────────────────────────────────── */
487
+ /* Shell — Step 9 */
488
+ /* ui-sketches/00-shell.md */
489
+ /* ────────────────────────────────────────────────────────────────────── */
490
+
491
+ .data-club-ai-hub__shell {
492
+ display: flex;
493
+ flex-direction: column;
494
+ height: 100%;
495
+ /* Bound the shell to its host element so the messages_area becomes
496
+ the only scrollable region (the input area stays put at the bottom
497
+ of `main-column`). The host — the Web Component element, the dev
498
+ harness's `#root`, or a wrapper page's container div — supplies
499
+ the height; the shell honors it. Without this, `min-height: 100vh`
500
+ made the page itself scroll when the chat grew. */
501
+ overflow: hidden;
502
+ background-color: var(--dc-aih-bg);
503
+ color: var(--dc-aih-fg);
504
+ }
505
+
506
+ .data-club-ai-hub__shell-header {
507
+ display: flex;
508
+ align-items: center;
509
+ justify-content: space-between;
510
+ gap: var(--dc-aih-space-md);
511
+ padding: 0 var(--dc-aih-space-lg);
512
+ height: 56px;
513
+ background-color: var(--dc-aih-bg-overlay);
514
+ border-bottom: 1px solid var(--dc-aih-border);
515
+ backdrop-filter: blur(6px);
516
+ position: sticky;
517
+ top: 0;
518
+ z-index: 20;
519
+ }
520
+
521
+ .data-club-ai-hub__shell-header-left {
522
+ display: flex;
523
+ align-items: center;
524
+ gap: var(--dc-aih-space-md);
525
+ min-width: 0;
526
+ }
527
+
528
+ .data-club-ai-hub__shell-header-logo {
529
+ font-size: var(--dc-aih-font-size-lg);
530
+ font-weight: 700;
531
+ background: linear-gradient(
532
+ 90deg,
533
+ var(--dc-aih-accent) 0%,
534
+ var(--dc-aih-accent-hover) 100%
535
+ );
536
+ -webkit-background-clip: text;
537
+ background-clip: text;
538
+ color: transparent;
539
+ -webkit-text-fill-color: transparent;
540
+ }
541
+
542
+ .data-club-ai-hub__shell-header-right {
543
+ display: flex;
544
+ align-items: center;
545
+ gap: var(--dc-aih-space-sm);
546
+ }
547
+
548
+ .data-club-ai-hub__shell-main {
549
+ flex: 1;
550
+ display: flex;
551
+ min-height: 0;
552
+ }
553
+
554
+ .data-club-ai-hub__shell-footer {
555
+ padding: var(--dc-aih-space-md) var(--dc-aih-space-lg);
556
+ border-top: 1px solid var(--dc-aih-border);
557
+ background-color: var(--dc-aih-bg-elevated);
558
+ color: var(--dc-aih-fg-muted);
559
+ font-size: var(--dc-aih-font-size-sm);
560
+ }
561
+
562
+ /* ── User menu (right side of shell header) ─────────────────────────── */
563
+
564
+ .data-club-ai-hub__user-menu {
565
+ position: relative;
566
+ }
567
+
568
+ .data-club-ai-hub__user-menu__button {
569
+ display: inline-flex;
570
+ align-items: center;
571
+ gap: var(--dc-aih-space-sm);
572
+ padding: var(--dc-aih-space-xs) var(--dc-aih-space-sm);
573
+ font: inherit;
574
+ color: var(--dc-aih-fg);
575
+ background: transparent;
576
+ border: 1px solid transparent;
577
+ border-radius: var(--dc-aih-radius-md);
578
+ transition: background-color var(--dc-aih-transition),
579
+ border-color var(--dc-aih-transition);
580
+ }
581
+
582
+ .data-club-ai-hub__user-menu__button:hover {
583
+ background-color: color-mix(in srgb, var(--dc-aih-fg) 6%, transparent);
584
+ }
585
+
586
+ .data-club-ai-hub__user-menu__button:focus-visible {
587
+ outline: none;
588
+ border-color: var(--dc-aih-accent);
589
+ box-shadow: 0 0 0 3px var(--dc-aih-focus-ring);
590
+ }
591
+
592
+ .data-club-ai-hub__user-menu__avatar {
593
+ display: inline-flex;
594
+ align-items: center;
595
+ justify-content: center;
596
+ width: 28px;
597
+ height: 28px;
598
+ font-size: var(--dc-aih-font-size-sm);
599
+ font-weight: 600;
600
+ color: var(--dc-aih-accent-fg);
601
+ background-color: var(--dc-aih-accent);
602
+ border-radius: 50%;
603
+ }
604
+
605
+ .data-club-ai-hub__user-menu__username {
606
+ font-size: var(--dc-aih-font-size-sm);
607
+ }
608
+
609
+ @media (max-width: 480px) {
610
+ .data-club-ai-hub__user-menu__username {
611
+ display: none;
612
+ }
613
+ }
614
+
615
+ .data-club-ai-hub__user-menu__dropdown {
616
+ position: absolute;
617
+ right: 0;
618
+ top: calc(100% + var(--dc-aih-space-xs));
619
+ min-width: 220px;
620
+ padding: var(--dc-aih-space-sm) 0;
621
+ background-color: var(--dc-aih-bg-elevated);
622
+ border: 1px solid var(--dc-aih-border);
623
+ border-radius: var(--dc-aih-radius-md);
624
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
625
+ z-index: 30;
626
+ }
627
+
628
+ .data-club-ai-hub__user-menu__header {
629
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
630
+ border-bottom: 1px solid var(--dc-aih-border);
631
+ }
632
+
633
+ .data-club-ai-hub__user-menu__username-large {
634
+ font-weight: 600;
635
+ color: var(--dc-aih-fg);
636
+ }
637
+
638
+ .data-club-ai-hub__user-menu__role {
639
+ font-size: var(--dc-aih-font-size-sm);
640
+ color: var(--dc-aih-fg-muted);
641
+ }
642
+
643
+ .data-club-ai-hub__user-menu__item {
644
+ display: block;
645
+ width: 100%;
646
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
647
+ font: inherit;
648
+ text-align: left;
649
+ color: var(--dc-aih-fg);
650
+ background: transparent;
651
+ border: none;
652
+ }
653
+
654
+ .data-club-ai-hub__user-menu__item:hover {
655
+ background-color: color-mix(in srgb, var(--dc-aih-fg) 6%, transparent);
656
+ }
657
+
658
+ .data-club-ai-hub__user-menu__item:focus-visible {
659
+ outline: none;
660
+ background-color: color-mix(in srgb, var(--dc-aih-accent) 12%, transparent);
661
+ }
662
+
663
+ .data-club-ai-hub__user-menu__item--link {
664
+ text-decoration: none;
665
+ }
666
+
667
+ /* ────────────────────────────────────────────────────────────────────── */
668
+ /* Admin shell + Users sub-page — Step 11 */
669
+ /* ui-sketches/04-admin-overview.md, ui-sketches/05-admin-users.md */
670
+ /* ────────────────────────────────────────────────────────────────────── */
671
+
672
+ .data-club-ai-hub-admin {
673
+ display: flex;
674
+ flex: 1 1 auto;
675
+ flex-direction: column;
676
+ min-height: 0;
677
+ width: 100%;
678
+ height: 100%;
679
+ background-color: var(--dc-aih-bg);
680
+ color: var(--dc-aih-fg);
681
+ font-family: var(--dc-aih-font-sans);
682
+ }
683
+
684
+ .data-club-ai-hub-admin__body {
685
+ display: flex;
686
+ flex: 1 1 auto;
687
+ min-height: 0;
688
+ width: 100%;
689
+ }
690
+
691
+ .data-club-ai-hub-admin__nav {
692
+ flex: 0 0 220px;
693
+ display: flex;
694
+ flex-direction: column;
695
+ gap: var(--dc-aih-space-xs);
696
+ padding: var(--dc-aih-space-lg) var(--dc-aih-space-md);
697
+ border-right: 1px solid var(--dc-aih-border);
698
+ background-color: var(--dc-aih-bg-elevated);
699
+ }
700
+
701
+ .data-club-ai-hub-admin__nav-heading {
702
+ margin: 0 0 var(--dc-aih-space-sm) 0;
703
+ padding: 0 var(--dc-aih-space-sm);
704
+ font-size: var(--dc-aih-font-size-sm);
705
+ font-weight: 700;
706
+ letter-spacing: 0.06em;
707
+ text-transform: uppercase;
708
+ color: var(--dc-aih-fg-muted);
709
+ }
710
+
711
+ .data-club-ai-hub-admin__nav-list {
712
+ display: flex;
713
+ flex-direction: column;
714
+ gap: var(--dc-aih-space-xs);
715
+ }
716
+
717
+ .data-club-ai-hub-admin__nav-item {
718
+ appearance: none;
719
+ display: block;
720
+ width: 100%;
721
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
722
+ font: inherit;
723
+ text-align: left;
724
+ color: var(--dc-aih-fg);
725
+ background: transparent;
726
+ border: 1px solid transparent;
727
+ border-radius: var(--dc-aih-radius-sm);
728
+ cursor: pointer;
729
+ }
730
+
731
+ .data-club-ai-hub-admin__nav-item:hover {
732
+ background-color: color-mix(in srgb, var(--dc-aih-fg) 6%, transparent);
733
+ }
734
+
735
+ .data-club-ai-hub-admin__nav-item:focus-visible {
736
+ outline: none;
737
+ border-color: var(--dc-aih-accent);
738
+ }
739
+
740
+ .data-club-ai-hub-admin__nav-item--active {
741
+ background-color: color-mix(in srgb, var(--dc-aih-accent) 12%, transparent);
742
+ border-color: color-mix(in srgb, var(--dc-aih-accent) 35%, transparent);
743
+ font-weight: 600;
744
+ }
745
+
746
+ .data-club-ai-hub-admin__nav-exit {
747
+ margin-top: auto;
748
+ appearance: none;
749
+ display: block;
750
+ width: 100%;
751
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
752
+ font: inherit;
753
+ text-align: left;
754
+ color: var(--dc-aih-fg-muted);
755
+ background: transparent;
756
+ border: none;
757
+ border-radius: var(--dc-aih-radius-sm);
758
+ cursor: pointer;
759
+ }
760
+
761
+ .data-club-ai-hub-admin__nav-exit:hover {
762
+ background-color: color-mix(in srgb, var(--dc-aih-fg) 6%, transparent);
763
+ color: var(--dc-aih-fg);
764
+ }
765
+
766
+ .data-club-ai-hub-admin__content {
767
+ flex: 1 1 auto;
768
+ display: flex;
769
+ flex-direction: column;
770
+ min-height: 0;
771
+ min-width: 0;
772
+ overflow: auto;
773
+ padding: var(--dc-aih-space-xl);
774
+ gap: var(--dc-aih-space-lg);
775
+ }
776
+
777
+ .data-club-ai-hub-admin__placeholder {
778
+ padding: var(--dc-aih-space-xl);
779
+ border: 1px dashed var(--dc-aih-border-strong);
780
+ border-radius: var(--dc-aih-radius-md);
781
+ color: var(--dc-aih-fg-muted);
782
+ font-style: italic;
783
+ }
784
+
785
+ .data-club-ai-hub-admin__page-header {
786
+ display: flex;
787
+ align-items: center;
788
+ justify-content: space-between;
789
+ gap: var(--dc-aih-space-md);
790
+ }
791
+
792
+ .data-club-ai-hub-admin__page-heading {
793
+ margin: 0;
794
+ font-size: 1.5rem;
795
+ font-weight: 700;
796
+ background: linear-gradient(
797
+ 90deg,
798
+ var(--dc-aih-accent) 0%,
799
+ color-mix(in srgb, var(--dc-aih-accent) 65%, var(--dc-aih-fg)) 100%
800
+ );
801
+ -webkit-background-clip: text;
802
+ background-clip: text;
803
+ color: transparent;
804
+ }
805
+
806
+ .data-club-ai-hub-admin__button {
807
+ appearance: none;
808
+ display: inline-flex;
809
+ align-items: center;
810
+ gap: var(--dc-aih-space-xs);
811
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
812
+ font: inherit;
813
+ font-weight: 600;
814
+ color: var(--dc-aih-fg);
815
+ background-color: var(--dc-aih-bg-elevated);
816
+ border: 1px solid var(--dc-aih-border);
817
+ border-radius: var(--dc-aih-radius-sm);
818
+ cursor: pointer;
819
+ }
820
+
821
+ .data-club-ai-hub-admin__button:hover:not(:disabled) {
822
+ background-color: color-mix(in srgb, var(--dc-aih-fg) 6%, var(--dc-aih-bg-elevated));
823
+ }
824
+
825
+ .data-club-ai-hub-admin__button:focus-visible {
826
+ outline: none;
827
+ border-color: var(--dc-aih-accent);
828
+ }
829
+
830
+ .data-club-ai-hub-admin__button:disabled {
831
+ opacity: 0.5;
832
+ cursor: not-allowed;
833
+ }
834
+
835
+ .data-club-ai-hub-admin__button--primary {
836
+ color: var(--dc-aih-accent-fg);
837
+ background-color: var(--dc-aih-accent);
838
+ border-color: transparent;
839
+ }
840
+
841
+ .data-club-ai-hub-admin__button--primary:hover:not(:disabled) {
842
+ background-color: var(--dc-aih-accent-hover);
843
+ }
844
+
845
+ .data-club-ai-hub-admin__loading,
846
+ .data-club-ai-hub-admin__empty,
847
+ .data-club-ai-hub-admin__error {
848
+ padding: var(--dc-aih-space-lg);
849
+ border: 1px solid var(--dc-aih-border);
850
+ border-radius: var(--dc-aih-radius-md);
851
+ color: var(--dc-aih-fg-muted);
852
+ }
853
+
854
+ .data-club-ai-hub-admin__error {
855
+ border-color: var(--dc-aih-danger);
856
+ background-color: color-mix(in srgb, var(--dc-aih-danger) 8%, var(--dc-aih-bg-elevated));
857
+ color: var(--dc-aih-fg);
858
+ }
859
+
860
+ .data-club-ai-hub-admin__users-table {
861
+ width: 100%;
862
+ border-collapse: collapse;
863
+ background-color: var(--dc-aih-bg-elevated);
864
+ border: 1px solid var(--dc-aih-border);
865
+ border-radius: var(--dc-aih-radius-md);
866
+ overflow: hidden;
867
+ }
868
+
869
+ .data-club-ai-hub-admin__users-table thead {
870
+ background-color: color-mix(in srgb, var(--dc-aih-fg) 4%, var(--dc-aih-bg-elevated));
871
+ text-align: left;
872
+ }
873
+
874
+ .data-club-ai-hub-admin__users-table th,
875
+ .data-club-ai-hub-admin__users-table td {
876
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
877
+ border-bottom: 1px solid var(--dc-aih-border);
878
+ vertical-align: middle;
879
+ }
880
+
881
+ .data-club-ai-hub-admin__users-table tbody tr:last-child td {
882
+ border-bottom: none;
883
+ }
884
+
885
+ .data-club-ai-hub-admin__users-row--initial-password td {
886
+ background-color: color-mix(in srgb, var(--dc-aih-warning, #facc15) 6%, transparent);
887
+ }
888
+
889
+ .data-club-ai-hub-admin__initial-password-indicator {
890
+ color: var(--dc-aih-warning, #facc15);
891
+ margin-right: var(--dc-aih-space-xs);
892
+ }
893
+
894
+ .data-club-ai-hub-admin__role-select {
895
+ padding: var(--dc-aih-space-xs) var(--dc-aih-space-sm);
896
+ font: inherit;
897
+ color: var(--dc-aih-fg);
898
+ background-color: var(--dc-aih-bg);
899
+ border: 1px solid var(--dc-aih-border);
900
+ border-radius: var(--dc-aih-radius-sm);
901
+ }
902
+
903
+ .data-club-ai-hub-admin__role-static {
904
+ display: inline-block;
905
+ padding: var(--dc-aih-space-xs) var(--dc-aih-space-sm);
906
+ color: var(--dc-aih-fg-muted);
907
+ font-style: italic;
908
+ }
909
+
910
+ .data-club-ai-hub-admin__row-action {
911
+ appearance: none;
912
+ margin-right: var(--dc-aih-space-xs);
913
+ padding: var(--dc-aih-space-xs) var(--dc-aih-space-sm);
914
+ font: inherit;
915
+ color: var(--dc-aih-fg);
916
+ background-color: transparent;
917
+ border: 1px solid transparent;
918
+ border-radius: var(--dc-aih-radius-sm);
919
+ cursor: pointer;
920
+ }
921
+
922
+ .data-club-ai-hub-admin__row-action:hover:not(:disabled) {
923
+ border-color: var(--dc-aih-border);
924
+ background-color: var(--dc-aih-bg);
925
+ }
926
+
927
+ .data-club-ai-hub-admin__row-action:disabled {
928
+ opacity: 0.4;
929
+ cursor: not-allowed;
930
+ }
931
+
932
+ .data-club-ai-hub-admin__row-action--delete:hover:not(:disabled) {
933
+ border-color: var(--dc-aih-danger);
934
+ }
935
+
936
+ .data-club-ai-hub-admin__row-flash {
937
+ margin-left: var(--dc-aih-space-sm);
938
+ padding: var(--dc-aih-space-xs) var(--dc-aih-space-sm);
939
+ font-size: var(--dc-aih-font-size-sm);
940
+ border-radius: var(--dc-aih-radius-sm);
941
+ }
942
+
943
+ .data-club-ai-hub-admin__row-flash--success {
944
+ color: var(--dc-aih-fg);
945
+ background-color: color-mix(in srgb, var(--dc-aih-accent) 18%, transparent);
946
+ }
947
+
948
+ .data-club-ai-hub-admin__row-flash--error {
949
+ color: var(--dc-aih-fg);
950
+ background-color: color-mix(in srgb, var(--dc-aih-danger) 18%, transparent);
951
+ }
952
+
953
+ /* Modal scaffold reused for create-user / reset-confirm / password-reveal. */
954
+
955
+ .data-club-ai-hub-admin__modal-backdrop {
956
+ position: fixed;
957
+ inset: 0;
958
+ z-index: 50;
959
+ display: flex;
960
+ align-items: center;
961
+ justify-content: center;
962
+ background-color: color-mix(in srgb, #000000 50%, transparent);
963
+ }
964
+
965
+ .data-club-ai-hub-admin__modal {
966
+ width: min(420px, calc(100vw - 2 * var(--dc-aih-space-lg)));
967
+ max-height: calc(100vh - 2 * var(--dc-aih-space-lg));
968
+ overflow: auto;
969
+ padding: var(--dc-aih-space-lg);
970
+ display: flex;
971
+ flex-direction: column;
972
+ gap: var(--dc-aih-space-md);
973
+ background-color: var(--dc-aih-bg-elevated);
974
+ border: 1px solid var(--dc-aih-border);
975
+ border-radius: var(--dc-aih-radius-md);
976
+ box-shadow: 0 24px 48px rgba(0, 0, 0, 0.35);
977
+ }
978
+
979
+ .data-club-ai-hub-admin__modal-title {
980
+ margin: 0;
981
+ font-size: 1.125rem;
982
+ font-weight: 700;
983
+ }
984
+
985
+ .data-club-ai-hub-admin__modal-warning {
986
+ margin: 0;
987
+ padding: var(--dc-aih-space-sm);
988
+ background-color: color-mix(in srgb, var(--dc-aih-warning, #facc15) 12%, transparent);
989
+ border: 1px solid color-mix(in srgb, var(--dc-aih-warning, #facc15) 50%, transparent);
990
+ border-radius: var(--dc-aih-radius-sm);
991
+ font-size: var(--dc-aih-font-size-sm);
992
+ }
993
+
994
+ .data-club-ai-hub-admin__modal-body {
995
+ margin: 0;
996
+ color: var(--dc-aih-fg-muted);
997
+ font-size: var(--dc-aih-font-size-sm);
998
+ }
999
+
1000
+ .data-club-ai-hub-admin__modal-error {
1001
+ padding: var(--dc-aih-space-sm);
1002
+ color: var(--dc-aih-fg);
1003
+ background-color: color-mix(in srgb, var(--dc-aih-danger) 12%, transparent);
1004
+ border: 1px solid var(--dc-aih-danger);
1005
+ border-radius: var(--dc-aih-radius-sm);
1006
+ font-size: var(--dc-aih-font-size-sm);
1007
+ }
1008
+
1009
+ .data-club-ai-hub-admin__modal-field {
1010
+ display: flex;
1011
+ flex-direction: column;
1012
+ gap: var(--dc-aih-space-xs);
1013
+ font-size: var(--dc-aih-font-size-sm);
1014
+ }
1015
+
1016
+ .data-club-ai-hub-admin__modal-label {
1017
+ font-weight: 600;
1018
+ }
1019
+
1020
+ .data-club-ai-hub-admin__modal-input {
1021
+ padding: var(--dc-aih-space-sm);
1022
+ font: inherit;
1023
+ color: var(--dc-aih-fg);
1024
+ background-color: var(--dc-aih-bg);
1025
+ border: 1px solid var(--dc-aih-border);
1026
+ border-radius: var(--dc-aih-radius-sm);
1027
+ }
1028
+
1029
+ .data-club-ai-hub-admin__modal-input:focus {
1030
+ outline: none;
1031
+ border-color: var(--dc-aih-accent);
1032
+ }
1033
+
1034
+ .data-club-ai-hub-admin__modal-input--password {
1035
+ font-family: var(--dc-aih-font-mono);
1036
+ letter-spacing: 0.05em;
1037
+ }
1038
+
1039
+ .data-club-ai-hub-admin__modal-actions {
1040
+ display: flex;
1041
+ justify-content: flex-end;
1042
+ gap: var(--dc-aih-space-sm);
1043
+ margin-top: var(--dc-aih-space-sm);
1044
+ }
1045
+
1046
+ .data-club-ai-hub-admin__password-reveal-row {
1047
+ display: flex;
1048
+ align-items: center;
1049
+ gap: var(--dc-aih-space-xs);
1050
+ }
1051
+
1052
+ .data-club-ai-hub-admin__password-reveal-row .data-club-ai-hub-admin__modal-input {
1053
+ flex: 1 1 auto;
1054
+ }
1055
+
1056
+ .data-club-ai-hub-admin__copy-button {
1057
+ appearance: none;
1058
+ padding: var(--dc-aih-space-xs) var(--dc-aih-space-sm);
1059
+ font: inherit;
1060
+ background-color: var(--dc-aih-bg);
1061
+ border: 1px solid var(--dc-aih-border);
1062
+ border-radius: var(--dc-aih-radius-sm);
1063
+ cursor: pointer;
1064
+ }
1065
+
1066
+ .data-club-ai-hub-admin__copy-button:hover {
1067
+ background-color: color-mix(in srgb, var(--dc-aih-fg) 6%, var(--dc-aih-bg));
1068
+ }
1069
+
1070
+ .data-club-ai-hub-admin__copy-flash {
1071
+ font-size: var(--dc-aih-font-size-sm);
1072
+ color: var(--dc-aih-accent);
1073
+ font-weight: 600;
1074
+ }
1075
+
1076
+ /* ────────────────────────────────────────────────────────────────────── */
1077
+ /* Agents picker — Step 9 */
1078
+ /* ui-sketches/03-chat.md */
1079
+ /* ────────────────────────────────────────────────────────────────────── */
1080
+
1081
+ .data-club-ai-hub__agents-picker {
1082
+ width: 100%;
1083
+ padding: var(--dc-aih-space-xl);
1084
+ overflow-y: auto;
1085
+ }
1086
+
1087
+ .data-club-ai-hub__agents-picker__heading {
1088
+ margin: 0 0 var(--dc-aih-space-lg) 0;
1089
+ font-size: 1.75rem;
1090
+ font-weight: 700;
1091
+ background: linear-gradient(
1092
+ 90deg,
1093
+ var(--dc-aih-accent) 0%,
1094
+ var(--dc-aih-accent-hover) 100%
1095
+ );
1096
+ -webkit-background-clip: text;
1097
+ background-clip: text;
1098
+ color: transparent;
1099
+ -webkit-text-fill-color: transparent;
1100
+ }
1101
+
1102
+ .data-club-ai-hub__agents-picker__loading,
1103
+ .data-club-ai-hub__agents-picker__error {
1104
+ color: var(--dc-aih-fg-muted);
1105
+ font-size: var(--dc-aih-font-size-sm);
1106
+ }
1107
+
1108
+ .data-club-ai-hub__agents-picker__empty {
1109
+ max-width: 480px;
1110
+ padding: var(--dc-aih-space-xl);
1111
+ background-color: var(--dc-aih-bg-elevated);
1112
+ border: 1px dashed var(--dc-aih-border-strong);
1113
+ border-radius: var(--dc-aih-radius-md);
1114
+ color: var(--dc-aih-fg-muted);
1115
+ }
1116
+
1117
+ .data-club-ai-hub__agents-picker__empty-heading {
1118
+ margin: 0 0 var(--dc-aih-space-sm) 0;
1119
+ color: var(--dc-aih-fg);
1120
+ font-size: var(--dc-aih-font-size-lg);
1121
+ }
1122
+
1123
+ .data-club-ai-hub__agents-picker__empty-body {
1124
+ margin: 0;
1125
+ }
1126
+
1127
+ .data-club-ai-hub__agents-picker__grid {
1128
+ display: grid;
1129
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
1130
+ gap: var(--dc-aih-space-md);
1131
+ }
1132
+
1133
+ .data-club-ai-hub__agent-card {
1134
+ display: flex;
1135
+ flex-direction: column;
1136
+ align-items: flex-start;
1137
+ gap: var(--dc-aih-space-xs);
1138
+ padding: var(--dc-aih-space-lg);
1139
+ text-align: left;
1140
+ background-color: var(--dc-aih-bg-elevated);
1141
+ border: 1px solid var(--dc-aih-border);
1142
+ border-radius: var(--dc-aih-radius-md);
1143
+ cursor: pointer;
1144
+ transition: border-color var(--dc-aih-transition),
1145
+ background-color var(--dc-aih-transition),
1146
+ transform var(--dc-aih-transition);
1147
+ }
1148
+
1149
+ .data-club-ai-hub__agent-card:hover {
1150
+ border-color: var(--dc-aih-accent);
1151
+ transform: translateY(-2px);
1152
+ }
1153
+
1154
+ .data-club-ai-hub__agent-card:focus-visible {
1155
+ outline: none;
1156
+ box-shadow: 0 0 0 3px var(--dc-aih-focus-ring);
1157
+ }
1158
+
1159
+ .data-club-ai-hub__agent-card__name {
1160
+ font-size: var(--dc-aih-font-size-lg);
1161
+ font-weight: 600;
1162
+ color: var(--dc-aih-fg);
1163
+ }
1164
+
1165
+ .data-club-ai-hub__agent-card__subtitle {
1166
+ font-size: var(--dc-aih-font-size-sm);
1167
+ color: var(--dc-aih-fg-muted);
1168
+ }
1169
+
1170
+ /* ────────────────────────────────────────────────────────────────────── */
1171
+ /* Chat layout — Step 9 */
1172
+ /* ────────────────────────────────────────────────────────────────────── */
1173
+
1174
+ .data-club-ai-hub__layout {
1175
+ display: flex;
1176
+ flex: 1;
1177
+ min-height: 0;
1178
+ width: 100%;
1179
+ }
1180
+
1181
+ .data-club-ai-hub__layout--panel-right {
1182
+ flex-direction: row-reverse;
1183
+ }
1184
+
1185
+ /* ── Sessions panel ─────────────────────────────────────────────────── */
1186
+
1187
+ .data-club-ai-hub__sessions-panel {
1188
+ display: flex;
1189
+ flex-direction: column;
1190
+ width: var(--dc-aih-sessions-panel-width, 25%);
1191
+ min-width: 220px;
1192
+ max-width: 480px;
1193
+ border-right: 1px solid var(--dc-aih-border);
1194
+ background-color: var(--dc-aih-bg-elevated);
1195
+ overflow: hidden;
1196
+ }
1197
+
1198
+ .data-club-ai-hub__layout--panel-right .data-club-ai-hub__sessions-panel {
1199
+ border-right: none;
1200
+ border-left: 1px solid var(--dc-aih-border);
1201
+ }
1202
+
1203
+ .data-club-ai-hub__sessions-panel--collapsed {
1204
+ width: 40px;
1205
+ min-width: 40px;
1206
+ align-items: center;
1207
+ padding-top: var(--dc-aih-space-md);
1208
+ }
1209
+
1210
+ .data-club-ai-hub__sessions-panel__reveal {
1211
+ display: inline-flex;
1212
+ align-items: center;
1213
+ justify-content: center;
1214
+ width: 32px;
1215
+ height: 32px;
1216
+ padding: 0;
1217
+ font-size: var(--dc-aih-font-size-md);
1218
+ color: var(--dc-aih-fg-muted);
1219
+ background-color: var(--dc-aih-bg);
1220
+ border: 1px solid var(--dc-aih-border);
1221
+ border-radius: var(--dc-aih-radius-md);
1222
+ }
1223
+
1224
+ .data-club-ai-hub__sessions-panel__custom-header,
1225
+ .data-club-ai-hub__sessions-panel__custom-footer {
1226
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
1227
+ }
1228
+
1229
+ .data-club-ai-hub__sessions-panel__new-button {
1230
+ margin: var(--dc-aih-space-sm);
1231
+ padding: var(--dc-aih-space-sm);
1232
+ font: inherit;
1233
+ font-weight: 500;
1234
+ color: var(--dc-aih-accent);
1235
+ background-color: transparent;
1236
+ border: 1px dashed var(--dc-aih-accent);
1237
+ border-radius: var(--dc-aih-radius-md);
1238
+ transition: background-color var(--dc-aih-transition);
1239
+ }
1240
+
1241
+ .data-club-ai-hub__sessions-panel__new-button:hover {
1242
+ background-color: color-mix(in srgb, var(--dc-aih-accent) 8%, transparent);
1243
+ }
1244
+
1245
+ .data-club-ai-hub__sessions-panel__collapse-toggle {
1246
+ align-self: flex-end;
1247
+ margin: var(--dc-aih-space-xs) var(--dc-aih-space-sm) 0 0;
1248
+ padding: 0 var(--dc-aih-space-sm);
1249
+ font: inherit;
1250
+ color: var(--dc-aih-fg-muted);
1251
+ background: transparent;
1252
+ border: none;
1253
+ }
1254
+
1255
+ .data-club-ai-hub__sessions-panel__list {
1256
+ flex: 1;
1257
+ margin: 0;
1258
+ padding: var(--dc-aih-space-sm);
1259
+ list-style: none;
1260
+ overflow-y: auto;
1261
+ display: flex;
1262
+ flex-direction: column;
1263
+ gap: var(--dc-aih-space-xs);
1264
+ }
1265
+
1266
+ .data-club-ai-hub__sessions-panel__loading,
1267
+ .data-club-ai-hub__sessions-panel__empty {
1268
+ padding: var(--dc-aih-space-md);
1269
+ color: var(--dc-aih-fg-muted);
1270
+ font-size: var(--dc-aih-font-size-sm);
1271
+ }
1272
+
1273
+ .data-club-ai-hub__sessions-panel__item {
1274
+ display: flex;
1275
+ align-items: stretch;
1276
+ gap: var(--dc-aih-space-xs);
1277
+ padding: var(--dc-aih-space-xs) var(--dc-aih-space-sm);
1278
+ border-radius: var(--dc-aih-radius-md);
1279
+ transition: background-color var(--dc-aih-transition);
1280
+ }
1281
+
1282
+ .data-club-ai-hub__sessions-panel__item:hover {
1283
+ background-color: color-mix(in srgb, var(--dc-aih-fg) 4%, transparent);
1284
+ }
1285
+
1286
+ .data-club-ai-hub__sessions-panel__item--active {
1287
+ background-color: color-mix(in srgb, var(--dc-aih-accent) 14%, transparent);
1288
+ }
1289
+
1290
+ .data-club-ai-hub__sessions-panel__item--archived {
1291
+ opacity: 0.6;
1292
+ }
1293
+
1294
+ .data-club-ai-hub__sessions-panel__item-title {
1295
+ display: flex;
1296
+ flex-direction: column;
1297
+ align-items: flex-start;
1298
+ gap: 2px;
1299
+ flex: 1;
1300
+ min-width: 0;
1301
+ padding: var(--dc-aih-space-xs);
1302
+ font: inherit;
1303
+ text-align: left;
1304
+ color: var(--dc-aih-fg);
1305
+ background: transparent;
1306
+ border: none;
1307
+ }
1308
+
1309
+ .data-club-ai-hub__sessions-panel__item-title > span:first-child {
1310
+ width: 100%;
1311
+ overflow: hidden;
1312
+ text-overflow: ellipsis;
1313
+ white-space: nowrap;
1314
+ }
1315
+
1316
+ .data-club-ai-hub__sessions-panel__item-meta {
1317
+ font-size: var(--dc-aih-font-size-sm);
1318
+ color: var(--dc-aih-fg-muted);
1319
+ }
1320
+
1321
+ .data-club-ai-hub__sessions-panel__item-actions {
1322
+ display: flex;
1323
+ align-items: center;
1324
+ gap: 2px;
1325
+ opacity: 0;
1326
+ transition: opacity var(--dc-aih-transition);
1327
+ }
1328
+
1329
+ .data-club-ai-hub__sessions-panel__item:hover .data-club-ai-hub__sessions-panel__item-actions,
1330
+ .data-club-ai-hub__sessions-panel__item:focus-within .data-club-ai-hub__sessions-panel__item-actions {
1331
+ opacity: 1;
1332
+ }
1333
+
1334
+ .data-club-ai-hub__sessions-panel__action-button {
1335
+ display: inline-flex;
1336
+ align-items: center;
1337
+ justify-content: center;
1338
+ width: 26px;
1339
+ height: 26px;
1340
+ padding: 0;
1341
+ font-size: var(--dc-aih-font-size-sm);
1342
+ color: var(--dc-aih-fg-muted);
1343
+ background: transparent;
1344
+ border: none;
1345
+ border-radius: var(--dc-aih-radius-sm);
1346
+ }
1347
+
1348
+ .data-club-ai-hub__sessions-panel__action-button:hover {
1349
+ color: var(--dc-aih-fg);
1350
+ background-color: color-mix(in srgb, var(--dc-aih-fg) 8%, transparent);
1351
+ }
1352
+
1353
+ .data-club-ai-hub__sessions-panel__footer {
1354
+ padding: var(--dc-aih-space-sm);
1355
+ border-top: 1px solid var(--dc-aih-border);
1356
+ }
1357
+
1358
+ .data-club-ai-hub__sessions-panel__archived-toggle {
1359
+ width: 100%;
1360
+ padding: var(--dc-aih-space-xs);
1361
+ font: inherit;
1362
+ font-size: var(--dc-aih-font-size-sm);
1363
+ color: var(--dc-aih-fg-muted);
1364
+ background: transparent;
1365
+ border: 1px solid var(--dc-aih-border);
1366
+ border-radius: var(--dc-aih-radius-md);
1367
+ }
1368
+
1369
+ .data-club-ai-hub__sessions-panel__archived-toggle:hover {
1370
+ color: var(--dc-aih-fg);
1371
+ }
1372
+
1373
+ /* ── Main column ────────────────────────────────────────────────────── */
1374
+
1375
+ .data-club-ai-hub__main-column {
1376
+ flex: 1;
1377
+ display: flex;
1378
+ flex-direction: column;
1379
+ min-width: 0;
1380
+ min-height: 0;
1381
+ background-color: var(--dc-aih-bg);
1382
+ }
1383
+
1384
+ .data-club-ai-hub__chat-header {
1385
+ display: flex;
1386
+ align-items: center;
1387
+ gap: var(--dc-aih-space-md);
1388
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-lg);
1389
+ border-bottom: 1px solid var(--dc-aih-border);
1390
+ background-color: var(--dc-aih-bg-overlay);
1391
+ }
1392
+
1393
+ .data-club-ai-hub__chat-header__back {
1394
+ padding: var(--dc-aih-space-xs) var(--dc-aih-space-sm);
1395
+ font: inherit;
1396
+ font-size: var(--dc-aih-font-size-sm);
1397
+ color: var(--dc-aih-fg-muted);
1398
+ background: transparent;
1399
+ border: none;
1400
+ border-radius: var(--dc-aih-radius-sm);
1401
+ }
1402
+
1403
+ .data-club-ai-hub__chat-header__back:hover {
1404
+ color: var(--dc-aih-fg);
1405
+ background-color: color-mix(in srgb, var(--dc-aih-fg) 6%, transparent);
1406
+ }
1407
+
1408
+ .data-club-ai-hub__chat-header__title {
1409
+ margin: 0;
1410
+ font-size: var(--dc-aih-font-size-md);
1411
+ font-weight: 600;
1412
+ flex: 1;
1413
+ min-width: 0;
1414
+ overflow: hidden;
1415
+ text-overflow: ellipsis;
1416
+ white-space: nowrap;
1417
+ }
1418
+
1419
+ .data-club-ai-hub__chat-header__extras {
1420
+ display: flex;
1421
+ align-items: center;
1422
+ gap: var(--dc-aih-space-sm);
1423
+ }
1424
+
1425
+ .data-club-ai-hub__main-column__body {
1426
+ flex: 1;
1427
+ display: flex;
1428
+ flex-direction: column;
1429
+ min-height: 0;
1430
+ }
1431
+
1432
+ /* ── Message list ───────────────────────────────────────────────────── */
1433
+
1434
+ /* Wrapper around the scroll container. Exists so `<ScrollToPresentButton>`
1435
+ can be a sibling of the scrolling element instead of a child — children
1436
+ of a `overflow: scroll` element scroll with the content even when
1437
+ `position: absolute`-positioned, so the button would have slid off
1438
+ screen as the user scrolled. Anchoring it here keeps it fixed to the
1439
+ visible chat area. */
1440
+ .data-club-ai-hub__messages-wrapper {
1441
+ position: relative;
1442
+ flex: 1;
1443
+ display: flex;
1444
+ flex-direction: column;
1445
+ min-height: 0;
1446
+ }
1447
+
1448
+ .data-club-ai-hub__messages {
1449
+ flex: 1;
1450
+ overflow-y: auto;
1451
+ padding: var(--dc-aih-space-lg);
1452
+ }
1453
+
1454
+ .data-club-ai-hub__messages__inner {
1455
+ display: flex;
1456
+ flex-direction: column;
1457
+ gap: var(--dc-aih-space-md);
1458
+ max-width: 760px;
1459
+ margin: 0 auto;
1460
+ }
1461
+
1462
+ .data-club-ai-hub__messages__empty,
1463
+ .data-club-ai-hub__messages__no-session,
1464
+ .data-club-ai-hub__messages__loading {
1465
+ margin: 0;
1466
+ padding: var(--dc-aih-space-xl);
1467
+ color: var(--dc-aih-fg-muted);
1468
+ text-align: center;
1469
+ font-size: var(--dc-aih-font-size-sm);
1470
+ }
1471
+
1472
+ /* Turn-failure banner — surfaced when sendMessage's loop ended with an
1473
+ error OR with no assistant output. Step 10 will add a Retry button +
1474
+ the `--failed` bubble modifier. */
1475
+ .data-club-ai-hub__messages__error {
1476
+ align-self: flex-start;
1477
+ max-width: 80%;
1478
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
1479
+ font-size: var(--dc-aih-font-size-sm);
1480
+ color: var(--dc-aih-danger);
1481
+ background-color: color-mix(in srgb, var(--dc-aih-danger) 10%, transparent);
1482
+ border: 1px solid color-mix(in srgb, var(--dc-aih-danger) 40%, transparent);
1483
+ border-radius: var(--dc-aih-radius-md);
1484
+ }
1485
+
1486
+ .data-club-ai-hub__message-bubble {
1487
+ display: flex;
1488
+ flex-direction: column;
1489
+ gap: var(--dc-aih-space-xs);
1490
+ max-width: 80%;
1491
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
1492
+ border-radius: var(--dc-aih-radius-md);
1493
+ white-space: pre-wrap;
1494
+ word-wrap: break-word;
1495
+ }
1496
+
1497
+ .data-club-ai-hub__message-bubble--user {
1498
+ align-self: flex-end;
1499
+ background-color: var(--dc-aih-accent);
1500
+ color: var(--dc-aih-accent-fg);
1501
+ }
1502
+
1503
+ .data-club-ai-hub__message-bubble--assistant {
1504
+ align-self: flex-start;
1505
+ background-color: var(--dc-aih-bg-elevated);
1506
+ border: 1px solid var(--dc-aih-border);
1507
+ color: var(--dc-aih-fg);
1508
+ }
1509
+
1510
+ .data-club-ai-hub__message-bubble__role {
1511
+ font-size: 0.7rem;
1512
+ font-weight: 600;
1513
+ letter-spacing: 0.04em;
1514
+ text-transform: uppercase;
1515
+ color: color-mix(in srgb, currentColor 65%, transparent);
1516
+ }
1517
+
1518
+ .data-club-ai-hub__message-bubble__body {
1519
+ font-size: var(--dc-aih-font-size-md);
1520
+ line-height: 1.5;
1521
+ }
1522
+
1523
+ /* Streaming caret — a thin blinking bar at the end of the in-progress
1524
+ assistant bubble's text. Replaced in Step 10 by the proper §10.4
1525
+ streaming-dots affordance; until then this is the user-visible signal
1526
+ that the agent is still typing. The width / color / animation are
1527
+ themable (and the @media reduced-motion rule already in this stylesheet
1528
+ suppresses the animation when the user has asked for it). */
1529
+ .data-club-ai-hub__message-bubble__caret {
1530
+ display: inline-block;
1531
+ width: 2px;
1532
+ height: 1em;
1533
+ margin-left: 2px;
1534
+ vertical-align: text-bottom;
1535
+ background-color: currentColor;
1536
+ animation: data-club-ai-hub-blink 1s steps(2, start) infinite;
1537
+ }
1538
+
1539
+ @keyframes data-club-ai-hub-blink {
1540
+ to {
1541
+ visibility: hidden;
1542
+ }
1543
+ }
1544
+
1545
+ /* ── Input area ─────────────────────────────────────────────────────── */
1546
+
1547
+ .data-club-ai-hub__input-area {
1548
+ padding: var(--dc-aih-space-md) var(--dc-aih-space-lg);
1549
+ border-top: 1px solid var(--dc-aih-border);
1550
+ background-color: var(--dc-aih-bg-overlay);
1551
+ }
1552
+
1553
+ .data-club-ai-hub__input-area__form {
1554
+ display: flex;
1555
+ flex-direction: column;
1556
+ gap: var(--dc-aih-space-sm);
1557
+ max-width: 760px;
1558
+ margin: 0 auto;
1559
+ }
1560
+
1561
+ .data-club-ai-hub__input-area__row {
1562
+ display: flex;
1563
+ align-items: flex-end;
1564
+ gap: var(--dc-aih-space-sm);
1565
+ }
1566
+
1567
+ .data-club-ai-hub__input-area__textarea {
1568
+ flex: 1;
1569
+ min-height: 44px;
1570
+ max-height: 240px;
1571
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
1572
+ font: inherit;
1573
+ font-size: var(--dc-aih-font-size-md);
1574
+ color: var(--dc-aih-fg);
1575
+ background-color: var(--dc-aih-bg);
1576
+ border: 1px solid var(--dc-aih-border-strong);
1577
+ border-radius: var(--dc-aih-radius-md);
1578
+ resize: none;
1579
+ transition: border-color var(--dc-aih-transition),
1580
+ box-shadow var(--dc-aih-transition);
1581
+ }
1582
+
1583
+ .data-club-ai-hub__input-area__textarea:focus-visible {
1584
+ outline: none;
1585
+ border-color: var(--dc-aih-accent);
1586
+ box-shadow: 0 0 0 3px var(--dc-aih-focus-ring);
1587
+ }
1588
+
1589
+ .data-club-ai-hub__input-area__textarea:disabled {
1590
+ background-color: var(--dc-aih-bg-elevated);
1591
+ color: var(--dc-aih-fg-muted);
1592
+ cursor: not-allowed;
1593
+ }
1594
+
1595
+ .data-club-ai-hub__input-area__send,
1596
+ .data-club-ai-hub__input-area__stop {
1597
+ /* Match the textarea's resting min-height so the button doesn't look
1598
+ squashed next to it. `flex-end` alignment on the row keeps the
1599
+ button anchored to the bottom when the textarea grows, so the
1600
+ visual relationship stays right for multi-line inputs too. */
1601
+ min-height: 44px;
1602
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-lg);
1603
+ font: inherit;
1604
+ font-weight: 600;
1605
+ color: var(--dc-aih-accent-fg);
1606
+ background-color: var(--dc-aih-accent);
1607
+ border: none;
1608
+ border-radius: var(--dc-aih-radius-md);
1609
+ transition: background-color var(--dc-aih-transition);
1610
+ }
1611
+
1612
+ .data-club-ai-hub__input-area__stop {
1613
+ background-color: var(--dc-aih-danger);
1614
+ }
1615
+
1616
+ /* "Stopping…" state — visible from the moment the user clicks Stop
1617
+ until the server's terminal event lands (typically ~300ms while the
1618
+ Letta-side cancel propagates). Locked-out so the cancel POST can't
1619
+ double-fire; the muted opacity is the visual cue. */
1620
+ .data-club-ai-hub__input-area__stop[data-stopping="true"] {
1621
+ opacity: 0.7;
1622
+ cursor: progress;
1623
+ }
1624
+
1625
+ .data-club-ai-hub__input-area__send:hover:not(:disabled),
1626
+ .data-club-ai-hub__input-area__stop:hover {
1627
+ background-color: var(--dc-aih-accent-hover);
1628
+ }
1629
+
1630
+ .data-club-ai-hub__input-area__send:focus-visible,
1631
+ .data-club-ai-hub__input-area__stop:focus-visible {
1632
+ outline: none;
1633
+ box-shadow: 0 0 0 3px var(--dc-aih-focus-ring);
1634
+ }
1635
+
1636
+ .data-club-ai-hub__input-area__send:disabled {
1637
+ opacity: 0.5;
1638
+ cursor: not-allowed;
1639
+ }
1640
+
1641
+ .data-club-ai-hub__input-area__toolbar {
1642
+ display: flex;
1643
+ align-items: center;
1644
+ gap: var(--dc-aih-space-sm);
1645
+ }
1646
+
1647
+ /* ────────────────────────────────────────────────────────────────────── */
1648
+ /* Generic modal (used by SessionTitleModal — Step 9; reused by Step */
1649
+ /* 11/12 admin modals) */
1650
+ /* ────────────────────────────────────────────────────────────────────── */
1651
+
1652
+ .data-club-ai-hub__modal-overlay {
1653
+ position: fixed;
1654
+ inset: 0;
1655
+ display: flex;
1656
+ align-items: center;
1657
+ justify-content: center;
1658
+ padding: var(--dc-aih-space-lg);
1659
+ background-color: rgba(0, 0, 0, 0.5);
1660
+ z-index: 40;
1661
+ }
1662
+
1663
+ .data-club-ai-hub__modal {
1664
+ width: 100%;
1665
+ max-width: 440px;
1666
+ padding: var(--dc-aih-space-xl);
1667
+ background-color: var(--dc-aih-bg-elevated);
1668
+ border: 1px solid var(--dc-aih-border);
1669
+ border-radius: var(--dc-aih-radius-lg);
1670
+ box-shadow: 0 16px 64px rgba(0, 0, 0, 0.3);
1671
+ }
1672
+
1673
+ .data-club-ai-hub__modal__title {
1674
+ margin: 0 0 var(--dc-aih-space-lg) 0;
1675
+ font-size: var(--dc-aih-font-size-lg);
1676
+ font-weight: 700;
1677
+ color: var(--dc-aih-fg);
1678
+ }
1679
+
1680
+ .data-club-ai-hub__modal__form {
1681
+ display: flex;
1682
+ flex-direction: column;
1683
+ gap: var(--dc-aih-space-md);
1684
+ }
1685
+
1686
+ .data-club-ai-hub__modal__field {
1687
+ display: flex;
1688
+ flex-direction: column;
1689
+ gap: var(--dc-aih-space-xs);
1690
+ }
1691
+
1692
+ .data-club-ai-hub__modal__label {
1693
+ font-size: var(--dc-aih-font-size-sm);
1694
+ font-weight: 500;
1695
+ color: var(--dc-aih-fg-muted);
1696
+ }
1697
+
1698
+ .data-club-ai-hub__modal__input {
1699
+ width: 100%;
1700
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
1701
+ font: inherit;
1702
+ font-size: var(--dc-aih-font-size-md);
1703
+ color: var(--dc-aih-fg);
1704
+ background-color: var(--dc-aih-bg);
1705
+ border: 1px solid var(--dc-aih-border-strong);
1706
+ border-radius: var(--dc-aih-radius-md);
1707
+ }
1708
+
1709
+ .data-club-ai-hub__modal__input:focus-visible {
1710
+ outline: none;
1711
+ border-color: var(--dc-aih-accent);
1712
+ box-shadow: 0 0 0 3px var(--dc-aih-focus-ring);
1713
+ }
1714
+
1715
+ .data-club-ai-hub__modal__field-error {
1716
+ margin: 0;
1717
+ font-size: var(--dc-aih-font-size-sm);
1718
+ color: var(--dc-aih-danger);
1719
+ }
1720
+
1721
+ .data-club-ai-hub__modal__actions {
1722
+ display: flex;
1723
+ gap: var(--dc-aih-space-sm);
1724
+ justify-content: flex-end;
1725
+ }
1726
+
1727
+ .data-club-ai-hub__modal__cancel,
1728
+ .data-club-ai-hub__modal__confirm {
1729
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-lg);
1730
+ font: inherit;
1731
+ font-weight: 500;
1732
+ border-radius: var(--dc-aih-radius-md);
1733
+ }
1734
+
1735
+ .data-club-ai-hub__modal__cancel {
1736
+ color: var(--dc-aih-fg-muted);
1737
+ background-color: transparent;
1738
+ border: 1px solid var(--dc-aih-border-strong);
1739
+ }
1740
+
1741
+ .data-club-ai-hub__modal__cancel:hover:not(:disabled) {
1742
+ color: var(--dc-aih-fg);
1743
+ border-color: var(--dc-aih-fg);
1744
+ }
1745
+
1746
+ .data-club-ai-hub__modal__confirm {
1747
+ color: var(--dc-aih-accent-fg);
1748
+ background-color: var(--dc-aih-accent);
1749
+ border: none;
1750
+ }
1751
+
1752
+ .data-club-ai-hub__modal__confirm:hover:not(:disabled) {
1753
+ background-color: var(--dc-aih-accent-hover);
1754
+ }
1755
+
1756
+ .data-club-ai-hub__modal__confirm:disabled,
1757
+ .data-club-ai-hub__modal__cancel:disabled {
1758
+ opacity: 0.55;
1759
+ cursor: not-allowed;
1760
+ }
1761
+
1762
+ /* ────────────────────────────────────────────────────────────────────── */
1763
+ /* Turn-status indicator (Step 10) */
1764
+ /* ────────────────────────────────────────────────────────────────────── */
1765
+
1766
+ .data-club-ai-hub__turn-status {
1767
+ display: inline-flex;
1768
+ align-items: center;
1769
+ gap: var(--dc-aih-space-xs);
1770
+ margin-left: auto;
1771
+ font-size: var(--dc-aih-font-size-sm);
1772
+ color: var(--dc-aih-fg-muted);
1773
+ }
1774
+
1775
+ .data-club-ai-hub__turn-status__dot {
1776
+ width: 8px;
1777
+ height: 8px;
1778
+ border-radius: 50%;
1779
+ background-color: var(--dc-aih-fg-subtle);
1780
+ }
1781
+
1782
+ .data-club-ai-hub__turn-status__dot--idle {
1783
+ background-color: var(--dc-aih-fg-subtle);
1784
+ }
1785
+
1786
+ .data-club-ai-hub__turn-status__dot--running {
1787
+ background-color: var(--dc-aih-accent);
1788
+ }
1789
+
1790
+ .data-club-ai-hub__turn-status__dot--warning {
1791
+ background-color: var(--dc-aih-warning);
1792
+ }
1793
+
1794
+ .data-club-ai-hub__turn-status__dot--error {
1795
+ background-color: var(--dc-aih-danger);
1796
+ }
1797
+
1798
+ .data-club-ai-hub__turn-status__dot--pulse {
1799
+ animation: data-club-ai-hub-pulse 1.4s ease-in-out infinite;
1800
+ }
1801
+
1802
+ @keyframes data-club-ai-hub-pulse {
1803
+ 0%,
1804
+ 100% {
1805
+ opacity: 1;
1806
+ transform: scale(1);
1807
+ }
1808
+ 50% {
1809
+ opacity: 0.5;
1810
+ transform: scale(1.25);
1811
+ }
1812
+ }
1813
+
1814
+ /* ────────────────────────────────────────────────────────────────────── */
1815
+ /* Theme switcher (Step 10) */
1816
+ /* ────────────────────────────────────────────────────────────────────── */
1817
+
1818
+ .data-club-ai-hub__theme-switcher {
1819
+ display: inline-flex;
1820
+ align-items: center;
1821
+ gap: var(--dc-aih-space-sm);
1822
+ padding: var(--dc-aih-space-xs) var(--dc-aih-space-sm);
1823
+ font: inherit;
1824
+ color: var(--dc-aih-fg);
1825
+ background-color: transparent;
1826
+ border: 1px solid transparent;
1827
+ border-radius: var(--dc-aih-radius-md);
1828
+ }
1829
+
1830
+ .data-club-ai-hub__theme-switcher:hover {
1831
+ background-color: var(--dc-aih-bg);
1832
+ border-color: var(--dc-aih-border);
1833
+ }
1834
+
1835
+ .data-club-ai-hub__theme-switcher:focus-visible {
1836
+ outline: none;
1837
+ box-shadow: 0 0 0 3px var(--dc-aih-focus-ring);
1838
+ }
1839
+
1840
+ .data-club-ai-hub__theme-switcher__icon {
1841
+ font-size: var(--dc-aih-font-size-lg);
1842
+ }
1843
+
1844
+ /* ────────────────────────────────────────────────────────────────────── */
1845
+ /* System notice / TPM banner (Step 10) */
1846
+ /* ────────────────────────────────────────────────────────────────────── */
1847
+
1848
+ .data-club-ai-hub__system-notice {
1849
+ display: flex;
1850
+ align-items: center;
1851
+ gap: var(--dc-aih-space-sm);
1852
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
1853
+ font-size: var(--dc-aih-font-size-sm);
1854
+ color: var(--dc-aih-fg);
1855
+ background-color: var(--dc-aih-bg-elevated);
1856
+ border: 1px solid var(--dc-aih-border);
1857
+ border-radius: var(--dc-aih-radius-md);
1858
+ }
1859
+
1860
+ .data-club-ai-hub__system-notice--tpm-wait {
1861
+ color: color-mix(in srgb, var(--dc-aih-warning) 70%, var(--dc-aih-fg));
1862
+ border-color: var(--dc-aih-warning);
1863
+ background-color: color-mix(
1864
+ in srgb,
1865
+ var(--dc-aih-warning) 12%,
1866
+ var(--dc-aih-bg)
1867
+ );
1868
+ }
1869
+
1870
+ .data-club-ai-hub__system-notice--resumed {
1871
+ color: color-mix(in srgb, var(--dc-aih-success) 70%, var(--dc-aih-fg));
1872
+ border-color: var(--dc-aih-success);
1873
+ background-color: color-mix(
1874
+ in srgb,
1875
+ var(--dc-aih-success) 12%,
1876
+ var(--dc-aih-bg)
1877
+ );
1878
+ }
1879
+
1880
+ .data-club-ai-hub__system-notice--error {
1881
+ color: color-mix(in srgb, var(--dc-aih-danger) 70%, var(--dc-aih-fg));
1882
+ border-color: var(--dc-aih-danger);
1883
+ background-color: color-mix(
1884
+ in srgb,
1885
+ var(--dc-aih-danger) 12%,
1886
+ var(--dc-aih-bg)
1887
+ );
1888
+ }
1889
+
1890
+ .data-club-ai-hub__system-notice__icon {
1891
+ font-size: var(--dc-aih-font-size-lg);
1892
+ }
1893
+
1894
+ .data-club-ai-hub__system-notice__body {
1895
+ flex: 1;
1896
+ }
1897
+
1898
+ .data-club-ai-hub__system-notice__action {
1899
+ padding: var(--dc-aih-space-xs) var(--dc-aih-space-sm);
1900
+ font: inherit;
1901
+ font-weight: 600;
1902
+ color: var(--dc-aih-accent-fg);
1903
+ background-color: var(--dc-aih-accent);
1904
+ border: none;
1905
+ border-radius: var(--dc-aih-radius-sm);
1906
+ }
1907
+
1908
+ .data-club-ai-hub__system-notice__action:hover {
1909
+ background-color: var(--dc-aih-accent-hover);
1910
+ }
1911
+
1912
+ /* ────────────────────────────────────────────────────────────────────── */
1913
+ /* Reasoning block (Step 10) */
1914
+ /* ────────────────────────────────────────────────────────────────────── */
1915
+
1916
+ .data-club-ai-hub__reasoning-block {
1917
+ margin-top: var(--dc-aih-space-sm);
1918
+ padding: var(--dc-aih-space-sm);
1919
+ background-color: var(--dc-aih-bg);
1920
+ border: 1px dashed var(--dc-aih-border-strong);
1921
+ border-radius: var(--dc-aih-radius-md);
1922
+ font-size: var(--dc-aih-font-size-sm);
1923
+ }
1924
+
1925
+ .data-club-ai-hub__reasoning-block__header {
1926
+ display: flex;
1927
+ align-items: center;
1928
+ justify-content: space-between;
1929
+ gap: var(--dc-aih-space-sm);
1930
+ }
1931
+
1932
+ .data-club-ai-hub__reasoning-block__title {
1933
+ color: var(--dc-aih-fg-muted);
1934
+ }
1935
+
1936
+ .data-club-ai-hub__reasoning-block__toggle {
1937
+ font: inherit;
1938
+ color: var(--dc-aih-fg-muted);
1939
+ background-color: transparent;
1940
+ border: none;
1941
+ }
1942
+
1943
+ .data-club-ai-hub__reasoning-block__body {
1944
+ margin-top: var(--dc-aih-space-sm);
1945
+ padding: var(--dc-aih-space-sm);
1946
+ font-family: var(--dc-aih-font-mono);
1947
+ white-space: pre-wrap;
1948
+ color: var(--dc-aih-fg);
1949
+ background-color: var(--dc-aih-bg-elevated);
1950
+ border-radius: var(--dc-aih-radius-sm);
1951
+ max-height: 320px;
1952
+ overflow-y: auto;
1953
+ }
1954
+
1955
+ /* ────────────────────────────────────────────────────────────────────── */
1956
+ /* Tool-call card (Step 10) */
1957
+ /* ────────────────────────────────────────────────────────────────────── */
1958
+
1959
+ .data-club-ai-hub__tool-call-card {
1960
+ margin-top: var(--dc-aih-space-sm);
1961
+ padding: var(--dc-aih-space-sm);
1962
+ background-color: var(--dc-aih-bg);
1963
+ border: 1px solid var(--dc-aih-border);
1964
+ border-radius: var(--dc-aih-radius-md);
1965
+ font-size: var(--dc-aih-font-size-sm);
1966
+ }
1967
+
1968
+ .data-club-ai-hub__tool-call-card--error {
1969
+ border-color: var(--dc-aih-danger);
1970
+ }
1971
+
1972
+ .data-club-ai-hub__tool-call-card__header {
1973
+ display: flex;
1974
+ align-items: center;
1975
+ gap: var(--dc-aih-space-sm);
1976
+ }
1977
+
1978
+ .data-club-ai-hub__tool-call-card__tool-name {
1979
+ font-weight: 600;
1980
+ }
1981
+
1982
+ .data-club-ai-hub__tool-call-card__status {
1983
+ color: var(--dc-aih-fg-muted);
1984
+ }
1985
+
1986
+ .data-club-ai-hub__tool-call-card--error .data-club-ai-hub__tool-call-card__status {
1987
+ color: var(--dc-aih-danger);
1988
+ }
1989
+
1990
+ .data-club-ai-hub__tool-call-card--done .data-club-ai-hub__tool-call-card__status {
1991
+ color: var(--dc-aih-success);
1992
+ }
1993
+
1994
+ .data-club-ai-hub__tool-call-card__duration {
1995
+ color: var(--dc-aih-fg-subtle);
1996
+ font-family: var(--dc-aih-font-mono);
1997
+ }
1998
+
1999
+ .data-club-ai-hub__tool-call-card__toggle {
2000
+ margin-left: auto;
2001
+ font: inherit;
2002
+ color: var(--dc-aih-fg-muted);
2003
+ background-color: transparent;
2004
+ border: none;
2005
+ }
2006
+
2007
+ .data-club-ai-hub__tool-call-card__body {
2008
+ margin-top: var(--dc-aih-space-sm);
2009
+ display: flex;
2010
+ flex-direction: column;
2011
+ gap: var(--dc-aih-space-sm);
2012
+ }
2013
+
2014
+ .data-club-ai-hub__tool-call-card__section-label {
2015
+ font-weight: 600;
2016
+ color: var(--dc-aih-fg-muted);
2017
+ }
2018
+
2019
+ .data-club-ai-hub__tool-call-card__section-content {
2020
+ margin: 0;
2021
+ padding: var(--dc-aih-space-sm);
2022
+ font-family: var(--dc-aih-font-mono);
2023
+ white-space: pre-wrap;
2024
+ color: var(--dc-aih-fg);
2025
+ background-color: var(--dc-aih-bg-elevated);
2026
+ border-radius: var(--dc-aih-radius-sm);
2027
+ overflow-x: auto;
2028
+ }
2029
+
2030
+ /* ────────────────────────────────────────────────────────────────────── */
2031
+ /* Scroll-to-present button (Step 10) */
2032
+ /* ────────────────────────────────────────────────────────────────────── */
2033
+
2034
+ .data-club-ai-hub__scroll-to-present-button {
2035
+ /* Anchored to the bottom-center of the message-list wrapper (which is
2036
+ a non-scrolling parent of the scroll container — see the wrapper
2037
+ class above). `absolute` positioning here is fixed against the
2038
+ wrapper, so the button stays put as the user scrolls through the
2039
+ chat. Horizontal-centered via the `left: 50%; translateX(-50%)`
2040
+ pattern; vertical offset gives a comfortable gap above the input
2041
+ area. */
2042
+ position: absolute;
2043
+ bottom: var(--dc-aih-space-lg);
2044
+ left: 50%;
2045
+ transform: translateX(-50%);
2046
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
2047
+ font: inherit;
2048
+ font-weight: 600;
2049
+ color: var(--dc-aih-accent-fg);
2050
+ background-color: var(--dc-aih-accent);
2051
+ border: none;
2052
+ border-radius: 999px;
2053
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.25);
2054
+ z-index: 5;
2055
+ }
2056
+
2057
+ /* ────────────────────────────────────────────────────────────────────── */
2058
+ /* Effort dropdown (Step 10) */
2059
+ /* ────────────────────────────────────────────────────────────────────── */
2060
+
2061
+ .data-club-ai-hub__effort-control {
2062
+ display: inline-flex;
2063
+ align-items: center;
2064
+ gap: var(--dc-aih-space-xs);
2065
+ font-size: var(--dc-aih-font-size-sm);
2066
+ }
2067
+
2068
+ .data-club-ai-hub__effort-control__label {
2069
+ color: var(--dc-aih-fg-muted);
2070
+ }
2071
+
2072
+ .data-club-ai-hub__effort-control__select {
2073
+ padding: var(--dc-aih-space-xs) var(--dc-aih-space-sm);
2074
+ font: inherit;
2075
+ color: var(--dc-aih-fg);
2076
+ background-color: var(--dc-aih-bg);
2077
+ border: 1px solid var(--dc-aih-border-strong);
2078
+ border-radius: var(--dc-aih-radius-sm);
2079
+ }
2080
+
2081
+ .data-club-ai-hub__effort-control__select:focus-visible {
2082
+ outline: none;
2083
+ border-color: var(--dc-aih-accent);
2084
+ box-shadow: 0 0 0 3px var(--dc-aih-focus-ring);
2085
+ }
2086
+
2087
+ /* ────────────────────────────────────────────────────────────────────── */
2088
+ /* ReasoningSelector — capability-driven per-session dropdowns */
2089
+ /* ────────────────────────────────────────────────────────────────────── */
2090
+
2091
+ .data-club-ai-hub__reasoning-selector {
2092
+ display: inline-flex;
2093
+ align-items: center;
2094
+ gap: var(--dc-aih-space-sm);
2095
+ flex-wrap: wrap;
2096
+ }
2097
+
2098
+ .data-club-ai-hub__reasoning-selector__field {
2099
+ display: inline-flex;
2100
+ align-items: center;
2101
+ gap: var(--dc-aih-space-xs);
2102
+ font-size: var(--dc-aih-font-size-sm);
2103
+ }
2104
+
2105
+ .data-club-ai-hub__reasoning-selector__label {
2106
+ color: var(--dc-aih-fg-muted);
2107
+ }
2108
+
2109
+ .data-club-ai-hub__reasoning-selector__select,
2110
+ .data-club-ai-hub__reasoning-selector__input {
2111
+ padding: var(--dc-aih-space-xs) var(--dc-aih-space-sm);
2112
+ font: inherit;
2113
+ color: var(--dc-aih-fg);
2114
+ background-color: var(--dc-aih-bg);
2115
+ border: 1px solid var(--dc-aih-border-strong);
2116
+ border-radius: var(--dc-aih-radius-sm);
2117
+ }
2118
+
2119
+ .data-club-ai-hub__reasoning-selector__input {
2120
+ width: 6rem;
2121
+ }
2122
+
2123
+ .data-club-ai-hub__reasoning-selector__select:focus-visible,
2124
+ .data-club-ai-hub__reasoning-selector__input:focus-visible {
2125
+ outline: none;
2126
+ border-color: var(--dc-aih-accent);
2127
+ box-shadow: 0 0 0 3px var(--dc-aih-focus-ring);
2128
+ }
2129
+
2130
+ /* ────────────────────────────────────────────────────────────────────── */
2131
+ /* Step-10 message-bubble extensions */
2132
+ /* ────────────────────────────────────────────────────────────────────── */
2133
+
2134
+ .data-club-ai-hub__message-bubble--system {
2135
+ align-self: center;
2136
+ font-style: italic;
2137
+ color: var(--dc-aih-fg-muted);
2138
+ background-color: transparent;
2139
+ border: 1px dashed var(--dc-aih-border-strong);
2140
+ }
2141
+
2142
+ .data-club-ai-hub__message-bubble--tool {
2143
+ align-self: flex-start;
2144
+ background-color: var(--dc-aih-bg);
2145
+ border: 1px dashed var(--dc-aih-border-strong);
2146
+ font-family: var(--dc-aih-font-mono);
2147
+ font-size: var(--dc-aih-font-size-sm);
2148
+ }
2149
+
2150
+ .data-club-ai-hub__message-bubble--failed {
2151
+ border-color: var(--dc-aih-danger);
2152
+ background-color: color-mix(in srgb, var(--dc-aih-danger) 8%, var(--dc-aih-bg-elevated));
2153
+ }
2154
+
2155
+ .data-club-ai-hub__message-bubble--cancelled {
2156
+ opacity: 0.75;
2157
+ }
2158
+
2159
+ .data-club-ai-hub__message-bubble__actions {
2160
+ display: flex;
2161
+ align-items: center;
2162
+ gap: var(--dc-aih-space-sm);
2163
+ font-size: var(--dc-aih-font-size-sm);
2164
+ color: var(--dc-aih-fg-muted);
2165
+ }
2166
+
2167
+ .data-club-ai-hub__message-bubble__retry {
2168
+ padding: var(--dc-aih-space-xs) var(--dc-aih-space-sm);
2169
+ font: inherit;
2170
+ font-weight: 600;
2171
+ color: var(--dc-aih-accent-fg);
2172
+ background-color: var(--dc-aih-accent);
2173
+ border: none;
2174
+ border-radius: var(--dc-aih-radius-sm);
2175
+ }
2176
+
2177
+ .data-club-ai-hub__message-bubble__retry:hover {
2178
+ background-color: var(--dc-aih-accent-hover);
2179
+ }
2180
+
2181
+ .data-club-ai-hub__message-bubble__cancelled-stamp {
2182
+ font-style: italic;
2183
+ text-transform: uppercase;
2184
+ letter-spacing: 0.04em;
2185
+ }
2186
+
2187
+ /* ─────────────────────────────────────────────────────────────────── */
2188
+ /* Cache badge — per-assistant-message prompt-cache hit indicator */
2189
+ /* */
2190
+ /* Renders as a small chip in the bottom-right corner of the assistant */
2191
+ /* bubble, showing the cache-hit % over the prompt-side tokens. The */
2192
+ /* `data-cache-state` attribute (none|cold|warm|hot) drives the color */
2193
+ /* so skinners can override per-state via the CSS-vars without */
2194
+ /* duplicating the layout rules. */
2195
+ /* ─────────────────────────────────────────────────────────────────── */
2196
+ .data-club-ai-hub__cache-badge {
2197
+ display: inline-flex;
2198
+ align-items: center;
2199
+ gap: 0.25em;
2200
+ margin-top: 0.4em;
2201
+ margin-left: auto;
2202
+ align-self: flex-end;
2203
+ padding: 0.1em 0.5em;
2204
+ font-size: 0.75em;
2205
+ line-height: 1.2;
2206
+ border-radius: 999px;
2207
+ background: var(--dc-aih-cache-badge-bg, rgba(127, 127, 127, 0.12));
2208
+ color: var(--dc-aih-cache-badge-fg, var(--dc-aih-text-muted, #888));
2209
+ border: 1px solid var(--dc-aih-cache-badge-border, transparent);
2210
+ cursor: help; /* signals the title-attribute tooltip */
2211
+ user-select: none;
2212
+ transition: background 0.15s ease, border-color 0.15s ease;
2213
+ }
2214
+ .data-club-ai-hub__cache-badge[data-cache-state="hot"] {
2215
+ background: var(--dc-aih-cache-badge-hot-bg, rgba(40, 180, 99, 0.14));
2216
+ color: var(--dc-aih-cache-badge-hot-fg, #28b463);
2217
+ }
2218
+ .data-club-ai-hub__cache-badge[data-cache-state="warm"] {
2219
+ background: var(--dc-aih-cache-badge-warm-bg, rgba(255, 142, 78, 0.14));
2220
+ color: var(--dc-aih-cache-badge-warm-fg, #ff8e4e);
2221
+ }
2222
+ .data-club-ai-hub__cache-badge[data-cache-state="cold"] {
2223
+ background: var(--dc-aih-cache-badge-cold-bg, rgba(160, 160, 160, 0.14));
2224
+ color: var(--dc-aih-cache-badge-cold-fg, #888);
2225
+ }
2226
+ .data-club-ai-hub__cache-badge[data-cache-state="miss"] {
2227
+ /* Full cache miss — provider had to reinitialize the whole prompt.
2228
+ Red-tinted to signal "nothing cached this turn". */
2229
+ background: var(--dc-aih-cache-badge-miss-bg, rgba(216, 44, 246, 0.12));
2230
+ color: var(--dc-aih-cache-badge-miss-fg, #d82cf6);
2231
+ }
2232
+ .data-club-ai-hub__cache-badge[data-cache-state="priming"] {
2233
+ /* This turn WROTE to the provider's cache. Next turn benefits.
2234
+ Blue-tinted to distinguish from cold miss. */
2235
+ background: var(--dc-aih-cache-badge-priming-bg, rgba(41, 189, 239, 0.14));
2236
+ color: var(--dc-aih-cache-badge-priming-fg, #29bdef);
2237
+ }
2238
+ .data-club-ai-hub__cache-badge[data-cache-state="none"] {
2239
+ font-style: italic;
2240
+ opacity: 0.7;
2241
+ }
2242
+ .data-club-ai-hub__cache-badge__icon {
2243
+ font-size: 0.9em;
2244
+ }
2245
+ .data-club-ai-hub__cache-badge__label {
2246
+ font-variant-numeric: tabular-nums;
2247
+ font-weight: 600;
2248
+ }
2249
+
2250
+ /* ────────────────────────────────────────────────────────────────────────── */
2251
+ /* Step 12 — admin Agents / Sessions overview / Settings sub-pages */
2252
+ /* ────────────────────────────────────────────────────────────────────────── */
2253
+
2254
+ /* Shared form fields (used by AgentEditorModal + settings page sections). */
2255
+
2256
+ .data-club-ai-hub-admin__form-field {
2257
+ display: flex;
2258
+ flex-direction: column;
2259
+ gap: var(--dc-aih-space-xs);
2260
+ margin-bottom: var(--dc-aih-space-md);
2261
+ font-size: var(--dc-aih-font-size-sm);
2262
+ }
2263
+
2264
+ .data-club-ai-hub-admin__form-label {
2265
+ font-weight: 600;
2266
+ }
2267
+
2268
+ .data-club-ai-hub-admin__form-input {
2269
+ padding: var(--dc-aih-space-sm);
2270
+ font: inherit;
2271
+ color: var(--dc-aih-fg);
2272
+ background-color: var(--dc-aih-bg);
2273
+ border: 1px solid var(--dc-aih-border);
2274
+ border-radius: var(--dc-aih-radius-sm);
2275
+ }
2276
+
2277
+ .data-club-ai-hub-admin__form-input:focus {
2278
+ outline: none;
2279
+ border-color: var(--dc-aih-accent);
2280
+ }
2281
+
2282
+ .data-club-ai-hub-admin__form-helper {
2283
+ color: var(--dc-aih-fg-muted);
2284
+ font-size: var(--dc-aih-font-size-sm);
2285
+ }
2286
+
2287
+ .data-club-ai-hub-admin__form-error {
2288
+ color: var(--dc-aih-danger);
2289
+ font-size: var(--dc-aih-font-size-sm);
2290
+ }
2291
+
2292
+ .data-club-ai-hub-admin__mono {
2293
+ font-family: var(--dc-aih-font-mono);
2294
+ font-size: 0.9em;
2295
+ }
2296
+
2297
+ .data-club-ai-hub-admin__page-header-actions {
2298
+ display: flex;
2299
+ gap: var(--dc-aih-space-sm);
2300
+ }
2301
+
2302
+ .data-club-ai-hub-admin__button--danger {
2303
+ color: var(--dc-aih-danger-fg, #ffffff);
2304
+ background-color: var(--dc-aih-danger);
2305
+ border-color: transparent;
2306
+ }
2307
+
2308
+ .data-club-ai-hub-admin__button--danger:hover:not(:disabled) {
2309
+ background-color: color-mix(in srgb, #000000 12%, var(--dc-aih-danger));
2310
+ }
2311
+
2312
+ /* Agents sub-page. */
2313
+
2314
+ .data-club-ai-hub-admin__agents-page {
2315
+ display: flex;
2316
+ flex-direction: column;
2317
+ gap: var(--dc-aih-space-lg);
2318
+ }
2319
+
2320
+ .data-club-ai-hub-admin__agents-table {
2321
+ width: 100%;
2322
+ border-collapse: collapse;
2323
+ background-color: var(--dc-aih-bg-elevated);
2324
+ border: 1px solid var(--dc-aih-border);
2325
+ border-radius: var(--dc-aih-radius-md);
2326
+ overflow: hidden;
2327
+ }
2328
+
2329
+ .data-club-ai-hub-admin__agents-table thead {
2330
+ background-color: color-mix(in srgb, var(--dc-aih-fg) 6%, var(--dc-aih-bg-elevated));
2331
+ }
2332
+
2333
+ .data-club-ai-hub-admin__agents-table th,
2334
+ .data-club-ai-hub-admin__agents-table td {
2335
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
2336
+ text-align: left;
2337
+ border-bottom: 1px solid var(--dc-aih-border);
2338
+ vertical-align: top;
2339
+ }
2340
+
2341
+ .data-club-ai-hub-admin__agents-table tbody tr:last-child td {
2342
+ border-bottom: none;
2343
+ }
2344
+
2345
+ .data-club-ai-hub-admin__agents-row--archived td {
2346
+ opacity: 0.55;
2347
+ }
2348
+
2349
+ .data-club-ai-hub-admin__status-pill {
2350
+ display: inline-block;
2351
+ padding: 2px var(--dc-aih-space-sm);
2352
+ font-size: var(--dc-aih-font-size-sm);
2353
+ border-radius: 999px;
2354
+ background-color: var(--dc-aih-bg);
2355
+ border: 1px solid var(--dc-aih-border);
2356
+ }
2357
+
2358
+ .data-club-ai-hub-admin__status-pill--active {
2359
+ color: var(--dc-aih-fg);
2360
+ background-color: color-mix(in srgb, var(--dc-aih-accent) 12%, transparent);
2361
+ border-color: color-mix(in srgb, var(--dc-aih-accent) 30%, transparent);
2362
+ }
2363
+
2364
+ .data-club-ai-hub-admin__status-pill--archived {
2365
+ color: var(--dc-aih-fg-muted);
2366
+ }
2367
+
2368
+ .data-club-ai-hub-admin__filter-toggle {
2369
+ display: inline-flex;
2370
+ align-items: center;
2371
+ gap: var(--dc-aih-space-xs);
2372
+ font-size: var(--dc-aih-font-size-sm);
2373
+ color: var(--dc-aih-fg-muted);
2374
+ cursor: pointer;
2375
+ }
2376
+
2377
+ .data-club-ai-hub-admin__footnote {
2378
+ margin: 0;
2379
+ padding: var(--dc-aih-space-md);
2380
+ background-color: color-mix(in srgb, var(--dc-aih-fg) 4%, var(--dc-aih-bg-elevated));
2381
+ border: 1px solid var(--dc-aih-border);
2382
+ border-radius: var(--dc-aih-radius-sm);
2383
+ color: var(--dc-aih-fg-muted);
2384
+ font-size: var(--dc-aih-font-size-sm);
2385
+ }
2386
+
2387
+ .data-club-ai-hub-admin__modal-body {
2388
+ margin: 0;
2389
+ color: var(--dc-aih-fg-muted);
2390
+ font-size: var(--dc-aih-font-size-sm);
2391
+ }
2392
+
2393
+ /* Sessions overview sub-page. */
2394
+
2395
+ .data-club-ai-hub-admin__sessions-page {
2396
+ display: flex;
2397
+ flex-direction: column;
2398
+ gap: var(--dc-aih-space-lg);
2399
+ }
2400
+
2401
+ .data-club-ai-hub-admin__search {
2402
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
2403
+ font: inherit;
2404
+ color: var(--dc-aih-fg);
2405
+ background-color: var(--dc-aih-bg);
2406
+ border: 1px solid var(--dc-aih-border);
2407
+ border-radius: var(--dc-aih-radius-sm);
2408
+ min-width: 220px;
2409
+ }
2410
+
2411
+ .data-club-ai-hub-admin__search:focus {
2412
+ outline: none;
2413
+ border-color: var(--dc-aih-accent);
2414
+ }
2415
+
2416
+ .data-club-ai-hub-admin__filters {
2417
+ display: flex;
2418
+ flex-wrap: wrap;
2419
+ gap: var(--dc-aih-space-md);
2420
+ padding: var(--dc-aih-space-md);
2421
+ background-color: color-mix(in srgb, var(--dc-aih-fg) 3%, var(--dc-aih-bg-elevated));
2422
+ border: 1px solid var(--dc-aih-border);
2423
+ border-radius: var(--dc-aih-radius-sm);
2424
+ }
2425
+
2426
+ .data-club-ai-hub-admin__filter {
2427
+ display: flex;
2428
+ align-items: center;
2429
+ gap: var(--dc-aih-space-xs);
2430
+ font-size: var(--dc-aih-font-size-sm);
2431
+ }
2432
+
2433
+ .data-club-ai-hub-admin__filter select {
2434
+ padding: var(--dc-aih-space-xs) var(--dc-aih-space-sm);
2435
+ font: inherit;
2436
+ color: var(--dc-aih-fg);
2437
+ background-color: var(--dc-aih-bg);
2438
+ border: 1px solid var(--dc-aih-border);
2439
+ border-radius: var(--dc-aih-radius-sm);
2440
+ }
2441
+
2442
+ .data-club-ai-hub-admin__sessions-table {
2443
+ width: 100%;
2444
+ border-collapse: collapse;
2445
+ background-color: var(--dc-aih-bg-elevated);
2446
+ border: 1px solid var(--dc-aih-border);
2447
+ border-radius: var(--dc-aih-radius-md);
2448
+ overflow: hidden;
2449
+ }
2450
+
2451
+ .data-club-ai-hub-admin__sessions-table thead {
2452
+ background-color: color-mix(in srgb, var(--dc-aih-fg) 6%, var(--dc-aih-bg-elevated));
2453
+ }
2454
+
2455
+ .data-club-ai-hub-admin__sessions-table th,
2456
+ .data-club-ai-hub-admin__sessions-table td {
2457
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
2458
+ text-align: left;
2459
+ border-bottom: 1px solid var(--dc-aih-border);
2460
+ vertical-align: top;
2461
+ }
2462
+
2463
+ .data-club-ai-hub-admin__sessions-table tbody tr:last-child td {
2464
+ border-bottom: none;
2465
+ }
2466
+
2467
+ .data-club-ai-hub-admin__pagination {
2468
+ display: flex;
2469
+ align-items: center;
2470
+ gap: var(--dc-aih-space-md);
2471
+ }
2472
+
2473
+ .data-club-ai-hub-admin__page-number {
2474
+ color: var(--dc-aih-fg-muted);
2475
+ font-size: var(--dc-aih-font-size-sm);
2476
+ }
2477
+
2478
+ /* Sessions overview — detail view (read-only). */
2479
+
2480
+ .data-club-ai-hub-admin__session-detail {
2481
+ display: flex;
2482
+ flex-direction: column;
2483
+ gap: var(--dc-aih-space-lg);
2484
+ }
2485
+
2486
+ .data-club-ai-hub-admin__detail-header {
2487
+ display: flex;
2488
+ align-items: center;
2489
+ gap: var(--dc-aih-space-md);
2490
+ }
2491
+
2492
+ .data-club-ai-hub-admin__detail-heading {
2493
+ margin: 0;
2494
+ font-size: 1.125rem;
2495
+ font-weight: 700;
2496
+ }
2497
+
2498
+ .data-club-ai-hub-admin__back-link {
2499
+ appearance: none;
2500
+ background: none;
2501
+ border: none;
2502
+ color: var(--dc-aih-accent);
2503
+ cursor: pointer;
2504
+ font: inherit;
2505
+ padding: 0;
2506
+ }
2507
+
2508
+ .data-club-ai-hub-admin__back-link:hover {
2509
+ text-decoration: underline;
2510
+ }
2511
+
2512
+ .data-club-ai-hub-admin__readonly-messages {
2513
+ list-style: none;
2514
+ padding: 0;
2515
+ margin: 0;
2516
+ display: flex;
2517
+ flex-direction: column;
2518
+ gap: var(--dc-aih-space-md);
2519
+ }
2520
+
2521
+ .data-club-ai-hub-admin__readonly-bubble {
2522
+ padding: var(--dc-aih-space-md);
2523
+ background-color: var(--dc-aih-bg-elevated);
2524
+ border: 1px solid var(--dc-aih-border);
2525
+ border-radius: var(--dc-aih-radius-md);
2526
+ }
2527
+
2528
+ .data-club-ai-hub-admin__readonly-bubble--user {
2529
+ background-color: color-mix(in srgb, var(--dc-aih-accent) 8%, var(--dc-aih-bg-elevated));
2530
+ }
2531
+
2532
+ .data-club-ai-hub-admin__readonly-meta {
2533
+ display: flex;
2534
+ gap: var(--dc-aih-space-sm);
2535
+ font-size: var(--dc-aih-font-size-sm);
2536
+ color: var(--dc-aih-fg-muted);
2537
+ margin-bottom: var(--dc-aih-space-xs);
2538
+ }
2539
+
2540
+ .data-club-ai-hub-admin__readonly-content {
2541
+ white-space: pre-wrap;
2542
+ }
2543
+
2544
+ /* Settings sub-page. */
2545
+
2546
+ .data-club-ai-hub-admin__settings-page {
2547
+ display: flex;
2548
+ flex-direction: column;
2549
+ gap: var(--dc-aih-space-xl);
2550
+ }
2551
+
2552
+ .data-club-ai-hub-admin__settings-section {
2553
+ padding: var(--dc-aih-space-lg);
2554
+ background-color: var(--dc-aih-bg-elevated);
2555
+ border: 1px solid var(--dc-aih-border);
2556
+ border-radius: var(--dc-aih-radius-md);
2557
+ display: flex;
2558
+ flex-direction: column;
2559
+ gap: var(--dc-aih-space-md);
2560
+ }
2561
+
2562
+ .data-club-ai-hub-admin__settings-section-heading {
2563
+ margin: 0;
2564
+ font-size: 1rem;
2565
+ font-weight: 700;
2566
+ text-transform: uppercase;
2567
+ letter-spacing: 0.05em;
2568
+ color: var(--dc-aih-fg-muted);
2569
+ border-bottom: 1px solid var(--dc-aih-border);
2570
+ padding-bottom: var(--dc-aih-space-sm);
2571
+ }
2572
+
2573
+ .data-club-ai-hub-admin__radio-group,
2574
+ .data-club-ai-hub-admin__toggle-group {
2575
+ border: none;
2576
+ padding: 0;
2577
+ margin: 0 0 var(--dc-aih-space-sm) 0;
2578
+ display: flex;
2579
+ flex-direction: column;
2580
+ gap: var(--dc-aih-space-xs);
2581
+ }
2582
+
2583
+ .data-club-ai-hub-admin__radio-group {
2584
+ flex-direction: row;
2585
+ gap: var(--dc-aih-space-md);
2586
+ align-items: center;
2587
+ }
2588
+
2589
+ .data-club-ai-hub-admin__radio,
2590
+ .data-club-ai-hub-admin__checkbox {
2591
+ display: inline-flex;
2592
+ align-items: center;
2593
+ gap: var(--dc-aih-space-xs);
2594
+ font-size: var(--dc-aih-font-size-sm);
2595
+ }
2596
+
2597
+ .data-club-ai-hub-admin__warning {
2598
+ margin: 0;
2599
+ padding: var(--dc-aih-space-md);
2600
+ background-color: color-mix(in srgb, var(--dc-aih-danger) 8%, var(--dc-aih-bg-elevated));
2601
+ border: 1px solid color-mix(in srgb, var(--dc-aih-danger) 45%, transparent);
2602
+ border-radius: var(--dc-aih-radius-sm);
2603
+ color: var(--dc-aih-fg);
2604
+ font-size: var(--dc-aih-font-size-sm);
2605
+ }
2606
+
2607
+ .data-club-ai-hub-admin__flash {
2608
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
2609
+ border-radius: var(--dc-aih-radius-sm);
2610
+ font-size: var(--dc-aih-font-size-sm);
2611
+ }
2612
+
2613
+ .data-club-ai-hub-admin__flash--success {
2614
+ color: var(--dc-aih-fg);
2615
+ background-color: color-mix(in srgb, var(--dc-aih-accent) 18%, transparent);
2616
+ }
2617
+
2618
+ .data-club-ai-hub-admin__flash--error {
2619
+ color: var(--dc-aih-fg);
2620
+ background-color: color-mix(in srgb, var(--dc-aih-danger) 18%, transparent);
2621
+ }
2622
+
2623
+ .data-club-ai-hub-admin__reveal-row {
2624
+ display: flex;
2625
+ align-items: center;
2626
+ gap: var(--dc-aih-space-xs);
2627
+ }
2628
+
2629
+ .data-club-ai-hub-admin__reveal-row .data-club-ai-hub-admin__form-input {
2630
+ flex: 1 1 auto;
2631
+ }
2632
+
2633
+ .data-club-ai-hub-admin__copied-flash {
2634
+ font-size: var(--dc-aih-font-size-sm);
2635
+ color: var(--dc-aih-accent);
2636
+ }
2637
+
2638
+ /* ────────────────────────────────────────────────────────────────────── */
2639
+ /* Markdown renderer — assistant bubble bodies */
2640
+ /* */
2641
+ /* `<MarkdownRenderer />` produces a real block tree (paragraphs, */
2642
+ /* headings, tables, code blocks, KaTeX equations). The message bubble */
2643
+ /* has `white-space: pre-wrap` so user input keeps its line breaks; */
2644
+ /* inside the markdown root we revert that so paragraphs don't get */
2645
+ /* double-spaced. */
2646
+ /* */
2647
+ /* Per-customer wrappers theme by overriding `--dc-aih-markdown-*` */
2648
+ /* custom properties on `.data-club-ai-hub`; only those land here as */
2649
+ /* variables, the rest read the shared `--dc-aih-*` tokens. */
2650
+ /* ────────────────────────────────────────────────────────────────────── */
2651
+
2652
+ .data-club-ai-hub {
2653
+ --dc-aih-markdown-code-bg: color-mix(in srgb, var(--dc-aih-fg) 6%, transparent);
2654
+ --dc-aih-markdown-code-fg: var(--dc-aih-fg);
2655
+ --dc-aih-markdown-quote-border: var(--dc-aih-border-strong);
2656
+ --dc-aih-markdown-table-border: var(--dc-aih-border);
2657
+ --dc-aih-markdown-table-header-bg: var(--dc-aih-bg-elevated);
2658
+ --dc-aih-markdown-link-fg: var(--dc-aih-accent);
2659
+ }
2660
+
2661
+ .data-club-ai-hub__markdown {
2662
+ /* Reset `white-space: pre-wrap` inherited from the bubble — the */
2663
+ /* renderer emits real block elements, so newlines in the markdown */
2664
+ /* source shouldn't render as visible spaces. */
2665
+ white-space: normal;
2666
+ font-size: var(--dc-aih-font-size-md);
2667
+ line-height: 1.55;
2668
+ }
2669
+
2670
+ /* Collapse the first/last block's margins so the bubble's own padding */
2671
+ /* still feels tight around the rendered content. */
2672
+ .data-club-ai-hub__markdown > :first-child {
2673
+ margin-top: 0;
2674
+ }
2675
+ .data-club-ai-hub__markdown > :last-child {
2676
+ margin-bottom: 0;
2677
+ }
2678
+
2679
+ /* Paragraphs */
2680
+ .data-club-ai-hub__markdown__p {
2681
+ margin: 0.5em 0;
2682
+ }
2683
+
2684
+ /* Headings */
2685
+ .data-club-ai-hub__markdown__heading {
2686
+ margin: 1em 0 0.4em;
2687
+ font-weight: 600;
2688
+ line-height: 1.3;
2689
+ }
2690
+ .data-club-ai-hub__markdown__heading--1 {
2691
+ font-size: 1.4em;
2692
+ }
2693
+ .data-club-ai-hub__markdown__heading--2 {
2694
+ font-size: 1.25em;
2695
+ }
2696
+ .data-club-ai-hub__markdown__heading--3 {
2697
+ font-size: 1.1em;
2698
+ }
2699
+ .data-club-ai-hub__markdown__heading--4,
2700
+ .data-club-ai-hub__markdown__heading--5,
2701
+ .data-club-ai-hub__markdown__heading--6 {
2702
+ font-size: 1em;
2703
+ }
2704
+
2705
+ /* Lists */
2706
+ .data-club-ai-hub__markdown__ul,
2707
+ .data-club-ai-hub__markdown__ol {
2708
+ margin: 0.4em 0;
2709
+ padding-left: 1.6em;
2710
+ }
2711
+ .data-club-ai-hub__markdown__li {
2712
+ margin: 0.2em 0;
2713
+ }
2714
+ .data-club-ai-hub__markdown__li > .data-club-ai-hub__markdown__p {
2715
+ margin: 0;
2716
+ }
2717
+
2718
+ /* Links */
2719
+ .data-club-ai-hub__markdown__a {
2720
+ color: var(--dc-aih-markdown-link-fg);
2721
+ text-decoration: underline;
2722
+ text-underline-offset: 2px;
2723
+ }
2724
+ .data-club-ai-hub__markdown__a:hover {
2725
+ text-decoration-thickness: 2px;
2726
+ }
2727
+
2728
+ /* Blockquotes */
2729
+ .data-club-ai-hub__markdown__blockquote {
2730
+ margin: 0.6em 0;
2731
+ padding: 0.2em 0 0.2em 0.9em;
2732
+ border-left: 3px solid var(--dc-aih-markdown-quote-border);
2733
+ color: var(--dc-aih-fg-muted);
2734
+ font-style: italic;
2735
+ }
2736
+
2737
+ /* Horizontal rule */
2738
+ .data-club-ai-hub__markdown__hr {
2739
+ margin: 1em 0;
2740
+ border: none;
2741
+ border-top: 1px solid var(--dc-aih-border);
2742
+ }
2743
+
2744
+ /* Inline code */
2745
+ .data-club-ai-hub__markdown__code--inline {
2746
+ padding: 0.1em 0.4em;
2747
+ font-family: var(--dc-aih-font-mono);
2748
+ font-size: 0.92em;
2749
+ background-color: var(--dc-aih-markdown-code-bg);
2750
+ color: var(--dc-aih-markdown-code-fg);
2751
+ border-radius: var(--dc-aih-radius-sm);
2752
+ }
2753
+
2754
+ /* Fenced code block */
2755
+ .data-club-ai-hub__markdown__pre {
2756
+ margin: 0.6em 0;
2757
+ padding: 0.8em 1em;
2758
+ font-family: var(--dc-aih-font-mono);
2759
+ font-size: 0.88em;
2760
+ line-height: 1.45;
2761
+ background-color: var(--dc-aih-markdown-code-bg);
2762
+ color: var(--dc-aih-markdown-code-fg);
2763
+ border: 1px solid var(--dc-aih-border);
2764
+ border-radius: var(--dc-aih-radius-md);
2765
+ overflow-x: auto;
2766
+ /* Codeblocks honour the source's own line breaks. */
2767
+ white-space: pre;
2768
+ }
2769
+ .data-club-ai-hub__markdown__pre > code {
2770
+ /* The inner <code class="language-…"> from react-markdown — let the */
2771
+ /* <pre> own the background; the code element is just a semantic */
2772
+ /* wrapper. */
2773
+ background: none;
2774
+ padding: 0;
2775
+ font: inherit;
2776
+ color: inherit;
2777
+ }
2778
+
2779
+ /* Tables — wrapped in a horizontal-scroll div so wide tables don't push */
2780
+ /* the bubble past its max-width. */
2781
+ .data-club-ai-hub__markdown__table-wrapper {
2782
+ margin: 0.7em 0;
2783
+ overflow-x: auto;
2784
+ border: 1px solid var(--dc-aih-markdown-table-border);
2785
+ border-radius: var(--dc-aih-radius-md);
2786
+ }
2787
+ .data-club-ai-hub__markdown__table {
2788
+ width: 100%;
2789
+ border-collapse: collapse;
2790
+ font-size: 0.92em;
2791
+ }
2792
+ .data-club-ai-hub__markdown__thead {
2793
+ background-color: var(--dc-aih-markdown-table-header-bg);
2794
+ }
2795
+ .data-club-ai-hub__markdown__th,
2796
+ .data-club-ai-hub__markdown__td {
2797
+ padding: 0.45em 0.75em;
2798
+ text-align: left;
2799
+ border-bottom: 1px solid var(--dc-aih-markdown-table-border);
2800
+ vertical-align: top;
2801
+ }
2802
+ .data-club-ai-hub__markdown__th {
2803
+ font-weight: 600;
2804
+ color: var(--dc-aih-fg);
2805
+ }
2806
+ .data-club-ai-hub__markdown__tbody .data-club-ai-hub__markdown__tr:last-child .data-club-ai-hub__markdown__td {
2807
+ border-bottom: none;
2808
+ }
2809
+
2810
+ /* KaTeX block-math centering. KaTeX ships its own CSS for the actual */
2811
+ /* equation typography — consumers import `katex/dist/katex.min.css` */
2812
+ /* alongside this stylesheet (the dev harness + library README both */
2813
+ /* call this out). Here we only style the wrapping `.katex-display` so */
2814
+ /* block-math equations sit nicely inside a bubble. */
2815
+ .data-club-ai-hub__markdown .katex-display {
2816
+ margin: 0.7em 0;
2817
+ padding: 0.2em 0;
2818
+ overflow-x: auto;
2819
+ overflow-y: hidden;
2820
+ }
2821
+
2822
+ /* User bubbles invert the surface, so inline code / quote chrome would */
2823
+ /* otherwise vanish against the accent background. Override the markdown */
2824
+ /* variables under the --user modifier. (User messages don't currently */
2825
+ /* route through MarkdownRenderer, but this future-proofs the contract */
2826
+ /* and also covers Tier-3 wrappers that opt user content in.) */
2827
+ .data-club-ai-hub__message-bubble--user .data-club-ai-hub__markdown {
2828
+ --dc-aih-markdown-code-bg: color-mix(in srgb, var(--dc-aih-accent-fg) 18%, transparent);
2829
+ --dc-aih-markdown-code-fg: var(--dc-aih-accent-fg);
2830
+ --dc-aih-markdown-quote-border: color-mix(in srgb, var(--dc-aih-accent-fg) 40%, transparent);
2831
+ --dc-aih-markdown-link-fg: var(--dc-aih-accent-fg);
2832
+ }
2833
+
2834
+ /* ───────────────────────────────────────────────────────────────────────── */
2835
+ /* Rotating messages (admin) + base-conversation picker */
2836
+ /* ───────────────────────────────────────────────────────────────────────── */
2837
+
2838
+ .data-club-ai-hub-admin__rotating-page {
2839
+ display: flex;
2840
+ flex-direction: column;
2841
+ gap: var(--dc-aih-space-lg);
2842
+ }
2843
+
2844
+ .data-club-ai-hub-admin__rotating-table {
2845
+ width: 100%;
2846
+ border-collapse: collapse;
2847
+ background-color: var(--dc-aih-bg-elevated);
2848
+ border: 1px solid var(--dc-aih-border);
2849
+ border-radius: var(--dc-aih-radius-md);
2850
+ overflow: hidden;
2851
+ }
2852
+
2853
+ .data-club-ai-hub-admin__rotating-table thead {
2854
+ background-color: color-mix(in srgb, var(--dc-aih-fg) 6%, var(--dc-aih-bg-elevated));
2855
+ }
2856
+
2857
+ .data-club-ai-hub-admin__rotating-table th,
2858
+ .data-club-ai-hub-admin__rotating-table td {
2859
+ padding: var(--dc-aih-space-sm) var(--dc-aih-space-md);
2860
+ text-align: left;
2861
+ border-bottom: 1px solid var(--dc-aih-border);
2862
+ vertical-align: top;
2863
+ }
2864
+
2865
+ .data-club-ai-hub-admin__rotating-table tbody tr:last-child td {
2866
+ border-bottom: none;
2867
+ }
2868
+
2869
+ .data-club-ai-hub-admin__rotating-row--archived td {
2870
+ opacity: 0.55;
2871
+ }
2872
+
2873
+ /* Schedule radio rows + inline value/unit rows in the editor modal. */
2874
+ .data-club-ai-hub-admin__radio-row {
2875
+ display: flex;
2876
+ align-items: center;
2877
+ gap: var(--dc-aih-space-xs);
2878
+ margin-top: var(--dc-aih-space-xs);
2879
+ }
2880
+
2881
+ .data-club-ai-hub-admin__inline-row {
2882
+ display: flex;
2883
+ align-items: center;
2884
+ gap: var(--dc-aih-space-sm);
2885
+ margin: var(--dc-aih-space-xs) 0 var(--dc-aih-space-xs) var(--dc-aih-space-lg);
2886
+ flex-wrap: wrap;
2887
+ }
2888
+
2889
+ .data-club-ai-hub-admin__form-input--narrow {
2890
+ width: auto;
2891
+ min-width: 5rem;
2892
+ flex: 0 0 auto;
2893
+ }
2894
+
2895
+ /* Searchable rotating-message picker inside the agent editor. */
2896
+ .data-club-ai-hub-admin__fork-rotating {
2897
+ display: flex;
2898
+ flex-direction: column;
2899
+ gap: var(--dc-aih-space-xs);
2900
+ margin-top: var(--dc-aih-space-xs);
2901
+ }
2902
+
2903
+ .data-club-ai-hub-admin__fork-rotating-list {
2904
+ list-style: none;
2905
+ margin: 0;
2906
+ padding: 0;
2907
+ max-height: 12rem;
2908
+ overflow-y: auto;
2909
+ border: 1px solid var(--dc-aih-border);
2910
+ border-radius: var(--dc-aih-radius-md);
2911
+ }
2912
+
2913
+ .data-club-ai-hub-admin__fork-rotating-item {
2914
+ display: flex;
2915
+ justify-content: space-between;
2916
+ gap: var(--dc-aih-space-sm);
2917
+ width: 100%;
2918
+ padding: var(--dc-aih-space-xs) var(--dc-aih-space-sm);
2919
+ background: none;
2920
+ border: none;
2921
+ border-bottom: 1px solid var(--dc-aih-border);
2922
+ text-align: left;
2923
+ cursor: pointer;
2924
+ color: var(--dc-aih-fg);
2925
+ }
2926
+
2927
+ .data-club-ai-hub-admin__fork-rotating-item:last-child {
2928
+ border-bottom: none;
2929
+ }
2930
+
2931
+ .data-club-ai-hub-admin__fork-rotating-item:hover:not(:disabled) {
2932
+ background-color: color-mix(in srgb, var(--dc-aih-accent) 8%, transparent);
2933
+ }
2934
+
2935
+ .data-club-ai-hub-admin__fork-rotating-item--selected {
2936
+ background-color: color-mix(in srgb, var(--dc-aih-accent) 16%, transparent);
2937
+ }