@brokr/sdk 1.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. package/dist/account.js +34 -0
  2. package/dist/account.mjs +7 -0
  3. package/dist/auth.js +628 -114
  4. package/dist/auth.mjs +611 -111
  5. package/dist/chat.js +34 -0
  6. package/dist/chat.mjs +7 -0
  7. package/dist/events.js +64 -0
  8. package/dist/events.mjs +37 -0
  9. package/dist/feature.js +6304 -0
  10. package/dist/feature.mjs +6278 -0
  11. package/dist/files.js +428 -0
  12. package/dist/files.mjs +408 -0
  13. package/dist/index.d.ts +18 -2
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +4069 -454
  16. package/dist/index.mjs +4040 -448
  17. package/dist/logs.js +148 -0
  18. package/dist/logs.mjs +124 -0
  19. package/dist/management.js +14 -13
  20. package/dist/management.mjs +14 -13
  21. package/dist/next.js +2725 -0
  22. package/dist/next.mjs +2710 -0
  23. package/dist/notifications.js +140 -0
  24. package/dist/notifications.mjs +110 -0
  25. package/dist/payments.js +32 -0
  26. package/dist/payments.mjs +7 -0
  27. package/dist/react-notifications.js +299 -0
  28. package/dist/react-notifications.mjs +267 -0
  29. package/dist/react-styles.js +2756 -0
  30. package/dist/react-styles.mjs +2720 -0
  31. package/dist/react-theme.js +4196 -0
  32. package/dist/react-theme.mjs +4172 -0
  33. package/dist/react.js +8591 -209
  34. package/dist/react.mjs +8571 -183
  35. package/dist/runtime.js +2113 -385
  36. package/dist/runtime.mjs +2085 -397
  37. package/dist/src/account/config.d.ts +42 -0
  38. package/dist/src/account/config.d.ts.map +1 -0
  39. package/dist/src/account/index.d.ts +3 -0
  40. package/dist/src/account/index.d.ts.map +1 -0
  41. package/dist/src/ai/client.d.ts +58 -0
  42. package/dist/src/ai/client.d.ts.map +1 -0
  43. package/dist/src/ai/conversation-title.d.ts +13 -0
  44. package/dist/src/ai/conversation-title.d.ts.map +1 -0
  45. package/dist/src/ai/types.d.ts +81 -0
  46. package/dist/src/ai/types.d.ts.map +1 -0
  47. package/dist/src/auth.d.ts +133 -20
  48. package/dist/src/auth.d.ts.map +1 -1
  49. package/dist/src/chat/config.d.ts +61 -0
  50. package/dist/src/chat/config.d.ts.map +1 -0
  51. package/dist/src/chat/index.d.ts +3 -0
  52. package/dist/src/chat/index.d.ts.map +1 -0
  53. package/dist/src/chat/sse-parser.d.ts +44 -0
  54. package/dist/src/chat/sse-parser.d.ts.map +1 -0
  55. package/dist/src/dev-console.d.ts +18 -0
  56. package/dist/src/dev-console.d.ts.map +1 -0
  57. package/dist/src/email/client.d.ts +33 -0
  58. package/dist/src/email/client.d.ts.map +1 -0
  59. package/dist/src/email/templates.d.ts +15 -0
  60. package/dist/src/email/templates.d.ts.map +1 -0
  61. package/dist/src/email/types.d.ts +35 -0
  62. package/dist/src/email/types.d.ts.map +1 -0
  63. package/dist/src/env-detect.d.ts +25 -0
  64. package/dist/src/env-detect.d.ts.map +1 -0
  65. package/dist/src/errors.d.ts +53 -0
  66. package/dist/src/errors.d.ts.map +1 -0
  67. package/dist/src/events/client.d.ts +25 -0
  68. package/dist/src/events/client.d.ts.map +1 -0
  69. package/dist/src/events/index.d.ts +9 -0
  70. package/dist/src/events/index.d.ts.map +1 -0
  71. package/dist/src/events/types.d.ts +10 -0
  72. package/dist/src/events/types.d.ts.map +1 -0
  73. package/dist/src/feature/canonical.d.ts +33 -0
  74. package/dist/src/feature/canonical.d.ts.map +1 -0
  75. package/dist/src/feature/create-feature.d.ts +33 -0
  76. package/dist/src/feature/create-feature.d.ts.map +1 -0
  77. package/dist/src/feature/db.d.ts +16 -0
  78. package/dist/src/feature/db.d.ts.map +1 -0
  79. package/dist/src/feature/handlers.d.ts +28 -0
  80. package/dist/src/feature/handlers.d.ts.map +1 -0
  81. package/dist/src/feature/index.d.ts +21 -0
  82. package/dist/src/feature/index.d.ts.map +1 -0
  83. package/dist/src/feature/manifest.d.ts +173 -0
  84. package/dist/src/feature/manifest.d.ts.map +1 -0
  85. package/dist/src/feature/mapping.d.ts +18 -0
  86. package/dist/src/feature/mapping.d.ts.map +1 -0
  87. package/dist/src/feature/runtime.d.ts +45 -0
  88. package/dist/src/feature/runtime.d.ts.map +1 -0
  89. package/dist/src/feature/types.d.ts +65 -0
  90. package/dist/src/feature/types.d.ts.map +1 -0
  91. package/dist/src/files/client.d.ts +28 -0
  92. package/dist/src/files/client.d.ts.map +1 -0
  93. package/dist/src/files/types.d.ts +28 -0
  94. package/dist/src/files/types.d.ts.map +1 -0
  95. package/dist/src/fix-registry.d.ts +8 -0
  96. package/dist/src/fix-registry.d.ts.map +1 -0
  97. package/dist/src/gateway.d.ts +32 -0
  98. package/dist/src/gateway.d.ts.map +1 -0
  99. package/dist/src/logs/capture.d.ts +56 -0
  100. package/dist/src/logs/capture.d.ts.map +1 -0
  101. package/dist/src/logs/index.d.ts +2 -0
  102. package/dist/src/logs/index.d.ts.map +1 -0
  103. package/dist/src/management.d.ts +1 -1
  104. package/dist/src/management.d.ts.map +1 -1
  105. package/dist/src/models.d.ts +32 -0
  106. package/dist/src/models.d.ts.map +1 -0
  107. package/dist/src/next/auth.d.ts +54 -0
  108. package/dist/src/next/auth.d.ts.map +1 -0
  109. package/dist/src/next/chat.d.ts +31 -0
  110. package/dist/src/next/chat.d.ts.map +1 -0
  111. package/dist/src/next/index.d.ts +14 -0
  112. package/dist/src/next/index.d.ts.map +1 -0
  113. package/dist/src/next/notifications.d.ts +67 -0
  114. package/dist/src/next/notifications.d.ts.map +1 -0
  115. package/dist/src/notifications/built-ins.d.ts +9 -0
  116. package/dist/src/notifications/built-ins.d.ts.map +1 -0
  117. package/dist/src/notifications/client.d.ts +38 -0
  118. package/dist/src/notifications/client.d.ts.map +1 -0
  119. package/dist/src/notifications/config.d.ts +71 -0
  120. package/dist/src/notifications/config.d.ts.map +1 -0
  121. package/dist/src/notifications/index.d.ts +6 -0
  122. package/dist/src/notifications/index.d.ts.map +1 -0
  123. package/dist/src/notifications/registry.d.ts +67 -0
  124. package/dist/src/notifications/registry.d.ts.map +1 -0
  125. package/dist/src/notifications/types.d.ts +48 -0
  126. package/dist/src/notifications/types.d.ts.map +1 -0
  127. package/dist/src/payments/client.d.ts +64 -0
  128. package/dist/src/payments/client.d.ts.map +1 -0
  129. package/dist/src/payments/config.d.ts +46 -0
  130. package/dist/src/payments/config.d.ts.map +1 -0
  131. package/dist/src/payments/entitlements.d.ts +48 -0
  132. package/dist/src/payments/entitlements.d.ts.map +1 -0
  133. package/dist/src/payments/types.d.ts +135 -0
  134. package/dist/src/payments/types.d.ts.map +1 -0
  135. package/dist/src/react/BrokrErrorBoundary.d.ts +23 -0
  136. package/dist/src/react/BrokrErrorBoundary.d.ts.map +1 -0
  137. package/dist/src/react/account/AccountPanel.d.ts +12 -0
  138. package/dist/src/react/account/AccountPanel.d.ts.map +1 -0
  139. package/dist/src/react/account/Avatar.d.ts +11 -0
  140. package/dist/src/react/account/Avatar.d.ts.map +1 -0
  141. package/dist/src/react/account/ProfilePhotoButton.d.ts +7 -0
  142. package/dist/src/react/account/ProfilePhotoButton.d.ts.map +1 -0
  143. package/dist/src/react/account/UserButton.d.ts +7 -0
  144. package/dist/src/react/account/UserButton.d.ts.map +1 -0
  145. package/dist/src/react/auth-pages/AuthPageShell.d.ts +9 -0
  146. package/dist/src/react/auth-pages/AuthPageShell.d.ts.map +1 -0
  147. package/dist/src/react/auth-pages/SignInPage.d.ts +9 -0
  148. package/dist/src/react/auth-pages/SignInPage.d.ts.map +1 -0
  149. package/dist/src/react/auth-pages/SignUpPage.d.ts +8 -0
  150. package/dist/src/react/auth-pages/SignUpPage.d.ts.map +1 -0
  151. package/dist/src/react/auth.d.ts +1 -49
  152. package/dist/src/react/auth.d.ts.map +1 -1
  153. package/dist/src/react/chat/AIChat.d.ts +4 -0
  154. package/dist/src/react/chat/AIChat.d.ts.map +1 -0
  155. package/dist/src/react/chat/ChatContext.d.ts +76 -0
  156. package/dist/src/react/chat/ChatContext.d.ts.map +1 -0
  157. package/dist/src/react/chat/ChatInput.d.ts +3 -0
  158. package/dist/src/react/chat/ChatInput.d.ts.map +1 -0
  159. package/dist/src/react/chat/MarkdownRenderer.d.ts +5 -0
  160. package/dist/src/react/chat/MarkdownRenderer.d.ts.map +1 -0
  161. package/dist/src/react/chat/MessageBubble.d.ts +14 -0
  162. package/dist/src/react/chat/MessageBubble.d.ts.map +1 -0
  163. package/dist/src/react/chat/MessagePane.d.ts +10 -0
  164. package/dist/src/react/chat/MessagePane.d.ts.map +1 -0
  165. package/dist/src/react/chat/ModelSelector.d.ts +13 -0
  166. package/dist/src/react/chat/ModelSelector.d.ts.map +1 -0
  167. package/dist/src/react/chat/ThreadSidebar.d.ts +3 -0
  168. package/dist/src/react/chat/ThreadSidebar.d.ts.map +1 -0
  169. package/dist/src/react/chat/index.d.ts +5 -0
  170. package/dist/src/react/chat/index.d.ts.map +1 -0
  171. package/dist/src/react/chat/token-limit.d.ts +14 -0
  172. package/dist/src/react/chat/token-limit.d.ts.map +1 -0
  173. package/dist/src/react/chat/types.d.ts +65 -0
  174. package/dist/src/react/chat/types.d.ts.map +1 -0
  175. package/dist/src/react/chat/useChat.d.ts +57 -0
  176. package/dist/src/react/chat/useChat.d.ts.map +1 -0
  177. package/dist/src/react/composites/FabAI.d.ts +15 -0
  178. package/dist/src/react/composites/FabAI.d.ts.map +1 -0
  179. package/dist/src/react/composites/FeedbackWidget.d.ts +10 -0
  180. package/dist/src/react/composites/FeedbackWidget.d.ts.map +1 -0
  181. package/dist/src/react/composites/SmartUpload.d.ts +12 -0
  182. package/dist/src/react/composites/SmartUpload.d.ts.map +1 -0
  183. package/dist/src/react/config.d.ts +23 -0
  184. package/dist/src/react/config.d.ts.map +1 -0
  185. package/dist/src/react/context.d.ts +4 -0
  186. package/dist/src/react/context.d.ts.map +1 -0
  187. package/dist/src/react/css/account.d.ts +2 -0
  188. package/dist/src/react/css/account.d.ts.map +1 -0
  189. package/dist/src/react/css/animations.d.ts +2 -0
  190. package/dist/src/react/css/animations.d.ts.map +1 -0
  191. package/dist/src/react/css/auth.d.ts +2 -0
  192. package/dist/src/react/css/auth.d.ts.map +1 -0
  193. package/dist/src/react/css/chat-extras.d.ts +2 -0
  194. package/dist/src/react/css/chat-extras.d.ts.map +1 -0
  195. package/dist/src/react/css/chat.d.ts +2 -0
  196. package/dist/src/react/css/chat.d.ts.map +1 -0
  197. package/dist/src/react/css/composites.d.ts +2 -0
  198. package/dist/src/react/css/composites.d.ts.map +1 -0
  199. package/dist/src/react/css/gates.d.ts +2 -0
  200. package/dist/src/react/css/gates.d.ts.map +1 -0
  201. package/dist/src/react/css/index.d.ts +3 -0
  202. package/dist/src/react/css/index.d.ts.map +1 -0
  203. package/dist/src/react/css/markdown.d.ts +2 -0
  204. package/dist/src/react/css/markdown.d.ts.map +1 -0
  205. package/dist/src/react/css/notifications.d.ts +2 -0
  206. package/dist/src/react/css/notifications.d.ts.map +1 -0
  207. package/dist/src/react/css/primitives.d.ts +2 -0
  208. package/dist/src/react/css/primitives.d.ts.map +1 -0
  209. package/dist/src/react/css/reset.d.ts +2 -0
  210. package/dist/src/react/css/reset.d.ts.map +1 -0
  211. package/dist/src/react/css/responsive.d.ts +2 -0
  212. package/dist/src/react/css/responsive.d.ts.map +1 -0
  213. package/dist/src/react/css/skeleton.d.ts +2 -0
  214. package/dist/src/react/css/skeleton.d.ts.map +1 -0
  215. package/dist/src/react/css/tokens.d.ts +2 -0
  216. package/dist/src/react/css/tokens.d.ts.map +1 -0
  217. package/dist/src/react/gates/AuthWall.d.ts +7 -0
  218. package/dist/src/react/gates/AuthWall.d.ts.map +1 -0
  219. package/dist/src/react/gates/BillingBoundary.d.ts +4 -0
  220. package/dist/src/react/gates/BillingBoundary.d.ts.map +1 -0
  221. package/dist/src/react/gates/Gate.d.ts +9 -0
  222. package/dist/src/react/gates/Gate.d.ts.map +1 -0
  223. package/dist/src/react/gates/RequirePlan.d.ts +4 -0
  224. package/dist/src/react/gates/RequirePlan.d.ts.map +1 -0
  225. package/dist/src/react/gates/RequireUser.d.ts +4 -0
  226. package/dist/src/react/gates/RequireUser.d.ts.map +1 -0
  227. package/dist/src/react/gates/UsageGate.d.ts +4 -0
  228. package/dist/src/react/gates/UsageGate.d.ts.map +1 -0
  229. package/dist/src/react/helpers.d.ts +7 -0
  230. package/dist/src/react/helpers.d.ts.map +1 -0
  231. package/dist/src/react/hooks/use-theme.d.ts +15 -0
  232. package/dist/src/react/hooks/use-theme.d.ts.map +1 -0
  233. package/dist/src/react/hooks/use-user.d.ts +12 -0
  234. package/dist/src/react/hooks/use-user.d.ts.map +1 -0
  235. package/dist/src/react/icons.d.ts +26 -0
  236. package/dist/src/react/icons.d.ts.map +1 -0
  237. package/dist/src/react/index.d.ts +48 -0
  238. package/dist/src/react/index.d.ts.map +1 -0
  239. package/dist/src/react/notifications/NotificationBell.d.ts +7 -0
  240. package/dist/src/react/notifications/NotificationBell.d.ts.map +1 -0
  241. package/dist/src/react/notifications/NotificationList.d.ts +7 -0
  242. package/dist/src/react/notifications/NotificationList.d.ts.map +1 -0
  243. package/dist/src/react/notifications/Toast.d.ts +13 -0
  244. package/dist/src/react/notifications/Toast.d.ts.map +1 -0
  245. package/dist/src/react/notifications/index.d.ts +8 -0
  246. package/dist/src/react/notifications/index.d.ts.map +1 -0
  247. package/dist/src/react/notifications/provider.d.ts +14 -0
  248. package/dist/src/react/notifications/provider.d.ts.map +1 -0
  249. package/dist/src/react/notifications/use-notifications.d.ts +24 -0
  250. package/dist/src/react/notifications/use-notifications.d.ts.map +1 -0
  251. package/dist/src/react/payments/AutoReloadToggle.d.ts +6 -0
  252. package/dist/src/react/payments/AutoReloadToggle.d.ts.map +1 -0
  253. package/dist/src/react/payments/Balance.d.ts +8 -0
  254. package/dist/src/react/payments/Balance.d.ts.map +1 -0
  255. package/dist/src/react/payments/CancelSubscription.d.ts +6 -0
  256. package/dist/src/react/payments/CancelSubscription.d.ts.map +1 -0
  257. package/dist/src/react/payments/CheckoutButton.d.ts +7 -0
  258. package/dist/src/react/payments/CheckoutButton.d.ts.map +1 -0
  259. package/dist/src/react/payments/CustomerPortalButton.d.ts +6 -0
  260. package/dist/src/react/payments/CustomerPortalButton.d.ts.map +1 -0
  261. package/dist/src/react/payments/FeatureMeter.d.ts +6 -0
  262. package/dist/src/react/payments/FeatureMeter.d.ts.map +1 -0
  263. package/dist/src/react/payments/Plans.d.ts +8 -0
  264. package/dist/src/react/payments/Plans.d.ts.map +1 -0
  265. package/dist/src/react/payments/TopUpButton.d.ts +8 -0
  266. package/dist/src/react/payments/TopUpButton.d.ts.map +1 -0
  267. package/dist/src/react/payments/UpdateBilling.d.ts +3 -0
  268. package/dist/src/react/payments/UpdateBilling.d.ts.map +1 -0
  269. package/dist/src/react/payments/UpgradePrompt.d.ts +8 -0
  270. package/dist/src/react/payments/UpgradePrompt.d.ts.map +1 -0
  271. package/dist/src/react/primitives/Skeleton.d.ts +15 -0
  272. package/dist/src/react/primitives/Skeleton.d.ts.map +1 -0
  273. package/dist/src/react/provider.d.ts +21 -0
  274. package/dist/src/react/provider.d.ts.map +1 -0
  275. package/dist/src/react/request.d.ts +2 -0
  276. package/dist/src/react/request.d.ts.map +1 -0
  277. package/dist/src/react/styles-entry.d.ts +4 -0
  278. package/dist/src/react/styles-entry.d.ts.map +1 -0
  279. package/dist/src/react/styles.d.ts +2 -0
  280. package/dist/src/react/styles.d.ts.map +1 -0
  281. package/dist/src/react/theme-entry.d.ts +3 -0
  282. package/dist/src/react/theme-entry.d.ts.map +1 -0
  283. package/dist/src/react/theme.d.ts +6 -0
  284. package/dist/src/react/theme.d.ts.map +1 -0
  285. package/dist/src/react/types.d.ts +191 -0
  286. package/dist/src/react/types.d.ts.map +1 -0
  287. package/dist/src/react/use-brokr-theme.d.ts +6 -0
  288. package/dist/src/react/use-brokr-theme.d.ts.map +1 -0
  289. package/dist/src/runtime.d.ts +69 -180
  290. package/dist/src/runtime.d.ts.map +1 -1
  291. package/dist/src/storage/client.d.ts +113 -0
  292. package/dist/src/storage/client.d.ts.map +1 -0
  293. package/dist/src/storage/types.d.ts +60 -0
  294. package/dist/src/storage/types.d.ts.map +1 -0
  295. package/dist/tsconfig.tsbuildinfo +1 -1
  296. package/dist/types.d.ts +2 -2
  297. package/dist/types.d.ts.map +1 -1
  298. package/package.json +70 -9
