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