@schandlergarcia/sf-web-components 1.7.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/dist/components/library/cards/ActionList.d.ts +10 -10
  2. package/dist/components/library/cards/ActionList.js +2 -3
  3. package/dist/components/library/cards/ActionList.js.map +1 -1
  4. package/dist/components/library/cards/ActivityCard.d.ts +18 -5
  5. package/dist/components/library/cards/ActivityCard.js +3 -4
  6. package/dist/components/library/cards/ActivityCard.js.map +1 -1
  7. package/dist/components/library/cards/BaseCard.d.ts +30 -24
  8. package/dist/components/library/cards/BaseCard.js +2 -3
  9. package/dist/components/library/cards/BaseCard.js.map +1 -1
  10. package/dist/components/library/cards/CalloutCard.d.ts +11 -9
  11. package/dist/components/library/cards/CalloutCard.js +2 -3
  12. package/dist/components/library/cards/CalloutCard.js.map +1 -1
  13. package/dist/components/library/cards/ChartCard.d.ts +29 -17
  14. package/dist/components/library/cards/ChartCard.js +13 -14
  15. package/dist/components/library/cards/ChartCard.js.map +1 -1
  16. package/dist/components/library/cards/FeedPanel.d.ts +12 -11
  17. package/dist/components/library/cards/FeedPanel.js +3 -4
  18. package/dist/components/library/cards/FeedPanel.js.map +1 -1
  19. package/dist/components/library/cards/ListCard.d.ts +33 -20
  20. package/dist/components/library/cards/ListCard.js +35 -35
  21. package/dist/components/library/cards/ListCard.js.map +1 -1
  22. package/dist/components/library/cards/MetricCard.d.ts +23 -17
  23. package/dist/components/library/cards/MetricCard.js +10 -11
  24. package/dist/components/library/cards/MetricCard.js.map +1 -1
  25. package/dist/components/library/cards/MetricsStrip.d.ts +11 -11
  26. package/dist/components/library/cards/MetricsStrip.js +1 -1
  27. package/dist/components/library/cards/MetricsStrip.js.map +1 -1
  28. package/dist/components/library/cards/SectionCard.d.ts +17 -12
  29. package/dist/components/library/cards/SectionCard.js +18 -19
  30. package/dist/components/library/cards/SectionCard.js.map +1 -1
  31. package/dist/components/library/cards/SemanticMetricCard.d.ts +15 -20
  32. package/dist/components/library/cards/SemanticMetricCardWithLoading.d.ts +8 -7
  33. package/dist/components/library/cards/SemanticTableCard.d.ts +13 -18
  34. package/dist/components/library/cards/SemanticTableCardWithLoading.d.ts +8 -7
  35. package/dist/components/library/cards/StatusCard.d.ts +29 -15
  36. package/dist/components/library/cards/StatusCard.js +16 -17
  37. package/dist/components/library/cards/StatusCard.js.map +1 -1
  38. package/dist/components/library/cards/TableCard.d.ts +40 -23
  39. package/dist/components/library/cards/TableCard.js +59 -59
  40. package/dist/components/library/cards/TableCard.js.map +1 -1
  41. package/dist/components/library/cards/WidgetCard.d.ts +19 -11
  42. package/dist/components/library/cards/WidgetCard.js.map +1 -1
  43. package/dist/components/library/charts/D3Chart.d.ts +23 -16
  44. package/dist/components/library/charts/D3Chart.js.map +1 -1
  45. package/dist/components/library/charts/D3ChartTemplates.d.ts +33 -3
  46. package/dist/components/library/charts/D3ChartTemplates.js +7 -7
  47. package/dist/components/library/charts/D3ChartTemplates.js.map +1 -1
  48. package/dist/components/library/charts/GeoMap.d.ts +81 -18
  49. package/dist/components/library/charts/GeoMap.js +28 -26
  50. package/dist/components/library/charts/GeoMap.js.map +1 -1
  51. package/dist/components/library/chat/ChatBar.d.ts +14 -11
  52. package/dist/components/library/chat/ChatBar.js +2 -3
  53. package/dist/components/library/chat/ChatBar.js.map +1 -1
  54. package/dist/components/library/chat/ChatInput.d.ts +9 -8
  55. package/dist/components/library/chat/ChatInput.js.map +1 -1
  56. package/dist/components/library/chat/ChatMessage.d.ts +17 -4
  57. package/dist/components/library/chat/ChatMessage.js.map +1 -1
  58. package/dist/components/library/chat/ChatMessageList.d.ts +11 -8
  59. package/dist/components/library/chat/ChatMessageList.js.map +1 -1
  60. package/dist/components/library/chat/ChatPanel.d.ts +16 -12
  61. package/dist/components/library/chat/ChatPanel.js +8 -9
  62. package/dist/components/library/chat/ChatPanel.js.map +1 -1
  63. package/dist/components/library/chat/ChatSuggestions.d.ts +5 -4
  64. package/dist/components/library/chat/ChatSuggestions.js +2 -3
  65. package/dist/components/library/chat/ChatSuggestions.js.map +1 -1
  66. package/dist/components/library/chat/ChatToolCall.d.ts +11 -3
  67. package/dist/components/library/chat/ChatToolCall.js.map +1 -1
  68. package/dist/components/library/chat/ChatTypingIndicator.d.ts +4 -3
  69. package/dist/components/library/chat/ChatTypingIndicator.js +2 -3
  70. package/dist/components/library/chat/ChatTypingIndicator.js.map +1 -1
  71. package/dist/components/library/chat/ChatWelcome.d.ts +9 -7
  72. package/dist/components/library/chat/ChatWelcome.js +6 -7
  73. package/dist/components/library/chat/ChatWelcome.js.map +1 -1
  74. package/dist/components/library/chat/index.d.ts +10 -0
  75. package/dist/components/library/chat/useChatState.d.ts +36 -11
  76. package/dist/components/library/chat/useChatState.js +63 -46
  77. package/dist/components/library/chat/useChatState.js.map +1 -1
  78. package/dist/components/library/data/DataModeProvider.d.ts +15 -11
  79. package/dist/components/library/data/DataModeProvider.js +1 -1
  80. package/dist/components/library/data/DataModeProvider.js.map +1 -1
  81. package/dist/components/library/data/DataModeToggle.d.ts +4 -3
  82. package/dist/components/library/data/DataModeToggle.js +4 -5
  83. package/dist/components/library/data/DataModeToggle.js.map +1 -1
  84. package/dist/components/library/data/chartDataProvider.d.ts +41 -3
  85. package/dist/components/library/data/filterUtils.d.ts +38 -9
  86. package/dist/components/library/data/filterUtils.js.map +1 -1
  87. package/dist/components/library/data/useDataSource.d.ts +6 -4
  88. package/dist/components/library/data/useDataSource.js.map +1 -1
  89. package/dist/components/library/data/usePageFilters.d.ts +31 -5
  90. package/dist/components/library/data/usePageFilters.js +6 -2
  91. package/dist/components/library/data/usePageFilters.js.map +1 -1
  92. package/dist/components/library/filters/FilterBar.d.ts +18 -8
  93. package/dist/components/library/filters/FilterBar.js +2 -3
  94. package/dist/components/library/filters/FilterBar.js.map +1 -1
  95. package/dist/components/library/filters/SearchFilter.d.ts +7 -6
  96. package/dist/components/library/filters/SearchFilter.js +2 -3
  97. package/dist/components/library/filters/SearchFilter.js.map +1 -1
  98. package/dist/components/library/filters/SelectFilter.d.ts +13 -7
  99. package/dist/components/library/filters/SelectFilter.js +2 -3
  100. package/dist/components/library/filters/SelectFilter.js.map +1 -1
  101. package/dist/components/library/filters/ToggleFilter.d.ts +7 -5
  102. package/dist/components/library/filters/ToggleFilter.js +2 -3
  103. package/dist/components/library/filters/ToggleFilter.js.map +1 -1
  104. package/dist/components/library/forms/FormField.d.ts +10 -8
  105. package/dist/components/library/forms/FormField.js +3 -4
  106. package/dist/components/library/forms/FormField.js.map +1 -1
  107. package/dist/components/library/forms/FormModal.d.ts +23 -14
  108. package/dist/components/library/forms/FormModal.js.map +1 -1
  109. package/dist/components/library/forms/FormRenderer.d.ts +29 -9
  110. package/dist/components/library/forms/FormRenderer.js +6 -7
  111. package/dist/components/library/forms/FormRenderer.js.map +1 -1
  112. package/dist/components/library/forms/FormSection.d.ts +10 -8
  113. package/dist/components/library/forms/FormSection.js +2 -3
  114. package/dist/components/library/forms/FormSection.js.map +1 -1
  115. package/dist/components/library/forms/index.d.ts +5 -0
  116. package/dist/components/library/forms/useFormState.d.ts +23 -15
  117. package/dist/components/library/forms/useFormState.js +53 -47
  118. package/dist/components/library/forms/useFormState.js.map +1 -1
  119. package/dist/components/library/index.d.ts +92 -73
  120. package/dist/components/library/index.js +25 -25
  121. package/dist/components/library/index.js.map +1 -1
  122. package/dist/components/library/layout/PageContainer.d.ts +6 -4
  123. package/dist/components/library/layout/PageContainer.js +4 -5
  124. package/dist/components/library/layout/PageContainer.js.map +1 -1
  125. package/dist/components/library/skeletons/CardSkeleton.d.ts +5 -4
  126. package/dist/components/library/skeletons/CardSkeleton.js +2 -3
  127. package/dist/components/library/skeletons/CardSkeleton.js.map +1 -1
  128. package/dist/components/library/theme/AppThemeProvider.d.ts +13 -50
  129. package/dist/components/library/theme/AppThemeProvider.js.map +1 -1
  130. package/dist/components/library/theme/tokens.d.ts +45 -44
  131. package/dist/components/library/theme/tokens.js.map +1 -1
  132. package/package.json +4 -1
  133. package/src/components/library/cards/{ActionList.jsx → ActionList.tsx} +13 -9
  134. package/src/components/library/cards/{ActivityCard.jsx → ActivityCard.tsx} +33 -4
  135. package/src/components/library/cards/{BaseCard.jsx → BaseCard.tsx} +33 -6
  136. package/src/components/library/cards/{CalloutCard.jsx → CalloutCard.tsx} +12 -10
  137. package/src/components/library/cards/{ChartCard.jsx → ChartCard.tsx} +32 -6
  138. package/src/components/library/cards/{FeedPanel.jsx → FeedPanel.tsx} +13 -2
  139. package/src/components/library/cards/{ListCard.jsx → ListCard.tsx} +43 -7
  140. package/src/components/library/cards/{MetricCard.jsx → MetricCard.tsx} +25 -6
  141. package/src/components/library/cards/{MetricsStrip.jsx → MetricsStrip.tsx} +22 -12
  142. package/src/components/library/cards/{SectionCard.jsx → SectionCard.tsx} +27 -8
  143. package/src/components/library/cards/{SemanticMetricCard.jsx → SemanticMetricCard.tsx} +18 -6
  144. package/src/components/library/cards/{SemanticMetricCardWithLoading.jsx → SemanticMetricCardWithLoading.tsx} +9 -3
  145. package/src/components/library/cards/{SemanticTableCard.jsx → SemanticTableCard.tsx} +16 -5
  146. package/src/components/library/cards/{SemanticTableCardWithLoading.jsx → SemanticTableCardWithLoading.tsx} +9 -5
  147. package/src/components/library/cards/{StatusCard.jsx → StatusCard.tsx} +61 -12
  148. package/src/components/library/cards/{TableCard.jsx → TableCard.tsx} +51 -12
  149. package/src/components/library/cards/{WidgetCard.jsx → WidgetCard.tsx} +28 -5
  150. package/src/components/library/charts/{D3Chart.jsx → D3Chart.tsx} +27 -7
  151. package/src/components/library/charts/{D3ChartTemplates.jsx → D3ChartTemplates.tsx} +60 -28
  152. package/src/components/library/charts/{GeoMap.jsx → GeoMap.tsx} +106 -17
  153. package/src/components/library/chat/{ChatBar.jsx → ChatBar.tsx} +19 -8
  154. package/src/components/library/chat/{ChatInput.jsx → ChatInput.tsx} +13 -11
  155. package/src/components/library/chat/{ChatMessage.jsx → ChatMessage.tsx} +22 -9
  156. package/src/components/library/chat/{ChatMessageList.jsx → ChatMessageList.tsx} +13 -11
  157. package/src/components/library/chat/{ChatPanel.jsx → ChatPanel.tsx} +16 -13
  158. package/src/components/library/chat/{ChatSuggestions.jsx → ChatSuggestions.tsx} +6 -5
  159. package/src/components/library/chat/{ChatToolCall.jsx → ChatToolCall.tsx} +14 -4
  160. package/src/components/library/chat/{ChatTypingIndicator.jsx → ChatTypingIndicator.tsx} +5 -2
  161. package/src/components/library/chat/{ChatWelcome.jsx → ChatWelcome.tsx} +9 -7
  162. package/src/components/library/chat/index.tsx +26 -0
  163. package/src/components/library/chat/useChatState.tsx +181 -0
  164. package/src/components/library/data/{DataModeProvider.jsx → DataModeProvider.tsx} +25 -8
  165. package/src/components/library/data/{DataModeToggle.jsx → DataModeToggle.tsx} +5 -2
  166. package/src/components/library/data/{chartDataProvider.jsx → chartDataProvider.tsx} +49 -5
  167. package/src/components/library/data/{filterUtils.jsx → filterUtils.tsx} +58 -12
  168. package/src/components/library/data/{useDataSource.jsx → useDataSource.tsx} +9 -2
  169. package/src/components/library/data/{usePageFilters.jsx → usePageFilters.tsx} +49 -9
  170. package/src/components/library/filters/{FilterBar.jsx → FilterBar.tsx} +21 -11
  171. package/src/components/library/filters/{SearchFilter.jsx → SearchFilter.tsx} +8 -2
  172. package/src/components/library/filters/{SelectFilter.jsx → SelectFilter.tsx} +15 -8
  173. package/src/components/library/filters/{ToggleFilter.jsx → ToggleFilter.tsx} +7 -6
  174. package/src/components/library/forms/{FormField.jsx → FormField.tsx} +91 -45
  175. package/src/components/library/forms/{FormModal.jsx → FormModal.tsx} +21 -20
  176. package/src/components/library/forms/{FormRenderer.jsx → FormRenderer.tsx} +32 -10
  177. package/src/components/library/forms/{FormSection.jsx → FormSection.tsx} +13 -7
  178. package/src/components/library/forms/index.tsx +11 -0
  179. package/src/components/library/forms/{useFormState.jsx → useFormState.tsx} +43 -23
  180. package/src/components/library/{index.jsx → index.ts} +14 -14
  181. package/src/components/library/layout/{PageContainer.jsx → PageContainer.tsx} +6 -3
  182. package/src/components/library/skeletons/{CardSkeleton.jsx → CardSkeleton.tsx} +5 -4
  183. package/src/components/library/theme/{AppThemeProvider.jsx → AppThemeProvider.tsx} +20 -7
  184. package/src/components/library/theme/{tokens.jsx → tokens.tsx} +37 -3
  185. package/src/components/library/chat/index.jsx +0 -10
  186. package/src/components/library/chat/useChatState.jsx +0 -130
  187. package/src/components/library/forms/index.jsx +0 -5
  188. /package/src/components/library/filters/{index.jsx → index.ts} +0 -0