@@ -0,0 +1,2720 @@
1
+ // src/react/styles-entry.tsx
2
+ import React from "react";
3
+
4
+ // src/react/css/tokens.ts
5
+ var TOKENS_CSS = `
6
+ .brokr-root {
7
+ --brokr-space-1: 0.25rem;
8
+ --brokr-space-2: 0.5rem;
9
+ --brokr-space-3: 0.75rem;
10
+ --brokr-space-4: 1rem;
11
+ --brokr-space-5: 1.25rem;
12
+ --brokr-space-6: 1.5rem;
13
+ --brokr-space-8: 2rem;
14
+ --brokr-space-10: 2.5rem;
15
+ --brokr-space-12: 3rem;
16
+ --brokr-shadow-sm: 0 1px 2px color-mix(in srgb, var(--brokr-text-primary) 1.5%, transparent);
17
+ --brokr-shadow-md: 0 4px 12px color-mix(in srgb, var(--brokr-text-primary) 2.5%, transparent);
18
+ --brokr-shadow-lg: 0 8px 20px color-mix(in srgb, var(--brokr-text-primary) 3%, transparent);
19
+ --brokr-muted-border: color-mix(in srgb, var(--brokr-border) 65%, transparent);
20
+ --brokr-soft-surface: color-mix(in srgb, var(--brokr-surface) 92%, var(--brokr-bg));
21
+ --brokr-subtle-fill: color-mix(in srgb, var(--brokr-text-primary) 6%, transparent);
22
+ --brokr-subtle-fill-strong: color-mix(in srgb, var(--brokr-text-primary) 10%, transparent);
23
+ --brokr-font-size-xs: 0.75rem;
24
+ --brokr-font-size-sm: 0.875rem;
25
+ --brokr-font-size-md: 1rem;
26
+ --brokr-font-size-lg: 1.125rem;
27
+ --brokr-font-size-xl: 1.5rem;
28
+ --brokr-font-size-2xl: clamp(2rem, 4vw, 3.5rem);
29
+
30
+ /* Z-index stacking order */
31
+ --brokr-z-chat-float: 4;
32
+ --brokr-z-drawer-backdrop: 49;
33
+ --brokr-z-drawer: 50;
34
+ --brokr-z-popover: 60;
35
+ --brokr-z-fab: 70;
36
+ --brokr-z-panel: 80;
37
+ --brokr-z-modal-backdrop: 90;
38
+ --brokr-z-dropdown: 95;
39
+ --brokr-z-notification: 9999;
40
+ --brokr-z-toast: 99999;
41
+
42
+ /* Transition durations */
43
+ --brokr-duration-fast: 100ms;
44
+ --brokr-duration-base: 150ms;
45
+ --brokr-duration-slow: 300ms;
46
+ --brokr-ease: ease;
47
+
48
+ /* Font weights */
49
+ --brokr-font-weight-normal: 400;
50
+ --brokr-font-weight-medium: 500;
51
+ --brokr-font-weight-semibold: 600;
52
+ --brokr-font-weight-bold: 700;
53
+
54
+ /* Line heights */
55
+ --brokr-leading-tight: 1.25;
56
+ --brokr-leading-snug: 1.4;
57
+ --brokr-leading-normal: 1.6;
58
+ --brokr-leading-relaxed: 1.7;
59
+
60
+ /* Font families */
61
+ --brokr-font-mono: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, monospace;
62
+
63
+ /* Additional radii */
64
+ --brokr-radius-pill: 999px;
65
+ --brokr-radius-sm: 4px;
66
+
67
+ color: var(--brokr-text-primary);
68
+ }
69
+ `;
70
+
71
+ // src/react/css/reset.ts
72
+ var RESET_CSS = `
73
+ .brokr-root,
74
+ .brokr-root > * {
75
+ box-sizing: border-box;
76
+ scrollbar-color: color-mix(in srgb, var(--brokr-text-primary) 18%, transparent) transparent;
77
+ scrollbar-width: thin;
78
+ }
79
+
80
+ .brokr-root *::-webkit-scrollbar {
81
+ height: 10px;
82
+ width: 10px;
83
+ }
84
+
85
+ .brokr-root *::-webkit-scrollbar-thumb {
86
+ background: color-mix(in srgb, var(--brokr-text-primary) 16%, transparent);
87
+ border: 3px solid transparent;
88
+ border-radius: 999px;
89
+ background-clip: padding-box;
90
+ }
91
+
92
+ .brokr-root *::-webkit-scrollbar-track {
93
+ background: transparent;
94
+ }
95
+ `;
96
+
97
+ // src/react/css/primitives.ts
98
+ var PRIMITIVES_CSS = `
99
+ .brokr-card {
100
+ background: var(--brokr-surface);
101
+ border: 1px solid var(--brokr-muted-border);
102
+ border-radius: var(--brokr-radius-card);
103
+ box-shadow: var(--brokr-shadow-sm);
104
+ }
105
+
106
+ .brokr-panel {
107
+ background: color-mix(in srgb, var(--brokr-surface) 96%, var(--brokr-bg));
108
+ border: 1px solid var(--brokr-muted-border);
109
+ border-radius: calc(var(--brokr-radius-card) + 2px);
110
+ box-shadow: var(--brokr-shadow-md);
111
+ }
112
+
113
+ .brokr-button,
114
+ .brokr-button-secondary,
115
+ .brokr-button-ghost {
116
+ appearance: none;
117
+ border: 1px solid transparent;
118
+ border-radius: var(--brokr-radius-button);
119
+ cursor: pointer;
120
+ display: inline-flex;
121
+ align-items: center;
122
+ justify-content: center;
123
+ gap: var(--brokr-space-2);
124
+ font: inherit;
125
+ font-size: var(--brokr-font-size-sm);
126
+ font-weight: 600;
127
+ min-height: 44px;
128
+ padding: 0 var(--brokr-space-4);
129
+ text-decoration: none;
130
+ transition: background-color 150ms ease, border-color 150ms ease, transform 150ms ease, opacity 150ms ease;
131
+ }
132
+
133
+ .brokr-button:hover,
134
+ .brokr-button-secondary:hover,
135
+ .brokr-button-ghost:hover {
136
+ transform: translateY(-1px);
137
+ }
138
+
139
+ .brokr-button:disabled,
140
+ .brokr-button-secondary:disabled,
141
+ .brokr-button-ghost:disabled {
142
+ cursor: wait;
143
+ opacity: 0.65;
144
+ transform: none;
145
+ }
146
+
147
+ .brokr-button {
148
+ background: var(--brokr-primary);
149
+ color: var(--brokr-primary-contrast);
150
+ }
151
+
152
+ .brokr-button-secondary {
153
+ background: var(--brokr-subtle-fill);
154
+ border-color: var(--brokr-muted-border);
155
+ color: var(--brokr-text-primary);
156
+ }
157
+
158
+ .brokr-button-ghost {
159
+ background: transparent;
160
+ border-color: var(--brokr-muted-border);
161
+ color: var(--brokr-text-secondary);
162
+ }
163
+
164
+ .brokr-input,
165
+ .brokr-textarea,
166
+ .brokr-select {
167
+ appearance: none;
168
+ width: 100%;
169
+ border: 1px solid var(--brokr-muted-border);
170
+ background: color-mix(in srgb, var(--brokr-surfaceMuted, var(--brokr-surface)) 75%, var(--brokr-bg));
171
+ color: var(--brokr-text-primary);
172
+ border-radius: var(--brokr-radius-input);
173
+ font: inherit;
174
+ font-size: var(--brokr-font-size-sm);
175
+ min-height: 44px;
176
+ padding: 0.825rem 0.95rem;
177
+ transition: border-color 150ms ease, background-color 150ms ease;
178
+ }
179
+
180
+ .brokr-input::placeholder,
181
+ .brokr-textarea::placeholder {
182
+ color: var(--brokr-text-secondary);
183
+ }
184
+
185
+ .brokr-input:focus,
186
+ .brokr-textarea:focus,
187
+ .brokr-select:focus,
188
+ .brokr-button:focus-visible,
189
+ .brokr-button-secondary:focus-visible,
190
+ .brokr-button-ghost:focus-visible,
191
+ .brokr-action:focus-visible {
192
+ outline: 2px solid color-mix(in srgb, var(--brokr-primary) 60%, transparent);
193
+ outline-offset: 2px;
194
+ }
195
+
196
+ .brokr-textarea {
197
+ min-height: 120px;
198
+ padding-top: 0.95rem;
199
+ resize: vertical;
200
+ }
201
+
202
+ .brokr-label {
203
+ color: var(--brokr-text-secondary);
204
+ display: block;
205
+ font-size: var(--brokr-font-size-xs);
206
+ font-weight: 600;
207
+ letter-spacing: 0.02em;
208
+ margin-bottom: var(--brokr-space-2);
209
+ text-transform: uppercase;
210
+ }
211
+
212
+ .brokr-title {
213
+ color: var(--brokr-text-primary);
214
+ font-size: var(--brokr-font-size-xl);
215
+ font-weight: 700;
216
+ letter-spacing: -0.03em;
217
+ margin: 0;
218
+ }
219
+
220
+ .brokr-heading {
221
+ color: var(--brokr-text-primary);
222
+ font-size: var(--brokr-font-size-2xl);
223
+ font-weight: 700;
224
+ letter-spacing: -0.04em;
225
+ line-height: 1;
226
+ margin: 0;
227
+ }
228
+
229
+ .brokr-copy,
230
+ .brokr-muted {
231
+ color: var(--brokr-text-secondary);
232
+ font-size: var(--brokr-font-size-sm);
233
+ line-height: 1.6;
234
+ }
235
+
236
+ .brokr-section {
237
+ display: grid;
238
+ gap: var(--brokr-space-6);
239
+ }
240
+
241
+ .brokr-divider {
242
+ border: 0;
243
+ border-top: 1px solid var(--brokr-muted-border);
244
+ margin: 0;
245
+ }
246
+
247
+ .brokr-badge {
248
+ align-items: center;
249
+ border: 1px solid var(--brokr-muted-border);
250
+ border-radius: 999px;
251
+ color: var(--brokr-text-secondary);
252
+ display: inline-flex;
253
+ font-size: var(--brokr-font-size-xs);
254
+ font-weight: 700;
255
+ gap: var(--brokr-space-1);
256
+ letter-spacing: 0.06em;
257
+ min-height: 28px;
258
+ padding: 0 0.7rem;
259
+ text-transform: uppercase;
260
+ }
261
+
262
+ .brokr-badge-sandbox {
263
+ background: color-mix(in srgb, var(--brokr-primary) 10%, transparent);
264
+ color: var(--brokr-text-primary);
265
+ }
266
+
267
+ .brokr-inline-message {
268
+ border: 1px solid var(--brokr-muted-border);
269
+ border-radius: calc(var(--brokr-radius-card) - 2px);
270
+ color: var(--brokr-text-secondary);
271
+ font-size: var(--brokr-font-size-sm);
272
+ padding: var(--brokr-space-3) var(--brokr-space-4);
273
+ }
274
+
275
+ .brokr-inline-message[data-tone="error"] {
276
+ border-color: color-mix(in srgb, var(--brokr-error, var(--brokr-primary)) 30%, var(--brokr-border));
277
+ color: var(--brokr-text-primary);
278
+ }
279
+
280
+ .brokr-grid-auto {
281
+ display: grid;
282
+ gap: var(--brokr-space-4);
283
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
284
+ }
285
+ `;
286
+
287
+ // src/react/css/auth.ts
288
+ var AUTH_CSS = `
289
+ .brokr-auth-shell {
290
+ align-items: stretch;
291
+ background: var(--brokr-bg);
292
+ color: var(--brokr-text-primary);
293
+ display: grid;
294
+ min-height: 100vh;
295
+ }
296
+
297
+ .brokr-auth-shell[data-variant="1"] {
298
+ grid-template-columns: minmax(0, 1.1fr) minmax(360px, 0.9fr);
299
+ }
300
+
301
+ .brokr-auth-hero {
302
+ display: grid;
303
+ min-height: 40vh;
304
+ overflow: hidden;
305
+ padding: var(--brokr-space-8);
306
+ position: relative;
307
+ }
308
+
309
+ .brokr-auth-hero::after {
310
+ background: linear-gradient(180deg, transparent 0%, color-mix(in srgb, var(--brokr-bg) 75%, transparent) 100%);
311
+ content: "";
312
+ inset: 0;
313
+ pointer-events: none;
314
+ position: absolute;
315
+ }
316
+
317
+ .brokr-auth-hero-media {
318
+ background-color: var(--brokr-soft-surface);
319
+ background-position: center;
320
+ background-repeat: no-repeat;
321
+ background-size: cover;
322
+ border: 1px solid var(--brokr-muted-border);
323
+ border-radius: calc(var(--brokr-radius-card) + 10px);
324
+ inset: var(--brokr-space-6);
325
+ position: absolute;
326
+ }
327
+
328
+ .brokr-auth-hero-content {
329
+ align-content: end;
330
+ display: grid;
331
+ gap: var(--brokr-space-4);
332
+ margin-top: auto;
333
+ max-width: 34rem;
334
+ padding: var(--brokr-space-6);
335
+ position: relative;
336
+ z-index: 1;
337
+ }
338
+
339
+ .brokr-brand-row {
340
+ align-items: center;
341
+ display: inline-flex;
342
+ gap: var(--brokr-space-3);
343
+ }
344
+
345
+ .brokr-brand-logo {
346
+ border-radius: calc(var(--brokr-radius-card) + 6px);
347
+ display: block;
348
+ height: 40px;
349
+ object-fit: contain;
350
+ width: 40px;
351
+ }
352
+
353
+ .brokr-brand-name {
354
+ color: var(--brokr-text-primary);
355
+ font-size: var(--brokr-font-size-sm);
356
+ font-weight: 700;
357
+ letter-spacing: 0.08em;
358
+ text-transform: uppercase;
359
+ }
360
+
361
+ .brokr-auth-form-pane {
362
+ align-items: center;
363
+ display: grid;
364
+ min-height: 100vh;
365
+ padding: var(--brokr-space-8);
366
+ }
367
+
368
+ .brokr-auth-card {
369
+ display: grid;
370
+ gap: var(--brokr-space-6);
371
+ margin: 0 auto;
372
+ max-width: 28rem;
373
+ padding: var(--brokr-space-8);
374
+ width: 100%;
375
+ }
376
+
377
+ .brokr-auth-form {
378
+ display: grid;
379
+ gap: var(--brokr-space-4);
380
+ }
381
+
382
+ .brokr-auth-footer {
383
+ color: var(--brokr-text-secondary);
384
+ display: flex;
385
+ flex-wrap: wrap;
386
+ gap: var(--brokr-space-2);
387
+ justify-content: center;
388
+ }
389
+
390
+ .brokr-auth-link,
391
+ .brokr-action {
392
+ color: var(--brokr-text-primary);
393
+ cursor: pointer;
394
+ text-decoration: none;
395
+ }
396
+
397
+ .brokr-auth-link:hover,
398
+ .brokr-action:hover {
399
+ opacity: 0.8;
400
+ }
401
+ `;
402
+
403
+ // src/react/css/account.ts
404
+ var ACCOUNT_CSS = `
405
+ .brokr-account-trigger {
406
+ align-items: center;
407
+ background: color-mix(in srgb, var(--brokr-surface) 92%, var(--brokr-bg));
408
+ border: 1px solid var(--brokr-muted-border);
409
+ border-radius: calc(var(--brokr-radius-card) + 1px);
410
+ color: var(--brokr-text-primary);
411
+ cursor: pointer;
412
+ display: inline-flex;
413
+ gap: var(--brokr-space-3);
414
+ min-height: 44px;
415
+ padding: 0.4rem 0.55rem 0.4rem 0.45rem;
416
+ }
417
+
418
+ .brokr-account-trigger[data-display="avatar"] {
419
+ border-radius: 999px;
420
+ gap: 0;
421
+ justify-content: center;
422
+ min-width: 44px;
423
+ padding: 0.35rem;
424
+ }
425
+
426
+ .brokr-avatar,
427
+ .brokr-avatar-lg {
428
+ align-items: center;
429
+ background: var(--brokr-subtle-fill-strong);
430
+ border-radius: 999px;
431
+ color: var(--brokr-text-primary);
432
+ display: inline-flex;
433
+ font-weight: 700;
434
+ justify-content: center;
435
+ overflow: hidden;
436
+ }
437
+
438
+ .brokr-avatar { height: 32px; width: 32px; }
439
+ .brokr-avatar-lg { height: 72px; width: 72px; }
440
+
441
+ .brokr-avatar img,
442
+ .brokr-avatar-lg img {
443
+ display: block;
444
+ height: 100%;
445
+ object-fit: cover;
446
+ width: 100%;
447
+ }
448
+
449
+ .brokr-popover {
450
+ display: grid;
451
+ gap: var(--brokr-space-3);
452
+ max-height: min(78vh, 760px);
453
+ min-width: 280px;
454
+ overflow: auto;
455
+ padding: var(--brokr-space-3);
456
+ position: absolute;
457
+ right: 0;
458
+ top: calc(100% + 2px);
459
+ width: min(92vw, 320px);
460
+ z-index: var(--brokr-z-popover);
461
+ }
462
+
463
+ .brokr-popover[data-align="start"] {
464
+ left: 0;
465
+ right: auto;
466
+ }
467
+
468
+ .brokr-popover-actions {
469
+ display: grid;
470
+ gap: var(--brokr-space-2);
471
+ }
472
+
473
+ .brokr-session-list,
474
+ .brokr-stack-list {
475
+ display: grid;
476
+ gap: var(--brokr-space-3);
477
+ }
478
+
479
+ .brokr-session-item {
480
+ align-items: center;
481
+ display: grid;
482
+ gap: var(--brokr-space-3);
483
+ grid-template-columns: 1fr auto;
484
+ }
485
+
486
+ .brokr-profile-photo {
487
+ align-items: center;
488
+ cursor: pointer;
489
+ display: inline-grid;
490
+ justify-items: center;
491
+ position: relative;
492
+ width: 100%;
493
+ }
494
+
495
+ .brokr-profile-photo-shell {
496
+ display: grid;
497
+ gap: var(--brokr-space-3);
498
+ justify-items: center;
499
+ }
500
+
501
+ .brokr-profile-photo-frame {
502
+ align-items: center;
503
+ display: grid;
504
+ justify-items: center;
505
+ min-height: 72px;
506
+ width: 100%;
507
+ }
508
+
509
+ .brokr-profile-photo-overlay {
510
+ align-items: center;
511
+ background: color-mix(in srgb, var(--brokr-bg) 72%, transparent);
512
+ backdrop-filter: blur(10px);
513
+ border-radius: inherit;
514
+ color: var(--brokr-text-primary);
515
+ display: grid;
516
+ justify-items: center;
517
+ inset: 0;
518
+ opacity: 0;
519
+ position: absolute;
520
+ transition: opacity 150ms ease;
521
+ }
522
+
523
+ .brokr-profile-photo:hover .brokr-profile-photo-overlay,
524
+ .brokr-profile-photo:focus-within .brokr-profile-photo-overlay {
525
+ opacity: 1;
526
+ }
527
+
528
+ /* ============================================================
529
+ Account Panel \u2014 Settings surface
530
+ ============================================================ */
531
+
532
+ .brokr-account-panel {
533
+ background: color-mix(in srgb, var(--brokr-surface) 97%, var(--brokr-bg));
534
+ border: 1px solid var(--brokr-muted-border);
535
+ border-radius: calc(var(--brokr-radius-card) + 4px);
536
+ display: grid;
537
+ gap: 0;
538
+ margin: 0 auto;
539
+ max-width: 1040px;
540
+ min-height: 620px;
541
+ overflow: hidden;
542
+ width: 100%;
543
+ }
544
+
545
+ .brokr-account-sidebar {
546
+ background: color-mix(in srgb, var(--brokr-surfaceMuted, var(--brokr-surface)) 82%, var(--brokr-bg));
547
+ border-right: 1px solid var(--brokr-muted-border);
548
+ display: grid;
549
+ align-content: start;
550
+ gap: 1.6rem;
551
+ padding: 1.45rem 1.1rem;
552
+ }
553
+
554
+ .brokr-account-sidebar-group {
555
+ display: grid;
556
+ gap: 0.45rem;
557
+ }
558
+
559
+ .brokr-account-sidebar-kicker {
560
+ color: var(--brokr-text-secondary);
561
+ font-size: 0.68rem;
562
+ font-weight: 700;
563
+ letter-spacing: 0.12em;
564
+ line-height: 1;
565
+ opacity: 0.8;
566
+ padding: 0 0.55rem;
567
+ text-transform: uppercase;
568
+ }
569
+
570
+ .brokr-account-tab-list {
571
+ display: grid;
572
+ gap: 0.2rem;
573
+ align-content: start;
574
+ }
575
+
576
+ .brokr-account-tab {
577
+ align-items: center;
578
+ appearance: none;
579
+ background: transparent;
580
+ border: 1px solid transparent;
581
+ border-radius: calc(var(--brokr-radius-card) - 1px);
582
+ color: var(--brokr-text-secondary);
583
+ cursor: pointer;
584
+ display: inline-flex;
585
+ font: inherit;
586
+ font-size: var(--brokr-font-size-sm);
587
+ font-weight: 600;
588
+ gap: 0.7rem;
589
+ justify-content: flex-start;
590
+ line-height: 1;
591
+ min-height: 38px;
592
+ padding: 0 0.7rem;
593
+ text-align: left;
594
+ width: 100%;
595
+ }
596
+
597
+ .brokr-account-tab-icon {
598
+ align-items: center;
599
+ color: currentColor;
600
+ display: inline-flex;
601
+ flex-shrink: 0;
602
+ height: 16px;
603
+ justify-content: center;
604
+ line-height: 0;
605
+ width: 16px;
606
+ }
607
+
608
+ .brokr-account-tab > span:last-child {
609
+ align-items: center;
610
+ display: inline-flex;
611
+ min-height: 1rem;
612
+ }
613
+
614
+ .brokr-account-tab:hover,
615
+ .brokr-account-tab[data-active="true"] {
616
+ background: color-mix(in srgb, var(--brokr-text-primary) 6%, transparent);
617
+ border-color: var(--brokr-muted-border);
618
+ color: var(--brokr-text-primary);
619
+ }
620
+
621
+ .brokr-account-surface {
622
+ display: grid;
623
+ align-content: start;
624
+ gap: 1.4rem;
625
+ padding: 1.5rem;
626
+ }
627
+
628
+ .brokr-account-surface-header {
629
+ display: block;
630
+ padding: 0.1rem 0;
631
+ }
632
+
633
+ .brokr-account-form,
634
+ .brokr-account-stack {
635
+ display: grid;
636
+ gap: 1rem;
637
+ }
638
+
639
+ .brokr-account-card {
640
+ background: color-mix(in srgb, var(--brokr-surface) 96%, var(--brokr-bg));
641
+ border: 1px solid var(--brokr-muted-border);
642
+ border-radius: calc(var(--brokr-radius-card) + 1px);
643
+ display: grid;
644
+ gap: 1rem;
645
+ padding: 1.15rem;
646
+ }
647
+
648
+ .brokr-account-photo-row {
649
+ align-items: center;
650
+ display: flex;
651
+ gap: 1rem;
652
+ min-height: 92px;
653
+ }
654
+
655
+ .brokr-account-photo-row .brokr-profile-photo-shell {
656
+ gap: 0;
657
+ }
658
+
659
+ .brokr-account-photo-copy {
660
+ display: grid;
661
+ gap: 0.35rem;
662
+ align-content: center;
663
+ }
664
+
665
+ .brokr-account-photo-hint {
666
+ align-items: center;
667
+ color: var(--brokr-text-secondary);
668
+ display: inline-flex;
669
+ gap: 0.45rem;
670
+ font-size: var(--brokr-font-size-sm);
671
+ }
672
+
673
+ .brokr-account-field-list {
674
+ display: grid;
675
+ gap: 0;
676
+ padding: 0;
677
+ }
678
+
679
+ .brokr-account-field-row {
680
+ display: grid;
681
+ gap: 0.8rem;
682
+ grid-template-columns: 1fr;
683
+ padding: 1.15rem;
684
+ }
685
+
686
+ .brokr-account-field-row + .brokr-account-field-row {
687
+ border-top: 1px solid var(--brokr-muted-border);
688
+ }
689
+
690
+ .brokr-account-field-head {
691
+ display: grid;
692
+ gap: 0.25rem;
693
+ max-width: none;
694
+ }
695
+
696
+ .brokr-account-field-body {
697
+ display: grid;
698
+ gap: var(--brokr-space-2);
699
+ justify-items: stretch;
700
+ min-width: 0;
701
+ width: 100%;
702
+ }
703
+
704
+ .brokr-account-field-body .brokr-input {
705
+ min-height: 44px;
706
+ width: 100%;
707
+ }
708
+
709
+ .brokr-account-field-body-static,
710
+ .brokr-account-field-body-actions {
711
+ align-content: center;
712
+ }
713
+
714
+ .brokr-account-field-body-stack {
715
+ justify-items: stretch;
716
+ }
717
+
718
+ .brokr-account-static-value {
719
+ align-items: center;
720
+ display: flex;
721
+ flex-wrap: wrap;
722
+ gap: var(--brokr-space-3);
723
+ justify-content: space-between;
724
+ line-height: 1.25;
725
+ width: 100%;
726
+ }
727
+
728
+ .brokr-account-status-pill {
729
+ align-items: center;
730
+ background: color-mix(in srgb, var(--brokr-text-primary) 6%, transparent);
731
+ border: 1px solid var(--brokr-muted-border);
732
+ border-radius: 999px;
733
+ color: var(--brokr-text-secondary);
734
+ display: inline-flex;
735
+ font-size: 0.75rem;
736
+ font-weight: 600;
737
+ gap: 0.35rem;
738
+ min-height: 28px;
739
+ padding: 0 0.7rem;
740
+ }
741
+
742
+ .brokr-account-status-pill[data-verified="true"] {
743
+ color: var(--brokr-text-primary);
744
+ }
745
+
746
+ .brokr-account-actions-row {
747
+ align-items: center;
748
+ display: flex;
749
+ gap: var(--brokr-space-3);
750
+ justify-content: flex-end;
751
+ padding-top: 0.1rem;
752
+ }
753
+
754
+ .brokr-account-summary-row {
755
+ align-items: center;
756
+ display: flex;
757
+ gap: var(--brokr-space-4);
758
+ justify-content: space-between;
759
+ }
760
+
761
+ .brokr-account-summary-copy {
762
+ display: grid;
763
+ gap: 0.35rem;
764
+ }
765
+
766
+ .brokr-account-summary-copy strong {
767
+ color: var(--brokr-text-primary);
768
+ font-size: 1.05rem;
769
+ font-weight: 600;
770
+ letter-spacing: -0.02em;
771
+ }
772
+
773
+ .brokr-account-summary-kicker {
774
+ color: var(--brokr-text-secondary);
775
+ font-size: 0.72rem;
776
+ font-weight: 700;
777
+ letter-spacing: 0.12em;
778
+ text-transform: uppercase;
779
+ }
780
+
781
+ .brokr-account-summary-icon {
782
+ align-items: center;
783
+ background: color-mix(in srgb, var(--brokr-text-primary) 6%, transparent);
784
+ border: 1px solid var(--brokr-muted-border);
785
+ border-radius: 10px;
786
+ color: var(--brokr-text-secondary);
787
+ display: inline-flex;
788
+ height: 40px;
789
+ justify-content: center;
790
+ width: 40px;
791
+ }
792
+
793
+ .brokr-account-session-group {
794
+ border: 1px solid var(--brokr-muted-border);
795
+ border-radius: calc(var(--brokr-radius-card) - 1px);
796
+ display: grid;
797
+ overflow: hidden;
798
+ }
799
+
800
+ .brokr-account-session-row {
801
+ align-items: center;
802
+ background: color-mix(in srgb, var(--brokr-surface) 98%, var(--brokr-bg));
803
+ display: grid;
804
+ gap: 0.75rem;
805
+ grid-template-columns: 1fr auto;
806
+ padding: 0.85rem 1rem;
807
+ }
808
+
809
+ .brokr-account-session-row + .brokr-account-session-row {
810
+ border-top: 1px solid var(--brokr-muted-border);
811
+ }
812
+
813
+ .brokr-account-session-info {
814
+ display: grid;
815
+ gap: 0.15rem;
816
+ min-width: 0;
817
+ }
818
+
819
+ .brokr-account-session-info strong {
820
+ color: var(--brokr-text-primary);
821
+ font-size: var(--brokr-font-size-sm);
822
+ font-weight: 600;
823
+ }
824
+
825
+ .brokr-account-session-detail,
826
+ .brokr-account-session-empty {
827
+ color: var(--brokr-text-secondary);
828
+ font-size: var(--brokr-font-size-sm);
829
+ line-height: 1.5;
830
+ }
831
+
832
+ .brokr-account-danger-zone {
833
+ border-color: color-mix(in srgb, var(--brokr-error, var(--brokr-primary)) 20%, var(--brokr-border));
834
+ }
835
+
836
+ .brokr-account-link-button {
837
+ appearance: none;
838
+ background: transparent;
839
+ border: 1px solid transparent;
840
+ border-radius: calc(var(--brokr-radius-button) - 2px);
841
+ color: var(--brokr-text-secondary);
842
+ cursor: pointer;
843
+ font: inherit;
844
+ font-size: 0.8125rem;
845
+ font-weight: 600;
846
+ min-height: 34px;
847
+ padding: 0 0.7rem;
848
+ text-decoration: none;
849
+ transition: color 120ms ease, background-color 120ms ease, border-color 120ms ease;
850
+ }
851
+
852
+ .brokr-account-link-button:hover {
853
+ background: color-mix(in srgb, var(--brokr-text-primary) 5%, transparent);
854
+ border-color: var(--brokr-muted-border);
855
+ color: var(--brokr-text-primary);
856
+ }
857
+
858
+ .brokr-account-link-button[data-tone="danger"] {
859
+ color: color-mix(in srgb, var(--brokr-error, var(--brokr-primary)) 70%, var(--brokr-text-secondary));
860
+ }
861
+
862
+ .brokr-account-link-button[data-tone="danger"]:hover {
863
+ color: var(--brokr-error, var(--brokr-primary));
864
+ }
865
+
866
+ .brokr-account-panel[data-density="compact"] {
867
+ border-radius: calc(var(--brokr-radius-card) + 2px);
868
+ max-width: 100%;
869
+ }
870
+
871
+ .brokr-account-panel[data-density="compact"] .brokr-account-sidebar {
872
+ border-bottom: 1px solid var(--brokr-muted-border);
873
+ border-right: none;
874
+ gap: var(--brokr-space-3);
875
+ padding: var(--brokr-space-3);
876
+ }
877
+
878
+ .brokr-account-panel[data-density="compact"] .brokr-account-tab-list {
879
+ display: flex;
880
+ flex-wrap: wrap;
881
+ }
882
+
883
+ .brokr-account-panel[data-density="compact"] .brokr-account-surface {
884
+ gap: var(--brokr-space-3);
885
+ padding: var(--brokr-space-3);
886
+ }
887
+
888
+ .brokr-account-menu {
889
+ display: grid;
890
+ gap: var(--brokr-space-3);
891
+ }
892
+
893
+ .brokr-account-menu-header {
894
+ align-items: center;
895
+ display: grid;
896
+ gap: var(--brokr-space-3);
897
+ grid-template-columns: auto minmax(0, 1fr);
898
+ padding-bottom: var(--brokr-space-2);
899
+ }
900
+
901
+ .brokr-account-menu-copy {
902
+ display: grid;
903
+ gap: 0.15rem;
904
+ min-width: 0;
905
+ }
906
+
907
+ .brokr-account-menu-copy strong {
908
+ color: var(--brokr-text-primary);
909
+ font-size: 0.95rem;
910
+ font-weight: 600;
911
+ overflow: hidden;
912
+ text-overflow: ellipsis;
913
+ white-space: nowrap;
914
+ }
915
+
916
+ .brokr-account-menu-copy span {
917
+ color: var(--brokr-text-secondary);
918
+ font-size: 0.82rem;
919
+ overflow: hidden;
920
+ text-overflow: ellipsis;
921
+ white-space: nowrap;
922
+ }
923
+
924
+ .brokr-account-menu-actions {
925
+ display: grid;
926
+ gap: var(--brokr-space-2);
927
+ padding-top: var(--brokr-space-2);
928
+ border-top: 1px solid var(--brokr-muted-border);
929
+ }
930
+
931
+ .brokr-account-menu-action {
932
+ align-items: center;
933
+ appearance: none;
934
+ background: transparent;
935
+ border: 1px solid transparent;
936
+ border-radius: calc(var(--brokr-radius-card) - 1px);
937
+ color: var(--brokr-text-primary);
938
+ cursor: pointer;
939
+ display: inline-flex;
940
+ font: inherit;
941
+ font-size: var(--brokr-font-size-sm);
942
+ font-weight: 600;
943
+ gap: 0.65rem;
944
+ justify-content: flex-start;
945
+ min-height: 38px;
946
+ padding: 0 0.75rem;
947
+ }
948
+
949
+ .brokr-account-menu-action > span:last-child {
950
+ align-items: center;
951
+ display: inline-flex;
952
+ min-height: 1rem;
953
+ }
954
+
955
+ .brokr-account-menu-action:hover {
956
+ background: color-mix(in srgb, var(--brokr-text-primary) 5%, transparent);
957
+ border-color: var(--brokr-muted-border);
958
+ }
959
+
960
+ .brokr-account-menu-action-icon {
961
+ align-items: center;
962
+ color: var(--brokr-text-secondary);
963
+ display: inline-flex;
964
+ justify-content: center;
965
+ }
966
+
967
+ .brokr-modal-backdrop {
968
+ align-items: center;
969
+ background: color-mix(in srgb, var(--brokr-bg) 60%, transparent);
970
+ backdrop-filter: blur(10px);
971
+ display: grid;
972
+ inset: 0;
973
+ padding: var(--brokr-space-6);
974
+ position: fixed;
975
+ z-index: var(--brokr-z-modal-backdrop);
976
+ }
977
+
978
+ .brokr-modal-dialog {
979
+ max-height: min(90vh, 860px);
980
+ overflow: auto;
981
+ width: min(96vw, 1100px);
982
+ }
983
+
984
+ .brokr-account-settings-dialog {
985
+ display: grid;
986
+ gap: var(--brokr-space-4);
987
+ padding: var(--brokr-space-4);
988
+ }
989
+
990
+ .brokr-modal-toolbar {
991
+ display: flex;
992
+ justify-content: flex-end;
993
+ }
994
+
995
+ .brokr-account-panel[data-density="compact"] .brokr-account-card {
996
+ gap: var(--brokr-space-3);
997
+ padding: var(--brokr-space-3);
998
+ }
999
+
1000
+ .brokr-account-panel[data-density="compact"] .brokr-account-field-row,
1001
+ .brokr-account-panel[data-density="compact"] .brokr-account-photo-row {
1002
+ gap: var(--brokr-space-3);
1003
+ grid-template-columns: 1fr;
1004
+ }
1005
+
1006
+ .brokr-account-panel[data-density="compact"] .brokr-account-field-body,
1007
+ .brokr-account-panel[data-density="compact"] .brokr-account-actions-row {
1008
+ justify-items: stretch;
1009
+ justify-content: stretch;
1010
+ width: 100%;
1011
+ }
1012
+
1013
+ .brokr-account-panel[data-density="compact"] .brokr-account-static-value,
1014
+ .brokr-account-panel[data-density="compact"] .brokr-account-summary-row {
1015
+ align-items: flex-start;
1016
+ flex-direction: column;
1017
+ }
1018
+ `;
1019
+
1020
+ // src/react/css/chat.ts
1021
+ var CHAT_CSS = `
1022
+ .brokr-ai-chat-shell {
1023
+ display: grid;
1024
+ gap: 0;
1025
+ grid-template-columns: minmax(240px, 280px) minmax(0, 1fr);
1026
+ overflow: hidden;
1027
+ width: 100%;
1028
+ }
1029
+
1030
+ .brokr-ai-chat-shell[data-sidebar="false"] {
1031
+ grid-template-columns: minmax(0, 1fr);
1032
+ }
1033
+
1034
+ .brokr-ai-chat-sidebar {
1035
+ border-right: 1px solid var(--brokr-muted-border);
1036
+ display: grid;
1037
+ gap: var(--brokr-space-4);
1038
+ padding: var(--brokr-space-4);
1039
+ align-content: start;
1040
+ overflow-y: auto;
1041
+ height: 100%;
1042
+ max-height: 100%;
1043
+ min-height: 0;
1044
+ }
1045
+
1046
+ .brokr-ai-chat-sidebar-empty {
1047
+ display: flex;
1048
+ flex: 1;
1049
+ align-items: center;
1050
+ justify-content: center;
1051
+ padding: var(--brokr-space-6) var(--brokr-space-4);
1052
+ }
1053
+
1054
+ .brokr-ai-chat-sidebar-empty-text {
1055
+ color: var(--brokr-text-secondary);
1056
+ font-size: var(--brokr-font-size-xs);
1057
+ line-height: 1.5;
1058
+ text-align: center;
1059
+ opacity: 0.6;
1060
+ }
1061
+
1062
+ .brokr-ai-chat-sidebar-button {
1063
+ align-items: center;
1064
+ background: transparent;
1065
+ border: none;
1066
+ border-radius: var(--brokr-radius-button);
1067
+ color: var(--brokr-text-secondary);
1068
+ cursor: pointer;
1069
+ display: inline-flex;
1070
+ font: inherit;
1071
+ font-size: var(--brokr-font-size-xs);
1072
+ font-weight: 500;
1073
+ gap: var(--brokr-space-2);
1074
+ justify-content: flex-start;
1075
+ padding: 0.5rem 0.65rem;
1076
+ padding-bottom: 0.65rem;
1077
+ margin-bottom: var(--brokr-space-2);
1078
+ border-bottom: 1px solid var(--brokr-muted-border);
1079
+ border-radius: 0;
1080
+ transition: color 120ms ease;
1081
+ width: 100%;
1082
+ }
1083
+
1084
+ .brokr-ai-chat-sidebar-button:hover {
1085
+ color: var(--brokr-text-primary);
1086
+ }
1087
+
1088
+ .brokr-ai-chat-conversations {
1089
+ display: grid;
1090
+ gap: 2px;
1091
+ }
1092
+
1093
+ .brokr-ai-chat-conversation {
1094
+ appearance: none;
1095
+ background: transparent;
1096
+ border: none;
1097
+ border-radius: var(--brokr-radius-button);
1098
+ color: var(--brokr-text-secondary);
1099
+ cursor: pointer;
1100
+ font: inherit;
1101
+ font-size: var(--brokr-font-size-xs);
1102
+ font-weight: 400;
1103
+ overflow: hidden;
1104
+ padding: 0.5rem 0.65rem;
1105
+ text-align: left;
1106
+ text-overflow: ellipsis;
1107
+ transition: color 120ms ease, background 120ms ease;
1108
+ white-space: nowrap;
1109
+ }
1110
+
1111
+ .brokr-ai-chat-conversation:hover {
1112
+ color: var(--brokr-text-primary);
1113
+ background: var(--brokr-subtle-fill);
1114
+ }
1115
+
1116
+ .brokr-ai-chat-conversation[data-active="true"] {
1117
+ color: var(--brokr-text-primary);
1118
+ background: var(--brokr-subtle-fill);
1119
+ font-weight: 500;
1120
+ }
1121
+
1122
+ .brokr-ai-chat-stage {
1123
+ height: 100%;
1124
+ max-height: 100%;
1125
+ min-height: 0;
1126
+ width: 100%;
1127
+ max-width: 100%;
1128
+ min-width: 0;
1129
+ overflow: hidden;
1130
+ position: relative;
1131
+ }
1132
+
1133
+ .brokr-ai-chat-topbar {
1134
+ align-items: center;
1135
+ display: flex;
1136
+ flex-direction: row;
1137
+ gap: var(--brokr-space-4);
1138
+ justify-content: space-between;
1139
+ left: 0;
1140
+ padding: var(--brokr-space-3);
1141
+ pointer-events: none;
1142
+ position: absolute;
1143
+ right: 0;
1144
+ top: 0;
1145
+ z-index: var(--brokr-z-chat-float);
1146
+ }
1147
+
1148
+ .brokr-ai-chat-topbar > * {
1149
+ pointer-events: auto;
1150
+ }
1151
+
1152
+ .brokr-ai-chat-header-title {
1153
+ align-items: center;
1154
+ display: inline-flex;
1155
+ gap: var(--brokr-space-2);
1156
+ overflow: hidden;
1157
+ text-overflow: ellipsis;
1158
+ white-space: nowrap;
1159
+ }
1160
+
1161
+ .brokr-ai-chat-title-loading {
1162
+ align-items: center;
1163
+ color: var(--brokr-text-secondary);
1164
+ display: inline-flex;
1165
+ gap: 0.3rem;
1166
+ }
1167
+
1168
+ .brokr-ai-chat-title-loading span {
1169
+ animation: brokrTypingBounce 1.2s ease-in-out infinite;
1170
+ background: color-mix(in srgb, var(--brokr-text-primary) 50%, transparent);
1171
+ border-radius: 999px;
1172
+ display: inline-block;
1173
+ height: 0.28rem;
1174
+ width: 0.28rem;
1175
+ }
1176
+
1177
+ .brokr-ai-chat-title-loading span:nth-child(2) {
1178
+ animation-delay: 0.15s;
1179
+ }
1180
+
1181
+ .brokr-ai-chat-title-loading span:nth-child(3) {
1182
+ animation-delay: 0.3s;
1183
+ }
1184
+
1185
+ .brokr-ai-chat-topbar-actions {
1186
+ align-items: center;
1187
+ display: inline-flex;
1188
+ gap: var(--brokr-space-2);
1189
+ }
1190
+
1191
+ .brokr-ai-chat-model-select {
1192
+ min-width: 11rem;
1193
+ }
1194
+
1195
+ .brokr-ai-chat-thread {
1196
+ height: 100%;
1197
+ min-height: 0;
1198
+ overflow-y: auto;
1199
+ padding: calc(var(--brokr-space-12) + var(--brokr-space-4)) 0 calc(var(--brokr-space-12) + 4.75rem);
1200
+ }
1201
+
1202
+ .brokr-ai-chat-thread[data-empty="true"] {
1203
+ align-content: center;
1204
+ display: grid;
1205
+ }
1206
+
1207
+ .brokr-ai-chat-thread-inner {
1208
+ margin: 0 auto;
1209
+ max-width: 860px;
1210
+ }
1211
+
1212
+ .brokr-ai-chat-message {
1213
+ animation: brokrFadeIn 200ms ease;
1214
+ margin-bottom: var(--brokr-space-10);
1215
+ }
1216
+
1217
+ .brokr-ai-chat-model-avatar {
1218
+ border-radius: 50%;
1219
+ flex-shrink: 0;
1220
+ height: 28px;
1221
+ object-fit: cover;
1222
+ width: 28px;
1223
+ }
1224
+
1225
+ .brokr-model-logo {
1226
+ border-radius: 50%;
1227
+ flex-shrink: 0;
1228
+ height: 18px;
1229
+ object-fit: cover;
1230
+ width: 18px;
1231
+ }
1232
+
1233
+ .brokr-ai-chat-message-row {
1234
+ align-items: flex-start;
1235
+ display: flex;
1236
+ gap: var(--brokr-space-3);
1237
+ width: 100%;
1238
+ }
1239
+
1240
+ .brokr-ai-chat-message-row[data-role="user"] {
1241
+ justify-content: flex-end;
1242
+ }
1243
+
1244
+ .brokr-ai-chat-message-row[data-role="assistant"] {
1245
+ justify-content: flex-start;
1246
+ }
1247
+
1248
+ .brokr-ai-chat-message-content {
1249
+ color: var(--brokr-text-secondary);
1250
+ font-size: 0.9375rem;
1251
+ line-height: 1.7;
1252
+ width: min(100%, 720px);
1253
+ overflow-wrap: break-word;
1254
+ }
1255
+
1256
+ .brokr-ai-chat-message-content-user {
1257
+ color: var(--brokr-text-primary);
1258
+ }
1259
+
1260
+ .brokr-ai-chat-message-error {
1261
+ color: var(--brokr-error, #ef4444);
1262
+ font-size: 0.875rem;
1263
+ line-height: 1.5;
1264
+ opacity: 0.85;
1265
+ }
1266
+
1267
+ .brokr-ai-chat-message-bubble {
1268
+ background: color-mix(in srgb, var(--brokr-text-primary) 10%, var(--brokr-surface));
1269
+ border: 1px solid color-mix(in srgb, var(--brokr-text-primary) 10%, var(--brokr-border));
1270
+ border-radius: calc(var(--brokr-radius-card) + 2px);
1271
+ box-shadow: var(--brokr-shadow-sm);
1272
+ max-width: min(78%, 720px);
1273
+ padding: var(--brokr-space-3) var(--brokr-space-4);
1274
+ }
1275
+
1276
+ .brokr-ai-chat-empty {
1277
+ align-items: center;
1278
+ display: flex;
1279
+ flex-direction: column;
1280
+ gap: var(--brokr-space-3);
1281
+ justify-content: center;
1282
+ margin: 0 auto;
1283
+ max-width: 720px;
1284
+ padding: var(--brokr-space-8);
1285
+ text-align: center;
1286
+ }
1287
+
1288
+ .brokr-ai-chat-empty .brokr-copy {
1289
+ max-width: 42rem;
1290
+ }
1291
+
1292
+ .brokr-ai-chat-starters {
1293
+ display: grid;
1294
+ gap: var(--brokr-space-2);
1295
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1296
+ margin-top: var(--brokr-space-2);
1297
+ width: min(100%, 720px);
1298
+ }
1299
+
1300
+ .brokr-ai-chat-starter {
1301
+ align-items: flex-start;
1302
+ appearance: none;
1303
+ background: transparent;
1304
+ border: 1px solid var(--brokr-muted-border);
1305
+ border-radius: calc(var(--brokr-radius-card) + 1px);
1306
+ color: var(--brokr-text-primary);
1307
+ cursor: pointer;
1308
+ display: inline-flex;
1309
+ font: inherit;
1310
+ font-size: var(--brokr-font-size-sm);
1311
+ justify-content: flex-start;
1312
+ min-height: 58px;
1313
+ padding: 0.85rem 1rem;
1314
+ text-align: left;
1315
+ }
1316
+
1317
+ .brokr-ai-chat-starter:hover {
1318
+ background: var(--brokr-subtle-fill);
1319
+ }
1320
+
1321
+ .brokr-ai-chat-input-area {
1322
+ bottom: 0;
1323
+ left: 0;
1324
+ padding: var(--brokr-space-4) 0 var(--brokr-space-5);
1325
+ position: absolute;
1326
+ right: 0;
1327
+ z-index: var(--brokr-z-chat-float);
1328
+ }
1329
+
1330
+ .brokr-ai-chat-textarea {
1331
+ background: var(--brokr-surface);
1332
+ border: 1px solid var(--brokr-border);
1333
+ border-radius: var(--brokr-radius-input);
1334
+ color: var(--brokr-text-primary);
1335
+ flex: 1;
1336
+ font: inherit;
1337
+ line-height: 1.5;
1338
+ max-height: 168px;
1339
+ min-height: 44px;
1340
+ outline: none;
1341
+ overflow: hidden;
1342
+ padding: var(--brokr-space-3);
1343
+ resize: none;
1344
+ }
1345
+
1346
+ .brokr-ai-chat-textarea:focus {
1347
+ border-color: var(--brokr-primary);
1348
+ }
1349
+
1350
+ .brokr-ai-chat-send {
1351
+ align-items: center;
1352
+ align-self: stretch;
1353
+ background: var(--brokr-primary);
1354
+ border: none;
1355
+ border-radius: var(--brokr-radius-button);
1356
+ color: var(--brokr-primary-contrast);
1357
+ cursor: pointer;
1358
+ display: inline-flex;
1359
+ flex-shrink: 0;
1360
+ justify-content: center;
1361
+ width: 44px;
1362
+ }
1363
+
1364
+ .brokr-ai-chat-send:disabled {
1365
+ cursor: not-allowed;
1366
+ opacity: 0.35;
1367
+ }
1368
+
1369
+ .brokr-ai-chat-typing {
1370
+ align-items: center;
1371
+ display: inline-flex;
1372
+ gap: 0.4rem;
1373
+ min-height: 28px;
1374
+ padding: 0.25rem 0;
1375
+ }
1376
+
1377
+ .brokr-ai-chat-typing span {
1378
+ animation: brokrTypingBounce 1.2s ease-in-out infinite;
1379
+ background: color-mix(in srgb, var(--brokr-text-primary) 70%, transparent);
1380
+ border-radius: 999px;
1381
+ display: inline-block;
1382
+ height: 0.42rem;
1383
+ width: 0.42rem;
1384
+ }
1385
+
1386
+ .brokr-ai-chat-typing span:nth-child(2) {
1387
+ animation-delay: 0.16s;
1388
+ }
1389
+
1390
+ .brokr-ai-chat-typing span:nth-child(3) {
1391
+ animation-delay: 0.32s;
1392
+ }
1393
+ `;
1394
+
1395
+ // src/react/css/chat-extras.ts
1396
+ var CHAT_EXTRAS_CSS = `
1397
+ /* ============================================================
1398
+ AI Chat \u2014 Model Selector Dropdown
1399
+ ============================================================ */
1400
+
1401
+ .brokr-model-selector {
1402
+ position: relative;
1403
+ }
1404
+
1405
+ .brokr-model-trigger {
1406
+ align-items: center;
1407
+ background: var(--brokr-subtle-fill);
1408
+ border: 1px solid var(--brokr-muted-border);
1409
+ border-radius: var(--brokr-radius-button);
1410
+ color: var(--brokr-text-primary);
1411
+ cursor: pointer;
1412
+ display: inline-flex;
1413
+ font: inherit;
1414
+ font-size: var(--brokr-font-size-sm);
1415
+ font-weight: 600;
1416
+ gap: var(--brokr-space-2);
1417
+ min-height: 36px;
1418
+ padding: 0 0.75rem;
1419
+ transition: background-color 120ms ease;
1420
+ white-space: nowrap;
1421
+ }
1422
+
1423
+ .brokr-model-trigger:hover {
1424
+ background: var(--brokr-subtle-fill-strong);
1425
+ }
1426
+
1427
+ .brokr-model-dropdown {
1428
+ animation: brokrModelDrop 120ms ease-out;
1429
+ background: var(--brokr-surface);
1430
+ border: 1px solid var(--brokr-muted-border);
1431
+ border-radius: calc(var(--brokr-radius-card) + 1px);
1432
+ box-shadow: var(--brokr-shadow-md);
1433
+ display: flex;
1434
+ flex-direction: column;
1435
+ min-width: 220px;
1436
+ overflow: hidden;
1437
+ padding: 0.3rem;
1438
+ position: absolute;
1439
+ right: 0;
1440
+ top: calc(100% + 6px);
1441
+ z-index: var(--brokr-z-dropdown);
1442
+ }
1443
+
1444
+ .brokr-model-option {
1445
+ align-items: center;
1446
+ appearance: none;
1447
+ background: transparent;
1448
+ border: none;
1449
+ border-radius: calc(var(--brokr-radius-card) - 1px);
1450
+ color: var(--brokr-text-primary);
1451
+ cursor: pointer;
1452
+ display: flex;
1453
+ font: inherit;
1454
+ font-size: var(--brokr-font-size-sm);
1455
+ gap: var(--brokr-space-2);
1456
+ padding: 0.5rem 0.75rem;
1457
+ text-align: left;
1458
+ transition: background-color 100ms ease;
1459
+ width: 100%;
1460
+ }
1461
+
1462
+ .brokr-model-option:hover:not([data-locked="true"]) {
1463
+ background: var(--brokr-subtle-fill);
1464
+ }
1465
+
1466
+ .brokr-model-option[data-active="true"] {
1467
+ background: color-mix(in srgb, var(--brokr-primary) 8%, transparent);
1468
+ }
1469
+
1470
+ .brokr-model-option[data-locked="true"] {
1471
+ cursor: not-allowed;
1472
+ opacity: 0.45;
1473
+ }
1474
+
1475
+ .brokr-model-option-label {
1476
+ flex: 1;
1477
+ }
1478
+
1479
+ .brokr-model-dot {
1480
+ border-radius: 999px;
1481
+ display: inline-block;
1482
+ flex-shrink: 0;
1483
+ height: 8px;
1484
+ width: 8px;
1485
+ }
1486
+
1487
+ .brokr-model-lock {
1488
+ font-size: 0.7rem;
1489
+ }
1490
+
1491
+ /* ============================================================
1492
+ AI Chat \u2014 Thread row with context menu
1493
+ ============================================================ */
1494
+
1495
+ .brokr-ai-chat-thread-row {
1496
+ align-items: center;
1497
+ display: grid;
1498
+ grid-template-columns: 1fr auto;
1499
+ position: relative;
1500
+ }
1501
+
1502
+ .brokr-ai-chat-thread-row .brokr-ai-chat-conversation {
1503
+ overflow: hidden;
1504
+ text-overflow: ellipsis;
1505
+ white-space: nowrap;
1506
+ width: 100%;
1507
+ }
1508
+
1509
+ .brokr-ai-chat-thread-menu-wrap {
1510
+ flex-shrink: 0;
1511
+ position: relative;
1512
+ }
1513
+
1514
+ .brokr-ai-chat-thread-menu-btn {
1515
+ align-items: center;
1516
+ background: transparent;
1517
+ border: none;
1518
+ border-radius: var(--brokr-radius-button);
1519
+ color: var(--brokr-text-secondary);
1520
+ cursor: pointer;
1521
+ display: inline-flex;
1522
+ height: 28px;
1523
+ justify-content: center;
1524
+ padding: 0;
1525
+ width: 28px;
1526
+ }
1527
+
1528
+ .brokr-ai-chat-thread-menu-btn:hover {
1529
+ background: var(--brokr-subtle-fill-strong);
1530
+ color: var(--brokr-text-primary);
1531
+ }
1532
+
1533
+ .brokr-ai-chat-thread-dropdown {
1534
+ animation: brokrModelDrop 120ms ease-out;
1535
+ background: var(--brokr-surface);
1536
+ border: 1px solid var(--brokr-muted-border);
1537
+ border-radius: var(--brokr-radius-card);
1538
+ box-shadow: var(--brokr-shadow-md);
1539
+ display: flex;
1540
+ flex-direction: column;
1541
+ min-width: 160px;
1542
+ overflow: hidden;
1543
+ padding: 0.3rem;
1544
+ position: absolute;
1545
+ right: 0;
1546
+ top: calc(100% + 4px);
1547
+ z-index: var(--brokr-z-dropdown);
1548
+ }
1549
+
1550
+ .brokr-ai-chat-thread-dropdown-item {
1551
+ align-items: center;
1552
+ appearance: none;
1553
+ background: transparent;
1554
+ border: none;
1555
+ border-radius: calc(var(--brokr-radius-card) - 2px);
1556
+ color: var(--brokr-text-primary);
1557
+ cursor: pointer;
1558
+ display: flex;
1559
+ font: inherit;
1560
+ font-size: var(--brokr-font-size-sm);
1561
+ gap: var(--brokr-space-2);
1562
+ padding: 0.5rem 0.75rem;
1563
+ text-align: left;
1564
+ transition: background-color 100ms ease;
1565
+ width: 100%;
1566
+ }
1567
+
1568
+ .brokr-ai-chat-thread-dropdown-item:hover {
1569
+ background: var(--brokr-subtle-fill);
1570
+ }
1571
+
1572
+ .brokr-ai-chat-thread-dropdown-item[data-tone="danger"] {
1573
+ color: color-mix(in srgb, var(--brokr-error, var(--brokr-primary)) 80%, var(--brokr-text-primary));
1574
+ }
1575
+
1576
+ /* ============================================================
1577
+ AI Chat \u2014 Message copy button
1578
+ ============================================================ */
1579
+
1580
+ .brokr-ai-chat-message-wrap {
1581
+ max-width: min(100%, 720px);
1582
+ position: relative;
1583
+ width: 100%;
1584
+ }
1585
+
1586
+ .brokr-ai-chat-message-wrap .brokr-ai-chat-message-content {
1587
+ max-width: 100%;
1588
+ width: 100%;
1589
+ }
1590
+
1591
+ .brokr-ai-chat-copy-btn {
1592
+ align-items: center;
1593
+ background: var(--brokr-surface);
1594
+ border: 1px solid var(--brokr-muted-border);
1595
+ border-radius: var(--brokr-radius-button);
1596
+ color: var(--brokr-text-secondary);
1597
+ cursor: pointer;
1598
+ display: inline-flex;
1599
+ height: 26px;
1600
+ justify-content: center;
1601
+ opacity: 0;
1602
+ padding: 0;
1603
+ position: absolute;
1604
+ right: 0;
1605
+ top: -4px;
1606
+ transition: opacity 120ms ease, background-color 120ms ease;
1607
+ width: 26px;
1608
+ }
1609
+
1610
+ .brokr-ai-chat-message-wrap:hover .brokr-ai-chat-copy-btn {
1611
+ opacity: 1;
1612
+ }
1613
+
1614
+ .brokr-ai-chat-copy-btn:hover {
1615
+ background: var(--brokr-subtle-fill-strong);
1616
+ color: var(--brokr-text-primary);
1617
+ }
1618
+
1619
+ /* ============================================================
1620
+ AI Chat \u2014 Input layout
1621
+ ============================================================ */
1622
+
1623
+ .brokr-ai-chat-input-row {
1624
+ align-items: stretch;
1625
+ display: flex;
1626
+ gap: var(--brokr-space-2);
1627
+ }
1628
+
1629
+ .brokr-ai-chat-input-container {
1630
+ display: flex;
1631
+ flex-direction: column;
1632
+ gap: var(--brokr-space-2);
1633
+ margin: 0 auto;
1634
+ max-width: 860px;
1635
+ }
1636
+
1637
+ .brokr-ai-chat-composer-actions {
1638
+ display: flex;
1639
+ flex-wrap: wrap;
1640
+ gap: var(--brokr-space-2);
1641
+ }
1642
+
1643
+ /* ============================================================
1644
+ AI Chat \u2014 Variant: no header (variant=3)
1645
+ ============================================================ */
1646
+
1647
+ .brokr-ai-chat-stage[data-noheader="true"] .brokr-ai-chat-thread {
1648
+ padding-top: var(--brokr-space-4);
1649
+ }
1650
+
1651
+ /* ============================================================
1652
+ AI Chat \u2014 Mobile drawer
1653
+ ============================================================ */
1654
+
1655
+ .brokr-ai-chat-drawer-backdrop {
1656
+ background: color-mix(in srgb, var(--brokr-bg) 60%, transparent);
1657
+ backdrop-filter: blur(4px);
1658
+ inset: 0;
1659
+ position: fixed;
1660
+ z-index: var(--brokr-z-drawer-backdrop);
1661
+ }
1662
+
1663
+ .brokr-ai-chat-drawer {
1664
+ animation: brokrDrawerSlideIn 200ms ease-out;
1665
+ background: var(--brokr-surface);
1666
+ border-right: 1px solid var(--brokr-muted-border);
1667
+ display: grid;
1668
+ gap: var(--brokr-space-4);
1669
+ padding: var(--brokr-space-4);
1670
+ align-content: start;
1671
+ overflow-y: auto;
1672
+ height: 100%;
1673
+ left: 0;
1674
+ max-width: 280px;
1675
+ position: fixed;
1676
+ top: 0;
1677
+ width: 80vw;
1678
+ z-index: var(--brokr-z-drawer);
1679
+ }
1680
+
1681
+ .brokr-ai-chat-hamburger {
1682
+ align-items: center;
1683
+ background: var(--brokr-surface);
1684
+ border: 1px solid var(--brokr-muted-border);
1685
+ border-radius: var(--brokr-radius-button);
1686
+ color: var(--brokr-text-secondary);
1687
+ cursor: pointer;
1688
+ display: none;
1689
+ height: 36px;
1690
+ justify-content: center;
1691
+ width: 36px;
1692
+ }
1693
+
1694
+ .brokr-ai-chat-hamburger:hover {
1695
+ background: var(--brokr-subtle-fill);
1696
+ color: var(--brokr-text-primary);
1697
+ }
1698
+
1699
+ .brokr-ai-chat-topbar-left {
1700
+ display: flex;
1701
+ align-items: center;
1702
+ gap: var(--brokr-space-2);
1703
+ }
1704
+
1705
+ /* ============================================================
1706
+ AI Chat \u2014 Rename input
1707
+ ============================================================ */
1708
+
1709
+ .brokr-ai-chat-rename-input {
1710
+ appearance: none;
1711
+ background: var(--brokr-subtle-fill);
1712
+ border: 1px solid var(--brokr-primary);
1713
+ border-radius: var(--brokr-radius-button);
1714
+ color: var(--brokr-text-primary);
1715
+ font: inherit;
1716
+ font-size: var(--brokr-font-size-xs);
1717
+ outline: none;
1718
+ padding: 0.5rem 0.65rem;
1719
+ width: 100%;
1720
+ }
1721
+
1722
+ /* ============================================================
1723
+ AI Chat \u2014 Sentinel (infinite scroll trigger)
1724
+ ============================================================ */
1725
+
1726
+ .brokr-ai-chat-sentinel {
1727
+ min-height: 1px;
1728
+ }
1729
+ `;
1730
+
1731
+ // src/react/css/composites.ts
1732
+ var COMPOSITES_CSS = `
1733
+ .brokr-chat-fab {
1734
+ bottom: var(--brokr-space-6);
1735
+ position: fixed;
1736
+ right: var(--brokr-space-6);
1737
+ z-index: var(--brokr-z-fab);
1738
+ }
1739
+
1740
+ .brokr-chat-panel {
1741
+ display: grid;
1742
+ gap: var(--brokr-space-4);
1743
+ grid-template-rows: auto 1fr auto;
1744
+ height: 100dvh;
1745
+ max-height: 100dvh;
1746
+ min-height: 100dvh;
1747
+ min-width: min(100vw, 420px);
1748
+ padding: var(--brokr-space-5);
1749
+ position: fixed;
1750
+ right: 0;
1751
+ top: 0;
1752
+ width: min(100vw, 420px);
1753
+ z-index: var(--brokr-z-panel);
1754
+ border-bottom-right-radius: 0;
1755
+ border-top-right-radius: 0;
1756
+ }
1757
+
1758
+ .brokr-chat-messages {
1759
+ display: grid;
1760
+ gap: var(--brokr-space-3);
1761
+ overflow: auto;
1762
+ padding-right: var(--brokr-space-1);
1763
+ align-content: start;
1764
+ }
1765
+
1766
+ .brokr-chat-messages[data-empty="true"] {
1767
+ align-content: center;
1768
+ }
1769
+
1770
+ .brokr-chat-bubble {
1771
+ border: 1px solid var(--brokr-muted-border);
1772
+ border-radius: calc(var(--brokr-radius-card) - 2px);
1773
+ line-height: 1.55;
1774
+ max-width: min(100%, 34ch);
1775
+ padding: var(--brokr-space-3) var(--brokr-space-4);
1776
+ white-space: pre-wrap;
1777
+ width: fit-content;
1778
+ }
1779
+
1780
+ .brokr-chat-empty {
1781
+ align-items: center;
1782
+ color: var(--brokr-text-secondary);
1783
+ display: grid;
1784
+ gap: var(--brokr-space-3);
1785
+ justify-items: start;
1786
+ padding: var(--brokr-space-2);
1787
+ }
1788
+
1789
+ .brokr-chat-starters {
1790
+ display: flex;
1791
+ flex-wrap: wrap;
1792
+ gap: var(--brokr-space-2);
1793
+ }
1794
+
1795
+ .brokr-chat-starter {
1796
+ background: var(--brokr-subtle-fill);
1797
+ border: 1px solid var(--brokr-muted-border);
1798
+ border-radius: 999px;
1799
+ color: var(--brokr-text-primary);
1800
+ cursor: pointer;
1801
+ font: inherit;
1802
+ min-height: 36px;
1803
+ padding: 0 0.9rem;
1804
+ }
1805
+
1806
+ .brokr-chat-bubble[data-role="user"] {
1807
+ background: color-mix(in srgb, var(--brokr-primary) 10%, var(--brokr-surface));
1808
+ justify-self: end;
1809
+ max-width: min(100%, 30ch);
1810
+ }
1811
+
1812
+ .brokr-chat-bubble[data-role="assistant"] {
1813
+ background: color-mix(in srgb, var(--brokr-surface) 92%, var(--brokr-bg));
1814
+ justify-self: start;
1815
+ }
1816
+
1817
+ .brokr-chat-input {
1818
+ min-height: 72px;
1819
+ resize: none;
1820
+ }
1821
+
1822
+ .brokr-feedback-shell {
1823
+ display: grid;
1824
+ gap: var(--brokr-space-5);
1825
+ padding: var(--brokr-space-6);
1826
+ }
1827
+
1828
+ .brokr-feedback-rating {
1829
+ display: grid;
1830
+ gap: var(--brokr-space-3);
1831
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1832
+ }
1833
+
1834
+ .brokr-rating-button {
1835
+ align-items: center;
1836
+ background: var(--brokr-subtle-fill);
1837
+ border: 1px solid var(--brokr-muted-border);
1838
+ border-radius: var(--brokr-radius-button);
1839
+ color: var(--brokr-text-primary);
1840
+ cursor: pointer;
1841
+ display: inline-flex;
1842
+ gap: var(--brokr-space-2);
1843
+ justify-content: center;
1844
+ min-height: 44px;
1845
+ }
1846
+
1847
+ .brokr-rating-button[data-active="true"] {
1848
+ background: color-mix(in srgb, var(--brokr-primary) 10%, var(--brokr-bg));
1849
+ border-color: color-mix(in srgb, var(--brokr-primary) 30%, var(--brokr-border));
1850
+ }
1851
+
1852
+ .brokr-upload-shell {
1853
+ display: grid;
1854
+ gap: var(--brokr-space-4);
1855
+ padding: var(--brokr-space-5);
1856
+ }
1857
+
1858
+ .brokr-upload-dropzone {
1859
+ align-items: center;
1860
+ background: color-mix(in srgb, var(--brokr-surface) 60%, var(--brokr-bg));
1861
+ border: 1px dashed color-mix(in srgb, var(--brokr-border) 75%, transparent);
1862
+ border-radius: calc(var(--brokr-radius-card) + 4px);
1863
+ display: grid;
1864
+ gap: var(--brokr-space-3);
1865
+ justify-items: center;
1866
+ min-height: 220px;
1867
+ padding: var(--brokr-space-6);
1868
+ text-align: center;
1869
+ transition: border-color 150ms ease, background-color 150ms ease, transform 150ms ease;
1870
+ }
1871
+
1872
+ .brokr-upload-dropzone[data-drag="true"] {
1873
+ background: color-mix(in srgb, var(--brokr-primary) 8%, var(--brokr-bg));
1874
+ border-color: color-mix(in srgb, var(--brokr-primary) 30%, var(--brokr-border));
1875
+ transform: translateY(-1px);
1876
+ }
1877
+
1878
+ .brokr-upload-file {
1879
+ align-items: center;
1880
+ display: grid;
1881
+ gap: var(--brokr-space-3);
1882
+ grid-template-columns: 1fr auto;
1883
+ padding: var(--brokr-space-3) var(--brokr-space-4);
1884
+ }
1885
+ `;
1886
+
1887
+ // src/react/css/gates.ts
1888
+ var GATES_CSS = `
1889
+ .brokr-plan-card {
1890
+ display: grid;
1891
+ gap: var(--brokr-space-5);
1892
+ min-height: 100%;
1893
+ padding: var(--brokr-space-6);
1894
+ position: relative;
1895
+ }
1896
+
1897
+ .brokr-plan-card[data-highlight="true"] {
1898
+ background: color-mix(in srgb, var(--brokr-surface) 86%, var(--brokr-bg));
1899
+ transform: translateY(-2px);
1900
+ }
1901
+
1902
+ .brokr-plan-price {
1903
+ align-items: baseline;
1904
+ display: flex;
1905
+ gap: var(--brokr-space-2);
1906
+ }
1907
+
1908
+ .brokr-plan-value {
1909
+ font-size: clamp(2rem, 4vw, 3rem);
1910
+ font-weight: 700;
1911
+ letter-spacing: -0.05em;
1912
+ line-height: 1;
1913
+ }
1914
+
1915
+ .brokr-feature-list {
1916
+ display: grid;
1917
+ gap: var(--brokr-space-3);
1918
+ list-style: none;
1919
+ margin: 0;
1920
+ padding: 0;
1921
+ }
1922
+
1923
+ .brokr-feature-item {
1924
+ align-items: flex-start;
1925
+ color: var(--brokr-text-secondary);
1926
+ display: grid;
1927
+ gap: var(--brokr-space-3);
1928
+ grid-template-columns: 1rem 1fr;
1929
+ }
1930
+
1931
+ .brokr-feature-bullet {
1932
+ background: var(--brokr-text-primary);
1933
+ border-radius: 999px;
1934
+ height: 6px;
1935
+ margin-top: 0.45rem;
1936
+ opacity: 0.75;
1937
+ width: 6px;
1938
+ }
1939
+
1940
+ .brokr-gate-card {
1941
+ display: grid;
1942
+ gap: var(--brokr-space-4);
1943
+ padding: var(--brokr-space-5);
1944
+ }
1945
+
1946
+ .brokr-meter {
1947
+ display: grid;
1948
+ gap: var(--brokr-space-3);
1949
+ }
1950
+
1951
+ .brokr-meter-bar {
1952
+ background: var(--brokr-subtle-fill);
1953
+ border-radius: 999px;
1954
+ height: 8px;
1955
+ overflow: hidden;
1956
+ width: 100%;
1957
+ }
1958
+
1959
+ .brokr-meter-fill {
1960
+ background: var(--brokr-primary);
1961
+ border-radius: inherit;
1962
+ height: 100%;
1963
+ transition: width 150ms ease;
1964
+ }
1965
+ `;
1966
+
1967
+ // src/react/css/skeleton.ts
1968
+ var SKELETON_CSS = `
1969
+ .brokr-skeleton {
1970
+ animation: brokrPulse 1.4s ease-in-out infinite;
1971
+ background: linear-gradient(
1972
+ 90deg,
1973
+ color-mix(in srgb, var(--brokr-text-primary) 5%, transparent) 0%,
1974
+ color-mix(in srgb, var(--brokr-text-primary) 10%, transparent) 50%,
1975
+ color-mix(in srgb, var(--brokr-text-primary) 5%, transparent) 100%
1976
+ );
1977
+ background-size: 200% 100%;
1978
+ border-radius: 999px;
1979
+ min-height: 16px;
1980
+ }
1981
+ `;
1982
+
1983
+ // src/react/css/markdown.ts
1984
+ var MARKDOWN_CSS = `
1985
+ /* ============================================================
1986
+ Markdown rendering \u2014 assistant messages
1987
+ ============================================================ */
1988
+
1989
+ .brokr-md p,
1990
+ .brokr-md-paragraph {
1991
+ margin: 0 0 0.6em;
1992
+ line-height: 1.7;
1993
+ }
1994
+
1995
+ .brokr-md p:last-child,
1996
+ .brokr-md-paragraph:last-child {
1997
+ margin-bottom: 0;
1998
+ }
1999
+
2000
+ .brokr-md strong {
2001
+ color: var(--brokr-text-primary);
2002
+ font-weight: 600;
2003
+ }
2004
+
2005
+ .brokr-md em {
2006
+ font-style: italic;
2007
+ }
2008
+
2009
+ .brokr-md-inline-code {
2010
+ background: var(--brokr-subtle-fill-strong);
2011
+ border-radius: 4px;
2012
+ color: var(--brokr-primary);
2013
+ font-family: var(--brokr-font-mono);
2014
+ font-size: 0.85em;
2015
+ padding: 0.15em 0.4em;
2016
+ }
2017
+
2018
+ .brokr-md-link {
2019
+ color: var(--brokr-primary);
2020
+ text-decoration: underline;
2021
+ text-underline-offset: 2px;
2022
+ }
2023
+
2024
+ .brokr-md-link:hover {
2025
+ opacity: 0.8;
2026
+ }
2027
+
2028
+ .brokr-md-heading {
2029
+ color: var(--brokr-text-primary);
2030
+ font-weight: 600;
2031
+ line-height: 1.3;
2032
+ margin: 1.2em 0 0.5em;
2033
+ }
2034
+
2035
+ .brokr-md-heading:first-child {
2036
+ margin-top: 0;
2037
+ }
2038
+
2039
+ .brokr-md-h1 { font-size: 1.25em; }
2040
+ .brokr-md-h2 { font-size: 1.15em; }
2041
+ .brokr-md-h3 { font-size: 1.05em; }
2042
+ .brokr-md-h4,
2043
+ .brokr-md-h5,
2044
+ .brokr-md-h6 { font-size: 0.95em; text-transform: uppercase; letter-spacing: 0.03em; opacity: 0.8; }
2045
+
2046
+ .brokr-md-divider {
2047
+ border: none;
2048
+ border-top: 1px solid var(--brokr-muted-border);
2049
+ margin: 1em 0;
2050
+ }
2051
+
2052
+ .brokr-md-list {
2053
+ list-style: none;
2054
+ margin: 0.5em 0;
2055
+ padding: 0 0 0 1.2em;
2056
+ }
2057
+
2058
+ .brokr-md-list li {
2059
+ line-height: 1.7;
2060
+ margin-bottom: 0.25em;
2061
+ position: relative;
2062
+ }
2063
+
2064
+ .brokr-md-list li::before {
2065
+ content: '\u2022';
2066
+ color: var(--brokr-text-secondary);
2067
+ left: -1em;
2068
+ position: absolute;
2069
+ }
2070
+
2071
+ /* \u2500\u2500\u2500 Code blocks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
2072
+
2073
+ .brokr-md-codeblock {
2074
+ border: 1px solid var(--brokr-muted-border);
2075
+ border-radius: var(--brokr-radius-card);
2076
+ margin: 0.8em 0;
2077
+ overflow: hidden;
2078
+ }
2079
+
2080
+ .brokr-md-codeblock-header {
2081
+ align-items: center;
2082
+ background: var(--brokr-subtle-fill);
2083
+ border-bottom: 1px solid var(--brokr-muted-border);
2084
+ display: flex;
2085
+ font-size: var(--brokr-font-size-xs);
2086
+ justify-content: space-between;
2087
+ padding: 0.4em 0.75em;
2088
+ }
2089
+
2090
+ .brokr-md-codeblock-lang {
2091
+ color: var(--brokr-text-secondary);
2092
+ font-family: var(--brokr-font-mono);
2093
+ font-weight: 500;
2094
+ text-transform: lowercase;
2095
+ }
2096
+
2097
+ .brokr-md-codeblock-copy {
2098
+ align-items: center;
2099
+ background: transparent;
2100
+ border: none;
2101
+ color: var(--brokr-text-secondary);
2102
+ cursor: pointer;
2103
+ display: inline-flex;
2104
+ font: inherit;
2105
+ font-size: var(--brokr-font-size-xs);
2106
+ gap: 0.35em;
2107
+ padding: 0.15em 0.4em;
2108
+ border-radius: var(--brokr-radius-button);
2109
+ transition: color 120ms ease, background 120ms ease;
2110
+ }
2111
+
2112
+ .brokr-md-codeblock-copy:hover {
2113
+ background: var(--brokr-subtle-fill-strong);
2114
+ color: var(--brokr-text-primary);
2115
+ }
2116
+
2117
+ .brokr-md-codeblock-pre {
2118
+ color: var(--brokr-text-primary);
2119
+ font-family: var(--brokr-font-mono);
2120
+ font-size: 0.825em;
2121
+ line-height: 1.6;
2122
+ margin: 0;
2123
+ overflow-x: auto;
2124
+ padding: 0.75em 1em;
2125
+ }
2126
+
2127
+ .brokr-md-codeblock-pre code {
2128
+ background: none;
2129
+ border: none;
2130
+ padding: 0;
2131
+ }
2132
+ `;
2133
+
2134
+ // src/react/css/animations.ts
2135
+ var ANIMATIONS_CSS = `
2136
+ @keyframes brokrPulse {
2137
+ 0% { background-position: 200% 0; }
2138
+ 100% { background-position: -200% 0; }
2139
+ }
2140
+
2141
+ @keyframes brokrFadeIn {
2142
+ from { opacity: 0; transform: translateY(4px); }
2143
+ to { opacity: 1; transform: translateY(0); }
2144
+ }
2145
+
2146
+ @keyframes brokrTypingBounce {
2147
+ 0%, 80%, 100% { opacity: 0.35; transform: translateY(0); }
2148
+ 40% { opacity: 1; transform: translateY(-2px); }
2149
+ }
2150
+
2151
+ @keyframes brokrModelDrop {
2152
+ from { opacity: 0; transform: translateY(-4px); }
2153
+ to { opacity: 1; transform: translateY(0); }
2154
+ }
2155
+
2156
+ @keyframes brokrDrawerSlideIn {
2157
+ from { transform: translateX(-100%); }
2158
+ to { transform: translateX(0); }
2159
+ }
2160
+ `;
2161
+
2162
+ // src/react/css/responsive.ts
2163
+ var RESPONSIVE_CSS = `
2164
+ @media (min-width: 768px) {
2165
+ .brokr-account-panel {
2166
+ grid-template-columns: 214px minmax(0, 1fr);
2167
+ }
2168
+ }
2169
+
2170
+ @media (max-width: 767px) {
2171
+ .brokr-account-panel {
2172
+ grid-template-columns: 1fr;
2173
+ }
2174
+
2175
+ .brokr-account-sidebar {
2176
+ border-bottom: 1px solid var(--brokr-muted-border);
2177
+ border-right: none;
2178
+ gap: var(--brokr-space-3);
2179
+ }
2180
+
2181
+ .brokr-account-tab-list {
2182
+ display: flex;
2183
+ flex-wrap: wrap;
2184
+ }
2185
+
2186
+ .brokr-account-photo-row,
2187
+ .brokr-account-field-row {
2188
+ grid-template-columns: 1fr;
2189
+ }
2190
+
2191
+ .brokr-account-field-body,
2192
+ .brokr-account-actions-row {
2193
+ justify-items: stretch;
2194
+ justify-content: stretch;
2195
+ width: 100%;
2196
+ }
2197
+
2198
+ .brokr-account-static-value,
2199
+ .brokr-account-summary-row {
2200
+ align-items: flex-start;
2201
+ flex-direction: column;
2202
+ }
2203
+ }
2204
+
2205
+ @media (max-width: 980px) {
2206
+ .brokr-auth-shell[data-variant="1"] {
2207
+ grid-template-columns: 1fr;
2208
+ }
2209
+
2210
+ .brokr-auth-shell[data-variant="1"] .brokr-auth-hero {
2211
+ display: none;
2212
+ }
2213
+
2214
+ .brokr-auth-form-pane {
2215
+ min-height: 100vh;
2216
+ padding: var(--brokr-space-4) var(--brokr-space-4) var(--brokr-space-8);
2217
+ }
2218
+ }
2219
+
2220
+ @media (max-width: 640px) {
2221
+ .brokr-auth-card,
2222
+ .brokr-panel,
2223
+ .brokr-card {
2224
+ box-shadow: var(--brokr-shadow-sm);
2225
+ }
2226
+
2227
+ .brokr-auth-card {
2228
+ padding: var(--brokr-space-5);
2229
+ }
2230
+
2231
+ .brokr-chat-fab {
2232
+ bottom: var(--brokr-space-4);
2233
+ right: var(--brokr-space-4);
2234
+ }
2235
+
2236
+ .brokr-ai-chat-shell {
2237
+ grid-template-columns: minmax(0, 1fr);
2238
+ }
2239
+
2240
+ .brokr-ai-chat-sidebar {
2241
+ display: none;
2242
+ }
2243
+
2244
+ .brokr-ai-chat-model-select,
2245
+ .brokr-ai-chat-sidebar-button {
2246
+ width: 100%;
2247
+ }
2248
+
2249
+ .brokr-ai-chat-starters {
2250
+ grid-template-columns: 1fr;
2251
+ }
2252
+
2253
+ .brokr-ai-chat-message-bubble,
2254
+ .brokr-ai-chat-message-content {
2255
+ max-width: 100%;
2256
+ width: min(100%, 100%);
2257
+ }
2258
+
2259
+ .brokr-chat-panel {
2260
+ bottom: 0;
2261
+ border-bottom-left-radius: 0;
2262
+ border-bottom-right-radius: 0;
2263
+ left: 0;
2264
+ max-height: 100dvh;
2265
+ min-height: 100dvh;
2266
+ min-width: 100vw;
2267
+ right: 0;
2268
+ top: auto;
2269
+ width: 100vw;
2270
+ }
2271
+
2272
+ .brokr-popover {
2273
+ left: 50%;
2274
+ right: auto;
2275
+ transform: translateX(-50%);
2276
+ width: min(94vw, 380px);
2277
+ }
2278
+
2279
+ .brokr-feedback-rating {
2280
+ grid-template-columns: 1fr;
2281
+ }
2282
+ }
2283
+
2284
+ /* ============================================================
2285
+ Responsive \u2014 Mobile overrides for drawer
2286
+ ============================================================ */
2287
+
2288
+ @media (max-width: 640px) {
2289
+ .brokr-ai-chat-sidebar-desktop {
2290
+ display: none;
2291
+ }
2292
+
2293
+ .brokr-ai-chat-shell[data-sidebar="true"] {
2294
+ grid-template-columns: minmax(0, 1fr);
2295
+ }
2296
+
2297
+ .brokr-ai-chat-hamburger {
2298
+ display: inline-flex;
2299
+ }
2300
+ }
2301
+ `;
2302
+
2303
+ // src/react/css/notifications.ts
2304
+ var NOTIFICATIONS_CSS = `
2305
+ /* -------------------------------------------------------------------------
2306
+ * Toast Layer \u2014 fixed-position container for auto-fired toasts
2307
+ * ------------------------------------------------------------------------- */
2308
+
2309
+ .brokr-toast-layer {
2310
+ box-sizing: border-box;
2311
+ position: fixed;
2312
+ z-index: var(--brokr-z-toast);
2313
+ display: flex;
2314
+ flex-direction: column;
2315
+ gap: var(--brokr-space-2);
2316
+ padding: var(--brokr-space-4);
2317
+ pointer-events: none;
2318
+ max-width: 400px;
2319
+ width: 100%;
2320
+ }
2321
+
2322
+ .brokr-toast-layer--bottom-right { bottom: 0; right: 0; align-items: flex-end; }
2323
+ .brokr-toast-layer--bottom-left { bottom: 0; left: 0; align-items: flex-start; }
2324
+ .brokr-toast-layer--top-right { top: 0; right: 0; align-items: flex-end; }
2325
+ .brokr-toast-layer--top-left { top: 0; left: 0; align-items: flex-start; }
2326
+ .brokr-toast-layer--top-center { top: 0; left: 50%; transform: translateX(-50%); align-items: center; }
2327
+ .brokr-toast-layer--bottom-center { bottom: 0; left: 50%; transform: translateX(-50%); align-items: center; }
2328
+
2329
+ /* -------------------------------------------------------------------------
2330
+ * Individual Toast
2331
+ * ------------------------------------------------------------------------- */
2332
+
2333
+ .brokr-toast {
2334
+ box-sizing: border-box;
2335
+ pointer-events: auto;
2336
+ display: flex;
2337
+ align-items: flex-start;
2338
+ gap: var(--brokr-space-3);
2339
+ padding: var(--brokr-space-3) var(--brokr-space-4);
2340
+ border-radius: calc(var(--brokr-radius-card) + 2px);
2341
+ background: var(--brokr-toast-bg);
2342
+ border: 1px solid var(--brokr-toast-border);
2343
+ box-shadow: var(--brokr-shadow-md);
2344
+ width: 100%;
2345
+ max-width: 380px;
2346
+ animation: brokr-toast-enter-bottom var(--brokr-duration-slow) ease-out;
2347
+ transition: opacity var(--brokr-duration-slow) var(--brokr-ease), transform var(--brokr-duration-slow) var(--brokr-ease);
2348
+ }
2349
+
2350
+ /* Top positions: slide down from top */
2351
+ .brokr-toast-layer--top-right .brokr-toast,
2352
+ .brokr-toast-layer--top-left .brokr-toast,
2353
+ .brokr-toast-layer--top-center .brokr-toast {
2354
+ animation-name: brokr-toast-enter-top;
2355
+ }
2356
+
2357
+ .brokr-toast-layer--top-right .brokr-toast--exit,
2358
+ .brokr-toast-layer--top-left .brokr-toast--exit,
2359
+ .brokr-toast-layer--top-center .brokr-toast--exit {
2360
+ transform: translateY(-8px);
2361
+ }
2362
+
2363
+ .brokr-toast--exit {
2364
+ opacity: 0;
2365
+ transform: translateY(8px);
2366
+ pointer-events: none;
2367
+ }
2368
+
2369
+ @keyframes brokr-toast-enter-bottom {
2370
+ from { opacity: 0; transform: translateY(12px); }
2371
+ to { opacity: 1; transform: translateY(0); }
2372
+ }
2373
+
2374
+ @keyframes brokr-toast-enter-top {
2375
+ from { opacity: 0; transform: translateY(-12px); }
2376
+ to { opacity: 1; transform: translateY(0); }
2377
+ }
2378
+
2379
+ /* Variant dot */
2380
+ .brokr-toast-icon {
2381
+ flex-shrink: 0;
2382
+ width: 8px;
2383
+ height: 8px;
2384
+ border-radius: var(--brokr-radius-pill);
2385
+ margin-top: 5px;
2386
+ background: var(--brokr-text-secondary);
2387
+ }
2388
+
2389
+ .brokr-toast-icon--success { background: var(--brokr-success, #22c55e); }
2390
+ .brokr-toast-icon--error { background: var(--brokr-error, #ef4444); }
2391
+ .brokr-toast-icon--warning { background: var(--brokr-warning, #f59e0b); }
2392
+ .brokr-toast-icon--default { background: var(--brokr-primary); }
2393
+
2394
+ .brokr-toast-provider-logo {
2395
+ flex-shrink: 0;
2396
+ width: 22px;
2397
+ height: 22px;
2398
+ border-radius: 5px;
2399
+ object-fit: contain;
2400
+ }
2401
+
2402
+ .brokr-toast-content {
2403
+ flex: 1;
2404
+ min-width: 0;
2405
+ display: flex;
2406
+ flex-direction: column;
2407
+ gap: 2px;
2408
+ }
2409
+
2410
+ .brokr-toast-title {
2411
+ font-size: var(--brokr-font-size-xs);
2412
+ font-weight: var(--brokr-font-weight-semibold);
2413
+ color: var(--brokr-toast-text);
2414
+ line-height: var(--brokr-leading-snug);
2415
+ }
2416
+
2417
+ .brokr-toast-message {
2418
+ font-size: var(--brokr-font-size-xs);
2419
+ color: var(--brokr-toast-text-secondary);
2420
+ line-height: var(--brokr-leading-snug);
2421
+ display: -webkit-box;
2422
+ -webkit-line-clamp: 2;
2423
+ -webkit-box-orient: vertical;
2424
+ overflow: hidden;
2425
+ }
2426
+
2427
+ .brokr-toast-dismiss {
2428
+ flex-shrink: 0;
2429
+ display: flex;
2430
+ align-items: center;
2431
+ justify-content: center;
2432
+ width: 24px;
2433
+ height: 24px;
2434
+ border: none;
2435
+ background: transparent;
2436
+ color: var(--brokr-toast-text-secondary);
2437
+ cursor: pointer;
2438
+ border-radius: var(--brokr-radius-button);
2439
+ padding: 0;
2440
+ opacity: 0.5;
2441
+ transition: opacity var(--brokr-duration-base) var(--brokr-ease), background var(--brokr-duration-base) var(--brokr-ease);
2442
+ }
2443
+
2444
+ .brokr-toast-dismiss:hover {
2445
+ opacity: 1;
2446
+ background: color-mix(in srgb, var(--brokr-toast-text) 8%, transparent);
2447
+ }
2448
+
2449
+ /* -------------------------------------------------------------------------
2450
+ * Notification Bell
2451
+ * ------------------------------------------------------------------------- */
2452
+
2453
+ .brokr-notif-bell-wrap {
2454
+ box-sizing: border-box;
2455
+ position: relative;
2456
+ display: inline-flex;
2457
+ }
2458
+
2459
+ .brokr-notif-bell {
2460
+ box-sizing: border-box;
2461
+ display: flex;
2462
+ align-items: center;
2463
+ justify-content: center;
2464
+ width: 36px;
2465
+ height: 36px;
2466
+ border: none;
2467
+ background: transparent;
2468
+ color: var(--brokr-text-secondary);
2469
+ cursor: pointer;
2470
+ border-radius: var(--brokr-radius-button);
2471
+ padding: 0;
2472
+ position: relative;
2473
+ transition: color var(--brokr-duration-base) var(--brokr-ease), background var(--brokr-duration-base) var(--brokr-ease);
2474
+ }
2475
+
2476
+ .brokr-notif-bell:hover {
2477
+ color: var(--brokr-text-primary);
2478
+ background: var(--brokr-subtle-fill);
2479
+ }
2480
+
2481
+ .brokr-notif-badge {
2482
+ position: absolute;
2483
+ top: 2px;
2484
+ right: 2px;
2485
+ min-width: 16px;
2486
+ height: 16px;
2487
+ padding: 0 var(--brokr-space-1);
2488
+ border-radius: var(--brokr-radius-pill);
2489
+ background: var(--brokr-error, #ef4444);
2490
+ color: var(--brokr-primary-contrast);
2491
+ font-size: 10px;
2492
+ font-weight: var(--brokr-font-weight-bold);
2493
+ line-height: 16px;
2494
+ text-align: center;
2495
+ pointer-events: none;
2496
+ }
2497
+
2498
+ /* -------------------------------------------------------------------------
2499
+ * Notification Dropdown (from bell)
2500
+ * ------------------------------------------------------------------------- */
2501
+
2502
+ .brokr-notif-dropdown {
2503
+ box-sizing: border-box;
2504
+ position: absolute;
2505
+ top: calc(100% + 6px);
2506
+ right: 0;
2507
+ width: 360px;
2508
+ max-height: 420px;
2509
+ background: var(--brokr-surface);
2510
+ border: 1px solid var(--brokr-muted-border);
2511
+ border-radius: calc(var(--brokr-radius-card) + 4px);
2512
+ box-shadow: var(--brokr-shadow-lg);
2513
+ overflow: hidden;
2514
+ display: flex;
2515
+ flex-direction: column;
2516
+ z-index: var(--brokr-z-notification);
2517
+ animation: brokr-dropdown-enter var(--brokr-duration-base) ease-out;
2518
+ }
2519
+
2520
+ @keyframes brokr-dropdown-enter {
2521
+ from { opacity: 0; transform: translateY(-4px); }
2522
+ to { opacity: 1; transform: translateY(0); }
2523
+ }
2524
+
2525
+ .brokr-notif-dropdown-header {
2526
+ box-sizing: border-box;
2527
+ display: flex;
2528
+ align-items: center;
2529
+ justify-content: space-between;
2530
+ padding: var(--brokr-space-3) var(--brokr-space-4);
2531
+ border-bottom: 1px solid var(--brokr-muted-border);
2532
+ }
2533
+
2534
+ .brokr-notif-dropdown-title {
2535
+ font-size: var(--brokr-font-size-xs);
2536
+ font-weight: var(--brokr-font-weight-semibold);
2537
+ color: var(--brokr-text-primary);
2538
+ }
2539
+
2540
+ .brokr-notif-mark-all {
2541
+ box-sizing: border-box;
2542
+ border: none;
2543
+ background: transparent;
2544
+ color: var(--brokr-primary);
2545
+ font-size: var(--brokr-font-size-xs);
2546
+ font-weight: var(--brokr-font-weight-medium);
2547
+ cursor: pointer;
2548
+ padding: 2px 6px;
2549
+ border-radius: var(--brokr-radius-sm);
2550
+ transition: background var(--brokr-duration-base) var(--brokr-ease);
2551
+ }
2552
+
2553
+ .brokr-notif-mark-all:hover {
2554
+ background: color-mix(in srgb, var(--brokr-primary) 10%, transparent);
2555
+ }
2556
+
2557
+ .brokr-notif-dropdown-list {
2558
+ box-sizing: border-box;
2559
+ flex: 1;
2560
+ overflow-y: auto;
2561
+ scrollbar-width: thin;
2562
+ scrollbar-color: color-mix(in srgb, var(--brokr-text-primary) 12%, transparent) transparent;
2563
+ }
2564
+
2565
+ /* -------------------------------------------------------------------------
2566
+ * Notification Item (shared between dropdown and full list)
2567
+ * ------------------------------------------------------------------------- */
2568
+
2569
+ .brokr-notif-item,
2570
+ .brokr-notif-list-row {
2571
+ box-sizing: border-box;
2572
+ display: flex;
2573
+ align-items: flex-start;
2574
+ gap: var(--brokr-space-3);
2575
+ padding: var(--brokr-space-3) var(--brokr-space-4);
2576
+ border: none;
2577
+ background: transparent;
2578
+ cursor: pointer;
2579
+ text-align: left;
2580
+ width: 100%;
2581
+ transition: background var(--brokr-duration-base) var(--brokr-ease);
2582
+ border-bottom: 1px solid color-mix(in srgb, var(--brokr-border) 50%, transparent);
2583
+ }
2584
+
2585
+ .brokr-notif-item:hover,
2586
+ .brokr-notif-list-row:hover {
2587
+ background: color-mix(in srgb, var(--brokr-text-primary) 4%, transparent);
2588
+ }
2589
+
2590
+ .brokr-notif-item--unread,
2591
+ .brokr-notif-list-row--unread {
2592
+ background: color-mix(in srgb, var(--brokr-primary) 4%, transparent);
2593
+ }
2594
+
2595
+ .brokr-notif-item-dot {
2596
+ flex-shrink: 0;
2597
+ width: 8px;
2598
+ height: 8px;
2599
+ border-radius: var(--brokr-radius-pill);
2600
+ margin-top: 4px;
2601
+ background: var(--brokr-text-secondary);
2602
+ }
2603
+
2604
+ .brokr-notif-item-dot--success { background: var(--brokr-success, #22c55e); }
2605
+ .brokr-notif-item-dot--error { background: var(--brokr-error, #ef4444); }
2606
+ .brokr-notif-item-dot--warning { background: var(--brokr-warning, #f59e0b); }
2607
+ .brokr-notif-item-dot--default { background: var(--brokr-primary); }
2608
+
2609
+ .brokr-notif-item-logo {
2610
+ flex-shrink: 0;
2611
+ width: 22px;
2612
+ height: 22px;
2613
+ border-radius: 5px;
2614
+ object-fit: contain;
2615
+ margin-top: 1px;
2616
+ }
2617
+
2618
+ .brokr-notif-item-body {
2619
+ flex: 1;
2620
+ min-width: 0;
2621
+ display: flex;
2622
+ flex-direction: column;
2623
+ gap: 2px;
2624
+ }
2625
+
2626
+ .brokr-notif-item-title {
2627
+ font-size: var(--brokr-font-size-xs);
2628
+ font-weight: var(--brokr-font-weight-semibold);
2629
+ color: var(--brokr-text-primary);
2630
+ line-height: var(--brokr-leading-snug);
2631
+ }
2632
+
2633
+ .brokr-notif-item-message {
2634
+ font-size: var(--brokr-font-size-xs);
2635
+ color: var(--brokr-text-secondary);
2636
+ line-height: var(--brokr-leading-snug);
2637
+ display: -webkit-box;
2638
+ -webkit-line-clamp: 2;
2639
+ -webkit-box-orient: vertical;
2640
+ overflow: hidden;
2641
+ }
2642
+
2643
+ .brokr-notif-item-time {
2644
+ flex-shrink: 0;
2645
+ font-size: 11px;
2646
+ color: var(--brokr-text-secondary);
2647
+ opacity: 0.6;
2648
+ margin-top: 2px;
2649
+ white-space: nowrap;
2650
+ }
2651
+
2652
+ /* -------------------------------------------------------------------------
2653
+ * Empty State
2654
+ * ------------------------------------------------------------------------- */
2655
+
2656
+ .brokr-notif-empty {
2657
+ box-sizing: border-box;
2658
+ display: flex;
2659
+ flex-direction: column;
2660
+ align-items: center;
2661
+ justify-content: center;
2662
+ gap: var(--brokr-space-2);
2663
+ padding: var(--brokr-space-10) var(--brokr-space-4);
2664
+ }
2665
+
2666
+ .brokr-notif-empty-text {
2667
+ font-size: var(--brokr-font-size-xs);
2668
+ color: var(--brokr-text-secondary);
2669
+ opacity: 0.6;
2670
+ }
2671
+
2672
+ /* -------------------------------------------------------------------------
2673
+ * Full-page Notification List
2674
+ * ------------------------------------------------------------------------- */
2675
+
2676
+ .brokr-notif-list {
2677
+ box-sizing: border-box;
2678
+ width: 100%;
2679
+ max-width: 640px;
2680
+ display: flex;
2681
+ flex-direction: column;
2682
+ border: 1px solid var(--brokr-muted-border);
2683
+ border-radius: calc(var(--brokr-radius-card) + 4px);
2684
+ background: var(--brokr-surface);
2685
+ overflow: hidden;
2686
+ }
2687
+
2688
+ .brokr-notif-list-header {
2689
+ box-sizing: border-box;
2690
+ display: flex;
2691
+ align-items: center;
2692
+ justify-content: space-between;
2693
+ padding: var(--brokr-space-4) var(--brokr-space-5);
2694
+ border-bottom: 1px solid var(--brokr-muted-border);
2695
+ }
2696
+
2697
+ .brokr-notif-list-title {
2698
+ font-size: var(--brokr-font-size-md);
2699
+ font-weight: var(--brokr-font-weight-semibold);
2700
+ color: var(--brokr-text-primary);
2701
+ }
2702
+
2703
+ .brokr-notif-list-items {
2704
+ box-sizing: border-box;
2705
+ display: flex;
2706
+ flex-direction: column;
2707
+ }
2708
+ `;
2709
+
2710
+ // src/react/css/index.ts
2711
+ var BROKR_GLOBAL_CSS = TOKENS_CSS + RESET_CSS + PRIMITIVES_CSS + AUTH_CSS + GATES_CSS + ACCOUNT_CSS + COMPOSITES_CSS + CHAT_CSS + SKELETON_CSS + ANIMATIONS_CSS + CHAT_EXTRAS_CSS + MARKDOWN_CSS + RESPONSIVE_CSS + NOTIFICATIONS_CSS;
2712
+
2713
+ // src/react/styles-entry.tsx
2714
+ function BrokrStyles() {
2715
+ return /* @__PURE__ */ React.createElement("style", { id: "brokr-sdk-styles", dangerouslySetInnerHTML: { __html: BROKR_GLOBAL_CSS } });
2716
+ }
2717
+ export {
2718
+ BROKR_GLOBAL_CSS,
2719
+ BrokrStyles
2720
+ };