@brokr/sdk 1.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. package/dist/account.js +34 -0
  2. package/dist/account.mjs +7 -0
  3. package/dist/auth.js +628 -114
  4. package/dist/auth.mjs +611 -111
  5. package/dist/chat.js +34 -0
  6. package/dist/chat.mjs +7 -0
  7. package/dist/events.js +64 -0
  8. package/dist/events.mjs +37 -0
  9. package/dist/feature.js +6304 -0
  10. package/dist/feature.mjs +6278 -0
  11. package/dist/files.js +428 -0
  12. package/dist/files.mjs +408 -0
  13. package/dist/index.d.ts +18 -2
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +4069 -454
  16. package/dist/index.mjs +4040 -448
  17. package/dist/logs.js +148 -0
  18. package/dist/logs.mjs +124 -0
  19. package/dist/management.js +14 -13
  20. package/dist/management.mjs +14 -13
  21. package/dist/next.js +2725 -0
  22. package/dist/next.mjs +2710 -0
  23. package/dist/notifications.js +140 -0
  24. package/dist/notifications.mjs +110 -0
  25. package/dist/payments.js +32 -0
  26. package/dist/payments.mjs +7 -0
  27. package/dist/react-notifications.js +299 -0
  28. package/dist/react-notifications.mjs +267 -0
  29. package/dist/react-styles.js +2756 -0
  30. package/dist/react-styles.mjs +2720 -0
  31. package/dist/react-theme.js +4196 -0
  32. package/dist/react-theme.mjs +4172 -0
  33. package/dist/react.js +8591 -209
  34. package/dist/react.mjs +8571 -183
  35. package/dist/runtime.js +2113 -385
  36. package/dist/runtime.mjs +2085 -397
  37. package/dist/src/account/config.d.ts +42 -0
  38. package/dist/src/account/config.d.ts.map +1 -0
  39. package/dist/src/account/index.d.ts +3 -0
  40. package/dist/src/account/index.d.ts.map +1 -0
  41. package/dist/src/ai/client.d.ts +58 -0
  42. package/dist/src/ai/client.d.ts.map +1 -0
  43. package/dist/src/ai/conversation-title.d.ts +13 -0
  44. package/dist/src/ai/conversation-title.d.ts.map +1 -0
  45. package/dist/src/ai/types.d.ts +81 -0
  46. package/dist/src/ai/types.d.ts.map +1 -0
  47. package/dist/src/auth.d.ts +133 -20
  48. package/dist/src/auth.d.ts.map +1 -1
  49. package/dist/src/chat/config.d.ts +61 -0
  50. package/dist/src/chat/config.d.ts.map +1 -0
  51. package/dist/src/chat/index.d.ts +3 -0
  52. package/dist/src/chat/index.d.ts.map +1 -0
  53. package/dist/src/chat/sse-parser.d.ts +44 -0
  54. package/dist/src/chat/sse-parser.d.ts.map +1 -0
  55. package/dist/src/dev-console.d.ts +18 -0
  56. package/dist/src/dev-console.d.ts.map +1 -0
  57. package/dist/src/email/client.d.ts +33 -0
  58. package/dist/src/email/client.d.ts.map +1 -0
  59. package/dist/src/email/templates.d.ts +15 -0
  60. package/dist/src/email/templates.d.ts.map +1 -0
  61. package/dist/src/email/types.d.ts +35 -0
  62. package/dist/src/email/types.d.ts.map +1 -0
  63. package/dist/src/env-detect.d.ts +25 -0
  64. package/dist/src/env-detect.d.ts.map +1 -0
  65. package/dist/src/errors.d.ts +53 -0
  66. package/dist/src/errors.d.ts.map +1 -0
  67. package/dist/src/events/client.d.ts +25 -0
  68. package/dist/src/events/client.d.ts.map +1 -0
  69. package/dist/src/events/index.d.ts +9 -0
  70. package/dist/src/events/index.d.ts.map +1 -0
  71. package/dist/src/events/types.d.ts +10 -0
  72. package/dist/src/events/types.d.ts.map +1 -0
  73. package/dist/src/feature/canonical.d.ts +33 -0
  74. package/dist/src/feature/canonical.d.ts.map +1 -0
  75. package/dist/src/feature/create-feature.d.ts +33 -0
  76. package/dist/src/feature/create-feature.d.ts.map +1 -0
  77. package/dist/src/feature/db.d.ts +16 -0
  78. package/dist/src/feature/db.d.ts.map +1 -0
  79. package/dist/src/feature/handlers.d.ts +28 -0
  80. package/dist/src/feature/handlers.d.ts.map +1 -0
  81. package/dist/src/feature/index.d.ts +21 -0
  82. package/dist/src/feature/index.d.ts.map +1 -0
  83. package/dist/src/feature/manifest.d.ts +173 -0
  84. package/dist/src/feature/manifest.d.ts.map +1 -0
  85. package/dist/src/feature/mapping.d.ts +18 -0
  86. package/dist/src/feature/mapping.d.ts.map +1 -0
  87. package/dist/src/feature/runtime.d.ts +45 -0
  88. package/dist/src/feature/runtime.d.ts.map +1 -0
  89. package/dist/src/feature/types.d.ts +65 -0
  90. package/dist/src/feature/types.d.ts.map +1 -0
  91. package/dist/src/files/client.d.ts +28 -0
  92. package/dist/src/files/client.d.ts.map +1 -0
  93. package/dist/src/files/types.d.ts +28 -0
  94. package/dist/src/files/types.d.ts.map +1 -0
  95. package/dist/src/fix-registry.d.ts +8 -0
  96. package/dist/src/fix-registry.d.ts.map +1 -0
  97. package/dist/src/gateway.d.ts +32 -0
  98. package/dist/src/gateway.d.ts.map +1 -0
  99. package/dist/src/logs/capture.d.ts +56 -0
  100. package/dist/src/logs/capture.d.ts.map +1 -0
  101. package/dist/src/logs/index.d.ts +2 -0
  102. package/dist/src/logs/index.d.ts.map +1 -0
  103. package/dist/src/management.d.ts +1 -1
  104. package/dist/src/management.d.ts.map +1 -1
  105. package/dist/src/models.d.ts +32 -0
  106. package/dist/src/models.d.ts.map +1 -0
  107. package/dist/src/next/auth.d.ts +54 -0
  108. package/dist/src/next/auth.d.ts.map +1 -0
  109. package/dist/src/next/chat.d.ts +31 -0
  110. package/dist/src/next/chat.d.ts.map +1 -0
  111. package/dist/src/next/index.d.ts +14 -0
  112. package/dist/src/next/index.d.ts.map +1 -0
  113. package/dist/src/next/notifications.d.ts +67 -0
  114. package/dist/src/next/notifications.d.ts.map +1 -0
  115. package/dist/src/notifications/built-ins.d.ts +9 -0
  116. package/dist/src/notifications/built-ins.d.ts.map +1 -0
  117. package/dist/src/notifications/client.d.ts +38 -0
  118. package/dist/src/notifications/client.d.ts.map +1 -0
  119. package/dist/src/notifications/config.d.ts +71 -0
  120. package/dist/src/notifications/config.d.ts.map +1 -0
  121. package/dist/src/notifications/index.d.ts +6 -0
  122. package/dist/src/notifications/index.d.ts.map +1 -0
  123. package/dist/src/notifications/registry.d.ts +67 -0
  124. package/dist/src/notifications/registry.d.ts.map +1 -0
  125. package/dist/src/notifications/types.d.ts +48 -0
  126. package/dist/src/notifications/types.d.ts.map +1 -0
  127. package/dist/src/payments/client.d.ts +64 -0
  128. package/dist/src/payments/client.d.ts.map +1 -0
  129. package/dist/src/payments/config.d.ts +46 -0
  130. package/dist/src/payments/config.d.ts.map +1 -0
  131. package/dist/src/payments/entitlements.d.ts +48 -0
  132. package/dist/src/payments/entitlements.d.ts.map +1 -0
  133. package/dist/src/payments/types.d.ts +135 -0
  134. package/dist/src/payments/types.d.ts.map +1 -0
  135. package/dist/src/react/BrokrErrorBoundary.d.ts +23 -0
  136. package/dist/src/react/BrokrErrorBoundary.d.ts.map +1 -0
  137. package/dist/src/react/account/AccountPanel.d.ts +12 -0
  138. package/dist/src/react/account/AccountPanel.d.ts.map +1 -0
  139. package/dist/src/react/account/Avatar.d.ts +11 -0
  140. package/dist/src/react/account/Avatar.d.ts.map +1 -0
  141. package/dist/src/react/account/ProfilePhotoButton.d.ts +7 -0
  142. package/dist/src/react/account/ProfilePhotoButton.d.ts.map +1 -0
  143. package/dist/src/react/account/UserButton.d.ts +7 -0
  144. package/dist/src/react/account/UserButton.d.ts.map +1 -0
  145. package/dist/src/react/auth-pages/AuthPageShell.d.ts +9 -0
  146. package/dist/src/react/auth-pages/AuthPageShell.d.ts.map +1 -0
  147. package/dist/src/react/auth-pages/SignInPage.d.ts +9 -0
  148. package/dist/src/react/auth-pages/SignInPage.d.ts.map +1 -0
  149. package/dist/src/react/auth-pages/SignUpPage.d.ts +8 -0
  150. package/dist/src/react/auth-pages/SignUpPage.d.ts.map +1 -0
  151. package/dist/src/react/auth.d.ts +1 -49
  152. package/dist/src/react/auth.d.ts.map +1 -1
  153. package/dist/src/react/chat/AIChat.d.ts +4 -0
  154. package/dist/src/react/chat/AIChat.d.ts.map +1 -0
  155. package/dist/src/react/chat/ChatContext.d.ts +76 -0
  156. package/dist/src/react/chat/ChatContext.d.ts.map +1 -0
  157. package/dist/src/react/chat/ChatInput.d.ts +3 -0
  158. package/dist/src/react/chat/ChatInput.d.ts.map +1 -0
  159. package/dist/src/react/chat/MarkdownRenderer.d.ts +5 -0
  160. package/dist/src/react/chat/MarkdownRenderer.d.ts.map +1 -0
  161. package/dist/src/react/chat/MessageBubble.d.ts +14 -0
  162. package/dist/src/react/chat/MessageBubble.d.ts.map +1 -0
  163. package/dist/src/react/chat/MessagePane.d.ts +10 -0
  164. package/dist/src/react/chat/MessagePane.d.ts.map +1 -0
  165. package/dist/src/react/chat/ModelSelector.d.ts +13 -0
  166. package/dist/src/react/chat/ModelSelector.d.ts.map +1 -0
  167. package/dist/src/react/chat/ThreadSidebar.d.ts +3 -0
  168. package/dist/src/react/chat/ThreadSidebar.d.ts.map +1 -0
  169. package/dist/src/react/chat/index.d.ts +5 -0
  170. package/dist/src/react/chat/index.d.ts.map +1 -0
  171. package/dist/src/react/chat/token-limit.d.ts +14 -0
  172. package/dist/src/react/chat/token-limit.d.ts.map +1 -0
  173. package/dist/src/react/chat/types.d.ts +65 -0
  174. package/dist/src/react/chat/types.d.ts.map +1 -0
  175. package/dist/src/react/chat/useChat.d.ts +57 -0
  176. package/dist/src/react/chat/useChat.d.ts.map +1 -0
  177. package/dist/src/react/composites/FabAI.d.ts +15 -0
  178. package/dist/src/react/composites/FabAI.d.ts.map +1 -0
  179. package/dist/src/react/composites/FeedbackWidget.d.ts +10 -0
  180. package/dist/src/react/composites/FeedbackWidget.d.ts.map +1 -0
  181. package/dist/src/react/composites/SmartUpload.d.ts +12 -0
  182. package/dist/src/react/composites/SmartUpload.d.ts.map +1 -0
  183. package/dist/src/react/config.d.ts +23 -0
  184. package/dist/src/react/config.d.ts.map +1 -0
  185. package/dist/src/react/context.d.ts +4 -0
  186. package/dist/src/react/context.d.ts.map +1 -0
  187. package/dist/src/react/css/account.d.ts +2 -0
  188. package/dist/src/react/css/account.d.ts.map +1 -0
  189. package/dist/src/react/css/animations.d.ts +2 -0
  190. package/dist/src/react/css/animations.d.ts.map +1 -0
  191. package/dist/src/react/css/auth.d.ts +2 -0
  192. package/dist/src/react/css/auth.d.ts.map +1 -0
  193. package/dist/src/react/css/chat-extras.d.ts +2 -0
  194. package/dist/src/react/css/chat-extras.d.ts.map +1 -0
  195. package/dist/src/react/css/chat.d.ts +2 -0
  196. package/dist/src/react/css/chat.d.ts.map +1 -0
  197. package/dist/src/react/css/composites.d.ts +2 -0
  198. package/dist/src/react/css/composites.d.ts.map +1 -0
  199. package/dist/src/react/css/gates.d.ts +2 -0
  200. package/dist/src/react/css/gates.d.ts.map +1 -0
  201. package/dist/src/react/css/index.d.ts +3 -0
  202. package/dist/src/react/css/index.d.ts.map +1 -0
  203. package/dist/src/react/css/markdown.d.ts +2 -0
  204. package/dist/src/react/css/markdown.d.ts.map +1 -0
  205. package/dist/src/react/css/notifications.d.ts +2 -0
  206. package/dist/src/react/css/notifications.d.ts.map +1 -0
  207. package/dist/src/react/css/primitives.d.ts +2 -0
  208. package/dist/src/react/css/primitives.d.ts.map +1 -0
  209. package/dist/src/react/css/reset.d.ts +2 -0
  210. package/dist/src/react/css/reset.d.ts.map +1 -0
  211. package/dist/src/react/css/responsive.d.ts +2 -0
  212. package/dist/src/react/css/responsive.d.ts.map +1 -0
  213. package/dist/src/react/css/skeleton.d.ts +2 -0
  214. package/dist/src/react/css/skeleton.d.ts.map +1 -0
  215. package/dist/src/react/css/tokens.d.ts +2 -0
  216. package/dist/src/react/css/tokens.d.ts.map +1 -0
  217. package/dist/src/react/gates/AuthWall.d.ts +7 -0
  218. package/dist/src/react/gates/AuthWall.d.ts.map +1 -0
  219. package/dist/src/react/gates/BillingBoundary.d.ts +4 -0
  220. package/dist/src/react/gates/BillingBoundary.d.ts.map +1 -0
  221. package/dist/src/react/gates/Gate.d.ts +9 -0
  222. package/dist/src/react/gates/Gate.d.ts.map +1 -0
  223. package/dist/src/react/gates/RequirePlan.d.ts +4 -0
  224. package/dist/src/react/gates/RequirePlan.d.ts.map +1 -0
  225. package/dist/src/react/gates/RequireUser.d.ts +4 -0
  226. package/dist/src/react/gates/RequireUser.d.ts.map +1 -0
  227. package/dist/src/react/gates/UsageGate.d.ts +4 -0
  228. package/dist/src/react/gates/UsageGate.d.ts.map +1 -0
  229. package/dist/src/react/helpers.d.ts +7 -0
  230. package/dist/src/react/helpers.d.ts.map +1 -0
  231. package/dist/src/react/hooks/use-theme.d.ts +15 -0
  232. package/dist/src/react/hooks/use-theme.d.ts.map +1 -0
  233. package/dist/src/react/hooks/use-user.d.ts +12 -0
  234. package/dist/src/react/hooks/use-user.d.ts.map +1 -0
  235. package/dist/src/react/icons.d.ts +26 -0
  236. package/dist/src/react/icons.d.ts.map +1 -0
  237. package/dist/src/react/index.d.ts +48 -0
  238. package/dist/src/react/index.d.ts.map +1 -0
  239. package/dist/src/react/notifications/NotificationBell.d.ts +7 -0
  240. package/dist/src/react/notifications/NotificationBell.d.ts.map +1 -0
  241. package/dist/src/react/notifications/NotificationList.d.ts +7 -0
  242. package/dist/src/react/notifications/NotificationList.d.ts.map +1 -0
  243. package/dist/src/react/notifications/Toast.d.ts +13 -0
  244. package/dist/src/react/notifications/Toast.d.ts.map +1 -0
  245. package/dist/src/react/notifications/index.d.ts +8 -0
  246. package/dist/src/react/notifications/index.d.ts.map +1 -0
  247. package/dist/src/react/notifications/provider.d.ts +14 -0
  248. package/dist/src/react/notifications/provider.d.ts.map +1 -0
  249. package/dist/src/react/notifications/use-notifications.d.ts +24 -0
  250. package/dist/src/react/notifications/use-notifications.d.ts.map +1 -0
  251. package/dist/src/react/payments/AutoReloadToggle.d.ts +6 -0
  252. package/dist/src/react/payments/AutoReloadToggle.d.ts.map +1 -0
  253. package/dist/src/react/payments/Balance.d.ts +8 -0
  254. package/dist/src/react/payments/Balance.d.ts.map +1 -0
  255. package/dist/src/react/payments/CancelSubscription.d.ts +6 -0
  256. package/dist/src/react/payments/CancelSubscription.d.ts.map +1 -0
  257. package/dist/src/react/payments/CheckoutButton.d.ts +7 -0
  258. package/dist/src/react/payments/CheckoutButton.d.ts.map +1 -0
  259. package/dist/src/react/payments/CustomerPortalButton.d.ts +6 -0
  260. package/dist/src/react/payments/CustomerPortalButton.d.ts.map +1 -0
  261. package/dist/src/react/payments/FeatureMeter.d.ts +6 -0
  262. package/dist/src/react/payments/FeatureMeter.d.ts.map +1 -0
  263. package/dist/src/react/payments/Plans.d.ts +8 -0
  264. package/dist/src/react/payments/Plans.d.ts.map +1 -0
  265. package/dist/src/react/payments/TopUpButton.d.ts +8 -0
  266. package/dist/src/react/payments/TopUpButton.d.ts.map +1 -0
  267. package/dist/src/react/payments/UpdateBilling.d.ts +3 -0
  268. package/dist/src/react/payments/UpdateBilling.d.ts.map +1 -0
  269. package/dist/src/react/payments/UpgradePrompt.d.ts +8 -0
  270. package/dist/src/react/payments/UpgradePrompt.d.ts.map +1 -0
  271. package/dist/src/react/primitives/Skeleton.d.ts +15 -0
  272. package/dist/src/react/primitives/Skeleton.d.ts.map +1 -0
  273. package/dist/src/react/provider.d.ts +21 -0
  274. package/dist/src/react/provider.d.ts.map +1 -0
  275. package/dist/src/react/request.d.ts +2 -0
  276. package/dist/src/react/request.d.ts.map +1 -0
  277. package/dist/src/react/styles-entry.d.ts +4 -0
  278. package/dist/src/react/styles-entry.d.ts.map +1 -0
  279. package/dist/src/react/styles.d.ts +2 -0
  280. package/dist/src/react/styles.d.ts.map +1 -0
  281. package/dist/src/react/theme-entry.d.ts +3 -0
  282. package/dist/src/react/theme-entry.d.ts.map +1 -0
  283. package/dist/src/react/theme.d.ts +6 -0
  284. package/dist/src/react/theme.d.ts.map +1 -0
  285. package/dist/src/react/types.d.ts +191 -0
  286. package/dist/src/react/types.d.ts.map +1 -0
  287. package/dist/src/react/use-brokr-theme.d.ts +6 -0
  288. package/dist/src/react/use-brokr-theme.d.ts.map +1 -0
  289. package/dist/src/runtime.d.ts +69 -180
  290. package/dist/src/runtime.d.ts.map +1 -1
  291. package/dist/src/storage/client.d.ts +113 -0
  292. package/dist/src/storage/client.d.ts.map +1 -0
  293. package/dist/src/storage/types.d.ts +60 -0
  294. package/dist/src/storage/types.d.ts.map +1 -0
  295. package/dist/tsconfig.tsbuildinfo +1 -1
  296. package/dist/types.d.ts +2 -2
  297. package/dist/types.d.ts.map +1 -1
  298. package/package.json +70 -9