@@ -1,16 +1,20 @@
1
+ import React from "react";
2
+ import { UseChatStateOptions } from "./useChatState";
3
+ import { ChatMessageData } from "./ChatMessage";
4
+ export interface ChatPanelProps {
5
+ title?: string;
6
+ onSend?: UseChatStateOptions["onSend"];
7
+ initialMessages?: UseChatStateOptions["initialMessages"];
8
+ welcomeTitle?: string;
9
+ welcomeSubtitle?: string;
10
+ suggestions?: string[];
11
+ placeholder?: string;
12
+ className?: string;
13
+ renderAvatar?: (message: ChatMessageData) => React.ReactNode;
14
+ showHeader?: boolean;
15
+ }
1
16
  /**
2
17
  * All-in-one chat panel. Composes ChatMessageList, ChatInput, ChatWelcome,
3
18
  * and useChatState into a single drop-in component.
4
- *
5
- * @param {string} title — panel header title
6
- * @param {Function} onSend — async (userMessage, history, helpers) => assistantMessage?
7
- * @param {Array} initialMessages — seed messages
8
- * @param {string} welcomeTitle — welcome screen heading
9
- * @param {string} welcomeSubtitle — welcome screen description
10
- * @param {string[]} suggestions — starter and follow-up prompts
11
- * @param {string} placeholder — input placeholder
12
- * @param {string} className — additional classes on the root container
13
- * @param {Function} renderAvatar — (message) => ReactNode
14
- * @param {boolean} showHeader — show the title bar (default true)
15
19
  */
16
- export default function ChatPanel({ title, onSend, initialMessages, welcomeTitle, welcomeSubtitle, suggestions, placeholder, className, renderAvatar, showHeader, }: string): import("react/jsx-runtime").JSX.Element;
20
+ export default function ChatPanel({ title, onSend, initialMessages, welcomeTitle, welcomeSubtitle, suggestions, placeholder, className, renderAvatar, showHeader, }: ChatPanelProps): import("react/jsx-runtime").JSX.Element;
@@ -1,11 +1,10 @@
1
1
  import { jsxs as r, jsx as t } from "react/jsx-runtime";
2
- import "react";
3
2
  import f from "./ChatMessageList.js";
4
- import p from "./ChatInput.js";
5
- import u from "./ChatWelcome.js";
6
- import x from "./useChatState.js";
3
+ import u from "./ChatInput.js";
4
+ import x from "./ChatWelcome.js";
5
+ import p from "./useChatState.js";
7
6
  import { TrashIcon as k } from "@heroicons/react/24/outline";
