@brokr/sdk 1.0.0 → 2.0.0

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