@brokr/sdk 1.0.0 → 2.0.0

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