@brokr/sdk 2.0.0 → 2.1.1

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 (77) hide show
  1. package/dist/feature.js +22 -2
  2. package/dist/feature.mjs +22 -2
  3. package/dist/index.js +22 -2
  4. package/dist/index.mjs +22 -2
  5. package/dist/next.js +22 -2
  6. package/dist/next.mjs +22 -2
  7. package/dist/react-notifications.js +63 -50
  8. package/dist/react-notifications.mjs +63 -50
  9. package/dist/react-styles.js +386 -169
  10. package/dist/react-styles.mjs +386 -169
  11. package/dist/react-theme.js +6 -4
  12. package/dist/react-theme.mjs +6 -4
  13. package/dist/react.js +644 -317
  14. package/dist/react.mjs +682 -355
  15. package/dist/runtime.js +22 -2
  16. package/dist/runtime.mjs +22 -2
  17. package/dist/src/chat/config.d.ts +2 -0
  18. package/dist/src/chat/config.d.ts.map +1 -1
  19. package/dist/src/gateway.d.ts.map +1 -1
  20. package/dist/src/models.d.ts +2 -0
  21. package/dist/src/models.d.ts.map +1 -1
  22. package/dist/src/react/account/AccountPanel.d.ts.map +1 -1
  23. package/dist/src/react/account/UserButton.d.ts.map +1 -1
  24. package/dist/src/react/chat/AIChat.d.ts.map +1 -1
  25. package/dist/src/react/chat/ChatContext.d.ts +3 -6
  26. package/dist/src/react/chat/ChatContext.d.ts.map +1 -1
  27. package/dist/src/react/chat/ChatInput.d.ts.map +1 -1
  28. package/dist/src/react/chat/MarkdownRenderer.d.ts.map +1 -1
  29. package/dist/src/react/chat/MessagePane.d.ts.map +1 -1
  30. package/dist/src/react/chat/ModelSelector.d.ts +1 -1
  31. package/dist/src/react/chat/ModelSelector.d.ts.map +1 -1
  32. package/dist/src/react/chat/ThreadSidebar.d.ts.map +1 -1
  33. package/dist/src/react/chat/memory.d.ts +12 -0
  34. package/dist/src/react/chat/memory.d.ts.map +1 -0
  35. package/dist/src/react/chat/types.d.ts +6 -0
  36. package/dist/src/react/chat/types.d.ts.map +1 -1
  37. package/dist/src/react/chat/useChat.d.ts +8 -6
  38. package/dist/src/react/chat/useChat.d.ts.map +1 -1
  39. package/dist/src/react/composites/FabAI.d.ts +6 -1
  40. package/dist/src/react/composites/FabAI.d.ts.map +1 -1
  41. package/dist/src/react/composites/fab-context.d.ts +26 -0
  42. package/dist/src/react/composites/fab-context.d.ts.map +1 -0
  43. package/dist/src/react/css/account.d.ts +1 -1
  44. package/dist/src/react/css/account.d.ts.map +1 -1
  45. package/dist/src/react/css/auth.d.ts +1 -1
  46. package/dist/src/react/css/auth.d.ts.map +1 -1
  47. package/dist/src/react/css/chat-extras.d.ts +1 -1
  48. package/dist/src/react/css/chat-extras.d.ts.map +1 -1
  49. package/dist/src/react/css/chat.d.ts +1 -1
  50. package/dist/src/react/css/chat.d.ts.map +1 -1
  51. package/dist/src/react/css/composites.d.ts +1 -1
  52. package/dist/src/react/css/composites.d.ts.map +1 -1
  53. package/dist/src/react/css/gates.d.ts +1 -1
  54. package/dist/src/react/css/gates.d.ts.map +1 -1
  55. package/dist/src/react/css/markdown.d.ts +1 -1
  56. package/dist/src/react/css/markdown.d.ts.map +1 -1
  57. package/dist/src/react/css/notifications.d.ts +1 -1
  58. package/dist/src/react/css/notifications.d.ts.map +1 -1
  59. package/dist/src/react/css/primitives.d.ts +1 -1
  60. package/dist/src/react/css/primitives.d.ts.map +1 -1
  61. package/dist/src/react/css/reset.d.ts +1 -1
  62. package/dist/src/react/css/reset.d.ts.map +1 -1
  63. package/dist/src/react/css/responsive.d.ts +1 -1
  64. package/dist/src/react/css/responsive.d.ts.map +1 -1
  65. package/dist/src/react/css/skeleton.d.ts +1 -1
  66. package/dist/src/react/css/skeleton.d.ts.map +1 -1
  67. package/dist/src/react/css/tokens.d.ts +1 -1
  68. package/dist/src/react/css/tokens.d.ts.map +1 -1
  69. package/dist/src/react/notifications/NotificationBell.d.ts.map +1 -1
  70. package/dist/src/react/notifications/NotificationList.d.ts.map +1 -1
  71. package/dist/src/react/notifications/Toast.d.ts.map +1 -1
  72. package/dist/src/react/payments/Plans.d.ts.map +1 -1
  73. package/dist/src/react/theme.d.ts.map +1 -1
  74. package/dist/src/react/types.d.ts +4 -4
  75. package/dist/src/react/types.d.ts.map +1 -1
  76. package/dist/tsconfig.tsbuildinfo +1 -1
  77. package/package.json +1 -1