8
- function w({
7
+ function j({
9
8
  title: o = "AI Assistant",
10
9
  onSend: l,
11
10
  initialMessages: i = [],
@@ -17,7 +16,7 @@ function w({
17
16
  renderAvatar: h,
18
17
  showHeader: c = !0
19
18
  }) {
20
- const e = x({ initialMessages: i, onSend: l }), b = e.messages.length === 0;
19
+ const e = p({ initialMessages: i, onSend: l }), b = e.messages.length === 0;
21
20
  return /* @__PURE__ */ r(
22
21
  "div",
23
22
  {
@@ -40,7 +39,7 @@ function w({
40
39
  ) : null
41
40
  ] }) : null,
42
41
  b ? /* @__PURE__ */ t(
43
- u,
42
+ x,
44
43
  {
45
44
  title: n,
46
45
  subtitle: d,
@@ -59,7 +58,7 @@ function w({
59
58
  }
60
59
  ),
61
60
  /* @__PURE__ */ t("div", { className: "border-t border-slate-100 p-3 dark:border-slate-800", children: /* @__PURE__ */ t(
62
- p,
61
+ u,
63
62
  {
64
63
  onSend: (s) => e.sendMessage(s),
65
64
  disabled: e.isLoading,
@@ -72,6 +71,6 @@ function w({
72
71
  );
73
72
  }
74
73
  export {
75
- w as default
74
+ j as default
76
75
  };
77
76
  //# sourceMappingURL=ChatPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatPanel.js","sources":["../../../../src/components/library/chat/ChatPanel.jsx"],"sourcesContent":["import React from \"react\";\nimport ChatMessageList from \"./ChatMessageList\";\nimport ChatInput from \"./ChatInput\";\nimport ChatWelcome from \"./ChatWelcome\";\nimport useChatState from \"./useChatState\";\nimport { TrashIcon } from \"@heroicons/react/24/outline\";\n\n/**\n * All-in-one chat panel. Composes ChatMessageList, ChatInput, ChatWelcome,\n * and useChatState into a single drop-in component.\n *\n * @param {string} title — panel header title\n * @param {Function} onSend — async (userMessage, history, helpers) => assistantMessage?\n * @param {Array} initialMessages — seed messages\n * @param {string} welcomeTitle — welcome screen heading\n * @param {string} welcomeSubtitle — welcome screen description\n * @param {string[]} suggestions — starter and follow-up prompts\n * @param {string} placeholder — input placeholder\n * @param {string} className additional classes on the root container\n * @param {Function} renderAvatar (message) => ReactNode\n * @param {boolean} showHeader show the title bar (default true)\n */\nexport default function ChatPanel({\n title = \"AI Assistant\",\n onSend,\n initialMessages = [],\n welcomeTitle,\n welcomeSubtitle,\n suggestions = [],\n placeholder,\n className = \"\",\n renderAvatar,\n showHeader = true,\n}) {\n const chat = useChatState({ initialMessages, onSend });\n\n const isEmpty = chat.messages.length === 0;\n\n return (\n <div\n className={[\n \"flex flex-col overflow-hidden rounded-xl border border-slate-200 bg-white dark:border-slate-800 dark:bg-slate-900\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {/* Header */}\n {showHeader ? (\n <div className=\"flex items-center justify-between border-b border-slate-100 px-4 py-3 dark:border-slate-800\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-50\">\n {title}\n </h3>\n {chat.messages.length > 0 ? (\n <button\n type=\"button\"\n onClick={chat.clearMessages}\n className=\"rounded p-1 text-slate-400 transition hover:bg-slate-100 hover:text-slate-600 dark:text-slate-500 dark:hover:bg-slate-800 dark:hover:text-slate-300\"\n aria-label=\"Clear chat\"\n >\n <TrashIcon className=\"h-4 w-4\" />\n </button>\n ) : null}\n </div>\n ) : null}\n\n {/* Messages or welcome */}\n {isEmpty ? (\n <ChatWelcome\n title={welcomeTitle}\n subtitle={welcomeSubtitle}\n suggestions={suggestions}\n onSuggestion={(text) => chat.sendMessage(text)}\n />\n ) : (\n <ChatMessageList\n messages={chat.messages}\n isLoading={chat.isLoading}\n isStreaming={chat.isStreaming}\n suggestions={suggestions}\n onSuggestion={(text) => chat.sendMessage(text)}\n renderAvatar={renderAvatar}\n />\n )}\n\n {/* Input */}\n <div className=\"border-t border-slate-100 p-3 dark:border-slate-800\">\n <ChatInput\n onSend={(content) => chat.sendMessage(content)}\n disabled={chat.isLoading}\n isLoading={chat.isLoading}\n placeholder={placeholder}\n />\n </div>\n </div>\n );\n}\n"],"names":["ChatPanel","title","onSend","initialMessages","welcomeTitle","welcomeSubtitle","suggestions","placeholder","className","renderAvatar","showHeader","chat","useChatState","isEmpty","jsxs","jsx","TrashIcon","ChatWelcome","text","ChatMessageList","ChatInput","content"],"mappings":";;;;;;;AAsBA,SAAwBA,EAAU;AAAA,EAChC,OAAAC,IAAQ;AAAA,EACR,QAAAC;AAAA,EACA,iBAAAC,IAAkB,CAAA;AAAA,EAClB,cAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,aAAAC,IAAc,CAAA;AAAA,EACd,aAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,cAAAC;AAAA,EACA,YAAAC,IAAa;AACf,GAAG;AACD,QAAMC,IAAOC,EAAa,EAAE,iBAAAT,GAAiB,QAAAD,GAAQ,GAE/CW,IAAUF,EAAK,SAAS,WAAW;AAEzC,SACE,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACAN;AAAA,MAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MAGV,UAAA;AAAA,QAAAE,IACC,gBAAAI,EAAC,OAAA,EAAI,WAAU,+FACb,UAAA;AAAA,UAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,2DACX,UAAAd,GACH;AAAA,UACCU,EAAK,SAAS,SAAS,IACtB,gBAAAI;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAASJ,EAAK;AAAA,cACd,WAAU;AAAA,cACV,cAAW;AAAA,cAEX,UAAA,gBAAAI,EAACC,GAAA,EAAU,WAAU,UAAA,CAAU;AAAA,YAAA;AAAA,UAAA,IAE/B;AAAA,QAAA,EAAA,CACN,IACE;AAAA,QAGHH,IACC,gBAAAE;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,OAAOb;AAAA,YACP,UAAUC;AAAA,YACV,aAAAC;AAAA,YACA,cAAc,CAACY,MAASP,EAAK,YAAYO,CAAI;AAAA,UAAA;AAAA,QAAA,IAG/C,gBAAAH;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,UAAUR,EAAK;AAAA,YACf,WAAWA,EAAK;AAAA,YAChB,aAAaA,EAAK;AAAA,YAClB,aAAAL;AAAA,YACA,cAAc,CAACY,MAASP,EAAK,YAAYO,CAAI;AAAA,YAC7C,cAAAT;AAAA,UAAA;AAAA,QAAA;AAAA,QAKJ,gBAAAM,EAAC,OAAA,EAAI,WAAU,uDACb,UAAA,gBAAAA;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,QAAQ,CAACC,MAAYV,EAAK,YAAYU,CAAO;AAAA,YAC7C,UAAUV,EAAK;AAAA,YACf,WAAWA,EAAK;AAAA,YAChB,aAAAJ;AAAA,UAAA;AAAA,QAAA,EACF,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;"}
1
+ {"version":3,"file":"ChatPanel.js","sources":["../../../../src/components/library/chat/ChatPanel.tsx"],"sourcesContent":["import React from \"react\";\nimport ChatMessageList from \"./ChatMessageList\";\nimport ChatInput from \"./ChatInput\";\nimport ChatWelcome from \"./ChatWelcome\";\nimport useChatState, { UseChatStateOptions } from \"./useChatState\";\nimport { ChatMessageData } from \"./ChatMessage\";\nimport { TrashIcon } from \"@heroicons/react/24/outline\";\n\nexport interface ChatPanelProps {\n title?: string;\n onSend?: UseChatStateOptions[\"onSend\"];\n initialMessages?: UseChatStateOptions[\"initialMessages\"];\n welcomeTitle?: string;\n welcomeSubtitle?: string;\n suggestions?: string[];\n placeholder?: string;\n className?: string;\n renderAvatar?: (message: ChatMessageData) => React.ReactNode;\n showHeader?: boolean;\n}\n\n/**\n * All-in-one chat panel. Composes ChatMessageList, ChatInput, ChatWelcome,\n * and useChatState into a single drop-in component.\n */\nexport default function ChatPanel({\n title = \"AI Assistant\",\n onSend,\n initialMessages = [],\n welcomeTitle,\n welcomeSubtitle,\n suggestions = [],\n placeholder,\n className = \"\",\n renderAvatar,\n showHeader = true,\n}: ChatPanelProps) {\n const chat = useChatState({ initialMessages, onSend });\n\n const isEmpty = chat.messages.length === 0;\n\n return (\n <div\n className={[\n \"flex flex-col overflow-hidden rounded-xl border border-slate-200 bg-white dark:border-slate-800 dark:bg-slate-900\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {/* Header */}\n {showHeader ? (\n <div className=\"flex items-center justify-between border-b border-slate-100 px-4 py-3 dark:border-slate-800\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-50\">\n {title}\n </h3>\n {chat.messages.length > 0 ? (\n <button\n type=\"button\"\n onClick={chat.clearMessages}\n className=\"rounded p-1 text-slate-400 transition hover:bg-slate-100 hover:text-slate-600 dark:text-slate-500 dark:hover:bg-slate-800 dark:hover:text-slate-300\"\n aria-label=\"Clear chat\"\n >\n <TrashIcon className=\"h-4 w-4\" />\n </button>\n ) : null}\n </div>\n ) : null}\n\n {/* Messages or welcome */}\n {isEmpty ? (\n <ChatWelcome\n title={welcomeTitle}\n subtitle={welcomeSubtitle}\n suggestions={suggestions}\n onSuggestion={(text) => chat.sendMessage(text)}\n />\n ) : (\n <ChatMessageList\n messages={chat.messages}\n isLoading={chat.isLoading}\n isStreaming={chat.isStreaming}\n suggestions={suggestions}\n onSuggestion={(text) => chat.sendMessage(text)}\n renderAvatar={renderAvatar}\n />\n )}\n\n {/* Input */}\n <div className=\"border-t border-slate-100 p-3 dark:border-slate-800\">\n <ChatInput\n onSend={(content) => chat.sendMessage(content)}\n disabled={chat.isLoading}\n isLoading={chat.isLoading}\n placeholder={placeholder}\n />\n </div>\n </div>\n );\n}\n"],"names":["ChatPanel","title","onSend","initialMessages","welcomeTitle","welcomeSubtitle","suggestions","placeholder","className","renderAvatar","showHeader","chat","useChatState","isEmpty","jsxs","jsx","TrashIcon","ChatWelcome","text","ChatMessageList","ChatInput","content"],"mappings":";;;;;;AAyBA,SAAwBA,EAAU;AAAA,EAChC,OAAAC,IAAQ;AAAA,EACR,QAAAC;AAAA,EACA,iBAAAC,IAAkB,CAAA;AAAA,EAClB,cAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,aAAAC,IAAc,CAAA;AAAA,EACd,aAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,cAAAC;AAAA,EACA,YAAAC,IAAa;AACf,GAAmB;AACjB,QAAMC,IAAOC,EAAa,EAAE,iBAAAT,GAAiB,QAAAD,GAAQ,GAE/CW,IAAUF,EAAK,SAAS,WAAW;AAEzC,SACE,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACAN;AAAA,MAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MAGV,UAAA;AAAA,QAAAE,IACC,gBAAAI,EAAC,OAAA,EAAI,WAAU,+FACb,UAAA;AAAA,UAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,2DACX,UAAAd,GACH;AAAA,UACCU,EAAK,SAAS,SAAS,IACtB,gBAAAI;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAASJ,EAAK;AAAA,cACd,WAAU;AAAA,cACV,cAAW;AAAA,cAEX,UAAA,gBAAAI,EAACC,GAAA,EAAU,WAAU,UAAA,CAAU;AAAA,YAAA;AAAA,UAAA,IAE/B;AAAA,QAAA,EAAA,CACN,IACE;AAAA,QAGHH,IACC,gBAAAE;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,OAAOb;AAAA,YACP,UAAUC;AAAA,YACV,aAAAC;AAAA,YACA,cAAc,CAACY,MAASP,EAAK,YAAYO,CAAI;AAAA,UAAA;AAAA,QAAA,IAG/C,gBAAAH;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,UAAUR,EAAK;AAAA,YACf,WAAWA,EAAK;AAAA,YAChB,aAAaA,EAAK;AAAA,YAClB,aAAAL;AAAA,YACA,cAAc,CAACY,MAASP,EAAK,YAAYO,CAAI;AAAA,YAC7C,cAAAT;AAAA,UAAA;AAAA,QAAA;AAAA,QAKJ,gBAAAM,EAAC,OAAA,EAAI,WAAU,uDACb,UAAA,gBAAAA;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,QAAQ,CAACC,MAAYV,EAAK,YAAYU,CAAO;AAAA,YAC7C,UAAUV,EAAK;AAAA,YACf,WAAWA,EAAK;AAAA,YAChB,aAAAJ;AAAA,UAAA;AAAA,QAAA,EACF,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -1,7 +1,8 @@
1
+ export interface ChatSuggestionsProps {
2
+ suggestions?: string[];
3
+ onSelect?: (suggestion: string) => void;
4
+ }
1
5
  /**
2
6
  * Quick-action prompt buttons. Place above the input or after an assistant message.
3
- *
4
- * @param {string[]} suggestions — prompt strings
5
- * @param {Function} onSelect — (suggestion) => void
6
7
  */
7
- export default function ChatSuggestions({ suggestions, onSelect }: string[]): import("react/jsx-runtime").JSX.Element | null;
8
+ export default function ChatSuggestions({ suggestions, onSelect }: ChatSuggestionsProps): import("react/jsx-runtime").JSX.Element | null;
@@ -1,7 +1,6 @@
1
1
  import { jsx as a, jsxs as d } from "react/jsx-runtime";
2
- import "react";
3
2
  import { SparklesIcon as n } from "@heroicons/react/24/outline";
4
- function i({ suggestions: e = [], onSelect: t }) {
3
+ function s({ suggestions: e = [], onSelect: t }) {
5
4
  return e.length ? /* @__PURE__ */ a("div", { className: "flex flex-wrap gap-2", children: e.map((r) => /* @__PURE__ */ d(
6
5
  "button",
7
6
  {
@@ -17,6 +16,6 @@ function i({ suggestions: e = [], onSelect: t }) {
17
16
  )) }) : null;
18
17
  }
19
18
  export {
20
- i as default
19
+ s as default
21
20
  };
22
21
  //# sourceMappingURL=ChatSuggestions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatSuggestions.js","sources":["../../../../src/components/library/chat/ChatSuggestions.jsx"],"sourcesContent":["import React from \"react\";\nimport { SparklesIcon } from \"@heroicons/react/24/outline\";\n\n/**\n * Quick-action prompt buttons. Place above the input or after an assistant message.\n *\n * @param {string[]} suggestions — prompt strings\n * @param {Function} onSelect — (suggestion) => void\n */\nexport default function ChatSuggestions({ suggestions = [], onSelect }) {\n if (!suggestions.length) return null;\n\n return (\n <div className=\"flex flex-wrap gap-2\">\n {suggestions.map((text) => (\n <button\n key={text}\n type=\"button\"\n onClick={() => onSelect?.(text)}\n className=\"inline-flex items-center gap-1.5 rounded-full border border-slate-200 bg-white px-3 py-1.5 text-xs font-medium text-slate-600 shadow-sm transition hover:border-brand-300 hover:bg-brand-50 hover:text-brand-700 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-300 dark:hover:border-brand-700 dark:hover:bg-brand-950/30 dark:hover:text-brand-300\"\n >\n <SparklesIcon className=\"h-3 w-3\" aria-hidden=\"true\" />\n {text}\n </button>\n ))}\n </div>\n );\n}\n"],"names":["ChatSuggestions","suggestions","onSelect","text","jsxs","jsx","SparklesIcon"],"mappings":";;;AASA,SAAwBA,EAAgB,EAAE,aAAAC,IAAc,CAAA,GAAI,UAAAC,KAAY;AACtE,SAAKD,EAAY,2BAGd,OAAA,EAAI,WAAU,wBACZ,UAAAA,EAAY,IAAI,CAACE,MAChB,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,MAAK;AAAA,MACL,SAAS,MAAMF,IAAWC,CAAI;AAAA,MAC9B,WAAU;AAAA,MAEV,UAAA;AAAA,QAAA,gBAAAE,EAACC,GAAA,EAAa,WAAU,WAAU,eAAY,QAAO;AAAA,QACpDH;AAAA,MAAA;AAAA,IAAA;AAAA,IANIA;AAAA,EAAA,CAQR,GACH,IAf8B;AAiBlC;"}
1
+ {"version":3,"file":"ChatSuggestions.js","sources":["../../../../src/components/library/chat/ChatSuggestions.tsx"],"sourcesContent":["import { SparklesIcon } from \"@heroicons/react/24/outline\";\n\nexport interface ChatSuggestionsProps {\n suggestions?: string[];\n onSelect?: (suggestion: string) => void;\n}\n\n/**\n * Quick-action prompt buttons. Place above the input or after an assistant message.\n */\nexport default function ChatSuggestions({ suggestions = [], onSelect }: ChatSuggestionsProps) {\n if (!suggestions.length) return null;\n\n return (\n <div className=\"flex flex-wrap gap-2\">\n {suggestions.map((text) => (\n <button\n key={text}\n type=\"button\"\n onClick={() => onSelect?.(text)}\n className=\"inline-flex items-center gap-1.5 rounded-full border border-slate-200 bg-white px-3 py-1.5 text-xs font-medium text-slate-600 shadow-sm transition hover:border-brand-300 hover:bg-brand-50 hover:text-brand-700 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-300 dark:hover:border-brand-700 dark:hover:bg-brand-950/30 dark:hover:text-brand-300\"\n >\n <SparklesIcon className=\"h-3 w-3\" aria-hidden=\"true\" />\n {text}\n </button>\n ))}\n </div>\n );\n}\n"],"names":["ChatSuggestions","suggestions","onSelect","text","jsxs","jsx","SparklesIcon"],"mappings":";;AAUA,SAAwBA,EAAgB,EAAE,aAAAC,IAAc,CAAA,GAAI,UAAAC,KAAkC;AAC5F,SAAKD,EAAY,2BAGd,OAAA,EAAI,WAAU,wBACZ,UAAAA,EAAY,IAAI,CAACE,MAChB,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,MAAK;AAAA,MACL,SAAS,MAAMF,IAAWC,CAAI;AAAA,MAC9B,WAAU;AAAA,MAEV,UAAA;AAAA,QAAA,gBAAAE,EAACC,GAAA,EAAa,WAAU,WAAU,eAAY,QAAO;AAAA,QACpDH;AAAA,MAAA;AAAA,IAAA;AAAA,IANIA;AAAA,EAAA,CAQR,GACH,IAf8B;AAiBlC;"}
@@ -1,6 +1,14 @@
1
+ export interface ToolCall {
2
+ id?: string;
3
+ name: string;
4
+ args?: unknown;
5
+ status: "running" | "complete" | "error";
6
+ result?: unknown;
7
+ }
8
+ export interface ChatToolCallProps {
9
+ toolCall: ToolCall;
10
+ }
1
11
  /**
2
12
  * Displays an agent tool call / function execution step.
3
- *
4
- * @param {Object} toolCall — { id?, name, args?, status: "running"|"complete"|"error", result? }
5
13
  */
6
- export default function ChatToolCall({ toolCall }: Object): import("react/jsx-runtime").JSX.Element;
14
+ export default function ChatToolCall({ toolCall }: ChatToolCallProps): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"ChatToolCall.js","sources":["../../../../src/components/library/chat/ChatToolCall.jsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport Spinner from \"../ui/Spinner\";\nimport {\n WrenchScrewdriverIcon,\n CheckCircleIcon,\n XCircleIcon,\n ChevronDownIcon,\n} from \"@heroicons/react/24/outline\";\n\nconst STATUS_CONFIG = {\n running: {\n icon: <Spinner size=\"xs\" tone=\"brand\" label=\"Running\" />,\n text: \"text-brand-600 dark:text-brand-400\",\n bg: \"bg-brand-50 border-brand-100 dark:bg-brand-950/20 dark:border-brand-900/30\",\n label: \"Running\",\n },\n complete: {\n icon: <CheckCircleIcon className=\"h-3.5 w-3.5 text-emerald-500\" />,\n text: \"text-emerald-700 dark:text-emerald-300\",\n bg: \"bg-emerald-50 border-emerald-100 dark:bg-emerald-950/20 dark:border-emerald-900/30\",\n label: \"Complete\",\n },\n error: {\n icon: <XCircleIcon className=\"h-3.5 w-3.5 text-red-500\" />,\n text: \"text-red-700 dark:text-red-300\",\n bg: \"bg-red-50 border-red-100 dark:bg-red-950/20 dark:border-red-900/30\",\n label: \"Failed\",\n },\n};\n\n/**\n * Displays an agent tool call / function execution step.\n *\n * @param {Object} toolCall — { id?, name, args?, status: \"running\"|\"complete\"|\"error\", result? }\n */\nexport default function ChatToolCall({ toolCall }) {\n const [expanded, setExpanded] = useState(false);\n const config = STATUS_CONFIG[toolCall.status] ?? STATUS_CONFIG.running;\n const hasDetails = toolCall.args || toolCall.result;\n\n return (\n <div\n className={[\n \"rounded-lg border text-xs\",\n config.bg,\n ].join(\" \")}\n >\n <button\n type=\"button\"\n onClick={() => hasDetails && setExpanded(!expanded)}\n className={[\n \"flex w-full items-center gap-2 px-3 py-1.5\",\n hasDetails ? \"cursor-pointer\" : \"cursor-default\",\n ].join(\" \")}\n >\n {config.icon}\n <WrenchScrewdriverIcon className=\"h-3 w-3 text-slate-400 dark:text-slate-500\" />\n <span className={[\"font-medium\", config.text].join(\" \")}>\n {toolCall.name}\n </span>\n <span className=\"text-slate-400 dark:text-slate-500\">\n — {config.label}\n </span>\n {hasDetails ? (\n <ChevronDownIcon\n className={[\n \"ml-auto h-3 w-3 text-slate-400 transition-transform dark:text-slate-500\",\n expanded ? \"rotate-180\" : \"\",\n ].join(\" \")}\n />\n ) : null}\n </button>\n\n {expanded && hasDetails ? (\n <div className=\"border-t border-inherit px-3 py-2 font-mono text-[11px] leading-relaxed text-slate-600 dark:text-slate-300\">\n {toolCall.args ? (\n <div className=\"mb-1\">\n <span className=\"font-sans font-semibold text-slate-500 dark:text-slate-400\">\n Args:{\" \"}\n </span>\n {typeof toolCall.args === \"string\"\n ? toolCall.args\n : JSON.stringify(toolCall.args, null, 2)}\n </div>\n ) : null}\n {toolCall.result ? (\n <div>\n <span className=\"font-sans font-semibold text-slate-500 dark:text-slate-400\">\n Result:{\" \"}\n </span>\n {typeof toolCall.result === \"string\"\n ? toolCall.result\n : JSON.stringify(toolCall.result, null, 2)}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n"],"names":["STATUS_CONFIG","Spinner","jsx","CheckCircleIcon","XCircleIcon","ChatToolCall","toolCall","expanded","setExpanded","useState","config","hasDetails","jsxs","WrenchScrewdriverIcon","ChevronDownIcon"],"mappings":";;;;AASA,MAAMA,IAAgB;AAAA,EACpB,SAAS;AAAA,IACP,wBAAOC,GAAA,EAAQ,MAAK,MAAK,MAAK,SAAQ,OAAM,WAAU;AAAA,IACtD,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,OAAO;AAAA,EAAA;AAAA,EAET,UAAU;AAAA,IACR,MAAM,gBAAAC,EAACC,GAAA,EAAgB,WAAU,+BAAA,CAA+B;AAAA,IAChE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,OAAO;AAAA,EAAA;AAAA,EAET,OAAO;AAAA,IACL,MAAM,gBAAAD,EAACE,GAAA,EAAY,WAAU,2BAAA,CAA2B;AAAA,IACxD,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,OAAO;AAAA,EAAA;AAEX;AAOA,SAAwBC,EAAa,EAAE,UAAAC,KAAY;AACjD,QAAM,CAACC,GAAUC,CAAW,IAAIC,EAAS,EAAK,GACxCC,IAASV,EAAcM,EAAS,MAAM,KAAKN,EAAc,SACzDW,IAAaL,EAAS,QAAQA,EAAS;AAE7C,SACE,gBAAAM;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACAF,EAAO;AAAA,MAAA,EACP,KAAK,GAAG;AAAA,MAEV,UAAA;AAAA,QAAA,gBAAAE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAMD,KAAcH,EAAY,CAACD,CAAQ;AAAA,YAClD,WAAW;AAAA,cACT;AAAA,cACAI,IAAa,mBAAmB;AAAA,YAAA,EAChC,KAAK,GAAG;AAAA,YAET,UAAA;AAAA,cAAAD,EAAO;AAAA,cACR,gBAAAR,EAACW,GAAA,EAAsB,WAAU,6CAAA,CAA6C;AAAA,cAC9E,gBAAAX,EAAC,QAAA,EAAK,WAAW,CAAC,eAAeQ,EAAO,IAAI,EAAE,KAAK,GAAG,GACnD,UAAAJ,EAAS,KAAA,CACZ;AAAA,cACA,gBAAAM,EAAC,QAAA,EAAK,WAAU,sCAAqC,UAAA;AAAA,gBAAA;AAAA,gBAChDF,EAAO;AAAA,cAAA,GACZ;AAAA,cACCC,IACC,gBAAAT;AAAA,gBAACY;AAAA,gBAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACAP,IAAW,eAAe;AAAA,kBAAA,EAC1B,KAAK,GAAG;AAAA,gBAAA;AAAA,cAAA,IAEV;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGLA,KAAYI,IACX,gBAAAC,EAAC,OAAA,EAAI,WAAU,8GACZ,UAAA;AAAA,UAAAN,EAAS,OACR,gBAAAM,EAAC,OAAA,EAAI,WAAU,QACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,8DAA6D,UAAA;AAAA,cAAA;AAAA,cACrE;AAAA,YAAA,GACR;AAAA,YACC,OAAON,EAAS,QAAS,WACtBA,EAAS,OACT,KAAK,UAAUA,EAAS,MAAM,MAAM,CAAC;AAAA,UAAA,EAAA,CAC3C,IACE;AAAA,UACHA,EAAS,SACR,gBAAAM,EAAC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,8DAA6D,UAAA;AAAA,cAAA;AAAA,cACnE;AAAA,YAAA,GACV;AAAA,YACC,OAAON,EAAS,UAAW,WACxBA,EAAS,SACT,KAAK,UAAUA,EAAS,QAAQ,MAAM,CAAC;AAAA,UAAA,EAAA,CAC7C,IACE;AAAA,QAAA,EAAA,CACN,IACE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV;"}
1
+ {"version":3,"file":"ChatToolCall.js","sources":["../../../../src/components/library/chat/ChatToolCall.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport Spinner from \"../ui/Spinner\";\nimport {\n WrenchScrewdriverIcon,\n CheckCircleIcon,\n XCircleIcon,\n ChevronDownIcon,\n} from \"@heroicons/react/24/outline\";\n\nexport interface ToolCall {\n id?: string;\n name: string;\n args?: unknown;\n status: \"running\" | \"complete\" | \"error\";\n result?: unknown;\n}\n\nexport interface ChatToolCallProps {\n toolCall: ToolCall;\n}\n\nconst STATUS_CONFIG = {\n running: {\n icon: <Spinner size=\"xs\" tone=\"brand\" label=\"Running\" />,\n text: \"text-brand-600 dark:text-brand-400\",\n bg: \"bg-brand-50 border-brand-100 dark:bg-brand-950/20 dark:border-brand-900/30\",\n label: \"Running\",\n },\n complete: {\n icon: <CheckCircleIcon className=\"h-3.5 w-3.5 text-emerald-500\" />,\n text: \"text-emerald-700 dark:text-emerald-300\",\n bg: \"bg-emerald-50 border-emerald-100 dark:bg-emerald-950/20 dark:border-emerald-900/30\",\n label: \"Complete\",\n },\n error: {\n icon: <XCircleIcon className=\"h-3.5 w-3.5 text-red-500\" />,\n text: \"text-red-700 dark:text-red-300\",\n bg: \"bg-red-50 border-red-100 dark:bg-red-950/20 dark:border-red-900/30\",\n label: \"Failed\",\n },\n};\n\n/**\n * Displays an agent tool call / function execution step.\n */\nexport default function ChatToolCall({ toolCall }: ChatToolCallProps) {\n const [expanded, setExpanded] = useState(false);\n const config = STATUS_CONFIG[toolCall.status] ?? STATUS_CONFIG.running;\n const hasDetails = toolCall.args || toolCall.result;\n\n return (\n <div\n className={[\n \"rounded-lg border text-xs\",\n config.bg,\n ].join(\" \")}\n >\n <button\n type=\"button\"\n onClick={() => hasDetails && setExpanded(!expanded)}\n className={[\n \"flex w-full items-center gap-2 px-3 py-1.5\",\n hasDetails ? \"cursor-pointer\" : \"cursor-default\",\n ].join(\" \")}\n >\n {config.icon}\n <WrenchScrewdriverIcon className=\"h-3 w-3 text-slate-400 dark:text-slate-500\" />\n <span className={[\"font-medium\", config.text].join(\" \")}>\n {toolCall.name}\n </span>\n <span className=\"text-slate-400 dark:text-slate-500\">\n — {config.label}\n </span>\n {hasDetails ? (\n <ChevronDownIcon\n className={[\n \"ml-auto h-3 w-3 text-slate-400 transition-transform dark:text-slate-500\",\n expanded ? \"rotate-180\" : \"\",\n ].join(\" \")}\n />\n ) : null}\n </button>\n\n {expanded && hasDetails ? (\n <div className=\"border-t border-inherit px-3 py-2 font-mono text-[11px] leading-relaxed text-slate-600 dark:text-slate-300\">\n {toolCall.args ? (\n <div className=\"mb-1\">\n <span className=\"font-sans font-semibold text-slate-500 dark:text-slate-400\">\n Args:{\" \"}\n </span>\n {typeof toolCall.args === \"string\"\n ? toolCall.args\n : JSON.stringify(toolCall.args, null, 2)}\n </div>\n ) : null}\n {toolCall.result ? (\n <div>\n <span className=\"font-sans font-semibold text-slate-500 dark:text-slate-400\">\n Result:{\" \"}\n </span>\n {typeof toolCall.result === \"string\"\n ? toolCall.result\n : JSON.stringify(toolCall.result, null, 2)}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n"],"names":["STATUS_CONFIG","Spinner","jsx","CheckCircleIcon","XCircleIcon","ChatToolCall","toolCall","expanded","setExpanded","useState","config","hasDetails","jsxs","WrenchScrewdriverIcon","ChevronDownIcon"],"mappings":";;;;AAqBA,MAAMA,IAAgB;AAAA,EACpB,SAAS;AAAA,IACP,wBAAOC,GAAA,EAAQ,MAAK,MAAK,MAAK,SAAQ,OAAM,WAAU;AAAA,IACtD,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,OAAO;AAAA,EAAA;AAAA,EAET,UAAU;AAAA,IACR,MAAM,gBAAAC,EAACC,GAAA,EAAgB,WAAU,+BAAA,CAA+B;AAAA,IAChE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,OAAO;AAAA,EAAA;AAAA,EAET,OAAO;AAAA,IACL,MAAM,gBAAAD,EAACE,GAAA,EAAY,WAAU,2BAAA,CAA2B;AAAA,IACxD,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,OAAO;AAAA,EAAA;AAEX;AAKA,SAAwBC,EAAa,EAAE,UAAAC,KAA+B;AACpE,QAAM,CAACC,GAAUC,CAAW,IAAIC,EAAS,EAAK,GACxCC,IAASV,EAAcM,EAAS,MAAM,KAAKN,EAAc,SACzDW,IAAaL,EAAS,QAAQA,EAAS;AAE7C,SACE,gBAAAM;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACAF,EAAO;AAAA,MAAA,EACP,KAAK,GAAG;AAAA,MAEV,UAAA;AAAA,QAAA,gBAAAE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAMD,KAAcH,EAAY,CAACD,CAAQ;AAAA,YAClD,WAAW;AAAA,cACT;AAAA,cACAI,IAAa,mBAAmB;AAAA,YAAA,EAChC,KAAK,GAAG;AAAA,YAET,UAAA;AAAA,cAAAD,EAAO;AAAA,cACR,gBAAAR,EAACW,GAAA,EAAsB,WAAU,6CAAA,CAA6C;AAAA,cAC9E,gBAAAX,EAAC,QAAA,EAAK,WAAW,CAAC,eAAeQ,EAAO,IAAI,EAAE,KAAK,GAAG,GACnD,UAAAJ,EAAS,KAAA,CACZ;AAAA,cACA,gBAAAM,EAAC,QAAA,EAAK,WAAU,sCAAqC,UAAA;AAAA,gBAAA;AAAA,gBAChDF,EAAO;AAAA,cAAA,GACZ;AAAA,cACCC,IACC,gBAAAT;AAAA,gBAACY;AAAA,gBAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACAP,IAAW,eAAe;AAAA,kBAAA,EAC1B,KAAK,GAAG;AAAA,gBAAA;AAAA,cAAA,IAEV;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGLA,KAAYI,IACX,gBAAAC,EAAC,OAAA,EAAI,WAAU,8GACZ,UAAA;AAAA,UAAAN,EAAS,OACR,gBAAAM,EAAC,OAAA,EAAI,WAAU,QACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,8DAA6D,UAAA;AAAA,cAAA;AAAA,cACrE;AAAA,YAAA,GACR;AAAA,YACC,OAAON,EAAS,QAAS,WACtBA,EAAS,OACT,KAAK,UAAUA,EAAS,MAAM,MAAM,CAAC;AAAA,UAAA,EAAA,CAC3C,IACE;AAAA,UACHA,EAAS,SACR,gBAAAM,EAAC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,8DAA6D,UAAA;AAAA,cAAA;AAAA,cACnE;AAAA,YAAA,GACV;AAAA,YACC,OAAON,EAAS,UAAW,WACxBA,EAAS,SACT,KAAK,UAAUA,EAAS,QAAQ,MAAM,CAAC;AAAA,UAAA,EAAA,CAC7C,IACE;AAAA,QAAA,EAAA,CACN,IACE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV;"}
@@ -1,6 +1,7 @@
1
+ export interface ChatTypingIndicatorProps {
2
+ label?: string;
3
+ }
1
4
  /**
2
5
  * Animated typing indicator shown while the agent is processing.
3
6
  */
4
- export default function ChatTypingIndicator({ label }: {
5
- label?: string | undefined;
6
- }): import("react/jsx-runtime").JSX.Element;
7
+ export default function ChatTypingIndicator({ label }: ChatTypingIndicatorProps): import("react/jsx-runtime").JSX.Element;
@@ -1,7 +1,6 @@
1
1
  import { jsxs as e, jsx as a } from "react/jsx-runtime";
2
- import "react";
3
2
  import { CpuChipIcon as t } from "@heroicons/react/24/solid";
4
- function r({ label: s = "Thinking" }) {
3
+ function d({ label: s = "Thinking" }) {
5
4
  return /* @__PURE__ */ e("div", { className: "flex items-start gap-3", children: [
6
5
  /* @__PURE__ */ a("div", { className: "flex h-7 w-7 shrink-0 items-center justify-center rounded-lg bg-brand-100 dark:bg-brand-900/40", children: /* @__PURE__ */ a(t, { className: "h-4 w-4 text-brand-600 dark:text-brand-400" }) }),
7
6
  /* @__PURE__ */ e("div", { className: "flex items-center gap-2 rounded-2xl rounded-tl-md bg-slate-100 px-4 py-3 dark:bg-slate-800", children: [
@@ -15,6 +14,6 @@ function r({ label: s = "Thinking" }) {
15
14
  ] });
16
15
  }
17
16
  export {
18
- r as default
17
+ d as default
19
18
  };
20
19
  //# sourceMappingURL=ChatTypingIndicator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatTypingIndicator.js","sources":["../../../../src/components/library/chat/ChatTypingIndicator.jsx"],"sourcesContent":["import React from \"react\";\nimport { CpuChipIcon } from \"@heroicons/react/24/solid\";\n\n/**\n * Animated typing indicator shown while the agent is processing.\n */\nexport default function ChatTypingIndicator({ label = \"Thinking\" }) {\n return (\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg bg-brand-100 dark:bg-brand-900/40\">\n <CpuChipIcon className=\"h-4 w-4 text-brand-600 dark:text-brand-400\" />\n </div>\n <div className=\"flex items-center gap-2 rounded-2xl rounded-tl-md bg-slate-100 px-4 py-3 dark:bg-slate-800\">\n <div className=\"flex gap-1\">\n <span className=\"h-1.5 w-1.5 animate-bounce rounded-full bg-slate-400 dark:bg-slate-500 [animation-delay:0ms]\" />\n <span className=\"h-1.5 w-1.5 animate-bounce rounded-full bg-slate-400 dark:bg-slate-500 [animation-delay:150ms]\" />\n <span className=\"h-1.5 w-1.5 animate-bounce rounded-full bg-slate-400 dark:bg-slate-500 [animation-delay:300ms]\" />\n </div>\n <span className=\"text-xs text-slate-400 dark:text-slate-500\">{label}</span>\n </div>\n </div>\n );\n}\n"],"names":["ChatTypingIndicator","label","jsxs","jsx","CpuChipIcon"],"mappings":";;;AAMA,SAAwBA,EAAoB,EAAE,OAAAC,IAAQ,cAAc;AAClE,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,IAAA,gBAAAC,EAAC,SAAI,WAAU,kGACb,4BAACC,GAAA,EAAY,WAAU,8CAA6C,EAAA,CACtE;AAAA,IACA,gBAAAF,EAAC,OAAA,EAAI,WAAU,8FACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,QAAA,gBAAAC,EAAC,QAAA,EAAK,WAAU,+FAAA,CAA+F;AAAA,QAC/G,gBAAAA,EAAC,QAAA,EAAK,WAAU,iGAAA,CAAiG;AAAA,QACjH,gBAAAA,EAAC,QAAA,EAAK,WAAU,iGAAA,CAAiG;AAAA,MAAA,GACnH;AAAA,MACA,gBAAAA,EAAC,QAAA,EAAK,WAAU,8CAA8C,UAAAF,EAAA,CAAM;AAAA,IAAA,EAAA,CACtE;AAAA,EAAA,GACF;AAEJ;"}
1
+ {"version":3,"file":"ChatTypingIndicator.js","sources":["../../../../src/components/library/chat/ChatTypingIndicator.tsx"],"sourcesContent":["import { CpuChipIcon } from \"@heroicons/react/24/solid\";\n\nexport interface ChatTypingIndicatorProps {\n label?: string;\n}\n\n/**\n * Animated typing indicator shown while the agent is processing.\n */\nexport default function ChatTypingIndicator({ label = \"Thinking\" }: ChatTypingIndicatorProps) {\n return (\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg bg-brand-100 dark:bg-brand-900/40\">\n <CpuChipIcon className=\"h-4 w-4 text-brand-600 dark:text-brand-400\" />\n </div>\n <div className=\"flex items-center gap-2 rounded-2xl rounded-tl-md bg-slate-100 px-4 py-3 dark:bg-slate-800\">\n <div className=\"flex gap-1\">\n <span className=\"h-1.5 w-1.5 animate-bounce rounded-full bg-slate-400 dark:bg-slate-500 [animation-delay:0ms]\" />\n <span className=\"h-1.5 w-1.5 animate-bounce rounded-full bg-slate-400 dark:bg-slate-500 [animation-delay:150ms]\" />\n <span className=\"h-1.5 w-1.5 animate-bounce rounded-full bg-slate-400 dark:bg-slate-500 [animation-delay:300ms]\" />\n </div>\n <span className=\"text-xs text-slate-400 dark:text-slate-500\">{label}</span>\n </div>\n </div>\n );\n}\n"],"names":["ChatTypingIndicator","label","jsxs","jsx","CpuChipIcon"],"mappings":";;AASA,SAAwBA,EAAoB,EAAE,OAAAC,IAAQ,cAAwC;AAC5F,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,IAAA,gBAAAC,EAAC,SAAI,WAAU,kGACb,4BAACC,GAAA,EAAY,WAAU,8CAA6C,EAAA,CACtE;AAAA,IACA,gBAAAF,EAAC,OAAA,EAAI,WAAU,8FACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,QAAA,gBAAAC,EAAC,QAAA,EAAK,WAAU,+FAAA,CAA+F;AAAA,QAC/G,gBAAAA,EAAC,QAAA,EAAK,WAAU,iGAAA,CAAiG;AAAA,QACjH,gBAAAA,EAAC,QAAA,EAAK,WAAU,iGAAA,CAAiG;AAAA,MAAA,GACnH;AAAA,MACA,gBAAAA,EAAC,QAAA,EAAK,WAAU,8CAA8C,UAAAF,EAAA,CAAM;AAAA,IAAA,EAAA,CACtE;AAAA,EAAA,GACF;AAEJ;"}
@@ -1,10 +1,12 @@
1
+ import React from "react";
2
+ export interface ChatWelcomeProps {
3
+ title?: string;
4
+ subtitle?: string;
5
+ suggestions?: string[];
6
+ onSuggestion?: (text: string) => void;
7
+ icon?: React.ReactNode;
8
+ }
1
9
  /**
2
10
  * Empty-state welcome screen shown before the first message.
3
- *
4
- * @param {string} title — welcome heading
5
- * @param {string} subtitle — description text
6
- * @param {string[]} suggestions — starter prompt suggestions
7
- * @param {Function} onSuggestion — (text) => void
8
- * @param {React.ReactNode} icon — custom icon override
9
11
  */
10
- export default function ChatWelcome({ title, subtitle, suggestions, onSuggestion, icon, }: string): import("react/jsx-runtime").JSX.Element;
12
+ export default function ChatWelcome({ title, subtitle, suggestions, onSuggestion, icon, }: ChatWelcomeProps): import("react/jsx-runtime").JSX.Element;
@@ -1,8 +1,7 @@
1
1
  import { jsxs as a, jsx as e } from "react/jsx-runtime";
2
- import "react";
3
- import { CpuChipIcon as o } from "@heroicons/react/24/solid";
4
- import c from "./ChatSuggestions.js";
5
- function h({
2
+ import { CpuChipIcon as c } from "@heroicons/react/24/solid";
3
+ import d from "./ChatSuggestions.js";
4
+ function x({
6
5
  title: r = "How can I help?",
7
6
  subtitle: l = "Ask me anything about your data, or try one of the suggestions below.",
8
7
  suggestions: t = [],
@@ -10,15 +9,15 @@ function h({
10
9
  icon: n
11
10
  }) {
12
11
  return /* @__PURE__ */ a("div", { className: "flex flex-1 flex-col items-center justify-center gap-4 px-6 py-12 text-center", children: [
13
- n ?? /* @__PURE__ */ e("div", { className: "flex h-14 w-14 items-center justify-center rounded-2xl bg-brand-100 dark:bg-brand-900/40", children: /* @__PURE__ */ e(o, { className: "h-7 w-7 text-brand-600 dark:text-brand-400" }) }),
12
+ n ?? /* @__PURE__ */ e("div", { className: "flex h-14 w-14 items-center justify-center rounded-2xl bg-brand-100 dark:bg-brand-900/40", children: /* @__PURE__ */ e(c, { className: "h-7 w-7 text-brand-600 dark:text-brand-400" }) }),
14
13
  /* @__PURE__ */ a("div", { children: [
15
14
  /* @__PURE__ */ e("h3", { className: "text-base font-semibold text-slate-900 dark:text-slate-50", children: r }),
16
15
  /* @__PURE__ */ e("p", { className: "mt-1 text-sm text-slate-500 dark:text-slate-400", children: l })
17
16
  ] }),
18
- t.length ? /* @__PURE__ */ e("div", { className: "mt-2", children: /* @__PURE__ */ e(c, { suggestions: t, onSelect: s }) }) : null
17
+ t.length ? /* @__PURE__ */ e("div", { className: "mt-2", children: /* @__PURE__ */ e(d, { suggestions: t, onSelect: s }) }) : null
19
18
  ] });
20
19
  }
21
20
  export {
22
- h as default
21
+ x as default
23
22
  };
24
23
  //# sourceMappingURL=ChatWelcome.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatWelcome.js","sources":["../../../../src/components/library/chat/ChatWelcome.jsx"],"sourcesContent":["import React from \"react\";\nimport { CpuChipIcon } from \"@heroicons/react/24/solid\";\nimport ChatSuggestions from \"./ChatSuggestions\";\n\n/**\n * Empty-state welcome screen shown before the first message.\n *\n * @param {string} title — welcome heading\n * @param {string} subtitle — description text\n * @param {string[]} suggestions — starter prompt suggestions\n * @param {Function} onSuggestion (text) => void\n * @param {React.ReactNode} icon custom icon override\n */\nexport default function ChatWelcome({\n title = \"How can I help?\",\n subtitle = \"Ask me anything about your data, or try one of the suggestions below.\",\n suggestions = [],\n onSuggestion,\n icon,\n}) {\n return (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-4 px-6 py-12 text-center\">\n {icon ?? (\n <div className=\"flex h-14 w-14 items-center justify-center rounded-2xl bg-brand-100 dark:bg-brand-900/40\">\n <CpuChipIcon className=\"h-7 w-7 text-brand-600 dark:text-brand-400\" />\n </div>\n )}\n <div>\n <h3 className=\"text-base font-semibold text-slate-900 dark:text-slate-50\">\n {title}\n </h3>\n <p className=\"mt-1 text-sm text-slate-500 dark:text-slate-400\">\n {subtitle}\n </p>\n </div>\n {suggestions.length ? (\n <div className=\"mt-2\">\n <ChatSuggestions suggestions={suggestions} onSelect={onSuggestion} />\n </div>\n ) : null}\n </div>\n );\n}\n"],"names":["ChatWelcome","title","subtitle","suggestions","onSuggestion","icon","jsxs","jsx","CpuChipIcon","ChatSuggestions"],"mappings":";;;;AAaA,SAAwBA,EAAY;AAAA,EAClC,OAAAC,IAAQ;AAAA,EACR,UAAAC,IAAW;AAAA,EACX,aAAAC,IAAc,CAAA;AAAA,EACd,cAAAC;AAAA,EACA,MAAAC;AACF,GAAG;AACD,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,iFACZ,UAAA;AAAA,IAAAD,KACC,gBAAAE,EAAC,SAAI,WAAU,4FACb,4BAACC,GAAA,EAAY,WAAU,8CAA6C,EAAA,CACtE;AAAA,sBAED,OAAA,EACC,UAAA;AAAA,MAAA,gBAAAD,EAAC,MAAA,EAAG,WAAU,6DACX,UAAAN,GACH;AAAA,MACA,gBAAAM,EAAC,KAAA,EAAE,WAAU,mDACV,UAAAL,EAAA,CACH;AAAA,IAAA,GACF;AAAA,IACCC,EAAY,SACX,gBAAAI,EAAC,OAAA,EAAI,WAAU,QACb,UAAA,gBAAAA,EAACE,GAAA,EAAgB,aAAAN,GAA0B,UAAUC,EAAA,CAAc,EAAA,CACrE,IACE;AAAA,EAAA,GACN;AAEJ;"}
1
+ {"version":3,"file":"ChatWelcome.js","sources":["../../../../src/components/library/chat/ChatWelcome.tsx"],"sourcesContent":["import React from \"react\";\nimport { CpuChipIcon } from \"@heroicons/react/24/solid\";\nimport ChatSuggestions from \"./ChatSuggestions\";\n\nexport interface ChatWelcomeProps {\n title?: string;\n subtitle?: string;\n suggestions?: string[];\n onSuggestion?: (text: string) => void;\n icon?: React.ReactNode;\n}\n\n/**\n * Empty-state welcome screen shown before the first message.\n */\nexport default function ChatWelcome({\n title = \"How can I help?\",\n subtitle = \"Ask me anything about your data, or try one of the suggestions below.\",\n suggestions = [],\n onSuggestion,\n icon,\n}: ChatWelcomeProps) {\n return (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-4 px-6 py-12 text-center\">\n {icon ?? (\n <div className=\"flex h-14 w-14 items-center justify-center rounded-2xl bg-brand-100 dark:bg-brand-900/40\">\n <CpuChipIcon className=\"h-7 w-7 text-brand-600 dark:text-brand-400\" />\n </div>\n )}\n <div>\n <h3 className=\"text-base font-semibold text-slate-900 dark:text-slate-50\">\n {title}\n </h3>\n <p className=\"mt-1 text-sm text-slate-500 dark:text-slate-400\">\n {subtitle}\n </p>\n </div>\n {suggestions.length ? (\n <div className=\"mt-2\">\n <ChatSuggestions suggestions={suggestions} onSelect={onSuggestion} />\n </div>\n ) : null}\n </div>\n );\n}\n"],"names":["ChatWelcome","title","subtitle","suggestions","onSuggestion","icon","jsxs","jsx","CpuChipIcon","ChatSuggestions"],"mappings":";;;AAeA,SAAwBA,EAAY;AAAA,EAClC,OAAAC,IAAQ;AAAA,EACR,UAAAC,IAAW;AAAA,EACX,aAAAC,IAAc,CAAA;AAAA,EACd,cAAAC;AAAA,EACA,MAAAC;AACF,GAAqB;AACnB,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,iFACZ,UAAA;AAAA,IAAAD,KACC,gBAAAE,EAAC,SAAI,WAAU,4FACb,4BAACC,GAAA,EAAY,WAAU,8CAA6C,EAAA,CACtE;AAAA,sBAED,OAAA,EACC,UAAA;AAAA,MAAA,gBAAAD,EAAC,MAAA,EAAG,WAAU,6DACX,UAAAN,GACH;AAAA,MACA,gBAAAM,EAAC,KAAA,EAAE,WAAU,mDACV,UAAAL,EAAA,CACH;AAAA,IAAA,GACF;AAAA,IACCC,EAAY,SACX,gBAAAI,EAAC,OAAA,EAAI,WAAU,QACb,UAAA,gBAAAA,EAACE,GAAA,EAAgB,aAAAN,GAA0B,UAAUC,EAAA,CAAc,EAAA,CACrE,IACE;AAAA,EAAA,GACN;AAEJ;"}
@@ -8,3 +8,13 @@ export { default as ChatSuggestions } from "./ChatSuggestions";
8
8
  export { default as ChatToolCall } from "./ChatToolCall";
9
9
  export { default as ChatWelcome } from "./ChatWelcome";
10
10
  export { default as useChatState } from "./useChatState";
11
+ export type { ChatPanelProps } from "./ChatPanel";
12
+ export type { ChatBarProps } from "./ChatBar";
13
+ export type { ChatMessageListProps } from "./ChatMessageList";
14
+ export type { ChatMessageProps, ChatMessageData } from "./ChatMessage";
15
+ export type { ChatInputProps } from "./ChatInput";
16
+ export type { ChatTypingIndicatorProps } from "./ChatTypingIndicator";
17
+ export type { ChatSuggestionsProps } from "./ChatSuggestions";
18
+ export type { ChatToolCallProps, ToolCall } from "./ChatToolCall";
19
+ export type { ChatWelcomeProps } from "./ChatWelcome";
20
+ export type { UseChatStateOptions, UseChatStateReturn, ChatMessage as ChatMessageType, ChatStateHelpers, } from "./useChatState";
@@ -1,13 +1,41 @@
1
+ import { ToolCall } from "./ChatToolCall";
2
+ export interface ChatMessage {
3
+ id: string;
4
+ role: "user" | "assistant" | "system";
5
+ content?: string;
6
+ timestamp: string;
7
+ components?: unknown[];
8
+ toolCalls?: ToolCall[];
9
+ isError?: boolean;
10
+ isStreaming?: boolean;
11
+ }
12
+ export interface ChatStateHelpers {
13
+ addMessage: (msg: Partial<ChatMessage>) => string;
14
+ updateMessage: (id: string, updates: Partial<ChatMessage>) => void;
15
+ appendChunk: (id: string, chunk: string) => void;
16
+ setStreaming: (streaming: boolean) => void;
17
+ }
18
+ export interface UseChatStateOptions {
19
+ initialMessages?: Partial<ChatMessage>[];
20
+ onSend?: (userMessage: ChatMessage, allMessages: ChatMessage[], helpers: ChatStateHelpers) => Promise<Partial<ChatMessage> | void>;
21
+ }
22
+ export interface UseChatStateReturn {
23
+ messages: ChatMessage[];
24
+ isLoading: boolean;
25
+ isStreaming: boolean;
26
+ error: string | null;
27
+ sendMessage: (content: string, extra?: Partial<ChatMessage>) => Promise<void>;
28
+ addMessage: (msg: Partial<ChatMessage>) => string;
29
+ updateMessage: (id: string, updates: Partial<ChatMessage>) => void;
30
+ appendChunk: (id: string, chunk: string) => void;
31
+ removeMessage: (id: string) => void;
32
+ clearMessages: () => void;
33
+ retryLast: () => void;
34
+ setError: (error: string | null) => void;
35
+ }
1
36
  /**
2
37
  * Core state management hook for AI chat.
3
38
  *
4
- * @param {Object} options
5
- * @param {Array} options.initialMessages — seed the conversation
6
- * @param {Function} options.onSend — async (userMessage, allMessages) => assistantMessage | void
7
- * Return a message object to add it, or use appendChunk / addMessage for streaming.
8
- *
9
- * @returns {Object}
10
- *
11
39
  * @example
12
40
  * const chat = useChatState({
13
41
  * onSend: async (msg, history) => {
@@ -17,7 +45,4 @@
17
45
  * },
18
46
  * });
19
47
  */
20
- export default function useChatState({ initialMessages, onSend }?: {
21
- initialMessages: any[];
22
- onSend: Function;
23
- }): Object;
48
+ export default function useChatState({ initialMessages, onSend }?: UseChatStateOptions): UseChatStateReturn;
@@ -1,77 +1,94 @@
1
- import { useState as g, useRef as k, useCallback as o } from "react";
2
- let v = 1;
3
- function S() {
4
- return `msg-${Date.now()}-${v++}`;
1
+ import { useState as u, useRef as C, useCallback as o } from "react";
2
+ let L = 1;
3
+ function m() {
4
+ return `msg-${Date.now()}-${L++}`;
5
5
  }
6
- function R({ initialMessages: h = [], onSend: I } = {}) {
7
- const [r, a] = g(
8
- () => h.map((e) => ({ id: S(), timestamp: (/* @__PURE__ */ new Date()).toISOString(), ...e }))
9
- ), [x, M] = g(!1), [D, w] = g(!1), [O, l] = g(null), y = k(I);
10
- y.current = I;
6
+ function k({ initialMessages: y = [], onSend: p } = {}) {
7
+ const [r, a] = u(
8
+ () => y.map((e) => ({
9
+ id: m(),
10
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
11
+ role: e.role || "user",
12
+ ...e
13
+ }))
14
+ ), [I, S] = u(!1), [h, M] = u(!1), [x, l] = u(null), w = C(p);
15
+ w.current = p;
11
16
  const c = o((e) => {
12
- const t = { id: S(), timestamp: (/* @__PURE__ */ new Date()).toISOString(), ...e };
13
- return a((s) => [...s, t]), t.id;
14
- }, []), d = o((e, t) => {
17
+ const n = {
18
+ id: m(),
19
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
20
+ role: e.role || "assistant",
21
+ ...e
22
+ };
23
+ return a((s) => [...s, n]), n.id;
24
+ }, []), g = o((e, n) => {
15
25
  a(
16
- (s) => s.map((n) => n.id === e ? { ...n, ...t } : n)
26
+ (s) => s.map((t) => t.id === e ? { ...t, ...n } : t)
17
27
  );
18
- }, []), f = o((e, t) => {
28
+ }, []), d = o((e, n) => {
19
29
  a(
20
30
  (s) => s.map(
21
- (n) => n.id === e ? { ...n, content: (n.content ?? "") + t } : n
31
+ (t) => t.id === e ? { ...t, content: (t.content ?? "") + n } : t
22
32
  )
23
33
  );
24
- }, []), C = o((e) => {
25
- a((t) => t.filter((s) => s.id !== e));
26
- }, []), L = o(() => {
34
+ }, []), D = o((e) => {
35
+ a((n) => n.filter((s) => s.id !== e));
36
+ }, []), E = o(() => {
27
37
  a([]), l(null);
28
- }, []), m = o(
29
- async (e, t = {}) => {
38
+ }, []), f = o(
39
+ async (e, n = {}) => {
30
40
  if (!e?.trim()) return;
31
41
  l(null);
32
- const s = { role: "user", content: e.trim(), ...t }, n = S(), p = { ...s, id: n, timestamp: (/* @__PURE__ */ new Date()).toISOString() };
33
- a((i) => [...i, p]), M(!0);
42
+ const s = {
43
+ role: "user",
44
+ content: e.trim(),
45
+ ...n,
46
+ id: m(),
47
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
48
+ };
49
+ a((t) => [...t, s]), S(!0);
34
50
  try {
35
- const i = [...r, p], u = await y.current?.(p, i, {
51
+ const t = [...r, s], i = await w.current?.(s, t, {
36
52
  addMessage: c,
37
- updateMessage: d,
38
- appendChunk: f,
39
- setStreaming: w
53
+ updateMessage: g,
54
+ appendChunk: d,
55
+ setStreaming: M
40
56
  });
41
- u && typeof u == "object" && u.role && c(u);
42
- } catch (i) {
43
- l(i?.message ?? "Failed to send message"), c({
57
+ i && typeof i == "object" && i.role && c(i);
58
+ } catch (t) {
59
+ const i = t instanceof Error ? t.message : "Failed to send message";
60
+ l(i), c({
44
61
  role: "system",
45
- content: i?.message ?? "Something went wrong. Please try again.",
62
+ content: t instanceof Error ? t.message : "Something went wrong. Please try again.",
46
63
  isError: !0
47
64
  });
48
65
  } finally {
49
- M(!1), w(!1);
66
+ S(!1), M(!1);
50
67
  }
51
68
  },
52
- [r, c, d, f]
53
- ), b = o(() => {
69
+ [r, c, g, d]
70
+ ), O = o(() => {
54
71
  const e = [...r].reverse().find((s) => s.role === "user");
55
72
  if (!e) return;
56
- const t = r.lastIndexOf(e);
57
- a(r.slice(0, t)), l(null), m(e.content);
58
- }, [r, m]);
73
+ const n = r.lastIndexOf(e);
74
+ a(r.slice(0, n)), l(null), f(e.content || "");
75
+ }, [r, f]);
59
76
  return {
60
77
  messages: r,
61
- isLoading: x,
62
- isStreaming: D,
63
- error: O,
64
- sendMessage: m,
78
+ isLoading: I,
79
+ isStreaming: h,
80
+ error: x,
81
+ sendMessage: f,
65
82
  addMessage: c,
66
- updateMessage: d,
67
- appendChunk: f,
68
- removeMessage: C,
69
- clearMessages: L,
70
- retryLast: b,
83
+ updateMessage: g,
84
+ appendChunk: d,
85
+ removeMessage: D,
86
+ clearMessages: E,
87
+ retryLast: O,
71
88
  setError: l
72
89
  };
73
90
  }
74
91
  export {
75
- R as default
92
+ k as default
76
93
  };
77
94
  //# sourceMappingURL=useChatState.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useChatState.js","sources":["../../../../src/components/library/chat/useChatState.jsx"],"sourcesContent":["import { useState, useCallback, useRef } from \"react\";\n\nlet _nextId = 1;\nfunction uid() {\n return `msg-${Date.now()}-${_nextId++}`;\n}\n\n/**\n * Core state management hook for AI chat.\n *\n * @param {Object} options\n * @param {Array} options.initialMessages seed the conversation\n * @param {Function} options.onSend — async (userMessage, allMessages) => assistantMessage | void\n * Return a message object to add it, or use appendChunk / addMessage for streaming.\n *\n * @returns {Object}\n *\n * @example\n * const chat = useChatState({\n * onSend: async (msg, history) => {\n * const res = await fetch(\"/api/chat\", { method: \"POST\", body: JSON.stringify({ messages: history }) });\n * const data = await res.json();\n * return { role: \"assistant\", content: data.reply, components: data.components };\n * },\n * });\n */\nexport default function useChatState({ initialMessages = [], onSend } = {}) {\n const [messages, setMessages] = useState(() =>\n initialMessages.map((m) => ({ id: uid(), timestamp: new Date().toISOString(), ...m }))\n );\n const [isLoading, setIsLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState(null);\n const onSendRef = useRef(onSend);\n onSendRef.current = onSend;\n\n const addMessage = useCallback((msg) => {\n const full = { id: uid(), timestamp: new Date().toISOString(), ...msg };\n setMessages((prev) => [...prev, full]);\n return full.id;\n }, []);\n\n const updateMessage = useCallback((id, updates) => {\n setMessages((prev) =>\n prev.map((m) => (m.id === id ? { ...m, ...updates } : m))\n );\n }, []);\n\n const appendChunk = useCallback((id, chunk) => {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === id ? { ...m, content: (m.content ?? \"\") + chunk } : m\n )\n );\n }, []);\n\n const removeMessage = useCallback((id) => {\n setMessages((prev) => prev.filter((m) => m.id !== id));\n }, []);\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n setError(null);\n }, []);\n\n const sendMessage = useCallback(\n async (content, extra = {}) => {\n if (!content?.trim()) return;\n setError(null);\n\n const userMsg = { role: \"user\", content: content.trim(), ...extra };\n const userId = uid();\n const fullUser = { ...userMsg, id: userId, timestamp: new Date().toISOString() };\n\n setMessages((prev) => [...prev, fullUser]);\n setIsLoading(true);\n\n try {\n const allMsgs = [...messages, fullUser];\n const result = await onSendRef.current?.(fullUser, allMsgs, {\n addMessage,\n updateMessage,\n appendChunk,\n setStreaming: setIsStreaming,\n });\n\n if (result && typeof result === \"object\" && result.role) {\n addMessage(result);\n }\n } catch (err) {\n setError(err?.message ?? \"Failed to send message\");\n addMessage({\n role: \"system\",\n content: err?.message ?? \"Something went wrong. Please try again.\",\n isError: true,\n });\n } finally {\n setIsLoading(false);\n setIsStreaming(false);\n }\n },\n [messages, addMessage, updateMessage, appendChunk]\n );\n\n const retryLast = useCallback(() => {\n const lastUser = [...messages].reverse().find((m) => m.role === \"user\");\n if (!lastUser) return;\n\n const idx = messages.lastIndexOf(lastUser);\n setMessages(messages.slice(0, idx));\n setError(null);\n\n sendMessage(lastUser.content);\n }, [messages, sendMessage]);\n\n return {\n messages,\n isLoading,\n isStreaming,\n error,\n sendMessage,\n addMessage,\n updateMessage,\n appendChunk,\n removeMessage,\n clearMessages,\n retryLast,\n setError,\n };\n}\n"],"names":["_nextId","uid","useChatState","initialMessages","onSend","messages","setMessages","useState","m","isLoading","setIsLoading","isStreaming","setIsStreaming","error","setError","onSendRef","useRef","addMessage","useCallback","msg","full","prev","updateMessage","id","updates","appendChunk","chunk","removeMessage","clearMessages","sendMessage","content","extra","userMsg","userId","fullUser","allMsgs","result","err","retryLast","lastUser","idx"],"mappings":"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"}
1
+ {"version":3,"file":"useChatState.js","sources":["../../../../src/components/library/chat/useChatState.tsx"],"sourcesContent":["import { useState, useCallback, useRef } from \"react\";\nimport { ToolCall } from \"./ChatToolCall\";\n\nlet _nextId = 1;\nfunction uid(): string {\n return `msg-${Date.now()}-${_nextId++}`;\n}\n\nexport interface ChatMessage {\n id: string;\n role: \"user\" | \"assistant\" | \"system\";\n content?: string;\n timestamp: string;\n components?: unknown[];\n toolCalls?: ToolCall[];\n isError?: boolean;\n isStreaming?: boolean;\n}\n\nexport interface ChatStateHelpers {\n addMessage: (msg: Partial<ChatMessage>) => string;\n updateMessage: (id: string, updates: Partial<ChatMessage>) => void;\n appendChunk: (id: string, chunk: string) => void;\n setStreaming: (streaming: boolean) => void;\n}\n\nexport interface UseChatStateOptions {\n initialMessages?: Partial<ChatMessage>[];\n onSend?: (\n userMessage: ChatMessage,\n allMessages: ChatMessage[],\n helpers: ChatStateHelpers\n ) => Promise<Partial<ChatMessage> | void>;\n}\n\nexport interface UseChatStateReturn {\n messages: ChatMessage[];\n isLoading: boolean;\n isStreaming: boolean;\n error: string | null;\n sendMessage: (content: string, extra?: Partial<ChatMessage>) => Promise<void>;\n addMessage: (msg: Partial<ChatMessage>) => string;\n updateMessage: (id: string, updates: Partial<ChatMessage>) => void;\n appendChunk: (id: string, chunk: string) => void;\n removeMessage: (id: string) => void;\n clearMessages: () => void;\n retryLast: () => void;\n setError: (error: string | null) => void;\n}\n\n/**\n * Core state management hook for AI chat.\n *\n * @example\n * const chat = useChatState({\n * onSend: async (msg, history) => {\n * const res = await fetch(\"/api/chat\", { method: \"POST\", body: JSON.stringify({ messages: history }) });\n * const data = await res.json();\n * return { role: \"assistant\", content: data.reply, components: data.components };\n * },\n * });\n */\nexport default function useChatState({ initialMessages = [], onSend }: UseChatStateOptions = {}): UseChatStateReturn {\n const [messages, setMessages] = useState<ChatMessage[]>(() =>\n initialMessages.map((m) => ({\n id: uid(),\n timestamp: new Date().toISOString(),\n role: m.role || \"user\",\n ...m\n } as ChatMessage))\n );\n const [isLoading, setIsLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const onSendRef = useRef(onSend);\n onSendRef.current = onSend;\n\n const addMessage = useCallback((msg: Partial<ChatMessage>): string => {\n const full: ChatMessage = {\n id: uid(),\n timestamp: new Date().toISOString(),\n role: msg.role || \"assistant\",\n ...msg\n } as ChatMessage;\n setMessages((prev) => [...prev, full]);\n return full.id;\n }, []);\n\n const updateMessage = useCallback((id: string, updates: Partial<ChatMessage>) => {\n setMessages((prev) =>\n prev.map((m) => (m.id === id ? { ...m, ...updates } : m))\n );\n }, []);\n\n const appendChunk = useCallback((id: string, chunk: string) => {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === id ? { ...m, content: (m.content ?? \"\") + chunk } : m\n )\n );\n }, []);\n\n const removeMessage = useCallback((id: string) => {\n setMessages((prev) => prev.filter((m) => m.id !== id));\n }, []);\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n setError(null);\n }, []);\n\n const sendMessage = useCallback(\n async (content: string, extra: Partial<ChatMessage> = {}) => {\n if (!content?.trim()) return;\n setError(null);\n\n const userMsg: ChatMessage = {\n role: \"user\",\n content: content.trim(),\n ...extra,\n id: uid(),\n timestamp: new Date().toISOString()\n } as ChatMessage;\n\n setMessages((prev) => [...prev, userMsg]);\n setIsLoading(true);\n\n try {\n const allMsgs = [...messages, userMsg];\n const result = await onSendRef.current?.(userMsg, allMsgs, {\n addMessage,\n updateMessage,\n appendChunk,\n setStreaming: setIsStreaming,\n });\n\n if (result && typeof result === \"object\" && result.role) {\n addMessage(result);\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Failed to send message\";\n setError(errorMessage);\n addMessage({\n role: \"system\",\n content: err instanceof Error ? err.message : \"Something went wrong. Please try again.\",\n isError: true,\n });\n } finally {\n setIsLoading(false);\n setIsStreaming(false);\n }\n },\n [messages, addMessage, updateMessage, appendChunk]\n );\n\n const retryLast = useCallback(() => {\n const lastUser = [...messages].reverse().find((m) => m.role === \"user\");\n if (!lastUser) return;\n\n const idx = messages.lastIndexOf(lastUser);\n setMessages(messages.slice(0, idx));\n setError(null);\n\n sendMessage(lastUser.content || \"\");\n }, [messages, sendMessage]);\n\n return {\n messages,\n isLoading,\n isStreaming,\n error,\n sendMessage,\n addMessage,\n updateMessage,\n appendChunk,\n removeMessage,\n clearMessages,\n retryLast,\n setError,\n };\n}\n"],"names":["_nextId","uid","useChatState","initialMessages","onSend","messages","setMessages","useState","m","isLoading","setIsLoading","isStreaming","setIsStreaming","error","setError","onSendRef","useRef","addMessage","useCallback","msg","full","prev","updateMessage","id","updates","appendChunk","chunk","removeMessage","clearMessages","sendMessage","content","extra","userMsg","allMsgs","result","err","errorMessage","retryLast","lastUser","idx"],"mappings":"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"}
@@ -1,22 +1,26 @@
1
+ import React from "react";
2
+ export type DataMode = "sample" | "live";
3
+ export interface DataModeContextValue {
4
+ mode: DataMode;
5
+ isSample: boolean;
6
+ isLive: boolean;
7
+ toggle: () => void;
8
+ setMode: (mode: DataMode) => void;
9
+ }
1
10
  /**
2
11
  * Read the current data mode from any component.
3
12
  *
4
13
  * @returns {{ mode: "sample"|"live", isSample: boolean, isLive: boolean, toggle: () => void, setMode: (mode) => void }}
5
14
  */
6
- export function useDataMode(): {
7
- mode: "sample" | "live";
8
- isSample: boolean;
9
- isLive: boolean;
10
- toggle: () => void;
11
- setMode: (mode: any) => void;
12
- };
15
+ export declare function useDataMode(): DataModeContextValue;
16
+ export interface DataModeProviderProps {
17
+ initialMode?: DataMode;
18
+ children: React.ReactNode;
19
+ }
13
20
  /**
14
21
  * Provides global data-mode state (sample vs live) to the component tree.
15
22
  * Persists to localStorage so the choice survives page reloads.
16
23
  *
17
24
  * Wrap once in _app.js alongside AppThemeProvider.
18
25
  */
19
- export default function DataModeProvider({ initialMode, children }: {
20
- initialMode?: string | undefined;
21
- children: any;
22
- }): import("react/jsx-runtime").JSX.Element;
26
+ export default function DataModeProvider({ initialMode, children }: DataModeProviderProps): import("react/jsx-runtime").JSX.Element;