@@ -0,0 +1,76 @@
1
+ import type { AIChatMessage, AIChatContext, AIChatCommand, Thread } from './types';
2
+ export interface ChatState {
3
+ displayMessages: AIChatMessage[];
4
+ visibleMessages: AIChatMessage[];
5
+ isSubmitting: boolean;
6
+ error: string | null;
7
+ activeId: string | null;
8
+ activeThread: Thread | null;
9
+ renderedTitle: string;
10
+ isTitleLoading: boolean;
11
+ activeModel: string;
12
+ activeProvider: {
13
+ id: string;
14
+ label: string;
15
+ model: string;
16
+ logo: string;
17
+ free: boolean;
18
+ } | undefined;
19
+ selectedModel: string;
20
+ setSelectedModel: (model: string) => void;
21
+ availableProviders: Array<{
22
+ id: string;
23
+ label: string;
24
+ model: string;
25
+ logo: string;
26
+ free: boolean;
27
+ }>;
28
+ sendMessage: (rawText?: string) => Promise<void>;
29
+ startNewChat: () => void;
30
+ selectThread: (id: string | null) => void;
31
+ deleteThread: (threadId: string) => Promise<void>;
32
+ handleCopy: (content: string) => void;
33
+ renamingId: string | null;
34
+ renameValue: string;
35
+ setRenameValue: (v: string) => void;
36
+ startRename: (threadId: string) => void;
37
+ submitRename: () => Promise<void>;
38
+ displaySidebarItems: Array<{
39
+ id: string;
40
+ title: string;
41
+ }>;
42
+ threadsLoading: boolean;
43
+ sidebarOpen: boolean;
44
+ setSidebarOpen: (open: boolean) => void;
45
+ closeSidebar: () => void;
46
+ selectThreadAndCloseSidebar: (id: string | null) => void;
47
+ threadMenuOpenId: string | null;
48
+ setThreadMenuOpenId: (id: string | null) => void;
49
+ hasMoreMessages: boolean;
50
+ loadingOlder: boolean;
51
+ memHasMore: boolean;
52
+ isPersist: boolean;
53
+ scrollContainerRef: React.MutableRefObject<HTMLDivElement | null>;
54
+ sentinelRef: React.MutableRefObject<HTMLDivElement | null>;
55
+ bottomRef: React.MutableRefObject<HTMLDivElement | null>;
56
+ threadMenuRef: React.MutableRefObject<HTMLDivElement | null>;
57
+ textareaRef: React.MutableRefObject<HTMLTextAreaElement | null>;
58
+ input: string;
59
+ setInput: (v: string) => void;
60
+ chatContext: AIChatContext;
61
+ headerCommands: AIChatCommand[];
62
+ composerCommands: AIChatCommand[];
63
+ threadMenuCommands: AIChatCommand[];
64
+ checkout: (params: {
65
+ plan: string;
66
+ }) => Promise<string>;
67
+ user: {
68
+ id?: string;
69
+ email?: string;
70
+ name?: string;
71
+ image?: string;
72
+ } | null;
73
+ }
74
+ export declare const ChatProvider: import("react").Provider<ChatState | null>;
75
+ export declare function useChatState(): ChatState;
76
+ //# sourceMappingURL=ChatContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatContext.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/ChatContext.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare function ChatInput(): React.JSX.Element;
3
+ //# sourceMappingURL=ChatInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatInput.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/ChatInput.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAiC,MAAM,OAAO,CAAC;AActD,wBAAgB,SAAS,sBAsExB"}
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ export declare function MarkdownRenderer({ content }: {
3
+ content: string;
4
+ }): React.JSX.Element;
5
+ //# sourceMappingURL=MarkdownRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownRenderer.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/MarkdownRenderer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA+B,MAAM,OAAO,CAAC;AAsOpD,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,qBAQhE"}
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import type { AIChatMessage } from './types';
3
+ interface MessageBubbleProps {
4
+ message: AIChatMessage;
5
+ isTyping: boolean;
6
+ user: {
7
+ email?: string;
8
+ name?: string;
9
+ image?: string;
10
+ } | null;
11
+ }
12
+ export declare function MessageBubble({ message, isTyping, user }: MessageBubbleProps): React.JSX.Element;
13
+ export {};
14
+ //# sourceMappingURL=MessageBubble.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageBubble.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/MessageBubble.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAK3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,UAAU,kBAAkB;IAC1B,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAChE;AAED,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,kBAAkB,qBA0D5E"}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ interface MessagePaneProps {
3
+ starterPrompts: string[];
4
+ emptyTitle: string;
5
+ emptyCopy: string;
6
+ subtitle?: string;
7
+ }
8
+ export declare function MessagePane({ starterPrompts, emptyTitle, emptyCopy, subtitle }: MessagePaneProps): React.JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=MessagePane.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessagePane.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/MessagePane.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA+B,MAAM,OAAO,CAAC;AAepD,UAAU,gBAAgB;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,gBAAgB,qBA0EhG"}
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { providers } from '../../models';
3
+ interface ModelSelectorProps {
4
+ activeModel: string;
5
+ setSelectedModel: (model: string) => void;
6
+ availableProviders: typeof providers;
7
+ checkout: (params: {
8
+ plan: string;
9
+ }) => Promise<string>;
10
+ }
11
+ export declare function ModelSelector({ activeModel, setSelectedModel, availableProviders, checkout, }: ModelSelectorProps): React.JSX.Element;
12
+ export {};
13
+ //# sourceMappingURL=ModelSelector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelSelector.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/ModelSelector.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAEjF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AA2CzC,UAAU,kBAAkB;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,kBAAkB,EAAE,OAAO,SAAS,CAAC;IACrC,QAAQ,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACzD;AAED,wBAAgB,aAAa,CAAC,EAC5B,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,QAAQ,GACT,EAAE,kBAAkB,qBAoEpB"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare function ThreadSidebar(): React.JSX.Element;
3
+ //# sourceMappingURL=ThreadSidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThreadSidebar.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/ThreadSidebar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA+B,MAAM,OAAO,CAAC;AAmBpD,wBAAgB,aAAa,sBA4F5B"}
@@ -0,0 +1,5 @@
1
+ export { AIChat } from './AIChat';
2
+ export type { AIChatProps, Thread, AIChatMessage, AIChatCommand, AIChatContext } from './types';
3
+ export { useChat } from './useChat';
4
+ export type { UseChatConfig, UseChatReturn } from './useChat';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChG,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Token budget trimming for AI chat context windows.
3
+ *
4
+ * Estimates tokens at ~4 chars/token and trims oldest messages
5
+ * while preserving the system prompt and the latest user message.
6
+ */
7
+ import type { ChatMessage } from '../../ai/types';
8
+ /**
9
+ * Trim messages to fit within a token budget.
10
+ * Keeps: system prompt (if any) + latest user message.
11
+ * Drops: oldest non-system messages first.
12
+ */
13
+ export declare function trimToTokenBudget(messages: ChatMessage[], budget?: number): ChatMessage[];
14
+ //# sourceMappingURL=token-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-limit.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/token-limit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AASlD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,WAAW,EAAE,EACvB,MAAM,GAAE,MAAe,GACtB,WAAW,EAAE,CAqCf"}
@@ -0,0 +1,65 @@
1
+ import type { BrokrUser } from '../types';
2
+ export interface Thread {
3
+ id: string;
4
+ surface: string;
5
+ subject: string | null;
6
+ title: string;
7
+ createdAt: string;
8
+ updatedAt: string;
9
+ messageCount: number;
10
+ }
11
+ export interface AIChatMessage {
12
+ id: string;
13
+ role: 'user' | 'assistant';
14
+ content: string;
15
+ /** Model that generated this message (assistant messages only). */
16
+ model?: string;
17
+ /** Persistence status — allows the UI to show spinners for in-flight messages. */
18
+ status?: 'pending' | 'streaming' | 'complete' | 'error';
19
+ /** AI provider identifier (e.g. 'deepseek', 'openai'). */
20
+ provider?: string;
21
+ }
22
+ export interface AIChatContext {
23
+ thread: Thread | null;
24
+ messages: AIChatMessage[];
25
+ user: BrokrUser | null;
26
+ sendMessage: (content: string) => Promise<void>;
27
+ newThread: () => void;
28
+ setThread: (threadId: string | null) => void;
29
+ }
30
+ export interface AIChatCommand {
31
+ id: string;
32
+ text: string;
33
+ location: 'threadMenu' | 'header' | 'composer';
34
+ show?: (ctx: AIChatContext) => boolean;
35
+ run: (ctx: AIChatContext) => void | Promise<void>;
36
+ }
37
+ export interface AIChatProps {
38
+ endpoint?: string;
39
+ prompt?: string;
40
+ starterPrompts?: string[];
41
+ emptyTitle?: string;
42
+ emptyCopy?: string;
43
+ title?: string;
44
+ subtitle?: string;
45
+ model?: string;
46
+ modelSelector?: boolean;
47
+ variant?: number;
48
+ sidebar?: boolean;
49
+ threadMenu?: boolean;
50
+ autoTitle?: boolean;
51
+ persist?: boolean;
52
+ surface?: string;
53
+ subject?: string;
54
+ commands?: AIChatCommand[];
55
+ threads?: Thread[];
56
+ activeThreadId?: string | null;
57
+ onThreadSelect?: (threadId: string | null) => void;
58
+ onThreadCreate?: (thread: Thread) => void;
59
+ onThreadDelete?: (threadId: string) => void;
60
+ messages?: AIChatMessage[];
61
+ onSendMessage?: (content: string, threadId: string | null) => Promise<string>;
62
+ onMessage?: (msg: AIChatMessage) => void;
63
+ onThreadChange?: (thread: Thread | null) => void;
64
+ }
65
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAM1C,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,MAAM,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;IACxD,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAMD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC9C;AAMD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC/C,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC;IACvC,GAAG,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAMD,MAAM,WAAW,WAAW;IAE1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAGlB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IAGpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAG3B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACnD,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAG9E,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;IACzC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAClD"}
@@ -0,0 +1,57 @@
1
+ import type { Thread, AIChatMessage } from './types';
2
+ export interface UseChatConfig {
3
+ endpoint: string;
4
+ prompt?: string;
5
+ model: string;
6
+ persist: boolean;
7
+ surface: string;
8
+ subject?: string;
9
+ autoTitle: boolean;
10
+ isControlled: boolean;
11
+ threadsProp?: Thread[];
12
+ activeThreadIdProp?: string | null;
13
+ messagesProp?: AIChatMessage[];
14
+ onThreadSelect?: (threadId: string | null) => void;
15
+ onThreadCreate?: (thread: Thread) => void;
16
+ onThreadDelete?: (threadId: string) => void;
17
+ onSendMessage?: (content: string, threadId: string | null) => Promise<string>;
18
+ onMessage?: (msg: AIChatMessage) => void;
19
+ onThreadChange?: (thread: Thread | null) => void;
20
+ userId?: string;
21
+ }
22
+ export interface UseChatReturn {
23
+ displayMessages: AIChatMessage[];
24
+ isSubmitting: boolean;
25
+ error: string | null;
26
+ activeId: string | null;
27
+ activeThread: Thread | null;
28
+ displaySidebarItems: Array<{
29
+ id: string;
30
+ title: string;
31
+ }>;
32
+ threadsLoading: boolean;
33
+ serverThreads: Thread[];
34
+ hasMoreMessages: boolean;
35
+ loadingOlder: boolean;
36
+ sendMessage: (rawText?: string, inputRef?: string) => Promise<void>;
37
+ startNewChat: () => void;
38
+ selectThread: (id: string | null) => void;
39
+ deleteThread: (threadId: string) => Promise<void>;
40
+ renamingId: string | null;
41
+ renameValue: string;
42
+ setRenameValue: (v: string) => void;
43
+ startRename: (threadId: string) => void;
44
+ submitRename: () => Promise<void>;
45
+ input: string;
46
+ setInput: (v: string) => void;
47
+ scrollContainerRef: React.MutableRefObject<HTMLDivElement | null>;
48
+ sentinelRef: React.MutableRefObject<HTMLDivElement | null>;
49
+ bottomRef: React.MutableRefObject<HTMLDivElement | null>;
50
+ textareaRef: React.MutableRefObject<HTMLTextAreaElement | null>;
51
+ loadOlderMessages: () => Promise<void>;
52
+ renderedTitle: string;
53
+ isTitleLoading: boolean;
54
+ isPersist: boolean;
55
+ }
56
+ export declare function useChat(config: UseChatConfig): UseChatReturn;
57
+ //# sourceMappingURL=useChat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChat.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/useChat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import type { ChatMessage } from '../../ai/types';
3
+ export interface FabAIProps {
4
+ model?: string;
5
+ onSendMessage?: (params: {
6
+ messages: ChatMessage[];
7
+ model?: string;
8
+ systemPrompt?: string;
9
+ }) => Promise<string>;
10
+ position?: 'bottom-right' | 'bottom-left';
11
+ starterPrompts?: string[];
12
+ systemPrompt?: string;
13
+ }
14
+ export declare function FabAI({ model, onSendMessage, position, starterPrompts, systemPrompt, }: FabAIProps): React.JSX.Element;
15
+ //# sourceMappingURL=FabAI.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FabAI.d.ts","sourceRoot":"","sources":["../../../../src/react/composites/FabAI.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAgBlD,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE;QACvB,QAAQ,EAAE,WAAW,EAAE,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,GAAG,aAAa,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAOD,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,aAAa,EACb,QAAyB,EACzB,cAAmB,EACnB,YAAY,GACb,EAAE,UAAU,qBA6JZ"}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ export interface FeedbackWidgetProps {
3
+ context?: string;
4
+ onSubmit?: (feedback: {
5
+ rating: 'up' | 'down';
6
+ text?: string;
7
+ }) => void | Promise<void>;
8
+ }
9
+ export declare function FeedbackWidget({ context, onSubmit, }: FeedbackWidgetProps): React.JSX.Element;
10
+ //# sourceMappingURL=FeedbackWidget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FeedbackWidget.d.ts","sourceRoot":"","sources":["../../../../src/react/composites/FeedbackWidget.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAIrD,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAE,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzF;AAED,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,QAAQ,GACT,EAAE,mBAAmB,qBA+FrB"}
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ export interface SmartUploadProps {
3
+ accept?: string;
4
+ maxSize?: number;
5
+ onUpload?: (result: {
6
+ key: string;
7
+ description?: string;
8
+ }) => void;
9
+ purpose?: 'description' | 'text-extraction' | 'general';
10
+ }
11
+ export declare function SmartUpload({ accept, maxSize, onUpload, purpose, }: SmartUploadProps): React.JSX.Element;
12
+ //# sourceMappingURL=SmartUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmartUpload.d.ts","sourceRoot":"","sources":["../../../../src/react/composites/SmartUpload.tsx"],"names":[],"mappings":"AAEA,OAAO,KAMN,MAAM,OAAO,CAAC;AAIf,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACnE,OAAO,CAAC,EAAE,aAAa,GAAG,iBAAiB,GAAG,SAAS,CAAC;CACzD;AAOD,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,OAA2B,EAC3B,QAAQ,EACR,OAAmB,GACpB,EAAE,gBAAgB,qBAyIlB"}
@@ -0,0 +1,23 @@
1
+ import type { ChatConfig } from '../chat/config';
2
+ import type { AccountConfig } from '../account/config';
3
+ /**
4
+ * Per-feature config defaults, assembled by BrokrProvider from individual
5
+ * per-feature props (`chat`, `account`, etc.).
6
+ *
7
+ * Components read from this via `useBrokr().config`.
8
+ * Inline props always take precedence over config defaults.
9
+ */
10
+ export interface BrokrConfig {
11
+ chat?: ChatConfig;
12
+ account?: AccountConfig;
13
+ }
14
+ /**
15
+ * Merge config defaults with inline props.
16
+ * Inline props (non-undefined) always win.
17
+ *
18
+ * `D` is the defaults type (e.g. ChatConfig), `T` is the full props type
19
+ * (e.g. AIChatProps). They don't need to be related — only overlapping
20
+ * keys are merged.
21
+ */
22
+ export declare function filterDefined<D extends object, T extends object>(defaults: D | undefined, overrides: T): T;
23
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/react/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAMvD;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,EAC9D,QAAQ,EAAE,CAAC,GAAG,SAAS,EACvB,SAAS,EAAE,CAAC,GACX,CAAC,CASH"}
@@ -0,0 +1,4 @@
1
+ import type { BrokrContextValue } from './types';
2
+ export declare const BrokrContext: import("react").Context<BrokrContextValue | null>;
3
+ export declare function useBrokr(): BrokrContextValue;
4
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/react/context.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,eAAO,MAAM,YAAY,mDAAgD,CAAC;AAE1E,wBAAgB,QAAQ,IAAI,iBAAiB,CAM5C"}
@@ -0,0 +1,2 @@
1
+ export declare const ACCOUNT_CSS = "\n.brokr-account-trigger {\n align-items: center;\n background: color-mix(in srgb, var(--brokr-surface) 92%, var(--brokr-bg));\n border: 1px solid var(--brokr-muted-border);\n border-radius: calc(var(--brokr-radius-card) + 1px);\n color: var(--brokr-text-primary);\n cursor: pointer;\n display: inline-flex;\n gap: var(--brokr-space-3);\n min-height: 44px;\n padding: 0.4rem 0.55rem 0.4rem 0.45rem;\n}\n\n.brokr-account-trigger[data-display=\"avatar\"] {\n border-radius: 999px;\n gap: 0;\n justify-content: center;\n min-width: 44px;\n padding: 0.35rem;\n}\n\n.brokr-avatar,\n.brokr-avatar-lg {\n align-items: center;\n background: var(--brokr-subtle-fill-strong);\n border-radius: 999px;\n color: var(--brokr-text-primary);\n display: inline-flex;\n font-weight: 700;\n justify-content: center;\n overflow: hidden;\n}\n\n.brokr-avatar { height: 32px; width: 32px; }\n.brokr-avatar-lg { height: 72px; width: 72px; }\n\n.brokr-avatar img,\n.brokr-avatar-lg img {\n display: block;\n height: 100%;\n object-fit: cover;\n width: 100%;\n}\n\n.brokr-popover {\n display: grid;\n gap: var(--brokr-space-3);\n max-height: min(78vh, 760px);\n min-width: 280px;\n overflow: auto;\n padding: var(--brokr-space-3);\n position: absolute;\n right: 0;\n top: calc(100% + 2px);\n width: min(92vw, 320px);\n z-index: var(--brokr-z-popover);\n}\n\n.brokr-popover[data-align=\"start\"] {\n left: 0;\n right: auto;\n}\n\n.brokr-popover-actions {\n display: grid;\n gap: var(--brokr-space-2);\n}\n\n.brokr-session-list,\n.brokr-stack-list {\n display: grid;\n gap: var(--brokr-space-3);\n}\n\n.brokr-session-item {\n align-items: center;\n display: grid;\n gap: var(--brokr-space-3);\n grid-template-columns: 1fr auto;\n}\n\n.brokr-profile-photo {\n align-items: center;\n cursor: pointer;\n display: inline-grid;\n justify-items: center;\n position: relative;\n width: 100%;\n}\n\n.brokr-profile-photo-shell {\n display: grid;\n gap: var(--brokr-space-3);\n justify-items: center;\n}\n\n.brokr-profile-photo-frame {\n align-items: center;\n display: grid;\n justify-items: center;\n min-height: 72px;\n width: 100%;\n}\n\n.brokr-profile-photo-overlay {\n align-items: center;\n background: color-mix(in srgb, var(--brokr-bg) 72%, transparent);\n backdrop-filter: blur(10px);\n border-radius: inherit;\n color: var(--brokr-text-primary);\n display: grid;\n justify-items: center;\n inset: 0;\n opacity: 0;\n position: absolute;\n transition: opacity 150ms ease;\n}\n\n.brokr-profile-photo:hover .brokr-profile-photo-overlay,\n.brokr-profile-photo:focus-within .brokr-profile-photo-overlay {\n opacity: 1;\n}\n\n/* ============================================================\n Account Panel \u2014 Settings surface\n ============================================================ */\n\n.brokr-account-panel {\n background: color-mix(in srgb, var(--brokr-surface) 97%, var(--brokr-bg));\n border: 1px solid var(--brokr-muted-border);\n border-radius: calc(var(--brokr-radius-card) + 4px);\n display: grid;\n gap: 0;\n margin: 0 auto;\n max-width: 1040px;\n min-height: 620px;\n overflow: hidden;\n width: 100%;\n}\n\n.brokr-account-sidebar {\n background: color-mix(in srgb, var(--brokr-surfaceMuted, var(--brokr-surface)) 82%, var(--brokr-bg));\n border-right: 1px solid var(--brokr-muted-border);\n display: grid;\n align-content: start;\n gap: 1.6rem;\n padding: 1.45rem 1.1rem;\n}\n\n.brokr-account-sidebar-group {\n display: grid;\n gap: 0.45rem;\n}\n\n.brokr-account-sidebar-kicker {\n color: var(--brokr-text-secondary);\n font-size: 0.68rem;\n font-weight: 700;\n letter-spacing: 0.12em;\n line-height: 1;\n opacity: 0.8;\n padding: 0 0.55rem;\n text-transform: uppercase;\n}\n\n.brokr-account-tab-list {\n display: grid;\n gap: 0.2rem;\n align-content: start;\n}\n\n.brokr-account-tab {\n align-items: center;\n appearance: none;\n background: transparent;\n border: 1px solid transparent;\n border-radius: calc(var(--brokr-radius-card) - 1px);\n color: var(--brokr-text-secondary);\n cursor: pointer;\n display: inline-flex;\n font: inherit;\n font-size: var(--brokr-font-size-sm);\n font-weight: 600;\n gap: 0.7rem;\n justify-content: flex-start;\n line-height: 1;\n min-height: 38px;\n padding: 0 0.7rem;\n text-align: left;\n width: 100%;\n}\n\n.brokr-account-tab-icon {\n align-items: center;\n color: currentColor;\n display: inline-flex;\n flex-shrink: 0;\n height: 16px;\n justify-content: center;\n line-height: 0;\n width: 16px;\n}\n\n.brokr-account-tab > span:last-child {\n align-items: center;\n display: inline-flex;\n min-height: 1rem;\n}\n\n.brokr-account-tab:hover,\n.brokr-account-tab[data-active=\"true\"] {\n background: color-mix(in srgb, var(--brokr-text-primary) 6%, transparent);\n border-color: var(--brokr-muted-border);\n color: var(--brokr-text-primary);\n}\n\n.brokr-account-surface {\n display: grid;\n align-content: start;\n gap: 1.4rem;\n padding: 1.5rem;\n}\n\n.brokr-account-surface-header {\n display: block;\n padding: 0.1rem 0;\n}\n\n.brokr-account-form,\n.brokr-account-stack {\n display: grid;\n gap: 1rem;\n}\n\n.brokr-account-card {\n background: color-mix(in srgb, var(--brokr-surface) 96%, var(--brokr-bg));\n border: 1px solid var(--brokr-muted-border);\n border-radius: calc(var(--brokr-radius-card) + 1px);\n display: grid;\n gap: 1rem;\n padding: 1.15rem;\n}\n\n.brokr-account-photo-row {\n align-items: center;\n display: flex;\n gap: 1rem;\n min-height: 92px;\n}\n\n.brokr-account-photo-row .brokr-profile-photo-shell {\n gap: 0;\n}\n\n.brokr-account-photo-copy {\n display: grid;\n gap: 0.35rem;\n align-content: center;\n}\n\n.brokr-account-photo-hint {\n align-items: center;\n color: var(--brokr-text-secondary);\n display: inline-flex;\n gap: 0.45rem;\n font-size: var(--brokr-font-size-sm);\n}\n\n.brokr-account-field-list {\n display: grid;\n gap: 0;\n padding: 0;\n}\n\n.brokr-account-field-row {\n display: grid;\n gap: 0.8rem;\n grid-template-columns: 1fr;\n padding: 1.15rem;\n}\n\n.brokr-account-field-row + .brokr-account-field-row {\n border-top: 1px solid var(--brokr-muted-border);\n}\n\n.brokr-account-field-head {\n display: grid;\n gap: 0.25rem;\n max-width: none;\n}\n\n.brokr-account-field-body {\n display: grid;\n gap: var(--brokr-space-2);\n justify-items: stretch;\n min-width: 0;\n width: 100%;\n}\n\n.brokr-account-field-body .brokr-input {\n min-height: 44px;\n width: 100%;\n}\n\n.brokr-account-field-body-static,\n.brokr-account-field-body-actions {\n align-content: center;\n}\n\n.brokr-account-field-body-stack {\n justify-items: stretch;\n}\n\n.brokr-account-static-value {\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n gap: var(--brokr-space-3);\n justify-content: space-between;\n line-height: 1.25;\n width: 100%;\n}\n\n.brokr-account-status-pill {\n align-items: center;\n background: color-mix(in srgb, var(--brokr-text-primary) 6%, transparent);\n border: 1px solid var(--brokr-muted-border);\n border-radius: 999px;\n color: var(--brokr-text-secondary);\n display: inline-flex;\n font-size: 0.75rem;\n font-weight: 600;\n gap: 0.35rem;\n min-height: 28px;\n padding: 0 0.7rem;\n}\n\n.brokr-account-status-pill[data-verified=\"true\"] {\n color: var(--brokr-text-primary);\n}\n\n.brokr-account-actions-row {\n align-items: center;\n display: flex;\n gap: var(--brokr-space-3);\n justify-content: flex-end;\n padding-top: 0.1rem;\n}\n\n.brokr-account-summary-row {\n align-items: center;\n display: flex;\n gap: var(--brokr-space-4);\n justify-content: space-between;\n}\n\n.brokr-account-summary-copy {\n display: grid;\n gap: 0.35rem;\n}\n\n.brokr-account-summary-copy strong {\n color: var(--brokr-text-primary);\n font-size: 1.05rem;\n font-weight: 600;\n letter-spacing: -0.02em;\n}\n\n.brokr-account-summary-kicker {\n color: var(--brokr-text-secondary);\n font-size: 0.72rem;\n font-weight: 700;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n}\n\n.brokr-account-summary-icon {\n align-items: center;\n background: color-mix(in srgb, var(--brokr-text-primary) 6%, transparent);\n border: 1px solid var(--brokr-muted-border);\n border-radius: 10px;\n color: var(--brokr-text-secondary);\n display: inline-flex;\n height: 40px;\n justify-content: center;\n width: 40px;\n}\n\n.brokr-account-session-group {\n border: 1px solid var(--brokr-muted-border);\n border-radius: calc(var(--brokr-radius-card) - 1px);\n display: grid;\n overflow: hidden;\n}\n\n.brokr-account-session-row {\n align-items: center;\n background: color-mix(in srgb, var(--brokr-surface) 98%, var(--brokr-bg));\n display: grid;\n gap: 0.75rem;\n grid-template-columns: 1fr auto;\n padding: 0.85rem 1rem;\n}\n\n.brokr-account-session-row + .brokr-account-session-row {\n border-top: 1px solid var(--brokr-muted-border);\n}\n\n.brokr-account-session-info {\n display: grid;\n gap: 0.15rem;\n min-width: 0;\n}\n\n.brokr-account-session-info strong {\n color: var(--brokr-text-primary);\n font-size: var(--brokr-font-size-sm);\n font-weight: 600;\n}\n\n.brokr-account-session-detail,\n.brokr-account-session-empty {\n color: var(--brokr-text-secondary);\n font-size: var(--brokr-font-size-sm);\n line-height: 1.5;\n}\n\n.brokr-account-danger-zone {\n border-color: color-mix(in srgb, var(--brokr-error, var(--brokr-primary)) 20%, var(--brokr-border));\n}\n\n.brokr-account-link-button {\n appearance: none;\n background: transparent;\n border: 1px solid transparent;\n border-radius: calc(var(--brokr-radius-button) - 2px);\n color: var(--brokr-text-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 0.8125rem;\n font-weight: 600;\n min-height: 34px;\n padding: 0 0.7rem;\n text-decoration: none;\n transition: color 120ms ease, background-color 120ms ease, border-color 120ms ease;\n}\n\n.brokr-account-link-button:hover {\n background: color-mix(in srgb, var(--brokr-text-primary) 5%, transparent);\n border-color: var(--brokr-muted-border);\n color: var(--brokr-text-primary);\n}\n\n.brokr-account-link-button[data-tone=\"danger\"] {\n color: color-mix(in srgb, var(--brokr-error, var(--brokr-primary)) 70%, var(--brokr-text-secondary));\n}\n\n.brokr-account-link-button[data-tone=\"danger\"]:hover {\n color: var(--brokr-error, var(--brokr-primary));\n}\n\n.brokr-account-panel[data-density=\"compact\"] {\n border-radius: calc(var(--brokr-radius-card) + 2px);\n max-width: 100%;\n}\n\n.brokr-account-panel[data-density=\"compact\"] .brokr-account-sidebar {\n border-bottom: 1px solid var(--brokr-muted-border);\n border-right: none;\n gap: var(--brokr-space-3);\n padding: var(--brokr-space-3);\n}\n\n.brokr-account-panel[data-density=\"compact\"] .brokr-account-tab-list {\n display: flex;\n flex-wrap: wrap;\n}\n\n.brokr-account-panel[data-density=\"compact\"] .brokr-account-surface {\n gap: var(--brokr-space-3);\n padding: var(--brokr-space-3);\n}\n\n.brokr-account-menu {\n display: grid;\n gap: var(--brokr-space-3);\n}\n\n.brokr-account-menu-header {\n align-items: center;\n display: grid;\n gap: var(--brokr-space-3);\n grid-template-columns: auto minmax(0, 1fr);\n padding-bottom: var(--brokr-space-2);\n}\n\n.brokr-account-menu-copy {\n display: grid;\n gap: 0.15rem;\n min-width: 0;\n}\n\n.brokr-account-menu-copy strong {\n color: var(--brokr-text-primary);\n font-size: 0.95rem;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.brokr-account-menu-copy span {\n color: var(--brokr-text-secondary);\n font-size: 0.82rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.brokr-account-menu-actions {\n display: grid;\n gap: var(--brokr-space-2);\n padding-top: var(--brokr-space-2);\n border-top: 1px solid var(--brokr-muted-border);\n}\n\n.brokr-account-menu-action {\n align-items: center;\n appearance: none;\n background: transparent;\n border: 1px solid transparent;\n border-radius: calc(var(--brokr-radius-card) - 1px);\n color: var(--brokr-text-primary);\n cursor: pointer;\n display: inline-flex;\n font: inherit;\n font-size: var(--brokr-font-size-sm);\n font-weight: 600;\n gap: 0.65rem;\n justify-content: flex-start;\n min-height: 38px;\n padding: 0 0.75rem;\n}\n\n.brokr-account-menu-action > span:last-child {\n align-items: center;\n display: inline-flex;\n min-height: 1rem;\n}\n\n.brokr-account-menu-action:hover {\n background: color-mix(in srgb, var(--brokr-text-primary) 5%, transparent);\n border-color: var(--brokr-muted-border);\n}\n\n.brokr-account-menu-action-icon {\n align-items: center;\n color: var(--brokr-text-secondary);\n display: inline-flex;\n justify-content: center;\n}\n\n.brokr-modal-backdrop {\n align-items: center;\n background: color-mix(in srgb, var(--brokr-bg) 60%, transparent);\n backdrop-filter: blur(10px);\n display: grid;\n inset: 0;\n padding: var(--brokr-space-6);\n position: fixed;\n z-index: var(--brokr-z-modal-backdrop);\n}\n\n.brokr-modal-dialog {\n max-height: min(90vh, 860px);\n overflow: auto;\n width: min(96vw, 1100px);\n}\n\n.brokr-account-settings-dialog {\n display: grid;\n gap: var(--brokr-space-4);\n padding: var(--brokr-space-4);\n}\n\n.brokr-modal-toolbar {\n display: flex;\n justify-content: flex-end;\n}\n\n.brokr-account-panel[data-density=\"compact\"] .brokr-account-card {\n gap: var(--brokr-space-3);\n padding: var(--brokr-space-3);\n}\n\n.brokr-account-panel[data-density=\"compact\"] .brokr-account-field-row,\n.brokr-account-panel[data-density=\"compact\"] .brokr-account-photo-row {\n gap: var(--brokr-space-3);\n grid-template-columns: 1fr;\n}\n\n.brokr-account-panel[data-density=\"compact\"] .brokr-account-field-body,\n.brokr-account-panel[data-density=\"compact\"] .brokr-account-actions-row {\n justify-items: stretch;\n justify-content: stretch;\n width: 100%;\n}\n\n.brokr-account-panel[data-density=\"compact\"] .brokr-account-static-value,\n.brokr-account-panel[data-density=\"compact\"] .brokr-account-summary-row {\n align-items: flex-start;\n flex-direction: column;\n}\n";
2
+ //# sourceMappingURL=account.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../../../src/react/css/account.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,+3bAsmBvB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const ANIMATIONS_CSS = "\n@keyframes brokrPulse {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n}\n\n@keyframes brokrFadeIn {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n@keyframes brokrTypingBounce {\n 0%, 80%, 100% { opacity: 0.35; transform: translateY(0); }\n 40% { opacity: 1; transform: translateY(-2px); }\n}\n\n@keyframes brokrModelDrop {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n@keyframes brokrDrawerSlideIn {\n from { transform: translateX(-100%); }\n to { transform: translateX(0); }\n}\n";
2
+ //# sourceMappingURL=animations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animations.d.ts","sourceRoot":"","sources":["../../../../src/react/css/animations.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,6oBAyB1B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const AUTH_CSS = "\n.brokr-auth-shell {\n align-items: stretch;\n background: var(--brokr-bg);\n color: var(--brokr-text-primary);\n display: grid;\n min-height: 100vh;\n}\n\n.brokr-auth-shell[data-variant=\"1\"] {\n grid-template-columns: minmax(0, 1.1fr) minmax(360px, 0.9fr);\n}\n\n.brokr-auth-hero {\n display: grid;\n min-height: 40vh;\n overflow: hidden;\n padding: var(--brokr-space-8);\n position: relative;\n}\n\n.brokr-auth-hero::after {\n background: linear-gradient(180deg, transparent 0%, color-mix(in srgb, var(--brokr-bg) 75%, transparent) 100%);\n content: \"\";\n inset: 0;\n pointer-events: none;\n position: absolute;\n}\n\n.brokr-auth-hero-media {\n background-color: var(--brokr-soft-surface);\n background-position: center;\n background-repeat: no-repeat;\n background-size: cover;\n border: 1px solid var(--brokr-muted-border);\n border-radius: calc(var(--brokr-radius-card) + 10px);\n inset: var(--brokr-space-6);\n position: absolute;\n}\n\n.brokr-auth-hero-content {\n align-content: end;\n display: grid;\n gap: var(--brokr-space-4);\n margin-top: auto;\n max-width: 34rem;\n padding: var(--brokr-space-6);\n position: relative;\n z-index: 1;\n}\n\n.brokr-brand-row {\n align-items: center;\n display: inline-flex;\n gap: var(--brokr-space-3);\n}\n\n.brokr-brand-logo {\n border-radius: calc(var(--brokr-radius-card) + 6px);\n display: block;\n height: 40px;\n object-fit: contain;\n width: 40px;\n}\n\n.brokr-brand-name {\n color: var(--brokr-text-primary);\n font-size: var(--brokr-font-size-sm);\n font-weight: 700;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n}\n\n.brokr-auth-form-pane {\n align-items: center;\n display: grid;\n min-height: 100vh;\n padding: var(--brokr-space-8);\n}\n\n.brokr-auth-card {\n display: grid;\n gap: var(--brokr-space-6);\n margin: 0 auto;\n max-width: 28rem;\n padding: var(--brokr-space-8);\n width: 100%;\n}\n\n.brokr-auth-form {\n display: grid;\n gap: var(--brokr-space-4);\n}\n\n.brokr-auth-footer {\n color: var(--brokr-text-secondary);\n display: flex;\n flex-wrap: wrap;\n gap: var(--brokr-space-2);\n justify-content: center;\n}\n\n.brokr-auth-link,\n.brokr-action {\n color: var(--brokr-text-primary);\n cursor: pointer;\n text-decoration: none;\n}\n\n.brokr-auth-link:hover,\n.brokr-action:hover {\n opacity: 0.8;\n}\n";
2
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/react/css/auth.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,qzEAiHpB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const CHAT_EXTRAS_CSS = "\n/* ============================================================\n AI Chat \u2014 Model Selector Dropdown\n ============================================================ */\n\n.brokr-model-selector {\n position: relative;\n}\n\n.brokr-model-trigger {\n align-items: center;\n background: var(--brokr-subtle-fill);\n border: 1px solid var(--brokr-muted-border);\n border-radius: var(--brokr-radius-button);\n color: var(--brokr-text-primary);\n cursor: pointer;\n display: inline-flex;\n font: inherit;\n font-size: var(--brokr-font-size-sm);\n font-weight: 600;\n gap: var(--brokr-space-2);\n min-height: 36px;\n padding: 0 0.75rem;\n transition: background-color 120ms ease;\n white-space: nowrap;\n}\n\n.brokr-model-trigger:hover {\n background: var(--brokr-subtle-fill-strong);\n}\n\n.brokr-model-dropdown {\n animation: brokrModelDrop 120ms ease-out;\n background: var(--brokr-surface);\n border: 1px solid var(--brokr-muted-border);\n border-radius: calc(var(--brokr-radius-card) + 1px);\n box-shadow: var(--brokr-shadow-md);\n display: flex;\n flex-direction: column;\n min-width: 220px;\n overflow: hidden;\n padding: 0.3rem;\n position: absolute;\n right: 0;\n top: calc(100% + 6px);\n z-index: var(--brokr-z-dropdown);\n}\n\n.brokr-model-option {\n align-items: center;\n appearance: none;\n background: transparent;\n border: none;\n border-radius: calc(var(--brokr-radius-card) - 1px);\n color: var(--brokr-text-primary);\n cursor: pointer;\n display: flex;\n font: inherit;\n font-size: var(--brokr-font-size-sm);\n gap: var(--brokr-space-2);\n padding: 0.5rem 0.75rem;\n text-align: left;\n transition: background-color 100ms ease;\n width: 100%;\n}\n\n.brokr-model-option:hover:not([data-locked=\"true\"]) {\n background: var(--brokr-subtle-fill);\n}\n\n.brokr-model-option[data-active=\"true\"] {\n background: color-mix(in srgb, var(--brokr-primary) 8%, transparent);\n}\n\n.brokr-model-option[data-locked=\"true\"] {\n cursor: not-allowed;\n opacity: 0.45;\n}\n\n.brokr-model-option-label {\n flex: 1;\n}\n\n.brokr-model-dot {\n border-radius: 999px;\n display: inline-block;\n flex-shrink: 0;\n height: 8px;\n width: 8px;\n}\n\n.brokr-model-lock {\n font-size: 0.7rem;\n}\n\n/* ============================================================\n AI Chat \u2014 Thread row with context menu\n ============================================================ */\n\n.brokr-ai-chat-thread-row {\n align-items: center;\n display: grid;\n grid-template-columns: 1fr auto;\n position: relative;\n}\n\n.brokr-ai-chat-thread-row .brokr-ai-chat-conversation {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n}\n\n.brokr-ai-chat-thread-menu-wrap {\n flex-shrink: 0;\n position: relative;\n}\n\n.brokr-ai-chat-thread-menu-btn {\n align-items: center;\n background: transparent;\n border: none;\n border-radius: var(--brokr-radius-button);\n color: var(--brokr-text-secondary);\n cursor: pointer;\n display: inline-flex;\n height: 28px;\n justify-content: center;\n padding: 0;\n width: 28px;\n}\n\n.brokr-ai-chat-thread-menu-btn:hover {\n background: var(--brokr-subtle-fill-strong);\n color: var(--brokr-text-primary);\n}\n\n.brokr-ai-chat-thread-dropdown {\n animation: brokrModelDrop 120ms ease-out;\n background: var(--brokr-surface);\n border: 1px solid var(--brokr-muted-border);\n border-radius: var(--brokr-radius-card);\n box-shadow: var(--brokr-shadow-md);\n display: flex;\n flex-direction: column;\n min-width: 160px;\n overflow: hidden;\n padding: 0.3rem;\n position: absolute;\n right: 0;\n top: calc(100% + 4px);\n z-index: var(--brokr-z-dropdown);\n}\n\n.brokr-ai-chat-thread-dropdown-item {\n align-items: center;\n appearance: none;\n background: transparent;\n border: none;\n border-radius: calc(var(--brokr-radius-card) - 2px);\n color: var(--brokr-text-primary);\n cursor: pointer;\n display: flex;\n font: inherit;\n font-size: var(--brokr-font-size-sm);\n gap: var(--brokr-space-2);\n padding: 0.5rem 0.75rem;\n text-align: left;\n transition: background-color 100ms ease;\n width: 100%;\n}\n\n.brokr-ai-chat-thread-dropdown-item:hover {\n background: var(--brokr-subtle-fill);\n}\n\n.brokr-ai-chat-thread-dropdown-item[data-tone=\"danger\"] {\n color: color-mix(in srgb, var(--brokr-error, var(--brokr-primary)) 80%, var(--brokr-text-primary));\n}\n\n/* ============================================================\n AI Chat \u2014 Message copy button\n ============================================================ */\n\n.brokr-ai-chat-message-wrap {\n max-width: min(100%, 720px);\n position: relative;\n width: 100%;\n}\n\n.brokr-ai-chat-message-wrap .brokr-ai-chat-message-content {\n max-width: 100%;\n width: 100%;\n}\n\n.brokr-ai-chat-copy-btn {\n align-items: center;\n background: var(--brokr-surface);\n border: 1px solid var(--brokr-muted-border);\n border-radius: var(--brokr-radius-button);\n color: var(--brokr-text-secondary);\n cursor: pointer;\n display: inline-flex;\n height: 26px;\n justify-content: center;\n opacity: 0;\n padding: 0;\n position: absolute;\n right: 0;\n top: -4px;\n transition: opacity 120ms ease, background-color 120ms ease;\n width: 26px;\n}\n\n.brokr-ai-chat-message-wrap:hover .brokr-ai-chat-copy-btn {\n opacity: 1;\n}\n\n.brokr-ai-chat-copy-btn:hover {\n background: var(--brokr-subtle-fill-strong);\n color: var(--brokr-text-primary);\n}\n\n/* ============================================================\n AI Chat \u2014 Input layout\n ============================================================ */\n\n.brokr-ai-chat-input-row {\n align-items: stretch;\n display: flex;\n gap: var(--brokr-space-2);\n}\n\n.brokr-ai-chat-input-container {\n display: flex;\n flex-direction: column;\n gap: var(--brokr-space-2);\n margin: 0 auto;\n max-width: 860px;\n}\n\n.brokr-ai-chat-composer-actions {\n display: flex;\n flex-wrap: wrap;\n gap: var(--brokr-space-2);\n}\n\n/* ============================================================\n AI Chat \u2014 Variant: no header (variant=3)\n ============================================================ */\n\n.brokr-ai-chat-stage[data-noheader=\"true\"] .brokr-ai-chat-thread {\n padding-top: var(--brokr-space-4);\n}\n\n/* ============================================================\n AI Chat \u2014 Mobile drawer\n ============================================================ */\n\n.brokr-ai-chat-drawer-backdrop {\n background: color-mix(in srgb, var(--brokr-bg) 60%, transparent);\n backdrop-filter: blur(4px);\n inset: 0;\n position: fixed;\n z-index: var(--brokr-z-drawer-backdrop);\n}\n\n.brokr-ai-chat-drawer {\n animation: brokrDrawerSlideIn 200ms ease-out;\n background: var(--brokr-surface);\n border-right: 1px solid var(--brokr-muted-border);\n display: grid;\n gap: var(--brokr-space-4);\n padding: var(--brokr-space-4);\n align-content: start;\n overflow-y: auto;\n height: 100%;\n left: 0;\n max-width: 280px;\n position: fixed;\n top: 0;\n width: 80vw;\n z-index: var(--brokr-z-drawer);\n}\n\n.brokr-ai-chat-hamburger {\n align-items: center;\n background: var(--brokr-surface);\n border: 1px solid var(--brokr-muted-border);\n border-radius: var(--brokr-radius-button);\n color: var(--brokr-text-secondary);\n cursor: pointer;\n display: none;\n height: 36px;\n justify-content: center;\n width: 36px;\n}\n\n.brokr-ai-chat-hamburger:hover {\n background: var(--brokr-subtle-fill);\n color: var(--brokr-text-primary);\n}\n\n.brokr-ai-chat-topbar-left {\n display: flex;\n align-items: center;\n gap: var(--brokr-space-2);\n}\n\n/* ============================================================\n AI Chat \u2014 Rename input\n ============================================================ */\n\n.brokr-ai-chat-rename-input {\n appearance: none;\n background: var(--brokr-subtle-fill);\n border: 1px solid var(--brokr-primary);\n border-radius: var(--brokr-radius-button);\n color: var(--brokr-text-primary);\n font: inherit;\n font-size: var(--brokr-font-size-xs);\n outline: none;\n padding: 0.5rem 0.65rem;\n width: 100%;\n}\n\n/* ============================================================\n AI Chat \u2014 Sentinel (infinite scroll trigger)\n ============================================================ */\n\n.brokr-ai-chat-sentinel {\n min-height: 1px;\n}\n";
2
+ //# sourceMappingURL=chat-extras.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-extras.d.ts","sourceRoot":"","sources":["../../../../src/react/css/chat-extras.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,+vQA6U3B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const CHAT_CSS = "\n.brokr-ai-chat-shell {\n display: grid;\n gap: 0;\n grid-template-columns: minmax(240px, 280px) minmax(0, 1fr);\n overflow: hidden;\n width: 100%;\n}\n\n.brokr-ai-chat-shell[data-sidebar=\"false\"] {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.brokr-ai-chat-sidebar {\n border-right: 1px solid var(--brokr-muted-border);\n display: grid;\n gap: var(--brokr-space-4);\n padding: var(--brokr-space-4);\n align-content: start;\n overflow-y: auto;\n height: 100%;\n max-height: 100%;\n min-height: 0;\n}\n\n.brokr-ai-chat-sidebar-empty {\n display: flex;\n flex: 1;\n align-items: center;\n justify-content: center;\n padding: var(--brokr-space-6) var(--brokr-space-4);\n}\n\n.brokr-ai-chat-sidebar-empty-text {\n color: var(--brokr-text-secondary);\n font-size: var(--brokr-font-size-xs);\n line-height: 1.5;\n text-align: center;\n opacity: 0.6;\n}\n\n.brokr-ai-chat-sidebar-button {\n align-items: center;\n background: transparent;\n border: none;\n border-radius: var(--brokr-radius-button);\n color: var(--brokr-text-secondary);\n cursor: pointer;\n display: inline-flex;\n font: inherit;\n font-size: var(--brokr-font-size-xs);\n font-weight: 500;\n gap: var(--brokr-space-2);\n justify-content: flex-start;\n padding: 0.5rem 0.65rem;\n padding-bottom: 0.65rem;\n margin-bottom: var(--brokr-space-2);\n border-bottom: 1px solid var(--brokr-muted-border);\n border-radius: 0;\n transition: color 120ms ease;\n width: 100%;\n}\n\n.brokr-ai-chat-sidebar-button:hover {\n color: var(--brokr-text-primary);\n}\n\n.brokr-ai-chat-conversations {\n display: grid;\n gap: 2px;\n}\n\n.brokr-ai-chat-conversation {\n appearance: none;\n background: transparent;\n border: none;\n border-radius: var(--brokr-radius-button);\n color: var(--brokr-text-secondary);\n cursor: pointer;\n font: inherit;\n font-size: var(--brokr-font-size-xs);\n font-weight: 400;\n overflow: hidden;\n padding: 0.5rem 0.65rem;\n text-align: left;\n text-overflow: ellipsis;\n transition: color 120ms ease, background 120ms ease;\n white-space: nowrap;\n}\n\n.brokr-ai-chat-conversation:hover {\n color: var(--brokr-text-primary);\n background: var(--brokr-subtle-fill);\n}\n\n.brokr-ai-chat-conversation[data-active=\"true\"] {\n color: var(--brokr-text-primary);\n background: var(--brokr-subtle-fill);\n font-weight: 500;\n}\n\n.brokr-ai-chat-stage {\n height: 100%;\n max-height: 100%;\n min-height: 0;\n width: 100%;\n max-width: 100%;\n min-width: 0;\n overflow: hidden;\n position: relative;\n}\n\n.brokr-ai-chat-topbar {\n align-items: center;\n display: flex;\n flex-direction: row;\n gap: var(--brokr-space-4);\n justify-content: space-between;\n left: 0;\n padding: var(--brokr-space-3);\n pointer-events: none;\n position: absolute;\n right: 0;\n top: 0;\n z-index: var(--brokr-z-chat-float);\n}\n\n.brokr-ai-chat-topbar > * {\n pointer-events: auto;\n}\n\n.brokr-ai-chat-header-title {\n align-items: center;\n display: inline-flex;\n gap: var(--brokr-space-2);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.brokr-ai-chat-title-loading {\n align-items: center;\n color: var(--brokr-text-secondary);\n display: inline-flex;\n gap: 0.3rem;\n}\n\n.brokr-ai-chat-title-loading span {\n animation: brokrTypingBounce 1.2s ease-in-out infinite;\n background: color-mix(in srgb, var(--brokr-text-primary) 50%, transparent);\n border-radius: 999px;\n display: inline-block;\n height: 0.28rem;\n width: 0.28rem;\n}\n\n.brokr-ai-chat-title-loading span:nth-child(2) {\n animation-delay: 0.15s;\n}\n\n.brokr-ai-chat-title-loading span:nth-child(3) {\n animation-delay: 0.3s;\n}\n\n.brokr-ai-chat-topbar-actions {\n align-items: center;\n display: inline-flex;\n gap: var(--brokr-space-2);\n}\n\n.brokr-ai-chat-model-select {\n min-width: 11rem;\n}\n\n.brokr-ai-chat-thread {\n height: 100%;\n min-height: 0;\n overflow-y: auto;\n padding: calc(var(--brokr-space-12) + var(--brokr-space-4)) 0 calc(var(--brokr-space-12) + 4.75rem);\n}\n\n.brokr-ai-chat-thread[data-empty=\"true\"] {\n align-content: center;\n display: grid;\n}\n\n.brokr-ai-chat-thread-inner {\n margin: 0 auto;\n max-width: 860px;\n}\n\n.brokr-ai-chat-message {\n animation: brokrFadeIn 200ms ease;\n margin-bottom: var(--brokr-space-10);\n}\n\n.brokr-ai-chat-model-avatar {\n border-radius: 50%;\n flex-shrink: 0;\n height: 28px;\n object-fit: cover;\n width: 28px;\n}\n\n.brokr-model-logo {\n border-radius: 50%;\n flex-shrink: 0;\n height: 18px;\n object-fit: cover;\n width: 18px;\n}\n\n.brokr-ai-chat-message-row {\n align-items: flex-start;\n display: flex;\n gap: var(--brokr-space-3);\n width: 100%;\n}\n\n.brokr-ai-chat-message-row[data-role=\"user\"] {\n justify-content: flex-end;\n}\n\n.brokr-ai-chat-message-row[data-role=\"assistant\"] {\n justify-content: flex-start;\n}\n\n.brokr-ai-chat-message-content {\n color: var(--brokr-text-secondary);\n font-size: 0.9375rem;\n line-height: 1.7;\n width: min(100%, 720px);\n overflow-wrap: break-word;\n}\n\n.brokr-ai-chat-message-content-user {\n color: var(--brokr-text-primary);\n}\n\n.brokr-ai-chat-message-error {\n color: var(--brokr-error, #ef4444);\n font-size: 0.875rem;\n line-height: 1.5;\n opacity: 0.85;\n}\n\n.brokr-ai-chat-message-bubble {\n background: color-mix(in srgb, var(--brokr-text-primary) 10%, var(--brokr-surface));\n border: 1px solid color-mix(in srgb, var(--brokr-text-primary) 10%, var(--brokr-border));\n border-radius: calc(var(--brokr-radius-card) + 2px);\n box-shadow: var(--brokr-shadow-sm);\n max-width: min(78%, 720px);\n padding: var(--brokr-space-3) var(--brokr-space-4);\n}\n\n.brokr-ai-chat-empty {\n align-items: center;\n display: flex;\n flex-direction: column;\n gap: var(--brokr-space-3);\n justify-content: center;\n margin: 0 auto;\n max-width: 720px;\n padding: var(--brokr-space-8);\n text-align: center;\n}\n\n.brokr-ai-chat-empty .brokr-copy {\n max-width: 42rem;\n}\n\n.brokr-ai-chat-starters {\n display: grid;\n gap: var(--brokr-space-2);\n grid-template-columns: repeat(2, minmax(0, 1fr));\n margin-top: var(--brokr-space-2);\n width: min(100%, 720px);\n}\n\n.brokr-ai-chat-starter {\n align-items: flex-start;\n appearance: none;\n background: transparent;\n border: 1px solid var(--brokr-muted-border);\n border-radius: calc(var(--brokr-radius-card) + 1px);\n color: var(--brokr-text-primary);\n cursor: pointer;\n display: inline-flex;\n font: inherit;\n font-size: var(--brokr-font-size-sm);\n justify-content: flex-start;\n min-height: 58px;\n padding: 0.85rem 1rem;\n text-align: left;\n}\n\n.brokr-ai-chat-starter:hover {\n background: var(--brokr-subtle-fill);\n}\n\n.brokr-ai-chat-input-area {\n bottom: 0;\n left: 0;\n padding: var(--brokr-space-4) 0 var(--brokr-space-5);\n position: absolute;\n right: 0;\n z-index: var(--brokr-z-chat-float);\n}\n\n.brokr-ai-chat-textarea {\n background: var(--brokr-surface);\n border: 1px solid var(--brokr-border);\n border-radius: var(--brokr-radius-input);\n color: var(--brokr-text-primary);\n flex: 1;\n font: inherit;\n line-height: 1.5;\n max-height: 168px;\n min-height: 44px;\n outline: none;\n overflow: hidden;\n padding: var(--brokr-space-3);\n resize: none;\n}\n\n.brokr-ai-chat-textarea:focus {\n border-color: var(--brokr-primary);\n}\n\n.brokr-ai-chat-send {\n align-items: center;\n align-self: stretch;\n background: var(--brokr-primary);\n border: none;\n border-radius: var(--brokr-radius-button);\n color: var(--brokr-primary-contrast);\n cursor: pointer;\n display: inline-flex;\n flex-shrink: 0;\n justify-content: center;\n width: 44px;\n}\n\n.brokr-ai-chat-send:disabled {\n cursor: not-allowed;\n opacity: 0.35;\n}\n\n.brokr-ai-chat-typing {\n align-items: center;\n display: inline-flex;\n gap: 0.4rem;\n min-height: 28px;\n padding: 0.25rem 0;\n}\n\n.brokr-ai-chat-typing span {\n animation: brokrTypingBounce 1.2s ease-in-out infinite;\n background: color-mix(in srgb, var(--brokr-text-primary) 70%, transparent);\n border-radius: 999px;\n display: inline-block;\n height: 0.42rem;\n width: 0.42rem;\n}\n\n.brokr-ai-chat-typing span:nth-child(2) {\n animation-delay: 0.16s;\n}\n\n.brokr-ai-chat-typing span:nth-child(3) {\n animation-delay: 0.32s;\n}\n";
2
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../../src/react/css/chat.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,6pQAoXpB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const COMPOSITES_CSS = "\n.brokr-chat-fab {\n bottom: var(--brokr-space-6);\n position: fixed;\n right: var(--brokr-space-6);\n z-index: var(--brokr-z-fab);\n}\n\n.brokr-chat-panel {\n display: grid;\n gap: var(--brokr-space-4);\n grid-template-rows: auto 1fr auto;\n height: 100dvh;\n max-height: 100dvh;\n min-height: 100dvh;\n min-width: min(100vw, 420px);\n padding: var(--brokr-space-5);\n position: fixed;\n right: 0;\n top: 0;\n width: min(100vw, 420px);\n z-index: var(--brokr-z-panel);\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n\n.brokr-chat-messages {\n display: grid;\n gap: var(--brokr-space-3);\n overflow: auto;\n padding-right: var(--brokr-space-1);\n align-content: start;\n}\n\n.brokr-chat-messages[data-empty=\"true\"] {\n align-content: center;\n}\n\n.brokr-chat-bubble {\n border: 1px solid var(--brokr-muted-border);\n border-radius: calc(var(--brokr-radius-card) - 2px);\n line-height: 1.55;\n max-width: min(100%, 34ch);\n padding: var(--brokr-space-3) var(--brokr-space-4);\n white-space: pre-wrap;\n width: fit-content;\n}\n\n.brokr-chat-empty {\n align-items: center;\n color: var(--brokr-text-secondary);\n display: grid;\n gap: var(--brokr-space-3);\n justify-items: start;\n padding: var(--brokr-space-2);\n}\n\n.brokr-chat-starters {\n display: flex;\n flex-wrap: wrap;\n gap: var(--brokr-space-2);\n}\n\n.brokr-chat-starter {\n background: var(--brokr-subtle-fill);\n border: 1px solid var(--brokr-muted-border);\n border-radius: 999px;\n color: var(--brokr-text-primary);\n cursor: pointer;\n font: inherit;\n min-height: 36px;\n padding: 0 0.9rem;\n}\n\n.brokr-chat-bubble[data-role=\"user\"] {\n background: color-mix(in srgb, var(--brokr-primary) 10%, var(--brokr-surface));\n justify-self: end;\n max-width: min(100%, 30ch);\n}\n\n.brokr-chat-bubble[data-role=\"assistant\"] {\n background: color-mix(in srgb, var(--brokr-surface) 92%, var(--brokr-bg));\n justify-self: start;\n}\n\n.brokr-chat-input {\n min-height: 72px;\n resize: none;\n}\n\n.brokr-feedback-shell {\n display: grid;\n gap: var(--brokr-space-5);\n padding: var(--brokr-space-6);\n}\n\n.brokr-feedback-rating {\n display: grid;\n gap: var(--brokr-space-3);\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n.brokr-rating-button {\n align-items: center;\n background: var(--brokr-subtle-fill);\n border: 1px solid var(--brokr-muted-border);\n border-radius: var(--brokr-radius-button);\n color: var(--brokr-text-primary);\n cursor: pointer;\n display: inline-flex;\n gap: var(--brokr-space-2);\n justify-content: center;\n min-height: 44px;\n}\n\n.brokr-rating-button[data-active=\"true\"] {\n background: color-mix(in srgb, var(--brokr-primary) 10%, var(--brokr-bg));\n border-color: color-mix(in srgb, var(--brokr-primary) 30%, var(--brokr-border));\n}\n\n.brokr-upload-shell {\n display: grid;\n gap: var(--brokr-space-4);\n padding: var(--brokr-space-5);\n}\n\n.brokr-upload-dropzone {\n align-items: center;\n background: color-mix(in srgb, var(--brokr-surface) 60%, var(--brokr-bg));\n border: 1px dashed color-mix(in srgb, var(--brokr-border) 75%, transparent);\n border-radius: calc(var(--brokr-radius-card) + 4px);\n display: grid;\n gap: var(--brokr-space-3);\n justify-items: center;\n min-height: 220px;\n padding: var(--brokr-space-6);\n text-align: center;\n transition: border-color 150ms ease, background-color 150ms ease, transform 150ms ease;\n}\n\n.brokr-upload-dropzone[data-drag=\"true\"] {\n background: color-mix(in srgb, var(--brokr-primary) 8%, var(--brokr-bg));\n border-color: color-mix(in srgb, var(--brokr-primary) 30%, var(--brokr-border));\n transform: translateY(-1px);\n}\n\n.brokr-upload-file {\n align-items: center;\n display: grid;\n gap: var(--brokr-space-3);\n grid-template-columns: 1fr auto;\n padding: var(--brokr-space-3) var(--brokr-space-4);\n}\n";
2
+ //# sourceMappingURL=composites.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composites.d.ts","sourceRoot":"","sources":["../../../../src/react/css/composites.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,g0HAyJ1B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const GATES_CSS = "\n.brokr-plan-card {\n display: grid;\n gap: var(--brokr-space-5);\n min-height: 100%;\n padding: var(--brokr-space-6);\n position: relative;\n}\n\n.brokr-plan-card[data-highlight=\"true\"] {\n background: color-mix(in srgb, var(--brokr-surface) 86%, var(--brokr-bg));\n transform: translateY(-2px);\n}\n\n.brokr-plan-price {\n align-items: baseline;\n display: flex;\n gap: var(--brokr-space-2);\n}\n\n.brokr-plan-value {\n font-size: clamp(2rem, 4vw, 3rem);\n font-weight: 700;\n letter-spacing: -0.05em;\n line-height: 1;\n}\n\n.brokr-feature-list {\n display: grid;\n gap: var(--brokr-space-3);\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.brokr-feature-item {\n align-items: flex-start;\n color: var(--brokr-text-secondary);\n display: grid;\n gap: var(--brokr-space-3);\n grid-template-columns: 1rem 1fr;\n}\n\n.brokr-feature-bullet {\n background: var(--brokr-text-primary);\n border-radius: 999px;\n height: 6px;\n margin-top: 0.45rem;\n opacity: 0.75;\n width: 6px;\n}\n\n.brokr-gate-card {\n display: grid;\n gap: var(--brokr-space-4);\n padding: var(--brokr-space-5);\n}\n\n.brokr-meter {\n display: grid;\n gap: var(--brokr-space-3);\n}\n\n.brokr-meter-bar {\n background: var(--brokr-subtle-fill);\n border-radius: 999px;\n height: 8px;\n overflow: hidden;\n width: 100%;\n}\n\n.brokr-meter-fill {\n background: var(--brokr-primary);\n border-radius: inherit;\n height: 100%;\n transition: width 150ms ease;\n}\n";
2
+ //# sourceMappingURL=gates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gates.d.ts","sourceRoot":"","sources":["../../../../src/react/css/gates.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,28CA6ErB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const BROKR_GLOBAL_CSS: string;
2
+ export declare function createBrokrCSS(overrides?: string): string;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/react/css/index.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,gBAAgB,QAcV,CAAC;AAEpB,wBAAgB,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzD"}
@@ -0,0 +1,2 @@
1
+ export declare const MARKDOWN_CSS = "\n/* ============================================================\n Markdown rendering \u2014 assistant messages\n ============================================================ */\n\n.brokr-md p,\n.brokr-md-paragraph {\n margin: 0 0 0.6em;\n line-height: 1.7;\n}\n\n.brokr-md p:last-child,\n.brokr-md-paragraph:last-child {\n margin-bottom: 0;\n}\n\n.brokr-md strong {\n color: var(--brokr-text-primary);\n font-weight: 600;\n}\n\n.brokr-md em {\n font-style: italic;\n}\n\n.brokr-md-inline-code {\n background: var(--brokr-subtle-fill-strong);\n border-radius: 4px;\n color: var(--brokr-primary);\n font-family: var(--brokr-font-mono);\n font-size: 0.85em;\n padding: 0.15em 0.4em;\n}\n\n.brokr-md-link {\n color: var(--brokr-primary);\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n\n.brokr-md-link:hover {\n opacity: 0.8;\n}\n\n.brokr-md-heading {\n color: var(--brokr-text-primary);\n font-weight: 600;\n line-height: 1.3;\n margin: 1.2em 0 0.5em;\n}\n\n.brokr-md-heading:first-child {\n margin-top: 0;\n}\n\n.brokr-md-h1 { font-size: 1.25em; }\n.brokr-md-h2 { font-size: 1.15em; }\n.brokr-md-h3 { font-size: 1.05em; }\n.brokr-md-h4,\n.brokr-md-h5,\n.brokr-md-h6 { font-size: 0.95em; text-transform: uppercase; letter-spacing: 0.03em; opacity: 0.8; }\n\n.brokr-md-divider {\n border: none;\n border-top: 1px solid var(--brokr-muted-border);\n margin: 1em 0;\n}\n\n.brokr-md-list {\n list-style: none;\n margin: 0.5em 0;\n padding: 0 0 0 1.2em;\n}\n\n.brokr-md-list li {\n line-height: 1.7;\n margin-bottom: 0.25em;\n position: relative;\n}\n\n.brokr-md-list li::before {\n content: '\u2022';\n color: var(--brokr-text-secondary);\n left: -1em;\n position: absolute;\n}\n\n/* \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 */\n\n.brokr-md-codeblock {\n border: 1px solid var(--brokr-muted-border);\n border-radius: var(--brokr-radius-card);\n margin: 0.8em 0;\n overflow: hidden;\n}\n\n.brokr-md-codeblock-header {\n align-items: center;\n background: var(--brokr-subtle-fill);\n border-bottom: 1px solid var(--brokr-muted-border);\n display: flex;\n font-size: var(--brokr-font-size-xs);\n justify-content: space-between;\n padding: 0.4em 0.75em;\n}\n\n.brokr-md-codeblock-lang {\n color: var(--brokr-text-secondary);\n font-family: var(--brokr-font-mono);\n font-weight: 500;\n text-transform: lowercase;\n}\n\n.brokr-md-codeblock-copy {\n align-items: center;\n background: transparent;\n border: none;\n color: var(--brokr-text-secondary);\n cursor: pointer;\n display: inline-flex;\n font: inherit;\n font-size: var(--brokr-font-size-xs);\n gap: 0.35em;\n padding: 0.15em 0.4em;\n border-radius: var(--brokr-radius-button);\n transition: color 120ms ease, background 120ms ease;\n}\n\n.brokr-md-codeblock-copy:hover {\n background: var(--brokr-subtle-fill-strong);\n color: var(--brokr-text-primary);\n}\n\n.brokr-md-codeblock-pre {\n color: var(--brokr-text-primary);\n font-family: var(--brokr-font-mono);\n font-size: 0.825em;\n line-height: 1.6;\n margin: 0;\n overflow-x: auto;\n padding: 0.75em 1em;\n}\n\n.brokr-md-codeblock-pre code {\n background: none;\n border: none;\n padding: 0;\n}\n";
2
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../../src/react/css/markdown.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,s3GAoJxB,CAAC"}