package/dist/runtime.js CHANGED
@@ -442,9 +442,29 @@ async function gatewayStream(gatewayUrl, token, path, body, capability) {
442
442
  if (res.status === 401) {
443
443
  throw new BrokrAuthError("Invalid or expired BROKR_TOKEN.", "BROKR_TOKEN_INVALID");
444
444
  }
445
- if (!res.ok || !res.body) {
445
+ if (!res.ok) {
446
+ const body2 = await res.json().catch(() => ({}));
447
+ const errObj = typeof body2.error === "object" && body2.error !== null ? body2.error : void 0;
448
+ const errorData = body2.data ?? errObj?.data ?? body2;
449
+ const errorCode = errorData.errorCode ?? body2.code;
450
+ const hint = errorData.hint;
451
+ const requestId = errorData.requestId ?? res.headers.get("x-request-id");
452
+ const retryable = body2.retryable ?? errorData.retryable;
453
+ const errorStr = typeof body2.error === "string" ? body2.error : void 0;
454
+ const message = body2.message ?? errObj?.message ?? errorStr ?? `${capability} stream failed (HTTP ${res.status})`;
455
+ throw new BrokrError(
456
+ message,
457
+ errorCode ?? `${capability.toUpperCase()}_STREAM_FAILED`,
458
+ capability,
459
+ retryable ?? false,
460
+ errorCode ?? void 0,
461
+ requestId ?? void 0,
462
+ hint ?? void 0
463
+ );
464
+ }
465
+ if (!res.body) {
446
466
  throw new BrokrError(
447
- `${capability} stream failed (HTTP ${res.status})`,
467
+ `${capability} stream failed (empty body)`,
448
468
  `${capability.toUpperCase()}_STREAM_FAILED`,
449
469
  capability
450
470
  );
package/dist/runtime.mjs CHANGED
@@ -392,9 +392,29 @@ async function gatewayStream(gatewayUrl, token, path, body, capability) {
392
392
  if (res.status === 401) {
393
393
  throw new BrokrAuthError("Invalid or expired BROKR_TOKEN.", "BROKR_TOKEN_INVALID");
394
394
  }
395
- if (!res.ok || !res.body) {
395
+ if (!res.ok) {
396
+ const body2 = await res.json().catch(() => ({}));
397
+ const errObj = typeof body2.error === "object" && body2.error !== null ? body2.error : void 0;
398
+ const errorData = body2.data ?? errObj?.data ?? body2;
399
+ const errorCode = errorData.errorCode ?? body2.code;
400
+ const hint = errorData.hint;
401
+ const requestId = errorData.requestId ?? res.headers.get("x-request-id");
402
+ const retryable = body2.retryable ?? errorData.retryable;
403
+ const errorStr = typeof body2.error === "string" ? body2.error : void 0;
404
+ const message = body2.message ?? errObj?.message ?? errorStr ?? `${capability} stream failed (HTTP ${res.status})`;
405
+ throw new BrokrError(
406
+ message,
407
+ errorCode ?? `${capability.toUpperCase()}_STREAM_FAILED`,
408
+ capability,
409
+ retryable ?? false,
410
+ errorCode ?? void 0,
411
+ requestId ?? void 0,
412
+ hint ?? void 0
413
+ );
414
+ }
415
+ if (!res.body) {
396
416
  throw new BrokrError(
397
- `${capability} stream failed (HTTP ${res.status})`,
417
+ `${capability} stream failed (empty body)`,
398
418
  `${capability.toUpperCase()}_STREAM_FAILED`,
399
419
  capability
400
420
  );
@@ -50,6 +50,8 @@ export interface ChatConfig {
50
50
  surface?: string;
51
51
  /** Subject filter for thread queries. */
52
52
  subject?: string;
53
+ /** Structured context injected into the AI's system prompt. */
54
+ memory?: Record<string, unknown>;
53
55
  }
54
56
  /**
55
57
  * Define chat configuration for your app.
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/chat/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,UAAU;IACzB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yEAAyE;IACzE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAEzD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/chat/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,UAAU;IACzB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yEAAyE;IACzE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAEzD"}
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,eAAO,MAAM,WAAW,yBAAyB,CAAC;AAIlD;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,SAAS,CAEjD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAsBnG;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,CAAC,CA8EZ;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,QAAQ,CAAC,CA+CnB"}
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,eAAO,MAAM,WAAW,yBAAyB,CAAC;AAIlD;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,SAAS,CAEjD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAsBnG;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,CAAC,CA8EZ;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,QAAQ,CAAC,CAuEnB"}
@@ -4,6 +4,8 @@
4
4
  * Convenience aliases for common model tiers.
5
5
  * These are resolved by the gateway to actual provider model IDs.
6
6
  */
7
+ /** Sentinel value — omit model from request, let gateway apply stack preference. */
8
+ export declare const STACK_DEFAULT: "__stack_default__";
7
9
  /** Convenience model aliases for common use cases. */
8
10
  export declare const models: {
9
11
  /** Cheapest and fastest model (Deepseek Chat). */
@@ -1 +1 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,sDAAsD;AACtD,eAAO,MAAM,MAAM;IACjB,kDAAkD;;IAElD,0BAA0B;;IAE1B,8CAA8C;;CAEtC,CAAC;AAMX,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,IAAI,EAAE,OAAO,CAAC;IACd,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,SAAS,EAAE,kBAAkB,EAMzC,CAAC;AAEF,oDAAoD;AACpD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAGpF"}
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oFAAoF;AACpF,eAAO,MAAM,aAAa,EAAG,mBAA4B,CAAC;AAE1D,sDAAsD;AACtD,eAAO,MAAM,MAAM;IACjB,kDAAkD;;IAElD,0BAA0B;;IAE1B,8CAA8C;;CAEtC,CAAC;AAMX,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,IAAI,EAAE,OAAO,CAAC;IACd,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,SAAS,EAAE,kBAAkB,EAMzC,CAAC;AAEF,oDAAoD;AACpD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAGpF"}
@@ -1 +1 @@
1
- {"version":3,"file":"AccountPanel.d.ts","sourceRoot":"","sources":["../../../../src/react/account/AccountPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAczE,KAAK,eAAe,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;AAEnE,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,eAAe,EAAE,CAAC;CAC1B;AAiBD,wBAAgB,YAAY,CAAC,WAAW,EAAE,iBAAiB,qBA2T1D"}
1
+ {"version":3,"file":"AccountPanel.d.ts","sourceRoot":"","sources":["../../../../src/react/account/AccountPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAczE,KAAK,eAAe,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;AA6BnE,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,eAAe,EAAE,CAAC;CAC1B;AAiBD,wBAAgB,YAAY,CAAC,WAAW,EAAE,iBAAiB,qBAyT1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"UserButton.d.ts","sourceRoot":"","sources":["../../../../src/react/account/UserButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAMN,MAAM,OAAO,CAAC;AAOf,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC7B;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,WAAW,GACrB,EAAE,eAAe,4BA0HjB"}
1
+ {"version":3,"file":"UserButton.d.ts","sourceRoot":"","sources":["../../../../src/react/account/UserButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAMN,MAAM,OAAO,CAAC;AAOf,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC7B;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,WAAW,GACrB,EAAE,eAAe,4BA8HjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"AIChat.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/AIChat.tsx"],"names":[],"mappings":"AAEA,OAAO,KAMN,MAAM,OAAO,CAAC;AAKf,OAAO,KAAK,EAAiB,WAAW,EAAE,MAAM,SAAS,CAAC;AAuB1D,wBAAgB,MAAM,CAAC,WAAW,EAAE,WAAW,qBA8V9C"}
1
+ {"version":3,"file":"AIChat.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/AIChat.tsx"],"names":[],"mappings":"AAEA,OAAO,KAMN,MAAM,OAAO,CAAC;AAKf,OAAO,KAAK,EAAgC,WAAW,EAAE,MAAM,SAAS,CAAC;AAuBzE,wBAAgB,MAAM,CAAC,WAAW,EAAE,WAAW,qBA+W9C"}
@@ -1,4 +1,4 @@
1
- import type { AIChatMessage, AIChatContext, AIChatCommand, Thread } from './types';
1
+ import type { AIChatMessage, AIChatContext, AIChatCommand, ChatSidebarItem, Thread } from './types';
2
2
  export interface ChatState {
3
3
  displayMessages: AIChatMessage[];
4
4
  visibleMessages: AIChatMessage[];
@@ -17,7 +17,7 @@ export interface ChatState {
17
17
  free: boolean;
18
18
  } | undefined;
19
19
  selectedModel: string;
20
- setSelectedModel: (model: string) => void;
20
+ setSelectedModel: (model: string | null) => void;
21
21
  availableProviders: Array<{
22
22
  id: string;
23
23
  label: string;
@@ -35,10 +35,7 @@ export interface ChatState {
35
35
  setRenameValue: (v: string) => void;
36
36
  startRename: (threadId: string) => void;
37
37
  submitRename: () => Promise<void>;
38
- displaySidebarItems: Array<{
39
- id: string;
40
- title: string;
41
- }>;
38
+ displaySidebarItems: ChatSidebarItem[];
42
39
  threadsLoading: boolean;
43
40
  sidebarOpen: boolean;
44
41
  setSidebarOpen: (open: boolean) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"ChatContext.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/ChatContext.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAMnF,MAAM,WAAW,SAAS;IAExB,eAAe,EAAE,aAAa,EAAE,CAAC;IACjC,eAAe,EAAE,aAAa,EAAE,CAAC;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAGrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IAGxB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;IACtG,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,kBAAkB,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAGrG,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1C,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAGtC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAGlC,mBAAmB,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,2BAA2B,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAGzD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,mBAAmB,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAGjD,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IAGnB,kBAAkB,EAAE,KAAK,CAAC,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAClE,WAAW,EAAE,KAAK,CAAC,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC3D,SAAS,EAAE,KAAK,CAAC,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACzD,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC7D,WAAW,EAAE,KAAK,CAAC,gBAAgB,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IAGhE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAG9B,WAAW,EAAE,aAAa,CAAC;IAC3B,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,gBAAgB,EAAE,aAAa,EAAE,CAAC;IAClC,kBAAkB,EAAE,aAAa,EAAE,CAAC;IAGpC,QAAQ,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAGxD,IAAI,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC7E;AAID,eAAO,MAAM,YAAY,4CAA+B,CAAC;AAEzD,wBAAgB,YAAY,IAAI,SAAS,CAMxC"}
1
+ {"version":3,"file":"ChatContext.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/ChatContext.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatInput.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/ChatInput.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAiC,MAAM,OAAO,CAAC;AAItD,wBAAgB,SAAS,sBA6ExB"}
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"}
@@ -1 +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"}
1
+ {"version":3,"file":"MarkdownRenderer.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/MarkdownRenderer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA+B,MAAM,OAAO,CAAC;AAoUpD,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,qBAQhE"}
@@ -1 +1 @@
1
- {"version":3,"file":"MessagePane.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/MessagePane.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAMvC,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,qBAiFhG"}
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"}
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { providers } from '../../models';
3
3
  interface ModelSelectorProps {
4
4
  activeModel: string;
5
- setSelectedModel: (model: string) => void;
5
+ setSelectedModel: (model: string | null) => void;
6
6
  availableProviders: typeof providers;
7
7
  checkout: (params: {
8
8
  plan: string;
@@ -1 +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;AAEzC,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,qBAkFpB"}
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,EAAiB,MAAM,cAAc,CAAC;AA2CxD,UAAU,kBAAkB;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACjD,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,qBAqFpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadSidebar.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/ThreadSidebar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA+B,MAAM,OAAO,CAAC;AAKpD,wBAAgB,aAAa,sBA8F5B"}
1
+ {"version":3,"file":"ThreadSidebar.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/ThreadSidebar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA+B,MAAM,OAAO,CAAC;AA0DpD,wBAAgB,aAAa,sBA0H5B"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Memory serialization for AI chat context.
3
+ *
4
+ * Converts a developer-provided memory object into a readable key-value block
5
+ * that gets prepended to the system prompt. Client-side only — zero server changes.
6
+ */
7
+ /**
8
+ * Merge a memory object into an existing system prompt.
9
+ * Returns the effective prompt with memory prepended as a structured block.
10
+ */
11
+ export declare function buildEffectivePrompt(prompt: string | undefined, memory: Record<string, unknown> | undefined): string | undefined;
12
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/memory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC1C,MAAM,GAAG,SAAS,CAWpB"}
@@ -19,6 +19,11 @@ export interface AIChatMessage {
19
19
  /** AI provider identifier (e.g. 'deepseek', 'openai'). */
20
20
  provider?: string;
21
21
  }
22
+ export interface ChatSidebarItem {
23
+ id: string;
24
+ title: string;
25
+ updatedAt: string | null;
26
+ }
22
27
  export interface AIChatContext {
23
28
  thread: Thread | null;
24
29
  messages: AIChatMessage[];
@@ -48,6 +53,7 @@ export interface AIChatProps {
48
53
  sidebar?: boolean;
49
54
  threadMenu?: boolean;
50
55
  autoTitle?: boolean;
56
+ memory?: Record<string, unknown>;
51
57
  persist?: boolean;
52
58
  surface?: string;
53
59
  subject?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/types.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,13 @@
1
- import type { Thread, AIChatMessage } from './types';
1
+ import type { Thread, AIChatMessage, ChatSidebarItem } from './types';
2
2
  export interface UseChatConfig {
3
3
  endpoint: string;
4
4
  prompt?: string;
5
- model: string;
5
+ /** Explicit model override. When undefined, the gateway applies the stack's provider preference. */
6
+ explicitModel?: string;
7
+ /** Display model string for optimistic UI (always populated). */
8
+ displayModel: string;
9
+ /** Structured context injected into the AI's system prompt. */
10
+ memory?: Record<string, unknown>;
6
11
  persist: boolean;
7
12
  surface: string;
8
13
  subject?: string;
@@ -25,10 +30,7 @@ export interface UseChatReturn {
25
30
  error: string | null;
26
31
  activeId: string | null;
27
32
  activeThread: Thread | null;
28
- displaySidebarItems: Array<{
29
- id: string;
30
- title: string;
31
- }>;
33
+ displaySidebarItems: ChatSidebarItem[];
32
34
  threadsLoading: boolean;
33
35
  serverThreads: Thread[];
34
36
  hasMoreMessages: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"useChat.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/useChat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useChat.d.ts","sourceRoot":"","sources":["../../../../src/react/chat/useChat.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,12 @@
1
1
  import React from 'react';
2
2
  import type { ChatMessage } from '../../ai/types';
3
+ import { type FabAIAppContext } from './fab-context';
3
4
  export interface FabAIProps {
5
+ /** App identity context. Auto-detected from theme.brand.name. Set to `false` to disable. */
6
+ appContext?: FabAIAppContext | false;
4
7
  model?: string;
8
+ /** Structured context injected into the AI's system prompt. */
9
+ memory?: Record<string, unknown>;
5
10
  onSendMessage?: (params: {
6
11
  messages: ChatMessage[];
7
12
  model?: string;
@@ -11,5 +16,5 @@ export interface FabAIProps {
11
16
  starterPrompts?: string[];
12
17
  systemPrompt?: string;
13
18
  }
14
- export declare function FabAI({ model, onSendMessage, position, starterPrompts, systemPrompt, }: FabAIProps): React.JSX.Element;
19
+ export declare function FabAI({ appContext, model, memory, onSendMessage, position, systemPrompt, }: FabAIProps): React.JSX.Element;
15
20
  //# sourceMappingURL=FabAI.d.ts.map
@@ -1 +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;AAOlD,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,qBA0KZ"}
1
+ {"version":3,"file":"FabAI.d.ts","sourceRoot":"","sources":["../../../../src/react/composites/FabAI.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAiD,MAAM,OAAO,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AASlD,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAE3E,MAAM,WAAW,UAAU;IACzB,4FAA4F;IAC5F,UAAU,CAAC,EAAE,eAAe,GAAG,KAAK,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,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;AAkCD,wBAAgB,KAAK,CAAC,EACpB,UAAU,EACV,KAAK,EACL,MAAM,EACN,aAAa,EACb,QAAyB,EACzB,YAAY,GACb,EAAE,UAAU,qBA6MZ"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * FabAI auto-context — reads theme.brand.name to build an identity-aware system prompt.
3
+ *
4
+ * Zero DOM access. The brand name is already a required field in BrokrThemeDef,
5
+ * so every app that uses Brokr has it set. The `appContext` prop adds optional
6
+ * structured info. Set `appContext={false}` to disable auto-context entirely.
7
+ */
8
+ export interface FabAIAppContext {
9
+ /** Override auto-detected app name. Defaults to theme.brand.name. */
10
+ name?: string;
11
+ /** What the app does. e.g. "a CRM for freelancers" */
12
+ description?: string;
13
+ /** Current page/section. Update dynamically for location awareness. */
14
+ currentPage?: string;
15
+ /** Additional facts. Each string is one sentence. */
16
+ facts?: string[];
17
+ }
18
+ /**
19
+ * Build a system prompt preamble from app context and brand name.
20
+ *
21
+ * - `appContext === false` → disable auto-context, return existingPrompt unchanged
22
+ * - `appContext === undefined` → auto-detect from brandName only
23
+ * - `appContext` with fields → use them, fall back to brandName for name
24
+ */
25
+ export declare function buildFabSystemPrompt(appContext: FabAIAppContext | false | undefined, brandName: string | undefined, existingPrompt: string | undefined): string | undefined;
26
+ //# sourceMappingURL=fab-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fab-context.d.ts","sourceRoot":"","sources":["../../../../src/react/composites/fab-context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,eAAe,GAAG,KAAK,GAAG,SAAS,EAC/C,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,MAAM,GAAG,SAAS,CAcpB"}
@@ -1,2 +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: 60;\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: 90;\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";
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: var(--brokr-radius-pill);\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: var(--brokr-radius-pill);\n color: var(--brokr-text-primary);\n display: inline-flex;\n font-weight: var(--brokr-font-weight-bold);\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 var(--brokr-duration-base) var(--brokr-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: var(--brokr-font-weight-bold);\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: var(--brokr-font-weight-semibold);\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: var(--brokr-radius-pill);\n color: var(--brokr-text-secondary);\n display: inline-flex;\n font-size: 0.75rem;\n font-weight: var(--brokr-font-weight-semibold);\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: var(--brokr-font-weight-semibold);\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: var(--brokr-font-weight-bold);\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: calc(var(--brokr-radius-card) + 2px);\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: var(--brokr-font-weight-semibold);\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: var(--brokr-font-weight-semibold);\n min-height: 34px;\n padding: 0 0.7rem;\n text-decoration: none;\n transition: color var(--brokr-duration-base) var(--brokr-ease), background-color var(--brokr-duration-base) var(--brokr-ease), border-color var(--brokr-duration-base) var(--brokr-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: var(--brokr-font-weight-semibold);\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: var(--brokr-font-weight-semibold);\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
2
  //# sourceMappingURL=account.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../../../src/react/css/account.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,g1bAsmBvB,CAAC"}
1
+ {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../../../src/react/css/account.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,g4cAsmBvB,CAAC"}
@@ -1,2 +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: 14px;\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";
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: var(--brokr-font-weight-bold);\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
2
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/react/css/auth.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,qxEAiHpB,CAAC"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/react/css/auth.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,+0EAiHpB,CAAC"}
@@ -1,2 +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: 100;\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: 100;\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: 49;\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: 50;\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";
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: var(--brokr-font-weight-semibold);\n gap: var(--brokr-space-2);\n min-height: 36px;\n padding: 0 0.75rem;\n transition: background-color var(--brokr-duration-base) var(--brokr-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 var(--brokr-duration-fast) var(--brokr-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: var(--brokr-radius-pill);\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 var(--brokr-duration-fast) var(--brokr-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 var(--brokr-duration-base) var(--brokr-ease), background-color var(--brokr-duration-base) var(--brokr-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 min-height: calc(var(--brokr-space-8) + var(--brokr-space-1));\n outline: none;\n padding: 0 var(--brokr-space-3);\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
2
  //# sourceMappingURL=chat-extras.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-extras.d.ts","sourceRoot":"","sources":["../../../../src/react/css/chat-extras.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,wqQA6U3B,CAAC"}
1
+ {"version":3,"file":"chat-extras.d.ts","sourceRoot":"","sources":["../../../../src/react/css/chat-extras.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,oiRA8U3B,CAAC"}
@@ -1,2 +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: 4;\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: 4;\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";
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 align-content: start;\n background: transparent;\n border-right: 1px solid var(--brokr-muted-border);\n display: grid;\n gap: var(--brokr-space-3);\n height: 100%;\n max-height: 100%;\n min-height: 0;\n overflow-y: auto;\n padding: var(--brokr-space-3);\n}\n\n.brokr-ai-chat-sidebar-skeleton {\n display: grid;\n gap: var(--brokr-space-2);\n padding: 0 var(--brokr-space-3);\n}\n\n.brokr-ai-chat-sidebar-new-chat {\n align-items: center;\n appearance: none;\n background: transparent;\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 font: inherit;\n font-size: var(--brokr-font-size-sm);\n font-weight: var(--brokr-font-weight-medium);\n gap: var(--brokr-space-2);\n justify-content: flex-start;\n min-height: 44px;\n padding: 0 var(--brokr-space-3);\n text-align: left;\n transition:\n background-color var(--brokr-duration-base) var(--brokr-ease),\n color var(--brokr-duration-base) var(--brokr-ease),\n border-color var(--brokr-duration-base) var(--brokr-ease);\n width: 100%;\n}\n\n.brokr-ai-chat-sidebar-new-chat:hover {\n background: var(--brokr-subtle-fill);\n border-color: color-mix(in srgb, var(--brokr-text-primary) 15%, var(--brokr-border));\n color: var(--brokr-text-primary);\n}\n\n.brokr-ai-chat-sidebar-groups {\n display: grid;\n gap: var(--brokr-space-4);\n}\n\n.brokr-ai-chat-sidebar-group {\n display: grid;\n gap: var(--brokr-space-2);\n}\n\n.brokr-ai-chat-sidebar-kicker {\n color: var(--brokr-text-secondary);\n font-size: var(--brokr-font-size-xs);\n font-weight: var(--brokr-font-weight-semibold);\n opacity: 0.7;\n padding: 0 var(--brokr-space-3);\n text-transform: uppercase;\n}\n\n.brokr-ai-chat-sidebar-empty {\n align-items: center;\n border: 1px solid var(--brokr-muted-border);\n border-radius: var(--brokr-radius-card);\n display: flex;\n flex: 1;\n justify-content: center;\n padding: var(--brokr-space-5) 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: var(--brokr-leading-normal);\n text-align: center;\n opacity: 0.6;\n}\n\n.brokr-ai-chat-sidebar-button {\n align-items: center;\n appearance: none;\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-secondary);\n cursor: pointer;\n display: inline-flex;\n font: inherit;\n font-size: var(--brokr-font-size-xs);\n font-weight: var(--brokr-font-weight-medium);\n gap: var(--brokr-space-2);\n justify-content: center;\n min-height: 36px;\n padding: 0 var(--brokr-space-3);\n transition:\n color var(--brokr-duration-base) var(--brokr-ease),\n background-color var(--brokr-duration-base) var(--brokr-ease);\n}\n\n.brokr-ai-chat-sidebar-button:hover {\n background: var(--brokr-subtle-fill-strong);\n color: var(--brokr-text-primary);\n}\n\n.brokr-ai-chat-conversations {\n display: grid;\n gap: var(--brokr-space-1);\n}\n\n.brokr-ai-chat-conversation {\n appearance: none;\n align-items: center;\n background: transparent;\n border: 1px solid transparent;\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: var(--brokr-font-weight-medium);\n gap: var(--brokr-space-2);\n min-height: calc(var(--brokr-space-8) + var(--brokr-space-1));\n overflow: hidden;\n padding: 0 var(--brokr-space-3);\n text-align: left;\n transition:\n color var(--brokr-duration-base) var(--brokr-ease),\n background-color var(--brokr-duration-base) var(--brokr-ease),\n border-color var(--brokr-duration-base) var(--brokr-ease);\n width: 100%;\n}\n\n.brokr-ai-chat-conversation:hover {\n border-color: color-mix(in srgb, var(--brokr-text-primary) 9%, transparent);\n color: var(--brokr-text-primary);\n background: var(--brokr-subtle-fill);\n}\n\n.brokr-ai-chat-conversation[data-active=\"true\"] {\n border-color: color-mix(in srgb, var(--brokr-text-primary) 12%, transparent);\n color: var(--brokr-text-primary);\n background: var(--brokr-subtle-fill-strong);\n font-weight: var(--brokr-font-weight-semibold);\n}\n\n.brokr-ai-chat-conversation-label {\n flex: 1;\n line-height: var(--brokr-leading-snug);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\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: var(--brokr-radius-pill);\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: var(--brokr-radius-pill);\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
2
  //# sourceMappingURL=chat.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../../src/react/css/chat.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,6mQAoXpB,CAAC"}
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../../src/react/css/chat.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,0mVA8bpB,CAAC"}
@@ -1,2 +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: 70;\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: 80;\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";
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-fab-trigger {\n align-items: center;\n appearance: none;\n background: var(--brokr-bg);\n border: 1px solid color-mix(in srgb, var(--brokr-border) 85%, transparent);\n border-radius: var(--brokr-radius-pill);\n box-shadow:\n 0 10px 24px color-mix(in srgb, var(--brokr-text-primary) 14%, transparent),\n 0 0 16px color-mix(in srgb, var(--brokr-text-primary) 10%, transparent);\n color: var(--brokr-text-primary);\n cursor: pointer;\n display: inline-flex;\n font: inherit;\n height: 56px;\n justify-content: center;\n min-height: 56px;\n padding: 0;\n transition:\n transform var(--brokr-duration-base) var(--brokr-ease),\n box-shadow var(--brokr-duration-base) var(--brokr-ease),\n border-color var(--brokr-duration-base) var(--brokr-ease);\n width: 56px;\n}\n\n.brokr-chat-fab-trigger:hover {\n border-color: color-mix(in srgb, var(--brokr-text-primary) 20%, var(--brokr-border));\n transform: translateY(-1px);\n}\n\n.brokr-chat-fab-trigger:active {\n transform: translateY(0);\n}\n\n.brokr-chat-fab-trigger:focus-visible {\n outline: 2px solid color-mix(in srgb, var(--brokr-primary) 60%, transparent);\n outline-offset: 2px;\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-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 var(--brokr-duration-base) var(--brokr-ease), background-color var(--brokr-duration-base) var(--brokr-ease), transform var(--brokr-duration-base) var(--brokr-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
2
  //# sourceMappingURL=composites.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"composites.d.ts","sourceRoot":"","sources":["../../../../src/react/css/composites.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,8xHAyJ1B,CAAC"}
1
+ {"version":3,"file":"composites.d.ts","sourceRoot":"","sources":["../../../../src/react/css/composites.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,guJA8K1B,CAAC"}